ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

用树莓派DIY复古哑终端:从硬件选型到系统配置全攻略

用树莓派DIY复古哑终端:从硬件选型到系统配置全攻略 凌晨一点我按下那台老IBM显示器的电源键屏幕中心先亮起一个针尖大的白点随后“啪”地一声整个CRT表面被一条条扫描线铺满。当那排熟悉的login:提示符带着微微的荧光余晖浮出来时我长出了一口气——这台由树莓派驱动的哑终端dumb terminal终于活了。这个项目说来挺“没用”的。现在的电脑动辄几千万像素、几十个核心我却非要折腾出一台只能显示字符、没有任何本地计算能力的“假古董”。但如果你也有过这种念头——想要一台开机直接进终端、没浏览器没弹窗没通知、坐下来就只能敲字的机器那这篇文章大概能帮上忙。我会把从硬件选型、系统配置到外观做旧的整套过程都写出来包括我踩过的坑和当时没搜到的答案。1. 哑终端不是“笨蛋终端”先搞明白我们在还原什么1.1 哑终端的本质是什么“Dumb terminal”这个词直译过来有点贬义好像这东西很蠢。但它在计算机历史上占据的位置比很多人想象的重要得多。上世纪六七十年代大型机和小型机是绝对的算力中心一个机房里的主机可能价值几十万甚至上百万美元普通人不可能人手一台。那怎么让很多人同时用这台机器呢解决办法是主机前面接很多个“显示键盘”的组合设备数据通过RS-232串口线传输。这些设备本身没有CPU、没有内存、没有硬盘所有计算都在主机侧完成它们只负责两件事把你打的字发给主机把主机返回的字符显示在屏幕上。这就是哑终端。经典的型号包括DEC VT100、VT52、Admiral ADM-3A、Wyse WY-50这些。其中VT100尤其出名因为它定义了后来被广泛采用的ANSI转义序列——就是现在终端里那些\033[31m之类的颜色控制代码。换句话说今天你用的每一个终端模拟器iTerm2、Windows Terminal、GNOME Terminal底层都在模拟一台几十年前的VT100。“Dumb”这个叫法其实是相对于“智能终端”即自带处理能力的终端而言的。智能终端可以本地跑一些小程序而哑终端只能老老实实地做字符的搬运工。但在那个年代这套架构的意义非常深远它把“计算”和“交互”彻底分离了。这个概念后来演化成了瘦客户端、云桌面甚至今天大家常说的远程开发环境思路一脉相承。1.2 为什么现在还要做一台哑终端我总结下来做这个项目的驱动力大概有三类。第一类是专注需求。现代操作系统太“粘人”了浏览器开着十几个标签页、微信弹窗、系统通知、应用角标……你想写点东西、敲点代码总会被各种东西打断。哑终端没有图形界面没有通知没有多任务。开机就是一个login:提示符你只能通过命令行连接主机干活。这种“想干别的都干不了”的特性其实是数字时代非常奢侈的专注感。第二类是复古美学。CRT显示器的绿色或琥珀色磷光字符、扫描线、字符点亮时的余晖、键盘清脆的敲击声这些东西自带一种工业时代的质感。用现代LCD模拟出来的扫描线效果和真的在CRT上看完全是两回事。第三类是技术学习。这个项目涉及串口通信、终端协议、Linux系统启动流程、agetty、TERM变量这些基础但重要的知识。把这些搞明白你对“终端”这个每天都在用的东西会有更深的理解。1.3 这个项目最终交付什么简单说项目目标是一台满足这几个条件的“伪终端”开机直接进入字符终端界面能看到内核日志滚过最后停在login:提示符。没有图形桌面不跑X Window不加载浏览器。键盘敲击直接生效字符实时显示延迟要低。能通过串口或局域网连接真实主机登录进去跑vim、写代码、上BBS。外观尽量贴近老式终端大外壳、物理键盘、最好还能配一台CRT显示器。我是用树莓派实现的主体功能再配3D打印外壳和一台老式CRT显示器做外观还原。下面我从硬件选型开始把每一步的选择理由和具体操作都讲清楚。2. 硬件选型的真实权衡为什么是树莓派而不是ESP322.1 三条路线的对比在做之前我先列了一下可以实现哑终端的几条路线各有各的取舍。方案核心成本难度效果说明树莓派Zero 2W / 3B200-500元低好跑完整Linux自带终端栈最省心ESP32 Arduino开发50-100元高中需要自己实现VT100转义序列解析工作量巨大真实古董终端VT100等数千元以上中最还原稀有设备维护困难CRT老化严重ESP32路线看起来很硬核我也认真看过。它功耗低、物料便宜但要实现一个能正常跑vim和BBS的终端必须完整解析VT100转义序列——光标移动、行列控制、颜色、清屏、滚动区域……这些逻辑在Arduino上用C写一遍没有一两个月下不来。而且ESP32的内存只有几百KB显示缓冲区稍大就会捉襟见肘。如果你只是想做一个“能显示Hello World的复古小玩意”ESP32够用但如果你要的是能日常干活、能登录真实服务器敲代码的终端树莓派是唯一现实的选择。树莓派跑的是Raspberry Pi OS Lite无桌面版本身就是一个Linux控制台。内核自带framebuffer和终端驱动agetty负责在TTY上提供登录提示符SSH和telnet客户端都是现成的。你要做的工作不是“从零实现终端”而是“把现成的终端改造成哑终端的样子”——这中间的差距是数量级的。2.2 屏幕方案CRT、现代LCD还是模拟滤镜整个项目里最影响“味道”的是屏幕。我试了三种方案各说下体验。第一种方案真·CRT显示器。用一台带VGA接口的老式CRT比如IBM、DELL、Sun早期型号通过HDMI转VGA转换器接树莓派分辨率设成640x480。效果最震撼——字符有真实的磷光余晖扫描线肉眼可见刷新时的轻微闪烁都带着年代感。CRT行频范围、转换器兼容性、发热和体积是主要的麻烦。而且CRT普遍老化亮度和聚焦都需要适应。第二种方案现代LCD软件滤镜。树莓派接现代显示器通过cool-retro-term或者自己写脚本模拟扫描线、变色。省事但“模拟味”还是逃不过LCD硬邦邦的光感个人觉得不及格。第三种方案现代LCD物理滤色片。用琥珀色或绿色亚克力板盖在屏幕前面再加一层柔光膜让背光看起来更像荧光粉。效果介于前两者之间成本低适合没地方放CRT的人。我自己最后采用了第四种组合核心调通时用LCD快速验证外观成型时接真CRT。两种都要会配因为它们在树莓派里的配置有细微差别。2.3 具体硬件清单以下是我实际用到的物料清单供参考树莓派Zero 2W有一点性能富余跑agetty和SSH完全够。16GB TF卡建议Class 10以上。支持VGA输入的CRT显示器一台或7寸/10寸LCD屏。HDMI转VGA转换器如果是HDMI输出的话。CRT方案必用我买的是一款十几块钱的绿联实测兼容性还行但个别低分辨率会有雪花。USB转TTL模块PL2303或CP2102用于和真实计算机串口直连。标准USB键盘。老式终端没F1-F12的话需要映射后面会讲。3D打印外壳网上有VT100风格的模型文件也可以自己画。电源5V/2A起步树莓派Zero 2W满载大约0.5-1A但要留余量给键盘和转换器。选型还有一个容易忽略的点树莓派Zero 2W只有一个micro USB接口用于供电OTG接口可以用来接键盘或网卡但不能同时供电。如果不想用USB HUB分线建议用树莓派3B/4B这种带多个USB口的板子或者像我一样把键盘接到OTG口电源和网络用WiFi解决。3. 系统配置把树莓派变成一台“只会显示和敲键盘”的机器3.1 烧录和基础初始化我用的系统是Raspberry Pi OS Lite其实就是带一个最小软件包的Debian。安装方法很常规用Raspberry Pi Imager烧进TF卡烧录时在Imager里预配置好WiFi、SSH和用户名密码省去后面插网线和显示器的麻烦。烧完卡先别急着开机有几行配置要提前改。第一是/boot/config.txt新系统里可能叫/boot/firmware/config.txt。这里要把UART串口打开并让GPIO14/15的物理串口可用enable_uart1 dtoverlaydisable-bt dtoverlaydisable-wifi core_freq250解释一下这些行的作用enable_uart1把GPIO14TX和GPIO15RX配置为串口。dtoverlaydisable-bt禁用蓝牙把蓝牙占用的PL011串口释放给GPIO。这一步很关键不这样做的话树莓派3B/4B/Zero 2W的GPIO串口会被mini UART占用稳定性很差。dtoverlaydisable-wifi如果要做纯串口哑终端WiFi可以关掉省电。但我的方案里WiFi还承担SSH连接所以这条我没开。core_freq250把核心频率固定下来。这个问题只影响mini UART如果你用的是ttyAMA0PL011不设也行但固定它无害。第二是/boot/cmdline.txt。默认情况下内核会在串口上输出启动日志也就是consoleserial0,115200那段。这一步既重要又容易被漏掉如果不移除这个参数内核的console log会和agetty抢串口造成乱码和登录提示不出现。我把consoleserial0,115200删掉了同时加上consoletty1让日志只输出到本地屏幕。手动编辑时一定要保留其他参数只去掉console串口那一段。3.2 启动agetty让串口变成登录入口系统启动后Linux默认会在tty1本地显示器上跑一个login:提示符。我需要的效果是本地显示器是终端界面同时GPIO串口接出去之后另一端的主机也能看到并登录进树莓派。这就需要在串口上启动serial-getty服务。sudo systemctl enable --now serial-gettyttyAMA0.service注意这里的ttyAMA0和ttyS0的区别。树莓派3B/4B/Zero 2W有两个UARTPL011所谓主UART和mini UART。默认情况下如果不做任何配置GPIO14/15对应mini UART设备名是ttyS0但mini UART的波特率依赖CPU核心频率CPU调频时波特率会漂移这是串口乱码的经典来源。我上面在config.txt里加了dtoverlaydisable-bt之后PL011就被释放给了GPIO设备名变成ttyAMA0。所以agetty启动服务名里写的是ttyAMA0而不是常见的ttyS0。验证agetty是否在跑ps aux | grep agetty正常应该看到类似这样的输出root 123 0.0 0.2 5488 2444 ? Ss 01:00 0:00 /sbin/agetty -o -p -- \u --noclear ttyAMA0 115200 vt100这个vt100是终端类型。它告诉登录进程“终端”支持的转义序列标准。原则上设成linux或vt100都行但我后面要连真实主机主机端多数程序默认认xterm-256color或vt100所以串口这头设成vt100更复古也更不容易触发奇奇怪怪的显示问题。如果你想改波特率agetty服务用systemctl edit serial-gettyttyAMA0.service加一行覆盖就行。经典波特率是9600但实际用下来115200更流畅尤其是在屏幕上滚动大段文本的时候。9600只是“更有感觉”。3.3 本地终端氛围的三大件字体、分辨率、启动横幅本地显示器这头虽然不接主机的场景也有但总得先把它弄好看。字体方面我用setfont切换到了Terminus字体这是一款专门为终端设计的点阵字体有Bitmap版像素感极强。安装sudo apt install fonts-terminus setfont /usr/share/consolefonts/ter-v16b.psf.gz配合console-setup服务可以永久生效sudo dpkg-reconfigure console-setup按提示选择UTF-8 - Terminus - 16x32或16x16。16x32的字更大CRT上看更有老式终端那种厚重的字符感16x16则更接近VT100常用字形。我个人推荐16x32尤其是用CRT的时候粗壮的字符很带感。分辨率方面如果接的是CRT我要把树莓派HDMI输出调到640x48060Hz。在/boot/config.txt里设置hdmi_group1 hdmi_mode4hdmi_group1表示CEA标准电视类hdmi_mode4就是640x480 60Hz。注意这个设置在部分HDMI转VGA转换器上可能需要配合hdmi_drive2强制HDMI模式而非DVI才能正常输出。启动横幅方面哑终端开机后的第一屏应该是内核日志最后落在login:。但如果想让开机画面更有仪式感可以在/etc/rc.local或者用户的.bashrc里打印一个ASCII艺术字体的“terminal”字样加上系统内存、负载、IP地址等信息。很多老式终端登录后都会显示系统版本信息这算是致敬。我自己的.bashrc里加了一行用toilet生成的ASCII艺术字效果非常棒sudo apt install toilet echo fortune | cowsay # 这是后话你自己决定但注意如果/etc/issue文件里没有登录横幅登录前的白屏会有点单调。可以在/etc/issue里加上“Welcome to Retro Terminal”和几句ASCII艺术字这样每次重启到login:之前就能看到。3.4 关掉不必要的服务让它“纯”下来无桌面系统已经够干净了但我还是把一些没用的服务顺手关掉了蓝牙如果前面没关、AvahimDNS、WiFi电源管理避免SSH掉线。这不是必须的但是能让系统内存占用更低启动更快也更符合“只干一件事”的极简原则。sudo systemctl disable --now bluetooth.service sudo systemctl disable --now avahi-daemon.service sudo iwconfig wlan0 power off到这里树莓派本身已经是一台“哑终端”了。开机直接进字符界面无需任何图形栈。接下来要解决的是它怎么连接外面的世界。4. 连上主机串口直连和局域网访问两种玩法4.1 玩法一串口直连体验最纯正的数据链路哑终端最正统的玩法是串口直连主机。我用一根PL2303 USB转TTL线把树莓派的GPIO14TX和GPIO15RX接到一台装了Linux的电脑上。树莓派这头跑agetty主机那头用screen或minicom打开串口# 主机上执行 sudo minicom -D /dev/ttyUSB0 -b 115200波特率越高字符传输越快。9600也可以但那种慢慢吐字的感觉其实更有复古味。如果你想完全模拟80年代9600波特率字符一个一个蹦出来配合CRT的磷光余晖那感觉无与伦比。这个玩法的意义在于你真正构建了一条物理链路键盘敲下的ASCII码变成UART电平再变成屏幕字符。如果你有示波器还能在GPIO针脚上看到清晰的RS-232波形。现在的开发者很少有机会接触“数据通过物理线路传输”这件事了这本身就是一种很有意思的体验。4.2 玩法二WiFi SSH日常实用派串口直连仪式感强但不方便日常使用。我更常用的是WiFi连接树莓派连上路由器我通过SSH从树莓派登录到远程服务器或者反过来在真机上SSH到树莓派。我自己的使用场景是这样树莓派放在书桌上平时连显示器键盘就是一台独立终端我可以用它SSH到我的开发服务器在vim里写代码需要查资料时就切回本地控制台用w3m或lynx访问纯文本网页。由于没有任何图形界面我完全没有打开“无聊网站”的冲动这倒是额外收获。SSH连接时注意把终端类型设置对export TERMxterm-256color ssh -t userserver有人会问哑终端明明应该用vt100为什么要设xterm-256color因为现代服务器上的很多TUI程序比如htop、nmtui、vim会用256色彩色和现代终端特性vt100会让它们降级。如果你在真CRT上跑建议保留vt100牺牲一点点颜色换取兼容如果是在LCD上跑直接xterm-256color体验更舒服。4.3 连接BBS找回上世纪的上网方式哑终端不能少的一个节目就是连BBS。上世纪八九十年代很多人就是通过哑终端或者PC上的终端模拟器用telnet上BBS站看文章、发信、聊天。现在很多老牌BBS站还活着用树莓派连上去telnet bbs.example.com输入用户名密码就能看到那个纯字符界面的世界。字符菜单、方向键操作、ASCII art海报……当这些内容显示在CRT上时你会有一种非常强烈的“穿越感”。这也是我给每个来做客的朋友展示这台机器时的保留节目。有一点要提醒现代BBS不少已经支持SSH协议但传统BBS还是telnet为主。telnet是明文协议只在局域网或复古场景里玩别用它登录任何需要保密的账号。4.4 stty size终端尺寸不对TUI错乱到崩溃连主机的时候最常遇到的一个问题就是全屏程序vim、htop画面上屏错乱明明数据到了却把屏幕一分为二或者出现乱码。这通常是终端窗口尺寸和内核/终端模拟器认知不一致导致的。打开一个全屏程序之前先看终端尺寸stty size如果返回的不是24 80这种就手动设置。哑终端屏幕标准就是80列24行这也是VT100的默认。直接在.bashrc里写stty rows 24 cols 80这个细节特别重要。我一开始没设SSH上去之后vim的窗口宽度和屏幕不匹配显示乱七八糟折腾了很久才发现问题根本不在转义序列而在尺寸。5. 外观做旧与显示氛围让现代硬件有“老家伙”的味道5.1 3D打印外壳致敬VT100的线条硬件跑通之后最大的“违和感”来自树莓派裸露的电路板。我最终选择了3D打印外壳设计文件参考了VT100终端的经典造型整体塑料质感、前方倾斜的屏幕面板、顶部有一个提手底部留有散热孔和后部的接口开口。网上有几个经典的STL项目直接搜索“VT100 case raspberry pi”能找到。我用的模型是一位爱好者设计的“mini VT100”面板正好能安装一块7寸HDMI屏。如果你像我一样用外接CRT可以打一个简单的“立式底座键盘托”把树莓派藏进底座里。3D打印选材上哑光PLA比光面PLA看起来更接近老式ABS外壳。打印完用砂纸打磨一遍再喷一层哑光黑漆质感会好很多。我不建议用树脂打印虽然精度高但脆而且质感太“现代”跟复古定位不搭。5.2 键盘改造手感和布局都要“老”键盘是整个体验的另一半。老式终端键盘的键程长、声音脆有一种现代薄膜键盘完全没有的“确认感”。我现在用的是IBM Model M的USB版但你要买新的不太现实更便宜的方案是找一把老式机械键盘加转换器转USB或者干脆用现代青轴/绿轴键盘凑合。如果走“物理改造”路线Soarers Converter是最常用的工具——它可以把老式AT/PS2键盘转成USB还能自定义键位映射。老式终端键盘的布局和现在不太一样比如缺少F键、Esc位置不同通过Soarer的映射配置可以调整remapblock: CAPS_LOCK - ESC ALT - CONTROL endblock按键布局影响很大。我一开始用现代104键键盘Esc在左上角Enter是小键但老式终端习惯Esc在数字键附近、Enter是大L形回车。如果你想要“沉浸式体验”第一件事就是换一把有“大回车”的键盘这比任何软件滤镜都管用。5.3 扫描线和余晖软件模拟 vs 物理CRT软件的CRT扫描线模拟方案我用过cool-retro-term也试过自己写脚本。cool-retro-term在桌面环境中效果不错但它本身是一个图形窗口应用跟哑终端的“无图形界面”原则冲突。所以我的结论是如果真是哑终端就别用软件模拟想要扫描线就直接上CRT。如果你的确只能上LCD我推荐一个土办法用3D打印做一个挡框在屏幕前面贴半透明柔光膜再罩一块琥珀色或绿色的亚克力滤光板。字符颜色可以通过setterm调整setterm -background black -foreground green或者更简单地在.bashrc里echo -e \033[32m这样LCD的白底会变成绿色字符加上滤光板之后虽然比不上真CRT但视觉效果已经非常接近了。这个方法成本低、不影响系统性能我把它作为LCD方案的默认配置。5.4 散热、摆放和供电的细节别小看供电和散热。树莓派Zero 2W本身发热不大但如果你和我一样接了HDMI转VGA转换器和老机械键盘有些老键盘用USB转换器后功耗不低供电不足就会导致串口乱码和随机重启。我一开始用一个杂牌5V/1A充电头SSH会话动不动就断查了半天日志才发现是电源的问题。后来换了个5V/3A的电源再没出现。CRT显示器的散热和摆放也要注意。CRT内部有高压电路运行时发热很大不要放在密闭空间背面和两侧要留出至少一拃宽的散热距离。树莓派本身可以藏在CRT底座下面用双面胶或尼龙扎带固定这样整台设备看起来就是“一台完整的老式终端”而不是“显示器旁边挂着个开发板”。6. 一晚上踩坑记录7个细节问题与解决办法下面这些坑是我在调试过程中真实遇到的每一个都花了不少时间排查写在这里帮你省掉这些弯路。6.1 ttyAMA0和ttyS0搞混串口没有输出现象agetty服务启动报错“failed to create tty”或者“No such file or directory”串口完全没有反应。原因树莓派的UART设备名在不同型号和配置下会变。默认情况下GPIO14/15上可能是ttyS0mini UART也可能是ttyAMA0PL011。如果系统里根本没有ttyAMA0你还去启动serial-gettyttyAMA0.service当然会失败。排查方式ls -l /dev/ttyAMA0 /dev/ttyS0 dmesg | grep tty然后在config.txt里确保加了dtoverlaydisable-bt。这样PL011就挂在ttyAMA0上。如果不想禁用蓝牙就老老实实把服务名改成ttyS0同时用core_freq250固定波特率。总之先确认设备名再启动服务。6.2 内核console和agetty抢串口login提示符不出来现象启动日志能在串口上看到但日志滚完之后没有login:提示符按键盘也没反应。原因/boot/cmdline.txt里保留了consoleserial0,115200内核把串口当成控制台占用了agetty当然拿不到它。解决编辑cmdline.txt删掉consoleserial0,115200只保留consoletty1。然后重启。这个方法很干净串口就专属于agetty了。6.3 mini UART波特率漂移乱码满天飞现象屏幕上的字符动不动就出现字符、错位、断行。原因树莓派mini UART的波特率跟随GPU核心频率变化。如果你用ttyS0内核在调频时串口波特率就飘了。解决终极方案还是用PL011也就是dtoverlaydisable-bt让GPIO挂ttyAMA0。如果因为某种原因必须用ttyS0就固定core_freq250。两种方法我实测都有效但ttyAMA0更稳。6.4 HDMI转VGA转换器不认低分辨率现象CRT显示器黑屏或者只有雪花没有画面。但同一台转换器接现代显示器就正常。原因部分廉价HDMI转VGA转换器内部有EDID欺骗逻辑它们只支持固定的几种分辨率通常720p/1080p而CRT需要640x480甚至320x240这种低分辨率转换器不认。解决先设hdmi_group1和hdmi_mode4再试加hdmi_drive2强制HDMI模式。如果还是不行换一个支持“自动降分辨率”的转换器。市面上有些支持EDID可编程的转换器价格贵一些但跟CRT配合得好。6.5 键盘布局改成老式布局后方向键错乱现象用Soarers Converter重新映射了键盘结果方向键变成了ESC [ A这类转义序列vim里移动光标完全乱套。原因老式键盘的某些键位映射到现代系统后发送的扫描码和xterm/linux终端期望的不一致。解决用loadkeys加载适合你的键位映射sudo loadkeys us然后检查stty -a里的c_cc设置特别是kbs和werase。如果方向键语义乱可以在终端层面用bindkey或者在vim里set termkeysos来纠正。遇到这种问题先确认TERM变量和实际终端类型匹配再考虑键位映射。6.6 电源供电不足串口会话无故中断现象SSH连上去用几分钟会话就断重新连接又能用。或者串口登录后敲几个字就卡死。原因树莓派供电不足时WiFi模块和USB外设会随机重置表现为SSH断连和串口异常。解决换一个靠谱的5V/3A电源尤其是接了键盘和HDMI转VGA转换器后。还可以在config.txt里把max_usb_current1打开虽然新系统默认已启用。别用电脑的USB口或者共享充电器电流不够。6.7 终端大小不对全屏程序渲染错乱现象vim一进全屏右侧会多出一列、状态栏不对齐或者屏幕上下滚动区域错乱。原因stty的rows和cols和内核终端驱动/SSH server认知不一致。解决在.bashrc里固定export COLUMNS80 export LINES24 stty rows 24 cols 80如果你用的终端模拟器可以调整窗口大小就把窗口设成物理分辨率匹配的尺寸避免字体缩放。做一个复古哑终端技术难度其实不高真正花时间的地方全在这些细节里。我把它放在书桌上已经两个多月了明显的变化是原本总想“顺便”刷新一下社交媒体的时间现在变成了坐下来、连上服务器、读资料写代码的连续时间。屏幕上的绿色字符也许没有现代显示器那么细腻但那种“就这样简单”的感觉在信息过载的年代意外地珍贵。如果你也想动手我建议不要一上来就追求CRT和3D打印外壳先把树莓派无桌面系统跑通、SSH连上主机、感受一下纯字符界面下的工作流。觉得能适应了再一步步加外壳、换CRT、改键盘。这个过程本身就是这个项目最大的乐趣。
返回列表