Files
quectel-rgmii-toolkit/ipk-source/sdxpinn-mount-fix/CONTROL/preinst
Cameron Thompson 3d0a760e13 Fix mount-fix issue
2025-01-28 19:49:42 -05:00

144 lines
4.6 KiB
Bash
Executable File

#!/bin/ash
LOG_FILE="/tmp/pre-mount-fixinst.log"
# Initialize log
rm -f "$LOG_FILE" >/dev/null 2>&1
touch "$LOG_FILE"
# Redirect all output (stdout and stderr) to the log file
exec >>"$LOG_FILE" 2>&1
mount_factory() {
# Redirect all output (stdout and stderr) to the log file
exec >>"$LOG_FILE" 2>&1
# Check if /real_rootfs exists
if [ ! -d "/real_rootfs" ]; then
echo "Error: /real_rootfs does not exist. Cannot proceed with stop." >> "$LOG_FILE"
return 1
fi
# Determine firmware version based on mounts
if [ -d "/usrdata" ] && [ -d "/systemrw" ]; then
echo "New firmware scenario detected (with /usrdata and /systemrw)." >> "$LOG_FILE"
stop_handle_new_firmware
else
echo "Old firmware scenario detected (without /usrdata and /systemrw)." >> "$LOG_FILE"
stop_handle_old_firmware
fi
}
stop_handle_new_firmware() {
# Redirect all output (stdout and stderr) to the log file
exec >>"$LOG_FILE" 2>&1
/bin/echo "Stopping and reverting overlay and pivot_root"
service init-overlay-watchdog stop
service init-overlay-watchdog disable
# Unmount /etc/rc.d bind
/bin/umount -lf /etc/rc.d
# Remount the original root filesystem as read-write
/bin/mount -o remount,rw /real_rootfs
# Move the mounted filesystems back to the original locations
/bin/mount --move /sys /real_rootfs/sys
/bin/mount --move /proc /real_rootfs/proc
/bin/mount --move /tmp /real_rootfs/tmp
/bin/mount --move /dev /real_rootfs/dev
/bin/mount --move /firmware /real_rootfs/firmware
/bin/mount --move /usrdata /real_rootfs/usrdata
/bin/mount --move /data /real_rootfs/data
/bin/mount --move /cache /real_rootfs/cache
/bin/mount --move /systemrw /real_rootfs/systemrw
/bin/mount --move /persist /real_rootfs/persist
# Pivot root back to the original root
/sbin/pivot_root /real_rootfs /real_rootfs/rootfs
/bin/echo "Reverted pivot_root"
# Unmount /rootfs overlay
/bin/umount -lf /rootfs >/dev/null 2>&1
service init-overlay-watchdog disable
# Mount layer 2 /etc back
/bin/mount --bind /usrdata/etc /etc
service init-overlay-watchdog disable
# Mount layer 3 /etc back
/bin/mount -t overlay overlay -o lowerdir=/etc,upperdir=/usrdata/overlay-work/etc-upper,workdir=/usrdata/overlay-work/.etc-work /etc
service init-overlay-watchdog disable
df -h
echo -e "\e[31m / is read-write right now. Be careful\e[0m"
echo -e "\e[31m Reboot or run mount -o remount,ro / \e[0m"
}
stop_handle_old_firmware() {
# Redirect all output (stdout and stderr) to the log file
exec >>"$LOG_FILE" 2>&1
/bin/echo "Stopping and reverting overlay and pivot_root"
service init-overlay-watchdog stop
service init-overlay-watchdog disable
# Unmount /etc/rc.d bind
/bin/umount -lf /etc/rc.d
# Remount the original root filesystem as read-write
/bin/mount -o remount,rw /real_rootfs
# Move the mounted filesystems back to the original locations
/bin/mount --move /sys /real_rootfs/sys
/bin/mount --move /proc /real_rootfs/proc
/bin/mount --move /tmp /real_rootfs/tmp
/bin/mount --move /dev /real_rootfs/dev
/bin/mount --move /firmware /real_rootfs/firmware
/bin/mount --move /persist /real_rootfs/persist
/bin/mount --move /cache /real_rootfs/cache
/bin/mount --move /data /real_rootfs/data
# Pivot root back to the original root
/sbin/pivot_root /real_rootfs /real_rootfs/rootfs
/bin/echo "Reverted pivot_root"
# Unmount /rootfs overlay
/bin/umount -lf /rootfs >/dev/null 2>&1
# Mount the location of etc-upper back
mount -t ubifs /dev/ubi0_3 /overlay
# Mount the old overlay filesystem back for etc
/bin/mount -t overlay overlay -o lowerdir=/etc,upperdir=/overlay/etc-upper,workdir=/overlay/.etc-work /etc
echo -e "\e[31m / is read-write right now. Be careful\e[0m"
echo -e "\e[31m Reboot or run mount -o remount,ro / \e[0m"
}
if grep -qs '/real_rootfs' /proc/mounts; then
echo "Upgrade scenario detected."
mount_factory
service mount-fix disable
echo "Filesystem structure returned to Quectel Stock"
echo "Backup exists at /usrdata/rootfs or /data/rootfs"
fi
# Remount original rootfs as read-write
echo "Mounting / as read-write"
mount -o remount,rw /
# Check if /etc is mounted
if grep -qs '/etc' /proc/mounts; then
echo "Unmounting /etc..."
umount -lf /etc
fi
# Check if /usrdata is mounted
if grep -qs '/usrdata' /proc/mounts; then
echo "/usrdata is mounted. Unmounting /etc again to access rootfs /etc..."
umount -lf /etc
fi
echo "Preinst complete...."
echo "View Results here:..."
mount
exit 0