NetBSD/i386 RAID Level 1 Root File System

Brian A. Seklecki <lavalamp@spiritual-machines.org>
Oct 19 2002
DRAFT DRAFT DRAFT DRAFT DRAFT

Todo's:

Foreword

This document will cover the procedure for establishing a NetBSD installation with a RAID level 1 root file system (/) mirror. The process is tricky and does require a solid understanding of NetBSD administrative procedures. Because the process is complicated by a number of steps that must occur in a specific order, I have written this document in a manor that it can be used as a quick reference and as a tutorial. I have denoted steps that are optional for those of you who are looking for a such a reference, but have included many notes and 'gotchas' for others to help understand and illustrate the process.

NetBSD uses the CMU RAIDFrame as it's RAID subsystem. The work was done in the mid-90's and has been in-kernel for quite some time. Because we are dealing with software RAID as opposed to hardware RAID, system administrators should give a great deal of consideration to it's use before using it in 'Mission Critical' applications. For such projects, you might consider the use of many of the hardware RAID devices supported by NetBSD. It is truly at your discretion what type of RAID you use, but I recommend you consider factors such as: manageability, support, etc.

You should be familiar with RAID terminology and applications before reading this document. A plethora of information is available on the web. You should be at least familiar with the different levels of RAID (Adaptec provides an excellent reference). Whole books alone have been written on RAID theory. In the examples below, we will be illustrating RAID level 1, aka, 'mirroring'. RAID1 provides mirroring only. Performance impacts are negligible.

Getting Help

I'm a bit of a slacker when it comes to e-mail. I tend to get selective about exactly I respond to. Moreover, I did my two tours as tech support and I do not wish to revisit! If you have problems, your best bet are NetBSD mailing lists, and their respective archives. The archives contain a wealth of unorganized information. If you can't find a definitive answer to your problem there, I recommend you post to netbsd-help@netbsd.org or netbsd-users@netbsd.org or port-i386@. I am however happy entertain any and all suggestions you have about this document! (i.e., if you make one, I will most likely use it)

NOTE: The examples in this document use NetBSD 1.6 (kernel from the -rnetbsd-1-6-RELEASE tag). Please take that into account as dated documentation can be very misleading.

Because RAID level 1 provides only redundancy and no performance impacts, it's most practical application is as use in critical file systems (such as /usr/local,/var, etc. but most importantly, /, or 'root'). For other file systems, such as /home or /var/mail, other RAID levels of RAID should be considered. If we were simply creating a generic RAID level 1 volume for a file system, we could follow the cookie-cutter examples from the man page, but because the root volume must be bootable, certain special steps must be taken.

Pseudo Process Outline:

Note: 'disk0' and 'disk1' are relative to your setup. In our example, 'disk0' will refer to /dev/sd0 and 'disk1' to /dev/sd1


NOTE: This example uses an Adaptec SCSI controller with a BIOS. If you use something else, it must also have a BIOS. I have not tried this with IDE as outlined by the next note.

NOTE: This scenario relies on a feature in the Adaptec BIOS configuration menu; the ability to define the SCSI boot device ID. Changing this value from the default, 0, is a dirty trick Adaptec implements. It's dirty because it would lead you to believe, based on debugging output of the device probe at initialization time, that it is overriding and reordering the SCSI IDs of the boot device you specify with the device at ID0. This however is not the case. What it's really doing is changing the order in which the BIOS sees
bootable devices. The only code that is affected by this change is the i386 boot blocks which address drives presented by the BIOS as 'hd0', 'hd1', etc. When the NetBSD kernel actually loads, the devices on the bus are probed unaffected by the change. I will explain in more detail later, but you should be aware of this. Because most IDE controllers lack this functionality it would be very difficult their practice use but I imagine these steps could apply to an IDE system. When instructed to change the SCSI boot ID below, simply recable/rejumper your IDE devices.

NOTICE: Using RAID level 1 does provide redundancy, however, it is NOT a replacement for reliable backups. Consider it more a 'buffer' than anything. In this example, there are still many single points of failure (both drives are on a single controller, what happens if the control fails?).

