控制ThinkPad的风扇

我的旧本子X31风扇很久都不转了,今天查了点资料,搞了搞,感觉状态上好,记录如下:

首先要能了解当前温度和风扇转速,安装lm-sensors包就能用了:

$ sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:       +42.0°C  (crit = +91.0°C)                  

thinkpad-isa-0000
Adapter: ISA adapter
fan1:       3614 RPM
temp1:       +42.0°C                                    
temp2:       +48.0°C                                    
temp3:       +48.0°C                                    
temp4:       +42.0°C                                    
temp5:       +32.0°C                                    
ERROR: Can't get value of subfeature temp6_input: Can't read
temp6:        +0.0°C                                    
temp7:       +29.0°C                                    
ERROR: Can't get value of subfeature temp8_input: Can't read
temp8:        +0.0°C      

按说lm-sensors也能控制风扇的,但对我的本子不适用。

然后就是在内核中挂载ThinkPad的高级电源控制模块,在/etc/modprobe.d/options里添加这么一句,后面的参数fan_control很重要:

options thinkpad_acpi fan_control=1

重启,或者手工重新挂载模块:

rmmod thinkpad_acpi
modprobe thinkpad_acpi

好了,控制风扇转速,最基本的方法是(如无意外,本文中的大部分命令都要用root用户操作):

echo level [level] > /proc/acpi/ibm/fan

[level]的取值可以是0-7之间的数字,或者auto,或者disengaged/full-speed,在不同的本子上会有不同的效果,总体来说数字越大转速越高,auto是系统自动判断,但在我的本子上却是不转,disengaged/full-speed是全速。我自己用的本子,设为4左右就能达到温度和噪音的平衡点。

还有人在这个基础上写了一些小工具,比如tp-fancontrol或者ThinkPad Fan Control,主要功能都是定时探测温度,然后安装预先的设定来控制风扇的转速。但由于不同硬件的差异,他们并不适用于所有情况,比如我的X31装上哪一个风扇都是auto不转,只好手工echo然后让风扇常转了。智能一点的,还可以借助cron来个定时开关、定时检测什么的。

参考

机房搬家过程中的几件趣事

都是真事儿,先介绍现象,后面再说搞笑的原因。由于是搬家,目的地场地环境有一些变化,加上现在的机器上灰尘已经攒了好几年的了,所以每台机器都尽量拆开了、逐个零部件清洁,然后再装好开机检查,这一拆一装问题就来了。

  • 一台IBM X3650拆开清理后装好了,接上电,开机没反应,但电源线都正常插着呢。
  • 一台HP LH6000,3个电源模块,需要2条电源线,都接上了,开机,发现转几下后自动停机,有点儿带不动或者自检出错的感觉,怀疑是内存的原因(此机原来出现过类似的内存错误)。
  • 一台HP LH3000,网线接上了交换机,但不亮,系统中也显示“网线已断开”,但这条网线测了N遍都是通而且很正常的,换别机器的网线仍然如故。
  • 防火墙内网、外网、SSN/DMZ的网线都接上了,也都通,可怎么配置就是连不上外网,奇怪啊,搬之前还正常用来着,就改了个互联IP的事嘛。

其实啊,这些活儿虽然很辛苦,还真多亏了这些“奇妙”的故障原因,实乃枯燥工作过程中的小小点缀,我下面要说的原因,你都猜到了么?

  • IBM X3650的电源模块的纵切面是长方形的,所以上下颠倒也可以放到槽里,就是卡子卡不紧而已,所以有位哥们儿就顺理成章的上下颠倒的安上了,还抱怨不好卡。我是看到电源上AC灯亮而DC灯不亮发现的,因为电源屁股后面的文字也都是倒的。
  • 虽然两条电源线都正确的接在了电源的屁股后面,但由于众台机器都拆去清洗了,地面上遗留的线缆比较多,所以。。。有一根电源线的另外一头不在插座上。同样是检查电源模块上的灯发现的,可怜之前我们插拔cpu/内存板子和调整内存N遍啊。
  • HP LH3000原先是用光纤与交换机连接的,搬家之后换用铜缆了,当然光纤网卡和铜缆网卡不是一块,最关键的是,以前我们为了不让数据从铜缆走,把接铜缆的网卡禁用了。所以换铜缆之后(此时还未开机或启动进入桌面),这根线也通线序也没问题,但肯定就是不会亮啊。
  • 这个最简单,防火墙和交换机都挨着装在机柜的最上方,而且我们的内网和SSN/DMZ都是连到一个交换机上,联通扯过来的光纤已经被机房管理人员用铜缆跳到了机柜自带交换机(位于机柜最下方)上,离得比较远而且也没有线头再外面露着,所以就用三根短跳线从防火墙接到了我们自带的交换机上,和联通光纤没有任何物理连接,能通才出鬼了。

