2010年11月26日星期五

VirtualBox的NAT,2

实现了VirtualBox虚拟机通过宿主机的NAT。具体方法见这里。文章中的方法已经自动设置了SNAT,这样在虚拟机里面就可以连接互联网了。

如果要让互联网的主机连接到虚拟机的服务,还需要配置DNAT。比如要让互联网访问虚拟机上的HTTP服务,那么只需在宿主机添加如下iptables规则(前提是在宿主机和虚拟机上都没有别的规则阻碍这一条的生效):
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.2 --sport 1024:65535 --dport 80 -j DNAT --to 172.16.0.209
192.168.1.2是宿主机的IP地址(这个地址通过家用路由器连接互联网),172.16.0.209是虚拟机的IP地址。

实际演示案例中,宿主机是Ubuntu 10.10,开了Apache。虚拟机是Fedora 11,开了nginx。注意Fedora默认的iptables规则拒绝了大部分连接,需要清除掉。在配置上述DNAT规则前,我们在浏览器里面连接到的是宿主机Ubuntu下的Apache。

在配置了上述DNAT规则之后,我们连接上的是虚拟机Fedora下的nginx。

上面的IP地址125.33.200.186是我们宿主机的因特网IP地址,当然也可以用192.168.1.2测试,这样做是为了演示从外面的机器上用因特网地址访问也是可以看到DNAT后的效果的。

2010年11月24日星期三

VirtualBox的NAT,1

VirtualBox (3.2.8)的NAT网络模式在手册里面是这么描述的:
A virtual machine with NAT enabled acts much like a real computer that connects to the Internet through a router. The "router", in this case, is the VirtualBox networking engine, which maps traffic from and to the virtual machine transparently.
这个神秘的NAT engine,是在宿主系统看不到的。而我更希望虚拟机是通过宿主系统的网卡来实现NAT的,这样可以用来模拟测试真实的NAT环境。

SSH Tunnel不能自动启动

我在GNOME的Startup Application里面添加了一个启动SSH隧道的脚本,内容只有一行建立隧道的SSH命令。以前都可以自动启动,最近两台电脑上都不能自动启动了,进去桌面后没有隧道,要手动执行一遍才可以。

我在启动脚本里面添加了一行zenity --calendar,这样可以弹出一个日历对话框。注销后再进入桌面,日历能出来,说明脚本被执行了,但是隧道没有建立。试了试在SSH命令前面加一行sleep 5,让等5秒再执行脚本。注销再进入,脚本就可以自动启动了。

猜测原因是这样的。脚本立刻启动的话,NetworkMananger还没有把网络设置好,导致隧道无法成功建立。而等上几秒再建立隧道,此时网络已经连好(由路由器分配静态IP地址),隧道也可以建立了。NetworkManager确实是GNOME的启动脚本,也在Startup Application里面。如果注销了桌面,网络也就断了。

rsync同步

用rsync从笔记本往台式机同步,发现原来从台式机同步到笔记本的某些文件竟然和台式机的源文件不同,大小小于源文件。难道是之前同步过程中被人为中断导致的吗?有这么简单吗?

2010年11月13日星期六

内存大小

VPS上查看内存大小:
$ free -b
total used free shared buffers cached
Mem: 110288896 105762816 4526080 0 4096 63508480
-/+ buffers/cache: 42250240 68038656
Swap: 268427264 1064960 267362304
我一算内存大小没有他们宣称的128MB啊,128MB应该是134217728字节。

然后客服回答说:
Some memory is reserved for the kernel. In previous kernel versions, reserved memory was counted as part of the kernel free -m output, now it is not. You can verify that you have the full 128MB by reading dmesg.
后来在IRC问了问,对比了一下他们贴的结果,发现dmesg里面的这行:

[    0.000000] Memory: 107040k/131072k available (5434k kernel code, 384k absent, 23488k reserved, 5022k data, 448k init)
里面的131072k就是所有的物理内存大小,正好是128MB,因为131072/1024=128。看来客服没撒谎。

这次也发现我台式机所谓的2G内存实际是有水分的:

[    0.000000] Memory: 1781996k/1833856k available (5708k kernel code, 452k absent, 51408k reserved, 5382k data, 908k init)
1833856/1024=1790.875。只有1790MB,这和BIOS中看到的数字是一样的。这个数字其实是扣除了用于显存的内存大小256MB。

dmidecode

dmidecode这个命令可以显示硬件的一些信息,这个命令就在dmidecode这个包里面。DMI是Desktop Management Interface的缩写。

2010年11月7日星期日

APT

