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=4GB
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 -svf /lib/ld-x86-64.so.1 mount/lib/ld.so
else
ln -svf /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
|