From 0c0090fffe7932cbc02b235cf0f981854cc14682 Mon Sep 17 00:00:00 2001 From: Serge Schneider Date: Tue, 22 Mar 2016 16:57:39 +0000 Subject: [PATCH] Add first boot resize script --- debian/raspi-config.install | 1 + init_resize.sh | 150 ++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100755 init_resize.sh diff --git a/debian/raspi-config.install b/debian/raspi-config.install index e84e616..b94ecf5 100644 --- a/debian/raspi-config.install +++ b/debian/raspi-config.install @@ -1,2 +1,3 @@ raspi-config /usr/bin autologin@.service /etc/systemd/system +init_resize.sh /usr/lib/raspi-config diff --git a/init_resize.sh b/init_resize.sh new file mode 100755 index 0000000..f7fde34 --- /dev/null +++ b/init_resize.sh @@ -0,0 +1,150 @@ +#!/bin/sh + +reboot_pi () { + umount /boot + sync + echo b > /proc/sysrq-trigger + sleep 5 + exit 0 +} + +check_commands () { + if ! command -v whiptail > /dev/null; then + echo ="whiptail not found" + sleep 5 + return 1 + fi + for COMMAND in grep cut sed parted fdisk; do + if ! command -v $COMMAND > /dev/null; then + FAIL_REASON="$COMMAND not found" + return 1 + fi + done + return 0 +} + +check_noobs () { + if [ "$BOOT_PART_DEV" = "/dev/mmcblk0p1" ]; then + NOOBS=0 + else + NOOBS=1 + fi +} + +get_variables () { + ROOT_PART_DEV=`grep -Eo 'root=[[:graph:]]+' /proc/cmdline | cut -d "=" -f 2-` + ROOT_PART_NAME=`echo $ROOT_PART_DEV | cut -d "/" -f 3` + ROOT_DEV_NAME=`echo /sys/block/*/${ROOT_PART_NAME} | cut -d "/" -f 4` + ROOT_DEV="/dev/${ROOT_DEV_NAME}" + ROOT_PART_NUM=`cat /sys/block/${ROOT_DEV_NAME}/${ROOT_PART_NAME}/partition` + + BOOT_PART_DEV=`cat /proc/mounts | grep " /boot " | cut -d " " -f 1` + BOOT_PART_NAME=`echo $BOOT_PART_DEV | cut -d "/" -f 3` + BOOT_DEV_NAME=`echo /sys/block/*/${BOOT_PART_NAME} | cut -d "/" -f 4` + BOOT_PART_NUM=`cat /sys/block/${BOOT_DEV_NAME}/${BOOT_PART_NAME}/partition` + + check_noobs + + ROOT_DEV_SIZE=`cat /sys/block/${ROOT_DEV_NAME}/size` + TARGET_END=`expr $ROOT_DEV_SIZE - 1` + + PARTITION_TABLE=`parted -m $ROOT_DEV unit s print | tr -d 's'` + + LAST_PART_NUM=`echo "$PARTITION_TABLE" | tail -n 1 | cut -d ":" -f 1` + + ROOT_PART_LINE=`echo "$PARTITION_TABLE" | grep -e "^${ROOT_PART_NUM}:"` + ROOT_PART_START=`echo $ROOT_PART_LINE | cut -d ":" -f 2` + ROOT_PART_END=`echo $ROOT_PART_LINE | cut -d ":" -f 3` + + if [ "$NOOBS" = "1" ]; then + EXT_PART_LINE=`echo "$PARTITION_TABLE" | grep ":::;" | head -n 1` + EXT_PART_NUM=`echo $EXT_PART_LINE | cut -d ":" -f 1` + EXT_PART_START=`echo $EXT_PART_LINE | cut -d ":" -f 2` + EXT_PART_END=`echo $EXT_PART_LINE | cut -d ":" -f 3` + fi +} + +check_variables () { + if [ "$NOOBS" = "1" ]; then + if [ $EXT_PART_NUM -gt 4 ] || \ + [ $EXT_PART_START -gt $ROOT_PART_START ] || \ + [ $EXT_PART_END -lt $ROOT_PART_END ]; then + FAIL_REASON="Unsupported extended partition" + return 1 + fi + fi + + if [ $ROOT_PART_NUM -ne $LAST_PART_NUM ]; then + FAIL_REASON="Root partition should be last partition" + return 1 + fi + + if [ $ROOT_PART_END -gt $TARGET_END ]; then + FAIL_REASON="Root partition runs past the end of device" + return 1 + fi + + if [ ! -b $ROOT_DEV ] || [ ! -b $ROOT_PART_DEV ] || [ ! -b $BOOT_PART_DEV ] ; then + FAIL_REASON="Could not determine partitions" + return 1 + fi +} + +main () { + get_variables + + if ! check_variables; then + return 1 + fi + + if [ "$NOOBS" = "1" ]; then + BCM_MODULE=`cat /proc/cpuinfo | grep -e "^Hardware" | cut -d ":" -f 2 | tr -d " " | tr '[:upper:]' '[:lower:]'` + if ! modprobe $BCM_MODULE; then + FAIL_REASON="Couldn't load BCM module $BCM_MODULE" + return 1 + fi + echo $BOOT_PART_NUM > /sys/module/${BCM_MODULE}/parameters/reboot_part + fi + + if [ $ROOT_PART_END -eq $TARGET_END ]; then + reboot_pi + fi + + if [ "$NOOBS" = "1" ]; then + if ! parted -m $ROOT_DEV u s resizepart $EXT_PART_NUM yes $TARGET_END; then + FAIL_REASON="Extended partition resize failed" + return 1 + fi + fi + +if ! parted -m $ROOT_DEV u s resizepart $ROOT_PART_NUM $TARGET_END; then + FAIL_REASON="Root partition resize failed" + return 1 + fi + + return 0 +} + +mount -t proc proc /proc +mount -t sysfs sys /sys + +mount /boot +sed -i 's/ quiet init=.*$//' /boot/cmdline.txt +mount /boot -o remount,ro +sync + +echo 1 > /proc/sys/kernel/sysrq + +if ! check_commands; then + reboot_pi +fi + +if main; then + whiptail --infobox "Resized root filesystem. Rebooting in 5 seconds..." 20 60 + sleep 5 +else + sleep 5 + whiptail --msgbox "Could not expand filesystem, please try raspi-config or rc_gui.\n${FAIL_REASON}" 20 60 +fi + +reboot_pi