1.1 is more flexible in a number of ways and is safer.
0.90 is still fully supported.
1.0 should possibly be used for RAID1 arrays that you
want to boot off, depending on your boot loader.
Signed-off-by: NeilBrown <neilb@suse.de>
.TP
.BR \-e ", " \-\-metadata=
Declare the style of RAID metadata (superblock) to be used. The
-default is 0.90 for
+default is 1.1 for
.BR \-\-create ,
and to guess for other operations.
The default can be overridden by setting the
Options are:
.RS
-.IP "0, 0.90, default"
+.IP "0, 0.90"
Use the original 0.90 format superblock. This format limits arrays to
28 component devices and limits component devices of levels 1 and
greater to 2 terabytes.
-.IP "1, 1.0, 1.1, 1.2"
+.IP "1, 1.0, 1.1, 1.2 default"
Use the new version-1 format superblock. This has few restrictions.
The different sub-versions store the superblock at different locations
on the device, either at the end (for 1.0), at the start (for 1.1) or
-4K from the start (for 1.2).
+4K from the start (for 1.2). '1' is equivalent to '1.0', 'default' is
+equivalent to '1.1'.
.IP ddf
Use the "Industry Standard" DDF (Disk Data Format) format defined by
SNIA.
while (arg[0] == '0' && arg[1] == '0')
arg++;
if (strcmp(arg, "0") == 0 ||
- strcmp(arg, "0.90") == 0 ||
- strcmp(arg, "default") == 0 ||
- strcmp(arg, "") == 0 /* no metadata */
+ strcmp(arg, "0.90") == 0
)
return st;
return st;
}
if (strcmp(arg, "1.1") == 0 ||
- strcmp(arg, "1.01") == 0) {
+ strcmp(arg, "1.01") == 0 ||
+ strcmp(arg, "default") == 0 ||
+ strcmp(arg, "") == 0 /* no metadata */
+ ) {
st->minor_version = 1;
return st;
}
mdsize00=19840
# super1.0 round down to multiple of 2, subtract 8
mdsize1=19992
+# super1.1 for linear: round to multiple of 2, subtract 4
+mdsize1_l=19996
# subtract another 4 for bitmaps
mdsize1b=19988
mdsize11=19992
mdadm -CR $md0 -l linear -n3 $dev0 $dev1 $dev2
check linear
-testdev $md0 3 $mdsize0 1
+testdev $md0 3 $mdsize1_l 1
mdadm -S $md0
-# now with version-1 superblock
-mdadm -CR $md0 -e1 --level=linear -n4 $dev0 $dev1 $dev2 $dev3
+# now with version-0.90 superblock
+mdadm -CR $md0 -e0.90 --level=linear -n4 $dev0 $dev1 $dev2 $dev3
+check linear
+testdev $md0 4 $mdsize0 1
+mdadm -S $md0
+
+# now with version-1.0 superblock
+mdadm -CR $md0 -e1.0 --level=linear -n4 $dev0 $dev1 $dev2 $dev3
check linear
testdev $md0 4 $mdsize1 1
mdadm -S $md0
mdadm -CR $md1 -l multipath -n2 $path0 $path1
-testdev $md1 1 $mdsize0 1
+testdev $md1 1 $mdsize1 1
mdadm $md1 -f $path0
rotest $md1
-testdev $md1 1 $mdsize0 1
+testdev $md1 1 $mdsize1 1
mdadm $md1 -r $path0
mdadm $md1 -a $path0
rotest $md1
-testdev $md1 1 $mdsize0 1
+testdev $md1 1 $mdsize1 1
mdadm $md1 -f $path1
mdadm $md1 -r $path1
rotest $md1
-testdev $md1 1 $mdsize0 1
+testdev $md1 1 $mdsize1 1
mdadm -S $md1
mdadm -CR $md0 -l raid0 -n3 $dev0 $dev1 $dev2
check raid0
-testdev $md0 3 $mdsize0 512
+testdev $md0 3 $mdsize1_l 512
mdadm -S $md0
-# now with version-1 superblock
-mdadm -CR $md0 -e1 -l0 -n4 $dev0 $dev1 $dev2 $dev3
+# now with version-0.90 superblock
+mdadm -CR $md0 -e0.90 -l0 -n4 $dev0 $dev1 $dev2 $dev3
check raid0
-testdev $md0 4 $mdsize1 512
+testdev $md0 4 $mdsize0 512
mdadm -S $md0
# now with no superblock
# now same again with different chunk size
for chunk in 4 32 256
do
- mdadm -CR $md0 -l raid0 --chunk $chunk -n3 $dev0 $dev1 $dev2
+ mdadm -CR $md0 -e0.90 -l raid0 --chunk $chunk -n3 $dev0 $dev1 $dev2
check raid0
testdev $md0 3 $mdsize0 $chunk
mdadm -S $md0
# now with version-1 superblock
- mdadm -CR $md0 -e1 -l0 -c $chunk -n4 $dev0 $dev1 $dev2 $dev3
+ mdadm -CR $md0 -e1.0 -l0 -c $chunk -n4 $dev0 $dev1 $dev2 $dev3
check raid0
testdev $md0 4 $mdsize1 $chunk
mdadm -S $md0
mdadm -CR $md0 -l 1 -n2 $dev0 $dev1
check resync
check raid1
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
mdadm -S $md0
-# now with version-1 superblock, spare
-mdadm -CR $md0 -e1 --level=raid1 -n3 -x2 $dev0 missing missing $dev1 $dev2
+# now with version-0.90 superblock, spare
+mdadm -CR $md0 -e0.90 --level=raid1 -n3 -x2 $dev0 missing missing $dev1 $dev2
check recovery
check raid1
-testdev $md0 1 $mdsize1b 1
+testdev $md0 1 $mdsize0 1
mdadm -S $md0
# now with no superblock
esac
mdadm --create --run --level=raid10 --layout $lo --raid-disks 6 -x 1 $md0 $devs
check resync ; check raid10
- testdev $md0 $m $mdsize0 $[512*cm]
+ testdev $md0 $m $mdsize1 $[512*cm]
mdadm -S $md0
done
mdadm -CfR $md0 -l 4 -n3 $dev0 $dev1 $dev2
check resync ; check raid[45]
-testdev $md0 2 $mdsize0 512
+testdev $md0 2 $mdsize1 512
mdadm -S $md0
# now with version-1 superblock
# create a simple raid5 set
-mdadm -CfR $md0 -l 5 -n3 $dev0 $dev1 $dev2
+mdadm -CfR $md0 -e 0.90 -l 5 -n3 $dev0 $dev1 $dev2
check resync
testdev $md0 2 $mdsize0 512
mdadm -S $md0
mdadm -CfR $md0 -l 5 -p $lo -n3 $dev0 $dev1 $dev2
check resync ; check raid5
- testdev $md0 2 $mdsize0 512
+ testdev $md0 2 $mdsize1 512
mdadm -S $md0
# now with version-1 superblock
# create a simple raid6 set
-mdadm -CfR $md0 -l 6 -n4 $dev0 $dev1 $dev2 $dev3
+mdadm -CfR $md0 -e0.90 -l 6 -n4 $dev0 $dev1 $dev2 $dev3
check resync ; check raid6
testdev $md0 2 $mdsize0 512
mdadm -S $md0
case $e in
0.90 ) sz=$mdsize0 ;;
1 ) sz=$mdsize1 ;;
- 1.1 ) sz=$mdsize11 ;;
- 1.2 ) sz=$mdsize12 ;;
+ 1.1 ) sz=$mdsize1_l ;;
+ 1.2 ) sz=$mdsize11 ;;
esac
mdadm -CRf $md0 --level linear -e $e --raid-disks=1 $dev1
testdev $md0 1 $sz 1
# create a small raid1 array, make it larger. Then make it smaller
-mdadm -CR $md0 --level raid1 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3
+mdadm -CR $md0 -e 0.90 --level raid1 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3
check wait
check state UUU
testdev $md0 1 $[size/2] 1
# create a small raid5 array, make it larger. Then make it smaller
-mdadm -CR $md0 --level raid5 --chunk=32 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3
+mdadm -CR $md0 -e0.90 --level raid5 --chunk=32 --raid-disks 3 --size $[size/2] $dev1 $dev2 $dev3
check wait
check state UUU
testdev $md0 2 $[size/2] 32
# create a small raid6 array, make it larger. Then make it smaller
-mdadm -CR $md0 --level raid6 --chunk=32 --raid-disks 4 --size $[size/2] $dev1 $dev2 $dev3 $dev4
+mdadm -CR $md0 -e 0.90 --level raid6 --chunk=32 --raid-disks 4 --size $[size/2] $dev1 $dev2 $dev3 $dev4
check wait
check state UUUU
testdev $md0 2 $[size/2] 32
mdadm -CR $md2 -l0 -n3 $dev0 $dev1 $dev2
check raid0
-tst="testdev $md2 3 $mdsize0 512"
+tst="testdev $md2 3 $mdsize1 512"
$tst
uuid=`mdadm -Db $md2 | sed 's/.*UUID=//'`
mdadm -S $md2
$tst
mdadm -S $md2
-mdadm --assemble $md2 --super-minor=2 $devlist
+mdadm --assemble $md2 --name=2 $devlist
$tst
mdadm -S $md2
{
echo DEVICE $devlist
- echo array $md2 super-minor=2
+ echo array $md2 name=2
} > $conf
mdadm -As -c $conf $md2
mdadm -S $md2
-### Now for version 1...
+### Now for version 0...
mdadm --zero-superblock $dev0 $dev1 $dev2
-mdadm -CR $md2 -l0 --metadata=1.0 -n3 $dev0 $dev1 $dev2
+mdadm -CR $md2 -l0 --metadata=0.90 -n3 $dev0 $dev1 $dev2
check raid0
-tst="testdev $md2 3 $mdsize1 512"
+tst="testdev $md2 3 $mdsize0 512"
$tst
uuid=`mdadm -Db $md2 | sed 's/.*UUID=//'`
$tst
mdadm -S $md2
-# version 1 has no super-minor
-# mdadm --assemble $md2 --super-minor=2 $devlist #
-# $tst
-# mdadm -S $md2
+mdadm --assemble $md2 --super-minor=2 $devlist #
+$tst
+mdadm -S $md2
conf=$targetdir/mdadm.conf
{
$tst
mdadm -S $md2
-#{
-# echo DEVICE $devlist
-# echo array $md2 super-minor=2
-#} > $conf
-#
-#mdadm -As -c $conf $md2
-#$tst
-#mdadm -S $md2
+{
+ echo DEVICE $devlist
+ echo array $md2 super-minor=2
+} > $conf
+
+mdadm -As -c $conf $md2
+$tst
+mdadm -S $md2
{
# create a raid5 array and assemble it in various ways,
# including with missing devices.
-mdadm -CR $md1 -l5 -n3 $dev0 $dev1 $dev2
+mdadm -CR -e 0.90 $md1 -l5 -n3 $dev0 $dev1 $dev2
tst="check raid5 ;testdev $md1 2 $mdsize0 512 ; mdadm -S $md1"
uuid=`mdadm -Db $md1 | sed 's/.*UUID=//'`
check wait
# create a raid0, re-assemble with a different super-minor
-mdadm -CR $md0 -l0 -n3 $dev0 $dev1 $dev2
+mdadm -CR -e 0.90 $md0 -l0 -n3 $dev0 $dev1 $dev2
testdev $md0 3 $mdsize0 512
minor1=`mdadm -E $dev0 | sed -n -e 's/.*Preferred Minor : //p'`
mdadm -S /dev/md0
rm -f $bmf
mdadm --create --run $md0 --level=1 -n2 --delay=1 --bitmap $bmf $dev1 $dev2
check wait
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
mdadm -S $md0
mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4
dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
exit 1
fi
mdadm $md0 -f $dev1
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
sleep 4
dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty3 -lt 400 ]
#
mdadm --create --run $md0 -l 1 -n 2 $dev1 $dev2
check wait
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
bmf=$targetdir/bm
rm -f $bmf
sleep 4
dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4
dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
#
mdadm --create --run $md0 -l 1 -n 2 $dev1 $dev2
check wait
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
#mdadm -E $dev1
mdadm --grow $md0 --bitmap=internal --delay=1 || { mdadm -X $dev2 ; exit 1; }
sleep 4
dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4
dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
#
# create a raid1 with an internal bitmap
#
-mdadm --create --run $md0 --level=1 -n2 --delay=1 --bitmap internal $dev1 $dev2
+mdadm --create -e0.90 --run $md0 --level=1 -n2 --delay=1 --bitmap internal $dev1 $dev2
check wait
testdev $md0 1 $mdsize0 1
mdadm -S $md0
#
bmf=$targetdir/bitmap
rm -f $bmf
-mdadm --create --run $md0 --level=1 -n3 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3
+mdadm --create -e0.90 --run $md0 --level=1 -n3 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3
check wait
testdev $md0 1 $mdsize0 1
mdadm -S $md0
mdadm -CR $md0 -l1 -n2 -binternal -d1 $dev1 $dev2
check resync
check wait
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
sleep 4
mdadm $md0 -f $dev2
mdadm $md0 -f $dev2
sleep 1
mdadm $md0 -r $dev2
-testdev $md0 1 $mdsize0 1
+testdev $md0 1 $mdsize1 1
mdadm $md0 -a $dev2
check wait
-cmp --bytes=$[$mdsize0*1024] $dev1 $dev2
+cmp --ignore-initial=$[16*512] --bytes=$[$mdsize0*1024] $dev1 $dev2
mdadm $md0 -f $dev2; sleep 1
mdadm $md0 -r $dev2
mdadm $md0 -a $dev2
check recovery
check wait
-cmp --bytes=$[$mdsize0*1024] $dev1 $dev2
+cmp --ignore-initial=$[16*512] --bytes=$[$mdsize0*1024] $dev1 $dev2
mdadm -S $md0
rm -f $bmf
mdadm --create --run $md0 --level=5 -n3 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3
check wait
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
mdadm -S $md0
mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2 $dev3
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4
dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
exit 1
fi
mdadm $md0 -f $dev1
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
sleep 4
dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty3 -lt 400 ]
#
mdadm --create --run $md0 --level=5 -n3 --delay=1 --bitmap internal $dev1 $dev2 $dev3
check wait
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
mdadm -S $md0
mdadm --assemble $md0 $dev1 $dev2 $dev3
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4
dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
exit 1
fi
mdadm $md0 -f $dev1
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
sleep 4
dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty3 -lt 400 ]
rm -f $bmf
mdadm --create --run $md0 --level=6 -n4 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3 $dev4
check wait
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
mdadm -S $md0
mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2 $dev3 $dev4
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
sleep 4
dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
exit 1
fi
mdadm $md0 -f $dev3
-testdev $md0 2 $mdsize0 1
+testdev $md0 2 $mdsize1 512
sleep 4
dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
if [ $dirty3 -lt 400 ]
# make a raid5 array, byte swap the superblocks, then assemble...
-mdadm -CR $md0 -l5 -n4 $dev0 $dev1 $dev2 $dev3
+mdadm -CR $md0 -e 0.90 -l5 -n4 $dev0 $dev1 $dev2 $dev3
sleep 4
mdadm -S $md0
# create a raid1 array with a wrmostly device
mdadm -CR $md0 -l1 -n3 $dev0 $dev1 --write-mostly $dev2
-testdev $md0 1 $mdsize0 64
+testdev $md0 1 $mdsize1 1
# unfortunately, we cannot measure if any read requests are going to $dev2
mdadm -S $md0
mdadm -CR $md0 -l1 -n3 --write-behind --bitmap=internal $dev0 $dev1 --write-mostly $dev2
-testdev $md0 1 $mdsize0 64
+testdev $md0 1 $mdsize1 1
mdadm -S $md0
mdadm -Ss
mdadm -As -c /dev/null --homehost=testing -vvv
-testdev $md1 1 $mdsize0 64
-testdev $md2 1 $mdsize0 64
-testdev $md0 2 $mdsize00 512
+testdev $md1 1 $mdsize1 1
+testdev $md2 1 $mdsize1 1
+testdev $md0 2 $mdsize11 512
mdadm -Ss
mdadm --zero-superblock $dev0 $dev1 $dev2 $dev3
mdadm -CR $md0 -l0 -n2 $md1 $dev2 --homehost=testing
mdadm -Ss
mdadm -As -c /dev/null --homehost=testing -vvv
-testdev $md1 1 $mdsize0 64
-testdev $md0 1 $[mdsize0+mdsize00] 512
+testdev $md1 1 $mdsize1 1
+testdev $md0 1 $[mdsize1+mdsize11] 512
mdadm -Ss
fi
-mdadm -CR $mdp0 -l0 -f -n1 $dev0
-mdadm -CR $mdp1 -l0 -f -n1 $dev1
+mdadm -CR -e 0 $mdp0 -l0 -f -n1 $dev0
+mdadm -CR -e 0 $mdp1 -l0 -f -n1 $dev1
sfdisk $mdp0 >&2 << END
,,FD
END
sfdisk $mdp1 >&2 << END
,,FD
END
-mdadm -CR $md0 -l1 -n2 ${mdp0}p1 ${mdp1}p1
+mdadm -CR -e 0 $md0 -l1 -n2 ${mdp0}p1 ${mdp1}p1
check resync
check raid1
check wait
dotest() {
sleep 0.5
check wait
- testdev $md0 $1 $mdsize0 64 nd
+ testdev $md0 $1 $mdsize1 64 nd
blockdev --flushbufs $md0
cmp -s -n $[textK*1024] $md0 /tmp/RandFile || { echo cmp failed; exit 2; }
# write something new - shift chars 4 space
bu=/tmp/md-test-backup
rm -f $bu
-mdadm -CR $md0 -l1 -n2 -x1 $dev0 $dev1 $dev2
-testdev $md0 1 $mdsize0 64
+mdadm -CR $md0 -l1 -n2 -x1 $dev0 $dev1 $dev2 -z 19968
+testdev $md0 1 $mdsize1 64
dd if=/tmp/RandFile of=$md0
dotest 1
mdadm -G $md0 -l6 --backup-file $bu
dotest 3
-mdadm -G /dev/md0 --array-size $[mdsize0*2]
+mdadm -G /dev/md0 --array-size 39936
mdadm -G $md0 -n4 --backup-file $bu
dotest 2
mdadm -G $md0 -l5 --backup-file $bu
dotest 2
-mdadm -G /dev/md0 --array-size $mdsize0
+mdadm -G /dev/md0 --array-size 19968
mdadm -G $md0 -n2 --backup-file $bu
dotest 1
mdadm $md0 --fail $dev0
-mdadm -G /dev/md0 --array-size $[mdsize0*2]
+mdadm -G /dev/md0 --array-size 39936
mdadm -G $md0 -n4 --backup-file $bu
dotest 2
mdadm $md0 --fail $dev4
mdadm -G $md0 -l5 --backup-file $bu
dotest 2
-mdadm -G /dev/md0 --array-size $mdsize0
+mdadm -G /dev/md0 --array-size 19968
mdadm -G $md0 -n2 --backup-file $bu
dotest 1
mdadm $md0 --fail $dev2
dotest() {
sleep 0.5
check wait
- testdev $md0 $1 $mdsize0 512 nd
+ testdev $md0 $1 $mdsize1 512 nd
blockdev --flushbufs $md0
cmp -s -n $[textK*1024] $md0 /tmp/RandFile || { echo cmp failed; exit 2; }
# write something new - shift chars 4 space
# test restore: make a raid5 from a file, then do a compare
dd if=/dev/urandom of=/tmp/RandFile bs=1024 count=$size
$dir/test_stripe restore /tmp/RandFile $disks $[chunk*1024] $level $nlayout 0 $[size*1024] $devs
- mdadm -CR $md0 -amd -l$level -n$disks --assume-clean -c $chunk -p $layout $devs
+ mdadm -CR -e 1.0 $md0 -amd -l$level -n$disks --assume-clean -c $chunk -p $layout $devs
cmp -s -n $[size*1024] $md0 /tmp/RandFile || { echo cmp failed ; exit 2; }
# FIXME check parity