blob: f5b602461b5b92267a81b7244bd58a8b9de1ab83 (
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
100
101
102
|
#!/bin/sh
set -e
IMAGE_NAME="anthrill.iso"
ROOTFS_DIR="alpine-rootfs"
MNT_DIR="mnt"
# nix-shell vmtest.nix
if [ ! -f alpine-make-rootfs ]; then
wget https://raw.githubusercontent.com/alpinelinux/alpine-make-rootfs/v0.8.1/alpine-make-rootfs \
&& echo '2b21327244d2d63082dd4780e22549221e298206 alpine-make-rootfs' | sha1sum -c \
|| exit 1
chmod +x alpine-make-rootfs
fi
./alpine-make-rootfs \
--branch v3.22 \
--packages 'linux-lts linux-firmware grub efibootmgr mkinitfs e2fsprogs dosfstools bash' \
--timezone 'Europe/Moscow' \
"$ROOTFS_DIR"
rm -f "$ROOTFS_DIR/sbin/init"
install -Dm755 ../target/release/x86_64-linux-musl/init "$ROOTFS_DIR/sbin/init"
cat > "$ROOTFS_DIR/etc/fstab" <<EOF
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/sda2 / ext4 defaults 0 1
/dev/sda1 /boot/efi vfat umask=0077 0 2
EOF
KERNEL_VERSION=$(ls "$ROOTFS_DIR/lib/modules/" | grep -E '^[0-9]+\.' | head -n1)
if [ -z "$KERNEL_VERSION" ]; then
echo "Err: couldnt find kernel dir in $ROOTFS_DIR/lib/modules/"
exit 1
fi
mkdir -p "$MNT_DIR/root" "$MNT_DIR/boot"
dd if=/dev/zero of="$IMAGE_NAME" bs=1M count=512
sfdisk "$IMAGE_NAME" <<EOF
label: gpt
device: $IMAGE_NAME
unit: sectors
start=2048, size=204800, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, name="EFI System Partition"
start=206848, size=, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, name="Linux filesystem"
EOF
LOOP_DEV=$(sudo losetup --find --show --partscan "$IMAGE_NAME")
BOOT_PART="${LOOP_DEV}p1"
ROOT_PART="${LOOP_DEV}p2"
mkfs.vfat -F 32 "$BOOT_PART"
mkfs.ext4 "$ROOT_PART"
mount "$ROOT_PART" "$MNT_DIR/root"
mount "$BOOT_PART" "$MNT_DIR/boot"
cp -a "$ROOTFS_DIR"/* "$MNT_DIR/root/"
mkdir -p "$MNT_DIR/root/boot/efi"
mount --bind "$MNT_DIR/boot" "$MNT_DIR/root/boot/efi"
chroot "$MNT_DIR/root" mkinitfs "$KERNEL_VERSION"
mkdir -p "$MNT_DIR/root/boot/grub"
cat > "$MNT_DIR/root/boot/grub/grub.cfg" <<GRUBCFG
insmod part_gpt
insmod fat
insmod efi_gop
insmod efi_uga
set timeout=3
menuentry "Anthrill OS" {
linux /vmlinuz-${KERNEL_VERSION} root=/dev/sda2 ro quiet
initrd /initramfs-${KERNEL_VERSION}
}
GRUBCFG
grub-install --target=x86_64-efi \
--efi-directory="$MNT_DIR/boot" \
--boot-directory="$MNT_DIR/root/boot" \
--removable \
--no-nvram \
--bootloader-id=anthrill
umount "$MNT_DIR/root/boot/efi"
umount "$MNT_DIR/boot"
umount "$MNT_DIR/root"
losetup -d "$LOOP_DEV"
echo "Running qemu"
qemu-system-x86_64 \
-machine q35,accel=kvm:tcg \
-cpu host \
-m 1G \
-bios /usr/share/edk2-ovmf/OVMF_CODE.fd \
-drive file="$IMAGE_NAME",format=raw,if=virtio \
-net nic -net user
|