diff --git a/openwrt_additional/do_backup_rc.local b/openwrt_additional/do_backup_rc.local new file mode 100644 index 0000000..9588777 --- /dev/null +++ b/openwrt_additional/do_backup_rc.local @@ -0,0 +1,10 @@ + +echo "Backup configuration" +mkdir -p /root/backup +sysupgrade -k -b /root/backup/config.tar.gz +sync + +echo "Shutdown system" +halt + +exit 0 diff --git a/openwrt_additional/restore_backup_rc.local b/openwrt_additional/restore_backup_rc.local new file mode 100644 index 0000000..2d0817d --- /dev/null +++ b/openwrt_additional/restore_backup_rc.local @@ -0,0 +1,9 @@ + +echo "Restore configuration" +sysupgrade -r /root/backup/config.tar.gz +sync + +echo "Shutdown system" +halt + +exit 0 diff --git a/src/entry.sh b/src/entry.sh index 552e6ce..a65285c 100755 --- a/src/entry.sh +++ b/src/entry.sh @@ -51,7 +51,7 @@ FILE=/storage/rootfs-${OPENWRT_VERSION}.img if [ -f "$FILE" ]; then info "$FILE exists. Nothing to do." else - info "$FILE does not exist. Copying image to storage ..." + info "$FILE does not exist. Copying rootfs-${OPENWRT_VERSION}.img to storage ..." cp /var/vm/rootfs-${OPENWRT_VERSION}.img.gz /storage/rootfs-${OPENWRT_VERSION}.img.gz gzip -d /storage/rootfs-${OPENWRT_VERSION}.img.gz @@ -61,9 +61,16 @@ else chmod +x /var/vm/openwrt_additional/bin/* cp /var/vm/openwrt_additional/bin/* /mnt/usr/bin/ umount /mnt + + if [ -f "/storage/current_version" ]; then + mv /storage/current_version /storage/old_version + fi + + touch /storage/current_version + echo "rootfs-${OPENWRT_VERSION}.img" > /storage/current_version fi - +# Enable VNC info "Activating web VNC ..." [ ! -f "$INFO" ] && error "File $INFO not found?!" rm -f "$INFO" @@ -71,6 +78,7 @@ rm -f "$INFO" rm -f "$PAGE" +# Check KVM info "Checking for KVM ..." KVM_ERR="" CPU_ARGS="-cpu cortex-a53" @@ -119,9 +127,84 @@ else USB_ARGS="-device usb-host,vendorid=0x$USB_VID_1,productid=0x$USB_PID_1" fi -info "Booting image using $VERS..." +# Migrate settings from old OpenWrt version to new one +if [ -f /storage/old_version ]; then + OLD_VERSION_ROOTFS=`cat /storage/old_version` + info "Migrate settings from $OLD_VERSION_ROOTFS to rootfs-${OPENWRT_VERSION}.img. This can take some time because we need to boot openwrt multiple times." + + mount /storage/$OLD_VERSION_ROOTFS /mnt + mv /mnt/etc/rc.local /mnt/etc/rc.local.disabled + cp /var/vm/openwrt_additional/do_backup_rc.local /mnt/etc/rc.local + chmod +x /mnt/etc/rc.local + umount /mnt + + qemu-system-aarch64 -M virt \ + -m 128 \ + -nodefaults \ + $CPU_ARGS -smp $CPU_COUNT \ + -bios /usr/share/qemu/edk2-aarch64-code.fd \ + -display vnc=:0,websocket=5700 \ + -vga none -device ramfb \ + -kernel /var/vm/kernel.bin -append "root=fe00 console=tty0" \ + -blockdev driver=raw,node-name=hd0,cache.direct=on,file.driver=file,file.filename=/storage/${OLD_VERSION_ROOTFS} \ + -device virtio-blk-pci,drive=hd0 \ + -device qemu-xhci -device usb-kbd + + # Get config backup from old rootfs + mount /storage/$OLD_VERSION_ROOTFS /mnt + rm /mnt/etc/rc.local + mv /mnt/etc/rc.local.disabled /mnt/etc/rc.local + + if [ -f /mnt/root/backup/config.tar.gz ]; then + cp /mnt/root/backup/config.tar.gz /storage/config-`basename $OLD_VERSION_ROOTFS .img`.tar.gz + else + error "No config.tar.gz in $OLD_VERSION_ROOTFS found" + fi + 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 + + mv /mnt/etc/rc.local /mnt/etc/rc.local.disabled + cp /var/vm/openwrt_additional/restore_backup_rc.local /mnt/etc/rc.local + chmod +x /mnt/etc/rc.local + umount /mnt + + qemu-system-aarch64 -M virt \ + -m 128 \ + -nodefaults \ + $CPU_ARGS -smp $CPU_COUNT \ + -bios /usr/share/qemu/edk2-aarch64-code.fd \ + -display vnc=:0,websocket=5700 \ + -vga none -device ramfb \ + -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 + + mount $FILE /mnt + rm /mnt/etc/rc.local + mv /mnt/etc/rc.local.disabled /mnt/etc/rc.local + mv /mnt/root/backup/config.tar.gz /mnt/root/backup/config-`basename $OLD_VERSION_ROOTFS .img`.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 +fi + + + +# See qemu command if debug is enabled [[ "$DEBUG" == [Yy1]* ]] && set -x + +#************************ FINAL BOOTING ************************ + +info "Booting image using $VERS..." exec qemu-system-aarch64 -M virt \ -m 128 \ -nodefaults \ @@ -130,7 +213,7 @@ exec qemu-system-aarch64 -M virt \ -display vnc=:0,websocket=5700 \ -vga none -device ramfb \ -kernel /var/vm/kernel.bin -append "root=fe00 console=tty0" \ --blockdev driver=raw,node-name=hd0,cache.direct=on,file.driver=file,file.filename=/storage/rootfs-${OPENWRT_VERSION}.img \ +-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 \ $LAN_ARGS \