在Windows上安装配置Apache FOP

使用Apache FOP将Docbook文档转换成PDF一文中,Easwy介绍了在Debian Linux上使用Apache FOP将Docbook文档转换成PDF文件。本来在那篇文章之后,Easwy想写一篇如何在Windows上配置Apache FOP的文章,不过一直没抽出时间。今天刚好有网友问这个问题,于是教她一步步做下来,把步骤列在下面。

你可以在这里下载到文章中Easwy用到的所有文件:点此下载

  1. 安装Docbook样式表和xsltproc程序

    按照文章一个简单的Docbook 5.0例子,安装Docbook样式表和xsltproc转换程序,并能够成功将Docbook文件转换成html格式。

  2. 安装Apache FOP和Java虚拟机

    Apache Download Mirrors下载Apache FOP,Easwy下载的是FOP 1.0。下载后,将下载的文件解压,Easwy把它解压到C:\docbook\fop-1.0。

    接下来,还要安装Java虚拟机,因为Apache FOP需要Java虚拟机才能运行。到Java网站下载安装即可。

  3. 设置Apache FOP

    我们需要配置Apache FOP进行PDF转换时所用到的字体信息。首先,用下面的命令把字体信息从Windows自带的系统字体中提取出来:

    cd C:\docbook\fop-1.0
    mkdir fonts
    java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimSun c:\windows\fonts\simsun.ttc fonts\simsun.xml
    java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimHei c:\windows\fonts\simhei.ttf fonts\simhei.xml 

    上面的命令,把C:\Windows\fonts\目录下的宋体和黑体这两种字体信息提取到fonts\simsun.xmlfonts\simhei.xml文件中。

    接下来配置C:\docbook\fop-1.0\conf\fop.xconf,使Apache FOP能够找到这两种字体。首先在文件中找到<renderer mime=”application/pdf”>这一行,然后在此标签中加入关于字体的配置。

            
    <fonts>
      <font metrics-url="fonts/simsun.xml" kerning="yes" embed-url="file:///c:/windows/fonts/simsun.ttc">
        <font-triplet name="SimSun" style="normal" weight="normal"/>
        <font-triplet name="SimSun" style="normal" weight="bold"/>
        <font-triplet name="SimSun" style="italic" weight="normal"/>
        <font-triplet name="SimSun" style="italic" weight="bold"/>
      </font>
    
      <font metrics-url="fonts/simhei.xml" kerning="yes" embed-url="file:///c:/windows/fonts/simhei.ttf">
        <font-triplet name="SimHei" style="normal" weight="normal"/>
        <font-triplet name="SimHei" style="normal" weight="bold"/>
        <font-triplet name="SimHei" style="italic" weight="normal"/>
        <font-triplet name="SimHei" style="italic" weight="bold"/>
      </font>
    
      <directory recursive="true">file:///c:/windows/fonts/</directory>
    
      <auto-detect/>
    </fonts>
             
  4. 配置XLT转换样式表

    接下来,我们要配置XSL转换样式表,让xsltproc在转换Docbook文档时,使用我们指定的中文字体。在下面我给出了一个简单的样式表,假设存为docbook_fo.xsl:

     
    <?xml version='1.0'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:exsl="http://exslt.org/common"
      xmlns:fo="http://www.w3.org/1999/XSL/Format"
      xmlns:ng="http://docbook.org/docbook-ng"
      xmlns:db="http://docbook.org/ns/docbook"
      exclude-result-prefixes="db ng exsl"
      version='1.0'>
    
      <xsl:import href="C:/docbook/docbook-xsl-1.74.3/fo/docbook.xsl"/>
      <xsl:param name="body.font.family">SimSun</xsl:param>
    
      <xsl:param name="monospace.font.family">SimSun</xsl:param>
      <xsl:param name="title.font.family">SimHei</xsl:param>
    </xsl:stylesheet>
             

    在这个转换样式表里,首先导入了Docbook的FO样式表,然后重新设置了其中的字体参数,改成我们所要的字体名称。需要注意的是,这里的字体名字需要和fop.xconf中设置的font-triplet中的名字完全一致。

  5. 输出PDF文件

    完成上述配置后,就可以进行PDF文件的转换了。把下面的文件保存为example.xml

            
    <?xml version='1.0' encoding="utf-8"?>
    
    <article xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="zh-CN"
      xmlns:xlink='http://www.w3.org/1999/xlink'>
      <articleinfo>
        <title>我的第一篇Docbook 5.0文档</title>
        <author>
          <firstname>Easwy</firstname>
    
          <surname>Yang</surname>
        </author>
      </articleinfo> 
    
      <section>
        <title>文档介绍</title>
    
        <para>
          这是我的第一篇Docbook 5.0文档,欢迎你来到<link xlink:href='http://easwy.com/blog/'>Easwy的博客</link>。
        </para>
      </section>
    </article> 
             

    然后输入下面的命令将其转换成PDF:

    xsltproc -o example.fo c:\docbook\fop-1.0\conf\docbook_fo.xsl example.xml
    fop -c c:\docbook\fop-1.0\conf\fop.xconf example.fo -pdf example.pdf 

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

