2011年12月20日星期二

Ubuntu 11.10 VirtualBox的Host-only网卡上外网和DHCP永久地址

VirtualBox支持各种虚拟网络:NAT, Bridge Adapter, Internal Network和Host-only Adapter等。其中Bridged Adapter最为简单和常用,它几乎是0配置,直接桥接有线或无线物理网卡就可以与互联网通信。

然而,我工作场所内部网和家里内部网的网段不相同,DHCP存在一定租赁时间,如果使用Bridged Adapter并DHCP获取IP地址的时候,虚拟机地址经常会改变。为此,我将笔记本电脑的VirtualBox虚拟机都修改为Host-only Adapter模式。


一个问题是Host-only Adapter(网段为192.168.56.0/24)默认不能与互联网通信。google之后发现网上早有人遇到类似问题,他们给出的解决办法是在/etc/rc.local中加入:

iptables -t nat -I POSTROUTING -s 192.168.56.0/24 -j MASQUERADE


另一个问题是VirtualBox内置DHCP的IP租赁时间设置,也无法将MAC地址与IP地址静态绑定,这造成虚拟机IP地址每隔一段时间改变一次,给使用带来诸多不方便。另一方面,我也不想静态设置IP地址,因为如果这样做,我必须每安装一次虚拟机都要重新设置IP地址。

以前就听说过dnsmasq,不仅集成DNS、DHCP和TFTP功能,而且占用资源很少,设置也相对简单。
  1. 安装dnsmasq
    sudo apt-get install dnsmasq
    
  2. 打开/etc/dnsmasq.conf,针对vboxnet0配置DHCP。
    interface=vboxnet0
    
    # 192.168.56.1是默认网关(host机器的vboxnet0地址)
    # 208.67.222.222和208.67.220.220是DNS地址(这里使用了OpenDNS)
    dhcp-option=vboxnet0,option:dns-server,192.168.56.1,208.67.222.222,208.67.220.220
    
    # 192.168.56.2和192.168.56.254为分配地址范围
    # infinite表示IP永远不过期
    dhcp-range=vboxnet0,192.168.56.2,192.168.56.254,infinite
    
  3. 重启动dnsmasq
    sudo service dnsmasq restart
    

当然,dnsmasq也支持MAC地址与IP地址静态绑定。比如,在/etc/dnsmasq.conf中针对MAC地址08:00:27:81:51:85,分配机器名vbox-xp,分配IP地址192.168.56.2
dhcp-host=vbox-xp,08:00:27:81:51:85,192.168.56.2
最后,不要忘了重启动dnsmasq。

2011年10月31日星期一

为tolua的deb包作一个补丁

近日在学习tolua时发现在Kubuntu 11.10 amd64平台下将其链接到so时报告如下错误:
... relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC

为此,我决定在其原deb基础上加一个补丁,这样生成的新包可以安装到其他开发机器上,省去了每次重编译tolua的重复劳动。


  1. 为构建和修改deb安装必要的工具(配置quilt):
    sudo apt-get install build-essential debhelper quilt


  2. 下载libtolua-dev的源码,创建补丁add-fpic-O2-for-amd64.patch,并将config文件加入其中:
    apt-get source libtolua-dev
    cd tolua-5.1.3
    mkdir -p debian/patches
    quilt new add-fpic-O2-for-amd64.patch
    quilt add config


  3. 将config文件中,如下内容
    CFLAGS= -g $(WARN) $(INC)
    CPPFLAGS= -g $(WARN) $(INC)
    替换为
    CFLAGS= -fPIC -O2 -pipe -g $(WARN) $(INC)
    CPPFLAGS= -fPIC -O2 -pipe  -g $(WARN) $(INC)


  4. 生成补丁add-fpic-O2-for-amd64.patch
    quilt refresh

    为补丁增加描述信息
    quilt header -e

    其具体内容如下:
    Description: Fix relocation R_X86_64_32 against '.rodata' can not be used when making a shared object
    Author: Like Ma <likemartinma@gmail.com>
    
      * config: add -fPIC -O2 -pipe to CFLAGS and CPPFLAGS


  5. 在debian/changelog顶部增加日志信息:
    tolua (5.1.3-2) unstable; urgency=low
    
      * Fix relocation R_X86_64_32 against '.rodata' can not be used when making a shared object
    
    -- Like Ma <likemartinma@gmail.com> Mon, 31 Oct 2011 15:23:09 +0800
    


  6. 构建libtolua-dev_5.1.3-2_amd64.deb:
    dpkg-buildpackage -d -uc -us -rfakeroot

blogger的代码加亮

作为一个程序员,没有代码加亮的世界是多么苍白。在上一篇博客中,我利用vim的代码html转换功能来美化代码部分。这个办法实在太笨了,它花了我不少时间来编辑上一篇博客,以至于让我失去了写博客的兴趣。

最近,我无意中发现了一篇如何利用google-code-prettify来加亮代码的文章——Code highlighting on blogger。该文章并没有讲述不同语言的加亮方法,官方网站的README描述了相关解决办法。

我马上将其应用在前一篇博客中,然而默认效果并不令我满意。由于我长期使用vim的黑底系列的颜色方案,我需要一种类似的代码颜色方案来美化博客。

让人欣喜的是官方网站的themes gallery正好提供了我需要的颜色方案sunburst,这只需要简单将上文提及的
http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css
替换为
http://google-code-prettify.googlecode.com/svn/trunk/styles/sunburst.css
另外,我还专门为我的博客换了主题,每切换一次主题需要我重新将代码加亮的相关css和js重新手动加上。为此我用sed一个脚本来简化这个过程,具体内容如下:
#!/bin/sed -f

/<\/head>/i \
<link href='http://google-code-prettify.googlecode.com/svn/trunk/styles/sunburst.css' rel='stylesheet' type='text/css'/> \
<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'/>

/<body[[:blank:]]/ {
s/>/ onload='prettyPrint()'>/
}
具体的使用办法为:
  1. 在Design页面中,下载当前的template
  2. 利用上述脚本处理下载的template,从而生成新的template
  3. 在Design页面上传新的template