Goal Overview:

To provide redundancy on an i386 system, an administrator should be able to encounter a disk failure of either disk in the root file system RAID and be able to: 1) Continue normal systems operation without rebooting using the sole remaining disk component until a maintenance window can be scheduled 2) In the event of a system crash and an unusable system boot disk (SCSI ID 0 by default) be able to boot from either disk in the RAID set by simply changing the address of the SCSI boot device in the BIOS. The latter is a more likely scenario because failing SCSI disks like to cause SCSI bus resets which will render a system unuseable.

THEREFORE: At any time, the SCSI BIOS must be able to read:
*) i386 bootblocks from a drive ...
*) ... which can then boot a kernel from either drive.

Example Scenario Hardware:
NOTE: RAIDFrame requires that all components of a raidset be of an identical geometry. It's a a good idea to use two SCSI disks of the same model AND revision.

NOTE: Disk geometry could be mitigated by the 'grown' defects list on the drive. Check your drives. Drives with grown defects should never be used, as this is an indication that the drive is failing.

NOTE: All example shell commands in this document are in bourne shell style. Adjustment will need to be made to commands if you are using csh style shells.

NOTE: Some commands produce great amounts of output to stdout or stderr. Additionally some critical debugging information is sent to /dev/console by the kernel. You will want to have at least two terminals open on the host at all times. See the wscons FAQ.

Procedure Steps


Establish Physical Hardware Configuration

In this example, both disks are connected via 50 pin cables. Forced perfect ('active') termination is used for good measure. Your configuration may vary. In advanced high end RAID configurations, it is often recommended that RAID1 mirrors exist on different channels of a SCSI control or even on two different controllers.

sd0 at scsibus0 target0 lun 0: <SEAGATE, ST32430N SUN2.1G, 0444> SCSI2 0/direct fixed
sd0: 2049 MB, 3992 cyl, 9 head, 116 sec, 512 bytes/sect x4197405 sectors
sd0: sync (100.0ns offset 15), 8-bit (10.000MB/s)transfers, tagged queueing
sd1: at scsibus0 target 1 lun 0: <SEAGATE, ST32430N SUN2.1G, 0444> SCSI2 0/direct fixed
sd1: 2049 MB, 3992 cyl, 9 head, 116 sec, 512 bytes/sect x 4197405 sectors
sd1: sync (100.0ns offset 15), 8-bit (10.000MB/s) transfers, tagged queueing

Install Stock NetBSD System

Perform a very minimal ('stock') installation on your disk0. Install all the sets but do not bother customizing anything as it will be overwritten very soon.

Prepare a custom kernel with RAIDFrame support

You will need to build a custom kernel once the system is installed. The kernel must contain static SCSI ID to /dev entry mappings to ensure consistency in the event of a device failure after reboot. Follow the kernel compiling process and build and install the new kernel. The entries you will need to add are:

sd0 at scsibus0 target 0 lun ?
# SCSI disk drives
sd1 at scsibus0 target 1 lun ?
# SCSI disk drives
sd2 at scsibus0 target 2 lun ?
# SCSI disk drives
sd3 at scsibus0 target 3 lun ?
# SCSI disk drives
sd4 at scsibus0 target 4 lun ?
# SCSI disk drives
sd5 at scsibus0 target 5 lun ?
# SCSI disk drives
sd6 at scsibus0 target 6 lun ?
# SCSI disk drives

Prepare disk1 for use in RAID

Once you have a stock install of NetBSD on disk0, you are ready to begin. Disk1 will be visible and unused by the system. The first step should be to blow away any disklabel and MBR that may already be on disk1 from previous use. The easiest way to do that is to 'zero' them out with dd(8):

# dd if=/dev/zero of=/dev/sd1d bs=8k count=1
1+0 records in
1+0 records out
8192 bytes transferred in 0.003 secs (2730666 bytes/sec)


Once that is complete, you should verify that they are both gone:

