1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:18:12 +00:00

Meta: Re-use existing disk image where possible

This adds support for re-using and re-sizing existing disk images.
Disk images are checked with e2fsck prior to re-use and a new disk
image is automatically created when that check fails.
This commit is contained in:
Gunnar Beutner 2021-04-23 20:55:57 +02:00 committed by Andreas Kling
parent a4c1860bfc
commit 479905be6c

View file

@ -24,38 +24,77 @@ disk_usage() {
} }
DISK_SIZE=$(($(disk_usage "$SERENITY_SOURCE_DIR/Base") + $(disk_usage Root) + 100)) DISK_SIZE=$(($(disk_usage "$SERENITY_SOURCE_DIR/Base") + $(disk_usage Root) + 100))
DISK_SIZE=${DISK_SIZE:-600}
DISK_SIZE_BYTES=$((DISK_SIZE * 1024 * 1024))
unset DISK_SIZE
echo "setting up disk image..." USE_EXISTING=0
qemu-img create _disk_image "${DISK_SIZE:-600}"m || die "could not create disk image"
chown "$SUDO_UID":"$SUDO_GID" _disk_image || die "could not adjust permissions on disk image"
echo "done"
printf "creating new filesystem... " if [ -f _disk_image ]; then
if [ "$(uname -s)" = "OpenBSD" ]; then USE_EXISTING=1
VND=$(vnconfig _disk_image)
(echo "e 0"; echo 83; echo n; echo 0; echo "*"; echo "quit") | fdisk -e "$VND" echo "checking existing image"
newfs_ext2fs -D 128 "/dev/r${VND}i" || die "could not create filesystem" result=0
elif [ "$(uname -s)" = "FreeBSD" ]; then e2fsck -f -y _disk_image || result=$?
MD=$(mdconfig _disk_image) if [ $result -ge 4 ]; then
mke2fs -q -I 128 _disk_image || die "could not create filesystem" rm -f _disk_image
else USE_EXISTING=0
if [ -x /sbin/mke2fs ]; then echo "failed, not using existing image"
/sbin/mke2fs -q -I 128 _disk_image || die "could not create filesystem"
else else
mke2fs -q -I 128 _disk_image || die "could not create filesystem" echo "done"
fi fi
fi fi
echo "done"
if [ $USE_EXISTING -eq 1 ]; then
OLD_DISK_SIZE_BYTES=$(wc -c < _disk_image)
if [ $DISK_SIZE_BYTES -gt "$OLD_DISK_SIZE_BYTES" ]; then
echo "resizing disk image..."
qemu-img resize -f raw _disk_image $DISK_SIZE_BYTES || die "could not resize disk image"
if ! resize2fs _disk_image; then
rm -f _disk_image
USE_EXISTING=0
echo "failed, not using existing image"
fi
echo "done"
fi
fi
if [ $USE_EXISTING -ne 1 ]; then
printf "setting up disk image... "
qemu-img create -q -f raw _disk_image $DISK_SIZE_BYTES || die "could not create disk image"
chown "$SUDO_UID":"$SUDO_GID" _disk_image || die "could not adjust permissions on disk image"
echo "done"
printf "creating new filesystem... "
if [ "$(uname -s)" = "OpenBSD" ]; then
VND=$(vnconfig _disk_image)
(echo "e 0"; echo 83; echo n; echo 0; echo "*"; echo "quit") | fdisk -e "$VND"
newfs_ext2fs -D 128 "/dev/r${VND}i" || die "could not create filesystem"
elif [ "$(uname -s)" = "FreeBSD" ]; then
MD=$(mdconfig _disk_image)
mke2fs -q -I 128 _disk_image || die "could not create filesystem"
else
if [ -x /sbin/mke2fs ]; then
/sbin/mke2fs -q -I 128 _disk_image || die "could not create filesystem"
else
mke2fs -q -I 128 _disk_image || die "could not create filesystem"
fi
fi
echo "done"
fi
printf "mounting filesystem... " printf "mounting filesystem... "
mkdir -p mnt mkdir -p mnt
use_genext2fs=0 use_genext2fs=0
if [ "$(uname -s)" = "Darwin" ]; then if [ "$(uname -s)" = "Darwin" ]; then
fuse-ext2 _disk_image mnt -o rw+,allow_other,uid=501,gid=20 || die "could not mount filesystem" fuse-ext2 _disk_image mnt -o rw+,allow_other,uid=501,gid=20 || die "could not mount filesystem"
echo "done"
elif [ "$(uname -s)" = "OpenBSD" ]; then elif [ "$(uname -s)" = "OpenBSD" ]; then
mount -t ext2fs "/dev/${VND}i" mnt/ || die "could not mount filesystem" mount -t ext2fs "/dev/${VND}i" mnt/ || die "could not mount filesystem"
echo "done"
elif [ "$(uname -s)" = "FreeBSD" ]; then elif [ "$(uname -s)" = "FreeBSD" ]; then
fuse-ext2 -o rw+,direct_io "/dev/${MD}" mnt/ || die "could not mount filesystem" fuse-ext2 -o rw+,direct_io "/dev/${MD}" mnt/ || die "could not mount filesystem"
echo "done"
else else
if ! mount _disk_image mnt/ ; then if ! mount _disk_image mnt/ ; then
if command -v genext2fs 1>/dev/null ; then if command -v genext2fs 1>/dev/null ; then
@ -64,9 +103,10 @@ else
else else
die "could not mount filesystem and genext2fs is missing" die "could not mount filesystem and genext2fs is missing"
fi fi
else
echo "done"
fi fi
fi fi
echo "done"
cleanup() { cleanup() {
if [ -d mnt ]; then if [ -d mnt ]; then
@ -96,7 +136,7 @@ if [ $use_genext2fs = 1 ]; then
# genext2fs is very slow in generating big images, so I use a smaller image here. size can be updated # genext2fs is very slow in generating big images, so I use a smaller image here. size can be updated
# if it's not enough. # if it's not enough.
# not using "-i 128" since it hangs. Serenity handles whatever default this uses instead. # not using "-i 128" since it hangs. Serenity handles whatever default this uses instead.
genext2fs -b 250000 -d mnt _disk_image || die "try increasing image size (genext2fs -b)" genext2fs -B 4096 -b $((DISK_SIZE_BYTES / 4096)) -d mnt _disk_image || die "try increasing image size (genext2fs -b)"
# if using docker with shared mount, file is created as root, so make it writable for users # if using docker with shared mount, file is created as root, so make it writable for users
chmod 0666 _disk_image chmod 0666 _disk_image
fi fi