From 40099a142e0a800b3b0e4c33cbb706d85c2198a9 Mon Sep 17 00:00:00 2001 From: Apaczer <94932128+Apaczer@users.noreply.github.com> Date: Mon, 7 Aug 2023 22:36:14 +0200 Subject: [PATCH] [FIRSTBOOT/MAIN] refactor fatresize `-s max` / LOGs *) FIRSTBOOT: - calculate manually "size=max" of MAIN partition (workaround for know bug in libparted ``max_size`` class) - add debug: write LOG to /mnt/log_firstboot.txt - ditch "/boot/resize" file method *)MAIN - add debug: write LOGS to /mnt/log.txt - cleanup & use tabs for indendent - use ${HOME} variable often *) GENIMAGE - rm "resize" file (no use) --- board/miyoo/boot/firstboot | 53 ++++++++---- board/miyoo/boot/resize | 0 board/miyoo/genimage-sdcard.cfg | 1 - board/miyoo/rootfs/etc/main | 139 ++++++++++++++++---------------- 4 files changed, 105 insertions(+), 88 deletions(-) delete mode 100644 board/miyoo/boot/resize diff --git a/board/miyoo/boot/firstboot b/board/miyoo/boot/firstboot index 219bd266..2ccca03f 100755 --- a/board/miyoo/boot/firstboot +++ b/board/miyoo/boot/firstboot @@ -2,8 +2,8 @@ MOUNTDIR=/boot # expect to be run from /boot, where the boot partition is mounted (readonly) - -LOG=/dev/null +export LOG=$(mktemp) +#LOG=/dev/null # high brightness echo '10' > /sys/devices/platform/backlight/backlight/backlight/brightness @@ -56,7 +56,7 @@ console_var_func(){ # write logs, sync & unmount MAIN then reboot/poweroff safe_reboot_func(){ echo "please wait a few seconds for a reboot...." | tee -a ${LOG} - dmesg > /mnt/dmesg.txt + dmesg > ${HOME}/dmesg.txt sync sleep 1 mount -o remount,ro "${MOUNTDIR}" | tee -a ${LOG} @@ -68,7 +68,7 @@ safe_reboot_func(){ safe_poweroff_func(){ echo "please wait a few seconds for a shutdown...." | tee -a ${LOG} - dmesg > /mnt/dmesg.txt + dmesg > ${HOME}/dmesg.txt sync sleep 1 mount -o remount,ro "${MOUNTDIR}" | tee -a ${LOG} @@ -222,7 +222,7 @@ if ! $FOUND_CONSOLE && ! $FOUND_CONSOLE_AUTO && $CONSOLE_DETECTED; then ## thus correct "invert" colors parameter on video driver else #TODO - make "invert" flag overwriting less dependent - echo "INVERT=0" >> /mnt/options.cfg + echo "INVERT=0" >> ${HOME}/options.cfg safe_reboot_func fi # look in II Test block for following DETECTED versions as these imply devices_auto_ID variants: @@ -470,20 +470,40 @@ fi mount -o remount,ro "${MOUNTDIR}" | tee -a ${LOG} RESIZE_COMMENCED=false +#grep all partitions current size +SD_SIZE=$(cat "/sys/block/mmcblk0/size") +P1_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p1/size") +P2_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p2/size") +P3_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p3/size") +P4_SIZE=$(cat "/sys/block/mmcblk0/mmcblk0p4/size") +SD_SIZE_IN_MiB=$((SD_SIZE * 512 / 1024 / 1024)) +BOOT_SIZE=$(((1016+1) * 1024 / 512)) #bootloader partition=1016K (see `genimage` script in buildroot) +## boot_size calculated to 512 byte sector size blocks, adding +1K as a safety measure for roundups (at fatresize we use KibiBits) + +#Calculate unallocated left space to expand MAIN: +SD_MAX_UNALL_SIZE="$((${SD_SIZE} - (${P1_SIZE} + ${P2_SIZE} + ${P3_SIZE} + ${P4_SIZE}) - $BOOT_SIZE))" +SD_MAX_UNALL_SIZE_IN_MB=$((SD_MAX_UNALL_SIZE * 512 / 1024 / 1000)) +SD_MAX_UNALL_SIZE_IN_GB=$((SD_MAX_UNALL_SIZE * 512 / 1024 / 1000 / 1000)) +#Calculate available space for 4'th partition (MAIN): +SD_MAX_AVAIL_SIZE="$((${SD_SIZE} - (${P1_SIZE} + ${P2_SIZE} + ${P3_SIZE}) - $BOOT_SIZE))" +SD_MAX_AVAIL_SIZE_IN_KiB=$((SD_MAX_AVAIL_SIZE * 512 / 1024)) + # resize the main partition if requested -if ((test -e "${MOUNTDIR}/resize") && (dialog --clear --stdout --ok-label YES --cancel-label NO --title " AUTO-RESIZE" \ +if (dialog --clear --stdout --ok-label YES --cancel-label NO --title " AUTO-RESIZE" \ --colors --pause "\n\n \ZuExpand MAIN partition?\Zn\n\n Select an option & press START - \n\n \ZbWARNING:\Zn\n After 10s auto-resize\n of FAT32 partition will begin." 15 60 10)); then + \n\n \ZbWARNING:\Zn\n After 10s auto-resize\n of FAT32 partition will begin." 15 60 10); then clear + echo "The full size of your SD is ${SD_SIZE_IN_MiB}MiB large" | tee -a ${LOG} + echo "Unallocated space available for resizing equals ${SD_MAX_UNALL_SIZE_IN_GB}GB" | tee -a ${LOG} echo "Going to resize the MAIN partition." | tee -a ${LOG} echo "This can take A LONG TIME, so be patient." | tee -a ${LOG} umount /dev/mmcblk0p4 | tee -a ${LOG} fsck.fat -y /dev/mmcblk0p4 | tee -a ${LOG} - fatresize -s max -v -p /dev/mmcblk0p4 -n 4 + fatresize --size="${SD_MAX_AVAIL_SIZE_IN_KiB}"ki -v -p /dev/mmcblk0p4 -n4 | tee -a ${LOG} fsck.fat -y /dev/mmcblk0p4 | tee -a ${LOG} echo -n -e \\xEB\\x58\\x90 > /dev/mmcblk0p4 sync - mount -t vfat -o rw,sync,utf8 /dev/mmcblk0p4 /mnt | tee -a ${LOG} + mount -t vfat -o rw,sync,utf8 /dev/mmcblk0p4 ${HOME} | tee -a ${LOG} RESIZE_COMMENCED=true fi @@ -494,16 +514,13 @@ rm $TEMP mount -o remount,rw "${MOUNTDIR}" | tee -a ${LOG} echo "Disabling the firstboot script." | tee -a ${LOG} mv "${MOUNTDIR}/firstboot" "${MOUNTDIR}/firstboot.done" | tee -a ${LOG} -if test -e "${MOUNTDIR}/resize"; then - rm "${MOUNTDIR}/resize" -fi # copy over the config files echo "Copying default configuration files into place..." | tee -a ${LOG} if $BITTBOY_CONFIG; then - cp "/mnt/gmenu2x/input_bittboy.conf" "${MOUNTDIR}/configs/input.conf" + cp "${HOME}/gmenu2x/input_bittboy.conf" "${MOUNTDIR}/configs/input.conf" elif $MIYOO_CONFIG; then - cp "/mnt/gmenu2x/input_miyoo.conf" "${MOUNTDIR}/configs/input.conf" + cp "${HOME}/gmenu2x/input_miyoo.conf" "${MOUNTDIR}/configs/input.conf" fi mount -o remount,ro "${MOUNTDIR}" | tee -a ${LOG} if test -r "${BASEDIR}/configs/manifest"; then @@ -517,8 +534,8 @@ if test -r "${BASEDIR}/configs/manifest"; then if test "${TO}" == ""; then TO="$1" fi - echo "Copying $1 to /mnt/$TO..." | tee -a ${LOG} - cp -f "${BASEDIR}/configs/$1" "/mnt/$TO" | tee -a ${LOG} + echo "Copying $1 to ${HOME}/$TO..." | tee -a ${LOG} + cp -f "${BASEDIR}/configs/$1" "${HOME}/$TO" | tee -a ${LOG} fi fi done @@ -527,11 +544,13 @@ echo sync echo "firstboot script finished." | tee -a ${LOG} - +#grep logs from temp directory +mv ${LOG} ${HOME}/log_firstboot.txt echo # Reboot device if CONSOLE_VARIANT was overwritten from $CHOICE so that it could be applied in u-boot by readID ## or resizing FAT partition has completed / found firstboot custom script if ($CONSOLE_OVERWRITE || $RESIZE_COMMENCED || test -r "${BASEDIR}/firstboot.custom.sh"); then + touch ${HOME}/firstboot.completed safe_reboot_func fi diff --git a/board/miyoo/boot/resize b/board/miyoo/boot/resize deleted file mode 100644 index e69de29b..00000000 diff --git a/board/miyoo/genimage-sdcard.cfg b/board/miyoo/genimage-sdcard.cfg index 84a32f0a..6e5ea100 100644 --- a/board/miyoo/genimage-sdcard.cfg +++ b/board/miyoo/genimage-sdcard.cfg @@ -12,7 +12,6 @@ image bootfs.vfat { "boot/firstboot.custom.sh-OFF", "boot/modules.custom.sh", "boot/normalboot.custom.sh", - "boot/resize" } file configs/manifest { image = "boot/configs/manifest" diff --git a/board/miyoo/rootfs/etc/main b/board/miyoo/rootfs/etc/main index 68a97950..e6b07954 100755 --- a/board/miyoo/rootfs/etc/main +++ b/board/miyoo/rootfs/etc/main @@ -7,20 +7,20 @@ START="${HOME}/autoexec.sh" BOOTDIR=/boot # we expect /dev/mmcblk0p1 has been mounted here read only, from inittab LOGS=/dev/null -#LOGS=/mnt/log.txt -# can use /mnt/log.txt here, but note that this prevents clean shutdowns - so only use this for debugging -export LOGS # so that subshells can use this as well # check if it's first boot and turn on messages if yes -if test -r "${BOOTDIR}/firstboot"; then - DEBUG_MSG="yes" +if ((test -r "${BOOTDIR}/firstboot") || (test -r "${HOME}/firstboot.completed")); then + DEBUG_MSG="yes" + LOGS=$(mktemp) fi +export LOGS # so that subshells can use this as well + if test "x${DEBUG_MSG}" == "xyes"; then - echo -e "\e[0m" # normal foreground color - export DEBUG_MSG # set it globally for further programs + echo -e "\e[0m" # normal foreground color + export DEBUG_MSG # set it globally for further programs else - echo -e "\e[30m" # black foreground color + echo -e "\e[30m" # black foreground color fi # load kernel modules @@ -30,69 +30,68 @@ mount -t configfs none /sys/kernel/config >> "${LOGS}" 2>&1 gadget-ms /dev/mmcblk0p1 /dev/mmcblk0p4 >> "${LOGS}" 2>&1 -# just load the expected ones (screen driver) from here -# do it directly and not rely on modprobe trying to find them -# automatically in rootfs/lib/modules/VERSION -# (also because with custom kernels the VERSION will be different. -# - # the uEnv.txt is autogenerated by u-boot from HW which outputs - # environmental variables needed for ID of screen type - video=`cat ${BOOTDIR}/uEnv.txt |grep -a "CONSOLE_VIDEO" | cut -d "=" -f 2 | cut -d "." -f 1` - params=`cat ${BOOTDIR}/uEnv.txt |grep -a "CONSOLE_PARAMETERS" | cut -d "=" -f 2-` +# Load the expected one screen driver from here with modprobe +## automatically from rootfs/lib/modules/VERSION +# The uEnv.txt is autogenerated by u-boot from HW which outputs +## environmental variables needed for ID of screen type +video=`cat ${BOOTDIR}/uEnv.txt |grep -a "CONSOLE_VIDEO" | cut -d "=" -f 2 | cut -d "." -f 1` +params=`cat ${BOOTDIR}/uEnv.txt |grep -a "CONSOLE_PARAMETERS" | cut -d "=" -f 2-` - # TVout scripting backend - tvout=`cat ${HOME}/tvout` - if ((test -r "${HOME}/tvout")); then - echo 0 > /sys/class/backlight/backlight/brightness - echo 0 > /sys/class/vtconsole/vtcon1/bind - cp /mnt/.backlight.conf /mnt/.backlight.bak - echo 0 > ${HOME}/.backlight.conf - modprobe -r $video - #TVMODE options.cfg setting - export tvmode=$(grep -o TVMODE=[0-1] "${HOME}/options.cfg" | tr '[:upper:]' '[:lower:]') - modprobe miyoo-tvout $tvmode - echo 1 > /sys/class/vtconsole/vtcon1/bind - modprobe -r $video - else - if ((test -r "${HOME}/.backlight.bak")); then - mv ${HOME}/.backlight.bak ${HOME}/.backlight.conf - fi - # MODULES_CUSTOM scripting - if (!(test -r "${BOOTDIR}/modules.custom.sh") || !(grep -q MODULES_CUSTOM\=\1 "${HOME}/options.cfg")); then - # Load video module read from uEnv.txt & defined by variant in console.cfg - #FLIP & INVERT options.cfg setting - export flip=$(grep -o FLIP=[0-1] "${HOME}/options.cfg" | tr '[:upper:]' '[:lower:]') - export invert=$(grep -o INVERT=[0-1] "${HOME}/options.cfg" | tr '[:upper:]' '[:lower:]') - modprobe $video $params $flip $invert - else - (cd "${BOOTDIR}" && sh modules.custom.sh ) >> "${LOGS}" 2>&1 - fi - fi +# TVout scripting backend +tvout=`cat ${HOME}/tvout` +if ((test -r "${HOME}/tvout")); then + echo 0 > /sys/class/backlight/backlight/brightness + echo 0 > /sys/class/vtconsole/vtcon1/bind + cp ${HOME}/.backlight.conf ${HOME}/.backlight.bak + echo 0 > ${HOME}/.backlight.conf + modprobe -r $video + #TVMODE options.cfg setting + export tvmode=$(grep -o TVMODE=[0-1] "${HOME}/options.cfg" | tr '[:upper:]' '[:lower:]') + modprobe miyoo-tvout $tvmode + echo 1 > /sys/class/vtconsole/vtcon1/bind + modprobe -r $video +else + if ((test -r "${HOME}/.backlight.bak")); then + mv ${HOME}/.backlight.bak ${HOME}/.backlight.conf + fi + # MODULES_CUSTOM scripting + if (!(test -r "${BOOTDIR}/modules.custom.sh") || !(grep -q MODULES_CUSTOM\=\1 "${HOME}/options.cfg")); then + # Load video module read from uEnv.txt & defined by variant in console.cfg + #FLIP & INVERT options.cfg setting + export flip=$(grep -o FLIP=[0-1] "${HOME}/options.cfg" | tr '[:upper:]' '[:lower:]') + export invert=$(grep -o INVERT=[0-1] "${HOME}/options.cfg" | tr '[:upper:]' '[:lower:]') + modprobe $video $params $flip $invert + else + (cd "${BOOTDIR}" && sh modules.custom.sh ) >> "${LOGS}" 2>&1 + fi +fi # check if it's first boot and defer to the firstboot script if yes if test -r "${BOOTDIR}/firstboot"; then - exec sh "${BOOTDIR}/firstboot" + exec sh "${BOOTDIR}/firstboot" +elif test -r "${HOME}/firstboot.completed"; then + rm "${HOME}/firstboot.completed" fi if !(grep -q FAT_CHECK\=\0 "${HOME}/options.cfg"); then ##Check if fat32 is flagged as "dirty", and if so unmount, repair, remount -if dmesg | grep "mmcblk0p4" > /dev/null; then -echo -e "\e[31mUnclean shutdown detected.\e[0m" -echo -e "\e[32mChecking FAT32 partition...\e[0m" -umount /dev/mmcblk0p4 -fsck.vfat -y /dev/mmcblk0p4 > /dev/null; -mount /dev/mmcblk0p4 "${HOME}" -t vfat -o rw,sync,utf8 -echo -e "\e[32mCheck complete.\e[0m" -fi + if dmesg | grep "mmcblk0p4" > /dev/null; then + echo -e "\e[31mUnclean shutdown detected.\e[0m" + echo -e "\e[32mChecking FAT32 partition...\e[0m" + umount /dev/mmcblk0p4 + fsck.vfat -y /dev/mmcblk0p4 > /dev/null; + mount /dev/mmcblk0p4 "${HOME}" -t vfat -o rw,sync,utf8 + echo -e "\e[32mCheck complete.\e[0m" + fi fi clear # try to read what handheld we're on if test -r "${BOOTDIR}/console.cfg"; then - source "${BOOTDIR}/console.cfg" + source "${BOOTDIR}/console.cfg" else - export CONSOLE_VARIANT="unknown" + export CONSOLE_VARIANT="unknown" fi echo "Boot!" >> "${LOGS}" @@ -100,15 +99,15 @@ echo "Handheld type is ${CONSOLE_VARIANT}" >> "${LOGS}" # run any custom commands ('daemon' expected to be run from there) if test -r "${BOOTDIR}/normalboot.custom.sh" ; then - (cd "${BOOTDIR}" && sh normalboot.custom.sh) # don't redirect, want output on screen + (cd "${BOOTDIR}" && sh normalboot.custom.sh) # don't redirect, want output on screen else - # at least run 'daemon' - daemon >> "${LOGS}" 2>&1 + # at least run 'daemon' + daemon >> "${LOGS}" 2>&1 fi # run boot logo animation if (!(grep -q BOOT_LOGO\=\0 "${HOME}/options.cfg")); then - ${BOOTLOGO} >> "${LOGS}" 2>&1 + ${BOOTLOGO} >> "${LOGS}" 2>&1 fi # can't unmount boot because 'daemon' runs from it - but it's mounted read-only @@ -117,18 +116,18 @@ fi # Writes dmesg after firstboot procedure or if DEBUG_MSG=yes if test "x${DEBUG_MSG}" == "xyes"; then - sleep 1 - dmesg > /mnt/dmesg.txt + sleep 1 + dmesg > ${HOME}/dmesg.txt + mv ${LOGS} ${HOME}/log.txt fi while [ 1 ] do - if test -f "${START}"; then - source "${START}" - else - - cd "${HOME}"/gmenu2x; - ./gmenu2x >> "${LOGS}" 2>&1; - fi - clear + if test -f "${START}"; then + source "${START}" + else + cd "${HOME}"/gmenu2x; + ./gmenu2x >> /dev/null 2>&1; + fi + clear done