行者无疆 始于足下 - 行走,思考,在路上

x86-64 Arch Linux on ThinkPad x220i

去年换x201i的时候,曾经折腾出一篇《x86-64 Arch Linux on ThinkPad x201i》,后来x201i陪我度过了毕业半年最为艰难的岁月,表现可圈可点,配合我自己调制的ArchLinux,系统非产高效,让我在4个月的时间内搞定了8门课程、毕业设计,还看了不下二十部电影和纪录片。

说起操作系统重装,我也算究竟沙场了。基本上每半年会重装一次操作系统,从XP,Vista,RedHat 9.0,Fedora,到Ubuntu 8.x,转向ArchLinux、Gentoo,甚至在华数淘宝实习的时候还装了4台PC和2台Dell的PC Server。最长的一次要属第一次接触Gentoo的那次,装操作系统装了有2个星期,折腾了两个月,终于发现这个东西不符合低碳节能的基本要求,再一次不小心的fsck误操作中彻底结束了Gentoo之旅,回到了Ubuntu和Arch的怀抱。

来到百度第一天领到的新笔记本,x220i,好家伙,上网一搜,居然是今年最新款的X系列ThinkPad。CPU是新一代的SNB架构。默认系统的十年前的XP。本来我想另辟空间再装个Linux来个双系统,后来XP实在用着不爽,遂全盘格式化,全部分给ArchLinux。

我一直有一个疑问:为什么Windows的命令行,无论是CMD还是PowerShell,不能实现最简单的窗口最大化功能?

OS版本用的是Arch Linux 2010.05,在mirrors.sohu.com上下载支持 32 位及 64 位架构的 Dual 映像,用UltraISO刻录硬盘镜像到U盘上。本以为ArchLinux的安装会像以前一样轻车熟路,不曾想这次却遇到了以前从来没有遇到的一个大麻烦:网卡无法识别!!!

不能上网就意味着不能装X,不能装X就意味着没有Firefox,没有Firefox就意味我不能上网来写这篇博客。无奈之下,去同事的机器上下载了最新的Linux Mint 11,痛快装好,网卡这次能用了。

Google搜索,发现Arch Linux 2010.05是2.6.32的内核,而Linux Mint 11是2.6.38的内核,因此我怀疑是不是ArchLinux内核比较老而x220i架构比较新的原因。搜索的过程中发现了一个叫做ArchBoot的项目,说白了就是半官方的ArchLinux滚动更新ISO。热切的下载了最新的ArchBoot刻录安装,但是不幸的是这个ArchBoot在我的笔记本上根本无法启动。

怎么办?要不重新叫IT部门的人重装下XP?还是先用一段时间的Mint,等下一个ArchLinux的官方安装版?

但我终究是忍不住的。电脑之于黑客,相当于宝剑之于剑客。没有顺手的系统,自然没有高效的工作和良好的心情。

于是不得不换一种思路:尝试手动去下载Intel网卡的驱动,然后编译安装,搞定网卡驱动后再联网升级到新的内核。事实证明这个策略是奏效的,所需要的网卡驱动程序可以在Intel的网站上下载。安装过程不再赘述,按照安装包里的说明即可。装好驱动后升级内核,装X,装KDE,简单配置下字体,一切顺理成章,不亦乐乎。

最后的两个问题依然是驱动相关。一个是显卡的问题,这个可以通过更新内核来搞定。一个是thinkpad风扇的问题,x201i上的方案迁移到x220i上并不奏效,tpfand基本不可用。好在有thinkfan,通过yaourt安装下。设置主要参考这里,但是原文中所设置的:

sensor /proc/acpi/ibm/thermal (0, 3, 3, 2, 10, 0, 10, 0, 2, 2)

并不存在。在x220i上的/etc/thinkfan.conf设置为:

# I use this on my T61p:                                                                                                                             
#sensor /proc/acpi/ibm/thermal (0, 10, 15, 2, 10, 5, 0, 3, 0, 3)                                                                                     
                                                                                                                                                     
# (0,   0,   55)                                                                                                                                  
# (1,   48,     60)                                                                                                                                  
# (2,   50,     61)                                                                                                                                  
# (3,   52,     63)                                                                                                                                  
# (4,   56,     65)                                                                                                                                  
# (5,   59,     66)                                                                                                                                  
# (7,   63,     32767)                                                                                                                               
                                                                                                                                                     