# disklabel -r sd1d
sd1: no disk label
disklabel: no disklabel
ll
# fdisk sd1
Disk: /dev/rsd1d
NetBSD disklabel disk geometry:
cylinders: 3992 heads: 9 sectors/track: 116 (1044 sectors/cylinder)
BIOS disk geometry:
cylinders: 1023 heads: 64 sectors/track: 32 (2048 sectors/cylinder)
Partition table:
0: <UNUSED>
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>

Disklabel disk1 for use in RAID

You may now setup the disklabel on disk1. The a: slice MUST have an offset of at least one track. Use the sectors/track value below to determine this. This space is reserved for use by bootblocks.
# disklabel -r -I -e sd1d
[..snip...]
bytes/sector: 512
sectors/track: 116 # Important value!
tracks/cylinder: 9
sectors/cylinder: 1044
cylinders: 3992
total sectors: 4197405
[...snip...]
4 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: 4197289 116 RAID 0 0 # (Cyl. 0*- 4020*)
c: 4197289 116 unused 0 0 # (Cyl. 0*- 4020*)
d: 4197405 0 unused 0 0 # (Cyl. 0 - 4020*)


NOTE: On i386, c: and d: slies are always reserved. The offset of c: should be the same as a: in this instance.

NOTE: disklabel(8) will edit the disklabel using your $EDITOR variable. It defaults to vi.

NOTE: In this example, we are using the entire disk for the root ('/') partition. This is a very unrealistic approach to a production server. A more realistic example would be to create multiple slices on the disk of type RAID for /, /usr, /var, swap and then establish RAID0-RAID3 to mirror them as well. However for simplicity in illustrating this proecss, we are creating a system with a single slice spanning the entire disk.

Setup RAIDFRAME configuration file for RAID 0

# vi /etc/raid0.conf
START array
1 2 0

START disks
/dev/sd6a
/dev/sd1a

START layout
128 1 1 1

START queue
fifo 100


See raidctl(8) for more details. The array and layout sections are static for a RAID level 1 as it can only contain two disk per row/column. The disks section will contain one bogus disk in the initial configuration (sd6a here). We are using a bogus disk as the first component to help us create the RAID metadata structure on on disk1; it will be corrected later. The default values for queue are used.

Initialize RAID with disk1 component only

The first time initialization of any RAID set requires the -C flag to force. You can safely ignore any errors at this point.
# raidctl -v -C /etc/raid0.conf raid0
RAIDFRAME: protectedSectors is 64
raidlookup on device: /dev/sd6a failed!
Hosed component: /dev/sd1a
Hosed component: /dev/sd6a
raid0: Component /dev/sd6a being configured at row: 0 col: 0
Row: 0 Column: 0 Num Rows: 0 Num Columns: 0
Version: 0 Serial Number: 0 Mod Counter: 0
Clean: No Status: 0
/dev/sd6a has a different modification count: 230 0
Number of rows do not match for: /dev/sd6a
Number of columns do not match for: /dev/sd6a
/dev/sd6a is not clean!
raid0: Component /dev/sd1a being configured at row: 0 col: 1
Row: 0 Column: 0 Num Rows: 1 Num Columns: 2
Version: 2 Serial Number: 1000 Mod Counter: 230
Clean: Yes Status: 0
/dev/sd1a has a different serial number: 0 1000
Column out of alignment for: /dev/sd1a
raid0: There were fatal errors
raid0: Fatal errors being ignored.
RAIDFRAME: Configure (RAID Level 1): total number of sectors is 4197120 (2049 MB)
RAIDFRAME(RAID Level 1): Using 6 floating recon bufs with no head sep limit



A serial number must be assigned to the RAID set after first time initialization. This number is purely cosmetic and is at your discretion. Afterwards perform a first-time initalization of the RAID, safely ignoring the errors.
# raidctl -v -I 1000 raid0
# raidctl -v -i raid0
Initiating re-write
raid0: Error re-writing parity!
Parity Rewrite status:


