From 9f9c3c56fce8dbbeacacf7fd765850ccf9d252d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Mon, 27 Feb 2017 02:13:42 +0100 Subject: [PATCH] Use online resize2fs, and run filesystem check only when needed When trying offline resize2fs, it require running fsck first, which takes time, especially on large volumes. And in most cases, resize2fs will notice that no action is needed - after wasting some time on fsck. To remedy this, use resize2fs in online mode (on mounted filesystem). And drop fsck call if it fails (filesystem is already mounted read-write, running fsck isn't good idea). But do not remove fsck call completely - still call it, but without '-f' flag, so it run actual check only when really needed (unclean shutdown, last check far in the past etc). Fixes QubesOS/qubes-issues#979 Fixes QubesOS/qubes-issues#2583 --- init/setup-rw.sh | 10 ++++++++++ init/setup-rwdev.sh | 24 ++++-------------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/init/setup-rw.sh b/init/setup-rw.sh index 5a84f9e..9d8c5b9 100755 --- a/init/setup-rw.sh +++ b/init/setup-rw.sh @@ -1,9 +1,19 @@ #!/bin/sh +dev=/dev/xvdb + if mountpoint -q /rw ; then # This means /rw is mounted now. echo "Checking /rw" >&2 + echo "Private device size management: enlarging $dev" >&2 + if content=$(resize2fs "$dev" 2>&1) ; then + echo "Private device size management: resize2fs of $dev succeeded" >&2 + else + echo "Private device size management: resize2fs $dev failed:" >&2 + echo "$content" >&2 + fi + if ! [ -d /rw/config ] ; then echo "Virgin boot of the VM: populating /rw/config" >&2 diff --git a/init/setup-rwdev.sh b/init/setup-rwdev.sh index bf12853..4c51caf 100755 --- a/init/setup-rwdev.sh +++ b/init/setup-rwdev.sh @@ -26,27 +26,11 @@ if [ -e "$dev" ] ; then fi fi - echo "Private device size management: enlarging $dev" >&2 - if content=$(resize2fs "$dev" 2>&1) ; then - echo "Private device size management: resize2fs of $dev succeeded" >&2 + echo "Private device management: checking $dev" >&2 + if content=$(fsck.ext4 -p "$dev" 2>&1) ; then + echo "Private device management: fsck.ext4 of $dev succeeded" >&2 else - echo "Private device size management: resize2fs $dev failed:" >&2 + echo "Private device management: fsck.ext4 $dev failed:" >&2 echo "$content" >&2 - echo "Private device size management: attempting to mark $dev clean" >&2 - if content=$(fsck.ext4 -fp "$dev" 2>&1) ; then - echo "Private device size management: $dev marked clean, enlarging it again" >&2 - if content=$(resize2fs "$dev" 2>&1) ; then - echo "Private device size management: resize2fs of $dev succeeded" >&2 - else - echo "Private device size management: resize2fs of $dev failed even after marking file system clean:" >&2 - echo "$content" >&2 - echo "Private device size management: expect serious trouble ahead" >&2 - fi - else - echo "Private device size management: $dev could not be marked clean:" >&2 - echo "$content" >&2 - echo "Private device size management: expect serious trouble ahead" >&2 - fi fi - fi