aboutsummaryrefslogtreecommitdiff
path: root/create-image.sh
blob: 1ae60cc0bd7aad8167e88aaea6a150b1444b529a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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