Skip to content

Commit 2f1f778

Browse files
Adam Simonellipmladek
authored andcommitted
printk: Add an option to allow ttynull to be a default console device
The new option is CONFIG_NULL_TTY_DEFAULT_CONSOLE. if enabled, and CONFIG_VT is disabled, ttynull will become the default primary console device. ttynull will be the only console device usually with this option enabled. Some architectures do call add_preferred_console() which may add another console though. Motivation: Many distributions ship with CONFIG_VT enabled. On tested desktop hardware if CONFIG_VT is disabled, the default console device falls back to /dev/ttyS0 instead of /dev/tty. This could cause issues in user space, and hardware problems: 1. The user space issues include the case where /dev/ttyS0 is disconnected, and the TCGETS ioctl, which some user space libraries use as a probe to determine if a file is a tty, is called on /dev/console and fails. Programs that call isatty() on /dev/console and get an incorrect false value may skip expected logging to /dev/console. 2. The hardware issues include the case if a user has a science instrument or other device connected to the /dev/ttyS0 port, and they were to upgrade to a kernel that is disabling the CONFIG_VT option, kernel logs will then be sent to the device connected to /dev/ttyS0 unless they edit their kernel command line manually. The new CONFIG_NULL_TTY_DEFAULT_CONSOLE option will give users and distribution maintainers an option to avoid this. Disabling CONFIG_VT and enabling CONFIG_NULL_TTY_DEFAULT_CONSOLE will ensure the default kernel console behavior is not dependent on hardware configuration by default, and avoid unexpected new behavior on devices connected to the /dev/ttyS0 serial port. Reviewed-by: Petr Mladek <pmladek@suse.com> Tested-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Adam Simonelli <adamsimonelli@gmail.com> Link: https://lore.kernel.org/r/20250314160749.3286153-2-adamsimonelli@gmail.com [pmladek@suse.com: Fixed indentation of the commit message.] Signed-off-by: Petr Mladek <pmladek@suse.com>
1 parent 4ca6c02 commit 2f1f778

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

Documentation/admin-guide/serial-console.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ If no console device is specified, the first device found capable of
7878
acting as a system console will be used. At this time, the system
7979
first looks for a VGA card and then for a serial port. So if you don't
8080
have a VGA card in your system the first serial port will automatically
81-
become the console.
81+
become the console, unless the kernel is configured with the
82+
CONFIG_NULL_TTY_DEFAULT_CONSOLE option, then it will default to using the
83+
ttynull device.
8284

8385
You will need to create a new device to use ``/dev/console``. The official
8486
``/dev/console`` is now character device 5,1.

drivers/tty/Kconfig

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,24 @@ config NULL_TTY
383383
available or desired.
384384

385385
In order to use this driver, you should redirect the console to this
386-
TTY, or boot the kernel with console=ttynull.
386+
TTY, boot the kernel with console=ttynull, or enable
387+
NULL_TTY_DEFAULT_CONSOLE.
388+
389+
If unsure, say N.
390+
391+
config NULL_TTY_DEFAULT_CONSOLE
392+
bool "Support for console on ttynull"
393+
depends on NULL_TTY=y && !VT_CONSOLE
394+
help
395+
Say Y here if you want the NULL TTY to be used as a /dev/console
396+
device by default.
397+
398+
For example, it might be useful to prevent a VT-less kernel from
399+
writing the system log to a random device connected to the serial
400+
port.
401+
402+
Another console driver still might get preferred via the command
403+
line, SPCR, or the device tree.
387404

388405
If unsure, say N.
389406

kernel/printk/printk.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4277,6 +4277,11 @@ void __init console_init(void)
42774277
initcall_t call;
42784278
initcall_entry_t *ce;
42794279

4280+
#ifdef CONFIG_NULL_TTY_DEFAULT_CONSOLE
4281+
if (!console_set_on_cmdline)
4282+
add_preferred_console("ttynull", 0, NULL);
4283+
#endif
4284+
42804285
/* Setup the default TTY line discipline. */
42814286
n_tty_init();
42824287

0 commit comments

Comments
 (0)