summaryrefslogtreecommitdiff
path: root/Meta/build-image-qemu.sh
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@serenityos.org>2020-05-06 18:40:06 +0300
committerAndreas Kling <kling@serenityos.org>2020-05-14 20:15:18 +0200
commit450a2a0f9ce2443bc06445ee018c9860d8cd5fc8 (patch)
treec124a612ef259b764855af5e33c39e0d09ad4df2 /Meta/build-image-qemu.sh
parent49727ffee424d8c0038ce18b91b0bf0ff33b1a4d (diff)
downloadserenity-450a2a0f9ce2443bc06445ee018c9860d8cd5fc8.zip
Build: Switch to CMake :^)
Closes https://github.com/SerenityOS/serenity/issues/2080
Diffstat (limited to 'Meta/build-image-qemu.sh')
-rwxr-xr-xMeta/build-image-qemu.sh88
1 files changed, 88 insertions, 0 deletions
diff --git a/Meta/build-image-qemu.sh b/Meta/build-image-qemu.sh
new file mode 100755
index 0000000000..10ff5384f9
--- /dev/null
+++ b/Meta/build-image-qemu.sh
@@ -0,0 +1,88 @@
+#!/bin/sh
+
+set -e
+
+die() {
+ echo "die: $*"
+ exit 1
+}
+
+if [ "$(id -u)" != 0 ]; then
+ die "this script needs to run as root"
+fi
+if [ "$(uname -s)" = "Darwin" ]; then
+ export PATH="/usr/local/opt/e2fsprogs/bin:$PATH"
+ export PATH="/usr/local/opt/e2fsprogs/sbin:$PATH"
+fi
+echo "setting up disk image..."
+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 [ "$(uname -s)" = "OpenBSD" ]; then
+ VND=$(vnconfig _disk_image)
+ (echo "e 0"; echo 83; echo n; echo 0; echo "*"; echo "quit") | fdisk -e "$VND"
+ mkfs.ext2 -I 128 -F "/dev/${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"
+
+printf "mounting filesystem... "
+mkdir -p mnt
+use_genext2fs=0
+if [ "$(uname -s)" = "Darwin" ]; then
+ fuse-ext2 _disk_image mnt -o rw+,allow_other,uid=501,gid=20 || die "could not mount filesystem"
+elif [ "$(uname -s)" = "OpenBSD" ]; then
+ mount -t ext2fs "/dev/${VND}i" mnt/ || die "could not mount filesystem"
+elif [ "$(uname -s)" = "FreeBSD" ]; then
+ fuse-ext2 -o rw+ "/dev/${MD}" mnt/ || die "could not mount filesystem"
+else
+ if ! mount _disk_image mnt/ ; then
+ if command -v genext2fs 1>/dev/null ; then
+ echo "mount failed but genext2fs exists, use it instead"
+ use_genext2fs=1
+ else
+ die "could not mount filesystem and genext2fs is missing"
+ fi
+ fi
+fi
+echo "done"
+
+cleanup() {
+ if [ -d mnt ]; then
+ if [ $use_genext2fs = 0 ] ; then
+ printf "unmounting filesystem... "
+ umount mnt || ( sleep 1 && sync && umount mnt )
+ fi
+ rmdir mnt
+ if [ "$(uname -s)" = "OpenBSD" ]; then
+ vnconfig -u "$VND"
+ elif [ "$(uname -s)" = "FreeBSD" ]; then
+ mdconfig -d -u "$MD"
+ fi
+ echo "done"
+ fi
+}
+trap cleanup EXIT
+
+script_path=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
+"$script_path/build-root-filesystem.sh"
+
+if [ $use_genext2fs = 1 ]; then
+ # regenerate new image, since genext2fs is unable to reuse the previously written image.
+ # genext2fs is very slow in generating big images, so I use a smaller image here. size can be updated
+ # if it's not enough.
+ # 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)"
+ # if using docker with shared mount, file is created as root, so make it writable for users
+ chmod 0666 _disk_image
+fi