blob: c30fa5e155322b3fd8f86074d88c96c25668c92c (
plain) (
blame)
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
|
#!/bin/bash
set -e
BUSYBOX=busybox-1.34.1
INITRAMFS=$PWD/initramfs.cpio.gz
## Build busybox (static).
test -f $BUSYBOX.tar.bz2 || wget -nc https://busybox.net/downloads/$BUSYBOX.tar.bz2
test -d $BUSYBOX || tar xf $BUSYBOX.tar.bz2
cd $BUSYBOX
make defconfig
sed -i 's/[# ]*CONFIG_STATIC[ =].*/CONFIG_STATIC=y/' .config
make -j$(nproc) busybox
make install
## Create initramfs.
cd _install
# 1. Create initramfs folder structure.
mkdir -p bin sbin etc/init.d proc sys usr/bin usr/sbin dev mnt
# 2. Prepare init.
# By default, initramfs executes /init.
# Optionally change with rdinit= kernel parameter.
ln -sfn sbin/init init
cat <<EOF > etc/inittab
# Initialization after boot.
::sysinit:/etc/init.d/rcS
# Shell on console after user presses key.
::askfirst:/bin/cttyhack /bin/sh -l
# Spawn getty on first virtio console.
::respawn:/sbin/getty hvc0 9600 vt100
EOF
cat <<EOF > etc/init.d/rcS
#!/bin/sh
# Mount devtmpfs, which automatically populates /dev with devices nodes.
# So no mknod for our experiments :}
mount -t devtmpfs none /dev
# Mount procfs and sysfs.
mount -t proc none /proc
mount -t sysfs none /sys
# Set hostname.
hostname virtio-box
EOF
chmod +x etc/init.d/rcS
cat <<EOF > etc/profile
export PS1="\[\e[31m\e[1m\]\u@\h\[\e[0m\] \w # "
EOF
# 3. Create minimal passwd db with 'root' user and password '1234'.
# Mainly used for login on virtual console in this experiments.
echo "root:x:0:0:root:/:/bin/sh" > etc/passwd
echo "root:$(openssl passwd -crypt 1234):0::::::" > etc/shadow
# 4. Create minimal setup for basic networking.
# Virtul DNS from qemu user network.
echo "nameserver 10.0.2.3" > etc/resolv.conf
# Assign static IP address, bring-up interface and define default route.
cat <<EOF >> etc/init.d/rcS
# Assign static IP address to eth0 interface.
ip addr add 10.0.2.15/24 dev eth0
# Bring up eth0 interface.
ip link set dev eth0 up
# Add default route via the host (qemu user networking exposes host at this
# address by default).
ip route add default via 10.0.2.2
EOF
# 5. Created cpio compressed initramfs.
find . -print0 \
| cpio --null -ov --format=newc \
| gzip -9 > $INITRAMFS
|