ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux TTY完全解读:tty、ttyS、pts、console的区别与实战

Linux TTY完全解读:tty、ttyS、pts、console的区别与实战 前阵子帮人调一块开发板对方很着急地说“TTY 没有输出”。我过去一看他把内核日志工具的输出目标写成了 /dev/ttyS0但板子明明是通过虚拟终端登录的更要命的是他以为 ttyS0 的意思是“终端 0 号”。这种误会我在不同项目里见过太多次了。Linux 的 /dev 目录下面躺着 tty、tty0、tty1、ttyS0、ttyUSB0、pts/0、ptmx、console 这一大堆长得差不多的设备节点名字只差一两个字母含义却是天壤之别。这篇文章就把 Linux TTY 里最基础的几类一次讲透tty*、ttyS*、ttys*也就是 pts/N、console。不管你是做运维、搞嵌入式、写驱动还是在备考 Linux 面试这几个概念迟早都会撞上。1. TTY不是“一个东西”先弄清它从哪来、到哪去1.1 电传打字机留下的名字TTY 其实是 Teletypewriter电传打字机的缩写。上世纪中叶计算机还没有屏幕和键盘人机交互靠的是电传打字机这种机械设备你敲进去的字符通过线缆送到计算机计算结果再由它打印在纸上。Teletype 公司当年太火了以至于后来 Unix 系统干脆把所有终端设备都抽象成了 tty 设备。这个历史包袱一路背到了 Linux。现在的 Linux 里TTY 已经不再特指某个物理设备而是一整套终端子系统它负责处理输入输出、行编辑、回车换行转换、信号生成比如 CtrlC 发 SIGINT这些事。你在终端里敲下的每一个字符都会经过这一层才能到达 Shell 或应用程序。理解这个背景很关键。因为后面要讲的 tty*、ttyS*、ttys*、console本质上都是 TTY 子系统在不同场景下的“化身”。它们共享同一套抽象机制但在设备命名、用途、配置方式上完全不同。打个比方TTY 统一标准就像家里墙上的插座规格但插座上具体插的是台灯、充电器还是路由器那是另一回事。1.2 Linux里的TTY家族四种终端各管一摊Linux 里的 TTY 家族大概可以分成四类正好对应我们标题里那四个关键词类型设备名示例典型场景驱动来源虚拟终端/dev/tty1、/dev/tty2本机键盘显示器登录CtrlAltF1~F6切换VT 子系统串口终端/dev/ttyS0、/dev/ttyUSB0开发板调试、网络设备 console 口、串口登录8250/16550 UART、USB 转串口伪终端/dev/pts/0、/dev/ptmxSSH 远程登录、终端模拟器、screen/tmux、docker execUnix98 PTY内核控制台/dev/console内核日志输出、单用户模式救援内核 console 机制这四类设备的关系不是互斥的而是可以叠加。比如你用 SSH 登录一台服务器SSH 服务端会创建一个伪终端你的会话就挂在 /dev/pts/0 上而如果这台服务器的内核启动参数里写了 consolettyS0那么所有内核日志又会被送到串口上去。把这张表记在脑子里后面排查问题就不会绕弯子。2. tty*、ttyS*、ttys*、console逐一对号入座2.1 tty0、tty1~tty63本机显示器和键盘的虚拟终端先看最“本机”的一类/dev/tty0 和 /dev/tty1~tty63也就是虚拟终端Virtual Terminal简称 VT。在 Linux 里即使你只有一个物理键盘和一台显示器内核也能通过软件模拟出最多 64 个“虚拟终端”每个都像是一台独立的字符终端。tty1 到 tty6 默认就是按 CtrlAltF1 到 F6 切换出来的登录界面。如果你装的是带图形界面的发行版图形会话通常占一个 tty常见是 tty1 或 tty2剩下几个 tty 仍然可以按组合键切过去做本地登录。这里有个特殊节点/dev/tty0。它代表“当前正在前台显示的虚拟终端”是一个动态别名。你切到 tty3tty0 就指向 tty3切回 tty1tty0 又指向 tty1。内核打印的信息默认会往 tty0 上刷所以你能在屏幕上看到启动日志。从设备号上看tty0 是 4:0tty1 是 4:1tty2 是 4:2依次类推。设备号是个很重要的判断依据。你可以用 ls -l 看[rootlocalhost ~]# ls -l /dev/tty0 /dev/tty1 /dev/tty2 crw------- 1 root root 4, 0 3月 12 10:00 /dev/tty0 crw------- 1 root root 4, 1 3月 12 10:00 /dev/tty1 crw------- 1 root root 4, 2 3月 12 10:00 /dev/tty2主设备号 4 说明它们都属于虚拟终端驱动drivers/tty/vt/vt.c 那一套次设备号区分不同编号的终端。判断设备属于哪一类主设备号比名字更可靠因为 Linux 设备名是可以由驱动自定义的。2.2 ttyS0、ttyS1串口终端嵌入式调试的命脉ttyS* 是串口终端这里的 S 就是 Serial。在标准 x86 PC 上ttyS0 对应主板上的 COM1传统 I/O 端口 0x3F8、IRQ4ttyS1 对应 COM2以此类推。设备号规则是主设备号 4、次设备号从 64 开始所以[rootlocalhost ~]# ls -l /dev/ttyS0 crw-rw---- 1 root dialout 4, 64 3月 12 10:00 /dev/ttyS0看到 4:64 这种主次设备号基本可以确定就是串口。驱动层是 8250/16550 UART 驱动这是 PC 串口几十年的老标准。真正让 ttyS* 大放异彩的是嵌入式领域。开发板、路由器、交换机、工控机几乎都有串口调试口。嵌入式 Linux 里串口往往是唯一的调试通道——因为板子在启动早期可能还没有显示器、没有网卡驱动但串口 UART 很早就初始化好了。你在开发板上经常看到的内核启动参数 consolettyS0,115200就是把内核日志引导到串口上来。不过要注意嵌入式平台不一定都叫 ttyS*。不同 SoC 的串口驱动会注册自己的设备名树莓派早期是 ttyAMA0PL011 UART新固件也叫 ttyS0/ttyAMA0NXP i.MX 系列是 ttymxc0高通平台是 ttyMSM0全志、瑞芯微很多仍是 ttyS0走的是 8250 兼容驱动还有一类非常常见的 USB 转串口设备/dev/ttyUSB0CH340、CP2102、FT232 这些芯片和 /dev/ttyACM0CDC ACM 设备比如 Arduino。连网络设备 console 口、刷开发板 bootloader绝大多数情况下你电脑上会跳出一个 ttyUSB0而不是 ttyS0。这个细节很多人第一次接触时会懵怎么文档里写 ttyS0我插上电脑却是 ttyUSB0其实是两层映射USB 转串口线把 USB 协议桥接成串口 UART 信号内核里对应的是一个虚拟串口驱动设备节点名就叫 /dev/ttyUSB0而文档里写的 ttyS0 是开发板那一侧的串口名。你本机要用的是 ttyUSB0板子上才是 ttyS0两者通过一根导线连接。2.3 ttys*pts/NSSH和终端模拟器背后的伪终端先澄清一个最容易被绕晕的名字问题。标题里写的“ttys*”严格说在 Linux 设备文件里并不存在一个叫“ttys0”的节点。很多人把伪终端从设备pty slave简写成“ttys”于是和“ttyS*”串口终端撞了车。这个缩写习惯在老 Unix 资料里很常见但在 Linux 一切的真相是伪终端从设备叫 /dev/pts/N。伪终端英文 Pseudo Terminal简称 pty。它不直接对应任何物理硬件而是内核模拟出来的“虚拟的终端设备”目的是给那些需要终端行为的程序提供一个标准接口。典型的场景是 SSH你本地的终端窗口 → SSH 客户端 → 网络 → SSH 服务端 → 内核分配一个 pty → 你要运行的 bash 挂在 pty 上。在 Linux 的 Unix98 PTY 实现里伪终端分两端主端master/dev/ptmx负责“模拟另一端”的动作SSH 服务端、终端模拟器、screen/tmux 这些程序打开它从端slave/dev/pts/N看起来像个普通终端设备Shell 和普通程序用的是它整个结构可以理解成一根虚拟的“双向水管”程序往主端写的内容会从从端读出来用户往从端输入的内容会从主端收到。中间再经过 TTY 子系统的行规程处理回车换行、CtrlC、CtrlZ 这些都要经过行规程。设备名和主次设备号长这样[rootlocalhost ~]# ls -l /dev/ptmx /dev/pts/0 crw-rw-rw- 1 root tty 5, 2 3月 12 10:00 /dev/ptmx crw--w---- 1 root tty 136, 0 3月 12 10:00 /dev/pts/0/dev/ptmx 的主设备号是 5次设备号 2而 /dev/pts/0 一般是主设备号 136次设备号 0pts/1 就是 136:1。在容器、docker exec、Xterm、VS Code 集成终端里你看到的都是这类节点。怎么确认自己当前挂在哪个终端SSH 登录后敲 tty 命令十有八九输出 /dev/pts/0 或者 /dev/pts/1就是这个伪终端从设备。很多初学者会困惑“我不是在终端登录吗怎么是 pts”这就是还没理解伪终端的角色——SSH 会话本来就不会直接占用物理虚拟终端而是占一个 pty。另外老式 BSD 风格的 pty 命名里从设备确实出现过 tty 开头加字母的形式比如 ttyp0、ttyq0、ttyr1。所以你在老书上看到 tty 后面跟字母编号的多半就是伪终端从设备。这也是“ttys*”这个说法容易让人对不上号的原因。我的建议是在 Linux 上遇到“ttys*”就当它指 /dev/pts/N 或 pty slave 端遇到“ttyS*”就记住它是串口二者别混。2.4 /dev/console内核日志的“总出口”也是一个逻辑概念最后是 console这也是被误解最深的词。在 Linux 语境下/dev/console 不是一个“终端设备”而是内核控制台kernel console主要职责是接收内核日志输出printk同时在单用户模式、系统崩溃时提供救援入口。从设备节点看[rootlocalhost ~]# ls -l /dev/console crw------- 1 root root 5, 1 3月 12 10:00 /dev/console主设备号 5次设备号 1这是一个独立于 tty 设备之外的规则。它特殊在/dev/console 本身不做具体的硬件交互而是由内核在启动时把“真正的输出设备”绑定到它背后。这个绑定的设备由内核启动参数 console 决定。举个例子。你的内核启动参数如果写成consoletty0 consolettyS0,115200n8效果是内核日志同时输出到 tty0本机屏幕和 ttyS0串口。这正是调试开发板时最推荐的配置——既有串口日志又不丢失本地屏幕输出。而如果只写 consolettyS0,115200那么本例屏幕上就看不到任何内核日志了只剩下串口输出。再强调一个细节/dev/console 指向哪个设备取决定“最后一个成功注册的 console 参数”不是第一个。所以上面那条命令行里ttyS0 是后写的/dev/console 就指向串口。用户空间程序在 /dev/console 上读写相当于读写内核当前的主控制台设备。现实中“console”这个单词还有很多别的用法很容易把人带偏网络设备的 console 口这是一个物理串口用来做设备本地管理。连到电脑上你操作的是 /dev/ttyUSB0 或 /dev/ttyS0而不是 /dev/console。虚拟化平台的控制台如 VNC/Web Console一般是虚拟终端 tty* 的远程映射。带外管理口BMC/IPMI独立的管理通道跟 TTY 的关系更远。浏览器开发者工具的 Console那是 JavaScript 调试台和 Linux TTY 八竿子打不着。所以遇到“console”字样先分清是内核概念、物理串口、还是其他领域借用词再下手配置。3. 实操3分钟确认你正在用哪一个终端3.1 一条命令看穿你正用着哪个终端最简单粗暴的办法敲 tty[rootlocalhost ~]# tty /dev/pts/0如果你是在本机按 CtrlAltF2 登录的tty 会输出 /dev/tty2通过串口登录的输出 /dev/ttyS0SSH 登录的输出 /dev/pts/N。tty 命令的原理就是调用 ttyname(3) 找到当前进程控制终端对应的设备名底层查的是 /proc/self/fd/0 指向的设备。再配合 who 和 w 看全局[rootlocalhost ~]# who root tty1 2025-03-12 09:30 (:0) root pts/0 2025-03-12 10:02 (192.168.1.100) root ttyS0 2025-03-12 10:05 [rootlocalhost ~]# w 10:05:12 up 3 days, 4:20, 3 users, load average: 0.01, 0.03, 0.05 USER TTY FROM LOGIN IDLE JCPU PCPU WHAT root tty1 :0 09:30 3days 1:02 0.01s /usr/lib/xdg-desktop-portal-gtk root pts/0 192.168.1.100 10:02 3:02 0.01s 0.00s sshd: rootpts/0 root ttyS0 10:05 0.00s 0.01s 0.00s -bash这张表非常直观tty1 是图形会话pts/0 是来自 192.168.1.100 的 SSH 会话ttyS0 是串口登录。通过 FROM 列还能看到远程来源排查谁登录在哪个终端这两个命令就够用。3.2 读懂设备节点和/proc/tty/drivers这张表设备节点只是“门牌”真正能看清 TTY 驱动全貌的是 /proc/tty/drivers。这个虚拟文件列出了当前内核注册了哪些 tty 驱动、设备名、主次设备号范围、类型[rootlocalhost ~]# cat /proc/tty/drivers /dev/tty /dev/tty 5 0 system:/dev/tty /dev/console /dev/console 5 1 system:console /dev/ptmx /dev/ptmx 5 2 system /dev/vc/0 /dev/tty0 4 0 system:vtmaster /dev/vc/1 /dev/tty1 4 1 console:/dev/tty1 /dev/vc/2 /dev/tty2 4 2 console:/dev/tty2 /dev/ttyS0 /dev/ttyS0 4 64 serial /dev/ttyS1 /dev/ttyS1 4 65 serial /dev/pts/0 /dev/pts/0 136 0 PTY注意两点第一/dev/tty 主设备号 5 次设备号 0它是进程控制终端的“别名”任何进程打开 /dev/tty 都等于打开自己的控制终端第二/proc/tty/drivers 里的 /dev/pts/0 那一行主设备号 136 次设备号 0说明这是 PTY 从端。排查问题时我习惯先 cat /proc/tty/drivers 确认驱动有没有注册再用 ls -l 看设备节点是否存在。如果驱动注册了但节点没创建用 mknod 可以手工补但我建议先查 udev 规则因为大部分设备节点都是 udev 自动管理的。3.3 从内核启动日志里追查console的去向内核到底把日志发到了哪里启动时会有明确记录。第一件事是看 /proc/cmdline[rootlocalhost ~]# cat /proc/cmdline BOOT_IMAGE/vmlinuz-5.15.0-91-generic root/dev/mapper/ubuntu--vg-root ro consoletty0 consolettyS0,115200n8 quiet这里能看到 consoletty0 和 consolettyS0,115200n8 两个参数说明日志是屏串双发的。然后 dmesg 里找 console 相关行[rootlocalhost ~]# dmesg | grep -i console [ 0.000000] Kernel command line: ... consoletty0 consolettyS0,115200n8 quiet [ 0.000000] printk: console [tty0-1] enabled [ 0.000000] 8250.0: ttyS0 at MMIO 0x3f8 (irq 4, base_baud 115200) is a 16550A [ 0.000000] printk: console [ttyS0] enabledprintk: console [tty0-1] enabled 和 console [ttyS0] enabled 这两行就是控制台注册成功的信息。如果只有 tty0 而没有 ttyS0说明串口控制台没有起来——常见原因要么是 console 参数没写对波特率、设备名要么是串口驱动在这个平台上不叫 ttyS0。想快速验证设备通不通可以直接往设备节点写数据# 往虚拟终端写本机切到 tty1 能看到 hello echo hello /dev/tty1 # 往串口写用串口线连着的另一端应能收到 echo hello /dev/ttyS0前者注意别在 X 图形界面的会话里乱试因为 X 占用的 tty 上直接写文本可能显示不出来后者注意别把系统正在用的 console 口随意占用以免干扰正在进行的会话。4. 实战排坑串口乱码、console丢失、pts混淆4.1 串口登录无输出、乱码先按这个清单查串口调试是嵌入式开发的高频场景也是问题最多的环节。我自己踩过的坑包括波特率不对、USB 转串口芯片驱动没装、RX/TX 接反、getty 没监听串口。下面这个排查顺序基本能覆盖 90% 的情况检查项操作/要点典型错误确认设备名ls /dev/ttyUSB* 或 ls /dev/ttyS*用 dmesg | grep tty 看内核识别误选 /dev/ttyS0实际是 /dev/ttyUSB0检查权限当前用户加入 dialout 组或直接用 sudoPermission denied核对串口参数stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -crtscts8N1 没设对出现乱码连接软件minicom -D /dev/ttyUSB0 -b 115200或 screen /dev/ttyUSB0 115200参数写错位置波特率不对确认 gettysystemctl status serial-gettyttyS0.service串口上没有登录提示符检查接线RX 接对方 TXTX 接对方 RXGND 共地没输出任何字符串口乱码十有八九是两边参数不一致一端 115200 8N1另一端却设成了 9600 8N1或者数据位/校验位错了。可以用 stty 强制设置一遍再连stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -crtscts还有一个反直觉的细节很多 USB 转串口线质量参差不齐芯片虚焊、线序错误会造成“设备节点能出现但怎么发都没回应”。这时候换个线、换个 USB 口试成本最低排查价值最高。如果是开发板本身的串口没输出先确认板上 console 参数是否在 bootloader 阶段就正确传达给了内核。多数 U-Boot 的环境变量里有 bootargs 或 bootcmd其中包含 consolettyS0,115200 这类配置。可以在 U-Boot 提示符下用 printenv 看 bootargs没有就 setenv 补上再 boot。4.2 console参数写错开机日志“人间蒸发”开发板最常见的“诡异现象”之一是明明能启动但屏幕上黑漆漆一片什么日志都没有。这时候第一个检查项就是 /proc/cmdline或者说 bootloader 传给内核的 console 参数。比如你的板子打算用串口调试但内核参数里漏写了 consolettyS0,115200那么内核日志默认往 tty0虚拟终端送。如果板子根本没有接显示器、也没有 VT 子系统日志就真的“没人接单”等于全部丢弃。反过来如果你把 consolettyS0 写成了 consoletty0串口同样什么都收不到。参数名写错比如 console 拼成 consol也会静默失败因为内核解析时会忽略无法识别的参数。另外提一个配置原则调试设备的时候尽量保留双控制台consoletty0 consolettyS0,115200n8这样既有串口日志也不影响本机屏幕输出。生产环境再根据需求精简。还有一个细节n8 跟在波特率后面意思是 no parity, 8 data bits。省去不写有时也能用但写全更稳妥因为不同 bootloader 对缺省值理解可能不一样。万一 bootargs 被改坏了导致串口没有输出而你又需要恢复通常办法是进入 bootloader开发板一般按住某个按键或上电瞬间打断自动启动流程在 U-Boot 命令行里重新设置 bootargs 并保存。x86 环境下则是通过 GRUB 编辑启动项临时在 linux 那行末尾追加 consolettyS0,115200。4.3 虚拟终端和伪终端千万别混为一谈我遇到过不止一个同事把“虚拟终端”和“伪终端”当成一回事。实际上这俩虽然都有“终端”两个字架构和用途完全不同虚拟终端VT是内核直接管理的对应物理键盘显示器设备是 /dev/tty1~tty63。伪终端pty是内核提供给用户程序的模拟终端设备是 /dev/pts/N 和 /dev/ptmxSSH、Xterm、screen 全是靠它。一个辨识技巧你在 SSH 会话里执行 ps 看会话sshd 会带着一个 pts/N 的子进程而你如果在图形界面的本机终端软件里敲命令那个终端软件下面也是 pty。真正直接连在 tty1 上的只有本机 CtrlAltF1 那种登录画面。这个区别在写脚本的时候尤其重要。比如判断 stdin 是不是交互终端if [ -t 0 ]; then echo stdin is a tty else echo stdin is not a tty fi在有 pty 的交互式 SSH 会话里[ -t 0 ] 是成立的但如果你用管道把数据喂给脚本cat file | script-t 0 就不成立。很多程序报 “stdin is not a tty” 或 “not a terminal”就是因为它要求 stdin 必须挂在真实的终端设备上而管道、文件都不满足条件。还有 /dev/tty 这个“别名设备”它总是引用当前进程的控制终端。所以即使你在脚本里重定向了 stdin/stdout只要进程还有控制终端写 /dev/tty 仍然能把东西打到终端上。但当进程通过 setsid 脱离了会话、没有了控制终端再 open /dev/tty 就会报错。no-hup、后台 daemon 化之后的进程经常遇到这个情况排查时别被绕晕。4.4 伪终端自增要从重启算起是多少一个容易记混的数字不少朋友问/dev/pts/0、pts/1 这些编号是怎么排的答案是每次新开一个 pty内核就分配一个递增的次设备号。SSH 连一次可能占到 pts/0再开一个 SSH 占 pts/1。你断开一个再连新会话往往会复用一个空闲编号所以编号不是永久固定的。判断“我这次会话是不是 pts/0”最准的办法还是 tty 命令别凭经验猜。在容器、tmux、screen 层层嵌套里tty 命令的输出最能说明问题——最外层 SSH 可能是 pts/0tmux 内的新会话可能是 pts/1 或更高。理解这层关系你排查多会话交叉干扰、错杀进程时就不会找错终端。5. 经验谈嵌入式串口与网络设备console口调试套路5.1 嵌入式开发板串口调试的几个固定动作做嵌入式 Linux串口调试是基本功。我自己的固定流程是这样的第一步确认串口设备。插上 USB 转串口线dmesg | grep -i usb 或 dmesg | grep tty看是 /dev/ttyUSB0 还是 /dev/ttyACM0。注意有些板子用 CP2102、CH340、FT232 芯片电脑上表现都是 ttyUSB0但各家稳定性有差异FT232 在高速率下更稳。第二步确认板子串口参数。一般 bootloader 默认 115200 8N1网络设备很多是 9600 8N1。不知道参数时按常见顺序试115200、57600、38400、19200、9600总有一个对得上。用 screen 或者 minicom 直接连逐个波特率试看到有提示符输出就说明对了。第三步验证链路。连上后先回车看有没有 login 提示符。没有就检查接线开发板上的 TX 要接 USB 转串口线的 RXRX 接 TXGND 接 GND这是最容易反的地方。很多 USB 转串口线自带 TX/RX 指示灯通信正常时灯会闪这是硬件链路是否正常的快速判断手段。第四步确认内核 console。在 U-Boot 或者 bootloader 阶段能看到输出但一进内核就没输出大概率是 bootargs 里没有 console 参数或者参数里的设备名和实际驱动不一致。比如 i.MX 平台驱动注册的是 ttymxc0你还写 consolettyS0那自然没日志。检查 /proc/tty/drivers 就能看到驱动注册名。第五步把串口变成可登录终端。如果只是看内核日志有 console 就够了但想在串口上登录 Shell还需要 gettysystemctl enable --now serial-gettyttyS0.servicesystemd 会为 serial-gettyttyS0.service 在串口上启动登录程序。注意服务名里的 ttyS0 要和实际设备名严格一致否则服务会起不来。5.2 网络设备console口连接的通用流程很多商用路由器、交换机、防火墙都有一个物理 console 口长相可能是 RJ45、DB9 或者 USB 小口。这个口本质上是串口用来做设备本地管理和急救恢复。连它的流程和连开发板差不多console 线一头插设备 console 口另一头通常是 USB 或 DB9 接电脑。插入后电脑识别出 /dev/ttyUSB0然后用串口软件连接。网络设备默认串口参数绝大多数是 9600-8-N-1无流控。连接后能看到设备的命令行提示符比如常见的 或 #。这里有一个容易踩的坑console 线分“反线”和“直通线”某些设备必须用反线rollover cable连接。我曾在实验室里拿着一条普通网线当 console 线插了半天灯不亮、口不通最后换了根反线立刻就好了。买 console 线时确认线序或者直接用厂家原装线省事很多。另一个常见场景是设备登录密码遗失。网络设备的正规恢复方式是通过 console 口连接后重启设备并在启动过程中打断引导进 bootloader/ROM 监控模式然后清配置或重置密码。这个流程不同厂商有差异但核心都依赖 console 口这也是 console 口被称作“最后救命稻草”的原因。平时可以不用但关键时候没有它设备基本就要回厂了。最后分享一下我自己对 TTY 这套概念的体会别把 TTY 当作某个具体的设备把它理解成“内核提供的一类会话通道”会顺畅得多。从虚拟终端到伪终端再到串口终端本质上都是在管“字符怎么进、怎么出、怎么处理回车和信号”这件事。把这些底层逻辑想明白设备名、设备号、console 参数都是水到渠成的记忆点。下次再看到 ttyS0 不会以为它是“终端 0 号”看到 pts/0 也不会觉得它和串口有什么关系排查起来自然快很多。
返回列表