From eb11babe9f1cd3766c1d7a5f67a06d0f88d55d04 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Rapha=C3=ABl=20Gertz?= <git@rapsys.eu>
Date: Sat, 25 Mar 2017 00:58:24 +0100
Subject: [PATCH] Switch to single btrfs data device Switch to grub2

---
 config/mdnames.conf    |  2 -
 config/mountpoint.conf |  2 +-
 genimg                 |  1 -
 lib/boot.sh            | 44 +++++++++-----------
 lib/device.sh          | 91 +++++++++---------------------------------
 lib/free.sh            |  2 -
 lib/mkfs.sh            | 25 +++++++++---
 lib/root.sh            |  7 +++-
 8 files changed, 63 insertions(+), 111 deletions(-)

diff --git a/config/mdnames.conf b/config/mdnames.conf
index d22a708..6e746ee 100644
--- a/config/mdnames.conf
+++ b/config/mdnames.conf
@@ -1,6 +1,4 @@
 # boot md names
 MDBOOT='mdboot'
-# slash md names
-MDSLASH='mdslash'
 # data md names
 MDDATA='mddata'
diff --git a/config/mountpoint.conf b/config/mountpoint.conf
index d0def73..d66a42f 100644
--- a/config/mountpoint.conf
+++ b/config/mountpoint.conf
@@ -1,2 +1,2 @@
 # mount point
-MOUNTPOINT='/media/slash'
+MOUNTPOINT='/media/data'
diff --git a/genimg b/genimg
index 9091ac2..6da825d 100755
--- a/genimg
+++ b/genimg
@@ -28,7 +28,6 @@ fi
 if [ `losetup ${LOOPA} >/dev/null 2>&1; echo $?` -ne 1 -o `losetup ${LOOPB} >/dev/null 2>&1; echo $?` -ne 1 ]; then
 	echo "Loopa or loopb already exists, try to run:"
 	echo "mdadm -S /dev/md/$MDBOOT"
-	echo "mdadm -S /dev/md/$MDSLASH"
 	echo "mdadm -S /dev/md/$MDDATA"
 	echo "losetup -d ${LOOPA}"
 	echo "losetup -d ${LOOPB}"
diff --git a/lib/boot.sh b/lib/boot.sh
index 021a384..0e4186f 100644
--- a/lib/boot.sh
+++ b/lib/boot.sh
@@ -3,6 +3,12 @@
 # Bind mount /dev
 mount --bind /dev ${MOUNTPOINT}/dev
 
+# Bind mount /proc
+mount --bind /proc ${MOUNTPOINT}/proc
+
+# Bind mount /sys
+mount --bind /sys ${MOUNTPOINT}/sys
+
 # Backup old mtab
 mv ${MOUNTPOINT}/etc/mtab ${MOUNTPOINT}/etc/mtab.orig
 
@@ -10,38 +16,21 @@ mv ${MOUNTPOINT}/etc/mtab ${MOUNTPOINT}/etc/mtab.orig
 #cat /proc/self/mounts | grep -E '^(/dev/m|devtmpfs)' | perl -pne 's%/media(/?)%$1%' | sort | uniq > /media/etc/mtab
 perl -pne "/^(devtmpfs \\/dev|\\/dev\\/(md|dm|mapper))/ || undef \$_; s%${MOUNTPOINT}/?%/%" /proc/self/mounts > ${MOUNTPOINT}/etc/mtab
 
-# Backup old device.map
-mv ${MOUNTPOINT}/boot/grub/device.map ${MOUNTPOINT}/boot/grub/device.map.orig
-
-# Install grub
-for i in $LOOPB $LOOPA; do
-	# Create new device map
-	echo "(hd0)	$i" > ${MOUNTPOINT}/boot/grub/device.map
-
-	# Fix grub
-	#XXX: e2fs_stage1_5 is 20 sectors embedded, but it fail with gpt
-	#XXX: we use install command directly instead of setup (hd0) because it fail with loop
-	cat << EOF | chroot ${MOUNTPOINT} grub --device-map=/boot/grub/device.map
-root (hd0,0)
-install --stage2=/boot/grub/stage2 /grub/stage1 (hd0) /grub/stage2 p /grub/menu.lst
-EOF
-done
-
-# Restore old device.map
-mv -f ${MOUNTPOINT}/boot/grub/device.map.orig ${MOUNTPOINT}/boot/grub/device.map
-
-# Bind mount /proc
-mount --bind /proc ${MOUNTPOINT}/proc
-
-# Bind mount /sys
-mount --bind /sys ${MOUNTPOINT}/sys
-
 # Extract last kernel version
 KVER=`chroot ${MOUNTPOINT} rpm -qa | perl -pne '/kernel-server-latest/||undef $_;s%^kernel-(server)-latest-([^-]+)-(.+)$%\2-\1-\3%'`
