aboutsummaryrefslogtreecommitdiff
path: root/create-image.sh
diff options
context:
space:
mode:
authorPasha <pasha@member.fsf.org>2024-02-29 19:30:30 +0000
committerPasha <pasha@member.fsf.org>2024-02-29 19:30:30 +0000
commit84d199451cf33734003c00c043a1480920f5563b (patch)
tree4655f03b3637184bfb363b4e86d376756e85c9e3 /create-image.sh
downloadcross-hurd-84d199451cf33734003c00c043a1480920f5563b.tar.gz
cross-hurd-84d199451cf33734003c00c043a1480920f5563b.tar.bz2
initial commit
Diffstat (limited to 'create-image.sh')
-rw-r--r--create-image.sh99
1 files changed, 99 insertions, 0 deletions
diff --git a/create-image.sh b/create-image.sh
new file mode 100644
index 0000000..1ae60cc
--- /dev/null
+++ b/create-image.sh
@@ -0,0 +1,99 @@
+#!/bin/bash
+
+. ./vars.sh
+
+LOOP=$(sudo losetup -f)
+LOOPPART="${LOOP}p1"
+IMG=hd.img
+IMG_SIZE=10GB
+BASE_SYS_ROOT=$(basename $SYS_ROOT)
+
+create_image () {
+ print_info "Creating disk image $IMG using $LOOP..."
+ fallocate -l $IMG_SIZE $IMG &&
+ sudo losetup $LOOP $IMG &&
+ sudo parted -a optimal -s $LOOP mklabel msdos &&
+ sudo parted -a optimal -s $LOOP -- mkpart primary ext2 2048s -1 &&
+ sudo parted -s $LOOP -- set 1 boot on &&
+ sudo losetup -d $LOOP &&
+ sudo losetup -P $LOOP $IMG &&
+ sleep 2 &&
+ sudo mkfs.ext2 -o hurd -m 1 -v $LOOPPART
+}
+
+mount_image () {
+ mkdir -p mount &&
+ sudo mount -o rw -t ext2 $LOOPPART mount &&
+ sudo chmod ogu+w -R mount/
+}
+
+copy_files () {
+ print_info "Copying system into mount..."
+ mkdir -p mount/{etc,boot,dev,usr,hurd,include,servers,lib,libexec,proc,sbin,bin,var,root,share} &&
+ mkdir -p mount/var/{run,lib} &&
+ mkdir -p mount/servers/{socket,bus} &&
+ cp -R files/etc/* mount/etc/ &&
+ mkdir -p mount/etc/hurd &&
+ cp files/runsystem.hurd mount/libexec/ &&
+ chmod ogu+x mount/libexec/runsystem.hurd &&
+ mkdir -p mount/boot/grub &&
+ cp files/boot/grub.cfg mount/boot/grub/grub.cfg &&
+ cp $SYSTEM/boot/gnumach.gz mount/boot &&
+ mkdir -p mount/servers &&
+ touch mount/servers/{acpi,exec,crash-kill,default-pager,password,socket,startup,proc,auth,symlink} &&
+ mkdir mount/tmp && chmod 01777 mount/tmp &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/hurd/* mount/hurd/ &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/dev/* mount/dev/ &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/include/* mount/include/ &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/sbin/* mount/sbin/ &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/bin/* mount/bin/ &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/lib/* mount/lib/ &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/share/* mount/share/ &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/etc/* mount/etc/ &&
+ cp -R $SYSTEM/$BASE_SYS_ROOT/libexec/* mount/libexec/ &&
+ cp files/{rc,runsystem} mount/libexec/ &&
+ (if [ -f mount/lib/ld-x86-64.so.1 ]; then
+ ln -sfv /lib/ld-x86-64.so.1 mount/lib/ld.so
+ else
+ ln -sfv /lib/ld.so.1 mount/lib/ld.so
+ fi) &&
+ ln -svf / mount/$BASE_SYS_ROOT
+ ln -svf /bin/bash mount/bin/sh &&
+ cp files/SETUP mount/ &&
+ chmod +x mount/SETUP &&
+ rm -f manifest-$CPU.txt &&
+ pushd mount &&
+ (find . > ../manifest-$CPU.txt || true) &&
+ popd &&
+ # Create a motd message.
+ echo "Welcome to the HURD!" > mount/etc/motd &&
+ echo "Cross-compiled from a $HOST on `date`" >> mount/etc/motd &&
+ # Ensure all files are owned by root inside the system image.
+ sudo chown root:root -R mount/*
+}
+
+install_grub () {
+ print_info "Installing the GRUB on $IMG..."
+ sudo grub-install --target=i386-pc --directory=$SYS_ROOT/lib/grub/i386-pc --boot-directory=$PWD/mount/boot $LOOP
+}
+
+umount_image () {
+ print_info "Umounting $LOOP"
+ sudo umount mount >/dev/null 2>&1 &&
+ sudo losetup -d $LOOP &&
+ rmdir mount
+}
+
+trap umount_image EXIT
+trap umount_image INT
+
+umount mount >/dev/null 2>&1
+sudo losetup -d $LOOP >/dev/null 2>&1
+rm -f $IMG
+create_image &&
+ mount_image &&
+ copy_files &&
+ install_grub &&
+print_info "Disk image available on $IMG" &&
+print_info "Run 'qemu-system-i386 $IMG' to enjoy the Hurd!" &&
+exit 0