2017-10-18 16:57:39 +02:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
# Possibly resize root device (partition, filesystem), if underlying device was
|
|
|
|
# enlarged.
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
# if underlying root device is read-only, don't do anything
|
|
|
|
if [ "$(blockdev --getro /dev/xvda)" -eq "1" ]; then
|
|
|
|
echo "xvda is read-only, not resizing" >&2
|
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
sysfs_xvda="/sys/class/block/xvda"
|
|
|
|
|
2018-11-29 05:25:09 +01:00
|
|
|
# if root filesystem is already using (almost) the whole disk
|
2019-02-07 20:05:34 +01:00
|
|
|
# 203M for BIOS and /boot data
|
|
|
|
boot_data_size=$((203 * 2 * 1024))
|
|
|
|
# rootfs size is calculated on-the-fly. `df` doesn't work because it doesn't
|
|
|
|
# include fs overhead, and calculating a static size for overhead doesn't work
|
|
|
|
# because that can change dynamically over the filesystem's lifetime.
|
|
|
|
# See QubesOS/qubes-core-agent-linux#146 and QubesOS/qubes-core-agent-linux#152
|
|
|
|
# for more details
|
|
|
|
ext4_block_count=$(dumpe2fs /dev/mapper/dmroot | grep '^Block count:' | sed -E 's/Block count:[[:space:]]+//')
|
|
|
|
ext4_block_size=$(dumpe2fs /dev/mapper/dmroot | grep '^Block size:' | sed -E 's/Block size:[[:space:]]+//')
|
|
|
|
rootfs_size=$((ext4_block_count * ext4_block_size / 512))
|
|
|
|
# 5 MB in 512-byte units for some random extra bits
|
|
|
|
size_margin=$((5 * 1024 * 2))
|
2018-12-02 01:28:14 +01:00
|
|
|
if [ "$(cat $sysfs_xvda/size)" -lt \
|
2019-02-07 20:05:34 +01:00
|
|
|
$(( rootfs_size + boot_data_size + size_margin )) ]; then
|
2018-09-04 17:43:49 +02:00
|
|
|
echo "root filesystem already at $rootfs_size blocks" >&2
|
2017-10-18 16:57:39 +02:00
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
# resize needed, do it
|
|
|
|
/usr/lib/qubes/resize-rootfs
|