Tag Archives: Digital Ocean

Digital Ocean VPS Linux Kernel版本错乱导致iptables不可用

缘起

上文中提到为了解决一个NodeJS的bug,我在DO Droplet控制台中更换了linux kernel版本,从原来的3.8.4-1改成了3.9.4-1。

问题

在我准备配置iptables的时候,发现了这个操作带来的一个新的问题。DO不允许虚拟机自行升级和使用kernel。vps可以使用的kernel必须是DO提供的,在控制台中指定,重启后生效。这样的kernel升级过程绕过了Archlinux编译对应版本的kernel module的步骤,因此在我的机器上虽然已经使用了3.9.4-1的kernel,但是/lib/modules下面只有3.8.4-1的kernel module。在执行# modprob iptable_filter时,找不到对应版本的iptables相关的kernel module,结果就是无法使用iptables。

检查iptables状态时可以看到:

# iptables -S
iptables v1.4.12: can't initialize iptables table `filter': Table does not exist (do you need to insmod?)

查看kernel配置,可以确定相关功能没有编译到kernel中,而是配置成为module:

# zgrep IPTABLES /proc/config.gz
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP6_NF_IPTABLES=m

检查/lib/modules/,发现只有3.8.4-1相关的module在:

# ls /lib/modules
3.8.4-1-ARCH extramodules-3.8-ARCH

同样的问题可以在jvc26的blog post中看到。

解决

弄清楚原因之后,解决的方法也就顺理成章了。需要做的事情是编译出3.9.4-1的kernel modules,并放置在/lib/modules下面。

参考Archlinux Wiki文章Downgrading Packages中的Downgrading the kernel一节,在这里找到3.9.4-1的pkg文件下载。下载、解压然后用makepkg命令build这个linux包。Makepkg Linux 3.9.4-1

经过几十分钟的工作后,过程完成,可以在pkg目录下面找到编译的结果。把/usr/lib/modules中的内容(3.9.4-1-ARCH和extramodules-3.9-ARCH)复制到/lib/modules下面。像这样:

# ls /lib/modules
3.8.4-1-ARCH 3.9.4-1-ARCH extramodules-3.8-ARCH extramodules-3.9-ARCH

有了合适版本的kernel module之后就可以再行modprobe iptable_filter了,之后再lsmod检查一下是否生效即可。

后记

DigitalOcean看来在想办法提供让客户自行选择kernel的功能,不过目前来说还不可用。具体情况可以参考下面的文章:

https://www.digitalocean.com/blog_posts/linux-kernel-management-part-1

https://www.digitalocean.com/community/questions/how-can-i-boot-my-compiled-kernel-image-on-gentoo

https://www.digitalocean.com/community/articles/pacman-syu-kernel-update-solved-how-to-ignore-arch-kernel-upgrades

 

更改DigitalOcean虚拟机Kernel版本

本着不折腾的原则,本来应该不去动kernel这个设置的。尤其是在vps里面,厂家往往会对kernel做一些定制,针对Archlinux这种rolling release更加会禁止kernel的升级。

不过这次在使用nodejs的时候,发现了一个问题,运行程序时会报错:


events.js:72
throw er; // Unhandled 'error' event
^
Error: bind Unknown system errno 92
at errnoException (dgram.js:454:11)
at dgram.js:207:28
at dns.js:72:18
at process._tickCallback (node.js:415:13)
at Function.Module.runMain (module.js:499:11)
at startup (node.js:119:16)
at node.js:901:3

经过搜索发现貌似是nodejs和kernel之间互相有点不服,导致了问题,可以通过升级kernel绕过。

升级前的版本是:

# uname -a
Linux 3.8.4-1-ARCH #1 SMP PREEMPT Wed Mar 20 22:10:25 CET 2013 x86_64 GNU/Linux

在DO的控制面板里面,选中需要的kernel版本,再点Change。之后把vps poweroff,再在控制面板里面启动就完成了升级过程。

DigitalOcean Control Panel Kernel Update

升级后的版本是:

# uname -a
Linux 3.9.4-1-ARCH #1 SMP PREEMPT Sat May 25 16:14:55 CEST 2013 x86_64 GNU/Linux

这个“bind Unknown system errno 92”的nodejs问题也随之解决了。

迁移Blog到DigitalOcean

Linode一直以来是一个非常好的vps选择,从来不出问题,对于我的小站来说没有任何需要管理和担忧的地方。

不过鉴于DigitalOcean有更加便宜的入门方案,而且市场攻势不断,送了不少免费的额度,如果只使用最便宜的方案可以用4-5个月。所以打算先从$5/m的方案开始试试看,把我的个人blog从www.minzhang.com迁移到blog.minzhang.com上,放在DO 的Sanfransico数据中心的vps上。

在DO的管理界面上面建立虚拟机很方便快速,果然如宣传上说的一样,启用一个虚拟机只需要55秒。后来倒是花了不少时间在更换web server上,因为原来的web server使用了lighttpd,换成nginx后,配置文件不是很熟悉,绕了点弯路。

总结下来需要注意的地方有:

  • DO的Archlinux初始配置完成后,第一次升级需要手动干预,按照官网的指导做就可以
  • php.ini中的open_basedir路径和extension=mysql.so要配置对
  • nginx中要启用server_names_hash_bucket_size  64;选项以支持较长的域名

有兴趣的话猛击下图,试试DO吧:

DigitalOcean Ref Link对DO VPS有疑问的话,欢迎联系我: