Pages

Wednesday, 31 October 2012

这就是爱–王心凌

这就是爱 - 王心凌
飘流在爱情的海域 你我也曾有过伤心
因为相信让两颗心贴近了距离
当我靠在你的怀里 所有话题都是多余
眼前的风景 都是你给我的美丽
月影遥 天都亮了 星星睡不着
我在你耳边轻轻唱着 你笑了
oh爱 两颗星星一片海
牵着的手都明白 再也离不开
oh爱 轻轻飘进我心海
你是甜蜜的意外 我却逃不开 oh爱
当我靠在你的怀里 所有话题都是多余
眼前的风景 都是你给我的美丽
月影遥 天都亮了 星星睡不着
我在你耳边轻轻唱着 你笑了
oh爱 两颗星星一片海
牵着的手都明白 再也离不开
oh爱 轻轻飘进我心海
你是甜蜜的意外 我却逃不开 oh爱
开始不懂爱 到现在才明白
恋爱中的人都像个小孩
情愿被宠坏 每一天都充满期待 这就是爱
oh爱 两颗星星一片海
牵着的手都明白 再也离不开
oh爱 轻轻飘进我心海
你是甜蜜的意外 我却逃不开 oh爱

使用sed编辑文件

1. Sed简介

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。

2. 定址

可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。

3. Sed命令

调用sed命令有两种形式:
  • sed [options] ‘command’ file(s)
  • sed [options] -f scriptfile file(s)
a\
在当前行后面加入一行文本。
b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
c\
用新的文本改变本行的文本。
d
从模板块(Pattern space)位置删除行。
D
删除模板块的第一行。
i\
在当前行上面插入文本。
h
拷贝模板块的内容到内存中的缓冲区。
H
追加模板块的内容到内存中的缓冲区
g
获得内存缓冲区的内容,并替代当前模板块中的文本。
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l
列表不能打印字符的清单。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p
打印模板块的行。
P(大写)
打印模板块的第一行。
q
退出Sed。
r file
从file中读行。
t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file
写并追加模板块到file末尾。
W file
写并追加模板块的第一行到file末尾。
!
表示后面的命令对所有没有被选定的行发生作用。
s/re/string
用string替换正则表达式re。
=
打印当前行号码。
#
把注释扩展到下一个换行符以前。
以下的是替换标记
  • g表示行内全面替换。
  • p表示打印行。
  • w表示把行写入一个文件。
  • x表示互换模板块中的文本和缓冲区中的文本。
  • y表示把一个字符翻译为另外的字符(但是不用于正则表达式)

4. 选项

-e command, –expression=command
允许多台编辑。
-h, –help
打印帮助,并显示bug列表的地址。
-n, –quiet, –silent
取消默认输出。
-f, –filer=script-file
引导sed脚本文件名。
-V, –version
打印版本和版权信息。

5. 元字符集

^
锚定行的开始 如:/^sed/匹配所有以sed开头的行。
$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
.
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
*
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
&
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\<
锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\>
锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\}
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5–10个o的行。

6. 实例

删除:d命令
  • $ sed ’2d’ example—–删除example文件的第二行。
  • $ sed ’2,$d’ example—–删除example文件的第二行到末尾所有行。
  • $ sed ‘$d’ example—–删除example文件的最后一行。
  • $ sed ‘/test/’d example—–删除example文件所有包含test的行。
