From 0017b4ec4a75374d1e5a2eb19a6382856c410d24 Mon Sep 17 00:00:00 2001 From: Jeffrey Paul Date: Fri, 4 Oct 2019 09:02:55 -0700 Subject: [PATCH] latest --- ...-install-to-boot.sh => install-to-boot.sh} | 0 fix-raspian-defaults/rc.local.txt | 10 + .../boot/per-once.d/00-resize2fs.sh | 3 + .../{00-fixlocale.sh => 05-fixlocale.sh} | 0 .../per-once.d/{00-bash.sh => 10-bash.sh} | 0 .../{05-packages.sh => 50-packages.sh} | 0 ...und.sh => 70-install-command-not-found.sh} | 0 .../usr/lib/raspi-config/init_resize.sh | 200 ++++++++++++++++++ 8 files changed, 213 insertions(+) rename fix-raspian-defaults/{01-install-to-boot.sh => install-to-boot.sh} (100%) create mode 100644 fix-raspian-defaults/root.overlay/boot/per-once.d/00-resize2fs.sh rename fix-raspian-defaults/root.overlay/boot/per-once.d/{00-fixlocale.sh => 05-fixlocale.sh} (100%) rename fix-raspian-defaults/root.overlay/boot/per-once.d/{00-bash.sh => 10-bash.sh} (100%) rename fix-raspian-defaults/root.overlay/boot/per-once.d/{05-packages.sh => 50-packages.sh} (100%) rename fix-raspian-defaults/root.overlay/boot/per-once.d/{10-install-command-not-found.sh => 70-install-command-not-found.sh} (100%) create mode 100755 fix-raspian-defaults/root.overlay/usr/lib/raspi-config/init_resize.sh diff --git a/fix-raspian-defaults/01-install-to-boot.sh b/fix-raspian-defaults/install-to-boot.sh similarity index 100% rename from fix-raspian-defaults/01-install-to-boot.sh rename to fix-raspian-defaults/install-to-boot.sh diff --git a/fix-raspian-defaults/rc.local.txt b/fix-raspian-defaults/rc.local.txt index 35dac77..4a5911c 100644 --- a/fix-raspian-defaults/rc.local.txt +++ b/fix-raspian-defaults/rc.local.txt @@ -8,6 +8,16 @@ else /etc/systemd/system/multi-user.target.wants/raspberrypi-initial-setup.service # we only need to run once rm -rf /boot/rc.local.txt /boot/root.overlay + + # after the above rsync has replaced the init_resize.sh with our + # more sane version (it only doubles the size of the root, not + # consuming the entire sd card), set the kernel command line to use the + # init resizer on the next boot (like raspbian normally does) + + # this will only run this once, as we have already deleted ourselves in + # the previous command. + sed -i 's|$| init=/usr/lib/raspi-config/init_resize.sh|' /boot/cmdline.txt + fi reboot diff --git a/fix-raspian-defaults/root.overlay/boot/per-once.d/00-resize2fs.sh b/fix-raspian-defaults/root.overlay/boot/per-once.d/00-resize2fs.sh new file mode 100644 index 0000000..7601f2f --- /dev/null +++ b/fix-raspian-defaults/root.overlay/boot/per-once.d/00-resize2fs.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +resize2fs /dev/mmcblk0p2 diff --git a/fix-raspian-defaults/root.overlay/boot/per-once.d/00-fixlocale.sh b/fix-raspian-defaults/root.overlay/boot/per-once.d/05-fixlocale.sh similarity index 100% rename from fix-raspian-defaults/root.overlay/boot/per-once.d/00-fixlocale.sh rename to fix-raspian-defaults/root.overlay/boot/per-once.d/05-fixlocale.sh diff --git a/fix-raspian-defaults/root.overlay/boot/per-once.d/00-bash.sh b/fix-raspian-defaults/root.overlay/boot/per-once.d/10-bash.sh similarity index 100% rename from fix-raspian-defaults/root.overlay/boot/per-once.d/00-bash.sh rename to fix-raspian-defaults/root.overlay/boot/per-once.d/10-bash.sh diff --git a/fix-raspian-defaults/root.overlay/boot/per-once.d/05-packages.sh b/fix-raspian-defaults/root.overlay/boot/per-once.d/50-packages.sh similarity index 100% rename from fix-raspian-defaults/root.overlay/boot/per-once.d/05-packages.sh rename to fix-raspian-defaults/root.overlay/boot/per-once.d/50-packages.sh diff --git a/fix-raspian-defaults/root.overlay/boot/per-once.d/10-install-command-not-found.sh b/fix-raspian-defaults/root.overlay/boot/per-once.d/70-install-command-not-found.sh similarity index 100% rename from fix-raspian-defaults/root.overlay/boot/per-once.d/10-install-command-not-found.sh rename to fix-raspian-defaults/root.overlay/boot/per-once.d/70-install-command-not-found.sh diff --git a/fix-raspian-defaults/root.overlay/usr/lib/raspi-config/init_resize.sh b/fix-raspian-defaults/root.overlay/usr/lib/raspi-config/init_resize.sh new file mode 100755 index 0000000..3603b5f --- /dev/null +++ b/fix-raspian-defaults/root.overlay/usr/lib/raspi-config/init_resize.sh @@ -0,0 +1,200 @@ +#!/bin/sh + +reboot_pi () { + umount /boot + mount / -o remount,ro + sync + if [ "$NOOBS" = "1" ]; then + if [ "$NEW_KERNEL" = "1" ]; then + reboot -f "$BOOT_PART_NUM" + else + echo "$BOOT_PART_NUM" > "/sys/module/${BCM_MODULE}/parameters/reboot_part" + fi + fi + 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 findmnt partprobe; do + if ! command -v $COMMAND > /dev/null; then + FAIL_REASON="$COMMAND not found" + return 1 + fi + done + return 0 +} + +check_noobs () { + if [ "$BOOT_PART_NUM" = "1" ]; then + NOOBS=0 + else + NOOBS=1 + fi +} + +get_variables () { + ROOT_PART_DEV=$(findmnt / -o source -n) + 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=$(findmnt /boot -o source -n) + 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") + + OLD_DISKID=$(fdisk -l "$ROOT_DEV" | sed -n 's/Disk identifier: 0x\([^ ]*\)/\1/p') + + check_noobs + + ROOT_DEV_SIZE=$(cat "/sys/block/${ROOT_DEV_NAME}/size") + + 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) + + + ROOT_PART_CUR_SIZE=$((ROOT_PART_END - $ROOT_PART_START)) + ROOT_PART_WANT_SIZE=$((ROOT_PART_CUR_SIZE * 4)) + TARGET_END=$((ROOT_PART_START + $ROOT_PART_WANT_SIZE)) + + 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 +} + +fix_partuuid() { + DISKID="$(fdisk -l "$ROOT_DEV" | sed -n 's/Disk identifier: 0x\([^ ]*\)/\1/p')" + + sed -i "s/${OLD_DISKID}/${DISKID}/g" /etc/fstab + sed -i "s/${OLD_DISKID}/${DISKID}/" /boot/cmdline.txt +} + +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 [ "$BOOT_DEV_NAME" != "$ROOT_DEV_NAME" ]; then + FAIL_REASON="Boot and root partitions are on different devices" + return 1 + 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 +} + +check_kernel () { + local MAJOR=$(uname -r | cut -f1 -d.) + local MINOR=$(uname -r | cut -f2 -d.) + if [ "$MAJOR" -eq "4" ] && [ "$MINOR" -lt "9" ]; then + return 0 + fi + if [ "$MAJOR" -lt "4" ]; then + return 0 + fi + NEW_KERNEL=1 +} + +main () { + get_variables + + if ! check_variables; then + return 1 + fi + + check_kernel + + if [ "$NOOBS" = "1" ] && [ "$NEW_KERNEL" != "1" ]; then + BCM_MODULE=$(grep -e "^Hardware" /proc/cpuinfo | 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 + 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 + + partprobe "$ROOT_DEV" + fix_partuuid + + return 0 +} + +mount -t proc proc /proc +mount -t sysfs sys /sys +mount -t tmpfs tmp /run +mkdir -p /run/systemd + +mount /boot +mount / -o remount,rw + +sed -i 's| init=/usr/lib/raspi-config/init_resize\.sh||' /boot/cmdline.txt +sed -i 's| sdhci\.debug_quirks2=4||' /boot/cmdline.txt + +if ! grep -q splash /boot/cmdline.txt; then + sed -i "s/ quiet//g" /boot/cmdline.txt +fi +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