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>
This commit is contained in:
Adam Simonelli 2025-03-14 12:07:49 -04:00 committed by Petr Mladek
parent 4ca6c02227
commit 2f1f7787b6
3 changed files with 26 additions and 2 deletions

View File

@ -78,7 +78,9 @@ If no console device is specified, the first device found capable of
acting as a system console will be used. At this time, the system acting as a system console will be used. At this time, the system
first looks for a VGA card and then for a serial port. So if you don't first looks for a VGA card and then for a serial port. So if you don't
have a VGA card in your system the first serial port will automatically have a VGA card in your system the first serial port will automatically
become the console. become the console, unless the kernel is configured with the
CONFIG_NULL_TTY_DEFAULT_CONSOLE option, then it will default to using the
ttynull device.
You will need to create a new device to use ``/dev/console``. The official You will need to create a new device to use ``/dev/console``. The official
``/dev/console`` is now character device 5,1. ``/dev/console`` is now character device 5,1.

View File

@ -383,7 +383,24 @@ config NULL_TTY
available or desired. available or desired.
In order to use this driver, you should redirect the console to this In order to use this driver, you should redirect the console to this
TTY, or boot the kernel with console=ttynull. TTY, boot the kernel with console=ttynull, or enable
NULL_TTY_DEFAULT_CONSOLE.
If unsure, say N.
config NULL_TTY_DEFAULT_CONSOLE
bool "Support for console on ttynull"
depends on NULL_TTY=y && !VT_CONSOLE
help
Say Y here if you want the NULL TTY to be used as a /dev/console
device by default.
For example, it might be useful to prevent a VT-less kernel from
writing the system log to a random device connected to the serial
port.
Another console driver still might get preferred via the command
line, SPCR, or the device tree.
If unsure, say N. If unsure, say N.

View File

@ -4277,6 +4277,11 @@ void __init console_init(void)
initcall_t call; initcall_t call;
initcall_entry_t *ce; initcall_entry_t *ce;
#ifdef CONFIG_NULL_TTY_DEFAULT_CONSOLE
if (!console_set_on_cmdline)
add_preferred_console("ttynull", 0, NULL);
#endif
/* Setup the default TTY line discipline. */ /* Setup the default TTY line discipline. */
n_tty_init(); n_tty_init();