替换:s命令
  • $ sed ‘s/test/mytest/g’ example—–在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
  • $ sed -n ‘s/^test/mytest/p’ example—–(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
  • $ sed ‘s/^192.168.0.1/&localhost/’ example—–&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
  • $ sed -n ‘s/\(love\)able/\1rs/p’ example—–love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
  • $ sed ‘s#10#100#g’ example—–不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
选定行的范围:逗号
  • $ sed -n ‘/test/,/check/p’ example—–所有在模板test和check所确定的范围内的行都被打印。
  • $ sed -n ’5,/^test/p’ example—–打印从第五行开始到第一个包含以test开始的行之间的所有行。
  • $ sed ‘/test/,/check/s/$/sed test/’ example—–对于模板test和west之间的行,每行的末尾用字符串sed test替换。
多点编辑:e命令
  • $ sed -e ’1,5d’ -e ‘s/test/check/’ example—–(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
  • $ sed –expression=’s/test/check/’ –expression=’/love/d’ example—–一个比-e更好的命令是–expression。它能给sed表达式赋值。
从文件读入:r命令
  • $ sed ‘/test/r file’ example—–file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
写入文件:w命令
  • $ sed -n ‘/test/w file’ example—–在example中所有包含test的行都被写入file里。
追加命令:a命令
  • $ sed ‘/^test/a\\—>this is a example’ example<—–’this is a example’被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
插入:i命令
$ sed ‘/test/i\\ new line
————————-’ example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
下一个:n命令
  • $ sed ‘/test/{ n; s/aa/bb/; }’ example—–如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
变形:y命令
  • $ sed ’1,10y/abcde/ABCDE/’ example—–把1–10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
退出:q命令
  • $ sed ’10q’ example—–打印完第10行后,退出sed。
保持和获取:h命令和G命令
  • $ sed -e ‘/test/h’ -e ‘$G example—–在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
保持和互换:h命令和x命令
  • $ sed -e ‘/test/h’ -e ‘/check/x’ example —–互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。

7. 脚本

Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

8. 小技巧

  • 在sed的命令行中引用shell变量时要使用双引号,而不是通常所用的单引号。下面是一个根据name变量的内容来删除named.conf文件中zone段的脚本:
    name='zone\ "localhost"'
    sed "/$name/,/};/d" named.conf

Linux下执行程序时发生错误:cannot restore segment prot after reloc: Permission denied

Linux下执行程序时发生错误: cannot restore segment prot after reloc: Permission denied
原来这是SELinux搞的鬼,解决办法有两个
1. 使用chcon 命令
示例: chcon -t texrel_shlib_t /usr/local/rsi/idl_6.1/bin/bin.linux.x86/*.so
2. 禁止掉SELinux
更改/etc/sysconfig/selinux 文件的内容为 SELINUX=disabled

TUX是个webserver

TUX是个webserver,用来做静态文件的http-daemon,性能非常不错,与Linux进行了内核级的对接!

TUX is a http-daemon (webserver) for Linux. TUX is different from other webservers in that it runs partially from within the Linux-kernel as a module (device driver).  Given sufficiently-capable networking cards, it enables direct scatter-gather DMA and hardware-based TCP/IP checksumming from the page cache directly to the network, avoiding extra data copies.
 -------------------------------------------

=====

TUX  -  Integrated Kernel-based Application Protocols Layer and Object Cache

Copyright (C) 2000, 2001 Red Hat, Inc.
Licensed under the terms of the GNU General Public License

=====


0. What's New?
--------------

   Read the NEWS file to see what has changed since the last release
   of TUX.


1. Introduction
---------------

   TUX is a http-daemon (webserver) for Linux. TUX is different from other
   webservers in that it runs partially from within the Linux-kernel as a
   module (device driver).  Given sufficiently-capable networking cards,
   it enables direct scatter-gather DMA and hardware-based TCP/IP
   checksumming from the page cache directly to the network, avoiding
   extra data copies.

   TUX handles static pages directly, and can work in concert with
   kernel modules, user-space modules, and regular user-space
   web server daemons to provide dynamic content.  Regular user-space
   daemons do not need to be altered in any way for TUX to use them
   to provide content, but in order for TUX to cache dynamic content,
   user-space code has to use a new interface based on the tux(2)
   system call.

   Static web pages are not a very complex thing to serve, but these are
   very important nevertheless, since virtually all images are static,
   and a large portion of the html pages are static also. A "regular"
   webserver has little added value for static pages; it is simply a
   "copy file to network" operation.  This can be done very efficiently
   from within the Linux kernel; for example, the nfs (network file system)
   daemon performs a similar task and also runs in the kernel.

   But dynamic content is becoming a larger and larger part of the
   web, and TUX provides a way to cache dynamic content as well.
   TUX modules (which can be build in kernel space or in user space;
   user space is recommended) can create "objects" which are stored
   using the page cache.  To respond to a request for dynamic data, a
   TUX module can send a mix of dynamically-generated data and cached
   pre-generated objects, taking maximal advantage of TUX's zero-copy
   architecture.  (Kernel-space modules are currently the only modules
   capable of making use of TUX's SSI support; that will change in the
   future.)

   This completely new architecture for providing dynamic content
   requires a new API.  Existing standard APIs for CGI are not
   sufficient to be mapped to TUX's API.  This means that existing
   CGI applications must be re-coded in order to take advantage of
   TUX's architecture.  TUX can, however, call CGI programs via
   its CGI module, so you can choose to convert only programs that
   need TUX's speed to the TUX api and run other programs using
   the standard CGI interface.  TUX can also redirect requests
   to another webserver, such as Apache, so on a single site, you
   can mix and match static content, TUX modules, old-style CGIs,
   and programs written to other webservers' APIs.

   Whenever TUX isn't sure what to do (that is, encounters input
   that it is not prepared to handle), it always redirects the
   request to Apache to handle in an RFC-compliant manner.

   Note: This document sometimes uses "Apache" instead of "any webserver
   you might ever want to use", just for reasons of readability.


2. Quick Start  
--------------

   1) Build a kernel with tux support built in or as a module (if
      necessary.
   2) Configure the tux subsystem via /proc/sys/net/tux/* (or sysctl
      equivalents(
   3) Start the tux(8) daemon
   4) Stop tux with the tux(8) program with the --stop option

   N.B. Your distribution may include a /etc/rc.d/init.d/tux script;
   if so, your distribution's documentation overrides this.


3. Configuration 
----------------

   Modes of operation
   ==================


   There is one recommended mode of operation:

   1) TUX is main webserver, "Apache" is assistant running on port 8080
      (or whatever):
 clientport   -> 8080 (or whatever)
  serverport   -> 80

   There is one less useful mode of operation:

   2) "Apache" is main webserver, TUX is assistant
 clientport   -> 80
   serverport   -> 8080 (or whatever)

   
   Configuring TUX
   ==================

   Before you can start using TUX, you have to configure it. This
   is done through the /proc filesystem, and can thus be done from inside
   a script. Most parameters can only be set when TUX is not active.

   The following things need configuration:

   1) The port where TUX should listen for requests
   2) The port (on "localhost") where "Apache" is listening
   3) The location of the documents (documentroot)

   It is very important that the documentroot for TUX matches the
   documentroot for the userspace-daemon, as TUX might "redirect"
   any request to this userspace-daemon.

   A typical script (for the first mode of operation) to do this would 
   look like:

 #!/bin/sh
 modprobe tux
 echo 8080 > /proc/sys/net/tux/clientport
 echo 80 > /proc/sys/net/tux/serverport
 echo /var/www > /proc/sys/net/tux/documentroot
 tux $THREADS $DOCROOT $MODULES

   For the second mode of operation, this would be:

 #!/bin/sh
 modprobe tux
 echo 80 > /proc/sys/net/tux/clientport
 echo 8080 > /proc/sys/net/tux/serverport
 echo /var/www > /proc/sys/net/tux/documentroot
 tux $THREADS $DOCROOT $MODULES

   If the clientport is 8080, you also have to change the configuration of the 
   userspace daemon. For Apache, you do this by changing

   Port 80

   to 

   Port 8080

   in /etc/apache/conf/httpd.conf. For security reasons, you can also change 
   
   BindAddress *

   to

   BindAddress 127.0.0.1

   (in the same file) to prevent outside users from accessing Apache 
   directly. Only do this if TUX is the main webserver.


   Instead of echoing numbers directly into /proc/sys/net/tux/*,
   use /etc/sysctl.tux (/etc/sysctl.conf entries are read before
   the tux module is loaded).  For example,
 echo 8080 > /proc/sys/net/tux/clientport
   becomes a line in /etc/sysctl.tux like
 net.tux.clientport = 8080


   For each CGI program you have (under $DOCROOT/cgi-bin/ by default),
   there must be a corresponding file under $DOCROOT (not in the cgi-bin
   directory) to tell TUX that it has permission to run the CGI program.
   So for TUX to run $DOCROOT/cgi-bin/foo/bar/xx, $DOCROOT/foo/bar/xx must
   exist and have the permissions specified in mode_cgi.  The file
   $DOCROOT/foo/bar/xx must, of course, be executable.

   
   Stopping TUX
   ===============
   In order to change the configuration, you should stop TUX by running
   "/etc/rc.d/init.d/tux stop" at a command prompt.

   If this doesn't work fast enough for you (the commands above can wait for 
   a remote connection to close down), you can send the daemons a "HUP"
   signal after you told them to stop, using "killall -HUP tux". This will
   cause the daemon-threads to stop immediately. 

   Note that the daemons will restart immediately if they are not told to
   stop.

   

4. Permissions
--------------
   The security model of TUX is very strict. It can be, since there is a 
   userspace daemon that can handle the complex exceptions. 

   TUX only serves a file if

 1)  There is no "?" in the URL
 2)  The URL starts with a "/"
 3)  The file indicated by the URL exists
 4)  The file is world-readable (*)
 5)  The file is not a directory, executable or has the Sticky-bit
     set (*)
 6)  The URL doesn't contain any "forbidden" substrings such as ".."
     and "cgi-bin" (*)
 7)  The mime-type is known (*)

   The items marked with a (*) are configurable through the
   sysctl-parameters in /proc/sys/net/tux.


   In all cases where any of the above conditions isn't met, the
   userspace-daemon is handed the request.



5. Parameters
-------------
   The following parameters are settable through /proc/sys/net/tux:
   (Permissions are set via hexadecimal values, not the symbolic values
   shown here for maximum clarity)
 
 Name  Default  Description

 serverport 80  The port where TUX listens on

 clientport 8080  The port of the userspace
     http-daemon

 threads  2  The number of server-threads.

 documentroot /var/www the directory where the
     document-files are

 perm_required S_IROTH  Minimum permissions required
     (for values see "man 2 stat")
 
 perm_forbid dir+sticky+ Permission mask with "forbidden"
   execute  permissions.
     (for values see "man 2 stat")
 
 mode_cgi S_IXUGO  Permission mask for CGI permision
     files.

 maxconnect 1000  Maximum number of concurrent
     connections

header() & drbd

PHP中使用header生成301转向:
header(‘HTTP/1.1 301 Moved Permanently’); // 301头
header(“Location: /logs/”.$post_id.”.html#tb”); 
http://www.drbd.org
DRBD用于MySQL数据库的HA
http://www.builder.com.cn/2007/0726/437357.shtml

hosts.allow & hosts.deny

如果请求访问的主机名或IP不包含在/etc/hosts.allow中,那么tcpd进程就检查/etc/hosts.deny。看请 求访问的主机名或IP有没有包含在hosts.deny文件中。如果包含,那么访问就被拒绝;如果既不包含在/etc/hosts.allow中,又不包 含在/etc/hosts.deny中,那么此访问也被允许。
<daemon list>:<client list>[:<option>:<option>:...]
daemon list     服务进程名列表,如telnet的服务进程名为in.telnetd
client list     访问控制的客户端列表,可以写域名、主机名或网段,如.trubolinux.com.cn或者192.168.1.
option          可选选项,这里可以是某些命令,也可以是指定的日志文件
例子:hosts.allow
in.telnetd:.turbolinux.com.cn
vsftpd:192.168.0.
sshd:192.168.0.0/255.255.255.0
/etc/hosts.allow里第一行in.telnetd:.turbolinux.com.cn表示,只有turbolinux.com.cn这个域里的主机允许访问TELNET服务,注意turbolinux.com.cn前面的那个点(.)。
/etc/hosts.allow里第二行表示,只有192.168.0这个网段的用户允许访问FTP服务,注意0后面的点(.)。
/etc/hosts.allow里第三行表示,只有192.168.0这个网段的用户允许访问SSH服务,注意这里不能写为192.168.0.0/24。虽然在CISCO路由器种这两中写法是等同的。
更多内容:hosts_access ,hosts_options

Cfengine

Cfengine 是一个令人恐怖的系统管理工具。它可自动对联网的计算机进行配置和维护,适用于所有基于UNIX或类UNIX的操作系统,并且它可以通过UNIX兼容的环境/库Cygwin 在较新版本的Windows操作系统中运行。
Cfengine目的是使简单的管理的任务自动化,使困难的任务变得较容易。它的目标是使系统从任何状态收敛到一种理想状态。依照它的作者 Mark Burgess 所说,cfengine 总是使您的系统更接近于您所定义的配置; 它决不会使系统变得更糟。
更多资料:http://www.cfengine.org/china.phtml 

trap for shell

一. trap捕捉到信号之后,可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
二. trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双
引号中的命令串。
trap ‘commands’ signal-list
trap “commands” signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号
trap ” ” signal-list
注意:
(1) 对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。
(2) 在trap中可以定义对信号0的处理(实际上没有这个信号), shell程序在其终止(如
执行exit语句)时发出该信号。
(3) 在捕捉到signal-list中指定的信号并执行完相应的命令之后, 如果这些命令没有
将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将
很容易导致shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,
将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会
对commands中的变量和命令进行替换, 否则commands中的变量和命令将用当时具体的值来
替换。
在有些情况下,我们不希望自己的shell脚本在运行时刻被中断,比如说我们写得shell脚
本设为某一用户的默认shell,使这一用户进入系统后只能作某一项工作,如数据库备份, 我
们可不希望用户使用ctrl+C之类便进入到shell状态,做我们不希望做的事情。这便用到了信号
处理。
kill -l可以列出系统的信号名称,如下:
-bash-3.00# kill -l
1) SIGHUP    2) SIGINT    3) SIGQUIT   4) SIGILL
5) SIGTRAP   6) SIGABRT   7) SIGBUS    8) SIGFPE
9) SIGKILL   10) SIGUSR1   11) SIGSEGV   12) SIGUSR2
13) SIGPIPE   14) SIGALRM   15) SIGTERM   17) SIGCHLD
18) SIGCONT   19) SIGSTOP   20) SIGTSTP   21) SIGTTIN
22) SIGTTOU   23) SIGURG   24) SIGXCPU   25) SIGXFSZ
26) SIGVTALRM  27) SIGPROF   28) SIGWINCH  29) SIGIO
30) SIGPWR   31) SIGSYS   34) SIGRTMIN  35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX

-bash-3.00#
通常我们需要忽略的信号有四个,即:HUP, INT, QUIT, TSTP,也就是信号1, 2, 3, 24
使用这样的语句可以使这些中断信号被忽略:
trap “” 1 2 3 24 或 trap “” HUP INT QUIT TSTP
用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回复默认值。
用stty -a可以列出中断信号与键盘的对应,分别执行上面的命令后,运行
tail -f /etc/passwd, 然后尝试用键盘中断,试试两种情况(默认和忽略)下有何不同。
更方便的是我们可以用在shell中用trap定义我们自己的信号处理程序,就象在c中用
signal一样。
P.S.
2010-11-2
通常使用 kill 0 来杀掉所有子进程及自己.

配置iptables允许访问ftp服务

因为FTP应用的特殊性,iptables只开放21端口并不能保证FTP服务被正常访问,需要为iptables加载下面两个模块:
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp

关于LVS的几个新认识

1. LVS调度的最小单位是“连接”。
2. 当apache的KeepAlive被设置成Off时,“连接”才能被较均衡的调度。
3. 在不指定-p参数时,LVS才真正以“连接”为单位按“权值”调度流量。
4. 在指定了-p参数时,则一个client在一定时间内,将会被调度到同一台RS。(曾经发生过蜘蛛来抓取的时候,几乎所有的请求都调度到一台RS上)
5. 可以通过”ipvsadm –set tcp tcpfin udp”来调整TCP和UDP的超时,让连接淘汰得快一些。
6. 在NAT模式时,RS的PORT参数才有意义。
7. DR和TUN模式时,InActConn 是没有意义的(Thus the count in the InActConn column for LVS-DR, LVS-Tun is inferred rather than real.)
2011-2-17 新增:
8. NAT模式,RS不用做任何修改(配置)。
9. NAT模式,LVS的负载能力(未经测试)、带宽容易成为瓶颈。
10. DR模式,RS需要关闭相关ARP响应,配置 VIP/32  网络接口。
11. DR模式,一般认为 RS 和 LVS 需要在同一 VLAN (same local network ),因为 VIP 需要在 LVS 和 RS 上为有效 IP。
2012-5-14新增:
VIP也好,RS上的lo接口上的VIP地址也好,最好都配成32位掩码,以避免VS到RS的健康检查出现问题。
为什么DR模式一定要一次将包发给RS,而不能经过网关呢?因为这个包的源地址是客户,目的地址是VIP,会被路由器再丢回去,形成循环.

减少Linux下Squid服务器的TIME_WAIT套接字数量

Linux下高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少Squid服务器的TIME_WAIT套接字数量。
  
vi /etc/sysctl.conf
增加以下几行:
引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
说明:
  net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
  net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
  net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
  net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
  net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
 
 net.ipv4.tcp_max_tw_buckets = 5000
表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改
为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参
数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
  执行以下命令使配置生效:
/sbin/sysctl -p

cut的用法


我们经常会遇到需要取出分字段的文件的某些特定字段,例如 /etc/password就是通过”:”分隔各个字段的。可以通过cut命令来实现。例如,我们希望将系统账号名保存到特定的文件,就可以:
cut -d: -f 1 /etc/passwd &amp;gt; /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段
当然也可以通过cut取得文件中每行中特定的几个字符,例如:
cut -c3-5 /etc/passwd
就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段

配置yum使用速度快的源

CentOS 中科大的源
====
# CentOS-Base.repo
#
# This file uses a new mirrorlist system developed by Lance Davis for CentOS.
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.

#
#
[base]
name=CentOS-$releasever – Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://centos.ustc.edu.cn/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
#released updates
[updates]
name=CentOS-$releasever – Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
baseurl=http://centos.ustc.edu.cn/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever – Addons
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=addons
baseurl=http://centos.ustc.edu.cn/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
#additional packages that may be useful
[extras]
name=CentOS-$releasever – Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
baseurl=http://centos.ustc.edu.cn/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever – Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
baseurl=http://centos.ustc.edu.cn/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
建议gpgkey仍然使用官方的地址,安全第一!
假如本地有安装源,比如:http://192.168.0.45/linux
那么可以使用如下两行命令编辑yum的配置文件,使用本地源来安装软件(update的话,恐怕仍然需要官方指定的源):
sed -i ‘s/^mirrorlist/#mirrorlist/g’                                      /etc/yum.repos.d/CentOS-Base.repo 
sed -i ‘/^#baseurl/abaseurl=http://192.168.0.45/linux/’  /etc/yum.repos.d/CentOS-Base.repo 

从 Solaris 到 illumos - 关于技术权力抗争、开源以及梦想的故事

看了现任 Joyent 工程副总裁 Bryan Cantrill 的演讲:Fork Yeah! The Rise and Development of illumos,讲述 illumos 项目的来龙去脉,披露了不少关于 Sun 、 Oracle 以及开源社区的信息,据说 Cantrill 在做这个演讲的时候,与会者很「动容」。而其中的陈年往事咀嚼起来很是值得思考。
首先说说这位 Bryan Cantrill ,「他曾荣登 MIT 《科技创业》35位35周岁以下顶尖技术专家榜,并被 InfoWorld 评为年度杰出创新家。在加盟 Joyent 团队之前,Cantrill 是Sun公司的杰出工程师。他在Sun公司花了十多年的时间研究了系统软件,包括从内核到浏览器客户端代码,以及和内核相关的多种组件。最有名的便是 Cantrill 联合设计并实现了DTrace。」在 Oracle 收购 Sun 之后,Cantrill 于 2010 年 7 月离开Oracle,加入了 Joyent 。
在 Bryan Cantrill 的演讲中,他先是从个人的角度回顾了一下「历史」:从 SunOS 4.x 到 Solaris 的转换过程中,有很多优秀的工程师离开,导致这个问题的主要原因是引入了不成熟的 SCM 工具,Network Software Environment (NSE) -- 可见,技术官僚的错误决定在哪里都是极有破坏性的。NSE 的糟糕引来了工程师的「逆袭」,Larry McVoy 干脆开发了一套 NSE 轻量级的变种,NSElite。通过 NSElite 以及后来的 Teamware , Roger Faulkner、Tim Marsland、Joe Kowalski 以及 Jeff Bonwick 等人领导的 Solaris 2.3 项目基本达到了还可以的并行开发的效率,不过到了 Solaris 2.4 就无能为力了,质量再次滑坡。
Solaris 2.5 的开发则是背水一战,只许成功,不许失败。这个时候,Sun 有了新的硬件 UltraSPARC-I 。为确保开发质量,工程师们进行了「接管」: Jeff Bonwick 担当起代码看门人的角色,坚持「if it's broken, rip it out」的原则,确保了 Solaris 2.5 按时发布,并且确保了软件质量。经此一役,工程师们再也不愿意失去对操作系统开发上的控制。
到了 1990 年代中期,一个无法回避的论断是 Unix 必将死于 Windows NT 之手,而令人无法相信的是,Sun 居然是唯一一家意图对抗 Windows NT 的操作系统开发商。新一代「Bonwick Youth」的加入,天才们互相吸引,期待给操作系统带来革新,就像当年的 Xerox PARC 实验室那样。到了 2001 年年中,新的激进的开发开始了,这些新的操作系统功能包括:DTrace、ZFS、Zones、FMA、SMF 等。这些激动人心的特性并非由市场或是管理层驱动,而完全是工程师的想法。
ZFS,号称「终极文件系统」,首席设计师即为 Jeff Bonwick。
而这个时候,Linux 以及开源运动已经兴起,对 Sun 不可能没有冲击,内部也在反思。但是出于知识产权方面的限制,讨论了未有定论。2005 年,时任 CEO 的 Jonathan Schwartz 做出决定将操作系统开源,先是 Dtrace 开源,然后是 OpenSolaris ,时间是 2005 年 6 月。遗憾的是,有些小的但是至关重要的软件则无法开源(比如有些驱动程序含有第三方知识产权),为此 Sun 制定了 CDDL 许可协议,不过与 GPL 不兼容。
2007 年开始,Sun 决定创建一个全新的基于 OpenSolaris 的发布,名字仍然叫做 OpenSolaris,接下来的几年,Sun 与 OpenSolaris 管理委员会(OGB) 陷入了诸多摩擦,相互牵制。OpenSolaris 发展缓慢。
随着 2009 年 Oracle 宣布收购 Sun,到 2010 年收购完成收购。OpenSolaris 的命运已经很清楚了:Oracle 对此毫无兴趣。

2010 年的夏天,存储厂商 Nexenta 的 Garrett D'Amore 在 Rich Lowe、Jason King 等人的帮助下,发起了 illumos 项目, D'Amore 等人针对版权限制的软件,或是从头写代码,或是从 BSD 系统移植,2010 年 8 月 3 日,illumos 正式可用。「Illumos」这个词来自 Illuminare,也即拉丁语的 Illuminate,「照明、照亮」的意思,可谓深有用意。
illumos 项目的最终目标有两个:一是使用开源代码取代所有仍在 OpenSolaris 使用的专有代码,二是围绕之前的OpenSolaris 代码库建立一个独立的社区。严格来说,并非 OpenSolaris 的分支项目。
2010 年 8 月 13 日,星期五,Oracle 内部泄露出来的邮件写到「在企业版Solaris系统完整发布后,我们将会向得到许可的 CDDL 或其他开源授权发布更新。通过这种方式,技术创新将会首先出现在我们发布的版本中。我们将不再实时发布整个Solaris系统的源代码。」
Oracle 的对待 OpenSolaris 的冷漠乃至不作为导致了 Solaris 团队的大范围流失,比如前文提到的 Jeff Bonwick 也在 2010年 9 月 30号 离职。在不到 90 天内,DTrace 团队全部成员离开 Oracle,其他关键特性的开发人员亦纷纷离职。好消息是,这些离开的工程师全部加入了支持 illumos 项目的公司,比如 Nexenta、Joyent 、Delphix 等。关于 DTrace、ZFS 、Zones 等操作系统特性的创新将由 illumos 传承,但不会再次出现在 Solaris 上。illumos 软件库将成为记录操作系统技术危机的一个活标本。
从 Oracle 离开的 OpenSolaris 工程师们绝大多数活跃于 illumos 社区,给 ZFS 、DTrace、Zones 等带来了更多激动人心的特性。基于 illumos 的发布包括 OpenIndian、SmartOS、illumian 等,这些发布版面向不同用户群,互为补充,发展势头不错。
但是,发展中的 illumos 项目依然矛盾重重,去年 LWN 杂志的一篇题为 Illumos: the successor to the OpenSolaris community 的文章揭示了开源社区的一些明争暗斗。开发者 Stamos Tolias 抨击 illumos 项目的「思维狭隘,ZFS中心独裁以及大教堂式的开发模式」,并且企图另建分支。Illumos 的发展被认为不够开放,缺乏独立性,而 Oracle 的潜在诉讼也正在威胁 illumos 的命运。谁都知道 Oracle 公司打官司的「威力」。
也正是因为 illumos 项目由几家商业公司支持,暂时来看,怕是很难摆脱「大教堂」模式的开发弊病,而这引起了技术社区的批评。在这里,只能期待这些支持 illumos 项目的商业公司不要短视。祝愿 illumos 在将来能有更好的发展吧。
如诸君所见,illumos 项目寄托了一代技术精英的梦想。从 SunOS 到 Solaris ,从 OpenSolaris 再到 illumos ,期间发生的故事不知道有多少,关于 Sun 跌宕起伏的命运,关于技术权力抗争、开源以及梦想的故事,或许将来能有人详细如实的记录下来,一定非常有借鉴意义。
「Code over discussion; Innovation over democracy」
参考信息:
from http://www.dbanotes.net/opensource/Solaris_Illumos.html

CentOS 5.1的发行说明

本文档包括了以下内容:
  • 与安装相关的注记
  • 性能更新
  • 驱动程序更新
  • 内核相关事项更新
  • 其它更新
  • 技术预览
  • 解决的问题
  • 已知的问题
本发行注记版本可能没有记录某些红帽企业 Linux 5.1 中的更新。您可以通过以下 URL 来获得更新的版本:
http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/index.html

与安装相关的注记

这部分包括针对 Anaconda 和安装红帽企业 Linux5.1 的信息
要升级已经安装的红帽企业 Linux 5 系统,您必须使用红帽网络来更新那些已经修改的软件包。
您可以使用 Anaconda 来安装一个全新的红帽企业 Linux 5.1,或从红帽企业 Linux 5 最新的更新版本 升级到红帽企业 Linux 5.1。
  • 如果您需要复制红帽企业 Linux 5 光盘中的内容(例如,为了准备网络安装),请确定复制操作系统光盘。不要复制附加光盘或任何分层产品光盘中的内容,因为这样会覆盖 Anaconda 正常操作所需的文件。
    附加光盘中的内容和其它分层产品光盘中的内容都必须在安装了红帽企业 Linux 5.1 之后才可安装。
  • 在一台完全虚拟化的客户端中安装红帽企业 Linux 5.1 时,请不要使用 kernel-xen 内核。在完全虚拟化的客户端使用这个内核会将导致您的系统无法运行。
    如果您是使用安装号码在一台完全虚拟化的客户端中安装红帽企业 Linux 5.1,请确定在安装过程中取消对 Virtualization 软件包组的选择,因为 Virtualization 软件包组选项将安装 kernel-xen 内核。
    注意:半虚拟化客户端将不会受到这个问题的影响。半虚拟化客户端通常使用 kernel-xen 内核。
  • 如果您在将系统从红帽企业 Linux 5 升级到 5.1 的过程中使用虚拟化内核,您必须在升级后重新启动系统。
    红帽企业 Linux 5 和 5.1 的管理程序与 ABI 不兼容。如果您升级后没有重启系统,那么升级的虚拟化 RPM 就无法与运行的内核匹配。

iSCSI 软件启动程序(open-iscsi)的安装/引导

iSCSI 安装和引导原来是作为技术预览在红帽企业 Linux 5 中进行介绍的。目前我们全面支持这个特性,但有如下限制说明。
此项功能根据您所在的系统有三种配置方法:
  • 使用硬件 iSCSI 启动程序(比如 QLogic qla4xxx
  • 在有 iSCSI 引导支持固件的系统中使用 open-iscsi 启动程序(比如 iSCSI 引导固件,或者带 iSCSI 引导功能的开放固件)
  • 在没有 iSCSI 固件引导支持的系统中使用 open-iscsi 启动程序

使用硬件 iSCSI 启动程序

如果您要使用硬件 iSCSI 启动程序,您可以使用主板 BIOS 设定工具输入 IP 地址,并通过访问远程存储设备获得其它所需参数。远程存储设备的逻辑单元位于 Anaconda 的标准 sd 设备,无需进行额外的设定。
如果您需要确定启动程序的限定名称(IQN)以便配置远程存储设备服务器,请在安装过程中按以下步骤操作:
  1. 进入安装程序中用来选择安装磁盘驱动器的页面。
  2. 点击「高级存储设备配置」。
  3. 点击「添加 iSCSI 目标」。
  4. 此时会在屏幕上显示 iSCSI 的 IQN。

在带 iSCSI 固件引导支持的系统中使用 open-iscsi

如果您要在带 iSCSI 固件引导支持的系统中使用 open-iscsi 软件启动程序,请使用固件的设定工具输入 IP 地址以及其它访问远程存储设备所需的参数。这样做可以将系统配置为从远程 iSCSI 存储设备引导。
目前,Anaconda 无法访问固件中的 iSCSI 信息,因此您必须在安装的过程中手动输入目标 IP 地址。要做到这一点,请按前面描述的过程来确定启动程序的 IQN。随后,在显示启动程序 IQN 同一安装程序页面,指定您想要安装 iSCSI 目标的特定 IP 地址。
在手动指定 iSCSI 目标的 IP 地址后,就可使用 iSCSI 目标中的逻辑单位进行安装。现在,Anaconda 生成的 initrd 将会获得 iSCSI 目标的 IQN 和 IP 地址。
如果以后要修改 iSCSI 目标的 IQN 或者 IP 地址,请进入各个启动程序的 iBFT 或者开放固件设定工具,并修改相应的参数。随后,按以下方法为各个启动程序修改 initrd(它们是保存在 iSCSI 存储设备中)。
  1. 使用 gunzip 解压缩 initrd 文件。
  2. cpio -i 打开该文件。
  3. init 文件中搜索包含字符串 iscsistartup 的行。这一行中还包含 iSCSI 的 IQN 和 IP 地址,用新的 IQN 和 IP 地址替换这一行。
  4. cpio -oinitrd 重新归档。
  5. gunzip 重新压缩 initrd 文件。
我们计划在今后的发行版本中提供操作系统可从开放固件/iBFT 固件中获得 iSCSI 信息的能力。这种改进将在改变 iSCSI 目标的 IP 地址或者 IQN 时不再需要修改各个启动程序的 initrd(保存在 iSCSI 存储设备中)。

在不带 iSCSI 固件引导支持的系统中使用 open-iscsi

如果您要在没有 iSCSI 固件引导支持的系统中使用 open-iscsi 软件启动程序,请使用网络引导功能(比如 PXE/tftp)。在这种情况下,根据之前提到的方法确定启动程序 IQN 并指定 iSCSI 目标的 IP 地址。完成后,将 initrd 复制到网络引导服务器并为网络引导设定系统。
同样,如果修改了 iSCSI 目标的 IP 地址或者 IQN,也要对 initrd 做相应的修改。要做到这一点,请使用之前提到的修改各个启动程序 initrd 的步骤。

性能更新

EXT3 的性能增强
现在,EXT3 的最大容量为 16TB(原来是 8TB)。这种改进原来在红帽企业 Linux 5 中是作为技术预览,但在本更新版本中提供全面的支持。
yum-security
现在可以将 yum 限定为安装安全性更新软件包。要做到这一点,只要安装 yum-security 插件并运行以下命令即可:
yum update --security
Anaconda layer 2 模式性能的提高

独立重启资源
现在就可以在不中断上一级服务的情况下在群集中重新启动资源。通过在运行的节点上使用 __independent_subtree="1" 属性在文件 /etc/cluster/cluster.conf 中进行配置,就可将资源标签设置为独立(independent)。
示例:
<service name="example">
        <fs name="One" __independent_subtree="1" ...>
                <nfsexport ...>
                        <nfsclient .../>
                </nfsexport>
        </fs>
        <fs name="Two" ...>
                <nfsexport ...>
                        <nfsclient .../>
                </nfsexport>
                <script name="Database" .../>
        </fs>
        <ip/>
</service>
这里使用了两个文件系统资源:OneTwo。如果 One 失败,就会在不中断 Two 的情况下重启它。如果 Two 失败,将重启所有组件(One 及其子命令和 Two 的子命令)。在任何时候,Two 及其子命令都不会依赖于 One 提供的资源。
注意:Samba 需要一个特殊的服务结构,且不可用于没有独立子树的服务。这种情况在其它资源中也适用,因此应该小心使用 __independent_subtree="1" 属性。
虚拟化
本发行版本中还包括以下虚拟化更新:
  • 虚拟化的内核现在可以使用 kdump 功能。
  • 本发行版本现在支持 AMD-V,这就启用了完全虚拟化客户端的动态域迁移。
  • 虚拟化内核现在可支持高达 256GB RAM。
  • 现在扩展了内核内嵌套接字 API。这可用来修复在客户端之间运行 sctp 时发生的故障。
  • 目前,虚拟联网是虚拟化库 libvirt 的一部分。libvirt 中包含一系列命令,可用这些命令为一台机器中的所有本地客户机设置虚拟 NAT/路由器和专用网络。这对不需要从外部进行路由的用户尤为有利,它对在笔记本电脑中使用虚拟化系统的开发者也很有用。
    注意:虚拟联网功能会在为虚拟网络处理 dhcpdnsmasq 中添加相依性。
    libvirt 的详细资料请参考 http://libvirt.org
  • 现在,libvirt 能够管理非交互虚拟机,它可在不终止或者启动虚拟机的情况下为域下定义或者取消定义。这个功能与 virsh definevirsh undefine 命令相似。
    这种性能的提高允许红帽虚拟机管理器显示所有可用客户机。这可让您从 GUI 中直接启动这些客户机。
  • 安装 kernel-xen 软件包不会再导致生成不正确/不完整的 elilo.conf 条目。
  • 完全虚拟化的客户端现在支持热迁移。
  • 现在,xm create 命令在 virt-manager 中有相应的图形化界面。
  • 现在支持嵌套分页(Nested Paging,NP)。这项性能减小了在虚拟化环境中进行内存管理的复杂性。另外,NP 还可在需要大量内存的客户端中降低 CPU 的占用。
    目前,NP 不是默认启用的。如果您的系统支持 NP,那么我们建议您在通过使用参数 hap=1 在引导监控程序时启用 NP。
本次对虚拟化性能的更新还包括在 64 位主机中安装并运行半虚拟化 32 位客户端。然而这个功能只作为技术预览介绍,因此并不提供产品使用支持。
共享页面表
共享页面表现在支持 hugetlb 内存,这可让多个进程共享页面表条目。
在多个进程间共享页面表条目会降低缓存空间的消耗。这提高了应用程序缓存命中比例,结果是提高了应用程序性能。
tick_divider
tick_divider=<value> 选项是一个 sysfs 参数,它可允许您在为用户空间应用程序维护同一可视 HZ 时间值是调整系统时钟比率。
使用 tick_divider= 选项可让您减少 CPU 消耗,并在降低了计时和模拟操作准确性的情况下提高效率。
标准 1000Hz 时钟有用的 <值> 为:
  • 2 = 500Hz
  • 4 = 250Hz
  • 5 = 200Hz
  • 8 = 125Hz
  • 10 = 100Hz (使用以前 红帽企业 Linux 发行版本中的值)
注意:虚拟化内核不支持客户端中的多个计时器速率。Dom0 使用在所有客户端中设定的固定计时速率,这可减少多个信号比例导致的负载。
安装到 dm-multipath 设备
现在,Anaconda 具有在 dm-multipath 设备中进行检测、创建和安装的能力。要启用这个特征,可以在内核引导行中添加 mpath 参数。
这项性能最初作为技术预览在红帽企业 Linux 5 中进行了介绍,在本发行版本中提供全面的支持。
注意:dm-multipath 还为 Dell MD3000 提供收件箱支持特性。但如果有多个节点使用 dm-multipath 访问 MD3000 则不会立刻执行故障切换。
另外,如果您的系统同时有 multipath 和 non-multipath 设备,我们还推荐您在 Anaconda 中使用「自定义分区」界面。在这种情况下使用「自动分区」选项可在同一逻辑卷组中生成两种类型的设备。
目前,这个特性可采用以下限制:
  • 如果只有一个路径指向引导逻辑单元数(LUN),那么即使指定了 mpathAnaconda 也会在 SCSI 设备中安装。即使在您启用了指向引导逻辑单元数的多个路径并重新生成 initrd 文件之后,操作系统还是会从 SCSI 设备,而不是 dm-multipath 设备引导。
    然而,如果一开始就有指向引导 LUN 的多个路径,Anaconda 会在内核引导行中指定 mpath 后,根据 dm-multipath 进行正确安装。
  • 在默认情况下在 multipath.conf 文件中将 user_friendly_names 设为 yes。这是设置 dm-multipath 根设备辅助实施的要求。因此,如果将 user_friendly_names 设为 no,并重新生成 initrd 文件会导致引导失败,并给出以下出错信息:
    Checking filesystems
    fsck.ext3: No such file or directory while trying to open /dev/mapper/mpath0p1
    
从存储域网(SAN)引导
现在支持从 SAN 磁盘设备引导的功能。在这里,SAN 指的是光线通道或者 iSCSI 接口。这个功能还支持使用 dm-multipath 通过多路径将系统连接到存储设备。
在使用多主机总线适配器(host bus adapter,HBA)进行配置时,如果通过当前所有适配器的路径都失败了,您可那需要设定系统 BIOS 以便可从其它适配器引导。
nfsroot
在本次更新中全面支持 nfsroot。这可允许用户使用通过 NFS 挂载的根文件系统(/)运行红帽企业 Linux 5.1。
nfsroot 原来是作为无状态 Linux(Stateless Linux) 特性技术预览中的一部分在红帽企业 Linux 5 进行了介绍。Stateless Linux 的完全应用仍保留为技术预览。
目前,nfsroot 有以下限制:
  • 每个客户端都必须在 NFS 服务器中有其独立的根文件系统。该限制也适用于只读的根文件系统。
  • NFS 不支持 SWAP。
  • nfsroot 客户端无法启用 SELinux。通常红帽不推荐禁用 SELinux,因此客户必须认真考虑这个动作的安全隐患。
参考以下设置 nfsroot 的步骤。该步骤假设您的网络设备是 eth0,与其关联的网络驱动程序为 tg3。您可能需要根据您的系统配置进行调整:
  1. 使用下面的命令在您的主目录中创建 initrd
    mkinitrd --with=tg3 --rootfs=nfs --net-dev=eth0 --rootdev=<nfs server ip>:/<path to nfsroot> ~/initrd-<kernel-version>.img <kernel-version>
    必须使用红帽企业 Linux 5.1 内核创建这个 initrd 文件。
  2. 接下来,从之前生成的 initrd 文件中创建 zImage.initrd 映像。zImage.initrd 是将压缩的内核和 initrd 合为一个映像。使用以下命令:
    mkzimage /boot/System.map-<kernel-version> ~/initrd-<kernel-version>.img /usr/share/ppc64-utils/zImage.stub ~/zImage.initrd-<kernel-version>
  3. 将生成的 zImage.initrd-<kernel-version> 文件复制到您 tftp 服务器上的一个可导出的位置。
  4. 确定在 nfs 服务器中导出的 nfsroot 文件包含必要的二进制文件和模块。这些二进制文件和模块必须和第一步中用来生成 initrd 文件的内核版本对应。
  5. 将 DHCP 服务器配置为将客户端指向目 zImage.initrd-<kernel-version>
    要做到这一点,请在 DHCP 服务器的 /etc/dhcpd.conf 文件中添加以下条目:
    next-server <tftp hostname/IP address>;
    filename "<tftp-path>/zImage.initrd";
    
    注意:<tftp-path> 应该从 tftp 导出的目录指定到 zImage.initrd 的路径。例如:如果到 zImage.initrd 的绝对路径为 /tftpboot/mykernels/zImage.initrd/tftpboot/tftp 导出的目录,那么 <tftp-path> 就应该是 mykernels/zImage.initrd
  6. 最后,将您的系统引导配置参数设置为首次从网络设备引导(在这个例子中,网络设备是 eth0。)
GFS2
GFS2 是 GFS 的增量升级版本。本更新版本采用一些需要修改为 on-disk 文件系统格式的明显改进。可使用 gfs2_convert 程序将 GFS 文件系统转换为 GFS2 文件系统,这样就相应更新了 GFS 文件系统的元数据。
GFS2 开始是在红帽企业 Linux 5 中作为技术预览发布的,现在本更新中提供全面支持。以下基准测试显示了更快的性能:
  • 在某单一目录中的大用量和快速目录扫描(Postmark benchmark)
  • 同步 I/O 操作(fstest 基准测试显示为类似 TIBCO 等应用程序发出信息的能力提高了)
  • 从缓存读取,因为不再有任何 locking overhead
  • 将 I/O 指向预定的文件
  • 检查 NFS 文件处理
  • df 现在将分配信息记入缓存
另外,GFS2 还提供以下性能改进:
  • 现在使用明文文件(但是隐藏文件)取代了原有的元数据,并可将日志作为附加服务器动态挂载到文件系统中。
  • 现在是通过挂载选项 quota=<on|off|account> 启用和禁用份额
  • 在群集系统中不再需要 quiesce 来为故障修复显示日志
  • 现在支持毫微秒时间戳
  • 和 ext3 相似,现在 GFS2 支持 data=ordered 模式
  • 现在可通过标准 ioctl() 支持 lsattr()chattr() 属性设定
  • 现在支持超过 16TB 的文件系统
  • GFS2 是标准文件系统,并可用于非群集系统的配置
驱动程序更新程序
驱动程序更新程序(DUP)是设计用来允许第三方销售商(比如 OEM)使用常规 RPM 发行版本包装,将他们自己的设备驱动程序和其它 Linux 内核模块添加到红帽企业 Linux 5 系统中。
红帽企业 Linux 5.1 在 DUP 中使用一些更新,最重要的是:
  • 现在支持通过驱动程序更新磁盘提供安装时驱动程序更新 RPM
  • 现在支持影响系统引导路径的引导路径驱动程序更新
  • 现在已经不支持第三方包装的高级 Linux 音效构架(Advanced Linux Sound Architecture,ALSA)
另外,内核 ABI 符号 whitelist 会应用各种更新。打包的驱动程序可使用这些 whitelist 来决定哪些内核提供的符号和数据结构可用于第三方驱动程序。
详细资料请参考 http://www.kerneldrivers.org/RedHatKernelModulePackages

驱动程序更新

通用驱动程序更新
  • acpi:更新 ibm_acpi 模块,可解决一些 Lenovo 笔记本电脑的一些 ACPI 和扩展坞(docking station)问题。
  • ipmi:当将硬件中断分配给底板管理控制程序时不再查询 kthread
  • sata:SATA/SAS 升级到 2.6.22-rc3 版本。
  • openibopenmpi:升级到 OFED(OpenFabrics 企业发行版)1.2 版。
  • powernow-k8:升级到 2.0.0 版,以便全面支持 Greyhound
  • xinput:添加该文件以便启用全面 RSA 支持。
  • aic94xx:升级到 1.0.2-1 版,同时将内嵌的定序程序固件升级到 v17。这些更新采用以下修改方案:
    • 用解压缩程序将 ascb 竞态条件固定在平台上
    • 添加 REQ_TASK_ABORTDEVICE_RESET 处理程序
    • 现在可在发现错误后正确清理物理端口
    • 现在可使用 sysfs 启用和禁用 phys
    • 扩大 DDB 锁的使用以阻止 DDB 竞态条件
音频
将 ALSA 更新到 1.0.14,本更新解决了以下问题:
  • 修复了 IBM Taroko(M50)的噪音问题
  • 现在支持 Realtek ALC861
  • 修复了 xw8600 和 xw6600 的静音问题
  • 现在支持 ADI 1884 Audio
  • 修复了 xw4600 的音频配置问题
PCI
  • 添加功能调用以便为 PCIX 和 PCI-Express 设定最大读取要求大小
  • IBM System P 机器现在支持 PCI-Express 热插拔
  • 添加了必要的驱动程序和 PCI ID 来支持 SB600 SMBus
网络
  • e1000 驱动程序:更新到 7.3.30-k2 版来支持启用了 I/OAT 的芯片集。
  • bnx2 驱动程序:更新到 1.5.11 版来支持硬件 5709。
  • B44 以太网驱动程序:用 backport 返回到 2.6.22-rc4 版,以便应用了以下修改:
    • 修改了一些 endianness
    • 现在使用 DMA_30BIT_MASK 常数
    • 现在使用 skb_copy_from_linear_data_offset()
    • spin_lock_irqsave() 现在提供更安全的中断禁用性能
    • 在恢复操作中执行简单错误检查
    • 采用了一些对多点传送的修复
    • 芯片重设比预期的时间要长
  • Marvell sky2 驱动程序:更新到 1.14 版来修复那些在重复执行 ifup/ifdown 命令时会导致内核故障的程序错误。
  • forcedeth-0.60 驱动程序:本发行版本包括此程序。这修复了一些使用 NVIDIA MCP55 主板芯片组和相应板载 NIC 用户的一些主要程序故障。
  • ixgb 驱动程序:更新到最新的上级版本(1.0.126)。
  • netxen_nic 驱动程序:添加了 3.4.2-2 版来启用对 NetXen 10GbE 网卡的支持。
  • 现在支持 Chelsio 10G 以太网控制程序。
  • 添加了对 s2io 设备的 PCI 错误修复支持。
  • Broadcomm 无线以太网驱动程序现在为 nx6325 卡支持 PCI ID。
  • 修复了在试图通过 ifup 启动 BCM4306 时引起的 ASSERTION FAILED 程序错误。
  • ixgb 驱动程序:更新到可为 Intel 10GB 以太网卡提供添加 EEH PCI 错误修复支持。详情请参考 /usr/share/doc/kernel-doc-<kernel version>/Documentation/pci-error-recovery.txt
  • qla3xxx 驱动程序:重新启用并更新到版本 2.03.00-k3 来为 QLogic iSCSI 适配器在不使用 iSCSI 时提供联网支持。
  • Intel PRO/Wireless 3945ABG 网络驱动程序:更新到版本 1.2.0。此更新解决了几个问题,其中包括在某些笔记本电脑中的一些特定条件下出现的软件锁定故障。
  • qla2xxx:驱动程序升级至版本 8.01.07-k6。其中修改了一些内容,最重要的是:
    • 现在支持 iIDMA
    • 现在支持以下 Fibre 频道属性:
      • 符号节点名称
      • 系统主机名
      • fabric 名称
      • 主机端口状态
    • 不再记录追踪控制同步事件
    • 修正了重新设定处理逻辑
    • 现在支持 MSI-X
    • 现在根据系统对 IRQ-0 的分配进行处理
    • NVRAM 更新立刻生效
IPMI
本发行版本包括 IPMI 驱动程序更新组件,其中有上级修改版 2.6.21.3 以及从 2.6.22-rc-4 中获得的一些补丁。本更新提供以下修改:
  • 修复了 ipmi_si_intf 无法初始化的数据程序错误
  • 如果另有驱动程序支持中断操作,就不再启动 kipmid
  • 现在允许用户通过 force_kipmid 覆盖内核守护进程 enable
  • 现在支持按频道进行命令限制
  • 不再使用 MAX_IPMI_INTERFACES
  • 现在支持热系统界面删除
  • 添加了维护模式来支持固件更新
  • pigeonpoint IPMC 添加了 poweroff 支持
  • 现在 BT 子驱动程序在长时间超时后仍可运行
  • 添加了处理正确清除热删除的 pci_remove
有关新模块的参数请参考 /usr/share/doc/kernel-doc-<kernel version>/Documentation/IPMI.txt
SCSI
  • 将红帽企业 Linux 中的黑名单导入此更新版本。
  • aic79xx 驱动程序添加 PCI ID。
  • aacraid 驱动程序:更新到版本 1.1.5-2437 来支持 PRIMERGY RX800S2RX800S3
  • megaraid_sas 驱动程序:更新到版本 3.10。本更新为 bios_param 定义了切入点,添加了 IOCTL 记忆库,并做了一些细微的故障修复。
  • Emulex lpfc 驱动程序:更新到版本 8.1.10.9。本更新应用了一些修改,最重要的是:
    • 修复了 ioctl 路径中的 host_lock 管理故障
    • 现在可自动识别 AMD 芯片,并将 DMA 长度减小到 1024 字节
    • 如果激活了故障修复,就不会在运行 dev_loss_tmo 的过程中删除节点
    • 现在启用 8GB 链接速度
  • qla4xxx 驱动程序更新到采用以下修改:
    • 添加了对 IPV6 、QLE406x 和 ioctl 模块的支持
    • 修复了引起系统锁定的 mutex_lock 故障
    • 解决了在试图装载/卸载 qla4xxxqla3xxx 接口时的锁定问题
  • mpt fusion 驱动程序:更新到版本 3.04.04。本更新采用了一些修改,最重要的是:
    • 修复了处理程序故障时出现的错误
    • mptsas 现在可连续进行目标重设
    • mptsasmptfc 现在支持大于 255 逻辑单元数目(LUN)和目标。
    • 修复了 LSI mptspi 驱动程序回归导致 DVD 驱动程序性能极度缓慢的故障
    • 当 LSI SCSI 设备返回一个 BUSY 状态时,重试几次后 I/O 操作不再失败
    • 自动重建后,RAID 阵列不再可用
  • arcmsr 驱动程序:包括此驱动程序来为 Areca RAID 控制器提供支持。
  • 3w-9xxx 模式:更新该模式来正确支持 3ware 9650SE。

内核相关的更新

  • CIFS 客户机已经更新至版本 1.48aRH,它是基于 1.48a 发行版本,并添加了以下修改补丁:
    • 使用挂载选项 sec=none 可进行匿名挂载
    • 目前启用 POSIX 扩展时,CIFS 可执行 umask 命令
    • 修复了请求数据包签名的 sec= 挂载选项
    注意:对于使用 EMC Celerra(NAS 编码为 5.5.26.x 以下)的用户,当访问位于 EMC NAS 中的共享时,CIFS 客户机会挂起,这会用以下内核信息来表示:
    kernel:  CIFS VFS: server not responding
    kernel:  CIFS VFS: No response for cmd 162 mid 380
    kernel:  CIFS VFS: RFC1001 size 135 bigger than SMB for Mid=384
    
    挂载 CIFS 后,就无法从中读/写任何文件,且所有试图从该挂载点进行 I/O 操作的应用程序都会挂起。升级到 5.5.27.5 或更新的版本可解决这个问题(使用 EMC Primus 包装盒号码 emc165978)。
  • 现在支持 MODULE_FIRMWARE 标签。
  • 现在支持 ICH9 控制程序
  • 现在调用 CPUID 时支持 Greyhound 处理器。
  • Oprofile 现在支持新的 Greyhound 性能计数器事件。
  • 现在支持 Directed DIAG 来提高 z/VM 的使用。
  • 现在通过 DRM 内核模块支持 Intel 显示芯片。另外,已将 DRM API 升级到 1.3 版来支持直接绘制。
  • 更新到 ACPI 电源管理将改进 S3 STR 和 S4 休眠。

其它更新

  • gaim 现在名为 pidgin
  • Intel microcode 更新到 1.17 版,该版本添加了对新的 Intel 处理器的支持。
  • 现在支持在 EMC Clariion 存储设备中使用 dm-multipath 的隐含双工错误。
  • fonts-chinese 软件包中不再包含中文字体 Zysong,该字体现在作为独立的 fonts-chinese-zysong 文件打包。fonts-chinese-zysong 软件包在补充光盘中。
    注意:fonts-chinese-zysong 软件包需要支持中国国家标准 GB18030。
  • 挑战握手认证协议(CHAP)用户名和密码的字符长度限制在 256 以内。
  • 在本次更新中不建议使用 pump,因此用 netconfig 配置您的网络接口可能会破坏 ifcfg 脚本。
    要正确配置您的网络接口,请使用 system-config-network。安装更新的 system-config-network 软件包,删除 netconfig
  • 不再支持 rpm --aid,建议您在更新和安装软件包时使用 yum

技术预览

红帽企业 Linux 5.1 订阅服务目前还支持技术预览特性,它现在也还不完善,不适合于正式使用。但这些特性可以方便客户,提供更广泛的功能。
客户可能发现这些特征在非产品的环境里很有用。在对这些技术预览特性提供全面支持之前,我们欢迎客户提供反馈和关于功能的建议。对于严重的安全问题,我们将提供勘误表。
随着这些技术预览特性的不断开发,用户将可以获得其它新功能,并对它们进行测试。 红帽 可能会在以后的发行版本中对这些技术预览特性提供全面的支持。
Stateless Linux
Stateless Linux 为运行和管理一个系统提供了一个新思路。它的设计思想是,通过简单地更换系统的组成部分来达到简化维护和管理一个大型系统的目的。这主要是通过使用提前准 备好的系统映像来实现的,这些系统映像可以在大量的 stateless 系统间进行复制和管理,以只读的方式运行操作系统(详情请参考 /etc/sysconfig/readonly-root)。
在它当前的开发阶段,stateless 的功能只是它所要设计达到的功能的一部分。因此将这些功能标记为技术预览。
以下是包括在红帽企业 Linux 5 中的基本功能:
  • 使用 NFS 运行一个 stateless 映像
  • 使用 loopback over NFS 来运行一个 stateless 映像
  • 在 iSCSI 上运行

我们强烈建议对测试 stateless 代码感兴趣的用户参阅 http://fedoraproject.org/wiki/StatelessLinuxHOWTO 中的 HOWTO 并加入 stateless-list@redhat.com
在红帽企业 Linux 5 中我们介绍了启用的 Stateless Linux 构架结构(infrstructure piece)。
AIGLX
与完全支持的 X 服务器不同,AIGLX 是 X server 的一个技术预览特性。它的目标是在标准桌面上启用 GL 加速效果,该项目由以下内容组成:
  • 有少许修改的 X server
  • 增加了新协议支持的更新的 Mesa 软件包

通过安装这些组件,几乎不作修改您就可以在桌面上实现 GL 加速的效果,而且不需要替换 X server 就可以及启用和终止它。AIGLX 也启用远程 GLX 应用程序来利用 GLX 硬件加速功能。
devicescape (d80211)
devicescape 栈启用 iwlwifi 4965GN 无线驱动程序。该栈允许某些无线设备连接到 Wi-Fi 网络。
这个栈有一个尚未由上游网络接受的编码库,另外它的稳定性还没有得到结论性的测试验证。因此,在本发行版本中,它只是作为一项技术预览。
FS-Cache
FS-Cache 是一个远程文件系统的本地缓存工具。它允许用户在一个本地挂载的磁盘上缓存 NFS 数据。要设置 FS-Cache,请安装 cachefilesd RPM 并根据 /usr/share/doc/cachefilesd-<version>/README 中的介绍进行配置。
使用安装的 cachefilesd 软件包的相应版本替换 <version>
Systemtap
Systemtap 提供自由软件(GPL)架构来简化运行的 Linux 系统的信息收集,这有助于诊断系统性能或者功能问题。利用 systemtap,开发者在需要收集数据时不再需要完成阅读冗长的指令、编译、安装和重启等一系列步骤。
iSCSI 目标
Linux 目标(tgt)允许系统将块层 SCSI 存储设备用于服务其它有 SCSI 启动程序的系统。可将这项功能一开始就部署为一个 Linux iSCSI 目标,通过网络为所有 iSCSI 启动程序提供存储服务。
要设置 iSCSI 目标,请安装 scsi-target-utils RPM,并参考以下说明:
  • /usr/share/doc/scsi-target-utils-<version>/README
  • /usr/share/doc/scsi-target-utils-<version>/README.iscsi
使用安装的软件包的相应版本替代 <version>
详情请参考 man tgtadm
火线接口(FireWire)
本更新中包括 firewire-sbp2 模块,并将其视为技术预览。该模块启用了火线接口存储设备和扫描仪连接。
目前,火线接口不支持以下设备:
  • IPv4
  • pcilynx 主机控制程序
  • multi-LUN 存储设备
  • 对存储设备的非排他访问
另外,本版本的火线接口仍然存在以下问题:
  • SBP2 驱动程序的内存泄露可能会导致机器不反应。
  • 本版本中的编码在使用 big-endian 的机器中无法正常工作,这可能会导致在 PowerPC 中出现异常行为。

解决的问题

  • 目前修复了导致装有 SATA 的系统在引导过程中暂停并在继续工作前显示错误信息的 SATA 故障。
  • 在多引导系统中,parted 目前保留了第一主分区的启动部分,那里安装有 Windows Vista™。因此,当同时使用红帽企业 Linux 5.1 和 Windows Vista™ 设置多引导系统时,后者不会再变成无法引导。
  • rmmod xennet 不再引起 domU 崩溃。
  • 没有在 node 0 中配置内存的 4-socket AMD Sun Blade X8400 服务器模块系统不会在引导过程中崩溃。
  • 现在可使用 congaluci 创建并配置失效的域。
  • 通过 yum 安装群集存储设备组群不会再失败。
  • 在安装过程中,不会再为 /var/log/faillog/var/log/tallylog 分配错误的 SELinux 环境变量。
  • 在使用分开的安装介质(如 CD 或 NFSISO)安装红帽企业 Linux 5.1 的过程中,不再会在 amanda-server 安装程序中产生错误。
  • EDAC 目前可报告最新的 k8 处理器中的内存量。
  • 通过 gdm 远程登录 Gnome 桌面不再导致登录屏幕挂起。
  • 修复了 autofs 阻止多点挂载正常运行的程序错误。
  • bttv 内核模块运行 tvtimexawtv 不再导致系统停止。
  • utrace 的一些补丁采用了以下修复方案:
    • 修复了使用 ptrace 时在竞争条件下导致崩溃的程序错误。
    • 修复了调用 PTRACE_PEEKUSR 时返回 EIO 错误的故障
    • 修复了当有子进程退出特定环境时阻止 wait4 调用唤醒功能的回归错误
    • 修复了有时阻止 SIGKILL 中断进程的回归错误。当 ptrace 运行在某个特定环境中的进程时会发生这种情况。
  • 目前修复了造成闹钟和实时时钟周期性中断的程序错误。

已知问题

  • 第一次点击 Anaconda 中的「发行注记」按钮,窗口在显示发行注记时会出现延迟。在延迟的过程中,会在窗口出现一个空的列表。这个过程通常会很快,所以大多数用户不会注意到这一点。
    延迟很可能是由于安装软件包的阶段是安装过程中最消耗 CPU 的阶段。
  • 使用 NVIDIA 图形卡的某些机器在用图形化安装程序或者图形界面登录时,可能会不正确地显示图形或字体。要解决这个问题,先切换到一个虚拟控制台,然后切换回原来的 X 主机。
  • 使用 MegaRAID 驱动的主机总线适配器必须设置为在 "Mass Storage" 仿真模式下操作,
    1. 输入 MegaRAID BIOS Set Up Utility
    2. 输入 Adapter settings menu
    3. Other Adapter Options 下,选择 Emulation 并把它设置为 Mass Storage
    如果适配器被错误地设置为 "I2O" 仿真,系统将试图装在 i2o 驱动。这不会成功而且会阻止正确驱动的装载。
    以前的 红帽企业 Linux 发行版本通常不会在 MegaRAID 驱动之前装载 I20 驱动。无论如何,Linux 使用的硬件应该总是设为 "Mass Storage" 仿真模式。
  • 安装了 Cisco Aironet MPI-350 无线网卡的笔记本可能会在使用有线以太端口进行网络安装的过程中,不能获取 DHCP 地址。
    要解决这个问题,可以使用本地介质进行安装。或者,在安装之前您可以在笔记本的 BIOS 里禁用无线网卡(完成安装后,您可以再启用它)。
  • 目前,system-config-kickstart 不支持软件包的选择和取消。在使用 system-config-kickstart 时,「Package Selection」 选项是禁止的。这个因为 system-config-kickstart 使用 yum 来收集组信息,但却不能配置 yum 来连接红帽网络。
    目前,您将需要在 kickstart 文件里手动更新软件包部分。当使用 system-config-kickstart 打开 kickstart 文件时,它将保留其中的所有软件包信息,在您保存文件时再写回。
  • 在 红帽企业 Linux 5 的这个升级版本中,/var/log/boot.log 里没有引导时日志,在未来的更新版本中会添加类似的功能。
  • 当从红帽企业 Linux 4 升级到红帽企业 Linux 5时,《部署指南》并没有自动安装。您需要在升级完成后用 pirut 来手工安装它。
  • 如果 X 正在运行且使用 vesa 之外的驱动,系统可能没有成功地重启至 kexec/kdump 内核。这个问题只存在于 ATI Rage XL 图形芯片组里。
    如果 X 运行在安装了 ATI Rage XL 的系统上,为了成功地重启至 kexec/kdump 内核,请确保它使用 vesa 驱动。
  • 在型号为 xw9300 和 xw9400 的 HP 系统里,安装虚拟化特征可能导致 time went backwards 警告。
    对于 xw9400 机器,如果要解决这个问题,可以在 BIOS 里启用 HPET 计时器。注意,这个选项对于 xw9300 机器是不可用的。
    这个问题将会在由 HP 提供的 BIOS 更新中解决。
  • 当在安装了 nVidia CK804 芯片的机器上使用 红帽企业 Linux 5 时,您可能会收到如下的内核信息:
    kernel: assign_interrupt_mode Found MSI capability
    kernel: pcie_portdrv_probe->Dev[005d:10de] has invalid IRQ. Check vendor BIOS
    
    这些信息指出某些 PCI-E 端口没有请求 IRQ。而且,这些信息不会以任何方式影响机器的操作。
  • 当您以根用户身份登录时不会自动挂载可拆卸存储设备(比如 CD 和 DVD)。因此,您将需要用图形文件管理程序手动挂载这样的设备。
    另外您还可以运行以下命令将设备挂载到 /media
    mount /dev/<device name> /media
    
  • 在本更新版本中不默认支持 Calgary IOMMU 芯片。要启用对此芯片的支持,请使用内核命令行选项 iommu=calgary
  • IBM System z 不提供传统的 Unix 风格的物理控制台。因此,用于 IBM System z 的 红帽企业 Linux 5 在初始程序装载时不支持 firstboot 功能。
    要为用于 IBM System z 的 红帽企业 Linux 5 正确初始化设置,可以在安装后运行以下命令:
    • /usr/bin/setup — 由 setuptool 软件包提供。
    • /usr/bin/rhn_register — 由 rhen-setup 软件包提供。
  • 当通过红帽网络从红帽企业 Linux 5 升级到红帽企业 Linux 5.1 时,yum 命令不会提示您导入 redhat-beta 密钥。因此,我们建议您在升级之前手动导入 redhat-beta 密钥。方法如下:
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta
  • 当在配置的文档编辑程序中删除 LUN 时,不会在主机中有所反应。在这种情况下,当使用 dm-multipath 时,lvm 可能会挂起,因为 LUN 现在已经无效了。
    如果出现这种情况,请删除所有设备和 /etc/lvm/.cache 文件中指定无效 LUN 的 mpath 链接条目。
    找出这些条目是什么,运行以下命令:
    ls -l /dev/mpath | grep <stale LUN>
    例如:如果 <stale LUN> 是 3600d0230003414f30000203a7bc41a00,则会出现以下结果:
    lrwxrwxrwx 1 root root 7 Aug  2 10:33 /3600d0230003414f30000203a7bc41a00 -> ../dm-4
    lrwxrwxrwx 1 root root 7 Aug  2 10:33 /3600d0230003414f30000203a7bc41a00p1 -> ../dm-5
    
    就是说 3600d0230003414f30000203a7bc41a00 与两个 mpath 链接匹配,它们是:dm-4dm-5
    因此,要删除 /etc/lvm/.cache 文件中的以下各行:
    /dev/dm-4 
    /dev/dm-5 
    /dev/mapper/3600d0230003414f30000203a7bc41a00
    /dev/mapper/3600d0230003414f30000203a7bc41a00p1
    /dev/mpath/3600d0230003414f30000203a7bc41a00
    /dev/mpath/3600d0230003414f30000203a7bc41a00p1
    
  • 当从 CD 或者 DVD 里创建完全虚拟化的 Windows™ 客户端时,客户操作系统的第二阶段安装在重启后将不能继续。
    要解决这个问题,可以编辑 /etc/xen/<name of guest machine>,附加一条关于 CD / DVD 设备的记录。
    如果对简单文件的安装被用作虚拟设备,/etc/xen/<客户机名称>disk 行将如下所示:
    disk = [ 'file:/PATH-OF-SIMPLE-FILE,hda,w']
    
    主机上的 DVD-ROM 设备 /dev/dvd 可以在安装的第二阶段作为 hdc 可用,只要加入和 'phy:/dev/dvd,hdc:cdrom,r' 类似的条目。因此,disk 行应该如下所示:
    disk = [ 'file:/opt/win2003-sp1-20061107,hda,w', 'phy:/dev/dvd,hdc:cdrom,r']
    
    根据硬件配置的不同,所使用的相应的设备路径也会不同。
  • 如果没有在内核中添加 sctp 模块,运行 netstat 并使用 -A inet 或者 -A inet6 选项会出现异常终止,同时会返回以下信息:
    netstat: no support for `AF INET (sctp)' on this system.        
    
    要避免这种情况发生,请安装 sctp 内核模块。
  • 在完全虚拟化的客户机中安装 红帽企业 Linux 可能会非常慢。另外,安装后启动客户机可能会出现 hda: lost interrupt 错误。
    要避免此启动错误,请将客户机配置为使用 SMP 内核。
  • 当前的内核在引导时打印到串行端口前不使用数据终端准备(DTR)信号。有些设备会要求使用 DTR 技术,因此不会将这些设备的串口控制台打印内核引导信息。
  • 将主机(dom0)系统升级到红帽企业 Linux5.1 可能会导致现有 红帽企业 Linux 4.5 SMP 半虚拟化客户机无法引导。这种情况通常会在主机系统内存大于 4GB 时出现。
    要解决这个问题,请在单一 CPU 模式下引导每个 红帽企业 Linux 4.5 客户机,并将其内核升级到最新的版本(红帽企业 Linux 的最新版本是 4.5.z)。
  • AMD 8132HP BroadCom HT100 使用一些不支持 MMCONFIG 循环的平台(比如 HP dc7700)。如果您的系统使用是两种芯片集之一,您的 PCI 配置应该使用原有的 PortIO CF8/CFC 机制。要进行此配置,请在安装过程中使用 -pci nommconfig 内核参数引导系统,并在重新引导后为 GRUB 添加 pci=nommconf
    另外,AMD 8132 芯片集不支持信息信号中断(MSI)。如果您的系统使用此芯片集,您还应该禁用 MSI。要做到这一点,请在安装过程中使用 -pci nomsi 内核参数引导系统,并在重新引导后为 GRUB 添加 pci=nomsi
    但是,如果内核已经屏蔽了您的特定平台,您的系统就不需要后面的 pci 内核参数。以下是已经由内核屏蔽的 HP 平台:
    • DL585g2
    • dc7500
    • xw9300
    • xw9400
  • 此发行版本中的 Virtual Machine Managervirt-manager)不允许用户为半虚拟化客户安装程序指定额外的引导参数,即使在需要设定这些参数以便在特定类型硬件中安装某种类型的半虚拟化客户机时也不行。
    这个问题将在今后的 virt-manager 发行版本中解决。要在用命令行安装半虚拟化客户机指定任意内核参数,请使用 virt-install 命令。
  • 在默认 dm-multipath 配置中,Netapp 设备可能需要在恢复了之前失败的路径后用几分钟来完成切换。要解决这个问题,请在 multipath.conf 文件的 devices 部分添加以下 Netapp 设备配置:
    devices {
            device {
                    vendor                  "NETAPP"
                    product                 "LUN"
                    getuid_callout          "/sbin/scsi_id -g -u -s /block/%n"
                    prio_callout            "/sbin/mpath_prio_netapp /dev/%n"
                    features                "1 queue_if_no_path"
                    hardware_handler        "0"
                    path_grouping_policy    group_by_prio
                    failback                immediate
                    rr_weight               uniform
                    rr_min_io               128
                    path_checker            directio
            }
    
( amd64 )


本内容需要在 Open Publication License, v1.0(http://www.opencontent.org/openpub/)的条件下发布

Frysk GUI

frysk 项目的目的是创建一个智能的、分布式的、always-on 的系统监控和调试工具,它允许开发者和系统管理员来:
  • 监控运行的进程和线程(包括创建和终止事件)
  • 监控 locking primitive 的使用
  • 解开死锁
  • 收集数据
  • 从列表里选择任何进程来调试,或者允许 frysk 来打开崩溃或不正常的进程的源代码(或其他)窗口。
 在 红帽企业 Linux 5 里,frysk 图形用户界面只是一个技术预览,但 frysk 命令行接口是被完全支持的。
/usr/bin/fcatch
/usr/bin/fcore
/usr/bin/fhpd
/usr/bin/fparser
/usr/bin/fstack
/usr/bin/fstep
/usr/bin/ftrace

内存测试

一些Linux发行版的安装盘的菜单和安装后的系统的启动菜单里包含了”memory test”攻能。
  原来可以很简单的为自己的系统添加此功能。
  先在这里下载程序
  http://www.memtest86.com/
  编译之后的memtest.bin是可以启动系统的:
  修改GRUB.CONF增加启动项:
  #cat>> /etc/grub.conf
  title Linux Memory Test
  kernel (hd0,0)/memtest.bin

在BASH中进行数学运算

以前只知道expr,今天发现了BASH内置的let:
let: let arg [arg ...]
Each ARG is an arithmetic expression to be evaluated.  Evaluation
is done in fixed-width integers with no check for overflow, though
division by 0 is trapped and flagged as an error.  The following
list of operators is grouped into levels of equal-precedence operators.
The levels are listed in order of decreasing precedence.
id++, id–      variable post-increment, post-decrement
++id, –id      variable pre-increment, pre-decrement
-, +            unary minus, plus
!, ~            logical and bitwise negation
**              exponentiation
*, /, %         multiplication, division, remainder
+, -            addition, subtraction
<<, >>          left and right bitwise shifts
<=, >=, <, >    comparison
==, !=          equality, inequality
&               bitwise AND
^               bitwise XOR
|               bitwise OR
&&              logical AND
||              logical OR
expr ? expr : expr
conditional operator
=, *=, /=, %=,
+=, -=, <<=, >>=,
&=, ^=, |=      assignment
Shell variables are allowed as operands.  The name of the variable
is replaced by its value (coerced to a fixed-width integer) within
an expression.  The variable need not have its integer attribute
turned on to be used in an expression.
Operators are evaluated in order of precedence.  Sub-expressions in
parentheses are evaluated first and may override the precedence
rules above.
If the last ARG evaluates to 0, let returns 1; 0 is returned
otherwise.

又有新的发现:
(( … )): (( expression ))
The EXPRESSION is evaluated according to the rules for arithmetic
evaluation.  Equivalent to “let EXPRESSION”.
$a=1
$(( a++ ))
$echo $a
2
2011-07-23
一个有意思的用法:
$ echo $((2#11111111))
255
二进制11111111的值(十进制)是多少?

yum终于有了yum-fastestmirror模块

相信不少人在使用yum install/update 的时候会不耐烦的按Ctrl+c。Debian有netselect-apt来帮助用户定位速度最快的mirror,现在yum也有这个功能了。
  
  升级你的yum,立刻!
  #yum -y update yum
PS: 然而貌似程序始终是程序,还不够完善。

查看系统当前处于连接状态(tcpCurrEstab)的连接数的方法

cat /proc/net/tcp |awk ‘{print $4}’ |grep -c 01
当然也可以:
netstat -nat |grep -c ESTABLISHED
或者:
netstat -s -t | grep connections\ established
经过time测试,netstat -s -t | grep connections\ established 这种方法是效率最高的。

BASH多进程并行处理的实现方法

#!/bin/bash
SEND_THREAD_NUM=13
tmp_fifofile=”/tmp/$$.fifo” # 脚本运行的当前进程ID号作为文件名
mkfifo “$tmp_fifofile” # 新建一个随机fifo管道文件
exec 6<>”$tmp_fifofile” # 定义文件描述符6指向这个fifo管道文件
rm $tmp_fifofile
for ((i=0;i<$SEND_THREAD_NUM;i++));do
echo # for循环 往 fifo管道文件中写入13个空行
done >&6
for i in `seq 100`;do # 100 次 for 循环 开始
read -u6 # 从文件描述符6中读取行(实际指向fifo管道)
{
echo $i # 打印 i
sleep 3 # 暂停3秒
echo >&6 # 再次往fifo管道文件中写入一个空行。
} &
# {} 这部分语句被放入后台作为一个子进程执行,所以不必每次等待3秒后执行
#下一个,这部分的echo $i几乎是同时完成的,当fifo中13个空行读完后 for循环
# 继续等待 read 中读取fifo数据,当后台的13个子进程等待3秒后,按次序
# 排队往fifo输入空行,这样fifo中又有了数据,for语句继续执行
pid=$! #打印最后一个进入后台的子进程id
echo $pid
done
wait
exec 6>&- #删除文件描述符6
exit 0

SHELL程序的不同执行方式

在当前shell环境运行:继承并影响当前环境。
. a.sh
source a.sh
实际上,”.”号与source的效果是一样的。
在当前shell运行时,需要注意,shell程序会影响、改变当前shell的环境。假如a.sh中有exit指令,那么用户将退出shell登录。
启动新的shell执行:只继承export输入的变量,并切不影响父进程的环境。exit指令只是退出新启动的shell。
bash a.sh
bash <a.sh
chmod+x a.sh
./a.sh
在( ) 中运行:executed in a subshell environment
也是在新的进程中运行。但是继承关系有点复杂,实验如下:
####START####
$su -
#chmod +x a.sh
#cat a.sh
echo $a
exit
#a=FreeBSD
#(./a.sh)
#(source a.sh)
FreeBSD
#(. a.sh)
FreeBSD
####END####
a.sh中的exit均没有影响到当前shell,但是却继承了当前shell的变量,但是改变a的操作却不能影响当前shell下a的值。
另外:
exec ./a.sh
关于exec:
exec: exec [-cl] [-a name] file [redirection ...]
Exec FILE, replacing this shell with the specified program.
If FILE is not specified, the redirections take effect in this
shell. If the first argument is `-l’, then place a dash in the
zeroth arg passed to FILE, as login does. If the `-c’ option
is supplied, FILE is executed with a null environment. The `-a’
option means to make set argv[0] of the executed process to NAME.
If the file cannot be executed and the shell is not interactive,
then the shell exits, unless the shell option `execfail’ is set.
man bash
Compound Commands
A compound command is one of the following:
(list) list  is  executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below).  Variable assignments and builtin commands that affect the shell’s environment do not remain in effect after the command completes.  The return status is the exit status  of list.
{ list; }
list  is simply executed in the current shell environment.  list must be terminated with a newline or semicolon.  This is known as a group command.  The return status is the exit status of list.  Note that unlike the metacharacters ( and ), { and } are reserved words and must occur where a reserved word is permitted to be recognized.  Since they do not cause a word break, they must be sep-arated from list by whitespace.
Command Substitution
Command substitution allows the output of a command to replace the command name.  There are two forms:
$(command)
or
‘command‘
Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing  newlines  deleted.  Embedded newlines are not deleted, but they may be removed during word splitting.  The command substitution $(cat file) can be replaced by the equivalent but faster $(< file).
When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, ‘, or \.  The first backquote not preceded by a backslash terminates the command substitution.  When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.
Command substitutions may be nested.  To nest when using the backquoted form, escape the inner backquotes with backslashes.
If the substitution appears within double quotes, word splitting and pathname expansion are not performed on the results.
COMMAND EXECUTION ENVIRONMENT
The shell has an execution environment, which consists of the following:
·      open files inherited by the shell at invocation, as modified by redirections supplied to the exec builtin
·      the current working directory as set by cd, pushd, or popd, or inherited by the shell at invocation
·      the file creation mode mask as set by umask or inherited from the shell’s parent
·      current traps set by trap
·      shell parameters that are set by variable assignment or with set or inherited from the shell’s parent in the environment
·      shell functions defined during execution or inherited from the shell’s parent in the environment
·      options enabled at invocation (either by default or with command-line arguments) or by set
·      options enabled by shopt
·      shell aliases defined with alias
·      various process IDs, including those of background jobs, the value of $$, and the value of $PPID
When a simple command other than a builtin or shell function is to be executed, it is invoked in a separate  execution  environment  that consists of the following.  Unless otherwise noted, the values are inherited from the shell.
·      the shell’s open files, plus any modifications and additions specified by redirections to the command
·      the current working directory
·      the file creation mode mask
·      shell variables and functions marked for export, along with variables exported for the command, passed in the environment
·      traps caught by the shell are reset to the values inherited from the shell’s parent, and traps ignored by the shell are ignored
A command invoked in this separate environment cannot affect the shell’s execution environment.
Command substitution, commands grouped with parentheses, and asynchronous commands are invoked in a subshell environment that is a duplicate of the shell environment, except that traps caught by the shell are reset to the values that the shell inherited from its parent  at invocation.   Builtin  commands  that are invoked as part of a pipeline are also executed in a subshell environment.  Changes made to the subshell environment cannot affect the shell’s execution environment.
If a command is followed by a & and job control is not active, the default standard input for the command is the  empty  file  /dev/null. Otherwise, the invoked command inherits the file descriptors of the calling shell as modified by redirections。

Hardware Monitoring Tools

Name : lm_sensors Relocations: (not relocatable)
Version : 2.10.0 Vendor: CentOS
Release : 3.1 Build Date: Sat 06 Jan 2007 01:39:45 PM CST
Install Date: Thu 22 May 2008 04:23:25 PM CST Build Host: builder1.centos.org
Group : Applications/System Source RPM: lm_sensors-2.10.0-3.1.src.rpm
Size : 1752222 License: GPL
Signature : DSA/SHA1, Wed 04 Apr 2007 08:24:48 AM CST, Key ID a8a447dce8562897
URL : http://secure.netroedge.com/~lm78/
Summary : Hardware monitoring tools.
Description :
The lm_sensors package includes a collection of modules for general SMBus
access and hardware monitoring. NOTE: this requires special support which
is not in standard 2.2-vintage kernels.
rpm -qc lm_sensors
/etc/rc.d/init.d/lm_sensors
/etc/sensors.conf
/etc/sysconfig/lm_sensors
rpm -ql lm_sensors | grep bin
/usr/bin/ddcmon
/usr/bin/decode-dimms.pl
/usr/bin/decode-edid.pl
/usr/bin/decode-vaio.pl
/usr/bin/decode-xeon.pl
/usr/bin/sensors
/usr/sbin/fancontrol
/usr/sbin/fancontrol.pl
/usr/sbin/i2cdetect
/usr/sbin/i2cdump
/usr/sbin/i2cget
/usr/sbin/i2cset
/usr/sbin/isadump
/usr/sbin/isaset
/usr/sbin/pwmconfig
/usr/sbin/sensors-detect

SYN Flood攻击的假象

当发现系统被SYN Flood攻击的时候,现象是系统上有大量的SYN_RECV状态的网络连接。
可是当系统成为一个“黑洞”的时候——就是数据包只能进不能出——当系统带宽被用完的时候,系统上也会出现大量的SYN_RECV状态的连接,而且此时,系统会积累很多SYN_RECV状的连接,现在跟受攻击一模一样……
1. 增大SYN最大半连接
net.ipv4.tcp_max_syn_backlog
2. 减小超时值
net.ipv4.tcp_synack_retries
3. 启用cookie
/proc/sys/net/ipv4/tcp_syncookes

RouterOS配置的备份与恢复

WinBox:
Files->Backup/Restore
终端:
system backup save/load name=ROS-conf-20080727.backup
export/import file=ROS-conf-20080727.conf

用pdnsd缓存DNS查询,解决DNS查询慢的问题

pdnsd是一款高效灵活的DNS proxy服务器,它既可以充当一个DNS forwarding的角色,也可作为一个DNS cache服务器,更可以作为一款简单的本地解释DNS服务器。优点如下:
(1)配置简单灵活,可定时自动检测upstream DNS server的健康;
(2)有CLI用于查看服务器的运行状况,并可在线更新服务器参数而无需重启服务器。
Github地址:https://github.com/udienz/pdnsd

pdnsd, written by Thomas Moestl, is a proxy DNS server with permanent caching (the cache contents are written to hard disk on exit) that is designed to cope with unreachable or down DNS servers (for example in dial-in networking).
The official pdnsd homepage by the original author can be found at http://home.t-online.de/home/Moestl/, but unfortunately pdnsd is no longer being maintained by him. As far as I know I am presently the only one actively working on the code, so if you want the latest features and fixes, this is the place to get them.
主页:http://www.phys.uu.nl/~rombouts/pdnsd.html
配置起来非常简单:
1. 将example配置文件复制一份
2. 将:
server {
label= “myisp”;
ip = 58.215.76.163
IP换成自己的ISP提供的DNS地址,多个用”,”隔开
3. 最重要的一步,许多DNS不接受”ping”测试,所以要将:
uptest=if/ping 改成
uptest=query
4.  将/etc/resolv.con里的nemeserver改成127.0.0.1
PS:
pdnsd.conf是可以控制pdnsd的返回结果的,就是说,可以通过配置pdnsd来达到自定义解析结果的日的。
另外,我们使用pdnsd的根本原因是因为ISP的DNS不稳定,解析慢。pdnsd可以直接从根服务器查询开始,更不必依赖于ISP的DNS。但是需要说明的是,使用了CDN服务的站点,可以会取到不精确的地址,而导致访问速度不佳.
---------------------------------

用pdnsd实现DNS解析加速


你是不是一直受到DNS服务器查询速度太慢的困扰?本文推荐Linux下一款名叫pdnsd的软件,解决这个问题。相比bind和 dnsmasq,pdnsd有一个优点:重启后仍然能记得之前缓存的条目。这对家庭用的计算机来说非常重要,因为不像服务器那样7×24小时开机,所以一 旦关机重开后还需要重新创建缓存的话,加速效果会非常有限。
一、安装
依然使用我最爱的Archlinux为例。pdnsd在community源里,直接安装即可:
pacman -S pdnsd
二、配置
pdnsd附带了一个配置文件示例,直接拷贝一份后,按自己的情况进行修改:
cp /etc/pdnsd.conf.sample /etc/pdnsd.conf
注意修改配置文件的时候别忘了加行末的分号,那是不可省略的。
其中有几项需要按如下修改以提高DNS查询效率:
neg_rrs_pol=on;
par_queries=1;

proxy_only=on;
purge_cache=off;

#可选,把A记录的ttl最小设为1天
#对一些ttl值低的大网站有用(低ttl用于负载均衡)
min_ttl=1d;
pdnsd默认的DNS服务器是OpenDNS(208.67.222.222/208.67.220.220),而据说用OpenDNS访问google有时候会出现反应慢的问题,所以建议直接换成google的DNS服务器:8.8.8.8和8.8.4.4。
接着,修改你的/etc/resolve.conf(或resolve.conf.head),将已有的nameserver信息清空,只留下面这一行:
nameserver 127.0.0.1
为防止resolve.conf被其他程序意外修改,可以加上sticky属性:
chattr +i /etc/resolve.conf
三、测试
启动pdnsd服务,然后测试一下可用性:
systemctl start pdnsd
nslookup www.google.com 127.0.0.1
如果正常返回,则说明pdns配置成功。现在可以将pdnsd设为开机启动项了:
systemctl enable pdnsd
至此,一个本机的DNS服务器搭建完成。
注意本文只解决了DNS查询速度问题,并不能解决DNS污染等问题。DNS污染可以通过专门的软件或将本地DNS配置成以TCP方式从远端DNS服务器取得查询结果,然后以UDP方式响应本机的查询请求的方式解决。pdnsd有一个专门的配置项目:
query_method=tcp_only;
-------------------------


pdnsd + opendns-dnscrypt 解决 DNS spoofing
描述:
    本机 192.168.0.65,局域网内有一台空闲 Linux 主机 192.168.0.223(Ubuntu 11.04)。现在希望在 192.168.0.223 上搭建一个靠谱的、可抗 DNS spoofing 的 DNS Server,作为本机 192.168.0.65 的 DNS 服务器。
下面是步骤。
一、安装 dnscrypt 并启动
首先下载 opendns-dnscrypt 的安装包并解压、安装:
    wget http://cloud.github.com/downloads/opendns/dnscrypt-proxy/dnscrypt-proxy-0.9.3.tar.gz
    tar zxvf dnscrypt-proxy-0.9.3.tar.gz
    cd dnscrypt-proxy-0.9.3
    ./configure && make –j2
    sudo make install
因为我们希望 192.168.0.223 作为 DNS Server 对外提供 DNS 服务,所以:(1)要安装 pdnsd(see 下一节);(2)要将 dnscrypt 开在别的端口(!= 53)上,以作为 pdnsd 的 server:
    sudo dnscrypt-proxy –local-port=50 –daemonize
请注意,local-port 和 daemonize 前是两个连接符(-)。
二、安装 pdnsd 并设置
    sudo apt-get install pdnsd
编辑其配置文件 /etc/pdnsd.conf,改动两个地方:
(1)设置 pdnsd 的 NS Server 为 dnscrypt:
(2)使得 pdnsd 可以为其他机器提供服务:
三、启动 pdnsd,测试
使得 pdnsd 作为 daemon 启动:
    sudo vim /etc/default/pdnsd
修改 START_DAEMON 的值为 yes。
启动 pdnsd:
    sudo /etc/init.d/pdnsd start
大功告成。将工作机的 DNS 设置为 192.168.0.223,并测试:
完工。 
------------------

用Pdnsd快速打造无污染高速缓存DNS服务器
前面讲Dnsmasq,我还打算下一篇写Dnsmasq for Ubuntu/DD-WRT来搭建家庭DNS缓存服务器呢,没想到这么快我就“变心”了Orz…其实从Dnsmasq转变到Pdnsd的原因很简单,一是Pdnsd原生支持TCP形式来访问DNS服务器,我就不需要在跑Tcp-DNS-proxy了;二是Pdnsd也能通过变通的方式来让特定的域名来走特定的DNS服务器;三是Pdnsd可以自定义TTL时间,也就是可以自己定义缓存保存的时间;四是不知道是我机器还是系统的问题,Dnsmasq在我的机器上跑起来老是各种抽风Orz…
Pdnsd在MacOS X上安装还是蛮简单的,只需要brew install pdnsd即刻自动安装了。brew这个命令是homebrew这个软件包的命令,至于homebrew以前已经讲过很多很多次了,这里就不在罗嗦了。
安装完成之后我们需要配置一下Pdnsd,它的配置文件默认是在/usr/local/etc/pdnsd.conf.sample(如果你是用homebrew安装的话),这是一个默认的配置文件模板,我建议拷贝一个或者新建一个配置文件,而不动这个默认的配置文件模板。因为如果将来有配置参数错误,或者配置文件写坏了,我们还可以有这个模板来参考或恢复。
你可以用cp pdnsd.conf.sample pdnsd.conf命令来从配置文件模板拷贝出来一个配置文件,然后在其中修改。但是由于这个模板文件里废话太多,可读性不好,我一般都是新建一个配置文件来写入自己所需要的功能配置,使用touch pdnsd.conf命令来创建一个空白的配置文件。
下面是我的pdnsd.conf配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
global {
        perm_cache=4096;
        cache_dir="/usr/local/var/cache/pdnsd";
        max_ttl=604800;
      query_method=tcp_only;
        paranoid=on;
        server_port=53;
        server_ip="127.0.0.1";
      min_ttl=1d;
      max_ttl=1w;     
}

server {
        label=GoogleDNS;
        ip=8.8.8.8, 8.8.4.4;
        timeout=30;
        interval=30;
        uptest=ping;
        ping_timeout=50;
      purge_cache=off;
}

你可以将它复制到你的配置文件中直接使用,其中只需要注意的是perm_cache这个参数代表了你要缓存多少DNS信息,min_ttl这个参数代表了缓存的DNS信息的最短有效期,max_tll这个参数定义了缓存的DNS信息最长的有效期,一般min_ttl的时间最好大于max_ttl,我定义的min_ttl1d,也就是1一天。
另外一个比较重要的参数是query_method,我写的参数是tcp_only,也就是强制只使用TCP方式去查询DNS服务器,这个参数一定要是TCP方式,否则还是会遭到DNS污染,一切都白费了。最后的server,就是你指定的DNS查询服务器,这里使用的是Google的DNS,当然你也可以用OpenDNS,只要你乐意。
另外Pdnsd还可以通过配置让指定的域名来走指定的DNS服务器来进行解析,比如用GoogleDNS来解析国外服务器很方便,但是解析国内服务器的话就会绕远路。所以我们要对Pdnsd进行配置,让它更加科学的来解析DNS,让我们访问国内的网站不至于太慢。
通过查看配置文件模板就可以很容易的看明白,Pdnsd是通过exclude的方式来排除域名的。比如在label=GoogleDNS参数下面新建一行exclude=.cn,.youku.com;,这样Pdnsd就会在GoogleDNS设置里排除末尾带.cn的域名和youku.com域名。在你解析它们的时候,Pdnsd会交给下面的域名服务器组来解析,我用以下配置文件来示例一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
        label=GoogleDNS;
        ip=8.8.8.8, 8.8.4.4;
        timeout=30;
        interval=30;
        uptest=ping;
        ping_timeout=50;
      purge_cache=off;
      exclude=.cn,
      .youku.com,
      .taobao.com;
}

server {
  label=ChinaDNS
  ip=202.102.152.3, 202.102.154.3;
}

Pdnsd来读配置文件的机制是上面的配置的优先级总是高于下面的配置的优先级,也就是说写在最上面的DNS解析服务器配置模块的优先级要高于写在下面的,是一个层级结构。而上面的配置文件在最上面的解析服务器模块里定义了排除.cn后缀和youku.com,taobao.com,这个几个域名。这样Pdnsd就不会使用GoogleDNS这个解析配置模块来解析.cn后缀和youku.com,taobao.com域名,而转交给下一个域名解析模块来解析,也就是转交给ChinaDNS来解析。
如此我们就可以将经常访问的国内网站写入GoogleDNS模块里的exclude参数后面来进行排除,然后在用国内的DNS服务器来解析,来优化网络。我用这种方式是因为我上的国内网站屈指可数,没有几个,而如果你上国内网站很多,上国外网站就几个的话你也可以反过来写,以免花太多的精力来写这个配置文件,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
      label=ChinaDNS
      ip=202.102.152.3, 202.102.154.3;
      exclude=.twitter.com,
      .youtube.com,
      .google.com,
      .facebook.com;
  }
  
server {
  label=GoogleDNS
  ip=8.8.8.8, 8.8.4.4;
}

这样就会把上面写的这些不存在的网站(你懂的)的域名排除,不用国内的DNS来解析,而转交给GoogleDNS来解析了。
最后我们还需要给Pdnsd的缓存文件夹赋予一下权限,也就是上面配置文件里写的/usr/local/var/cache/pdnsd目录,当然你也可以根据你的喜好来指定其他目录。我比较懒,直接用root权限来运行Pdnsd,所以我chown root:admin /usr/local/var/cache/pdnsd,如果你用别的账户,请自行授权,或者777也行。
以上配置都完成之后,你就可以启动Pdnsd来进行测试了,用命令sudo pdnsd来启动它,然后将你的系统的DNS服务器修改为127.0.0.1,也就是本机。现在你就可以上网进行测试了,如果测试都没问题,都是按照你所想的规则来进行解析的话,下面我就需要开始新建一个启动文件,来让MacOS X开机自己自启动Pdnsd。
touch /Library/LaunchDaemons/pdnsd.plist
然后写入以下:

pdnsd.plist 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
      <key>Label</key>
      <string>pdnsd</string>
      <key>Program</key>
      <string>/usr/local/sbin/pdnsd</string>
      <key>RunAtLoad</key>
      <true/>
      <key>ServiceDescription</key>
      <string>pdnsd dns caching daemon</string>
  </dict>
</plist>

其中唯一需要注意的就是/usr/local/sbin/pdnsd,这是Pdnsd可执行程序存在的目录,如果你也跟我一样是通过homebrew安装的,那就不需要修改了,否则你可以通过which pdnsd命令来查看Pdnsd可执行程序的目录。
现在你就可以重启计算机了,如果一切正常Pdnsd就会在开机时自动启动了,你可以通过sudo ps aux | grep dns名来来看Pdnsd是否已经启动。
PS之前的pdnsd.conf设置有一些配置问题,可能会造成抽风,以下是又经过修改的版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
global {
        perm_cache=4096;
        cache_dir="/usr/local/var/cache/pdnsd";
        status_ctl = on;
      query_method=tcp_only;
        server_port=53;
        server_ip="127.0.0.1";
      min_ttl=1d;
      max_ttl=2d;   
      timeout=10;  
      neg_domain_pol=on;
#       paranoid=on; 
}

server {
        label=GoogleDNS;
        ip=8.8.8.8, 8.8.4.4;
        timeout=4;
        interval=10m;
        uptest=ping;
        ping_timeout=50;
      purge_cache=off;
  }
  
source {
  owner=localhost;
  file="/etc/hosts";
}
 
 
rr {
  name=localhost;
  reverse=on;
  a=127.0.0.1;
  owner=localhost;
  soa=localhost,root.localhost,42,86400,900,86400,86400;}
related post: