在CentOS 5上安装Ubuntu KVM虚拟机

Linux下免费的虚拟化技术主要有KVM和XEN两种。KVM已经合入了Linux标准内核,也获得了诸如RedHat RHEL、Ubuntu这样的Linux发行版的支持,可以预见在未来KVM应该会成为Linux虚拟化技术的主流。只是KVM需要硬件虚拟化技术的支持,如果你的CPU不支持硬件虚拟化技术,那么只能使用XEN。

本文记录了Easwy在CentOS 5.7上安装Ubuntu KVM虚拟机的过程。

  1. 环境检查

    首先需要检查一下你的CPU是否支持硬件虚拟化技术(Hardware Vitualization):

    egrep '(vmx|svm)' --color=always /proc/cpuinfo 

    如果在你的计算机上没有任何输出,那么说明你的CPU不支持硬件虚拟化技术,也就无法使用KVM。

    另外需要注意的是,在CentOS 5.4版本以后,只有64位的CentOS才支持KVM,具体原因不清楚,所以如果你是32位的CentOS,暂时也无法使用KVM。

  2. 安装KVM

    检查完环境后,我们开始安装并激活KVM。

    首先,将SELinux的配置更改为Permissive,因为virt-install不支持SELinux为disable

    [root@srv-easwy ~]# system-config-securitylevel 

    然后安装kvm及其它虚拟化相关的软件:

    [root@srv-easwy ~]# yum install kvm kmod-kvm libvirt python-virtinst virt-manager

    接下来需要重启系统,在启动完成后,你应该可以看到KVM内核模块已经被加载了:

    [root@srv-easwy ~]# lsmod |grep kvm
    kvm_intel              85256  1
    kvm                   224800  2 ksm,kvm_intel 

    可以通过下面的命令看看KVM是不是真正运行了:

    [root@srv-easwy ~]# virsh -c qemu:///system list
    Id Name                 State
    ----------------------------------
    
    [root@srv-easwy ~]# 
  3. 配置网络

    现在配置一个网桥,以便虚拟机可以访问网络。首先安装所需的工具:

    [root@srv-easwy ~]# yum install bridge-utils 

    新创建一个文件/etc/sysconfig/network-scripts/ifcfg-br0,其内容为:

    DEVICE=br0
    TYPE=Bridge
    BOOTPROTO=dhcp
    ONBOOT=yes 

    上面的文件配置此网桥以DHCP方式获取IP地址。接下来修改原来的网卡配置/etc/sysconfig/network-scripts/ifcfg-eth0,修改为:

    DEVICE=eth0
    HWADDR=B8:AC:6F:89:10:76
    ONBOOT=yes
    BRIDGE=br0 

    然后重启网络配置,查看一下:

    [root@srv-easwy ~]# /etc/init.d/network restart
    [root@srv-easwy ~]# ifconfig
    br0       Link encap:Ethernet  HWaddr B8:AC:6F:89:10:76
              inet addr:172.23.5.50  Bcast:172.23.5.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:3242738 errors:0 dropped:0 overruns:0 frame:0
              TX packets:702638 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:1057883287 (1008.8 MiB)  TX bytes:448735998 (427.9 MiB)
    
    eth0      Link encap:Ethernet  HWaddr B8:AC:6F:89:10:76
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:3445641 errors:0 dropped:0 overruns:0 frame:93
              TX packets:670754 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:1201230368 (1.1 GiB)  TX bytes:239453000 (228.3 MiB)
              Interrupt:177 Memory:f3de0000-f3df0000
    
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:16436  Metric:1
              RX packets:63582 errors:0 dropped:0 overruns:0 frame:0
              TX packets:63582 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:154537675 (147.3 MiB)  TX bytes:154537675 (147.3 MiB)
    
    virbr0    Link encap:Ethernet  HWaddr 00:00:00:00:00:00
              inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:1797 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:0 (0.0 b)  TX bytes:470443 (459.4 KiB)
          
  4. 安装虚拟机

    基于磁盘逻辑卷管理(LVM)的虚拟机会拥有较好的磁盘I/O性能,所以在此处Easwy安装了基于LVM的虚拟机。如果你对LVM并不熟悉,可以参考我的Linux逻辑卷管理器(LVM)学习笔记

    Easwy在安装时已经在逻辑卷组中预留了部分未用空间,所以此处直接在卷组vg0中创建一个逻辑卷ubuntu,并分配了332G的空间:

    [root@srv-easwy ~]# lvcreate -L32G -n ubuntu vg0 

    接下来使用virt-install安装Ubuntu虚拟机,在此处直接使用Ubuntu的ISO文件做为源,将其安装到新创建的逻辑卷/dev/vg0/ubuntu中:

    [root@srv-easwy ~]# virt-install --connect qemu:///system -n ubuntu -r 1024 --vcpus=2 -f /dev/vg0/ubuntu -c ~/Download/ubuntu/ubuntu-10.04.3-desktop-amd64.iso --vnc --os-type linux --os-variant generic26 --accelerate --network=bridge:br0 --hvm --noautoconsole

    执行完此命令后,KVM虚拟机会使用Ubuntu的ISO文件启动,我们需要启动virt-manager,连接到此虚拟机,继续完成安装过程。这和安装真正的Linux操作系统完全一样,不再赘述。