还有一件我们研究了半天的事情,IBM机架服务器自带滑轨在前方除了有2个圆柱用于对入机架上的方形孔外,前面还有一个向下的小钩子,此时我们已将所有东西都拆了下来运到目的机房准备安装,恰好大家以前接触机架滑轨也少,也巧了机房现有服务器看了个遍滑轨全部都是用螺丝固定的,不像我们这个IBM滑轨只用卡件解决。最致命的是,滑轨前方的小钩比机柜上的方孔要宽,怎么也穿不过去,这样怎么才能把滑轨“钩”在机柜上固定啊?机柜是图腾的,滑轨是IBM的,按说都是符合标准的玩意儿,咋就不“兼容”了呢?研究了半天,一位聪明的小胖子终于发现,通过弹簧把2个圆柱压回去,空出的空间正常卡入机柜竖架,松开手弹簧自然把圆柱弹入机柜竖架上的方孔,这一端就固定完毕。至于那个向下的方形小钩子嘛,是在服务器装上、完全推入滑轨之后,“卡”得一声卡住服务器的,并非是要卡在机柜方孔中。可怜我们怀疑图腾和IBM不兼容老半天,就差打电话到他们公司去问了-_-!。

Linux下使用华为h3c Aolynk WuB320G无线网卡

我搜到的国内唯一的两篇参考文章(之所以说是唯一,是因为内容基本一致,大概是同一个人写的):

不过这位老大写得比较模糊,具体操作的时候还是费了不少周折。加上本本上的迅驰无线捣乱,由于本本比较老了,自带无线网卡是Intel PRO/Wireless 2100,只支持802.11b,好像还不支持WPA(WPA是2004年提出的,比本本的岁数小),所以在它身上也浪费了不少时间。

华为3com的Aolynk WUB320g usb无线网卡芯片组应该是Ralink(它的台湾分站)的RT73,虽然Ubuntu Gutsy自带了驱动,并且识别出了网卡,但注意,这个自带的驱动不好用,或者说没法用,仍然需要自己到http://rt2x00.serialmonkey.com/下载开源的驱动,编译使用。(编译前后,用iwpriv wlan0看列出的可用参数就知道这两个驱动的区别了)

编译需要内核相应的头文件,比如linux-headers-2.6.22-14-generic,解压后按照README文件的内容:

$ tar xzf rt73-cvs-daily.tar.gz
$ cd rt73-cvs-YYYYMMDDHH/Moduls
$ make
$ make install

就算编译安装完成了,手工挂载:modprobe rt73 ifname=wlan0,在/etc/modules中添加一句rt73,每次启动就能够自动挂载了。还可以在/etc/modprobe.d/blacklist中增加一句:blacklist rt73usb,禁用系统自带的驱动。

如果要和采用WPA-PSK认证方式的AP连接,还要修改一下/etc/network/interfaces文件,比如:

auto wlan0
iface wlan0 inet static
    address 192.168.0.13
    netmask 255.255.255.0
    gateway 192.168.0.1

    pre-up ifconfig wlan0 up
    pre-up ifconfig wlan0 down
    pre-up ifconfig wlan0 up
    pre-up iwconfig wlan0 essid "my_essid"
    pre-up iwconfig wlan0 mode Managed
    pre-up iwpriv wlan0 set AuthMode=WPAPSK
    pre-up iwpriv wlan0 set EncrypType=TKIP
    pre-up iwpriv wlan0 set WPAPSK="my_wpa_passphrase"
    pre-up ifconfig wlan0 up