在服务器上安装update-notifier-common,可以在console下登录后显示可用更新,因为该包安装了/etc/update-motd.d/90-updates-available,可以动态更新MOTD(Message
Of The Day)。但是后台的更新并不是由该包实现,而是由apt包实现,该包安装了/etc/cron.daily/apt,用于检查更新。此外,unattended-upgrades是为了实现自动、无人干预下的安全更新安装。

貌似现在apt相关的软件挺多,关联也比较复杂,但是只要软件提供了清晰的文档,耐心阅读文档,就可以搞清楚都是干什么的。

2010年11月5日星期五

显卡驱动的问题

笔记本的桌面特效都可以,但是glchess、chromium-bsu、supertux2和stellerium都启动不起来。这台电脑是内置的Intel的显示芯片,但是装系统的时候,是从台式机上的dpkg
--get-selections输出中装的软件,把ATI的显卡驱动fglrx也给装上了。把这个驱动卸载掉就好了。

file:///

用URL表示本地文件的时候,我们用file协议,例如file:///usr/share/doc/。中午躺着的时候,我想到这个表示中用了3个斜杠,其实第3个斜杠不属于URL格式要求中的斜杠,而属于资源路径的一部分,即文件系统的根目录。

刚看到/etc/init.d/README里面,用了file://localhost/usr/share/doc/debian-policy/这样的URL来指向本地文件。试了一下可以,而且把localhost替换成主机名、127.0.0.1也可以。我觉得这样的表述和我们平常用的URL在格式上更统一了,应该提倡。

当我再试,把localhost替换成内网IP、IPv6地址的时候,Firefox都像前面一样,跳转到了对应的file:///地址。最后发现,不管你用什么字符串替换localhost,Firefox都跳转。这表明Firefox忽略了第2个斜杠和第3个斜杠之间的东西。Chromium也是一样,只是第2个斜杠和第3个斜杠之间的字符串不消失。w3m就不行了,貌似只有file://localhost/好使。

关于URL的用法,应该有RFC规定标准的,可是现在手头没有RFC可看。

PS:最近看了看RFC 2616,是介绍HTTP协议的。尽管只看了一部分,但也算是我真正看过的第一个RFC。发现RFC并没有我想象得那么晦涩,作为最权威的文本,应该多看看好。

2010年11月4日星期四

Nautilus预览图片的BUG

以前就出现过。在一个放图片的目录下,有的图片没有预览出来,Nautilus一直试图预览不停,导致系统资源被耗光。用top查看,发现CPU主要使用在wa(I/O waiting),Nautilus占用了很多内存。

为了搞清是哪个图片的问题,我把没有预览出来的图片,用别的程序挪出目录,直到排查出问题图片,原来是一张6M大的GIF图片,是显示全球夜晚灯光对比的一张著名的图片。这张图片预览不出来,就一直卡在这里,导致其它的图片也预览不出来。最后把这张图片删除,再把挪出去的图片挪回来就好了。

虽然是一个简单的、时有发生的问题,但有时候就直接强行关闭完事,而没有寻找线索去解决。当试着去解决的时候,总是可以学到一些东西的。

NTP服务自动启动的问题

NTP服务在桌面Linux上是不用去操心的。但是我用手机网络的时候,不想用NTP。可是在停止了NTP服务后,只要一联网就发现NTP又启动了。结果在/usr/share/doc/ntp/README.Debian.gz里面找到了答案:

If DHCP is used to configure the host, and the DHCP server sends
information about NTP servers, then this information will be used
automatically. This is done by making a copy of /etc/ntp.conf at
/var/lib/ntp/ntp.conf.dhcp, replacing the server entries with the
information provided by the DHCP server, and restarting the NTP
server.

In order for this to work, the "ntp-servers" option must be mentioned
in the "request" statement in /etc/dhcp3/dhclient.conf. This is not
the case in a default installation. A complete configuration might
look like this, for example:

request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
ntp-servers;

If you don't like using the NTP servers sent by the DHCP server, this
is also the right place to turn off this behavior.

这就是说DHCP联网的话,可能会让NTP服务器重启。不需要的话,在/etc/dhcp3/dhclient.conf里面关掉即可。

PS:最近发现软件包在/usr/share/doc下对应目录里面的README.Debian.gz文件挺有用的。因为Debian经常会对原版的软件进行修改,特别是配置方式的改动。如果养成查看这个文件的习惯,可以帮助尽快地排除问题。

2010年11月3日星期三

grep -E

grep查找bin下面的文件怎么没有呢?
tux@dell:/etc/alternatives$ dpkg -L sensible-utils | grep 'bin/.+'
需要用扩展的模式(Extended Regular Expression)才行:
tux@dell:/etc/alternatives$ dpkg -L sensible-utils | grep -E 'bin/.+'
/usr/bin/select-editor
/usr/bin/sensible-browser
/usr/bin/sensible-editor
/usr/bin/sensible-pager
因为在基本模式下,需要\+代替+才行:
tux@dell:/etc/alternatives$ dpkg -L sensible-utils | grep 'bin/.\+'
/usr/bin/select-editor
/usr/bin/sensible-browser
/usr/bin/sensible-editor
/usr/bin/sensible-pager
grep的手册里面说了:
Basic vs Extended Regular Expressions In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \).
grep默认不是Extended模式,需要加参数-E。可是扩展模式才是习惯的模式,用的时候还得记着,或者用egrep