现在,基本KVM的Ubuntu虚拟机就完全运行起来了。如果你对此还有疑问,欢迎留言。另外,参考文档中的链接也许对你也很有帮助。

更多内容,请阅读易水博客上的其它文章。

[ 参考文档 ]

Linux逻辑卷管理器(LVM)学习笔记

通过使用Linux的逻辑卷管理器(Logical Volume Manager, LVM),用户可以在系统运行时动态调整文件系统的大小,把数据从一块硬盘重定位到另一块硬盘,也可以提高I/O操作的性能,以及提供冗余保护,它的快照功能允许用户对逻辑卷进行实时的备份。

对一般用户来讲,使用最多的是动态调整文件系统大小的功能。这样,你在分区时就不必为如何设置分区的大小而烦恼,只要在硬盘中预留出部分空闲空间,然后根据系统的使用情况,动态调整分区大小。

以下内容总结了Easwy对于LVM的理解。

在LVM中,主要有三个概念:

  • 物理卷(Physical Volume, PV): 物理卷可以是一个磁盘,也可以是磁盘中的一个分区。它为LVM提供了存储介质。
  • 逻辑卷组(Logical Volume Group, LVG): 可以把逻辑卷组想象成一个存储池,或者是逻辑硬盘。物理卷与物理卷在硬件上可以是不连续的,但把多个物理卷加入逻辑卷组后,就可以把这个逻辑卷组看成一个存储空间连续的逻辑硬盘,在这块硬盘上,可以创建多个逻辑卷(LV)。
  • 逻辑卷(Logical Volume, LV): 可以将卷组划分成若干个逻辑卷,相当于在逻辑硬盘上划分出几个逻辑分区,每个逻辑分区上都可以创建具体的文件系统。

到这里我们可以看出,原本是直接在硬盘上创建分区,然后在分区上创建文件系统。使用了LVM后,在其中插入一个逻辑层,相当于是在一块逻辑硬盘上创建逻辑分区,然后在逻辑分区上创建文件系统。

新插入一个逻辑层,对单个硬盘的读写会有一定的性能损失,但其带来的好处是巨大的。首先,逻辑分区大小不再受硬盘实际大小的限制,它可以扩展到几块硬盘上;其次,逻辑分区可以很方便的做调整大小、备份等维护操作;而且,如果系统中存在多块硬盘,通过设置逻辑卷到物理卷的映射关系(采用LVM striped mapping),可以提高I/O的读写性能,因为此时的读写是在多块硬盘上并发进行的,比对单个硬盘的读写显然要快很多。

下面是一个LVM使用的例子:

Linux下逻辑卷管理器(LVM)示例

Linux下逻辑卷管理器(LVM)的一个例子

在图中有两块硬盘,其中硬盘1分了两个分区,/dev/sda1/dev/sda2,硬盘2没有创建分区。接下来在/dev/sda2/dev/sdb上创建物理卷,然后把这两个物理卷加入到逻辑卷组vg0中,现在,逻辑卷组vg0看起来像一块很大的逻辑硬盘,然后在其中创建两个逻辑卷/dev/vg0/lv0/dev/vg0/lv1

最后,分别在/dev/sda1/dev/vg0/lv0/dev/vg0/lv1上创建文件系统,并分别把它们挂载到文件系统树中。这样看上去,逻辑卷是不是很像是一个逻辑的分区?

在逻辑卷组vg0中,还预留有一部分空间未用,如果在使用中发现某个逻辑卷空间不够用了,可以在不停机的情况下,直接调整逻辑卷及其上的文件系统的大小。对服务器来讲,这是简单但非常有用的功能。

更多内容,请阅读易水博客上的其它文章。