sensor /sys/class/hwmon/hwmon0/temp1_input (0, 3, 3, 2, 10, 0, 10, 0, 2, 2)                                                                          
(0, 0, 45)                                                                                                                                           
(1, 45, 48)                                                                                                                                          
(2, 48, 55)                                                                                                                                          
(3, 55, 58)                                                                                                                                          
(4, 58, 60)                                                                                                                                          
(5, 60, 63)                                                                                                                                          
(6, 63, 65)                                                                                                                                          
(7, 65, 32767)            

经过此番修整,x220i终于被我调教的舒舒服服,服服贴贴cool。至于旧爱x201i,简单修整了一下给妞用了。

最后许个愿望吧:希望在未来可见的三年内不要再折腾操作系统了。同时遥祝远在Singapore的阿黎早日搞定MacBook上的Ubuntu,整好MitSIM,顺利毕业。嘿。

 

x86-64 Arch Linux on ThinkPad x201i

前两天自用的Arch Linux系统出了点小问题,索性重新搞了一下,由i686迁移到x86-64平台。原先一直以为64位系统是高不可攀的贵族产品,后来才知道原来64位处理器最早是由AMD 1999年设计,几年前的Intel Core Duo早已经支持64位系统,只是软件产品和内存还跟不上,所以多数应用还是32位为主。

OS版本用的是Arch Linux 2010.05,在mirrors.sohu.com上下载支持 32 位及 64 位架构的 Dual 映像,用UltraISO刻录硬盘镜像到U盘上。基本的安装过程不再赘述,ArchWiki Beginner's Guide讲的明明白白。唯一注意的是分区格式化的时候需要格外注意,不要把自己原先的系统搞丢——我曾经有过惨痛的教训,不过幸好那次做了数据备份。不过100G的东西备份还原也是件耗时耗力的工作啊^)^。

基本系统装好后,装个Desktop Environment,然后再做一下系统美化和针对小黑的特殊配置。过程还是挺繁琐的,因此写下来做个备忘。先上张图,KDE4.6——我承认我越来越浮云了……

最新的Xorg已经变得十分人性化,再也不需要手工配置恼人的xorg.conf,最新的Linux内核驱动也能自动识别鼠标和键盘,不会再出现进入图形界面却无法使用鼠标键盘的窘境——至少两年前是这样的。有个东西叫做HAL,最近又出来个evdev。总体而言Linux的驱动程序还是比较混乱的,hal、evdev、mesa、xorg、xf86、wayland、alsa、oss、pulseaudio等等,令人头大。

字体用的是AUR里面打过ubuntu补丁的cairo-ubuntu、libxft-cairo、freetyp2-ubuntu以及WenQuanYi Micro Hei,加上次像素优化,效果还是不错,上图就是最好的说明。

网络客户端抛弃了废柴的KDE的networkmanager,采用了wicd,可以根据地点自动链接不同的无线网,而且非常稳定,从不崩溃。安装过程可以参考ArchWiki Wicd。关于蓝牙的配置,我用的是bluez和bluedevel,具体可以参考这里

剩下的都是小黑的特别配置。这方面的Wiki配置零零总总,并没有统一的解决方案。ThinkWiki是一个很好的去处,基本可以找到ThinkPad各个型号再主流Linux发行版上的安装配置。不过由此也看出开源软件的弊端——顶级的ThinkPad支持尚且如此繁琐,可见Linux真正要普及还有很长的路要走。废话少说,还是回到x201i上的设置吧。ThinkPad的设置主要有以下几处:

  • 电池电源控制
  • trackpoint小红点
  • Active Protection System,硬盘保护系统
  • 风扇控制

电池的电源控制主要是用来延长电池寿命的。电池的充电次数是有限的,因此减少电池的冲放电次数是演唱电池寿命的关键。tp_smapi是针对ThinkPad的一组内核模块,可以通过AUR(yaourt -S tp_smapi)安装。对电源的保护主要是设置电源的冲放电阀值。比如我们设置[start_charge=40, end_charge=90],意思就是当电池的电量低于40%的时候才开始充电,而一旦电量到达90%的时候就停止充电。举例说明,当我们野外需要频繁的野外工作时,如果不设置电池的充放电阀值[start_charge, end_charge],那么我们的电量可能是这样的:95(battery, discharge)-->80(AC power, charge)-->100(battery, discharge)-->70(AC power, charge)-->93(battery, discharge)-->70,而设置[start_charge=40, end_charge=90]后我们的电量变化就是这样的:95(battery, discharge)-->80(AC power, but not charge)-->80(battery, discharge)-->50(AC power, but still not charge since 50 >= 40)-->50(battery, discharge)-->27(If AC power now, charge, since 27 >= 40, charge until battery = 90)。看明白了吗?估计没有。反正我也有点晕。ArchWiki上提供了一个封装的脚本set_bat_thresh:

