summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bsdinstall
diff options
context:
space:
mode:
authorallanjude <allanjude@FreeBSD.org>2016-05-24 00:22:29 +0000
committerallanjude <allanjude@FreeBSD.org>2016-05-24 00:22:29 +0000
commit06f220e4c33a78e5bac3dbd989b8cf7d2c9a2750 (patch)
tree0fa3efc82055ab3883da13441d7ee29fb9f985b1 /usr.sbin/bsdinstall
parent69a8601e63c4e7e77f91dcf55e2456972c53d030 (diff)
downloadFreeBSD-src-06f220e4c33a78e5bac3dbd989b8cf7d2c9a2750.zip
FreeBSD-src-06f220e4c33a78e5bac3dbd989b8cf7d2c9a2750.tar.gz
Add support for RAID 1+0 (striped mirrors) to bsdinstall/zfsboot
Sponsored by: ScaleEngine Inc.
Diffstat (limited to 'usr.sbin/bsdinstall')
-rwxr-xr-xusr.sbin/bsdinstall/scripts/zfsboot45
1 files changed, 40 insertions, 5 deletions
diff --git a/usr.sbin/bsdinstall/scripts/zfsboot b/usr.sbin/bsdinstall/scripts/zfsboot
index 1666176..657ea11 100755
--- a/usr.sbin/bsdinstall/scripts/zfsboot
+++ b/usr.sbin/bsdinstall/scripts/zfsboot
@@ -272,6 +272,7 @@ msg_not_enough_disks_selected="Not enough disks selected. (%u < %u minimum)"
msg_null_disk_argument="NULL disk argument"
msg_null_index_argument="NULL index argument"
msg_null_poolname="NULL poolname"
+msg_odd_disk_selected="An even number of disks must be selected to create a RAID 1+0. (%u selected)"
msg_ok="OK"
msg_partition_scheme="Partition Scheme"
msg_partition_scheme_help="Select partitioning scheme. GPT is recommended."
@@ -284,6 +285,8 @@ msg_pool_name_help="Customize the name of the zpool to be created (Required)"
msg_pool_type_disks="Pool Type/Disks:"
msg_pool_type_disks_help="Choose type of ZFS Virtual Device and disks to use (Required)"
msg_processing_selection="Processing selection..."
+msg_raid10_desc="RAID 1+0 - n x 2-Way Mirrors"
+msg_raid10_help="[4+ Disks] Striped Mirrors provides the best performance, but the least storage"
msg_raidz1_desc="RAID-Z1 - Single Redundant RAID"
msg_raidz1_help="[3+ Disks] Withstand failure of 1 disk. Recommended for: 3, 5 or 9 disks"
msg_raidz2_desc="RAID-Z2 - Double Redundant RAID"
@@ -478,6 +481,7 @@ dialog_menu_layout()
local vdev_menu_list="
'stripe' '$msg_stripe_desc' '$msg_stripe_help'
'mirror' '$msg_mirror_desc' '$msg_mirror_help'
+ 'raid10' '$msg_raid10_desc' '$msg_raid10_help'
'raidz1' '$msg_raidz1_desc' '$msg_raidz1_help'
'raidz2' '$msg_raidz2_desc' '$msg_raidz2_help'
'raidz3' '$msg_raidz3_desc' '$msg_raidz3_help'
@@ -488,7 +492,7 @@ dialog_menu_layout()
# Warn the user if vdev type is not valid
case "$ZFSBOOT_VDEV_TYPE" in
- stripe|mirror|raidz1|raidz2|raidz3) : known good ;;
+ stripe|mirror|raid10|raidz1|raidz2|raidz3) : known good ;;
*)
f_dprintf "%s: Invalid virtual device type \`%s'" \
$funcname "$ZFSBOOT_VDEV_TYPE"
@@ -575,6 +579,7 @@ dialog_menu_layout()
case "$ZFSBOOT_VDEV_TYPE" in
stripe) want_disks=1 ;;
mirror) want_disks=2 ;;
+ raid10) want_disks=4 ;;
raidz1) want_disks=3 ;;
raidz2) want_disks=4 ;;
raidz3) want_disks=5 ;;
@@ -683,6 +688,21 @@ dialog_menu_layout()
"$ZFSBOOT_DISKS"
f_count ndisks $ZFSBOOT_DISKS
+
+ if [ "$ZFSBOOT_VDEV_TYPE" == "raid10" ] &&
+ [ $(( $ndisks % 2 )) -ne 0 ]; then
+ f_dprintf "$funcname: %s: %s (%u %% 2 = %u)" \
+ "$ZFSBOOT_VDEV_TYPE" \
+ "Number of disks not even:" \
+ $ndisks $(( $ndisks % 2 ))
+ msg_yes="$msg_change_selection" \
+ msg_no="$msg_cancel" \
+ f_yesno "%s: $msg_odd_disk_selected" \
+ "$ZFSBOOT_VDEV_TYPE" $ndisks ||
+ break
+ continue
+ fi
+
[ $ndisks -ge $want_disks ] &&
breakout=break && break
@@ -1271,10 +1291,25 @@ zfs_create_boot()
#
f_dprintf "$funcname: Creating root pool..."
create_options="$ZFSBOOT_POOL_CREATE_OPTIONS"
- f_eval_catch $funcname zpool "$ZPOOL_CREATE_WITH_OPTIONS" \
- "-o altroot=$BSDINSTALL_CHROOT $create_options -m none -f" \
- "$zroot_name" "$zroot_vdevtype" "$zroot_vdevs" ||
- return $FAILURE
+ if [ "$zroot_vdevtype" == "raid10" ]; then
+ raid10_vdevs=""
+ for vdev in $zroot_vdevs; do
+ f_count nvdev $raid10_vdevs
+ if [ $(( $nvdev % 3 )) -eq 0 ]; then
+ raid10_vdevs="$raid10_vdevs mirror"
+ fi
+ raid10_vdevs="$raid10_vdevs $vdev"
+ done
+ f_eval_catch $funcname zpool "$ZPOOL_CREATE_WITH_OPTIONS" \
+ "-o altroot=$BSDINSTALL_CHROOT $create_options -m none -f" \
+ "$zroot_name" "" "$raid10_vdevs" ||
+ return $FAILURE
+ else
+ f_eval_catch $funcname zpool "$ZPOOL_CREATE_WITH_OPTIONS" \
+ "-o altroot=$BSDINSTALL_CHROOT $create_options -m none -f" \
+ "$zroot_name" "$zroot_vdevtype" "$zroot_vdevs" ||
+ return $FAILURE
+ fi
#
# Create ZFS dataset layout within the new root pool
OpenPOWER on IntegriCloud