[ 参考文档 ]

在Ubuntu上编译vim 7.3

在Thinkpad T400上安装完Ubuntu 10.04 LTS后,就开始搭建Android开发环境,第一步当然是编译vim。

目前最新的vim版本是7.3,因为从vim 7.3开始已经换用Mercurial做为版本管理工具,我们在下载vim 7.3源代码前,先要安装Mercurial:

sudo aptitude install mercurial
cd ~
hg clone https://vim.googlecode.com/hg/ vim73

执行完上面的命令后,我们就取得了vim 7.3的最新代码,放在目录~/vim73中,接下来准备编译。在编译前,需要安装编译时需要的包,在Ubuntu上用如下命令:

sudo aptitude install xorg-dev libx11-dev libgtk2.0-dev libncurses5-dev 

上面是Easwy在编译前所安装的依赖文件。后来在一篇帖子中看到另一种方法安装依赖文件,可能更方便(未测试):

sudo aptitude install build-essential
sudo aptitude build-dep vim-gtk 

接下来修改~/vim73/src/Makefile,打开自己所需要的功能,Easwy打开了下面这些特性:

  • CONF_OPT_CSCOPE = –enable-cscope
  • CONF_OPT_MULTIBYTE = –enable-multibyte
  • CONF_OPT_INPUT = –enable-xim
  • CONF_OPT_OUTPUT = –enable-fontset
  • CONF_OPT_FEAT = –with-features=big
  • CONF_OPT_COMPBY = “–with-compiledby=Easwy Yang <easwy.mail@gmail.com>”

接下来编译安装:

cd ~/vim73/src
make && make install 

执行完后编译好的vim以及gvim就安装在/usr/local/bin目录中了。将此目录加入PATH即可。

Easwy在编译后,每次运行gvim都会提示:

Warning: Missing charsets in String to FontSet conversion
Warning: Unable to load any usable fontset
Warning: Missing charsets in String to FontSet conversion
Warning: Unable to load any usable fontset
Error: Aborting: no fontset found 

后来在网上查了一下,是因为没有安装libgtk2.0-dev包造成后,安装此包再重新编译后问题解决。

如果你在编译gvim时遇到了问题,可以参考我以前写的一篇文章:vi/vim使用进阶: vim编译中遇到的问题及解决方法

最后,把我们编译的vim 7.3做为Ubuntu中的缺省编辑器,执行如下命令:

sudo update-alternatives --install /usr/bin/editor editor /usr/local/bin/vim 50 --slave /usr/share/man/man1/editor.1.gz editor.1.gz /usr/local/man/man1/vim.1.gz
sudo update-alternatives --install /usr/bin/vi vi /usr/local/bin/vim 50 --slave /usr/share/man/man1/vi.1.gz vi.1.gz /usr/local/man/man1/vim.1.gz 

Happy viming!

更多内容,请阅读易水博客上的其它文章。

[ 参考文档 ]

在Thinkpad T400上安装Ubuntu

一直以来,Easwy所使用的Linux发行版都是Debian。因为Easwy喜欢Debian上丰富的软件、便捷的安装/升级方式,以及它所代表的自由精神。前些天,Easwy预定了一部魅9手机,为了充分体验DIY的乐趣,Easwy决定自己为魅9手机编译一个ROM。因为魅9基于Android系统,为了编译Android,Easwy利用周末的时间在自己的Thinkpad T400 AA1上安装了Ubuntu 10.04 LTS版本,这篇文章做为安装Ubuntu的一个小结。

首先在Ubuntu官网上下载了Ubuntu 10.04 LTS Desktop版,刻录后使用光盘启动,我的Ubuntu之旅就开始。整个的安装过程很顺利,不得不说Ubuntu在易用性和用户界面方面下了很大的工夫,它的安装过程以及界面已经可以和Windows相媲美了。感谢Ubuntu把Linux从专业人士的工具变成了普通大众能接受的操作系统,相信在不远的将来,Linux在桌面领域会有更长足的进步。

安装完后,登录Gnome,有一种眼前一亮的感觉,曾几何时,Linux的图形界面已经做的美观如斯。并且现在Linux也非常的易用,已经不再需要费心的去安装/配置各种驱动。对Thinkpad T400的硬件,Ubuntu都能正确的识别出来:显卡(集成)正常、声卡正常、网卡以及无线网卡都可以正常工作,电源管理工作正常(能够正常待机)……