参考文档

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/install-apache-fop-on-windows/

文章的脚注信息由WordPress的wp-posturl插件自动生成

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环境变量了。

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

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/dynamic_library_configuration_in_linux/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Windows下cscope -q选项出错的解决

以前曾有网友留言,在windows下使用cscope时,使用-q选项出现如下提示:

D:\Temp> cscope -Rbkq
Input file specified two times.

cscope: cannot create inverted index; ignoring -q option
cscope: removed files ncscope.in.out and ncscope.po.out 

当时Easwy以为是windows版本的cscope不支持-q选项。

不过网友Liang Feng昨天留言说:

Windows版本的cscope是支持-q选项的,出现以上错误是因为没找到合适的sort命令。所以只要cscope进程的工作目录下有GNU版本的sort就可以了。注意是进程的工作目录,不是可执行程序的目录。具体原因看一下cscope的代码片段。

build.c

#ifdef WIN32
snprintf(sortcommand, sizeof(sortcommand), “set LC_ALL=C && sort -T %s %s”, tmpdir, temp1);
#else
snprintf(sortcommand, sizeof(sortcommand), “env LC_ALL=C sort -T %s %s”, tmpdir, temp1);
#endif 

于是重新做了一下试验。在安装了Cygwin后,在cygwin的shell界面中使用cscope,没有出现上面的错误提示。但如果打开windows的命令行窗口cmd.exe,在里面执行cscope,则会出现上面的错误。

在仔细比较了cygwin和cmd.exe的环境后发现,原来是Windows自带的sort.exe搞的鬼。

在cygwin的shell窗口中,PATH环境变量的设置会使其先找到GNU版的sort.exe,所以上述cscope命令执行可以成功。但在cmd.exe窗口中,PATH环境变量会使其先找到windows自带的sort.exe而不是GNU sort.exe,所以会出现上面的错误提示。

知道了问题的原因,解决方法就很简单了,我们可以写一个批处理程序,在此程序中重设PATH环境变量,使cscope使用GNU版的sort.exe。示例程序如下:

D:\Temp> type cs.bat
@echo off
set path=c:\cygwin\bin;
cscope -Rbkq 

在这个批处理里,首先把path环境变量指向c:\cygwin\bin;,我的cscope.exe和GNU版的sort.exe都在此目录中。接下来现执行cscope命令,现在它使用的就是GNU版的sort.exe了。

在此感谢网友Liang Feng,谢谢他的提醒。

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

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/cscope_sort_option_on_windows/

文章的脚注信息由WordPress的wp-posturl插件自动生成

vi技巧: 宏的使用技巧

本文所用命令的帮助入口:

:help q
:help @
:help :let-@ 

