Add qemu guest agend to image. Do migration via chroot instead of qemu. Add grateful shutdown and reboot.

This commit is contained in:
Albrecht Lohofener
2024-02-21 00:10:28 +01:00
parent 1059e211c5
commit 71e00a6966
15 changed files with 82 additions and 93 deletions
+7 -2
View File
@@ -8,8 +8,13 @@ trap - ERR
CURRENT_VERSION_ROOTFS=`cat /storage/current_version`
# Stop openwrt
echo "****** Stop openwrt ******"
supervisorctl stop openwrt
echo "****** shutdown openwrt ******"
/run/qemu_qmp.sh -S
until ! supervisorctl status openwrt | grep RUNNING
do
sleep 1
done
# Get config
echo "****** Mount $CURRENT_VERSION_ROOTFS ******"
-2
View File
@@ -5,8 +5,6 @@ trap - ERR
. /run/helpers.sh
CURRENT_VERSION_ROOTFS=`cat /storage/current_version`
# Stop openwrt
echo "****** Stop openwrt ******"
supervisorctl stop openwrt
+9
View File
@@ -17,6 +17,7 @@ else
info "Inject some additional files into the image"
mount /storage/rootfs-${OPENWRT_VERSION}.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/bin/*
cp /var/vm/openwrt_additional/bin/* /mnt/usr/bin/
@@ -24,6 +25,14 @@ else
cp /var/vm/openwrt_additional/rc.local /mnt/etc/rc.local
chmod +x /mnt/etc/rc.local
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
+8 -52
View File
@@ -5,70 +5,26 @@ trap - ERR
. /run/helpers.sh
FILE=/storage/rootfs-${OPENWRT_VERSION}.img
# 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."
info "Migrate settings from $OLD_VERSION_ROOTFS to rootfs-${OPENWRT_VERSION}.img."
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
info "Boot previous $OLD_VERSION_ROOTFS to get config"
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
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
# 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
info "Boot current rootfs-${OPENWRT_VERSION}.img to install config"
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
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
+11 -2
View File
@@ -28,7 +28,7 @@ Help()
# Process the input options. Add options as needed. #
############################################################
# Get the options
while getopts ":hvrqs" option; do
while getopts ":hvrqsSVR" option; do
case $option in
h) # display Help
Help
@@ -45,10 +45,19 @@ while getopts ":hvrqs" option; do
s) # Shutdown VM
echo -ne '{ "execute": "qmp_capabilities" } { "execute": "system_powerdown" }' | nc -w 1 -U /run/qmp-sock
exit;;
S) # Shutdown VM grateful, package qemu-ga needs to be installed
echo -ne '{"execute":"guest-shutdown"}' | nc -w 1 -U /run/qga.sock
exit;;
V) # Get VM infos, package qemu-ga needs to be installed
echo -ne '{"execute":"guest-get-osinfo"}' | nc -w 1 -U /run/qga.sock
exit;;
R) # Reboot, package qemu-ga needs to be installed
echo -ne '{"execute": "guest-exec", "arguments": { "path": "reboot"}}' | nc -w 1 -U /run/qga.sock
exit;;
\?) # Invalid option
echo "Error: Invalid option"
Help
exit;;
esac
esac
done
+8 -2
View File
@@ -13,8 +13,13 @@ fi
CURRENT_VERSION_ROOTFS=`cat /storage/current_version`
# Stop openwrt
echo "****** Stop openwrt ******"
supervisorctl stop openwrt
echo "****** shutdown openwrt ******"
/run/qemu_qmp.sh -S
until ! supervisorctl status openwrt | grep RUNNING
do
sleep 1
done
# Get config
echo "****** Mount $CURRENT_VERSION_ROOTFS ******"
@@ -22,6 +27,7 @@ mount /storage/$CURRENT_VERSION_ROOTFS /mnt
echo "****** Restore $2 ******"
cp $2 /mnt/tmp/openwrt_config.tar.gz
chroot /mnt/ mkdir -p /var/lock
chroot /mnt /sbin/sysupgrade -r /tmp/openwrt_config.tar.gz
echo "****** umount $CURRENT_VERSION_ROOTFS ******"
+6 -1
View File
@@ -9,6 +9,7 @@ trap - ERR
. /run/migrate_openwrt_rootfs.sh
VERS=$(qemu-system-aarch64 --version | head -n 1 | cut -d '(' -f 1)
FILE=/storage/rootfs-${OPENWRT_VERSION}.img
attach_eth_if () {
HOST_IF=$1
@@ -120,7 +121,11 @@ qemu-system-aarch64 -M virt \
$LAN_ARGS \
$WAN_ARGS \
$USB_ARGS \
-qmp unix:/run/qmp-sock,server=on,wait=off
-qmp unix:/run/qmp-sock,server=on,wait=off \
-chardev socket,path=/run/qga.sock,server=on,wait=off,id=qga0 \
-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 \