因为Ubuntu以Debian Unstable版本为基础,所以对于拥有Debian使用经验的Easwy来说有一种天然的熟悉感。在接下来的篇幅中,Easwy将简要介绍一下自己所做的一些配置。

[ sudo不需要输入密码 ]

Ubuntu缺省禁止root用户登录。在需要root权限执行命令时,用户需要使用sudo来执行相应的命令。为了在sudo时不需要输入密码,我们首先执行命令sudo visudo,这条命令会用缺省编辑器打开一个文件,找到下面这一行内容:

%admin ALL=(ALL) ALL 

将其改为:

%admin ALL=(ALL) NOPASSWD: ALL 

保存退出后,以后再使用sudo就不需要再输入密码了。

[ 修改更新源 ]

在Debian/Ubuntu中安装或升级软件时,都会自动从你配置的服务器上下载相应的软件,因此选择一个下载速度较快的源就非常重要。

Ubuntu中文Wiki上列出了国内用户常用的源,你可以为自己选择一个最快的源。使用文本编辑器打开文件/etc/apt/source.list,将你所用的源加进去就行了。在这里,Easwy所用的源是台湾的官方源:

$ sudo vi /etc/apt/source.list

# Add your source here...

deb http://tw.archive.ubuntu.com/ubuntu lucid main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu lucid-security main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu lucid-updates main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu lucid-backports main restricted universe multiverse
deb http://tw.archive.ubuntu.com/ubuntu lucid-proposed main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu lucid main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu lucid-security main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu lucid-updates main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu lucid-backports main restricted universe multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu lucid-proposed main restricted universe multiverse 

需要注意的是在添加源时,需要使用正确的版本名。上面源中的lucid就是Easwy所安装的10.04 LTS版本。可以在中文Wiki中找到你所用的版本名称。

配置Thinkpad的小红点

小红点是Thinkpad系列电脑的特色了,想让小红点在Ubuntu下正常工作,需要新建一个文件:

sudo vi /usr/lib/X11/xorg.conf.d/20-thinkpad.conf

# Add following lines...

Section "InputClass"
Identifier "Trackpoint Wheel Emulation"
MatchProduct "TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint"
MatchDevicePath "/dev/input/event*"
Option "EmulateWheel" "true"
Option "EmulateWheelButton" "2"
Option "Emulate3Buttons" "false"
Option "XAxisMapping" "6 7"
Option "YAxisMapping" "4 5"
EndSection 

然后重启一下电脑,小红点就可以正常工作了。 在Ubuntu 10.10版本中需要把文件保存为/usr/share/X11/xorg.conf.d/20-thinkpad.conf

至此,Easwy的Ubuntu环境就基本完成了。更多内容,请阅读易水博客上的其它文章。

[ 参考文档 ]

Linux使用笔记:Linux下动态链接库配置

Easwy尝试telent一个远端设备时,遇到下面的提示(ssh也遇到同样的错误):

/usr/local/bin/cli: error while loading shared libraries: libAbc.so: cannot open shared object file: No such file or directory 

在这个设备里,由xinetd来启动in.telnetd,而in.telnetd则调用/usr/local/bin/cli来做为登录程序。看上述提示,应该是in.telnetd在启动/usr/local/bin/cli时找不到动态链接库。

首先用ldd命令查看一下/usr/local/bin/cli所使用的动态链接库:

$ ldd /usr/local/bin/cli
linux-vdso32.so.1 =  (0x00100000)
libAbc.so => /usr/local/lib/libAbc.so (0x0fdfc000)
libreadline.so.5 => /lib/libreadline.so.5 (0x0f376000)
libncurses.so.5 => /lib/libncurses.so.5 (0x0f337000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0x0f24e000)
libm.so.6 => /lib/libm.so.6 (0x0f17a000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0f14a000)
/lib/ld.so.1 (0x48000000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0x0efaa000)> 

从上面的命令输出可以看到,cli程序的确会调用libAbc.so这个库,不过上面的输出中,这个库已经被找到了,它对应着文件/usr/local/lib/libAbc.so。考虑到在shell中已经设置了LD_LIBRARY_PATH环境变量,在此环境变量中增加了/usr/local/lib目录,那么是不是xinetd在启动in.telnetd时没有传递此环境变量呢?

于是修改/etc/xinetd.d/telnet,在里面增加一行:

env = LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib 

再次telnet,还是显示上述错误。似乎是in.telnetd在启动cli时没有传递上述环境变量。

幸好还有一个方法来指定动态链接库的位置。