这个设置是从WifiDocs/Driver/RalinkRT73抓过来的,大体意思知道,但为什么写成这个格式不是非常明白,不过这样的确就可以使用了 :-)。

配置无线连接还可以使用其它工具,比如wifi-radar,或者专门为Ralink开源驱动设计的RutilT也不错。

试着用两块Wub320g配置Ad-Hoc对等网,但失败了,配置如下(两端的配置是一样的):

auto wlan0
iface wlan0 inet static
    address 192.168.0.13
    netmask 255.255.255.0
    gateway 192.168.0.1

    pre-up ifconfig wlan0 up
    pre-up ifconfig wlan0 down
    pre-up ifconfig wlan0 up
    pre-up iwconfig wlan0 mode Ad-Hoc
    pre-up iwconfig wlan0 channel 2
    pre-up iwconfig wlan0 essid "fwolf_home"
    pre-up iwconfig wlan0 key 1234567890
    #pre-up iwpriv wlan0 set NetworkType=Adhoc
    #pre-up iwpriv wlan0 set AuthMode=OPEN
    #pre-up iwpriv wlan0 set EncrypType=NONE
    #pre-up iwpriv wlan0 set SSID="fwolf_home"
    # Break 802.11i's 11m/s limit
    #pre-up iwpriv wlan0 set AdhocOfdm=1
    pre-up ifconfig wlan0 up

注释中是另外一种方式,两种方式下网卡都能够连通,从iwconfig或者其它工具中都能看到已连接的状态,ifconfig也能看到发送和接收的流量,但两块网卡之间就是ping不通(属于同一网段)。把两端的机器都重启,偶尔能从还连接着局域网的机器上ping通另外一台只连接了无线网的机器,而反过来ping不通,提示:

Destination Host Unreachable

有时候还会提示:

ping: sendmsg: No buffer space available

对等网计划只好暂时搁浅,先找个AP用着。

最后总结,在为linux操作系统选购硬件时,一定要先上网看看相应的功能好不好配置,优先选择应用比较广泛、驱动比较开放、配置容易的产品。

参考

Update @ 2008-07-17

升级到Ubuntu 8.04 hardy之后,无线网卡又不干活了,虽然有人说hardy的默认驱动工作得很好,但在我这里不行,能识别出来,但up的时候出现错误:

SIOCIFFLAGS: invalid argument

查了一下确认是驱动有问题(与2.6.24内核),不过早有好心人提供了补丁,所以,只需按照如下步骤,就能让无线网卡复活了:

安装相应的内核header包:

sudo aptitude install linux-headers-`uname -r`

这里下载最新的rt73驱动,解压,编译,安装。如果编译时出现模块文件太大的提示:

!!! WARNING: Module file much too big (>1MB)
!!! Check your kernel settings or use 'strip'

可以strip一下再安装:

sudo strip -S rt73.ko
sudo make install

这样处理过的rt73.ko之后250k左右。

现在就可以卸载旧模块了,当然还要把他们都放到禁用模块列表(/etc/modprobe.d/blacklist)中,然后加载新的模块:

sudo ifconfig wlan0 down
sudo modprobe -r rt73usb
sudo modprobe -r rt2570
sudo modprobe -r rt2500usb
sudo modprobe -r rt2x00lib
sudo modprobe rt73

然后就。。。可以用啦:

ifconfig -a
sudo ifconfig wlan0 up

wpa认证还是使用上面原先介绍的方法即可。

另外,我弄完之后,没有wlan0,却有wlan2,也能正常工作,怎么把网卡的名字改过来捏?参考这里,编辑文件/etc/udev/rules.d/70-persistent-net.rules

# USB device 0x1472:0x0009 (rt73usb)
#SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0f:e2:39:b6:f2", ATTRS{type}=="1", NAME="wlan0"

# USB device 0x1472:0x0009 (rt73usb)
#SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0f:e2:39:c0:ff", ATTRS{type}=="1", NAME="wlan1"

# USB device 0x1472:0x0009 (rt73usb)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0f:e2:39:b6:f9", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"

看见没,所有用过的网卡这里都记着呢,把原来没有用了的wlan0, wlan1都注释掉,最后一句改为wlan0,下次再重新插无线网卡的时候,就会被认为是wlan0了。

参考