diff --git a/Makefile b/Makefile index 932bf33..37dbe79 100644 --- a/Makefile +++ b/Makefile @@ -201,6 +201,7 @@ install-common: install-doc $(DESTDIR)/usr/share/glib-2.0/schemas/ install -g user -m 2775 -d $(DESTDIR)/var/lib/qubes/dom0-updates install -D -m 0644 misc/qubes-master-key.asc $(DESTDIR)/usr/share/qubes/qubes-master-key.asc + install misc/resize-rootfs $(DESTDIR)$(LIBDIR)/qubes/ install misc/close-window $(DESTDIR)$(LIBDIR)/qubes/close-window diff --git a/debian/qubes-core-agent.install b/debian/qubes-core-agent.install index 1eb21b4..28e3f32 100644 --- a/debian/qubes-core-agent.install +++ b/debian/qubes-core-agent.install @@ -123,6 +123,7 @@ usr/lib/qubes/qvm-copy-to-vm.gnome usr/lib/qubes/qvm-copy-to-vm.kde usr/lib/qubes/qvm-move-to-vm.gnome usr/lib/qubes/qvm-move-to-vm.kde +usr/lib/qubes/resize-rootfs usr/lib/qubes/tar2qfile usr/lib/qubes/update-proxy-configs usr/lib/qubes/upgrades-installed-check diff --git a/misc/resize-rootfs b/misc/resize-rootfs new file mode 100755 index 0000000..bebf101 --- /dev/null +++ b/misc/resize-rootfs @@ -0,0 +1,42 @@ +#!/bin/sh + +set -e + +dm_major=$(printf %x "$(grep device-mapper /proc/devices | cut -f 1 -d ' ')") +case "$(stat -Lc %t:%T /dev/mapper/dmroot)" in + ca:0) + # nothing needed, xvda used directly + ;; + ca:3) + # resize partition table itself + # use undocumented ---pretend-input-tty (yes, three '-') to + # force unattended operation, otherwise it aborts on first + # prompt, even with '-s' option + echo fix | parted ---pretend-input-tty /dev/xvda print >/dev/null + # then resize 3rd partition, even though it is mounted + echo yes 100% | parted ---pretend-input-tty /dev/xvda resizepart 3 + # and reload partition table; prefer partprobe over blockdev + # --rereadpt, as it works on mounted partitions + partprobe /dev/xvda + ;; + ca:*) + echo "Unsupported partition layout, resize it manually" >&2 + exit 1 + ;; + $dm_major:*) + new_size=$(cat /sys/block/xvda/size) + ro=$(cat /sys/block/xvda/ro) + if [ "$ro" -eq 1 ]; then + new_table="0 $new_size snapshot /dev/xvda /dev/xvdc2 N 16" + else + new_table="0 $new_size linear /dev/xvda 0" + fi + dmsetup load dmroot --table "$new_table" + dmsetup resume dmroot + ;; + *) + echo "Unsupported device type for root volume, resize it manually" >&2 + exit 1 + ;; +esac +resize2fs /dev/mapper/dmroot diff --git a/qubes-rpc/qubes.ResizeDisk b/qubes-rpc/qubes.ResizeDisk index 038467d..60b0fdb 100755 --- a/qubes-rpc/qubes.ResizeDisk +++ b/qubes-rpc/qubes.ResizeDisk @@ -13,22 +13,10 @@ case $disk_name in root) # force some read to refresh device size head /dev/xvda > /dev/null - if [ "$(stat -Lc %t /dev/mapper/dmroot)" != "ca" ]; then - new_size=$(cat /sys/block/xvda/size) - ro=$(/sys/block/xvda/ro) - if [ "$ro" -eq 1 ]; then - new_table="0 $new_size snapshot /dev/xvda /dev/xvdc2 N 16" - else - new_table="0 $new_size linear /dev/xvda 0" - fi - dmsetup load dmroot --table "$new_table" - dmsetup resume dmroot - fi - resize2fs /dev/mapper/dmroot + /usr/lib/qubes/resize-rootfs ;; *) echo "Automatic resize of '$disk_name' not supported" >&2 exit 1 ;; esac - diff --git a/rpm_spec/core-agent.spec b/rpm_spec/core-agent.spec index 159dd1c..6e47467 100644 --- a/rpm_spec/core-agent.spec +++ b/rpm_spec/core-agent.spec @@ -604,6 +604,7 @@ rm -f %{name}-%{version} /usr/lib/qubes/upgrades-installed-check /usr/lib/qubes/upgrades-status-notify /usr/lib/qubes/qubes-sync-clock +/usr/lib/qubes/resize-rootfs /usr/lib/yum-plugins/yum-qubes-hooks.py* /usr/lib/dracut/dracut.conf.d/30-qubes.conf %dir /usr/lib/qubes/init