View the status of the RAID. Note that the bogus device from above is marked failed but our disk1 component, sd1a is failed. Also note that parity is marked dirty. This is obvious because we haven't built it against another disk yet.
# raidctl -v -s raid0

Components:
/dev/sd6a: failed
/dev/sd1a: optimal
No spares.
/dev/sd6a status is: failed. Skipping label.
Component label for /dev/sd1a:
Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 2000, Mod Counter: 237
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 4197120
RAID Level: 1
Autoconfig: No
Root partition: No
Last configured as: raid0
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Rewrite is 100% complete.
Copyback is 100% complete.


NOTE: The command "raidctl -v -s raid0" is used quite frequently. You may wish to setup an alias in your environment:
# alias r0stat="/sbin/raidctl -v -s raid0|more"
# alias r1stat="/sbin/raidctl -v -s raid1|more"

Create a file system and mount the new RAID

Like any physical disk, RAID meta disk volumes have disklabels. You can now create your destination file system layout on the RAID. Per our notes above, we're simply creating

# disklabel -r -I -e raid0d

[...snip...]
bytes/sector: 512
sectors/track: 128
tracks/cylinder: 8
sectors/cylinder: 1024
cylinders: 4098
total sectors: 4197120
[...snip...]
4 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: 4197120 0 4.2BSD 2048 16384 326 # (Cyl. 0 - 4098*)
d: 4197120 0 unused 0 0 # (Cyl. 0 - 4098*)



Create the 4.2BSD/FFS file system.
# newfs /dev/rraid0a

