通过串口关闭Linux服务器
扫描二维码
随时随地手机看文章
简介
一个真正的服务器一般往往不需要连接键盘、显示器或鼠标等外设。而仅仅需要一个性能稳定的操作系统如Linux和一个网卡。诸如鼠标、键盘等外部设备则往往不必要连接。在运行Linux的机器上,通过网络进行远程管理是最好和最方便的解决方法。
在买服务器时应该确保在开机BIOS中有设定不需要检测键盘的选项。目前市场上大多数主板厂商的BIOS版本都有这样的选项。但是仍然有一些主板认为自己的的服务器将只运行windows,因此一定会在启动时需要一个键盘,因此不推荐使用这种机器作为服务器使用。
没有键盘和监视器的计算机非常适合于作为防火墙、web服务器、NFS服务器、邮件服务器的、ADSL网关、DNS服务器的概念等等。而且该机器不一定是功能非常强大的机器。即使一个老的Pentimu100机器,只要拥有足够的内存就可以同时服务数百个客户服务请求。
服务器不连接键盘、鼠标和显示器的好处是非常方便,因为服务器将只是一个简单的主机箱,可以放在任何适合的地方。但有时候你可能希望能有一个按键来实现安全的关闭服务器而无需首先远程登录服务器运行shutdown命令来实现关闭机器。也可能你现在就在服务器机房,而最近的工作站离你有100多米远;或者你希望某个没有root密码的普通用户关闭服务器。当然直接关闭电源并不是一个好的想法,因为这样可能导致丢失数据并且在下次启动时需要很长时间的文件系统检测。
解决方法是按照本文的方法安装一个很小的、便宜的串口设备实现安全关机。
设备
我们将制作一个小小的、由两个LED和一个按键式开关组成的设备。其中绿色的LED亮表示当前按键式开关是处于激活状态,缓慢闪烁的黄色LED灯表示服务器正在启动或者仍然处于关闭状态。为了实现安全关闭服务器需要持续按下开关3秒钟。
如果你按了按键开关,亮着的绿色的LED将熄灭,表示正在关机,这时候命令"/sbin/shutdown -t2 -h now"被执行。在服务器关闭过程中黄色的LED将连续闪烁以进行指示。当黄色LED不再闪烁时,你仍然需要等待10秒钟才能关闭服务器电源。当所有的进程被杀掉,磁盘被卸载以后黄色LED将不再闪烁。若你的服务器支持自动关机则你不需要考虑10秒的等待时间,因为服务器会自动关闭电源。
串口
关于串口令人感兴趣的是我们可以通过ioctl系统调用来控制其中的几个管脚。这意味着你不需要修改任何内核代码就可以控制连接到串口的LED或这读取按键式开关的状态。串口有足够的电压来驱动两个低电压LED。我们将使用RTS和DTR针来连接LED,并且"Carrier Detect line"被用来读取按键开关的状态。
串口母头连接器的管脚定义:
9 PIN-connector 25 PIN-connector Name Dir Description
1 8 CD input Carrier Detect
2 3 RXD input Receive Data
3 2 TXD output Transmit Data
4 20 DTR output Data Terminal Ready
5 7 GND -- System Ground
6 6 DSR input Data Set Ready
7 4 RTS output Request to Send
8 5 CTS input Clear to Send
9 22 RI input Ring Indicator
电路
用户需要下面元器件来制作这个串口关机设备:
1 绿色低电压LED (一个普通LED同样可以工作,但是亮灯过低)
1 黄色低电压LED
2 1.5K欧姆的电阻
1 6.8K欧姆的电阻
1 小按键开关
1 串口母头连接器
这些元器件按照如下的电路图连接在一起。串口电压范围是+/- 10伏特。1.5K电阻适合于低电压的LED,但是普通LED同样适合。不推荐修改电阻器电压和使用外部电源,因为串口控制芯片是主板的一部分,一旦你烧了其中的芯片,你只有修改整个主板。
上图是实际的电路板样品图。最后的设备如文章开始图片所示。
软件
软件部分是一个小的守护进程。它可以通过/etc/rc.d/rc3.d/的脚本被启动。它通过使用ioctl(fd, TIOCMSET,…)和ioctl(fd, TIOCMGET, …)函数来读取和写串口。你可以从这里下载程序。软件中包含一个Makefile和安装指示。