Druggo 的介绍,一直在我的 Genbox ( 我的 Gentoo 机器名 ) 下使用 TuxOnIce 内核。现在在家里的 Montty ( 我的 Archlinux 机器名 ) 下实在觉得 Archlinux 的预编译内核太大了,而且全部以模块方式加载启动系统时的 Loading Udev Events 要花去尽 20 秒,难以忍受。很有必要自己编译一个精简的内核,而 Archlinux 的 AUR 里正好有 TuxOnIce 的 PKGBUILD。

先说下为什么在 Archlinux 下自己编译一个 TuxOnIce 内核:

  1. 精简内核,去掉不需要的模块,减少启动时间
  2. AUR 里的 TuxOnIce 打了 Gentoo 的内核补丁集
  3. TuxOnIce 支持休眠到 swap,充分利用绰绰有余的 swap 空间
  4. 支持断电休眠,重新唤醒系统速度快,免去重启烦恼

步骤

先用 $ 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 就是其一。