网友Karl问

再请教一下:我想在.vimrc中设置一个宏,请vi启动的时候就有这个宏,应该怎么办?

其实在vim中所谓的宏就是把一串命令放到了指定的寄存器里。所以要实现Karl的需求,可以这样做:先录制好宏后,然后在vimrc里把这个宏中的命令放到指定寄存器里,这样vim启动后就可以直接使用这个宏了。

具体的做法如下:

第一步:首先录制宏,Easwy以插入三行文字做为一个简单的例子。这三行文字是:

================================
I love vim. Happy vimming!
================================ 

qu开始录制,录制完成后再按一个q命令结束,这样就把宏录制到寄存器u中了。

现在我们可以查看一下u寄存器的内容,用命令“up,把u寄存器的内容粘贴出来:

32i=^[oI love vim. Happy vimming!^M^[32i=^[ 

注意,上面的^[实际上是<ESC>键的键码,同样,^M是换行键<CR>的键码,在vim中它们以特殊的颜色被显示出来,如果你把光标在它们上面移过,你会发现它们虽被显示成两个字符,但实际上只是一个。

第二步:现在我们用下面的命令在.vimrc中输入一行:

<ESC>olet @m = "<ESC>"upa"<ESC> 

这行命令实际上在.vimrc加入了这行话:

let @m = “32i=^[oI love vim. Happy vimming!^M^[32i=^[”

第三步:现在你重启vi,然后直接输出下面的命令:

@m 

怎么样,宏是不是生效了?!

要想了解更多细节,请阅读文章开始处给出的帮助手册。

更多关于vi/vim的内容,请阅读易水博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/vi-tip-of-using-recording/

文章的脚注信息由WordPress的wp-posturl插件自动生成

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就可以更新你的软件了。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/proxy-setting-on-linux-console/

文章的脚注信息由WordPress的wp-posturl插件自动生成

使用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的博客上的其它文章。

[ 参考文档 ]

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/share-your-keyboard-and-mouse-by-synergy/

文章的脚注信息由WordPress的wp-posturl插件自动生成

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的博客上的其它文章。

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/use_http_proxy_for_git/

文章的脚注信息由WordPress的wp-posturl插件自动生成

解决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的博客上的其它文章。

[ 参考文档 ]

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/thinkpad-t400-suspend-hibernate-problem-on-linux/

文章的脚注信息由WordPress的wp-posturl插件自动生成

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的博客上的其它文章。

[ 参考文档 ]

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/solve-fragment-packets-loss-of-ping/

文章的脚注信息由WordPress的wp-posturl插件自动生成

Linux使用笔记: 在标题和状态栏中显示Screen的窗口名称

Windows上使用putty+screen时,screen会把当前窗口的名称显示在putty的标题栏上,这样当前处于哪个窗口就一目了然了。

但在Easwy的Linux系统中,使用urxvt+screen时,发现当前窗口的名称不会显示在标题栏里。在网上搜索了很久才找到答案。

要想允许Screen改变rxvt/rxvt-unicode(即urxvt)的标题栏,需要在.screenrc中加入一句termcapinfo信息:

termcapinfo rxvt 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007' 

如果你用的是xterm,也需要在.screenrc中加入一句类似的话,具体内容见参考文档一。

可是,在标题栏里只显示当前的窗口名字,不能把把窗口的列表显示出来,在使用时还不是很方便。幸好我们可以设置Screen的状态栏,使之显示我们想要的内容。

Easwy.screenrc中加入了下面的内容:

caption always "%{= kw}%-w%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+w %=%d %M %0c %{g}%H%{-}" 

上面这段话会在Screen窗口的最下面一行显示出所有窗口的列表,以及主机名等信息。它的效果图如下:

现在的Screen用起来就方便多了。

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

[ 参考文档 ]

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/display-window-list-on-title-bar-and-status-bar-of-screen/

文章的脚注信息由WordPress的wp-posturl插件自动生成