On a Linux system, what is the difference between
What is their respective use and how do they compare?
From the documentation:
/dev/tty Current TTY device /dev/console System console /dev/tty0 Current virtual console
In the good old days
/dev/console was System Administrator console. And TTYs were users' serial devices attached to a server.
/dev/tty0 represent current display and usually are the same. You can override it for example by adding
grub.conf. After that your
/dev/tty0 is a monitor and
An exercise to show the difference between
Switch to the 2nd console by pressing Ctrl+Alt+F2. Login as
sleep 5; echo tty0 > /dev/tty0. Press Enter and switch to the 3rd console by pressing Alt+F3.
Now switch back to the 2nd console by pressing Alt+F2. Type
sleep 5; echo tty > /dev/tty, press Enter and switch to the 3rd console.
You can see that
tty is the console where process starts, and
tty0 is a always current console.
/dev/console is a virtual set of devices which can be set as a parameter at boot time. It might be redirected to a serial device or a virtual console and by default points to
/dev/tty0. When multiple
console= options are passed to the kernel, the console output will go to more than one device.
/dev/tty0 is the current virtual console
/dev/tty[1-x] is one of the virtual consoles you switch to with control-alt-F1 and so on.
/dev/tty is kind of an alias to the console (physical, virtual or pseudo device, if any) associated to the process that open it. Unlike the other devices, you do not need root privileges to write to it. Note also that processes like the ones launched by
cron and similar batch processes have no usable
/dev/tty, as they aren't associated with any. These processes have a
? in the
TTY column of
ps -ef output.
On Linux, the kernel console can be configured using the
console= boot option. Kernel code which calls
printk() may write messages to it, e.g. when a device is loaded or an error occurs. These messages are also buffered by the kernel. (See also
dmesg). When a console device is found and started, it receives all the previously buffered messages.
You can pass
console= multiple times to configure multiple consoles, and messages will be written to all of them. Apparently you can only select one console of each "type": you can't use both
The kernel documentation specifies
/dev/console as a character device numbered
(5,1). Opening this character device opens the "main" console, which is the last tty in the list of consoles. The first non-kernel process, called
init or "PID 1", is started with
/dev/console connected to standard output, standard error, and standard input.
If none of the consoles are a tty, then opening
/dev/console returns the error
ENODEV ("No such device"). The kernel will
init regardless. For an example of a kernel console which is not a tty device, see
netconsole, or my favourite console the line printer.
You can also see a list of tty consoles by reading
/sys/class/tty/console/active. systemd documentation points out that the first device shown is the main console. The list is actually in reverse order of the kernel command line. The current kernel documentation incorrectly states that the last device shown is the main or "active" console. For some reason it is possible to poll this file for changes (in case console devices are removed?).
systemd-nspawn container, the standard
/dev/console file is replaced with a pseudo-terminal device (PTY). These would be best described as virtual terminal devices. They are created dynamically and are also used to implement graphical terminal emulators like GNOME Terminal, and for remote access like
The Linux TTY device nodes
tty63 are virtual terminals. They are also referred to as VTs, or as virtual consoles. They simulate multiple consoles on top of the physical console device driver. Only one virtual console is shown and controlled at a time. The active terminal can be switched, e.g. using
chvt, or Ctrl+Alt+F1 through however many function keys you have.
You can also read and write to the current VT using
tty0 is the usual kernel console, e.g. if you did not select one explicitly. "The system first looks for a VGA card [which is what VTs run on] and then for a serial port". You can also set the console to a specific VT, e.g.
"If you don't have a VGA card in your system, the first serial port will automatically become the console." A "serial console" like
ttyS0 is probably the most common alternative to
tty0. It is not possible to use the VT system on top of a serial console.
/dev/tty is one of the three standard device files specified by POSIX (
/dev/ is one of the three directory names specified by POSIX). Opening it is equivalent to opening the controlling terminal of the current process. The controlling terminal is set when a process first opens a terminal, at least on Linux. For example, in
init, it would refer to
Detaching from the controlling terminal is one of the steps traditionally required to start a background process, for example a system logging daemon. The steps to become a background process are horribly intricate, but to be specific, the step which detaches from the controlling terminal is the setsid system call. In more modern systems, the init system e.g. systemd starts the service without any controlling terminal in the first place.