#!/bin/bash
#
# Bash script for setting the battery thresholds on ThinkPads using the tp_smapi interface.
# Written by Ignas Anikevicius (20/03/2010)

#HELP TEXT
if [ "x$1" == "x--help" -o "x$1" == "x-h" ]
then
  echo -e "
  WARNING!!! This script needs to be run as root in order to have effect!!!

  Possible options are:
    set_bat_thresh [BAT_N] [[LOWER] [UPPER]][--reset][-r] 
 
    [BAT_N] number of the battery (can be either 0 or 1). 

    LOWER - lower threshold.
    UPPER - upper threshold .
    [--reset] or [-r] sets the default thresholds. 

  execute to see this text:
    set_bat_thresh [--help][-h]
"
  exit 0
fi 

if [ ! -d /sys/devices/platform/smapi ]; then
  echo -e "\nSMAPI interface is NOT installed.\nPlease load the module.\n"
  exit 0; fi

#SETTING THRESHOLD VALUES
if [ "x$2" == "x--reset" -o "x$2" == "x-r" ]
then
  LOWER=96
  UPPER=100
else
  LOWER=$2
  UPPER=$3
fi

#VALUE TESTING
if [ ${LOWER} -ge ${UPPER} ]; then
  echo -e "\n  Please provide proper thresholds!!!  \n"
  exit 0
fi

#BATTERY NUMBER
BAT_N=$1
LOWER_F="/sys/devices/platform/smapi/BAT${BAT_N}/start_charge_thresh"
UPPER_F="/sys/devices/platform/smapi/BAT${BAT_N}/stop_charge_thresh"

#SETTING THE THRESHOLDS
echo ${LOWER} > ${LOWER_F}
echo ${UPPER} > ${UPPER_F} 

#ECHOING THE STUFF
echo -e "\nSetting battery thresholds for Battery ${BAT_N}:
  Threshold for charging to start: ${LOWER} 
  Threshold for charging to stop: ${UPPER} 
"
exit 0;

执行用:

set_bat_thresh 0 start_charge end_charge

至于trackpoint小红点,AUR里面有一个trackpoint脚本,用yaourt -S trackpoint安装,安装完毕将trackpoint加到/etc/rc.conf的DAEMONS里面。/etc/conf.d/trackpoint里面可以更改一些设置如:

  • SPEED: 小红点光标移动速度。
  • SENSITIVITY: 小红点敏感度。
  • PRESS_TO_SELECT: 小红点单击功能。

中键模拟用如下的脚本设置下(我也忘了是从哪里找到的了):

xinput set-int-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation" 8 1
xinput set-int-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Button" 8 2

硬盘保护(Active Protection System)用的是AUR里面的HDAPS,参看ArchWiki,Applet用的是thinkhdaps,根据需要改下/etc/conf.d/hdapsd里面的设置,效果还不错,抱着笔记本在床上看电影的时候视频会一卡一卡的。

风扇控制貌似不太不要,而且设置不好会影响散热效果,降低笔记本的寿命。这个功能主要目的貌似是使笔记本更安静些。用的软件包是AUR里面的tpfand和tpfan-admin,tpfand.conf是copy来的,参考这里。用了之后好像也没啥特别的效果。

最后show下/etc/rc.conf里面的设置,日后重装的时候也好有个参考:

#
# /etc/rc.conf - Main Configuration for Arch Linux
#

