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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
#!/bin/sh
# /etc/runit/1 - rawnix system boot
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH
msg() {
printf '\033[1m%s\033[0m\n' "$1"
}
err() {
printf '\033[1;31m%s\033[0m\n' "$1" >&2
}
emergency_shell() {
err "Dropping to emergency shell. Type 'exit' to reboot."
sulogin -p
printf '%s\n' "Rebooting..."
umount -a -r
mount -o remount,ro /
reboot -f
exit 0
}
printf '%s\n' "rawnix is starting..."
msg "Mounting /proc..."
mountpoint -q /proc || mount -t proc proc /proc
msg "Mounting /sys..."
mountpoint -q /sys || mount -t sysfs sysfs /sys
msg "Mounting /run..."
mountpoint -q /run || mount -t tmpfs -o mode=0755,nosuid,nodev tmpfs /run
msg "Mounting /dev..."
if ! mountpoint -q /dev; then
mount -t devtmpfs -o mode=0755,nosuid devtmpfs /dev
else
mount -o remount,mode=0755,nosuid devtmpfs /dev
fi
msg "Mounting /dev/pts..."
mkdir -m 755 -p /dev/pts
mountpoint -q /dev/pts || mount -t devpts -o gid=tty,mode=0620,noexec,nosuid devpts /dev/pts
msg "Mounting /dev/shm..."
mkdir -m 1777 -p /dev/shm
mountpoint -q /dev/shm || mount -t tmpfs -o mode=1777,nosuid,nodev tmpfs /dev/shm
msg "Mounting cgroups v2..."
if ! mountpoint -q /sys/fs/cgroup; then
mount -t cgroup2 none /sys/fs/cgroup 2>/dev/null ||
err "cgroup2 mount failed - containers will not work"
fi
# Bootstrap udevd for coldplug; sv/udevd takes over in stage 2
msg "Starting udevd..."
if udevd --daemon 2>/dev/null; then
msg "Triggering udev coldplug..."
udevadm trigger --type=subsystems --action=add
udevadm trigger --type=devices --action=add
msg "Waiting for udev to settle..."
udevadm settle --timeout=30 || err "Timeout waiting for udev events"
else
err "udevd not available - continuing without hotplug"
fi
msg "Bringing up loopback..."
ip addr add 127.0.0.1/8 dev lo 2>/dev/null
ip link set lo up 2>/dev/null
# LUKS volumes. The root volume is not here -- the initramfs opened it
# before this script existed. These are the extras: /home, data disks.
#
# The file is read on fd 3, not stdin. With `done < /etc/crypttab` the
# passphrase prompt for a keyless entry reads the *next line of the
# crypttab* instead of the console: the volume fails to open with no
# indication why, and the line it ate is never processed.
if command -v cryptsetup >/dev/null 2>&1 && [ -r /etc/crypttab ]; then
msg "Opening LUKS volumes..."
while read -r name device key opts <&3; do
case "$name" in ''|\#*) continue ;; esac
case ",$opts," in *,noauto,*) continue ;; esac
[ -n "$device" ] || { err "crypttab: $name has no device"; continue; }
[ -e "/dev/mapper/$name" ] && continue
case "$device" in
UUID=*|PARTUUID=*|LABEL=*)
_d=$(blkid -t "$device" -o device 2>/dev/null | head -1)
[ -n "$_d" ] || { err "crypttab: $name: no device for $device"; continue; }
device=$_d ;;
esac
case "$key" in
''|none|-) cryptsetup open "$device" "$name" ;;
*) cryptsetup open --key-file "$key" "$device" "$name" ;;
esac || err "Failed to open LUKS volume: $name"
done 3< /etc/crypttab
fi
msg "Remounting / read-only..."
mount -o remount,ro /
if [ -f /forcefsck ]; then
msg "Forced filesystem check..."
FORCEFSCK="-f"
fi
msg "Checking filesystems..."
fsck $FORCEFSCK -A -T -C -a 2>/dev/null
if [ $? -gt 1 ]; then
err "Filesystem check failed!"
err "Please repair manually. Root is mounted read-only."
err "To remount read-write: mount -n -o remount,rw /"
emergency_shell
fi
msg "Remounting / read-write..."
mount -o remount,rw /
msg "Seeding urandom..."
if [ -f /var/lib/random/seed ]; then
cat /var/lib/random/seed >/dev/urandom
rm -f /var/lib/random/seed
fi
msg "Setting shared mount propagation..."
mount --make-rshared /
msg "Activating swap..."
swapon -a 2>/dev/null
msg "Mounting local filesystems..."
mount -a -O no_netdev 2>/dev/null || emergency_shell
mkdir -m 0755 -p /run/user
mkdir -m 1777 -p /run/lock
: >/run/utmp
rm -rf /forcefsck /fastboot /etc/nologin /etc/shutdownpid 2>/dev/null
rm -rf /tmp/* /tmp/.* 2>/dev/null
if [ -x /etc/rc.modules ]; then
msg "Loading kernel modules..."
/etc/rc.modules
fi
if [ -f /etc/sysctl.conf ]; then
msg "Setting kernel parameters..."
sysctl -p >/dev/null 2>&1
fi
if [ -f /etc/hostname ]; then
msg "Setting hostname: $(cat /etc/hostname)"
hostname "$(cat /etc/hostname)"
fi
hwclock --hctosys 2>/dev/null
[ -x /etc/rc.local ] && /etc/rc.local
touch /etc/runit/stopit
chmod 100 /etc/runit/stopit
touch /etc/runit/reboot
chmod 100 /etc/runit/reboot
dmesg > /var/log/boot.log 2>/dev/null
msg "Boot complete."
exit 0
|