]> git.proxmox.com Git - pve-installer.git/blob - unconfigured.sh
sys: command: allow terminating the process early from log subroutine
[pve-installer.git] / unconfigured.sh
1 #!/bin/bash
2
3 trap "err_reboot" ERR
4
5 # NOTE: we nowadays get exec'd by the initrd's PID 1, so we're the new PID 1
6
7 parse_cmdline() {
8 proxdebug=0
9 proxtui=0
10 serial=0
11 # shellcheck disable=SC2013 # per word splitting is wanted here
12 for par in $(cat /proc/cmdline); do
13 case $par in
14 proxdebug)
15 proxdebug=1
16 ;;
17 proxtui)
18 proxtui=1
19 ;;
20 console=ttyS*)
21 serial=1
22 ;;
23 esac
24 done;
25 }
26
27 debugsh() {
28 /bin/bash
29 }
30
31 eject_and_reboot() {
32 iso_dev=$(awk '/ iso9660 / {print $1}' /proc/mounts)
33
34 for try in 5 4 3 2 1; do
35 echo "unmounting ISO"
36 if umount -v -a --types iso9660; then
37 break
38 fi
39 if test -n $try; then
40 echo "unmount failed - trying again in 5 seconds"
41 sleep 5
42 fi
43 done
44
45 if [ -n "$iso_dev" ]; then
46 eject "$iso_dev" || true # cannot really work currently, don't care
47 fi
48
49 umount -l -n /dev
50
51 echo "rebooting - please remove the ISO boot media"
52 sleep 3
53 reboot -nf
54 sleep 5
55 echo "trigger reset system request"
56 # we do not expect the reboot above to fail, so rather to avoid kpanic when pid 1 exits
57 echo b > /proc/sysrq-trigger
58 sleep 100
59 }
60
61 real_reboot() {
62 trap - ERR
63
64 if [[ -x /etc/init.d/networking ]]; then
65 /etc/init.d/networking stop
66 fi
67
68 # stop udev (release file handles)
69 /etc/init.d/udev stop
70
71 swap=$(awk '/^\/dev\// { print $1 }' /proc/swaps);
72 if [ -n "$swap" ]; then
73 echo -n "Deactivating swap..."
74 swapoff "$swap"
75 echo "done."
76 fi
77
78 # just to be sure
79 sync
80
81 umount -l -n /target >/dev/null 2>&1
82 umount -l -n /dev/pts
83 umount -l -n /dev/shm
84 umount -l -n /run
85 [ -d /sys/firmware/efi/efivars ] && umount -l -n /sys/firmware/efi/efivars
86
87 # do not unmount proc and sys for now, at least /proc is still required to trigger the actual
88 # reboot, and both are virtual FS only anyway
89
90 echo "Terminate all remaining processes"
91 kill -s TERM -1 # TERMinate all but current init (our self) PID 1
92 sleep 2
93 echo "Kill any remaining processes"
94 kill -s KILL -1 # KILL all but current init (our self) PID 1
95 sleep 0.5
96
97 eject_and_reboot
98
99 exit 0 # shouldn't be reached, kernel will panic in that case
100 }
101
102 err_reboot() {
103 printf "\nInstallation aborted - unable to continue (type exit or CTRL-D to reboot)\n"
104 debugsh || true
105 real_reboot
106 }
107
108 # NOTE: dbus must be launched before this, else iwd cannot work
109 # FIXME: very crude, still needs to actually copy over any iwd config to target
110 handle_wireless() {
111 wireless_found=
112 for iface in /sys/class/net/*; do
113 if [ -d "$iface/wireless" ]; then
114 wireless_found=1
115 fi
116 done
117 if [ -z $wireless_found ]; then
118 return;
119 fi
120
121 if [ -x /usr/libexec/iwd ]; then
122 echo "wireless device(s) found, starting iwd; use 'iwctl' to manage connections (experimental)"
123 /usr/libexec/iwd &
124 else
125 echo "wireless device found but iwd not available, ignoring"
126 fi
127 }
128
129 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
130
131 echo "Starting Proxmox installation"
132
133 # ensure udev doesn't ignores our request; FIXME: not required anymore, as we use switch_root now
134 export SYSTEMD_IGNORE_CHROOT=1
135
136 mount -n -t proc proc /proc
137 mount -n -t sysfs sysfs /sys
138 if [ -d /sys/firmware/efi ]; then
139 echo "EFI boot mode detected, mounting efivars filesystem"
140 mount -n -t efivarfs efivarfs /sys/firmware/efi/efivars
141 fi
142 mount -n -t tmpfs tmpfs /run
143 mkdir -p /run/proxmox-installer
144
145 parse_cmdline
146
147 # always load most common input drivers
148 modprobe -q psmouse || true
149 modprobe -q sermouse || true
150 modprobe -q usbhid || true
151
152 # load device mapper - used by lilo
153 modprobe -q dm_mod || true
154
155 echo "Installing additional hardware drivers"
156 export RUNLEVEL=S
157 export PREVLEVEL=N
158 /etc/init.d/udev start
159
160 mkdir -p /dev/shm
161 mount -t tmpfs tmpfs /dev/shm
162
163 # allow pseudo terminals for debuggin in X
164 mkdir -p /dev/pts
165 mount -vt devpts devpts /dev/pts -o gid=5,mode=620
166
167 # shellcheck disable=SC2207
168 console_dim=($(IFS=' ' stty size)) # [height, width]
169 DPI=96
170 if (("${console_dim[0]}" > 100)) && (("${console_dim[1]}" > 400)); then
171 # heuristic only, high resolution can still mean normal/low DPI if it's a really big screen
172 # FIXME: use `edid-decode` as it can contain physical dimensions to calculate actual dpi?
173 echo "detected huge console, setting bigger font/dpi"
174 DPI=192
175 export GDK_SCALE=2
176 setfont /usr/share/consolefonts/Uni2-Terminus32x16.psf.gz
177 fi
178
179 # set the hostname
180 hostname proxmox
181
182 if command -v dbus-daemon; then
183 echo "starting D-Bus daemon"
184 mkdir /run/dbus
185 dbus-daemon --system --syslog-only
186
187 if [ $proxdebug -ne 0 ]; then # FIXME: better intergration, e.g., use iwgtk?
188 handle_wireless # no-op if not wireless dev is found
189 fi
190 fi
191
192 # we use a trimmed down debootstrap so make busybox tools available to compensate that
193 busybox --install -s || true
194
195 setupcon || echo "setupcon failed, TUI rendering might be garbled - $?"
196
197 if [ $proxdebug -ne 0 ]; then
198 /sbin/agetty -o '-p -- \\u' --noclear tty9 &
199 printf "\nDropping in debug shell before starting installation\n"
200 echo "type 'exit' or press CTRL + D to continue and start the installation wizard"
201 debugsh || true
202 fi
203
204 # try to get ip config with dhcp
205 echo -n "Attempting to get DHCP leases... "
206 dhclient -v
207 echo "done"
208
209 echo "Starting chrony for opportunistic time-sync... "
210 chronyd || echo "starting chrony failed ($?)"
211
212 echo "Starting a root shell on tty3."
213 setsid /sbin/agetty -a root --noclear tty3 &
214
215 /usr/bin/proxmox-low-level-installer dump-env
216
217 if [ $proxtui -ne 0 ]; then
218 if [ "$serial" -ne 0 ]; then
219 echo "Setting terminal size to 80x24 for serial install"
220 stty columns 80 rows 25
221 fi
222
223 echo "Starting the TUI installer"
224 /usr/bin/proxmox-tui-installer 2>/dev/tty2
225 else
226 echo "Starting the installer GUI - see tty2 (CTRL+ALT+F2) for any errors..."
227 xinit -- -dpi "$DPI" -s 0 >/dev/tty2 2>&1
228 fi
229
230 # just to be sure everything is on disk
231 sync
232
233 if [ $proxdebug -ne 0 ]; then
234 printf "\nDebug shell after installation exited (type exit or CTRL-D to reboot)\n"
235 debugsh || true
236 fi
237
238 echo "Installation done, rebooting... "
239
240 killall5 -15
241
242 real_reboot
243
244 # never reached
245 exit 0