Easwy在目录/etc/ld.so.conf.d中新增加一个文件cli.conf,内容是:

$  cat cli.conf
/usr/local/lib 

然后再以root身份执行一下ldconfig命令。现在再telnet或ssh,就不会出现上述错误提示了。

/usr/ldconfig命令会读取命令行参数、/etc/ld.so.conf配置文件以及/lib和/usr/lib目录,为动态链接器ld.sold-linux.so生成所需的链接和缓存信息。也就是说,如果不修改任何配置,只有位于/lib和/usr/lib目录的库才能被动态链接器使用。Easwy上面的修改新增了/usr/local/lib目录,并且使用/sbin/ldconfig命令重新生成了缓存,使动态链接器可以引用上述目录的库。这样就解决了此问题。

因此,在你也遇到类似的错误时,如果有root权限,就可以用这种方法来解决;如果没有root权限,那就只能设置一下LD_LIBRARY_PATH环境变量了。

更多内容,请阅读易水博客上的其它文章。

Linux下常用程序的代理服务器(proxy)配置

Linux下有很多程序都只有命令行接口,对于这类程序,它们通过代理服务器(proxy)访问网络的方式也不尽相同。在本文中Easwy总结了一些常用Linux程序配置代理服务器的方法。

[ 通用代理服务器配置 ]

对于大多数Linux控制台程序,例如Debian或Ubuntu中的apt-getaptitude命令、git命令、wget命令,这些程序都使用http_proxyftp_proxy环境变量来获取代理服务的配置。

方法是在你的~/.bashrc里加上类似下面的话:

export http_proxy=http://username:password@proxyserver:port/
export ftp_proxy=http://username:password@proxyserver:port/ 

如果你的代理服务器需要用户名和密码才能访问,需要填写上面的username和passwd部分,否则的话,省略这两部分。

例如,假设你的代理服务器为192.168.1.1,端口是8080,用户名为easwy,密码是123456,那么应该这样设置这两个环境变量:

export http_proxy=http://easwy:123456@192.168.1.1:8080
export ftp_proxy=http://easwy:123456@192.168.1.1:8080 

这样配置之后,退出再登录一次,或者直接使用下面的命令source一下.bashrc:

source ~/.bashrc

现在,上述程序就可以通过代理服务器访问网络了。

[ subversion的代理服务器配置 ]

要配置subversion的代理服务器,需要修改$HOME/.subversion/servers文件,在此文件的[global]段加上:

http-proxy-host = 192.168.1.1
http-proxy-port = 8080
http-proxy-username = easwy
http-proxy-password = 123456 

现在svn就可以使用代理服务器访问版本库了。

[ yum的代理服务器配置 ]

如果想让CentOS中的yum可以通过代理服务器更新程序,则需要修改文件/etc/yum.conf,在此文件中加上:

proxy=http://easwy:123456@192.168.1.1:8080

现在使用yum就可以更新你的软件了。

使用Synergy共享你的鼠标和键盘

公司为每个软件开发人员配置了两部计算机,一部台式机安装Linux操作系统,一部笔记本安装Windows XP。开发编程主要在Linux下,处理文档和邮件则在Windows下。

工作经常需要在两台电脑间切换,一般情况下,Easwy都是把椅子移来移去来切换,或者是使用远程桌面来从一台计算机上访问另外一台计算机,由Windows访问Linux远程桌面可以使用cygwin X server,由Linux访问Windows远程桌面可以用rdesktop。但这两种方式都不太方便,移动椅子就不说了,用远程桌面只能使用一个屏幕来做显示,不能充分利用两个屏幕。

有时需要在两台电脑间交换数据,文件共享一般使用Samba,在Windows上访问Linux的Samba服务器,或者从Linux上通过Samba访问Windows的共享目录。而少量数据的共享,例如剪切板中数据的共享则比较麻烦。

前几天同事介绍了一个很好的软件Synergy,使用这个软件,可以在多台计算机间共享一个鼠标/键盘,每台计算机都可以有自己的屏幕,可以安装相同或不同的操作系统。

Easwy马上试用了一下这个软件,立刻就喜欢上了。安装完后,Easwy把Linux台式机设置为Synergy Server,Windows XP笔记本设置为Synergy Client(因为我大多数时间在Linux下工作)。设置好后,笔记本好像变成台式机的扩展屏幕了,鼠标移出台式机的窗口右边界后,就会移入笔记本的屏幕中,而此时台式机的键盘输入就直接输入到笔记本中了。同时,两台计算机间可以共享剪切板中的数据了。在Windows上拷贝一块数据到剪切板中,鼠标移回Linux,一按中键,就粘贴在vim中了,反之亦然,非常方便。

