f2e29ad691
In repair mode, raid6check will rewrite one single stripe by regenerating the data (or parity) of two raid devices that are specified via the command line. If you need to rewrite just one slot, pick any other slot at random. Note that the repair option will change data on the disks directly, so both the md layer above as well as any layers above md (such as filesystems) may be accessing the stripe data from cached buffers. Either instruct the kernels to drop the caches or reassemble the raid after repair. Signed-off-by: NeilBrown <neilb@suse.de>
48 lines
1.9 KiB
Plaintext
48 lines
1.9 KiB
Plaintext
number_of_disks=4
|
|
chunksize_in_kib=512
|
|
chunksize_in_b=$[chunksize_in_kib*1024]
|
|
array_data_size_in_kib=$[chunksize_in_kib*(number_of_disks-2)*number_of_disks]
|
|
array_data_size_in_b=$[array_data_size_in_kib*1024]
|
|
devs="$dev1 $dev2 $dev3 $dev4"
|
|
|
|
# default 32 sectors
|
|
data_offset_in_kib=$[32/2]
|
|
|
|
for failure in "$dev3 3 3 2" "$dev3 3 2 3" "$dev3 3 2 1" "$dev3 3 2 0" "$dev4 3 3 0" "$dev4 3 3 1" "$dev4 3 3 2" \
|
|
"$dev1 3 0 1" "$dev1 3 0 2" "$dev1 3 0 3" "$dev2 3 1 0" "$dev2 3 1 2" "$dev2 3 1 3" ; do
|
|
failure_split=( $failure )
|
|
device_with_error=${failure_split[0]}
|
|
stripe_with_error=${failure_split[1]}
|
|
repair_params="$stripe_with_error ${failure_split[2]} ${failure_split[3]}"
|
|
start_of_errors_in_kib=$[data_offset_in_kib+chunksize_in_kib*stripe_with_error]
|
|
|
|
# make a raid5 from a file
|
|
dd if=/dev/urandom of=/tmp/RandFile bs=1024 count=$array_data_size_in_kib
|
|
mdadm -CR $md0 -l6 -n$number_of_disks -c $chunksize_in_kib $devs
|
|
dd if=/tmp/RandFile of=$md0 bs=1024 count=$array_data_size_in_kib
|
|
blockdev --flushbufs $md0; sync
|
|
|
|
check wait
|
|
blockdev --flushbufs $devs; sync
|
|
echo 3 > /proc/sys/vm/drop_caches
|
|
cmp -s -n $array_data_size_in_b $md0 /tmp/RandFile || { echo sanity cmp failed ; exit 2; }
|
|
|
|
dd if=/dev/urandom of=$device_with_error bs=1024 count=$chunksize_in_kib seek=$start_of_errors_in_kib
|
|
blockdev --flushbufs $device_with_error; sync
|
|
echo 3 > /proc/sys/vm/drop_caches
|
|
|
|
$dir/raid6check $md0 0 0 2>&1 | grep -qs "Error" || { echo should detect errors; exit 2; }
|
|
|
|
$dir/raid6check $md0 repair $repair_params > /dev/null || { echo repair failed; exit 2; }
|
|
blockdev --flushbufs $md0 $devs; sync
|
|
echo 3 > /proc/sys/vm/drop_caches
|
|
|
|
$dir/raid6check $md0 0 0 2>&1 | grep -qs "Error" && { echo errors detected; exit 2; }
|
|
cmp -s -n $array_data_size_in_b $md0 /tmp/RandFile || { echo cmp failed ; exit 2; }
|
|
|
|
mdadm -S $md0
|
|
udevadm settle
|
|
blockdev --flushbufs $md0 $devs; sync
|
|
echo 3 > /proc/sys/vm/drop_caches
|
|
done
|