/dev/console, /dev/tty和 /dev/tty0之间的差异
1. 简介
在本教程中,我们将首先探索Linux 系统中存在的两个tty 驱动程序;/dev/tty 和*/dev/console*。然后我们会发现*/dev/console*、/dev/tty0和*/dev/tty*的不同角色。
2. /dev/console
/dev/console被称为系统控制台。从历史上看,这是直接连接到 Linux 计算机的终端。现在它提供了将串行终端连接到 Linux 计算机的选项。
让我们看一下*/dev/console*:
$ ls -lah /dev/console
crw------- 1 root root 5, 1 Jun 15 15:25 /dev/console
$ file /dev/console
/dev/console: character special (5/1)
正如我们所见,它是一个位于*/dev*文件夹中的文件。这表示一个字符设备,其标识符由主编号 5 和次编号 1 组成。
查看内核 文档,它指出*/dev/console曾经是一个符号链接。结果,/dev/console*指向另一个设备。
让我们看看*/dev/console*指向什么:
$ cat /sys/devices/virtual/tty/console/active
tty0
嗯,这是否意味着tty0和*/dev/console*是同一个东西?让我们进一步调查。
如果我们查看Linux 串行控制台 的文档,它指出我们可以更改*/dev/console*指向的内容。 让我们尝试这样做:
注意:此示例需要 GRUB 引导加载程序。
$ cat /etc/default/grub | head -n 10
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="ignore_loglevel"
我们必须将*/etc/default/grub*中的 GRUB_CMD_LINE_LINUX=”ignore_loglevel” 行修改为:
GRUB_CMD_LINE_LINUX=”console=/dev/tty2 ignore_loglevel”
让我们更新 grub 配置并重新启动:
$ sudo update-grub
$ sudo reboot
现在让我们看看*/dev/console*指向的位置:
$ cat /sys/devices/virtual/tty/console/active
tty2
我们可以看到*/dev/console*发生了变化。
所以现在我们知道我们可以更改*/dev/console*指向的内容。这个设备的目的是什么?
似乎/dev/console*为内核提供了一个输出其日志消息的有保证的位置,尤其是在引导期间*。此外,切换到单用户模式时使用的设备是*/dev/console*。
让我们通过进入单用户模式来尝试一下:
$ init 1
我们注意到图形已经消失了。我们处于单用户文本模式!
让我们看看我们在哪个tty上:
$ tty
tty2
这与*/dev/console*相同。
正如我们所发现的。/dev/console可以指向多种设备 。内核消息被记录到/dev/console,可以在其中启动登录提示**。
3. /dev/tty0
/dev/tty0指向活动的tty终端。让我们通过一些例子进一步探索。
要访问tty3 ,请按 CTRL + ALT + F3。我们可以通过输入命令tty来确认我们正在使用tty3:
$ tty
/dev/tty3
让我们看看我们是否可以使用 echo 写入控制台:
$ echo "hello world" > /dev/tty3
hello world
好的,到目前为止,我们已经看到可以通过按 CTRL + ALT + FN更改为tty N。但是请注意,键盘上没有 F0 键,但有一个tty0。
让我们试着找到更多关于 tty0 的信息:
$ cat /sys/devices/virtual/tty/tty0/active
tty3
似乎tty0指向tty3。好的,让我们尝试切换到单独的tty。假设tty4。一个快速的快捷方式是按 CTRL + ALT + 右箭头。这会将我们从tty3带到tty4。
$ tty
/dev/tty4
$ cat /sys/devices/virtual/tty/tty0/active
tty4
我们可以看到tty0是当前活动的控制台。
4. /dev/tty
在本节中,我们将探讨*/dev/tty与/dev/tty0的不同之处。/dev/tty*是活动进程的终端的别名,与终端的类型无关。例如,这可以是与bash或sshd关联的终端。
根据 POSIX标准 ,/dev/tty被认为是与进程组关联的终端,而*/dev/tty0*与虚拟终端关联。
让我们看看这在实践中意味着什么。
首先,让我们 ssh 进入本地机器并检查我们的tty:
$ ssh localhost
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-37-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
0 updates can be installed immediately.
0 of these updates are security updates.
Last login: Tue Jun 16 10:59:08 2020 from 127.0.0.1
$ tty
/dev/pts/0
这是一个pts,它是一种不同类型的终端。现在让我们检查打印“hello world”到*/dev/tty0*是否会影响我们的 ssh 会话:
请注意,只有 root 可以写入*/dev/tty0*,因此,我们应该切换到 root:
$ sudo -i
$ echo "hello world" > /dev/tty0
$ # Nothing here was expecting hello world.
$ exit # let's leave root.
不打印消息“hello world”。但是,如果我们检查活动的tty,我们应该能够发现那里打印了“hello world”。 让我们尝试使用*/dev/tty*:
$ echo "hello world" > /dev/tty
hello world
消息“hello world”被打印出来了!这是因为/dev/tty*代表与 ssh session 关联的终端*。无论使用什么终端,/dev/tty都是访问当前终端的快捷方式。