# -----------------------------------------------------------------------
# LOCALIZATION
# -----------------------------------------------------------------------
#
# LOCALE: available languages can be listed with the 'locale -a' command
# HARDWARECLOCK: set to "UTC" or "localtime", any other value will result
#   in the hardware clock being left untouched (useful for virtualization)
# TIMEZONE: timezones are found in /usr/share/zoneinfo
# KEYMAP: keymaps are found in /usr/share/kbd/keymaps
# CONSOLEFONT: found in /usr/share/kbd/consolefonts (only needed for non-US)
# CONSOLEMAP: found in /usr/share/kbd/consoletrans
# USECOLOR: use ANSI color sequences in startup messages
#
LOCALE="en_US.UTF-8"
HARDWARECLOCK="localtime"
TIMEZONE="Asia/Shanghai"
KEYMAP="us"
CONSOLEFONT=
CONSOLEMAP=
USECOLOR="yes"

# -----------------------------------------------------------------------
# HARDWARE
# -----------------------------------------------------------------------
#
# MOD_AUTOLOAD: Allow autoloading of modules at boot and when needed
# MOD_BLACKLIST: Prevent udev from loading these modules
# MODULES: Modules to load at boot-up. Prefix with a ! to blacklist.
#
# NOTE: Use of 'MOD_BLACKLIST' is deprecated. Please use ! in the MODULES array.
#
MOD_AUTOLOAD="yes"
#MOD_BLACKLIST=() #deprecated
MODULES=(uinput tp_smapi thinkpad_acpi thinkpad_ec vboxdrv)

# Scan for LVM volume groups at startup, required if you use LVM
USELVM="no"

# -----------------------------------------------------------------------
# NETWORKING
# -----------------------------------------------------------------------
#
# HOSTNAME: Hostname of machine. Should also be put in /etc/hosts
#
HOSTNAME="lox-pad"

# Use 'ifconfig -a' or 'ls /sys/class/net/' to see all available interfaces.
#
# Interfaces to start at boot-up (in this order)
# Declare each interface then list in INTERFACES
#   - prefix an entry in INTERFACES with a ! to disable it
#   - no hyphens in your interface names - Bash doesn't like it
# 
# DHCP:     Set your interface to "dhcp" (eth0="dhcp")
# Wireless: See network profiles below
#

#Static IP example
#eth0="eth0 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255"
eth0="dhcp"
INTERFACES=(!eth0)

# Routes to start at boot-up (in this order)
# Declare each route then list in ROUTES
#   - prefix an entry in ROUTES with a ! to disable it
#
gateway="default gw 192.168.0.1"
ROUTES=(!gateway)
 
# Enable these network profiles at boot-up.  These are only useful
# if you happen to need multiple network configurations (ie, laptop users)
#   - set to 'menu' to present a menu during boot-up (dialog package required)
#   - prefix an entry with a ! to disable it
#
# Network profiles are found in /etc/network.d
#
# This now requires the netcfg package
#
#NETWORKS=(main)

# -----------------------------------------------------------------------
# DAEMONS
# -----------------------------------------------------------------------
#
# Daemons to start at boot-up (in this order)
#   - prefix a daemon with a ! to disable it
#   - prefix a daemon with a @ to start it up in the background
#
DAEMONS=(@syslog-ng @dbus !hal !network !netfs @acpid @tpfand @crond @hdapsd @laptop-mode @wicd @kdm bluetooth @trackpoint)

大概就这么多吧。都是些琐碎的东西,能用就好了。想想Linux的东西变动如此之快,有些东西是真的不必深究的。比如关于中键模拟有上面的方案,也有改xorg.conf的方案。比如hal这个东西,再比如X Window和未来的Wayland,比如ext4和btrfs。想想自己走的也有些偏了,过于追求工具化的东西,倒是忽略了最本质的知识,如体系结构,算法等等。这就比如户外旅行,总是想方设法装一辆拉风的自行车,却很少去骑车领略旅行的真谛。四年,四年前的我还只会开机关机,四年后的我折腾系统小打小闹颇有一套,最本质的计算机基础却一塌糊涂。希望自己的折腾之旅到此位置吧。接下来的关键词是,lisp、tcp/ip,hadoop。

ArchLinux下安装VirtualBox的问题

出现了小问题,参见这篇文章

还有两个十分十分诡异的问题。

一个是在编译XeTeX+xeCJK文档时,如果是普通用户,就会卡住。如果是root用户,则一帆风顺。我去看了下文件权限,去改了下,但是也没有效果。连sudo编译也不行。太诡异了。