Synergy的安装配置都很简单,首先到http://sourceforge.net/project/showfiles.php?group_id=59275&release_id=406637下载synergy,根据你操作系统的类型下载Linux或Windows的版本,下载后直接安装。

安装后需要在每台主机上运行synergy,并做相应的配置。Window上的synergy提供了图形化配置界面,Easwy配置成”Use another computer’s shared keyboard and mouse(client)”,并填入共享键盘/鼠标计算机的主机名。

Linux下需要写一个简单的配置文件,Easwy的配置文件如下:

section: screens
    szx-w-easwyy.easwy.com:
    szx-n-easwyy:
end
section: links
    szx-w-easwyy.easwy.com:
        right = szx-n-easwyy
    szx-n-easwyy:
        left = szx-w-easwyy.easwy.com
end 

把这个文件存为/etc/synergy.conf,然后在命令行下执行:

synergys -f --config /etc/synergy.conf 

这样就在前台启动了synergy服务器,之所以在前台启动是为了方便查看调试输出信息。接下来就可以测试一下效果。如果都没问题,按CTRL-C终止前台的synergy,然后把上面命令中的-f参数去掉,在后台启动synergy。你可以把启动synergy加到你的启动脚本里,例如/etc/rc.local

简单介绍一下上面的配置文件:

  • screens一节列出你打算共享同一个键盘/鼠标的主机名,需要注意的是这里的主机名必须和你计算机上hostname命令的输出一致,不然synergy就会提示找不到对应的主机。
  • links一节则列出各主机间的位置关系,上面的配置指明了Linux台式机的右边是笔记本,而笔记本的左边是台式机。这样,鼠标移出台式机屏幕的右边界就会移入笔记本屏幕,而移出笔记本屏幕的左边界后就会移回台式机屏幕了。

如果你需要特殊的配置,或者遇到了什么问题,请参见Synergy的主页。

2010/01/19更新

网友Stephenjy留言说,Synergy从2006年以来就没有更新过了,有人在Google Code上建立了新的Synergy+项目来继续维护。所以,如果你想试用,请直接下载Synergy+,网址是http://code.google.com/p/synergy-plus/。Easwy看了一下Synergy+的说明,基本是对Synergy的Bug修正,配置方法和Synergy完全一致。使用Easwy上面给出的配置,可以正常运行Synergy+。

2010/01/25更新

在CentOS 5.3上,synergy+ 1.3.4工作有问题。如果以CentOS 5.3做为server,每当把鼠标移入客户端,然后准备输入时,server端就会没有响应。只能从客户端ssh到CentOS服务器来kill掉到Synergy+ Server,CentOS上的键盘/鼠标才能恢复使用。我已经报告了此问题: Issue 342: synergy+ server is not responding,但暂时还未解决。

更多内容,请阅读Easwy的博客上的其它文章。

[ 参考文档 ]

Linux使用笔记: 使用代理服务器访问git版本库

今天想用git下载eclim的源代码,因为公司的网络使用了代理服务器,无法直接访问git协议所监听端口。幸好github支持http协议的访问。于是,使用下面的命令设置了http proxy:

export http_proxy=http://my_proxy_server:port 

这样设置后,使用git可以访问版本服务器了,但在下载的时候却出现这样的错误:

$ git clone http://github.com/ervandew/eclim.git

Initialized empty Git repository in /home/easwy/90download/eclim/git/eclim/.git/

got 559057ba6b5133554e9603d400398c0700752c49
walk 559057ba6b5133554e9603d400398c0700752c49
got c177f69b4c5a18c7ee5aab65cdb88fcd410169df
got 1bd4276c2aa8832c8950f3be030e6eddde5a8b56
walk 1bd4276c2aa8832c8950f3be030e6eddde5a8b56
Getting alternates list for http://github.com/ervandew/eclim.git
Getting pack list for http://github.com/ervandew/eclim.git
Getting index for pack 523055f70fe6414d844af3180da0ade0adc95f87
Getting index for pack d338b3e2c4e213d4da51ddc86d898a11242ab9ec
Getting pack 523055f70fe6414d844af3180da0ade0adc95f87
 which contains aaae75262ebffdfa97c584f6b69967b0f5cc8cc8
 error: Unable to get pack file http://github.com/ervandew/eclim.git/objects/pack/pack-523055f70fe6414d844af3180da0ade0adc95f87.pack
 transfer closed with 30775470 bytes remaining to read
 error: Unable to find aaae75262ebffdfa97c584f6b69967b0f5cc8cc8 under http://github.com/ervandew/eclim.git
 Cannot obtain needed blob aaae75262ebffdfa97c584f6b69967b0f5cc8cc8
 while processing commit 1bd4276c2aa8832c8950f3be030e6eddde5a8b56. 

