经 Druggo 的介绍,一直在我的 Genbox ( 我的 Gentoo 机器名 ) 下使用 TuxOnIce 内核。现在在家里的 Montty ( 我的 Archlinux 机器名 ) 下实在觉得 Archlinux 的预编译内核太大了,而且全部以模块方式加载启动系统时的 Loading Udev Events 要花去尽 20 秒,难以忍受。很有必要自己编译一个精简的内核,而 Archlinux 的 AUR 里正好有 TuxOnIce 的 PKGBUILD。
先说下为什么在 Archlinux 下自己编译一个 TuxOnIce 内核:
- 精简内核,去掉不需要的模块,减少启动时间
- AUR 里的 TuxOnIce 打了 Gentoo 的内核补丁集
- TuxOnIce 支持休眠到 swap,充分利用绰绰有余的 swap 空间
- 支持断电休眠,重新唤醒系统速度快,免去重启烦恼
步骤
先用 $ yaourt kernel26-ice 获取 TuxOnIce 的 PKGBUILD,它会提示是否修改 PKGBUILD 文件。我打算自己配置内核选项,所以去掉 PKGBUILD 里那句 make menuconfig 的注释。
# use menuconfig, if you want to change the configuration
make menuconfig
yes "" | make config
然后 Y 下去,直到出现内核配置界面。我偏向于把东西编译内核,而不是编译为模块,这样做的好处是根本不用去管该手动加载哪些模块,哪些是需要的。为了让 Suspend 功能运转,需要把勾选以下设置。
Power management options (ACPI, APM) --->
[*] Hibernation (aka 'suspend to disk')
(/dev/<swap-partition>) Default resume partition
<*> Enhanced Hibernation (TuxOnIce) --->
--- Image Storage (you need at least one allocator)
<*> File Allocator
<*> Swap Allocator
--- General Options
<*> Compression support
<*> Userspace User Interface support
(/sbin/tuxoniceui_text) Default userui program location
[ ] Allow Keep Image Mode
[*] Replace swsusp by default
< > Cluster support --->
[*] Checksum pageset2
(25) Default waiting time for emergency boot messages
< > Test pageflags
Cryptographic options --->
<*> LZF compression algorithm
其中 /dev/<swap-partition> 为 swap 分区位置,开启 LZF 压缩可以加快休眠/唤醒速度,不过需要耗费点 CPU 资源。怕啥,我 PIII 667Mhz 的老爷机都用上它了。
用多核 CPU 的还需要勾选这些 ( 与我无关 )
Kernels before 2.6.22
Processor type and features --->
[*] Support for hot-pluggable CPUs (EXPERIMENTAL)
Kernel 2.6.22 and after:
Processor type and features --->
[*] Support for suspend on SMP and hot-pluggable CPUs (EXPERIMENTAL)
修改好 config 后等它自动编译吧,然后运行 $ sudo pacman -U kernel26-ice-2.6.26-3-i686.pkg.tar.gz 安装内核,其间会运行 mkinitcpio 生成 initramfs,无所谓。反正都编译进 kernel 了,而且又是自己手动编译的,根本不需要 initramfs。
完成后添加类似几行到 /boot/grub/menu.1st:
title Arch Linux TuxOnIce
root (hd1,0)
kernel /vmlinuz26-ice root=/dev/sdb3 ro
其中 (hd1,0) 指的是 /boot 分区,/dev/sdb3 是 / 分区。
我用的是 N 卡,还需要去 AUR 下个 nvidia-96xx-ice 的显卡驱动 ( 我的还是 GeForce 2 系列的卡 )。$ yaourt nvidia-96xx-ice 或者 $ yaourt nvidia-ice 就是了。
要用 Suspend 功能,还需要 $ yaourt hibernate-script。然后修改 /etc/hibernate/blacklisted-modules,把 nvidia 这行注释了,不然 hibernate 会报错。
在 /etc/hibernate/common.conf 里找到这几行,去掉注释,以便在休眠时断开网络,唤醒时重新连接。
### network
DownInterfaces eth0
UpInterfaces auto
我用的是 Nvidia 的 GeForce 2 的卡,还需要在 /etc/X11/xorg.conf 里的 Device Section 里添加一句 Option "NvAGP" "1",如下:
Section "Device"
Identifier "Card0"
Driver "nvidia"
VendorName "nVidia Corporation"
BoardName "NV11 [GeForce2 MX/MX 400]"
BusID "PCI:1:0:0"
Option "NvAGP" "1"
...
EndSection
最后在 /etc/rc.conf 里检查下 MODULES 这行,把不需要的模块都清除掉,因为我是全部编进了 kernel,直接将此行留空。
全部搞定后重启进入新的 TuxOnIce 内核吧,我的 Loading Udev Events 时间由 20 秒缩短为 7 秒了 ( 还是很不爽啊! Gentoo 多快啊!) 再次重编,Udev Events Loading 缩短为 4 秒了,总算比较可以忍受了,运行 $ sudo hibernate -n 进行休眠测试,没问题的话以后就 $ sudo hibernate 进行休眠吧。唤醒的话正常开机由 grub 引导进入就行了。
参考
最后抱怨几句:
为什么 Archlinux 要把 kde3 赶出 repo,kde4 还不足够稳定到给广大用户使用吧。像 Gentoo 那样用不同的 slot 机制来并存 kde3 和 kde4 多好。
Archlinux 的源很痛苦,ABS 的 rsync 服务器更是痛苦…
尽管有官方预编译包,我还是需要自己去手动编译那些软件,scim 就是其一。