2049.4MB in 13 cyl groups (326 c/g, 163.00MB/g, 19968 i/g)
super-block backups (for fsck -b #) at:
32, 333984, 667936, 1001888, 1335840, 1669792, 2003744, 2337696, 2670624, 3004576, 3338528, 3672480, 4006432,


Mount the file system at a temporary location.
# mount /dev/raid0a /mnt
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/sd0a 1985053 222158 1663642 11% /
/dev/raid0a 2065678 2 1962392 0% /mnt

NOTE: Depending on the size of your RAID, you'll probably want to readnewfs(8) and pass some flags to help optimize your file system.

Replicate generic install from disk0 onto newly created RAID using pax

# cd /; pax -X -rw -pe / /mnt
# df -m
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/sd0a 1938 216 1624 11% /
/dev/raid0a 2017 224 1691 11% /mnt

Configure replicated system configuration (/etc) independent of dis

In rc.conf, you will want to set no_swap=YES as our example system will not have a swap partition and we do not want to have /etc/rc complaining.
# vi /mnt/etc/rc.conf
rc_configured=YES
wscons=YES
no_swap=YES
sshd=YES
inetd=NO



In the fstab, you will need to adjust entries reflecting 'sd0' to their raid0 equivalent.
# vi /mnt/etc/fstab
/dev/raid0a / ffs rw 1 1

Make disk1 bootable with RAID component

In you need to install i386 BIOS boot blocks in the area of the disk of disk1 before the RAID partition begins.
# /usr/mdec/installboot -v -b 16 /usr/mdec/biosboot.sym /dev/rsd1d
/usr/mdec/biosboot.sym: entry point 0x8063000
proto bootblock size 48128
room for 10 filesystem blocks at 0x580
/dev/rsd1d: block number 16, size 40448 table blocks: 10/10
/dev/rsd1d: block numbers: 16 24 32 40 48 56 64 72 80 88
BSD partition starts at sector 0


This will also setup the MBR on the disk. Verify:
# fdisk sd1
Disk: /dev/rsd1d
NetBSD disklabel disk geometry:
cylinders: 3992 heads: 9 sectors/track: 116 (1044 sectors/cylinder)

BIOS disk geometry:
cylinders: 1023 heads: 64 sectors/track: 32 (2048 sectors/cylinder)

Partition table:
0: <UNUSED>
1: <UNUSED>
2: <UNUSED>
3: sysid 169 (NetBSD)
start 0, size 16 (0 MB), flag 0x80
beg: cylinder 0, head 0, sector 1
end: cylinder 0, head 0, sector 16


The "-A" flag to raidctl(8) will mark the components of a RAID set auto configurable by the kernel.
# raidctl -v -A root raid0
New autoconfig value is: 1
New rootpartition value is: 1
raid0: Autoconfigure: Yes
raid0: Root: Yes
/netbsd: New rootpartition value is: 1


Backup and remove your RAID1 configuration

It is important that you backup and remove the RAID configuration file from /etc. Keep the original configuration file around for reference later. Now that the RAID set is marked autoconfigure, the kernel will handle the initalization process and you do not want /etc/rc to also try to configure.
# tar [etc.] /etc/raid0.conf
# mv /etc/raid0.conf /root

Reboot and test RAID on disk1

# shutdown -r NOW
At this point enter your SCSI BIOS setup menu and adjust the boot ID to that of disk1 (normally ID 1). Boot the system. The SCSI controller should probe disk1/ID1 before ID0. The kernel will read RAID autoconfigure data from disk1.

[...snip...]
Kernelized RAIDframe activated
RAID autoconfigure
Configuring raid0:
RAIDFRAME: protectedSectors is 64
RAIDFRAME: Configure (RAID Level 1): total number of sectors is 4197120 (2049 MB)
RAIDFRAME(RAID Level 1): Using 6 floating recon bufs with no head sep limit
boot device: raid0
root on raid0a dumps on raid0b
root file system type: ffs

[...snip...]


NOTE: This step is necessary to verify that the boot blocks are working on the new drive and that they can read into the RAID partition meta data and find a kernel.

NOTE: Theoretically, could interrupt the boot block countdown at this point and change the boot dev from "hd0a:netbsd" (which is disk1/SCSI ID 1) to "hd1a:netbsd" (which is disk0/SCSI ID 0). However, because both disks contain a relatively GENERIC kernel with RAID autoconfigure enabled, they will force rootdev=/dev/raid0a. If you are truly curious, try booting with the "-a" flag.

Disklabel disk0 with an identical disklabel from disk1 (destructive)

# disklabel -r sd1d > /var/tmp/sd1_label
# dd if=/dev/zero of=/dev/rsd0d Bs=8k count=1
# disklabel -I -r -i sd0d
partition> W
Label disk [n]? y
Label written
partition> Q
# disklabel -R sd0d /var/tmp/sd1_label

Add disk0 as a component spare to the RAID

The "-a" flag permits you to add a spare to a RAID set. Now that sd0 is ready, we can add the sd0a slice

# raidctl -v -a /dev/sd0a raid0
# raidctl -v -s raid0

Components:
component0: failed
/dev/sd1a: optimal
Spares:
/dev/sd0a: spare
component0 status is: failed. Skipping label.
Component label for /dev/sd1a:
Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 2000, Mod Counter: 259
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 4197120
RAID Level: 1
Autoconfig: Yes
Root partition: Yes
Last configured as: raid0
/dev/sd0a status is: spare. Skipping label.
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Rewrite is 100% complete.
Copyback is 100% complete.


Synchronize drives (disk1 -> disk0)

By failing pseudo component 'component0', RAIDFrame will upgrade the spare you've added into use and begin rebuilding parity on it immediately; hence, duplicating the drive.
# raidctl -v -F component0 raid0
raid0: Failing the disk: row: 0 col: 0
raid0: Failing disk r0 c0
Reconstruction status:
RECON: initiating reconstruction on row 0 col 0 -> spare at row 0 col 2
Suspending: Waiting for Quiescence
Quiescence reached..

You can see the progress of the rebuild on another terminal (perhaps, from the kitchen or family room) using the "-S" and "-s" flags.
# raidctl -v -s raid0
Components:
/dev/sd0a: reconstructing /dev/sd1a: optimal
# raidctl -v -S raid0
Reconstruction is 35% complete.
Parity Rewrite is 100% complete.
Copyback is 100% complete.
Reconstruction status:
35% |************** | ETA: 05:03 \

The RAID set should now have clean parity
# raidctl -v -s raid0
Components:
component0: spared
/dev/sd1a: optimal
Spares:
/dev/sd0a: used_spare
component0 status is: spared. Skipping label.
Component label for /dev/sd1a:
Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 2000, Mod Counter: 260
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 4197120
RAID Level: 1
Autoconfig: Yes
Root partition: Yes
Last configured as: raid0
Component label for /dev/sd0a:
Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 2000, Mod Counter: 260
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 4197120
RAID Level: 1
Autoconfig: Yes
Root partition: Yes
Last configured as: raid0
Parity status: clean
Reconstruction is 100% complete.
Parity Rewrite is 100% complete.
Copyback is 100% complete.


Make disk0 bootable

# /usr/mdec/installboot -v -b 16 /usr/mdec/biosboot.sym /dev/rsd0d

/usr/mdec/biosboot.sym: entry point 0x8063000
proto bootblock size 48128
room for 10 filesystem blocks at 0x580
/dev/rsd0d: block number 16, size 40448 table blocks: 10/10
/dev/rsd0d: block numbers: 16 24 32 40 48 56 64 72 80 88
BSD partition starts at sector 0

Reboot to test disk0 component and boot blocks

Reset your SCSI boot ID back to 0 after reboot. When the boot block prompt appears, press control+c to escape out of the sequence:
# shutdown -r NOW
>> NetBSD/i386 BIOS Boot, Revision 2.12
>> (autobuild@tgm.daemon.org, Sun Sep 8 19:22:29 UTC 2002)
>> Memory: 638/129984 k
Press return to boot now, any other key for boot menu
booting hd0a:netbsd - starting in 0
type "?" or "help" for help.
> dev hd0a:
> ls /
[Snip]
3: boot (REG)
4: netbsd (REG)
[Snip]
> dev hd1a:
> Ls /
[Snip]
3: boot (REG)
4: netbsd (REG
)

> boot hd0a:netbsd
booting hd0a:netbsd
5451936+112040+341476 [304304+255616]=0x62b920
[ using 560372 bytes of netbsd ELF symbol table ]

Verify that /dev/sd0a has now replaced component0 and that the status of parity is clean.
# df
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/raid0a   4131356 465156 3459632 11% /

# raidctl -v -s raid0
Components:
/dev/sd0a: optimal
/dev/sd1a: optimal
No spares.
Component label for /dev/sd0a:
Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 2000, Mod Counter: 291
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 4197120
RAID Level: 1
Autoconfig: Yes
Root partition: Yes
Last configured as: raid0
Component label for /dev/sd1a:
Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 2000, Mod Counter: 291
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 4197120
RAID Level: 1
Autoconfig: Yes
Root partition: Yes
Last configured as: raid0
Parity status: clean
Reconstruction is 100% complete.
Parity Rewrite is 100% complete.
Copyback is 100% complete.

Backup disklabels and MBRs

# umask 077
# disklabel -r sd0 > /tmp/sd0_disklabel
# disklabel -r sd1 > /tmp/sd1_disklabel
# fdisk sd0 > /tmp/sd0_MBR
# fdisk sd1 > /tmp/sd1_MBR
# tar [etc.] /tmp/sd*

TEST: Reboot to test failing disk1 (disable drive)

Ideas?

TEST: Reboot to test failing disk0 (disable drive)

Ideas?

TEST: Warm-fail disk0. Recover using disk1

# raidctl -v -f /dev/sd0a raid0
# raidctl -vs raid0
# raidctl -R /dev/sd0a raid0
# raidctl Vs raid0
# raidctl Vs raid0
# disk sd0
# disklabel -r sd0

TEST: Warm-fail disk1. Recover using disk0

# raidctl -v -f /dev/sd1a raid0
# raidctl Vs raid0
# raidctl -R /dev/sd1a raid0
# raidctl Vs raid0
# raidctl Vs raid0
# fdisk sd1
# disklabel -r sd1

TEST: Hot-fail disk0. Recover using disk1

Ideas on a hot-fail test?

TEST: Hot-fail disk1. Recover using disk0

Ideas on a hot-fail test?

Follow Up