home: hub: mkinitfs

Download patch

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
 }