2010年11月2日星期二

Cron和Anacron

今天查看Ubuntu下系统的cron任务是如何执行的,发现了很纠结的事情。
系统的cron文件/etc/crontab的相关内容是这样的:

17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

第一行确保了/etc/cron.hourly中的任务可以运行,但是这个目录是空的,没任务。下面三行是说,如果/usr/sbin/anacron不能执行,才执行/ect/cron.daily、/etc/cron.weekly和/etc/cron.monthly里面的任务。但是anancron是装上的,所以后面三行中的任务是没法执行的。
然后摸索了下,看看anacron是个什么东东。它的系统任务是/etc/anacrontab,这个文件的内容如下:

1 5 cron.daily nice run-parts --report /etc/cron.daily
7 10 cron.weekly nice run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly

看到这里才明白了,原来是通过anacron来运行cron的任务。就是说实际的任务脚本在cron的相关目录里面,而调用是要通过anacron的。难怪我要说纠结呢。
anacron的手册里面也指出了anacron的这种用法:

Anacron can be used to execute commands periodically, with a
frequency specified in days. Unlike cron(8), it does not assume that
the machine is running continuously. Hence, <b>it can be used on
machines that aren't running 24 hours a day, to control daily, weekly,
and monthly jobs that are usually controlled by cron.</b>

可以看出anacron是辅助cron任务更好地得以执行的。把anacron删除了这些任务还是可以运行,但是必须在指定的时间开机才行,而不是anacron那样能够"补上"漏掉的任务。

2010年11月1日星期一

GNOME使用技巧之一——隐藏家目录下的文件


在家目录创建.hidden文件,然后把要隐藏的目录或文件名写到.hidden文件里面,那么这些文件就在Nautilus里面隐藏了。如果该文件内容为:
bin
Templates
那么bin和Templates在Nautilus里面就看不到了,需要在View菜单里面勾上Show Hidden Files才能看到。该方法只能隐藏位于家目录下的文件。其实在Nautilus里面:'.'开头的文件是标准的隐藏文件,~结束的文件是备份文件,默认也是隐藏的。

PS:linux相关的tip,一直纠结是发在这里好还是贴在twitter上好。在twitter发过几条,但是总觉得那里信息太杂,也不好找,所以又返回这里了。

关闭笔记本电脑的触控板

笔记本的触控板移动效率低,用的时候手完全脱离键盘,很不方便,而且打字的时候碰到更烦人。我想把我的Dell Inspiron 14v笔记本电脑的触控板关掉。在Ubuntu下触控板可以用,但是在鼠标设置里面看不到。用xinput查看,原来是把触控板认成一个普通鼠标了。 用xinput工具即可关掉。

xinput原初的输出:
tux@dell:~$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=11    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=12    [slave  pointer  (2)]
⎜   ↳ PS/2 Generic Mouse                          id=14    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Video Bus                                   id=6    [slave  keyboard (3)]
    ↳ Power Button                                id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_0.3M               id=9    [slave  keyboard (3)]
    ↳ 2.4G Receiver                               id=10    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=13    [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                            id=15    [slave  keyboard (3)]
把触控板暂停掉:
tux@dell:~$ xinput float 14
tux@dell:~$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=11    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=12    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Video Bus                                   id=6    [slave  keyboard (3)]
    ↳ Power Button                                id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_0.3M               id=9    [slave  keyboard (3)]
    ↳ 2.4G Receiver                               id=10    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=13    [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                            id=15    [slave  keyboard (3)]
∼ PS/2 Generic Mouse                          id=14    [floating slave]
如果需要,再恢复:
tux@dell:~$ xinput reattach 14 2
tux@dell:~$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=11    [slave  pointer  (2)]
⎜   ↳ 2.4G Receiver                               id=12    [slave  pointer  (2)]
⎜   ↳ PS/2 Generic Mouse                          id=14    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Video Bus                                   id=6    [slave  keyboard (3)]
    ↳ Power Button                                id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ Laptop_Integrated_Webcam_0.3M               id=9    [slave  keyboard (3)]
    ↳ 2.4G Receiver                               id=10    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=13    [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                            id=15    [slave  keyboard (3)]
把xinput float 14放到~/.gnomerc里面就可以了。放到~/.xinitrc里面竟然不行,原因懒得找。