在 ArchLinux VPS 上编译内核

昨天我们有位 ArchLinux 用户遇到一个 OpenVPN 的问题,在他的 VPS 上安装和配置好 OpenVPN 后可以从自己电脑连上 VPN,但是不能用 VPN 出去(访问外部网站),VPSee 和用户一起排错发现配置 OpenVPN 时候忘了用 iptable 做 SNAT 或 MASQUERADE,进一步运行 iptables 报错,内核缺少 iptables 模块:

# iptables -t nat -A POSTROUTING -s 1.1.1.1 -j SNAT --to-source 2.2.2.2
can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

找到问题就好办了,解决的办法也很容易,下载内核代码、配置 iptable 内核选项、重新编译内核。(本文已经发给客户,我们的客户可以按照这里的步骤自己编译和替换内核,如果怕麻烦的话也可以找我们要已经编译好的内核。我们争取对我们的客户遇到的问题都能写出文章和流程来帮助理解和解决,这样不但我们自己客户受益,对其他 VPS 用户也有所帮助。)

安装必要工具

编译内核需要一些工具,比如 gcc 编译器什么的:

# pacman -S make gcc patch xmlto docbook-xsl

有一点要注意的就是不是每个内核都可以在 Xen 上运行的,因为是半虚拟化所以必须使用针对 Xen 的 Linux 内核版本,还好,ArchLinux 已经为我们准备好了官方的 Xen 版本内核:

# wget http://aur.archlinux.org/packages/kernel26-xen/kernel26-xen.tar.gz
# tar -xf kernel26-xen.tar.gz
# cd kernel26-xen

修改 kernel26-xen/PKGBUILD 文件,去掉下面这行的注释:

# vi PKGBUILD
pkgname=('kernel26-xen' 'kernel26-xen-headers') # Build kernel with a different name

编译和安装内核

如果打开 kernel26-xen/config 文件就会发现内核已经是为 Xen 配置好的,并且 iptable 相关选项已经是 m 状态(以内核模块的方式运行),如果不放心的话可以再次检查 CONFIG_IP_NF_IPTABLES=m 和 CONFIG_NF_NAT=m 等选项看看是否已经是 m 或 y 状态。在 ArchLinux 下编译和安装内核:

# makepkg --asroot
...
==> Creating package...
  -> Generating .PKGINFO file...
  -> Compressing package...
==> Finished making: kernel26-xen 2.6.34.1-1 (Mon Jul 19 15:15:05 EDT 2010)

# pacman -U kernel26-xen-2.6.34.1-1-i686.pkg.tar.xz
# pacman -U kernel26-xen-headers-2.6.34.1-1-i686.pkg.tar.xz

配置 grub 以启动新内核:

# vi /boot/grub/menu.lst
...
timeout 5
default 0

title Xen for ArchLinux (VPSee)
root (hd0,0)
kernel /boot/vmlinuz26-xen root=/dev/xvda1 ro console=/dev/xvc0
initrd /boot/kernel26-xen.img
...

测试

重启系统后检查和测试新装的 Linux 内核是否有了 iptables 内核模块并安装 iptables 用户端工具:

# uname -r
2.6.34-xen

# modprobe ip_tables

# lsmod
Module                  Size  Used by
ip_tables               9099  0 
x_tables               10364  1 ip_tables
evdev                   6810  0 
pcspkr                  1383  0 
rtc_core               11631  0 
rtc_lib                 1454  1 rtc_core
ext3                  108916  1 
jbd                    35426  1 ext3
mbcache                 4250  1 ext3

# pacman -Syy iptables

评论 (3 Comments)

  1. 你们的VPS还可以自己编译内核啊
    这个好

  2. 嗯,Xen VPS 一般都可以自己编译内核。

  3. archliunx 的 AUR 真是强啊。

发表评论