$ /usr/bin/git version
 git version 1.5.2.1 

在网上搜了一下,也有其它人遇到这个问题,好像是git的bug,目前还不知道解决办法。即使换用git版本1.6.6还是存在此问题。难怪网上有人建议尽量不要使用http协议访问git版本库,除非你位于防火墙后面,可我恰好就是这种情况,郁闷ing!

2010/1/13更新

网友ufly提到可以使用corkscrew来访问git版本库,Easwy按照文章Git Firewall里讲的试了一下,还是不成功。

这可能是公司所用的代理服务器的限制,比如,当我尝试通过corkscrew进行ssh访问时,代理服务器会返回下面的信息:

$ ssh easwy@remote-server
Proxy could not open connnection to remote-server:  ( The specified Secure Sockets Layer (SSL) port is not allowed. ISA Server is not configured to allow SSL requests from this port. Most Web browsers use port 443 for SSL requests.  )
ssh_exchange_identification: Connection closed by remote host 

也就是说,公司的http proxy限制了通过SSL访问的端口只能是443端口,如果不是443端口则拒绝连接。

幸好github.com也开通了443端口的访问,文章 Access GitHub repositories from work (take that, firewall!).及其后的评论介绍了如何在windows及Linux下穿越防火墙访问github.com。等有时间试一下。

更多内容,请阅读Easwy的博客上的其它文章。

解决Thinkpad T400在Debian Linux下不能休眠/待机的问题

Thinkpad T400上安装了Debian Lenny后,发现电源管理似乎有点问题,系统不能正常的进入休眠/待机状态。当笔记本长时间处于Idle状态时,并不能进入待机或休眠状态,Gnome电源管理程序出现下面的提示:

Sleep Problem
Your computer failed to suspend/hibernate.
Check the help file for common problems.  

在Google上搜索了一下,其它Thinkpad T400的用户可以在Linux下正常待机或者休眠(Suspend/Hibernate),看来应该是自己笔记本配置问题。

Linux上的电源管理由pm-utils实现,这个工具箱里包含了几个脚本:pm-hibernatepm-suspendpm-suspend-hybrid。这些脚本一般由窗口管理器Gnome或KDE,通过hald守护进程来调用。当然也可以直接调用这些脚本。Easwy首先使用root用户执行pm-hibernate

sudo pm-hibernate 

执行完这个命令后,笔记本就将内存镜像保存到磁盘上,然后进入休眠模式。既然root用户能切换到休眠模式,那应该是Gnome的登录用户easwy不具备相应的权限。根据参考文档一中的说明,把用户easwy加入powerdev组中,现在在Gnome Power Manager中选择hibernate就可以使计算机中进入休眠状态,不会出现上面的提示。

但新的问题又出现了,T400进入待机或休眠模式后无法正常恢复回来。现象是在恢复时,图形界面显示不完整,这时鼠标键盘都没有反应,过一段时间T400就重新加电重启了。

在网上搜了一下,好像这是由于xf86-video-intel驱动与芯片的兼容性问题(见参考文档二)造成的,使用下面的脚本可以解决这个问题:


#!/bin/sh
# Workaround for concurrency bug in xserver-xorg-video-intel 2:2.4.1-1ubuntu10.
# Save this as /etc/pm/sleep.d/00CPU 

. "/usr/lib/pm-utils/functions"

case "$1" in
	hibernate|suspend)
		for i in /sys/devices/system/cpu/cpu*/online ; do
			echo 0 >$i
		done
		;;
	thaw|resume)
		sleep 10	# run with one core for 10 secs
		for i in /sys/devices/system/cpu/cpu*/online ; do
			echo 1 >$i
		done
		;;
	*)
		;;
esac 

Easwy把上述脚本保存到/etc/pm/sleep.d/00CPU,现在,Thinkpad T400可以正常待机/休眠/恢复了。

更多关于Linux上Thinkpad T400的内容,请阅读Easwy的博客上的其它文章。

[ 参考文档 ]

Linux使用笔记: 解决Xen虚拟机中VLAN接口不能ping大包的问题

