From 874bab35f2490132ac5db5c6bab2415f1bba86af Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Sun, 10 Nov 2024 22:56:51 +0100 Subject: [PATCH 1/9] First steps to move from ext4 to squashfs --- Dockerfile | 73 +++++++++++++---------------------- src/install_openwrt_rootfs.sh | 54 +++++++++++++------------- src/migrate_openwrt_rootfs.sh | 46 +++++++++++----------- src/run_openwrt.sh | 7 +--- 4 files changed, 79 insertions(+), 101 deletions(-) diff --git a/Dockerfile b/Dockerfile index f9c7bec..c646e5c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -79,39 +79,23 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ OPKG_EXTRA_ARGS="" \ && if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ if [ "$OPENWRT_VERSION" = "master" ]; then \ - OPENWRT_ROOTFS_IMG="https://downloads.openwrt.org/snapshots/targets/x86/64/openwrt-x86-64-generic-ext4-rootfs.img.gz"; \ - OPENWRT_KERNEL="https://downloads.openwrt.org/snapshots/targets/x86/64/openwrt-x86-64-generic-kernel.bin"; \ - OPENWRT_ROOTFS_TAR="https://downloads.openwrt.org/snapshots/targets/x86/64/openwrt-x86-64-rootfs.tar.gz"; \ - OPKG_EXTRA_ARGS="--no-check-certificate"; \ + OPENWRT_IMAGE="https://downloads.openwrt.org/snapshots/targets/x86/64/openwrt-x86-64-generic-squashfs-combined.img.gz"; \ elif [ "$OPENWRT_VERSION" = "24.10-SNAPSHOT" ]; then \ wget https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/x86/64/version.buildinfo; \ VERSION_BUILDINFO=`cat version.buildinfo`; \ - OPENWRT_ROOTFS_IMG="https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/x86/64/openwrt-24.10-snapshot-${VERSION_BUILDINFO}-x86-64-generic-ext4-rootfs.img.gz"; \ - OPENWRT_KERNEL="https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/x86/64/openwrt-24.10-snapshot-${VERSION_BUILDINFO}-x86-64-generic-kernel.bin"; \ - OPENWRT_ROOTFS_TAR="https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/x86/64/openwrt-24.10-snapshot-${VERSION_BUILDINFO}-x86-64-rootfs.tar.gz"; \ - OPKG_EXTRA_ARGS="--no-check-certificate"; \ + OPENWRT_IMAGE="https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/x86/64/openwrt-24.10-snapshot-${VERSION_BUILDINFO}-x86-64-generic-squashfs-combined.img.gz"; \ else \ - OPENWRT_ROOTFS_IMG="https://archive.openwrt.org/releases/${OPENWRT_VERSION}/targets/x86/64/openwrt-${OPENWRT_VERSION}-x86-64-generic-ext4-rootfs.img.gz"; \ - OPENWRT_KERNEL="https://archive.openwrt.org/releases/${OPENWRT_VERSION}/targets/x86/64/openwrt-${OPENWRT_VERSION}-x86-64-generic-kernel.bin"; \ - OPENWRT_ROOTFS_TAR="https://archive.openwrt.org/releases/${OPENWRT_VERSION}/targets/x86/64/openwrt-${OPENWRT_VERSION}-x86-64-rootfs.tar.gz"; \ + OPENWRT_IMAGE="https://archive.openwrt.org/releases/${OPENWRT_VERSION}/targets/x86/64/openwrt-${OPENWRT_VERSION}-x86-64-generic-squashfs-combined.img.gz"; \ fi; \ elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ if [ "$OPENWRT_VERSION" = "master" ]; then \ - OPENWRT_ROOTFS_IMG="https://downloads.openwrt.org/snapshots/targets/armsr/armv8/openwrt-armsr-armv8-generic-ext4-rootfs.img.gz"; \ - OPENWRT_KERNEL="https://downloads.openwrt.org/snapshots/targets/armsr/armv8/openwrt-armsr-armv8-generic-kernel.bin"; \ - OPENWRT_ROOTFS_TAR="https://downloads.openwrt.org/snapshots/targets/armsr/armv8/openwrt-armsr-armv8-rootfs.tar.gz"; \ - OPKG_EXTRA_ARGS="--no-check-certificate"; \ + OPENWRT_IMAGE="https://downloads.openwrt.org/snapshots/targets/armsr/armv8/openwrt-armsr-armv8-generic-squashfs-combined.img.gz"; \ elif [ "$OPENWRT_VERSION" = "24.10-SNAPSHOT" ]; then \ wget https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/armsr/armv8/version.buildinfo; \ VERSION_BUILDINFO=`cat version.buildinfo`; \ - OPENWRT_ROOTFS_IMG="https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/armsr/armv8/openwrt-24.10-snapshot-${VERSION_BUILDINFO}-armsr-armv8-generic-ext4-rootfs.img.gz"; \ - OPENWRT_KERNEL="https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/armsr/armv8/openwrt-24.10-snapshot-${VERSION_BUILDINFO}-armsr-armv8-generic-kernel.bin"; \ - OPENWRT_ROOTFS_TAR="https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/armsr/armv8/openwrt-24.10-snapshot-${VERSION_BUILDINFO}-armsr-armv8-rootfs.tar.gz"; \ - OPKG_EXTRA_ARGS="--no-check-certificate"; \ + OPENWRT_IMAGE="https://downloads.openwrt.org/releases/24.10-SNAPSHOT/targets/armsr/armv8/openwrt-24.10-snapshot-${VERSION_BUILDINFO}-armsr-armv8-generic-squashfs-combined.img.gz"; \ else \ - OPENWRT_ROOTFS_IMG="https://archive.openwrt.org/releases/${OPENWRT_VERSION}/targets/armsr/armv8/openwrt-${OPENWRT_VERSION}-armsr-armv8-generic-ext4-rootfs.img.gz"; \ - OPENWRT_KERNEL="https://archive.openwrt.org/releases/${OPENWRT_VERSION}/targets/armsr/armv8/openwrt-${OPENWRT_VERSION}-armsr-armv8-generic-kernel.bin"; \ - OPENWRT_ROOTFS_TAR="https://archive.openwrt.org/releases/${OPENWRT_VERSION}/targets/armsr/armv8/openwrt-${OPENWRT_VERSION}-armsr-armv8-rootfs.tar.gz"; \ + OPENWRT_IMAGE="https://archive.openwrt.org/releases/${OPENWRT_VERSION}/targets/armsr/armv8/openwrt-${OPENWRT_VERSION}-armsr-armv8-generic-squashfs-combined.img.gz"; \ fi; \ else \ echo "Error: CPU architecture $TARGETPLATFORM is not supported"; \ @@ -121,31 +105,28 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ # Get OpenWrt images \ && mkdir /var/vm \ && mkdir /var/vm/packages \ - && echo $OPENWRT_ROOTFS_IMG \ - && wget $OPENWRT_ROOTFS_IMG -O /var/vm/rootfs-${OPENWRT_VERSION}.img.gz \ - && wget "${OPENWRT_KERNEL}" -O /var/vm/kernel.bin \ - && wget "${OPENWRT_ROOTFS_TAR}" -O /tmp/rootfs-${OPENWRT_VERSION}.tar.gz \ + && wget $OPENWRT_IMAGE -O /var/vm/squashfs-combined-${OPENWRT_VERSION}.img.gz \ \ - # Use OpenWrt rootfs to download additional IPKs and put them into the Docker image \ - && mkdir /tmp/openwrt-rootfs \ - && tar -xzf /tmp/rootfs-${OPENWRT_VERSION}.tar.gz -C /tmp/openwrt-rootfs \ - && cp /etc/resolv.conf /tmp/openwrt-rootfs/etc/resolv.conf \ - && chroot /tmp/openwrt-rootfs mkdir -p /var/lock \ - && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} update \ - # Download Luci, qemu guest agent and mDNS support \ - && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install qemu-ga luci luci-ssl umdns --download-only \ - # Download Wi-Fi access point support and Wi-Fi USB devices support \ - && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install hostapd wpa-supplicant kmod-mt7921u --download-only \ - # Download celluar network support \ - && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install modemmanager kmod-usb-net-qmi-wwan luci-proto-modemmanager qmi-utils --download-only \ - # Download basic GPS support \ - && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install kmod-usb-serial usbutils minicom gpsd --download-only \ - # Add Wireguard support \ - && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install wireguard-tools luci-proto-wireguard --download-only \ - # Copy downloaded IPKs into the Docker image \ - && cp /tmp/openwrt-rootfs/*.ipk /var/vm/packages \ - && rm -rf /tmp/openwrt-rootfs \ - && rm /tmp/rootfs-${OPENWRT_VERSION}.tar.gz \ + # # Use OpenWrt rootfs to download additional IPKs and put them into the Docker image \ + # && mkdir /tmp/openwrt-rootfs \ + # && tar -xzf /tmp/rootfs-${OPENWRT_VERSION}.tar.gz -C /tmp/openwrt-rootfs \ + # && cp /etc/resolv.conf /tmp/openwrt-rootfs/etc/resolv.conf \ + # && chroot /tmp/openwrt-rootfs mkdir -p /var/lock \ + # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} update \ + # # Download Luci, qemu guest agent and mDNS support \ + # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install qemu-ga luci luci-ssl umdns --download-only \ + # # Download Wi-Fi access point support and Wi-Fi USB devices support \ + # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install hostapd wpa-supplicant kmod-mt7921u --download-only \ + # # Download celluar network support \ + # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install modemmanager kmod-usb-net-qmi-wwan luci-proto-modemmanager qmi-utils --download-only \ + # # Download basic GPS support \ + # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install kmod-usb-serial usbutils minicom gpsd --download-only \ + # # Add Wireguard support \ + # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install wireguard-tools luci-proto-wireguard --download-only \ + # # Copy downloaded IPKs into the Docker image \ + # && cp /tmp/openwrt-rootfs/*.ipk /var/vm/packages \ + # && rm -rf /tmp/openwrt-rootfs \ + # && rm /tmp/rootfs-${OPENWRT_VERSION}.tar.gz \ && echo "OPENWRT_VERSION=\"${OPENWRT_VERSION}\"" > /var/vm/openwrt_metadata.conf \ && echo "OPENWRT_IMAGE_CREATE_DATETIME=\"`date`\"" >> /var/vm/openwrt_metadata.conf \ && echo "OPENWRT_IMAGE_ID=\"`uuidgen`\"" >> /var/vm/openwrt_metadata.conf \ diff --git a/src/install_openwrt_rootfs.sh b/src/install_openwrt_rootfs.sh index d89effe..fa6da88 100644 --- a/src/install_openwrt_rootfs.sh +++ b/src/install_openwrt_rootfs.sh @@ -6,46 +6,46 @@ trap - ERR . /var/vm/openwrt_metadata.conf . /run/helpers.sh -# Check if rootfs is in volume -FILE=/storage/rootfs-${OPENWRT_IMAGE_ID}.img +# Check if squashfs-combined is in volume +FILE=/storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img if [ -f "$FILE" ]; then info "$FILE exists. Nothing to do." else - info "$FILE does not exist. Copying rootfs-${OPENWRT_VERSION}.img to storage ..." - cp /var/vm/rootfs-${OPENWRT_VERSION}.img.gz /storage/rootfs-${OPENWRT_IMAGE_ID}.img.gz - gzip -d /storage/rootfs-${OPENWRT_IMAGE_ID}.img.gz + info "$FILE does not exist. Copying squashfs-combined-${OPENWRT_VERSION}.img to storage ..." + cp /var/vm/squashfs-combined-${OPENWRT_VERSION}.img.gz /storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img.gz + gzip -d /storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img.gz - info "Inject some additional files into the image" - mount /storage/rootfs-${OPENWRT_IMAGE_ID}.img /mnt - # mount -o offset=$((512*262656)) /storage/disk.img /mnt # combined image ext4 partition starts at offset 262656 + # info "Inject some additional files into the image" + # mount /storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img /mnt + # # mount -o offset=$((512*262656)) /storage/disk.img /mnt # combined image ext4 partition starts at offset 262656 - chmod +x /var/vm/openwrt_additional/usr/bin/* - cp /var/vm/openwrt_additional/usr/bin/* /mnt/usr/bin/ + # chmod +x /var/vm/openwrt_additional/usr/bin/* + # cp /var/vm/openwrt_additional/usr/bin/* /mnt/usr/bin/ - mv /mnt/etc/rc.local /mnt/etc/rc.local.orig - cp /var/vm/openwrt_additional/etc/rc.local /mnt/etc/rc.local - chmod +x /mnt/etc/rc.local + # mv /mnt/etc/rc.local /mnt/etc/rc.local.orig + # cp /var/vm/openwrt_additional/etc/rc.local /mnt/etc/rc.local + # chmod +x /mnt/etc/rc.local - # Add some additional default configurations. Only if we have a fresh container because /storage/current_version is not existing then - if [ ! -f /storage/current_version ]; then - chmod +x /var/vm/openwrt_additional/etc/uci-defaults/* - cp /var/vm/openwrt_additional/etc/uci-defaults/* /mnt/etc/uci-defaults/ - fi + # # Add some additional default configurations. Only if we have a fresh container because /storage/current_version is not existing then + # if [ ! -f /storage/current_version ]; then + # chmod +x /var/vm/openwrt_additional/etc/uci-defaults/* + # cp /var/vm/openwrt_additional/etc/uci-defaults/* /mnt/etc/uci-defaults/ + # fi - info "Install additional IPKs into the image" - mkdir /mnt/var/offline_packages - cp /var/vm/packages/*.ipk /mnt/var/offline_packages/ - chroot /mnt/ mkdir -p /var/lock - chroot /mnt/ sh -c 'cd /var/offline_packages/ && opkg install *.ipk' - rm -rf /mnt/var/offline_packages/ - rm -rf /mnt/var/lock + # info "Install additional IPKs into the image" + # mkdir /mnt/var/offline_packages + # cp /var/vm/packages/*.ipk /mnt/var/offline_packages/ + # chroot /mnt/ mkdir -p /var/lock + # chroot /mnt/ sh -c 'cd /var/offline_packages/ && opkg install *.ipk' + # rm -rf /mnt/var/offline_packages/ + # rm -rf /mnt/var/lock - umount /mnt + # umount /mnt if [ -f "/storage/current_version" ]; then mv /storage/current_version /storage/old_version fi touch /storage/current_version - echo "rootfs-${OPENWRT_IMAGE_ID}.img" > /storage/current_version + echo "squashfs-combined-${OPENWRT_IMAGE_ID}.img" > /storage/current_version fi diff --git a/src/migrate_openwrt_rootfs.sh b/src/migrate_openwrt_rootfs.sh index d22b70f..5b2c0d1 100644 --- a/src/migrate_openwrt_rootfs.sh +++ b/src/migrate_openwrt_rootfs.sh @@ -6,32 +6,32 @@ trap - ERR . /var/vm/openwrt_metadata.conf . /run/helpers.sh -FILE=/storage/rootfs-${OPENWRT_IMAGE_ID}.img +FILE=/storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img # Migrate settings from old OpenWrt version to new one -if [ -f /storage/old_version ]; then - OLD_VERSION_ROOTFS=`cat /storage/old_version` +# if [ -f /storage/old_version ]; then +# OLD_VERSION_SQUASHFS_COMBINED=`cat /storage/old_version` - info "Migrate settings from $OLD_VERSION_ROOTFS to rootfs-${OPENWRT_IMAGE_ID}.img." +# info "Migrate settings from $OLD_VERSION_SQUASHFS_COMBINED to squashfs-combined-${OPENWRT_IMAGE_ID}.img." - mount /storage/$OLD_VERSION_ROOTFS /mnt - chroot /mnt/ mkdir -p /var/lock - chroot /mnt /sbin/sysupgrade -k -b /tmp/openwrt_config.tar.gz - mv /mnt/tmp/openwrt_config.tar.gz /storage/config-`basename $OLD_VERSION_ROOTFS .img`.tar.gz - umount /mnt +# mount /storage/$OLD_VERSION_SQUASHFS_COMBINED /mnt +# chroot /mnt/ mkdir -p /var/lock +# chroot /mnt /sbin/sysupgrade -k -b /tmp/openwrt_config.tar.gz +# mv /mnt/tmp/openwrt_config.tar.gz /storage/config-`basename $OLD_VERSION_SQUASHFS_COMBINED .img`.tar.gz +# umount /mnt - # Put config backup to new rootfs - mount $FILE /mnt - mkdir -p /mnt/root/backup - cp /storage/config-`basename $OLD_VERSION_ROOTFS .img`.tar.gz /mnt/root/backup/config.tar.gz - chroot /mnt/ mkdir -p /var/lock - chroot /mnt /sbin/sysupgrade -r /root/backup/config.tar.gz - umount /mnt +# # Put config backup to new squashfs-combined +# mount $FILE /mnt +# mkdir -p /mnt/root/backup +# cp /storage/config-`basename $OLD_VERSION_SQUASHFS_COMBINED .img`.tar.gz /mnt/root/backup/config.tar.gz +# chroot /mnt/ mkdir -p /var/lock +# chroot /mnt /sbin/sysupgrade -r /root/backup/config.tar.gz +# umount /mnt - # Finally remove old rootfs and old files - rm /storage/$OLD_VERSION_ROOTFS - rm /storage/old_version - rm /storage/config-`basename $OLD_VERSION_ROOTFS .img`.tar.gz -else - info "rootfs-${OPENWRT_IMAGE_ID}.img is up to date. Nothing to do." -fi +# # Finally remove old squashfs-combined and old files +# rm /storage/$OLD_VERSION_SQUASHFS_COMBINED +# rm /storage/old_version +# rm /storage/config-`basename $OLD_VERSION_SQUASHFS_COMBINED .img`.tar.gz +# else +# info "squashfs-combined-${OPENWRT_IMAGE_ID}.img is up to date. Nothing to do." +# fi diff --git a/src/run_openwrt.sh b/src/run_openwrt.sh index 069e0bb..5f9777b 100755 --- a/src/run_openwrt.sh +++ b/src/run_openwrt.sh @@ -13,7 +13,7 @@ trap - ERR CPU_ARCH=$(arch) VERS=$(qemu-system-"$CPU_ARCH" --version | head -n 1 | cut -d '(' -f 1) -FILE=/storage/rootfs-${OPENWRT_IMAGE_ID}.img +FILE=/storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img # Attach physical interfaces to Docker container attach_eth_if () { @@ -216,7 +216,6 @@ exec qemu-system-"$CPU_ARCH" \ -nodefaults \ $CPU_ARGS -smp $CPU_COUNT \ -display vnc=:0,websocket=5700 \ --kernel /var/vm/kernel.bin -append "root=fe00 console=tty0" \ -blockdev driver=raw,node-name=hd0,cache.direct=on,file.driver=file,file.filename=${FILE} \ -device virtio-blk-pci,drive=hd0 \ -device qemu-xhci -device usb-kbd \ @@ -228,6 +227,4 @@ exec qemu-system-"$CPU_ARCH" \ -device virtio-serial \ -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 - -# -device virtio-net,netdev=qlan1 -netdev user,id=qlan1,net=192.168.1.0/24,hostfwd=tcp::8000-192.168.1.1:80 \ -# -blockdev driver=raw,node-name=hd0,cache.direct=on,file.driver=file,file.filename=/var/vm/openwrt-armsr-armv8-generic-ext4-combined.img \ +# -kernel /var/vm/kernel.bin -append "root=fe00 console=tty0" \ From 417cc1d4cc77d229290630a31fdc41b4216ce3d6 Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Sun, 10 Nov 2024 23:17:24 +0100 Subject: [PATCH 2/9] Increase RAM to 256 MB --- src/run_openwrt.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/run_openwrt.sh b/src/run_openwrt.sh index 5f9777b..c54ab8a 100755 --- a/src/run_openwrt.sh +++ b/src/run_openwrt.sh @@ -212,7 +212,7 @@ info "Booting image using $VERS..." #************************ FINAL BOOTING ************************ exec qemu-system-"$CPU_ARCH" \ --m 128 \ +-m 256 \ -nodefaults \ $CPU_ARGS -smp $CPU_COUNT \ -display vnc=:0,websocket=5700 \ From f8166e9dbaab6da649e629260cb171e4d48d719e Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Mon, 11 Nov 2024 01:15:17 +0100 Subject: [PATCH 3/9] Migrate install of additional packages to squashfs --- Dockerfile | 56 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/Dockerfile b/Dockerfile index c646e5c..60fe4c5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -67,6 +67,7 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ uuidgen \ curl \ usbutils \ + openssh-client \ && mkdir -p /usr/share/novnc \ && wget https://github.com/novnc/noVNC/archive/refs/tags/v${NOVNC_VERSION}.tar.gz -O /tmp/novnc.tar.gz -q \ && tar -xf /tmp/novnc.tar.gz -C /tmp/ \ @@ -106,27 +107,42 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ && mkdir /var/vm \ && mkdir /var/vm/packages \ && wget $OPENWRT_IMAGE -O /var/vm/squashfs-combined-${OPENWRT_VERSION}.img.gz \ + && gzip -d /var/vm/squashfs-combined-${OPENWRT_VERSION}.img.gz \ + \ + # Boot OpenWrt in order to install additional packages and settings + && if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ + qemu-system-x86_64 -M pc -smp 2 -nographic -nodefaults -m 256 \ + -bios /usr/share/qemu/edk2-aarch64-code.fd \ + -blockdev driver=raw,node-name=hd0,cache.direct=on,file.driver=file,file.filename=/var/vm/squashfs-combined-${OPENWRT_VERSION}.img \ + -device virtio-blk-pci,drive=hd0 \ + -device virtio-net,netdev=qlan0 -netdev user,id=qlan0,net=192.168.1.0/24,hostfwd=tcp::8022-192.168.1.1:22 \ + -device virtio-net,netdev=qwan0 -netdev user,id=qwan0 \ + -daemonize; \ + else \ + qemu-system-aarch64 -M virt -cpu cortex-a53 -smp 2 -nographic -nodefaults -m 256 \ + -bios /usr/share/qemu/edk2-aarch64-code.fd \ + -blockdev driver=raw,node-name=hd0,cache.direct=on,file.driver=file,file.filename=/var/vm/squashfs-combined-${OPENWRT_VERSION}.img \ + -device virtio-blk-pci,drive=hd0 \ + -device virtio-net,netdev=qlan0 -netdev user,id=qlan0,net=192.168.1.0/24,hostfwd=tcp::8022-192.168.1.1:22 \ + -device virtio-net,netdev=qwan0 -netdev user,id=qwan0 \ + -daemonize; \ + fi \ + \ + && until ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new root@localhost -p 8022 'opkg update'; do echo "Retrying ssh ..."; sleep 1; done \ + # Download Luci, qemu guest agent and mDNS support \ + && ssh root@localhost -p 8022 'opkg install qemu-ga luci luci-ssl umdns' \ + # Download Wi-Fi access point support and Wi-Fi USB devices support \ + && ssh root@localhost -p 8022 'opkg install hostapd wpa-supplicant kmod-mt7921u' \ + # Download celluar network support \ + && ssh root@localhost -p 8022 'opkg install modemmanager kmod-usb-net-qmi-wwan luci-proto-modemmanager qmi-utils' \ + # Download basic GPS support \ + && ssh root@localhost -p 8022 'opkg install kmod-usb-serial usbutils minicom gpsd' \ + # Add Wireguard support \ + && ssh root@localhost -p 8022 'opkg install wireguard-tools luci-proto-wireguard' \ + \ + # Sync changes into image + && ssh root@localhost -p 8022 'sync' \ \ - # # Use OpenWrt rootfs to download additional IPKs and put them into the Docker image \ - # && mkdir /tmp/openwrt-rootfs \ - # && tar -xzf /tmp/rootfs-${OPENWRT_VERSION}.tar.gz -C /tmp/openwrt-rootfs \ - # && cp /etc/resolv.conf /tmp/openwrt-rootfs/etc/resolv.conf \ - # && chroot /tmp/openwrt-rootfs mkdir -p /var/lock \ - # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} update \ - # # Download Luci, qemu guest agent and mDNS support \ - # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install qemu-ga luci luci-ssl umdns --download-only \ - # # Download Wi-Fi access point support and Wi-Fi USB devices support \ - # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install hostapd wpa-supplicant kmod-mt7921u --download-only \ - # # Download celluar network support \ - # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install modemmanager kmod-usb-net-qmi-wwan luci-proto-modemmanager qmi-utils --download-only \ - # # Download basic GPS support \ - # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install kmod-usb-serial usbutils minicom gpsd --download-only \ - # # Add Wireguard support \ - # && chroot /tmp/openwrt-rootfs opkg ${OPKG_EXTRA_ARGS} install wireguard-tools luci-proto-wireguard --download-only \ - # # Copy downloaded IPKs into the Docker image \ - # && cp /tmp/openwrt-rootfs/*.ipk /var/vm/packages \ - # && rm -rf /tmp/openwrt-rootfs \ - # && rm /tmp/rootfs-${OPENWRT_VERSION}.tar.gz \ && echo "OPENWRT_VERSION=\"${OPENWRT_VERSION}\"" > /var/vm/openwrt_metadata.conf \ && echo "OPENWRT_IMAGE_CREATE_DATETIME=\"`date`\"" >> /var/vm/openwrt_metadata.conf \ && echo "OPENWRT_IMAGE_ID=\"`uuidgen`\"" >> /var/vm/openwrt_metadata.conf \ From c41e1fd23edeb194e827c7047e0d78db27baa68c Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Mon, 11 Nov 2024 01:30:58 +0100 Subject: [PATCH 4/9] More adaptions --- Dockerfile | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 60fe4c5..dc3f6a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -112,7 +112,6 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ # Boot OpenWrt in order to install additional packages and settings && if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ qemu-system-x86_64 -M pc -smp 2 -nographic -nodefaults -m 256 \ - -bios /usr/share/qemu/edk2-aarch64-code.fd \ -blockdev driver=raw,node-name=hd0,cache.direct=on,file.driver=file,file.filename=/var/vm/squashfs-combined-${OPENWRT_VERSION}.img \ -device virtio-blk-pci,drive=hd0 \ -device virtio-net,netdev=qlan0 -netdev user,id=qlan0,net=192.168.1.0/24,hostfwd=tcp::8022-192.168.1.1:22 \ @@ -140,8 +139,18 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ # Add Wireguard support \ && ssh root@localhost -p 8022 'opkg install wireguard-tools luci-proto-wireguard' \ \ - # Sync changes into image + # Add default network config + && ssh root@localhost -p 8022 "uci set network.lan.ipaddr='172.31.1.1'; uci commit network" \ + \ + # Sync changes into image and kill qemu && ssh root@localhost -p 8022 'sync' \ + && if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ + killall qemu-system-x86_64; \ + else \ + killall qemu-system-aarch64; \ + fi \ + \ + && gzip /var/vm/squashfs-combined-${OPENWRT_VERSION}.img \ \ && echo "OPENWRT_VERSION=\"${OPENWRT_VERSION}\"" > /var/vm/openwrt_metadata.conf \ && echo "OPENWRT_IMAGE_CREATE_DATETIME=\"`date`\"" >> /var/vm/openwrt_metadata.conf \ From 5c6c68664603cf810f70195966f01ea65cad8be3 Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Mon, 11 Nov 2024 07:27:35 +0100 Subject: [PATCH 5/9] Migrate adding of additional files into OpenWrt image --- Dockerfile | 16 ++++++----- openwrt_additional/etc/rc.local | 5 ---- .../uci-defaults/99-openwrt-container-custom | 5 ---- .../bin/restore_install_packages_from_backup | 7 ----- src/install_openwrt_rootfs.sh | 27 ------------------- 5 files changed, 10 insertions(+), 50 deletions(-) delete mode 100644 openwrt_additional/etc/rc.local delete mode 100644 openwrt_additional/etc/uci-defaults/99-openwrt-container-custom delete mode 100644 openwrt_additional/usr/bin/restore_install_packages_from_backup diff --git a/Dockerfile b/Dockerfile index dc3f6a8..91b7f1a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -74,10 +74,11 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ && cd /tmp/noVNC-${NOVNC_VERSION}\ && mv app core vendor package.json *.html /usr/share/novnc \ && sed -i 's/^worker_processes.*/worker_processes 1;daemon off;/' /etc/nginx/nginx.conf - + +COPY ./openwrt_additional /var/vm/openwrt_additional + # Handle different CPUs architectures and choose the correct OpenWrt images RUN echo "Building for platform '$TARGETPLATFORM'" \ - OPKG_EXTRA_ARGS="" \ && if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ if [ "$OPENWRT_VERSION" = "master" ]; then \ OPENWRT_IMAGE="https://downloads.openwrt.org/snapshots/targets/x86/64/openwrt-x86-64-generic-squashfs-combined.img.gz"; \ @@ -104,8 +105,6 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ fi \ \ # Get OpenWrt images \ - && mkdir /var/vm \ - && mkdir /var/vm/packages \ && wget $OPENWRT_IMAGE -O /var/vm/squashfs-combined-${OPENWRT_VERSION}.img.gz \ && gzip -d /var/vm/squashfs-combined-${OPENWRT_VERSION}.img.gz \ \ @@ -139,9 +138,15 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ # Add Wireguard support \ && ssh root@localhost -p 8022 'opkg install wireguard-tools luci-proto-wireguard' \ \ - # Add default network config + # Add default network config \ && ssh root@localhost -p 8022 "uci set network.lan.ipaddr='172.31.1.1'; uci commit network" \ \ + # Add some files \ + && ssh root@localhost -p 8022 'opkg install openssh-sftp-server' \ + && chmod +x /var/vm/openwrt_additional/usr/bin/* \ + && scp -P 8022 /var/vm/openwrt_additional/usr/bin/* root@localhost:/usr/bin \ + && ssh root@localhost -p 8022 'opkg remove openssh-sftp-server' \ + \ # Sync changes into image and kill qemu && ssh root@localhost -p 8022 'sync' \ && if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ @@ -160,7 +165,6 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ COPY --from=builder /usr/local/bin/qemu-openwrt-web-backend /usr/local/bin/qemu-openwrt-web-backend COPY ./src /run/ COPY ./web-frontend /var/www/ -COPY ./openwrt_additional /var/vm/openwrt_additional RUN chmod +x /run/*.sh diff --git a/openwrt_additional/etc/rc.local b/openwrt_additional/etc/rc.local deleted file mode 100644 index bea5c97..0000000 --- a/openwrt_additional/etc/rc.local +++ /dev/null @@ -1,5 +0,0 @@ - -# Remount rootfs to enable sync -mount -o remount,rw,sync / - -exit 0 diff --git a/openwrt_additional/etc/uci-defaults/99-openwrt-container-custom b/openwrt_additional/etc/uci-defaults/99-openwrt-container-custom deleted file mode 100644 index 054900b..0000000 --- a/openwrt_additional/etc/uci-defaults/99-openwrt-container-custom +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -uci set network.lan.ipaddr='172.31.1.1' -uci commit network - diff --git a/openwrt_additional/usr/bin/restore_install_packages_from_backup b/openwrt_additional/usr/bin/restore_install_packages_from_backup deleted file mode 100644 index 385fb9e..0000000 --- a/openwrt_additional/usr/bin/restore_install_packages_from_backup +++ /dev/null @@ -1,7 +0,0 @@ -#/bin/sh - -echo "Get packages list from repo" -opkg update - -echo "Restore packages" -grep '\tunknown' /etc/backup/installed_packages.txt | cut -f1 | xargs opkg install diff --git a/src/install_openwrt_rootfs.sh b/src/install_openwrt_rootfs.sh index fa6da88..488eed6 100644 --- a/src/install_openwrt_rootfs.sh +++ b/src/install_openwrt_rootfs.sh @@ -15,33 +15,6 @@ else cp /var/vm/squashfs-combined-${OPENWRT_VERSION}.img.gz /storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img.gz gzip -d /storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img.gz - # info "Inject some additional files into the image" - # mount /storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img /mnt - # # mount -o offset=$((512*262656)) /storage/disk.img /mnt # combined image ext4 partition starts at offset 262656 - - # chmod +x /var/vm/openwrt_additional/usr/bin/* - # cp /var/vm/openwrt_additional/usr/bin/* /mnt/usr/bin/ - - # mv /mnt/etc/rc.local /mnt/etc/rc.local.orig - # cp /var/vm/openwrt_additional/etc/rc.local /mnt/etc/rc.local - # chmod +x /mnt/etc/rc.local - - # # Add some additional default configurations. Only if we have a fresh container because /storage/current_version is not existing then - # if [ ! -f /storage/current_version ]; then - # chmod +x /var/vm/openwrt_additional/etc/uci-defaults/* - # cp /var/vm/openwrt_additional/etc/uci-defaults/* /mnt/etc/uci-defaults/ - # fi - - # info "Install additional IPKs into the image" - # mkdir /mnt/var/offline_packages - # cp /var/vm/packages/*.ipk /mnt/var/offline_packages/ - # chroot /mnt/ mkdir -p /var/lock - # chroot /mnt/ sh -c 'cd /var/offline_packages/ && opkg install *.ipk' - # rm -rf /mnt/var/offline_packages/ - # rm -rf /mnt/var/lock - - # umount /mnt - if [ -f "/storage/current_version" ]; then mv /storage/current_version /storage/old_version fi From f48924df0a80b6c54f58d912d15f54161acb2e82 Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Mon, 11 Nov 2024 07:29:35 +0100 Subject: [PATCH 6/9] Remove test of additional installed packages --- test/tests/openwrt_docker_test.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/test/tests/openwrt_docker_test.py b/test/tests/openwrt_docker_test.py index 6704586..6013a30 100644 --- a/test/tests/openwrt_docker_test.py +++ b/test/tests/openwrt_docker_test.py @@ -369,34 +369,6 @@ def test_cpu_num(docker_services, parameter): assert parameter[1] == cpu_num -def test_additional_installed_packages(docker_services): - # Get list of packages to be installed in OpenWrt - process = subprocess.run(['docker','exec','openwrt','ls','/var/vm/packages'], - stdout=subprocess.PIPE, - universal_newlines=True) - - assert process.returncode == 0 - - package_list_docker_full = process.stdout.splitlines() - package_list_docker = [] - for package in package_list_docker_full: - package = package.split('_')[0] # Use only the name before the '_' - package_list_docker.append(package) - - # Get list of installed packages in OpenWrt - wait_for_openwrt_startup(docker_services) - response = run_openwrt_shell_command("opkg", "list-installed") - - assert response['exitcode'] == 0 - - package_list_openwrt_full = response['out-data'].splitlines() - print(f"'{len(package_list_docker)}' additional installed packages", end=' ') - - # Check if all additional OpenWrt packages in Docker image are installed in OpenWrt - for package in package_list_docker: - assert any(package in s for s in package_list_openwrt_full) == True - - @pytest.mark.parametrize("parameter", [('','','20240922_test_volume_openwrt_23.05.4.tar.gz')], indirect=True, ids=['20240922_test_volume_openwrt_23.05.4']) From a248ad45214965c7c6357562547a5f16815dea19 Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Mon, 11 Nov 2024 11:37:31 +0100 Subject: [PATCH 7/9] Add graceful qemu shutdown --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 91b7f1a..f705f91 100644 --- a/Dockerfile +++ b/Dockerfile @@ -148,11 +148,11 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ && ssh root@localhost -p 8022 'opkg remove openssh-sftp-server' \ \ # Sync changes into image and kill qemu - && ssh root@localhost -p 8022 'sync' \ + && ssh root@localhost -p 8022 'sync; halt' \ && if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ - killall qemu-system-x86_64; \ + while pgrep -x "qemu-system-x86_64" >/dev/null; do echo "Wait for exit of qemu ..."; sleep 1; done; \ else \ - killall qemu-system-aarch64; \ + while pgrep -x "qemu-system-aarch64" >/dev/null; do echo "Wait for exit of qemu ..."; sleep 1; done \ fi \ \ && gzip /var/vm/squashfs-combined-${OPENWRT_VERSION}.img \ From 0a740859f6b9f887fb073860b7e08beb78fe0595 Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Tue, 12 Nov 2024 22:24:13 +0100 Subject: [PATCH 8/9] Migrate config settings migration to squashfs --- Dockerfile | 3 +- src/migrate_openwrt_rootfs.sh | 141 ++++++++++++++++++++++++++++------ 2 files changed, 118 insertions(+), 26 deletions(-) diff --git a/Dockerfile b/Dockerfile index f705f91..b7822f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -57,15 +57,14 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ multirun \ bash \ wget \ + grep \ qemu-system-"$CPU_ARCH" \ qemu-hw-usb-host \ qemu-hw-usb-redirect \ nginx \ nginx-mod-stream \ netcat-openbsd \ - tcpdump \ uuidgen \ - curl \ usbutils \ openssh-client \ && mkdir -p /usr/share/novnc \ diff --git a/src/migrate_openwrt_rootfs.sh b/src/migrate_openwrt_rootfs.sh index 5b2c0d1..6a533b2 100644 --- a/src/migrate_openwrt_rootfs.sh +++ b/src/migrate_openwrt_rootfs.sh @@ -6,32 +6,125 @@ trap - ERR . /var/vm/openwrt_metadata.conf . /run/helpers.sh -FILE=/storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img +# Function to find the squashfs file system start offset from a OpenWrt given file +find_squashfs_offset() { + local IMAGE_FILE="$1" + echo >&2 "Start finding start of squashfs file system in file '"$IMAGE_FILE"' ..." + + # Use fdisk to find the squashfs partition + local squashfs_start_sectors=`fdisk -l "$IMAGE_FILE" | awk '/^.*squashfs-combined.*.img2/ {print $4}'` # use the 4th ouput as sectors + + if [ -z "$squashfs_start_sectors" ]; then + echo >&2 "No squashfs-combined*.img2 found" + return 1 + fi + + local squashfs_offset=$(( squashfs_start_sectors * 512 )) # Each sector has 512 bytes + + echo >&2 "squashfs file system start at offset 0x$(printf '%x' "$squashfs_offset")" + + echo $squashfs_offset +} + +# Function to find the ext4 file system start offset from a OpenWrt given file +find_ext4_offset() { + local IMAGE_FILE="$1" + echo >&2 "Start finding start of ext4 file system in file '$IMAGE_FILE' ..." + + # Define the search boundary (in bytes) + local SEARCH_BOUNDARY=200 # This is the search boundary for extracting data before and after 'rootfs_data' + local EXT4_MAGIC_KEY="\x53\xef" # This is the magic key identifying the ext4 file system (as hex string) + local ROOTFS_PATTERN="rootfs_data" # This is the pattern we are searching for in the file + + # Step 1: Find the OFFSET of the first occurrence of 'rootfs_data' + local OFFSET=`grep -obam 1 "$ROOTFS_PATTERN" "$IMAGE_FILE" | awk -F':' '{print $1}'` + + if [ -z "$OFFSET" ]; then + echo >&2 "'$ROOTFS_PATTERN' not found in the file." + return 1 + fi + + # Output OFFSET in hexadecimal format + echo >&2 "Found volume name '$ROOTFS_PATTERN' at offset: 0x$(printf '%x' "$OFFSET")" + + # Step 2: Use dd to extract the bytes and search for the EXT4_MAGIC_KEY + # Extract the byte offset from the grep result (this is relative to the start of the dd block) + local offset_in_block=`dd if="$IMAGE_FILE" bs=1 skip=$((OFFSET - SEARCH_BOUNDARY)) count=$SEARCH_BOUNDARY 2>/dev/null | + LANG=C grep -obUaPm 1 $EXT4_MAGIC_KEY | cut -d: -f1` + + if [ -z "$offset_in_block" ]; then + echo >&2 "ext4 magic key not found in the file." + return 1 + fi + + actual_offset=$((offset_in_block + OFFSET - SEARCH_BOUNDARY)) # Adjust the offset to the actual position in the original file + local ext4_start_offset=$((actual_offset - 1080)) # Subtract 1080 bytes from the found offset. ext4 is starting 1080 before 0x53ef + + # Show the adjusted actual_offset + #echo >&2 "Offset in dd block: 0x$(printf '%x' "$offset_in_block")" + echo >&2 "Found ext4 magic key '$EXT4_MAGIC_KEY' at offset: 0x$(printf '%x' "$actual_offset")" + echo >&2 "ext4 file system start at offset: 0x$(printf '%x' "$ext4_start_offset")" + + echo $ext4_start_offset +} + +mount_squashfs_combined_image() { + local IMAGE_FILE="$1" + + squashfs_start_offset=$(find_squashfs_offset "$IMAGE_FILE") + ext4_start_offset=$(find_ext4_offset "$IMAGE_FILE") + + mkdir -p /tmp/squashfs_dir + mkdir -p /tmp/ext4_dir + + mount -o offset="$squashfs_start_offset" "$IMAGE_FILE" /tmp/squashfs_dir + mount -o offset="$ext4_start_offset" "$IMAGE_FILE" /tmp/ext4_dir + + mount -t overlay -o lowerdir=/tmp/squashfs_dir,upperdir=/tmp/ext4_dir/upper,workdir=/tmp/ext4_dir/work overlay /mnt +} + +umount_squashfs_combined_image() { + umount /mnt + umount /tmp/ext4_dir + umount /tmp/squashfs_dir +} + +SQUASHFS_COMBINED=/storage/squashfs-combined-${OPENWRT_IMAGE_ID}.img # Migrate settings from old OpenWrt version to new one -# if [ -f /storage/old_version ]; then -# OLD_VERSION_SQUASHFS_COMBINED=`cat /storage/old_version` +if [ -f /storage/old_version ]; then + OLD_SQUASHFS_COMBINED=`cat /storage/old_version` -# info "Migrate settings from $OLD_VERSION_SQUASHFS_COMBINED to squashfs-combined-${OPENWRT_IMAGE_ID}.img." - -# mount /storage/$OLD_VERSION_SQUASHFS_COMBINED /mnt -# chroot /mnt/ mkdir -p /var/lock -# chroot /mnt /sbin/sysupgrade -k -b /tmp/openwrt_config.tar.gz -# mv /mnt/tmp/openwrt_config.tar.gz /storage/config-`basename $OLD_VERSION_SQUASHFS_COMBINED .img`.tar.gz -# umount /mnt + info "Migrate settings from $OLD_SQUASHFS_COMBINED to squashfs-combined-${OPENWRT_IMAGE_ID}.img." -# # Put config backup to new squashfs-combined -# mount $FILE /mnt -# mkdir -p /mnt/root/backup -# cp /storage/config-`basename $OLD_VERSION_SQUASHFS_COMBINED .img`.tar.gz /mnt/root/backup/config.tar.gz -# chroot /mnt/ mkdir -p /var/lock -# chroot /mnt /sbin/sysupgrade -r /root/backup/config.tar.gz -# umount /mnt + # Create config backup in previos image + if [[ $OLD_SQUASHFS_COMBINED == *"rootfs"* ]]; then + warn "Using rootfs-.img images is deprecated!" + mount /storage/$OLD_SQUASHFS_COMBINED /mnt + chroot /mnt/ mkdir -p /var/lock + chroot /mnt /sbin/sysupgrade -k -b /tmp/openwrt_config.tar.gz + mv /mnt/tmp/openwrt_config.tar.gz /storage/config-`basename $OLD_SQUASHFS_COMBINED.img`.tar.gz + umount /mnt + else + mount_squashfs_combined_image /storage/$OLD_SQUASHFS_COMBINED + chroot /mnt/ mkdir -p /var/lock + chroot /mnt /sbin/sysupgrade -k -b /tmp/openwrt_config.tar.gz + mv /mnt/tmp/openwrt_config.tar.gz /storage/config-`basename $OLD_SQUASHFS_COMBINED.img`.tar.gz + umount_squashfs_combined_image + fi -# # Finally remove old squashfs-combined and old files -# rm /storage/$OLD_VERSION_SQUASHFS_COMBINED -# rm /storage/old_version -# rm /storage/config-`basename $OLD_VERSION_SQUASHFS_COMBINED .img`.tar.gz -# else -# info "squashfs-combined-${OPENWRT_IMAGE_ID}.img is up to date. Nothing to do." -# fi + # Put config backup to new squashfs-combined + mount_squashfs_combined_image $SQUASHFS_COMBINED + mkdir -p /mnt/root/backup + cp /storage/config-`basename $OLD_SQUASHFS_COMBINED.img`.tar.gz /mnt/root/backup/config.tar.gz + chroot /mnt/ mkdir -p /var/lock + chroot /mnt /sbin/sysupgrade -r /root/backup/config.tar.gz + umount_squashfs_combined_image + + # Finally remove old squashfs-combined and old files + rm /storage/$OLD_SQUASHFS_COMBINED + rm /storage/old_version + rm /storage/config-`basename $OLD_SQUASHFS_COMBINED.img`.tar.gz +else + info "squashfs-combined-${OPENWRT_IMAGE_ID}.img is up to date. Nothing to do." +fi \ No newline at end of file From 6ceb88ef2ad12fdde7828548475847ea56a8a09f Mon Sep 17 00:00:00 2001 From: Albrecht Lohofener Date: Wed, 13 Nov 2024 00:51:59 +0100 Subject: [PATCH 9/9] Add j2fs file system detection --- Dockerfile | 1 + src/migrate_openwrt_rootfs.sh | 50 ++++++++++++++++++++++++++++------- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index b7822f3..51defb0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -67,6 +67,7 @@ RUN echo "Building for platform '$TARGETPLATFORM'" \ uuidgen \ usbutils \ openssh-client \ + util-linux-misc \ && mkdir -p /usr/share/novnc \ && wget https://github.com/novnc/noVNC/archive/refs/tags/v${NOVNC_VERSION}.tar.gz -O /tmp/novnc.tar.gz -q \ && tar -xf /tmp/novnc.tar.gz -C /tmp/ \ diff --git a/src/migrate_openwrt_rootfs.sh b/src/migrate_openwrt_rootfs.sh index 6a533b2..1ae12c2 100644 --- a/src/migrate_openwrt_rootfs.sh +++ b/src/migrate_openwrt_rootfs.sh @@ -12,7 +12,7 @@ find_squashfs_offset() { echo >&2 "Start finding start of squashfs file system in file '"$IMAGE_FILE"' ..." # Use fdisk to find the squashfs partition - local squashfs_start_sectors=`fdisk -l "$IMAGE_FILE" | awk '/^.*squashfs-combined.*.img2/ {print $4}'` # use the 4th ouput as sectors + local squashfs_start_sectors=`fdisk -l "$IMAGE_FILE" | awk '/^.*squashfs-combined.*.img2/ {print $2}'` # use the 4th ouput as sectors if [ -z "$squashfs_start_sectors" ]; then echo >&2 "No squashfs-combined*.img2 found" @@ -57,7 +57,7 @@ find_ext4_offset() { return 1 fi - actual_offset=$((offset_in_block + OFFSET - SEARCH_BOUNDARY)) # Adjust the offset to the actual position in the original file + local actual_offset=$((offset_in_block + OFFSET - SEARCH_BOUNDARY)) # Adjust the offset to the actual position in the original file local ext4_start_offset=$((actual_offset - 1080)) # Subtract 1080 bytes from the found offset. ext4 is starting 1080 before 0x53ef # Show the adjusted actual_offset @@ -68,24 +68,56 @@ find_ext4_offset() { echo $ext4_start_offset } +# Function to find the ext4 file system start offset from a OpenWrt given file +find_f2fs_offset() { + local IMAGE_FILE="$1" + local SQUASHFS_OFFSET="$2" + echo >&2 "Start finding start of j2fs file system in file '$IMAGE_FILE' ..." + + # Define the search boundary (in bytes) + local SQUASHFS_SIZE_APPROX=4000000 # This is the size assumtion of squashfs file system that is located before the j2fs + local J2FS_MAGIC_KEY="\x10\x20\xf5\xf2" # This is the magic key identifying the ext4 file system (as hex string) + + local offset_in_block=`dd if="$IMAGE_FILE" bs=1 skip=$((SQUASHFS_OFFSET + SQUASHFS_SIZE_APPROX)) 2>/dev/null | \ + LANG=C grep -obUaPm 1 "$J2FS_MAGIC_KEY" | cut -d: -f1` + + if [ -z "$offset_in_block" ]; then + echo >&2 "j2fs magic key not found in the file." + return 1 + fi + + local actual_offset=$((offset_in_block + SQUASHFS_OFFSET + SQUASHFS_SIZE_APPROX)) # Adjust the offset to the actual position in the original file + local j2fs_start_offset=$((actual_offset - 1024)) # Subtract 1024 bytes from the found offset. j2fs is starting 1024 before 0x1020f5f2 + + echo >&2 "Found j2fs magic key '$J2FS_MAGIC_KEY' at offset: 0x$(printf '%x' "$actual_offset")" + echo >&2 "j2fs file system start at offset: 0x$(printf '%x' "$j2fs_start_offset")" + + echo $j2fs_start_offset +} + mount_squashfs_combined_image() { local IMAGE_FILE="$1" squashfs_start_offset=$(find_squashfs_offset "$IMAGE_FILE") - ext4_start_offset=$(find_ext4_offset "$IMAGE_FILE") + + CPU_ARCH=$(arch) + if [ $CPU_ARCH = "aarch64" ]; then + start_offset=$(find_f2fs_offset "$IMAGE_FILE" "$squashfs_start_offset") + else + start_offset=$(find_ext4_offset "$IMAGE_FILE") + fi mkdir -p /tmp/squashfs_dir - mkdir -p /tmp/ext4_dir + mkdir -p /tmp/userdata_dir - mount -o offset="$squashfs_start_offset" "$IMAGE_FILE" /tmp/squashfs_dir - mount -o offset="$ext4_start_offset" "$IMAGE_FILE" /tmp/ext4_dir - - mount -t overlay -o lowerdir=/tmp/squashfs_dir,upperdir=/tmp/ext4_dir/upper,workdir=/tmp/ext4_dir/work overlay /mnt + mount -o offset="$squashfs_start_offset",sizelimit=$((start_offset-squashfs_start_offset)) "$IMAGE_FILE" /tmp/squashfs_dir + mount -o offset="$start_offset" "$IMAGE_FILE" /tmp/userdata_dir + mount -t overlay -o lowerdir=/tmp/squashfs_dir,upperdir=/tmp/userdata_dir/upper,workdir=/tmp/userdata_dir/work overlay /mnt } umount_squashfs_combined_image() { umount /mnt - umount /tmp/ext4_dir + umount /tmp/userdata_dir umount /tmp/squashfs_dir }