经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就是其一。
看不懂.. = = 师傅 HOHO 来踩踩,,