出于调试的需要,想在两个Xen虚拟机间使用VLAN相互访问。在Linux上启用VLAN非常简单,只需要使用命令vconfig配置一个VLAN接口就可以了:

vconfig add eth0 3
ifconfig eth0.3 11.11.4.2 netmask 255.255.255.0 up 

删除VLAN则使用vconfig rem eth0.3。当然你也可以在网络脚本中配置你的VLAN接口,这样每次系统启动后会自动配置VLAN接口,具体的配置参见文尾的第一篇参考文档。

Easwy在两个Xen虚拟机上都配置了VLAN后,使用ping命令可以使两台虚拟机相互ping通。但发现一个问题,一旦ping包的大小超过一定长度,也就是说当ping包开始分片后,两台虚拟机之间就不能ping通了:

root@nti etc> ping 11.11.4.30 -s 1476 -c 3
PING 11.11.4.30 (11.11.4.30) 1476(1504) bytes of data.
1484 bytes from 11.11.4.30: icmp_seq=1 ttl=64 time=0.536 ms
1484 bytes from 11.11.4.30: icmp_seq=2 ttl=64 time=0.213 ms
1484 bytes from 11.11.4.30: icmp_seq=3 ttl=64 time=0.238 ms

--- 11.11.4.30 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.213/0.329/0.536/0.146 ms
root@nti etc> ping 11.11.4.30 -s 1477 -c 3
PING 11.11.4.30 (11.11.4.30) 1477(1505) bytes of data.

--- 11.11.4.30 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2009ms 

上面的输出显示,当ping包长度为1476字节时,可以正常ping通,但当ping包长度变为1477字节时,就无法ping通了。

在网上搜索了很久,终于找到了原因。原来,在Xen中,虚拟机的网卡是通过宿主机(Domain-0)上的虚拟接口vifX.X以及虚拟网桥设备virbrX来实现网络通信的。

下面的/sbin/ifconfig输出列出了宿主机相应的网络接口:

$ /sbin/ifconfig

eth0      Link encap:Ethernet  HWaddr 00:13:72:18:E0:99
          inet addr:192.168.19.84  Bcast:192.168.190.255  Mask:255.255.255.0
          inet6 addr: fe80::213:72ff:fe18:e099/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:36017777 errors:43235 dropped:0 overruns:0 frame:46756
          TX packets:894337 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:105224895 (100.3 MiB)  TX bytes:424826680 (405.1 MiB)
          Interrupt:17 

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4698 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4698 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2439660 (2.3 MiB)  TX bytes:2439660 (2.3 MiB)

vif3.0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF
          inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:38149 errors:0 dropped:0 overruns:0 frame:0
          TX packets:512426 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:32
          RX bytes:7652947 (7.2 MiB)  TX bytes:41352902 (39.4 MiB)

vif4.0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF
          inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:65806 errors:0 dropped:0 overruns:0 frame:0
          TX packets:553557 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:32
          RX bytes:3835916 (3.6 MiB)  TX bytes:157035614 (149.7 MiB)

virbr0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:555514 errors:0 dropped:0 overruns:0 frame:0
          TX packets:824276 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:64025226 (61.0 MiB)  TX bytes:968699886 (923.8 MiB) 

也就是说,当虚拟机1发包给虚拟机2时,它的报文首先经过vif3.0,然后经过网桥设备(bridge)virbr0,最后到达虚拟机2的虚拟接口vif4.0

Easwy所用的Linux内核版本2.6.18-128.el5xen中,它的bridge驱动中存在bug,当使能了conntrack模块时,bridge会把分片包重组起来进行检查,但由bridge再向外发时,却没有重新分片,这导致报文被二层丢弃。也正是这个原因,当ping包大小大于1476时,两台虚拟机间就无法相互ping通了。

要解决这个问题,可以重新编译内核(不过我不知道这个问题在哪一个内核版本中得到了解决)。对于Easwy来说,因为不需要使用防火墙,所以解决起来就不用这么麻烦了,只需要使用下面的命令禁用bridge的防火墙就行了:

# echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables 

禁用掉防火墙后,两台虚拟机间的大包可以ping通了,分片包的通过不存在问题。

要了解这个bug的详细信息,参见文末的第二篇参考文档。文末的第三篇和第四篇参考文档,则列出了在Xen中使用VLAN的配置方法,有兴趣的朋友可以看一下。

更多内容,请阅读Easwy的博客上的其它文章。

[ 参考文档 ]