+
 # Regenerate initrd
 #XXX: force non hostonly else it don't store commandline : rd.luks.uuid rd.md.uuid ip=dhcp rd.neednet=1
 DRACUT_SKIP_FORCED_NON_HOSTONLY=1 chroot ${MOUNTPOINT} mkinitrd -f /boot/initrd-${KVER}.img ${KVER}
 
+# Generate grub config
+chroot ${MOUNTPOINT} grub2-mkconfig -o /boot/grub2/grub.cfg
+
+# Install grub
+for i in $LOOPB $LOOPA; do
+	chroot ${MOUNTPOINT} grub2-install $i
+done
+
 # Umount dev
 umount ${MOUNTPOINT}/sys
 
@@ -54,5 +43,8 @@ umount ${MOUNTPOINT}/dev
 # Reset mtab
 mv -f ${MOUNTPOINT}/etc/mtab.orig ${MOUNTPOINT}/etc/mtab
 
+# Umount home
+umount ${MOUNTPOINT}/home
+
 # Umount boot
 umount ${MOUNTPOINT}/boot
diff --git a/lib/device.sh b/lib/device.sh
index 1957287..a4d4f51 100644
--- a/lib/device.sh
+++ b/lib/device.sh
@@ -5,101 +5,46 @@ for i in ${SDA} ${SDB}; do
 	# Create empty file of 8GB
 	dd if=/dev/zero of=${i} bs=$((8192*1024)) count=1024
 	# Create partition table
-	#XXX: we generate gpt table then fake mbr compat one
-	cat << EOF | fdisk ${i}
-g
+	#XXX: we generate gpt table
+	cat << EOF | gdisk ${i}
+o
+Y
 n
 1
 2048
-+256M
-t
-29
++2M
+ef02
 n
 2
-526336
-+4G
-t
-2
-29
-n
-3
-8914944
-+2G
-t
-3
-19
-n
-4
-13109248
-16777182
-t
-4
-29
-x
-A
-1
-M
-r
-d
-n
-p
-1
-2048
+
 +256M
-t
-fd
+fd00
 n
-p
-2
-526336
-+4G
-t
-2
-fd
-n
-p
 3
-8914944
+
 +2G
-t
-3
-82
+8200
 n
-p
-13109248
-16777182
-t
 4
-fd
-a
-1
-p
-x
-M
-r
-p
+
+
+fd00
 w
+Y
 EOF
 	# Add it with partition scan
 	losetup -f -P ${i}
 done
 
 # Create raids
-mdadm --create /dev/md/${MDBOOT} --level=1 --metadata=0.90 --homehost=${NETHOSTNAME} --name=${MDBOOT} --assume-clean --raid-devices=2 ${LOOPA}p1 ${LOOPB}p1
-mdadm --create /dev/md/${MDSLASH} --level=1 --metadata=default --homehost=${NETHOSTNAME} --name=${MDSLASH} --assume-clean --raid-devices=2 ${LOOPA}p2 ${LOOPB}p2
+#XXX: grub2 support standard linux raid1 device
+#mdadm --create /dev/md/${MDBOOT} --level=1 --metadata=0.90 --homehost=${NETHOSTNAME} --name=${MDBOOT} --assume-clean --raid-devices=2 ${LOOPA}p2 ${LOOPB}p2
+mdadm --create /dev/md/${MDBOOT} --level=1 --metadata=default --homehost=${NETHOSTNAME} --name=${MDBOOT} --assume-clean --raid-devices=2 ${LOOPA}p2 ${LOOPB}p2
 mdadm --create /dev/md/${MDDATA} --level=1 --metadata=default --homehost=${NETHOSTNAME} --name=${MDDATA} --assume-clean --raid-devices=2 ${LOOPA}p4 ${LOOPB}p4
 
 # Create slash luks partition
 #XXX: low iter time, should need around 100000 minimum
-echo -n $LUKSPASSWORD | cryptsetup -c aes-xts-plain64 -h sha512 -s 512 --iter-time 2000 --use-urandom --uuid ${LUKSSLASHUUID} -d - --batch-mode luksFormat /dev/md/${MDSLASH} 
-
-# Open luks partition
-echo -n $LUKSPASSWORD | cryptsetup -d - --batch-mode luksOpen /dev/md/${MDSLASH} ${SLASHNAME}
-
-# Create data luks partition
-#XXX: low iter time, should need around 100000 minimum
-echo -n $LUKSPASSWORD | cryptsetup -c aes-xts-plain64 -h sha512 -s 512 --iter-time 2000 --use-urandom --uuid ${LUKSDATAUUID} -d - --batch-mode luksFormat /dev/md/${MDDATA} 
+echo -n $LUKSPASSWORD | cryptsetup -c aes-xts-plain64 -h sha512 -s 512 --iter-time 2000 --use-urandom --uuid ${LUKSDATAUUID} -d - --batch-mode luksFormat /dev/md/${MDDATA}
 
 # Open luks partition
 echo -n $LUKSPASSWORD | cryptsetup -d - --batch-mode luksOpen /dev/md/${MDDATA} ${DATANAME}
-
diff --git a/lib/free.sh b/lib/free.sh
index a01b368..69fbfb9 100644
--- a/lib/free.sh
+++ b/lib/free.sh
@@ -4,12 +4,10 @@
 umount ${MOUNTPOINT}
 
 # Close slash luks partition
-cryptsetup close ${SLASHNAME}
 cryptsetup close ${DATANAME}
 
 # Stop raids
 mdadm --manage /dev/md/${MDBOOT} -S
-mdadm --manage /dev/md/${MDSLASH} -S
 mdadm --manage /dev/md/${MDDATA} -S
 
 # Detach loops
diff --git a/lib/mkfs.sh b/lib/mkfs.sh
index 1ccc671..34bfe2e 100644
--- a/lib/mkfs.sh
+++ b/lib/mkfs.sh
@@ -5,11 +5,26 @@
 mkfs.ext3 -L 'boot' -U ${BOOTUUID} /dev/md/${MDBOOT}
 
 # Create swap on it
-mkswap -U ${SWAPAUUID} ${LOOPA}p3
-mkswap -U ${SWAPBUUID} ${LOOPB}p3
-
-# Create filesystem
-mkfs.btrfs -L 'slash' -U ${SLASHUUID} /dev/mapper/${SLASHNAME}
+mkswap -L 'swapa' -U ${SWAPAUUID} ${LOOPA}p3
+mkswap -L 'swapb' -U ${SWAPBUUID} ${LOOPB}p3
 
 # Create filesystem
 mkfs.btrfs -L 'data' -U ${DATAUUID} /dev/mapper/${DATANAME}
+
+# Make mount point
+mkdir -p ${MOUNTPOINT}
+
+# Mount base filesystem
+mount /dev/mapper/${DATANAME} ${MOUNTPOINT}
+
+# Create slash subvolume
+btrfs subvolume create ${MOUNTPOINT}/slash
+
+# Create home subvolume
+btrfs subvolume create ${MOUNTPOINT}/home
+
+# Set slash as default
+btrfs subvolume set-default $(btrfs subvolume list ${MOUNTPOINT} | grep slash | perl -pne 's/^ID\s([0-9]+)\s.*$/\1/') ${MOUNTPOINT}
+
+# Unmount slash filesystem
+umount ${MOUNTPOINT}
diff --git a/lib/root.sh b/lib/root.sh
index 6f6af1e..8efdc47 100644
--- a/lib/root.sh
+++ b/lib/root.sh
@@ -4,7 +4,7 @@
 mkdir -p ${MOUNTPOINT}
 
 # Mount slash filesystem
-mount /dev/mapper/${SLASHNAME} ${MOUNTPOINT}
+mount /dev/mapper/${DATANAME} ${MOUNTPOINT}
 
 # Make boot in mount point
 mkdir -p ${MOUNTPOINT}/boot
@@ -12,3 +12,8 @@ mkdir -p ${MOUNTPOINT}/boot
 # Mount boot filesystem
 mount /dev/md/${MDBOOT} ${MOUNTPOINT}/boot
 
+# Make home in mount point
+mkdir -p ${MOUNTPOINT}/home
+
+# Mount home filesystem
+mount -o subvol=/home /dev/mapper/${DATANAME} ${MOUNTPOINT}/home
-- 
2.41.3