ref: 960871e8be1e5c28f594aaa5acffbbd58ee85270
parent: 10c9583d1763f9052ee1f5734740e209ee2aee57
author: Natanael Copa <ncopa@alpinelinux.org>
date: Wed Nov 29 17:18:17 CST 2023
initramfs-init: allow disabling auto serial tty Automatically enabling detected serial consoles may collide with embedded platform which uses serial peripherals. Disable the autodetection if: - apkovl is used (previously detected login tty should be saved) - boot option `autodetect=no` is set.. The autodetect boot option has not been used since the introduction of nlplug-findfs, in commit ba27888b4576 (init: refactor to use nlplug-findfs). fixes: https://gitlab.alpinelinux.org/alpine/mkinitfs/-/issues/46 ref: https://gitlab.alpinelinux.org/alpine/aports/-/issues/15265 ref: https://gitlab.alpinelinux.org/alpine/mkinitfs/-/merge_requests/135
--- a/initramfs-init.in
+++ b/initramfs-init.in
@@ -105,6 +105,9 @@
}
detect_serial_consoles() {
+ if [ -f "$ovl" ] || [ "$KOPT_autodetect" = "no" ]; then
+ return
+ fi
local n=$(awk '$7 ~ /CTS/ || $7 ~ /DSR/ { print $1 }' "$ROOT"/proc/tty/driver/serial 2>/dev/null)
if [ -n "$n" ]; then
echo ttyS${n%:}
--- a/tests/initramfs-init.test
+++ b/tests/initramfs-init.test
@@ -10,6 +10,8 @@
initramfs_init_tmpfs_root_net_apkovl \
initramfs_init_tmpfs_root_console_serial \
initramfs_init_tmpfs_root_autodetect_serial \
+ initramfs_init_tmpfs_root_disable_autodetect_serial \
+ initramfs_init_tmpfs_root_apkovl_autodetect_serial \
initramfs_init_tmpfs_root_remount_opts \
initramfs_init_tmpfs_root_tiny_cloud \
initramfs_init_tmpfs_root_tiny_cloud_disabled \
@@ -39,6 +41,24 @@
EOF
}
+fake_serial_devices() {
+ mkdir -p proc/tty/driver
+ cat > proc/tty/driver/serial <<-EOF
+ 0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 CTS|DSR
+ 1: uart:16550A port:000002F8 irq:3 tx:103 rx:0 RTS|DTR
+ 2: uart:unknown port:000003E8 irq:4
+ 3: uart:unknown port:000002E8 irq:3
+ EOF
+
+ mkdir -p sys/devices/platform/ARMH0011:00/tty/ttyAMA0
+ ln -s ../../../ARMH0011:00 \
+ sys/devices/platform/ARMH0011:00/tty/ttyAMA0/device
+
+ mkdir -p sys/class/tty/
+ ln -s ../../devices/platform/ARMH0011:00/tty/ttyAMA0 \
+ sys/class/tty/ttyAMA0
+}
+
initramfs_init_cmdline_root_body() {
fake_cmdline "root=/dev/vda1"
fake_switch_root
@@ -123,33 +143,58 @@
fake_cmdline ""
fake_switch_root
fake_sysroot_init
+ fake_serial_devices
fake_bin stty <<-EOF
#!/bin/sh
true
EOF
- mkdir -p proc/tty/driver
- cat > proc/tty/driver/serial <<-EOF
- 0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 CTS|DSR
- 1: uart:16550A port:000002F8 irq:3 tx:103 rx:0 RTS|DTR
- 2: uart:unknown port:000003E8 irq:4
- 3: uart:unknown port:000002E8 irq:3
+ atf_check \
+ -o ignore \
+ initramfs-init
+ atf_check \
+ -o match:"ttyS0::respawn:/sbin/getty" \
+ -o match:"ttyAMA0::respawn:/sbin/getty" \
+ cat sysroot/etc/inittab
+}
+
+initramfs_init_tmpfs_root_disable_autodetect_serial_body() {
+ fake_cmdline "autodetect=no"
+ fake_switch_root
+ fake_sysroot_init
+ fake_serial_devices
+ fake_bin stty <<-EOF
+ #!/bin/sh
+ true
EOF
- mkdir -p sys/devices/platform/ARMH0011:00/tty/ttyAMA0
- ln -s ../../../ARMH0011:00 \
- sys/devices/platform/ARMH0011:00/tty/ttyAMA0/device
+ atf_check \
+ -o ignore \
+ initramfs-init
+ atf_check \
+ -o not-match:"ttyS0::respawn:/sbin/getty" \
+ -o not-match:"ttyAMA0::respawn:/sbin/getty" \
+ cat sysroot/etc/inittab
+}
- mkdir -p sys/class/tty/
- ln -s ../../devices/platform/ARMH0011:00/tty/ttyAMA0 \
- sys/class/tty/ttyAMA0
+initramfs_init_tmpfs_root_apkovl_autodetect_serial_body() {
+ touch foo && tar -zcf foo.tar.gz foo
+ fake_cmdline "apkovl=foo.tar.gz"
+ fake_switch_root
+ fake_sysroot_init
+ fake_serial_devices
+ fake_bin stty <<-EOF
+ #!/bin/sh
+ true
+ EOF
+
atf_check \
-o ignore \
initramfs-init
atf_check \
- -o match:"ttyS0::respawn:/sbin/getty" \
- -o match:"ttyAMA0::respawn:/sbin/getty" \
+ -o not-match:"ttyS0::respawn:/sbin/getty" \
+ -o not-match:"ttyAMA0::respawn:/sbin/getty" \
cat sysroot/etc/inittab
}