二是音乐播放的问题。gdm登入的时候是有声音的,但是音乐播放器就是放不出声音,包括rhythmbox,exaile。而我自己装的realplayer有声音,mplayer也有声音。在kde桌面环境下,一首歌的前二十秒通常是没有声音的,忽然之间就会来了声音。太tn的诡异了。

arch的软件库比ubuntu的要小很多。我想要的dwww,emacs-jde都没有官方支持。至于传说中的AUR,鉴于浙大玉泉故步自封的内网环境,我还没有尝试过。希望能够带来惊喜。

三是系统时间的问题。我的系统时间总是错误。查验过BIOS,BIOS的时间是正确的。但是系统时间却总是错误。每次改过来,重启之后依然错误。why?

不过整个系统运行起来还是要比ubuntu轻便很多,依赖关系也确实简单了很多。至于ABS,我还没有机会使用。莫非,这是我转向gentoo之前的折磨?

换archlinux了,我的linux之旅

接触linux是在大一上吧。最开始是Fedora 8,看重的是名声、技术、背景,以及软件安装光盘的个头——毕竟个头大,软件多,就省得自己再去安装了。说实话我是个很浮云的人。什么新鲜的软件都想拿来体验一下,虽然我不一定用到太多,比如eclipse、netbeans之类。可是Fedora 8有两点让我很是不爽:

  1. 无论是校内还是校外,都没有好用的软件源,虽然我那个时候还不清楚源的具体概念。只是知道那是一个软件仓库。无法安装软件,无疑,这个系统是死的。
  2. 无法启动激动人心的3D。这对一个追求浮云的Linux初学者来说也是毫无吸引力的。

所以那个时候虽然本本上装了Fedora和Vista双系统,但绝大多数时间是在用Vista系统。

后来偶然再一个同学的电脑上看到了ubuntu,我试探性的让他一弄,结果wobbly windows效果就出来了。再我看来很神奇。后来一不做二不休,电脑大换血,重装了Vista和Ubuntu。

只能说ubuntu是个很人性化的系统。帮用户做了很多贴心的工作。LiveCD,wubi,良好的驱动支持,巨大的软件仓库,丰富的国内源,很简单。从Vista到ubuntu的转换,只用了两个月不到的时间。乃至终有一天,我烦透了windows软件的注册破解和广告,心一横,删了Vista,至此,ubuntu成了我的宠儿,不紧不慢的占据了本本250G的空间。

可以说ubuntu带给了我一个高效能的系统。让我有了非凡的GNU体验。Emacs+Firefox的组合,几乎占据了我使用操作系统80%的时间。现在觉得windows的工作方式,如此的傻瓜,如此的低效。

但是ubuntu并不是一个完美的系统。apt-get的依赖关系过于复杂,自作主张的安装给人带来方便的同时也剥夺了人们定制的自由,频繁的版本升级带来很多系统的问题,软件库版本比较陈旧,譬如我一直想用的texlive2008。直到ubuntu 9.10 beta版,texlive还是停留在2007版本。等等。一周以前我决定升级我的9.04到9.10beta版时来体验下Firefox 3.5, OOo3.1时,系统最终崩溃,这已经是第二次版本升级失败。于是我决定给系统来个大换血。gentoo,还是arch?

我选择了arch。首先是时间的原因。其次是我的linux基础还不够。本来打算三天配置一个gentoo,但是这个事情那个事情,最后只剩一天不到。快速的搭建一个可用的系统,只能arch了。安装的过程还算顺利。网络、驱动是两个重头重难题。幸好室友装过arch,给了我很大的帮助。我发现交流真的是很重要的。自己埋头苦干有时候纯粹是浪费时间。今天终于配好了。驱动,字体,中文,美化。凑合能用。虽然还是比不上一周前ubuntu+Mac4Lin的华丽,但也可以看得过去了。不过arch也有不完美的地方。首先是官方的软件仓库很小。很多我需要的软件都没有,譬如dwww。emacs的插件也少的可怜。aur是个不错的选择,只是我还没有尝试。因为浙大10元的vpn只能上教育网。字体配置还有些小问题。部分地方发虚,慢慢调吧。

arch确实让我学到了很多东西。譬如我再ubuntu下从来没考虑过xorg.conf的问题。ubuntu带给人便利,也让人变傻,以至于遇到问题时不知如何下手。对系统的构建有了更进一步的理解。有机会一定要来一次LFS

最后上张图吧。




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee