From a24546794d1cecac2b929ce6493f4bda3fbb8a16 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 24 Aug 2014 13:29:18 +0200 Subject: [PATCH] Update auto-resize code to work with any partition number --- config/rootfiles/common/armv5tel/initscripts | 2 + config/rootfiles/common/i586/initscripts | 2 + lfs/flash-images | 8 +-- lfs/initscripts | 2 + src/initscripts/init.d/fsresize | 28 +++++---- src/initscripts/init.d/partresize | 64 +++++++++++--------- 6 files changed, 60 insertions(+), 46 deletions(-) diff --git a/config/rootfiles/common/armv5tel/initscripts b/config/rootfiles/common/armv5tel/initscripts index 5e40079a9f..7a4e41b7da 100644 --- a/config/rootfiles/common/armv5tel/initscripts +++ b/config/rootfiles/common/armv5tel/initscripts @@ -213,8 +213,10 @@ etc/rc.d/rcsysinit.d/S05modules etc/rc.d/rcsysinit.d/S10udev etc/rc.d/rcsysinit.d/S19waitdrives etc/rc.d/rcsysinit.d/S20swap +etc/rc.d/rcsysinit.d/S25partresize etc/rc.d/rcsysinit.d/S30checkfs etc/rc.d/rcsysinit.d/S40mountfs +etc/rc.d/rcsysinit.d/S42fsresize etc/rc.d/rcsysinit.d/S45udev_retry etc/rc.d/rcsysinit.d/S50cleanfs etc/rc.d/rcsysinit.d/S60setclock diff --git a/config/rootfiles/common/i586/initscripts b/config/rootfiles/common/i586/initscripts index 6704251d5a..529bcc9c0a 100644 --- a/config/rootfiles/common/i586/initscripts +++ b/config/rootfiles/common/i586/initscripts @@ -220,8 +220,10 @@ etc/rc.d/rcsysinit.d/S10udev etc/rc.d/rcsysinit.d/S19checkfstab etc/rc.d/rcsysinit.d/S19waitdrives etc/rc.d/rcsysinit.d/S20swap +etc/rc.d/rcsysinit.d/S25partresize etc/rc.d/rcsysinit.d/S30checkfs etc/rc.d/rcsysinit.d/S40mountfs +etc/rc.d/rcsysinit.d/S42fsresize etc/rc.d/rcsysinit.d/S45udev_retry etc/rc.d/rcsysinit.d/S50cleanfs etc/rc.d/rcsysinit.d/S60setclock diff --git a/lfs/flash-images b/lfs/flash-images index 69b6b44ebd..7baec7c2ee 100644 --- a/lfs/flash-images +++ b/lfs/flash-images @@ -162,11 +162,6 @@ endif printf "$(FSTAB_FMT)" "$$(blkid -o value -s UUID $(PART_ROOT))" "/" \ "auto" "defaults" 1 1 >> $(MNThdd)/etc/fstab - # Setup symlink for partresize at first boot... - ln -sf ../init.d/partresize $(MNThdd)/etc/rc.d/rcsysinit.d/S25partresize - # Setup symlink for fsresize at second boot... - ln -sf ../init.d/fsresize $(MNThdd)/etc/rc.d/rcsysinit.d/S42fsresize - ifeq "$(BOOTLOADER)" "grub" ifeq "$(SCON)" "1" # Enable serial console on GRUB @@ -189,6 +184,9 @@ endif --root-directory=$(MNThdd) $(DEVICE) endif + # Automatically resize the root partition to its maximum size at first boot + touch $(MNThdd)/.partresize + # Unmount umount $(MNThdd)/proc umount $(MNThdd)/sys diff --git a/lfs/initscripts b/lfs/initscripts index 4acf65e13e..c5fe54f824 100644 --- a/lfs/initscripts +++ b/lfs/initscripts @@ -162,8 +162,10 @@ $(TARGET) : ln -sf ../init.d/udev /etc/rc.d/rcsysinit.d/S10udev ln -sf ../init.d/waitdrives /etc/rc.d/rcsysinit.d/S19waitdrives ln -sf ../init.d/swap /etc/rc.d/rcsysinit.d/S20swap + ln -sf ../init.d/partresize /etc/rc.d/rcsysinit.d/S25partresize ln -sf ../init.d/checkfs /etc/rc.d/rcsysinit.d/S30checkfs ln -sf ../init.d/mountfs /etc/rc.d/rcsysinit.d/S40mountfs + ln -sf ../init.d/fsresize /etc/rc.d/rcsysinit.d/S42fsresize ln -sf ../init.d/udev_retry /etc/rc.d/rcsysinit.d/S45udev_retry ln -sf ../init.d/cleanfs /etc/rc.d/rcsysinit.d/S50cleanfs ln -sf ../init.d/setclock /etc/rc.d/rcsysinit.d/S60setclock diff --git a/src/initscripts/init.d/fsresize b/src/initscripts/init.d/fsresize index 3dbd1addd5..325c731af8 100644 --- a/src/initscripts/init.d/fsresize +++ b/src/initscripts/init.d/fsresize @@ -17,22 +17,24 @@ case "${1}" in start) - boot_mesg "Background Autoresize root partition to use the whole drive" - # Detect device - ROOT=`mount | grep -m1 " / " | cut -d" " -f1`; - DRV=${ROOT::`expr length $ROOT`-1} + if [ -e "/.resizefs" ]; then + boot_mesg "Re-sizing root partition..." - boot_mesg "resize ${DRV}3 ..." - nice -n 19 $0 background ${DRV}3 > /dev/null & - ;; - background) - resize2fs -p $2 + # Find root device + while read -r dev mountpoint fs options; do + # Skip generic entries + [ "${dev}" = "rootfs" ] && continue - # Erase symlink, it should run only once - rm -f /etc/rc.d/rcsysinit.d/S42fsresize - sync - exit 0; + if [ "${mountpoint}" = "/" ]; then + # Resize filesystem + resize2fs -p "${dev}" + # Remove marker + rm -f /.resizefs + break + fi + done < /proc/mounts + fi ;; *) diff --git a/src/initscripts/init.d/partresize b/src/initscripts/init.d/partresize index f9b1aa92f0..38c5683166 100644 --- a/src/initscripts/init.d/partresize +++ b/src/initscripts/init.d/partresize @@ -17,40 +17,48 @@ case "${1}" in start) + if [ -e "/.partresize" ]; then + boot_mesg "Mounting root file system in read/write mode ..." + mount -o remount,rw / > /dev/null + evaluate_retval - boot_mesg "Mounting root file system in read/write mode ..." - mount -o remount,rw / > /dev/null - evaluate_retval - - boot_mesg "Create /etc/mtab..." - > /etc/mtab - mount -f / || failed=1 - (exit ${failed}) - evaluate_retval - - # Detect device - ROOT=`mount | grep -m1 " / " | cut -d" " -f1`; - if [ "${ROOT:`expr length $ROOT`-2:1}" == "p" ]; then - DRV=${ROOT::`expr length $ROOT`-2} - else - DRV=${ROOT::`expr length $ROOT`-1} - fi + # Detect device + while read -r dev mountpoint fs options; do + [ "${dev}" = "rootfs" ] && continue + + if [ "${mountpoint}" = "/" ]; then + # Find root partition number + part_num="${dev: -1}" - boot_mesg "Change Partition ${DRV}3 to all free space ..." - echo -e ',+' | sfdisk --no-reread -f -N3 ${DRV} 2>/dev/null + # Find path to the root device + root_dev="${dev::-1}" + if [ ! -b "${dev::-1}" -a "${root_dev: -1}" = "p" ]; then + root_dev="${dev::-2}" + fi - boot_mesg "Update c,h,s values of ${DRV}1 ..." - echo -e ',' | sfdisk --no-reread -f -N1 ${DRV} &> /dev/null + boot_mesg "Growing root partition to maximum size..." + echo -e ',+' | sfdisk --no-reread -f -N${part_num} "${root_dev}" 2>/dev/null - # Erase symlink, it should run only once - rm -f /etc/rc.d/rcsysinit.d/S25partresize + # Update c,h,s values of the boot partition... + if [ ${part_num} -ne 1 -a -b "${root_dev}1" ]; then + echo -e ',' | sfdisk --no-reread -f -N1 ${DRV} &> /dev/null + fi - boot_mesg "Rebooting ..." - sync - mount -o remount,ro / &> /dev/null - sleep 15 - reboot -f + # The filesystem should be resized after + # this operation + touch /.resizefs + # Remove marker + rm -f /.partresize + + # Reboot + boot_mesg "Rebooting system..." + mount -o remount,ro / &>/dev/null + sleep 15 + reboot -f + fi + done < /proc/mounts + fi ;; *) echo "Usage: ${0} {start}" -- 2.39.2