<?xml-stylesheet type="text/xsl" href="/Include/FeedStylesheets/Atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN"><title type="html">(^_^)原生小豆(*_*)</title><subtitle type="html">记住该记住的，忘记该忘记的。改变能改变的，接受不能改变的。怨言是上天得至人类最大的供物，也是人类祷告中最真诚的部分。</subtitle><id>http://space.kakadoor.com/1923/Atom.aspx</id><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/default.aspx" /><link rel="self" type="application/atom+xml" href="http://space.kakadoor.com/1923/Atom.aspx" /><generator uri="http://bfor.cn" version=" I-Favourite 2.1.1.0">I-Favourite</generator><updated>2007-09-27T22:42:18Z</updated><entry><title>Linux网络基本网络配置方法介绍</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2291.aspx" /><id>http://space.kakadoor.com/1923/archive/2291.aspx</id><published>2007-09-27T15:50:45Z</published><updated>2007-09-27T15:50:45Z</updated><content type="html">网络信息查看&lt;br /&gt;
&lt;br /&gt;
　　查看网路接口信息&lt;br /&gt;
&lt;br /&gt;
　　1．了解linux中的网络接口设备&lt;br /&gt;
&lt;br /&gt;
　　$/sbin/ifconfig 查看所有活动网络接口信息，其中包括一个lo环回端口。&lt;br /&gt;
&lt;br /&gt;
　　2．查看指定网络接口的信息&lt;br /&gt;
&lt;br /&gt;
　　$/sbin/ifconfig &amp;lt;网络接口名称&amp;gt; 查看指定接口信息。&lt;br /&gt;
&lt;br /&gt;
　　3．查看系统中所有网络接口的信息&lt;br /&gt;
&lt;br /&gt;
　　$/sbin/ifconfig &amp;ndash;a 查看所有接口信息，包括非活动状态接口。&lt;br /&gt;
&lt;br /&gt;
　　注：普通用户查看网络接口信息时，需要在命令前加&amp;ldquo;/sbin&amp;rdquo;，而管理员却不用。这是由于命令搜索路径的原因，可以通过&amp;ldquo;$echo $PATH&amp;rdquo;查看。&lt;br /&gt;
&lt;br /&gt;
　　查看网关地址和路由信息&lt;br /&gt;
&lt;br /&gt;
　　1、查看主机路由信息&lt;br /&gt;
&lt;br /&gt;
　　#/route&lt;br /&gt;
&lt;br /&gt;
　　显示当前linux主机中的路由表信息。&lt;br /&gt;
&lt;br /&gt;
　　#/route ｜grep default&lt;br /&gt;
&lt;br /&gt;
　　在route命令的显示结果中以&amp;ldquo;default&amp;rdquo;开始的行显示了，主机的默认网关地址，将route命令和grep命令组合，使用过滤route命令的显示结果只显示默认网关地址。&lt;br /&gt;
&lt;br /&gt;
　　2.测试与其它主机的网络链接&lt;br /&gt;
&lt;br /&gt;
　　$ping 目的主机地址&lt;br /&gt;
&lt;br /&gt;
　　使用ping命令测试与其它主机的网络链接。ctrl+C终止。&lt;br /&gt;
&lt;br /&gt;
　　$ping &amp;ndash;c &amp;lt;测试数据包数量&amp;gt; &amp;lt;目的主机地址&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　使用ping命令发送指定数量的数据包进行网络链接测试。&lt;br /&gt;
&lt;br /&gt;
　　$使用ping命令进行网络链接测试的技巧。&lt;br /&gt;
&lt;br /&gt;
　　注：当ping命令测试不成功时并不能判断当前主机到目标主机的连接是断开的，因为有很多因素，（如网络防火墙等）可以导致网络连接正常时主机之间无法ping通。&lt;br /&gt;
&lt;br /&gt;
　　3、测试与其它主机的网络链接路径&lt;br /&gt;
&lt;br /&gt;
　　$traceroute &amp;lt;目的主机地址&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　traceroute命令显示当前主机与目的主机之间经过的所，有网络节点的地址，以及当前主机到每个中间结点的连接状态。&lt;br /&gt;
&lt;br /&gt;
　　查看主机名称信息&lt;br /&gt;
&lt;br /&gt;
　　1、查看当前主机名称&lt;br /&gt;
&lt;br /&gt;
　　$Hostname 查看当前的主机名。&lt;br /&gt;
&lt;br /&gt;
　　2、使用dns服务器查询域名&lt;br /&gt;
&lt;br /&gt;
　　$Nslookup&lt;br /&gt;
&lt;br /&gt;
　　交互模式：通常用于对DNS服务器进行测试&lt;br /&gt;
&lt;br /&gt;
　　直接模式：用于查询某个域名对应的ip地址&lt;br /&gt;
&lt;br /&gt;
　　使用网络命令进行网络设置&lt;br /&gt;
&lt;br /&gt;
　　网络设置的方法&lt;br /&gt;
&lt;br /&gt;
　　1、DHCP网络配置&lt;br /&gt;
&lt;br /&gt;
　　$Dhclient 使用dhclient命令可以从DHCP服务器中申请新的网络配置应用到当前主机。&lt;br /&gt;
&lt;br /&gt;
　　注：DHCP服务器通常提供给DHCP客户端最基本的网络配置信息，包括：接口ip地址，默认网关，DNS&lt;br /&gt;
&lt;br /&gt;
　　服务器地址。&lt;br /&gt;
&lt;br /&gt;
　　2、手工网络配置&lt;br /&gt;
&lt;br /&gt;
　　网络接口ip地址和子网掩码&lt;br /&gt;
&lt;br /&gt;
　　默认网关地址&lt;br /&gt;
&lt;br /&gt;
　　当前主机名称&lt;br /&gt;
&lt;br /&gt;
　　DNS服务器地址&lt;br /&gt;
&lt;br /&gt;
　　Ip地址配置命令&lt;br /&gt;
&lt;br /&gt;
　　Ifconfig &amp;lt;网络接口名称&amp;gt; network &amp;lt;子网掩码&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　例：# ifconfig eth0 192.168.1.222 netmask 255.255.255.0&lt;br /&gt;
&lt;br /&gt;
　　注：手工配置linux网络只限于临时使用，配置不保存。&lt;br /&gt;
&lt;br /&gt;
　　扩展：# ifconfig eth0:1 10.0.0.1 netmask 255.0.0.0 一块网卡配置多个子ip地址。&lt;br /&gt;
&lt;br /&gt;
　　# ifconfig eth0 hw ether MAC地址 修改网卡的mac地址，&lt;br /&gt;
　　路由配置命令&lt;br /&gt;
&lt;br /&gt;
　　1、删除默认网关路由&lt;br /&gt;
&lt;br /&gt;
　　$Route del default gw &amp;lt;默认网关地址&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　2、添加默认网关路由&lt;br /&gt;
&lt;br /&gt;
　　$Route add default gw &amp;lt;默认网关地址&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　例：#route add default gw 192.168.1.1&lt;br /&gt;
&lt;br /&gt;
　　主机名称配置命令&lt;br /&gt;
&lt;br /&gt;
　　# hostname 123&lt;br /&gt;
&lt;br /&gt;
　　将主机暂时名称改为123。&lt;br /&gt;
&lt;br /&gt;
　　DNS域名解析&lt;br /&gt;
&lt;br /&gt;
　　Nslookup&lt;br /&gt;
&lt;br /&gt;
　　&amp;gt;server&lt;br /&gt;
&lt;br /&gt;
　　显示linux系统中使用的DNS服务器地址，也可临时设置生效。&lt;br /&gt;
&lt;br /&gt;
　　修改配置文件进行网络设置&lt;br /&gt;
&lt;br /&gt;
　　使用工具进行网络设置&lt;br /&gt;
&lt;br /&gt;
　　# Netconfig 图形界面设置网络，重启network后生效。&lt;br /&gt;
&lt;br /&gt;
　　界面中需要填写的内容：&lt;br /&gt;
&lt;br /&gt;
　　主机网络接口的ip地址。&lt;br /&gt;
&lt;br /&gt;
　　网络接口的子网掩码。&lt;br /&gt;
&lt;br /&gt;
　　默认网关地址。&lt;br /&gt;
&lt;br /&gt;
　　主DNS服务器的ip地址。&lt;br /&gt;
&lt;br /&gt;
　　网络服务启动脚本&lt;br /&gt;
&lt;br /&gt;
　　/etc/init.d/network 从新启动才能生效&lt;br /&gt;
&lt;br /&gt;
　　扩展：# /etc/rc.d/init.d/network start 启动network&lt;br /&gt;
&lt;br /&gt;
　　# /etc/rc.d/init.d/network stop 停止network&lt;br /&gt;
&lt;br /&gt;
　　# /etc/rc.d/init.d/network restart 重启network&lt;br /&gt;
&lt;br /&gt;
　　网络接口配置文件&lt;br /&gt;
&lt;br /&gt;
　　/etc/sysconfig/network-scripts/ifconfg-*&lt;br /&gt;
&lt;br /&gt;
　　DEVICE=eth0 网卡编号&lt;br /&gt;
&lt;br /&gt;
　　ONBOOT=yes 开机时是否启动网卡。&lt;br /&gt;
&lt;br /&gt;
　　BOOTPROTO=static 静态ip或者DHCP动态获取。&lt;br /&gt;
&lt;br /&gt;
　　IPADDR=192.168.1.163 ip&lt;br /&gt;
&lt;br /&gt;
　　NETMASK=255.255.255.0 掩码&lt;br /&gt;
&lt;br /&gt;
　　GATEWAY=192.168.1.1 网关&lt;br /&gt;
&lt;br /&gt;
　　以下为动态获取方式：&lt;br /&gt;
&lt;br /&gt;
　　DEVICE=eth0&lt;br /&gt;
&lt;br /&gt;
　　ONBOOT=yes&lt;br /&gt;
&lt;br /&gt;
　　BOOTPROTO=dhcp&lt;br /&gt;
&lt;br /&gt;
　　停止和启动指定的网络接口&lt;br /&gt;
&lt;br /&gt;
　　单个网络接口的配置进行修改后&lt;br /&gt;
&lt;br /&gt;
　　Ifdown 网络接口名称 停止某个网络接口。&lt;br /&gt;
&lt;br /&gt;
　　Ifup 网络接口名称 开启某个网络接口。&lt;br /&gt;
&lt;br /&gt;
　　注：单个网络接口的配置文件进行修改后，不必每次都从新启动network服务使配置文件生效，可用以上命令。&lt;br /&gt;
&lt;br /&gt;
　　扩展：对网络接口操作：&lt;br /&gt;
&lt;br /&gt;
　　# ifconfig eth0 down 停止eth0接口&lt;br /&gt;
&lt;br /&gt;
　　# ifconfig eth0 up 开启eth0接口&lt;br /&gt;
&lt;br /&gt;
　　可以连续使用&lt;br /&gt;
&lt;br /&gt;
　　Ifdown eth0 ; ifup eth0&lt;br /&gt;
&lt;br /&gt;
　　主机名称配置文件&lt;br /&gt;
&lt;br /&gt;
　　/etc/sysconfig/network&lt;br /&gt;
&lt;br /&gt;
　　例：# vi /etc/sysconfig/network 使用vi编辑器打开主机名配置文件。&lt;br /&gt;
&lt;br /&gt;
　　NETWORKING=yes 网络是否可用。&lt;br /&gt;
&lt;br /&gt;
　　HOSTNAME=xxxx xxxx为新设置的主机名。&lt;br /&gt;
&lt;br /&gt;
　　本地主机名称解析文件&lt;br /&gt;
&lt;br /&gt;
　　/etc/hosts&lt;br /&gt;
&lt;br /&gt;
　　Hosts 和 DNS具有类似的主机名称解析功能&lt;br /&gt;
&lt;br /&gt;
　　域名服务器配置文件&lt;br /&gt;
&lt;br /&gt;
　　/etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
　　最多可以设置3行，前面的生效。&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Linux系统的内存管理技巧总结</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2290.aspx" /><id>http://space.kakadoor.com/1923/archive/2290.aspx</id><published>2007-09-27T15:49:55Z</published><updated>2007-09-27T15:49:55Z</updated><content type="html">1 mem_map[PAGING_PAGES]数组为什么不直接从主存储区开始记录，而从1M开始记录，然后又把1M到主存储区之间的内容置为100&lt;br /&gt;
&lt;br /&gt;
　　2 mem_map&lt;em&gt;在那些时候会大于1：同一物理页面被n个（n&amp;gt;1）线性地址共享，如copy_page_table()会影响这里的值&lt;br /&gt;
&lt;br /&gt;
　　3 哪些地方需要执行刷新页变换缓冲(invalidate()函数实现）：&lt;br /&gt;
&lt;br /&gt;
　　3.1 free_page_tables()&lt;br /&gt;
&lt;br /&gt;
　　3.2 copy_page_tables()&lt;br /&gt;
&lt;br /&gt;
　　3.3 un_wp_page()&lt;br /&gt;
&lt;br /&gt;
　　3.4 try_to_share()&lt;br /&gt;
&lt;br /&gt;
　　改变页目录项活页表项&lt;br /&gt;
&lt;br /&gt;
　　4 写时复制的相关函数&lt;br /&gt;
&lt;br /&gt;
　　4.1 copy_page_tables():负责把原始和新的页目录项和页表项都设置为只读&lt;br /&gt;
&lt;br /&gt;
　　4.2 do_wp_page():页写保护处理函数&lt;br /&gt;
&lt;br /&gt;
　　4.3 un_wp_page()：判断页面是否被共享，若没有共享，则把页面设置为可写，然后退出，若共享，则需要重新申请一新页面并复制被写页面的内容，以供写进程单独使用共享被取消&lt;br /&gt;
&lt;br /&gt;
　　5 COPY_SPACE(addr)不理解&lt;br /&gt;
&lt;br /&gt;
　　6 在free_page_table()函数中，若addr（物理地址）所在的页面由n个（n&amp;gt;＝2）线性地址共享（copy_page_table函数可以让一个物理页面被多个线性地址共享），那么在释放addr所在页面时，执行mem_map[addr]&amp;mdash;&amp;mdash;(mm/memory.c Line 96)语句后，并不能让mem_map[addr]的值变为0，而是变为n-1，这并不代表该物理页面已被释放，是不是应该改为mem_map [addr] = 0（mm/memory.c Line 96）呢？还是我那里想错了。&lt;br /&gt;
&lt;br /&gt;
　　7 取线性地址addr所对应页目录项的物理地址&lt;br /&gt;
&lt;br /&gt;
　　dir = (unsigned long*)((addr&amp;gt;&amp;gt;20)&amp;amp;0xffc)&lt;br /&gt;
&lt;br /&gt;
　　说明：首先，addr&amp;gt;&amp;gt;22得出对应页目录项在页目录表中的项号，即表内偏移，因为页目录表的起始地址为物理地址0，而每项大小为4byte，所以，实际物理地址为addr&amp;gt;&amp;gt;20，又因为只右移了20位，最后两位是页表项的内容，所以和0xffc相与把最后两位屏蔽掉，得出最终结果&lt;br /&gt;
&lt;br /&gt;
　　8 取线性地址addr所对应页表项的物理地址&lt;br /&gt;
&lt;br /&gt;
　　table = ((unsigned long*)(((address &amp;gt;&amp;gt; 0) &amp;amp; oxffc) + (0xfffff000 &amp;amp; *((unsigned long*)((address&amp;gt;&amp;gt;20 &amp;amp; 0xffc)))))&lt;br /&gt;
&lt;br /&gt;
　　即，偏移＋基址，参考7&lt;br /&gt;
&lt;/em&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Linux下如何使用OpenSSH配置端口转发</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2289.aspx" /><id>http://space.kakadoor.com/1923/archive/2289.aspx</id><published>2007-09-27T15:49:14Z</published><updated>2007-09-27T15:49:14Z</updated><content type="html">从自己的电脑上访问公司的 CVS 服务器需要利用 SSH 客户端的端口转发功能。以前在 Windows 上，一般是使用 SecureCRT 作为 SSH 客户端。之后将工作平台迁移到 Ubuntu Linux 之下，却一时没有找到直接使用 OpenSSH 配置端口转发的方法。只知道利用 PuTTY 的 Tunnel 来完成这样工作，但是多开着一个应用程序却只做端口转发这一件事情，多少觉得有些别扭。&lt;br /&gt;
&lt;br /&gt;
　　昨日机缘巧合，无意中检索到了一些关于 OpenSSH 配置端口转发的文章。以下面的例子说明如何配置 OpenSSH 的端口转发功能，所需要修改的配置文件为 ~/.ssh/config。&lt;br /&gt;
&lt;br /&gt;
　　Host testsrv Hostname 123.45.67.89 User cvs_user LocalForward 2401 123.45.67.90:2401&lt;br /&gt;
&lt;br /&gt;
　　其中 Host 后面的是主机的名称，指定这个名称后，就可以使用这个名称代替该主机的 IP 使用，例如:&lt;br /&gt;
&lt;br /&gt;
　　ssh testsrv&lt;br /&gt;
&lt;br /&gt;
　　即等同于&lt;br /&gt;
&lt;br /&gt;
　　ssh 123.45.67.89&lt;br /&gt;
&lt;br /&gt;
　　之后的 User 即指定连接主机使用的用户名。&lt;br /&gt;
&lt;br /&gt;
　　LocalForward 也就是用来配置端口转发功能的。2401 表示本地的端口号，后边的 123.45.67.90:2401 是 CVS 服务器的 IP 地址和服务端口（也就是转发的目标主机和端口）。在这里 LocalForward 表示是使用本地端口进行转发，如果要使用远程端口进行转发的话，则是使用 RemoteForward 参数。配置完毕，连接主机 testsrv 成功之后，即建立了一个安全的 SSL 加密通道。&lt;br /&gt;
&lt;br /&gt;
　　需要注意的是，有些文章里面把最后一行的&lt;br /&gt;
&lt;br /&gt;
　　(1) 2401 123.45.67.90:2401&lt;br /&gt;
&lt;br /&gt;
　　写成了&lt;br /&gt;
&lt;br /&gt;
　　(2) 2401:123.45.67.90:2401&lt;br /&gt;
&lt;br /&gt;
　　这样子是会出错的，(2) 中所示的格式，是在终端中直接用 ssh 配置端口转发参数所使用的格式。例如&lt;br /&gt;
&lt;br /&gt;
　　ssh -L 2401:123.45.67.90:2401 cvs_user@123.45.67.89&lt;br /&gt;
&lt;br /&gt;
　　也等同于在配置文件中所配置的内容。&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Linux系统操作常用快捷键</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2288.aspx" /><id>http://space.kakadoor.com/1923/archive/2288.aspx</id><published>2007-09-27T14:56:05Z</published><updated>2007-09-27T14:56:05Z</updated><content type="html">1.使用虚拟控制台&lt;br /&gt;
　　登录后按&amp;ldquo;Alt＋F2&amp;rdquo;键可以看到&amp;ldquo;login:&amp;rdquo;提示符, 这就是第二个虚拟控制台。 一般新安装的Linux有四个虚拟控制台, 可以用&amp;ldquo;Alt＋F1&amp;rdquo;到&amp;ldquo;Alt＋F4&amp;rdquo;来访问。虚拟控制台最有用的时候是当一个程序出错锁住输入时可以切换到其他虚拟控制台，登录进入后用kill命令杀掉这个出错的进程。&lt;br /&gt;
&lt;br /&gt;
　　2.拷贝与粘贴&lt;br /&gt;
　　字符界面（不管是Slackware 还是RedHat 的）安装后，每次启动时都会自动运行一个叫gpm的程序, 该程序运行后就可以用鼠标来拷贝与粘贴了。具体做法是按住鼠标左键拖动使要拷贝的文字反白, 这时反白的区域已经被拷贝, 再按鼠标右键拷贝的内容就会被粘贴在光标所在位置了。&lt;br /&gt;
　　在X－Window下，拷贝操作与字符界面下一样, 如果你用的是三键鼠标，按中键进行粘贴, 如果是两键鼠标，则可同时按左右键粘贴(条件是必须在配置XF86时在鼠标的设置里选择 Emulate 3 Button)。&lt;br /&gt;
&lt;br /&gt;
　　3.快速进入某些目录&lt;br /&gt;
　　键入cd～可进入用户的home目录。键入cd－可进入上一个进入的目录。&lt;br /&gt;
&lt;br /&gt;
　　4.在RedHat下显示彩色目录列表&lt;br /&gt;
　　打开/etc/bashrc, 加入如下一行:&lt;br /&gt;
　　alias ls=&amp;Prime;ls －－color&amp;Prime;&lt;br /&gt;
　　下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中不同颜色的含义如下:&lt;br /&gt;
　　蓝色&amp;rarr;目录&lt;br /&gt;
　　绿色&amp;rarr;可执行文件&lt;br /&gt;
　　红色&amp;rarr;压缩文件&lt;br /&gt;
　　浅蓝色&amp;rarr;链接文件&lt;br /&gt;
　　灰色&amp;rarr;其他文件&lt;br /&gt;
&lt;br /&gt;
　　5.命令文件的路径&lt;br /&gt;
　　当你键入一些命令（如find、shutdown、mount、startx）时是否想知道这些文件究竟放在哪个目录里?用命令&amp;ldquo;whereis&amp;rdquo;可以实现,如：&lt;br /&gt;
　　＃whereis startx&lt;br /&gt;
&lt;br /&gt;
　　6.查找文件&lt;br /&gt;
　　find 命令要加一些参数才能查到文件,如:&lt;br /&gt;
　　＃find /usr －name XF86Setup －print&lt;br /&gt;
　　在/usr里查找文件XF86Setup。&lt;br /&gt;
&lt;br /&gt;
　　7.删除无用的core文件&lt;br /&gt;
　　程序运行完后，有时候会产生一个名为core的文件, 这个文件一般很大而且没什么用, 可以删除掉以释放空间。&lt;br /&gt;
&lt;br /&gt;
　　8.Linux里的Norton Commander&lt;br /&gt;
　　在提示符下键入命令mc后你就会看到一个与Norton Commander很相似的界面, 实际上功能也很相似甚至更强大, 比如可以直接对.tar.gz 压缩包里的文件进行操作(有点像ZipMagic)。&lt;br /&gt;
&lt;br /&gt;
　　9.后台运行 X－Window程序&lt;br /&gt;
　　执行一个X－Window程序时别忘了在后面加一个＆号（如＃netscape ＆），否则，在你退出执行的程序之前再无法在那个终端窗口里输入命令了。&lt;br /&gt;
&lt;br /&gt;
　　10.强行退出 X－Window&lt;br /&gt;
　　有时候在 X－Window里由于程序出错，使鼠标键盘都不起作用, 这时候不用着急, 因为在Linux下几乎不会像在Win 9x里那样恶性死机, 你只须键入Ctrl＋Alt＋BackSpace键就可以回到字符界面下了。&lt;br /&gt;
&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>linux下多用户的建立</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2287.aspx" /><id>http://space.kakadoor.com/1923/archive/2287.aspx</id><published>2007-09-27T14:55:26Z</published><updated>2007-09-27T14:55:26Z</updated><content type="html">&lt;div class="tpc_content"&gt;@!/bin/sh（定义使用sh shell）&lt;br /&gt;
groupadd users（建立用户组）&lt;br /&gt;
@T_class code（定义第一个参数为总组代码，赋予变量&amp;ldquo;T_class&amp;rdquo;）&lt;br /&gt;
&amp;nbsp; T_class=$1&lt;br /&gt;
@class code（定义第二个参数为分组代码，赋予变量&amp;ldquo;num_class&amp;rdquo;）&lt;br /&gt;
&amp;nbsp; num_class=`expr $2 + 0`&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; if (test $num_class -le 9)（以下代码是为了保证分组代码的位数为两位）&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; num_class=&amp;quot;0&amp;quot;$num_class&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; fi&lt;br /&gt;
@max user id（定义第三个参数为该分组用户的最大ID号，赋予变量&amp;ldquo;max_stid&amp;rdquo;）&lt;br /&gt;
&amp;nbsp; max_stid=`expr $3 + 0`&lt;br /&gt;
@init user id（该分组用户ID号从1开始）&lt;br /&gt;
&amp;nbsp; num_userid =1&lt;br /&gt;
@mkdir user home（在&amp;ldquo;/home&amp;rdquo;目录为所有用/总组户建立名为&amp;quot;fst&amp;quot;的公共目录）&lt;br /&gt;
&amp;nbsp; if [ ! -x /home/fst ]&lt;br /&gt;
&amp;nbsp; then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; mkdir /home/fst&lt;br /&gt;
&amp;nbsp; fi&lt;br /&gt;
&amp;nbsp; if [ ! -x /home/fst/$1$num_class ] （在总组公共目录下为每个分组建立以该分组代码命名的目录）&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; mkdir /home/fst/$1$num_class&lt;br /&gt;
&amp;nbsp; fi&lt;br /&gt;
&amp;nbsp; while (test $num_userid -le $max_stid)（从用户ID号1开始循环，直到最大ID号）&lt;br /&gt;
&amp;nbsp; do&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; if (test $num_userid -le 9) （以下保证用户代码的位数为两位）&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; then&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; num_userid=&amp;quot;0&amp;quot;$num_userid&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; fi&lt;br /&gt;
user_name=$T_class$num_class$num_userid（把总组、分组、用户ID号三部分代码组合成用户名，并赋予变量user_name）&lt;br /&gt;
@save user passwd to file user_pwlist（按&amp;ldquo;name:passwd&amp;rdquo;的格式逐行追加写入&amp;ldquo;user_pwlist&amp;rdquo;文件，以备初始化用户密码）&lt;br /&gt;
&amp;nbsp; echo $user_name&amp;quot;:&amp;quot;$user_name &amp;gt;&amp;gt; user_pwlist&lt;br /&gt;
@add user（建立该用户，同时赋予&amp;ldquo;users&amp;rdquo;组，创建该用户目录）&lt;br /&gt;
&amp;nbsp; adduser -g users -d /home/fst/$1$num_class/$user_name $user_name&lt;br /&gt;
@set quota（为该用户设置配额，限制最大容量为20MB，没有文件数限制）&lt;br /&gt;
&amp;nbsp; setquota -u $user_name 10240 20480 0 0 /home&lt;br /&gt;
@set directory mode（设置该用户目录的权限为755）&lt;br /&gt;
&amp;nbsp; chmod 755 /home/fst/$1$num_class/$user_name&lt;br /&gt;
@current user id add one(用户ID号加1，准备下一次循环，建立下一个用户)&lt;br /&gt;
num_userid=`expr $num_userid + 1`&lt;br /&gt;
done&lt;br /&gt;
chpasswd &amp;lt; user_pwlist（以下两行为刚才建立的所有用户设置密码）&lt;br /&gt;
pwconv&lt;br /&gt;
rm user_pwlist -f（删除&amp;ldquo;user_pwlist&amp;rdquo;文件）&lt;/div&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>LINUX操作系统的概念和特点</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2286.aspx" /><id>http://space.kakadoor.com/1923/archive/2286.aspx</id><published>2007-09-27T14:54:54Z</published><updated>2007-09-27T14:54:54Z</updated><content type="html">&lt;div class="tpc_content"&gt;嵌入式LINUX操作系统的概念&lt;br /&gt;
&lt;br /&gt;
　　以应用为中心，以计算机技术为基础，软件、硬件可裁剪，适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统，称为嵌入式系统。一个最小的嵌入式系统的基本组成为：① 一个用作引导的可用设施（工具）；② 一个具备内存管理，进程管理和定时器服务的LINUX微内核；③ 一个初始进程；④ 硬件的驱动程序；⑤ 一个或几个应用进程以提供必要的应用功效。&lt;br /&gt;
&lt;br /&gt;
嵌入式LINUX操作系统的特点&lt;br /&gt;
&lt;br /&gt;
　　比较&lt;br /&gt;
　　有人认为LINUX由于太大而不宜用作嵌入式系统，这种观点不正确。面向PC机的LINUX型发布版有很多，功能根本用不上，甚至超出了一个PC用户的需求。因此，对LINUX进行合理的裁减，可以形成一个很具有实用性的嵌入式操作系统。下面对嵌入式LINUX操作系统与专用嵌入式实时操作系统的比较如下。&lt;br /&gt;
&lt;br /&gt;
　　嵌入式LINUX的内存使用&lt;br /&gt;
　　在一个简单的系统中，当系统启动后，内核和各种应用进程均驻留在内存中，这是大多数传统嵌入式系统的工作方式，当然也包括LINUX。但它还可以使用另外一种方式：LINUX有装载和卸载程序的能力，所有应用程序以文件的形式被存放在闪存文件系统中并在必要的时候被装载到内存中，以节省RAM。&lt;br /&gt;
&lt;br /&gt;
　　开发嵌入式LINUX的调试方法&lt;br /&gt;
　　当为一个新硬件开发相应的嵌入式LINUX系统时，要用到的典型调试工具的序列和步骤是：&lt;br /&gt;
&lt;br /&gt;
　　①&amp;nbsp; 修改代码使之能读写串口，并使用gdb运行该程序。这将允许它向另一台正运行着gdb程序的LINUX主机通信；gdb通过串口与测试计算机上的gdb目标码会话并给出全部C源码级的调试信息；&lt;br /&gt;
　　②&amp;nbsp; 借助gdb执行余下的，直到LINUX内核开始接管之前的所有硬件和软件的初始化代码；&lt;br /&gt;
　　③&amp;nbsp; 一旦LINUX内核启动后，上述的串口就成为LINUX的控制台端口，可以利用它的便利来进行后继开发过程，并可以使用gdb的内核调试版本kgdb。&lt;br /&gt;
&lt;br /&gt;
　　嵌入式LINUX的可移植性&lt;br /&gt;
　　将LINUX移植到新的微处理器体系非常快捷，一般是将其移植到一种新型的目标板，其中包含有独特的外设。大部分的内核代码都是相同的，因为它们与微处理器无关，所以，移植的工作多集中在一些存储器管理及中断处理程序上。一旦完成，它们将非常稳定。&lt;br /&gt;
&lt;br /&gt;
嵌入式LINUX的应用&lt;br /&gt;
&lt;br /&gt;
　　嵌入式系统的涵盖面是非常广泛的，其中，家电市场包括机顶盒、数字电视、可视电话、家庭网络等信息家电；工业市场包括工业控制设备、仪器；商用市场包括掌上电脑、瘦客户机、POS终端等；通信市场包括WAP手机、无线PDA等。目前被广泛看好的是信息家电市场，国内有很多开发厂商正加大投入、开发和研制新的产品，嵌入式LINUX将是他们首选的操作系统。&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>轻松打造xfce4轻快桌面</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2285.aspx" /><id>http://space.kakadoor.com/1923/archive/2285.aspx</id><published>2007-09-27T14:54:01Z</published><updated>2007-09-27T14:54:01Z</updated><content type="html">1 准备工作&lt;br /&gt;
&lt;br /&gt;
　　1.1 下载arch0.7的base iso，或者完整iso arch的iso可以从官方网站下载，&lt;a target="_blank" href="http://www.archlinux.org/download.php"&gt;http://www.archlinux.org/download.php&lt;/a&gt;。本文以完整iso为例，其实是没有区别的，都是安装一个基本系统。&lt;br /&gt;
&lt;br /&gt;
　　1.2 安排安装分区把arch的iso放到硬盘的一个ext2、ext3或者resierfs分区上面，注意不要放到fat分区上面，因为用iso里面的kernel启动系统的时候不能挂载fat格式的分区（如果我错了请纠正我）。放置妥当之后，查看一下具体的放置分区，记住他，因为等会需要修改grub的配置文件。我这里是hda2。&lt;br /&gt;
&lt;br /&gt;
　　1.3 解压内核文件先把iso挂载上：#mount -t iso9660 -o loop arch-0.7.iso /mnt拷贝里面的isolinux/initrd.img和isolinux/vmlinuz文件到放置arch base iso的分区的根目录下。&lt;br /&gt;
&lt;br /&gt;
　　1.4 修改grub这里以grub为例来讲解，如果你是lilo，可以作个参考。&lt;br /&gt;
&lt;br /&gt;
　　修改/boot/grub/menu.lst文件，在文件的最后添加下面的内容：&lt;br /&gt;
&lt;br /&gt;
　　title Arch Install kernel (hd0,1)/vmlinuz initrd (hd0,1)/initrd.img&lt;br /&gt;
&lt;br /&gt;
　　注意一下，(hd0,1)的意思呢，就是第一块硬盘的第二个分区，记数都是从0开始的。而用hdx表示的记数是从1开始的，所以(hd0,1)= hda2。你可以按照你的情况修改一下。需要说明的是，在控制台所有的输入中间都可以按tab补全的，所以在不知道命令怎么写的时候，记得多按几下 tab。&lt;br /&gt;
&lt;br /&gt;
　　此后保存，退出。ok，准备工作就做完了，现在只需要重启，然后在grub列表里面选择Arch Install选项就ok了。&lt;br /&gt;
&lt;br /&gt;
　　2 安装基本系统&lt;br /&gt;
&lt;br /&gt;
　　2.1 准备工作此时应该是停在一个＃提示符那里，先需要挂载base iso所在的分区：#mount -t ext3 /dev/disks/disk0/part2 /mnt #mount -t iso9660 -o loop /mnt/arch-0.7.iso /src&lt;br /&gt;
&lt;br /&gt;
　　此处又出来一个/dev/disks/disk0/part2，这个也是和上面的(hd0,1)以及hda2等价的，按照你的情况修改一下。&lt;br /&gt;
&lt;br /&gt;
　　2.2 运行基本系统配置程序输入/arch/setup就可以启动安装程序了。&lt;br /&gt;
&lt;br /&gt;
　　2.2.1 欢迎画面，按回车2.2.2 选cd-rom 2.2.3 主菜单1 准备硬盘A 自动分区（会毁掉硬盘所有数据）&lt;br /&gt;
&lt;br /&gt;
　　B 手动分区C 设置系统挂载点D 返回主菜单再往细就不多说了，我这里选择的是C，因为现有的分区状况已经可以了。选择挂载点的时候需要注意，他会问你是不是要在选择的分区上面重新建立文件系统，如果选择了yes，那数据就都没有了，如果选择no，那数据都还在，此处一定要注意。&lt;br /&gt;
&lt;br /&gt;
　　设置完swap和/之后，你还可以选择是不是挂载其他的，可以直接选择done不挂载其他的，等之后安装完毕手动挂载。如果对分区操作有误的时候，可以ctrl+c中断安装重新来操作，一定要心里明白怎么回事再确定，否则&amp;hellip;&amp;hellip;&lt;br /&gt;
&lt;br /&gt;
　　2 选择要安装的包A CD B src我们已经把iso挂载到了src了，所以选择B。进去后选择base就ok了，一路回车。&lt;br /&gt;
&lt;br /&gt;
　　3 安装选择的包选ok，会把刚才选择的包安装上。&lt;br /&gt;
&lt;br /&gt;
　　4 安装内核选择你需要的内核。&lt;br /&gt;
&lt;br /&gt;
　　5 配置系统我选择的是vi，不习惯用nano。&lt;br /&gt;
&lt;br /&gt;
　　rc.conf修改timezone为Asia/Shanghai，hostname设置为wd-notebook（根据你的情况），modules添上你知道的硬件的驱动模块，比如我的网卡是8139too。设置eth0的ip，如果是自动获取，设置为eth0=&amp;quot;dhcp&amp;quot;即可，并且可以注释掉下面的 gateway行。daemons设置你想要启动的服务(加！即可)，我注释到只剩下syslog-ng和network了。&lt;br /&gt;
&lt;br /&gt;
　　grub我只在kernel行最后加上了vga=0x315，这样启动后控制台就有800*600的分辨率了。&lt;br /&gt;
&lt;br /&gt;
　　我们不用lilo，不需要修改他的配置文件。&lt;br /&gt;
&lt;br /&gt;
　　hosts文件，把127.0.0.1最后的localhost修改为你前面设置的主机名，我的是wd-notebook。&lt;br /&gt;
&lt;br /&gt;
　　fstab文件，此处可以手动挂载分区。&lt;br /&gt;
&lt;br /&gt;
　　modprobe.conf或者modules.conf，看你选择的内核是什么修改相应的。其实前面rc.conf中modules行里面的内容也可以写道这里来。&lt;br /&gt;
&lt;br /&gt;
　　resolv.conf,设置dns。nameserver xxx.xx.xx.xx即可。&lt;br /&gt;
&lt;br /&gt;
　　6 安装Grub或者lilo选择grub，然后选择安装位置。我希望安装到mbr，所以选择/dev/discs/disc0/disc。&lt;br /&gt;
&lt;br /&gt;
　　7 退出安装ok，可以退出安装了。回到提示符下面，输入reboot重启电脑即可。我们的基本系统已经安装完毕了。&lt;br /&gt;
&lt;br /&gt;
　　3 安装桌面&lt;br /&gt;
&lt;br /&gt;
　　3.1 准备工作重启电脑之后会出现登陆提示符，输入root回车即可登陆。先赶紧用passwd命令设置一个密码吧，呵呵。然后我们用adduser命令添加一个普通用户以后用来登陆桌面。&lt;br /&gt;
&lt;br /&gt;
　　顺便设置一下bash环境，显示彩色什么的，以下是.bashrc文件和.bash_profile文件，我从debian上面copy过来的，呵呵。&lt;br /&gt;
&lt;br /&gt;
　　root@wd-notebook:~# cat .bash_rc # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples&lt;br /&gt;
&lt;br /&gt;
　　# If running interactively, then: if [ &amp;quot;PS1&amp;quot; ]; then&lt;br /&gt;
&lt;br /&gt;
　　# don't put duplicate lines in the history. See bash(1) for more options # export HISTCONTROL=ignoredups&lt;br /&gt;
&lt;br /&gt;
　　# check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. #shopt -s checkwinsize&lt;br /&gt;
&lt;br /&gt;
　　# enable color support of ls and also add handy aliases if [ &amp;quot;TERM&amp;quot; != &amp;quot;dumb&amp;quot; ]; then eval `dircolors -b` alias ls='ls &amp;mdash;&amp;mdash;color=auto' alias dir='ls &amp;mdash;&amp;mdash;color=auto &amp;mdash;&amp;mdash;format=vertical' alias vdir='ls &amp;mdash;&amp;mdash;color=auto &amp;mdash;&amp;mdash;format=long' fi&lt;br /&gt;
&lt;br /&gt;
　　# some more ls aliases alias ll='ls -l &amp;mdash;&amp;mdash;color=auto' alias la='ls -A &amp;mdash;&amp;mdash;color=auto' alias l='ls -CF &amp;mdash;&amp;mdash;color=auto' alias l.='ls -d .* &amp;mdash;&amp;mdash;color=auto'&lt;br /&gt;
&lt;br /&gt;
　　# set a fancy prompt PS1='{debian_chroot:+(debian_chroot)}\u@\h:\w\ '&lt;br /&gt;
&lt;br /&gt;
　　# If this is an xterm set the title to user@host:dir case TERM in xterm*) PROMPT_COMMAND='echo -ne &amp;quot;\033]0;{USER}@{HOSTNAME}: {PWD}\007&amp;quot;' ;; *) ;; esac&lt;br /&gt;
&lt;br /&gt;
　　# enable programmable completion features (you don't need to enable # this, if it's already enabled in /etc/bash.bashrc). if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi&lt;br /&gt;
&lt;br /&gt;
　　root@wd-notebook:~# cat .bash_profile # ~/.bash_profile: executed by bash(1) for login shells. # see /usr/share/doc/bash/examples/startup-files for examples. # the files are located in the bash-doc package.&lt;br /&gt;
&lt;br /&gt;
　　# the default umask is set in /etc/login.defs #umask 022&lt;br /&gt;
&lt;br /&gt;
　　# the rest of this file is commented out.&lt;br /&gt;
&lt;br /&gt;
　　# set variable identifying the chroot you work in #if [ -f /etc/debian_chroot ]; then # debian_chroot=(cat /etc/debian_chroot) #fi&lt;br /&gt;
&lt;br /&gt;
　　# include .bashrc if it exists if [ -f ~/.bashrc ]; then . ~/.bashrc fi&lt;br /&gt;
&lt;br /&gt;
　　# set PATH so it includes user's private bin if it exists if [ -d ~/bin ] ; then PATH=~/bin:&amp;quot;{PATH}&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
　　# do the same with MANPATH if [ -d ~/man ]; then MANPATH=~/man:&amp;quot;{MANPATH}&amp;quot; export MANPATH fi&lt;br /&gt;
&lt;br /&gt;
　　3.2 设置pacman要准备安装啦，先设置一下pacman的源。他的配置文件是/etc/pacman.conf和/etc/pacman.d下面的文件，修改添加上碧轩的mirror或者我的mirror，下面是一个例子：[current] server = &lt;a target="_blank" href="http://210.72.203.226/current/os/i686"&gt;http://210.72.203.226/current/os/i686&lt;/a&gt; [testing] server = &lt;a target="_blank" href="http://210.72.203.226/testing/testing/os/i686"&gt;http://210.72.203.226/testing/testing/os/i686&lt;/a&gt; [unstable] server = &lt;a target="_blank" href="http://210.72.203.226/unstable/unstable/os/i686"&gt;http://210.72.203.226/unstable/unstable/os/i686&lt;/a&gt; [extra] server = &lt;a target="_blank" href="http://210.72.203.226/extra/os/i686"&gt;http://210.72.203.226/extra/os/i686&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　　此后运行pacman -Syu更新一下系统到最新状态。&lt;br /&gt;
&lt;br /&gt;
　　3.3 安装openssh安装了这个以后就可以远程安装了。&lt;br /&gt;
&lt;br /&gt;
　　#pacman -S openssh然后修改/etc/ssh/sshd_config文件，把#Protocol 2,1修改为Protocol 2，只允许ssh2登陆。然后执行/etc/rc.d/sshd start命令，即可启动sshd。修改rc.conf在daemon里面添加sshd即可开机启动服务。&lt;br /&gt;
&lt;br /&gt;
　　此外，还需要修改/etc/hosts.deny文件，注释掉里面的ALL: ALL: DENY，允许其他电脑连接本机。ok，此后就可以ssh登陆本机了。&lt;br /&gt;
&lt;br /&gt;
　　3.4 安装sudo我们不建议使用root来完成所有的操作，使用sudo是个很好的选择。同时，xfce4里面的关机按钮的功能也需要安装sudo才能实现。&lt;br /&gt;
&lt;br /&gt;
　　#pacman -S sudo修改/etc/sudoers文件，添加一行: username ALL=(ALL) NOPASSWD: ALL其中的username是你之前新建的用户的名字。注意这个文件是只读文件，需要使用x!来保存。&lt;br /&gt;
&lt;br /&gt;
　　3.5 安装桌面#pacman -S xorg hwd hwd是一个硬件检测程序，强烈建议安装。安装好xorg之后，运行一下startx看看？反正我没进去，呵呵。不用管他。先运行一下hwd，他会提示你使用方法。hwd -s一下，会显示检测到的信息，同时会建立一个xorg.conf.hwd文件在/etc/X11下面。修改一下文件名为xorg.conf，再 startx试试看？&lt;br /&gt;
&lt;br /&gt;
　　刚发现新建的用户的home目录下会有一个.xinitrc文件和一个.xsession文件，这些我们不需要，先删掉他。&lt;br /&gt;
&lt;br /&gt;
　　接下来安装xfce4和gdm。我喜欢用gdm所以安装一下gdm，你也可以选择其他dm。顺道把firefox和gaim,beep-media- player也安装了吧。需要注意的是，gnome相关、firefox、xfce4都是安装到/opt目录下的，所以要保证那里有空间。&lt;br /&gt;
&lt;br /&gt;
　　#pacman -S xfce4 gdm mozilla-firefox bmp gaim总共70多M，看网速了，呵呵。&lt;br /&gt;
&lt;br /&gt;
　　装完了，试试看执行startxfce4命令看看，能看到xfce4的桌面了吧？&lt;br /&gt;
&lt;br /&gt;
　　修改一下/etc/inittab文件，把id:3:initdefault:修改为id:5:initdefault:，把最下面的/usr/X11R6/bin/xdm修改为/opt/gnome/bin/gdm。保存退出，重启电脑。&lt;br /&gt;
4 配置桌面&lt;br /&gt;
&lt;br /&gt;
　　4.1 设置字体先下载几个字体，&lt;a target="_blank" href="http://210.72.203.226/fonts/"&gt;http://210.72.203.226/fonts/&lt;/a&gt;，下载s&amp;hellip;&amp;hellip;fonts目录下面。&lt;br /&gt;
&lt;br /&gt;
　　在/etc/fonts目录下新建一个文件，如下所示内容：&lt;br /&gt;
&lt;br /&gt;
　　root@wd-notebook:~# cat /etc/fonts/local.conf &amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt; &amp;lt;fontconfig&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;dir&amp;gt;/usr/locale/share/fonts&amp;lt;/dir&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;match target=&amp;quot;font&amp;quot;&amp;gt; &amp;lt;test qual=&amp;quot;any&amp;quot; name=&amp;quot;family&amp;quot;&amp;gt; &amp;lt;string&amp;gt;SimSun&amp;lt;/string&amp;gt; &amp;lt;string&amp;gt;fzyuanti&amp;lt;/string&amp;gt; &amp;lt;/test&amp;gt; &amp;lt;test name=&amp;quot;pixelsize&amp;quot; compare=&amp;quot;more_eq&amp;quot;&amp;gt; &amp;lt;int&amp;gt;12&amp;lt;/int&amp;gt; &amp;lt;/test&amp;gt; &amp;lt;test name=&amp;quot;pixelsize&amp;quot; compare=&amp;quot;less_eq&amp;quot;&amp;gt; &amp;lt;int&amp;gt;16&amp;lt;/int&amp;gt; &amp;lt;/test&amp;gt; &amp;lt;edit name=&amp;quot;antialias&amp;quot; mode=&amp;quot;assign&amp;quot;&amp;gt; &amp;lt;bool&amp;gt;false&amp;lt;/bool&amp;gt; &amp;lt;/edit&amp;gt; &amp;lt;/match&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;alias&amp;gt; &amp;lt;family&amp;gt;serif&amp;lt;/family&amp;gt; &amp;lt;prefer&amp;gt; &amp;lt;family&amp;gt;Bitstream Vera Serif&amp;lt;/family&amp;gt; &amp;lt;family&amp;gt;SimSun&amp;lt;/family&amp;gt; &amp;lt;/prefer&amp;gt; &amp;lt;/alias&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;alias&amp;gt; &amp;lt;family&amp;gt;sans-serif&amp;lt;/family&amp;gt; &amp;lt;prefer&amp;gt; &amp;lt;family&amp;gt;Bitstream Vera Sans&amp;lt;/family&amp;gt; &amp;lt;family&amp;gt;SimSun&amp;lt;/family&amp;gt; &amp;lt;/prefer&amp;gt; &amp;lt;/alias&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;alias&amp;gt; &amp;lt;family&amp;gt;monospace&amp;lt;/family&amp;gt; &amp;lt;prefer&amp;gt; &amp;lt;family&amp;gt;Bitstream Vera Sans Mono&amp;lt;/family&amp;gt; &amp;lt;family&amp;gt;SimSun&amp;lt;/family&amp;gt; &amp;lt;/prefer&amp;gt; &amp;lt;/alias&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;match target=&amp;quot;font&amp;quot;&amp;gt; &amp;lt;edit name=&amp;quot;spacing&amp;quot;&amp;gt; &amp;lt;const&amp;gt;proportional&amp;lt;/const&amp;gt; &amp;lt;/edit&amp;gt; &amp;lt;edit name=&amp;quot;globaladvance&amp;quot;&amp;gt; &amp;lt;bool&amp;gt;false&amp;lt;/bool&amp;gt; &amp;lt;/edit&amp;gt; &amp;lt;/match&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;match target=&amp;quot;font&amp;quot;&amp;gt; &amp;lt;edit name=&amp;quot;antialias&amp;quot;&amp;gt;&amp;lt;bool&amp;gt;true&amp;lt;/bool&amp;gt;&amp;lt;/edit&amp;gt; &amp;lt;edit name=&amp;quot;hinting&amp;quot;&amp;gt;&amp;lt;bool&amp;gt;false&amp;lt;/bool&amp;gt;&amp;lt;/edit&amp;gt; &amp;lt;edit name=&amp;quot;autohint&amp;quot;&amp;gt;&amp;lt;bool&amp;gt;false&amp;lt;/bool&amp;gt;&amp;lt;/edit&amp;gt; &amp;lt;/match&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;match target=&amp;quot;font&amp;quot;&amp;gt; &amp;lt;test name=&amp;quot;pixelsize&amp;quot; compare=&amp;quot;more_eq&amp;quot;&amp;gt;&amp;lt;double&amp;gt;12&amp;lt;/double&amp;gt;&amp;lt;/test&amp;gt; &amp;lt;test name=&amp;quot;pixelsize&amp;quot; compare=&amp;quot;less_eq&amp;quot;&amp;gt;&amp;lt;double&amp;gt;16&amp;lt;/double&amp;gt;&amp;lt;/test&amp;gt; &amp;lt;edit name=&amp;quot;antialias&amp;quot;&amp;gt;&amp;lt;bool&amp;gt;false&amp;lt;/bool&amp;gt;&amp;lt;/edit&amp;gt; &amp;lt;edit name=&amp;quot;hinting&amp;quot;&amp;gt;&amp;lt;bool&amp;gt;true&amp;lt;/bool&amp;gt;&amp;lt;/edit&amp;gt; &amp;lt;edit name=&amp;quot;autohint&amp;quot;&amp;gt;&amp;lt;bool&amp;gt;false&amp;lt;/bool&amp;gt;&amp;lt;/edit&amp;gt; &amp;lt;/match&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　&amp;lt;match target=&amp;quot;pattern&amp;quot;&amp;gt; &amp;lt;test name=&amp;quot;family&amp;quot;&amp;gt; &amp;lt;string&amp;gt;SimSun&amp;lt;/string&amp;gt; &amp;lt;/test&amp;gt; &amp;lt;test name=&amp;quot;weight&amp;quot; compare=&amp;quot;more_eq&amp;quot;&amp;gt; &amp;lt;const&amp;gt;bold&amp;lt;/const&amp;gt; &amp;lt;/test&amp;gt; &amp;lt;edit name=&amp;quot;family&amp;quot; mode=&amp;quot;assign&amp;quot;&amp;gt; &amp;lt;string&amp;gt;fzyuanti&amp;lt;/string&amp;gt; &amp;lt;/edit&amp;gt; &amp;lt;/match&amp;gt; &amp;lt;/fontconfig&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　然后在/etc/X11/xorg.conf里面添加一行FontPath &amp;quot;/usr/share/fonts&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
　　4.2 安装个xfce4-goodies吧&lt;br /&gt;
&lt;br /&gt;
　　4.3 设置locale在/etc/profile.d目录下新建一个locale-set.sh文件，内容如下：export LANG=&amp;quot;zh_CN.gbk&amp;quot; export XMODIFIERS=&amp;quot;@im=fcitx&amp;quot; export XIM=fcitx export XIM_PROGRAM=fcitx export TERMCMD=Terminal&lt;br /&gt;
&lt;br /&gt;
　　然后chmod +x locale-set.sh。你也可以根据自己的情况修改其中的zh_CN.gbk和fcitx。建立之后重启就会发现，gdm和xfce4已经是中文的了。&lt;br /&gt;
&lt;br /&gt;
　　4.4 设置gdm gdm默认的标准登陆程序比较老土，再gdm登陆界面，执行【行动】－&amp;gt;【配置登陆管理器】命令，输入root密码，会出来gdm设置界面，选上图形欢迎程序就会好看一点了。&lt;br /&gt;
&lt;br /&gt;
　　4.5 安装fictx输入法我选择的输入法是fcitx，如果你选择scim，可以参pkgbuild文件。&lt;br /&gt;
&lt;br /&gt;
　　到&lt;a target="_blank" href="http://www.fcitx.org/"&gt;http://www.fcitx.org&lt;/a&gt;下载最新的安装?&amp;hellip;&amp;hellip;BUILD文件如下：root@wd-notebook:/opt/fcitx# cat PKGBUILD # Contributor: ganlu &amp;lt;&lt;a href="mailto:rhythm_gan@yahoo.com.cn"&gt;rhythm_gan@yahoo.com.cn&lt;/a&gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　pkgname=fcitx pkgver=3.1 pkgrel=1 pkgdesc=&amp;quot;An Chinese input collection for linux&amp;quot; url=&amp;quot;http://fcitx.linuxsir.org&amp;quot; license=GPL depends=('xorg') source=(&lt;a target="_blank" href="http://www.fcitx.org/download/pkgname-pkgver.tar.bz2"&gt;http://www.fcitx.org/download/pkgname-pkgver.tar.bz2&lt;/a&gt;) install= md5sums=('0b2f3908a1d7bcd0b12266da98bb42e0')&lt;br /&gt;
&lt;br /&gt;
　　build() { cd startdir/src/pkgname-pkgver ./configure &amp;mdash;&amp;mdash;prefix=/usr make || return 1 make DESTDIR=startdir/pkg install }&lt;br /&gt;
&lt;br /&gt;
　　这个是我照着别人的修改的。新建后用root执行makepkg命令，等一会停了，目录下就会出现一个fcitx-3.1-1.pkg.tar.gz，用pacman -A fcitx-3.1-1.pkg.tar.gz命令安装他。&lt;br /&gt;
&lt;br /&gt;
　　此后需要在启动x的时候加载输入法。修改/opt/xfce4/etc/xdg/xfce4/xinitrc文件，大概在# Launch xscreensaver (if available)前面添加一行/usr/bin/fcitx。&lt;br /&gt;
&lt;br /&gt;
　　4.6 使用桌面图标&lt;br /&gt;
&lt;br /&gt;
　　先安装rox文件管理器：#pacman -S rox修改/opt/xfce4/etc/xdg/xfce4-session/xfce4-session.rc文件，修改Client3_Command=rox -p xxx(xx随意)，使用rox来做桌面，这样就可以有桌面图标了。&lt;br /&gt;
&lt;br /&gt;
　　重新启动电脑之后，会看到桌面变了。启动rox文件管理器，从中拖动可执行文件到桌面即可建立桌面快捷方式。&lt;br /&gt;
&lt;br /&gt;
　　此处还可以修改让任务栏在窗口下面的面板上面显示。注释掉＃Client2_Command=xftaskbar4＃Client2_PerScreen=True不启动任务栏，然后在面板上添加一个任务栏插件即可。同时记得添加一个systermtray，要不然像gaim这种软件，按了关闭按钮就会找不到了。&lt;br /&gt;
&lt;br /&gt;
　　4.7 安装openq到openq的主页下载最新版本到/opt/openq/OpenQ-0.3.1.tar.bz2，然后建立/opt/openq/PKGBUILD文件如下：root@wd-notebook:/opt/openq# cat PKGBUILD # Contributor: ganlu &amp;lt;&lt;a href="mailto:rhythm_gan@yahoo.com.cn"&gt;rhythm_gan@yahoo.com.cn&lt;/a&gt;&amp;gt; pkgname=openq pkgver=0.3.1 pkgrel=1 pkgdesc=&amp;quot;QQ for Linux based on Gaim&amp;quot; url=&amp;quot;www.openq.com/cgi-bin/wiki/moin.cgi/_ca_d7_d2_b3&amp;quot; license=GPL depends=('gaim') backup=() source=(OpenQ-pkgver.tar.bz2) md5sums=('80415138f7a59e0d6920e481f5dbecc8')&lt;br /&gt;
&lt;br /&gt;
　　build() { # tar xjvf openQ-pkgver.tbz cd startdir/src/OpenQ ./configure &amp;mdash;&amp;mdash;prefix=/usr make || return 1 make DESTDIR=startdir/pkg install }然后执行makepkg命令，等会会出现一个openq-0.3.1-1.pkg.tar.gz文件，使用pacman -A openq-0.3.1-1.pkg.tar.gz命令安装他。&lt;br /&gt;
&lt;br /&gt;
　　4.8 xfce菜单修改/opt/xfce4/etc/xdg/xfce4/desktop/menu.xml.zh_CN可以往菜单中添加内容。这个文件是utf-8编码的，所以得找相应的编辑器，gedit可以编辑。&lt;br /&gt;
&lt;br /&gt;
　　修改在其中合适地方添加一行：&amp;lt;include type=&amp;quot;system&amp;quot; style=&amp;quot;simple&amp;quot; unique=&amp;quot;true&amp;quot; /&amp;gt;可以显示系统菜单，这样安装了软件之后就可以从这里找到了。&lt;br /&gt;
&lt;br /&gt;
　　4.9 声音安装alsa #pacman -S alsa-utils安装完之后，执行alsaconf，查找声卡。找到之后就可以在xfce下面调整音量了。我这里找到的是snd_intel8x0，他会自己添加到 modprobe.conf文件内，之后自己修改一下/etc/rc.conf文件，添加到modules行就行了。重启之后，运行一下 alsamixer，在出来的界面里面调整音量并去掉pcm的静音（按m），调整完后按esc退出。打开bmp试试看，能不能放出来声音？记得要选择输出模块是alsa。此后会发现每次重启电脑都会恢复到无声状态，这需要在调整好音量后运行一下alsactl store，然后修改/etc/rc.local文件，加入一行/usr/sbin/alsactl restore，即可每次启动都恢复音量设置。&lt;br /&gt;
&lt;br /&gt;
　　4.10 桌面风格桌面风格相关文件可以放到.themes文件夹内，图标风格放到.icons文件夹内。此后就可以到xfce控制面板里面选择了。&lt;br /&gt;
&lt;br /&gt;
　　4.11 装个gimp装了gimp就可以抓图处理图片了。</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>skyeye编译问题及解决方法</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2284.aspx" /><id>http://space.kakadoor.com/1923/archive/2284.aspx</id><published>2007-09-27T14:53:12Z</published><updated>2007-09-27T14:53:12Z</updated><content type="html">首先交代一下我的环境，ubuntu linux 7.04桌面版，gcc 4.1.2, skyeye 1.2.3。接下来就是下载和安装skyeye了：&lt;br /&gt;
&lt;br /&gt;
　　1）上&lt;a target="_blank" href="http://gro.clinux.org/"&gt;http://gro.clinux.org&lt;/a&gt;下载最新的skyeye，当前最新版本为1.2.3，所以下载的文件为skyeye_1_2_3_Rel.tar.bz2&lt;br /&gt;
&lt;br /&gt;
　　2) 使用以下命令解压包：&lt;br /&gt;
　　$ tar jvxf skyeye_1_2_3_Rel.tar.bz2&lt;br /&gt;
&lt;br /&gt;
　　3) 进入解压后的目录&lt;br /&gt;
　　$ cd skyeye_1_2_3_Rel&lt;br /&gt;
&lt;br /&gt;
　　4) 输入make命令&lt;br /&gt;
　　$ make NO_DBCT=1 NO_BFD=1 NO_LCD=1这时出现如下提示:&lt;br /&gt;
&lt;br /&gt;
&lt;h6 class="quote"&gt;&lt;a onclick="CopyCode(document.getElementById('code1'));" href="javascript:"&gt;Copy code&lt;/a&gt;&lt;/h6&gt;
&lt;blockquote id="code1"&gt;test@ubuntu-kde-pc:~/incoming/skyeye_1_2_3_Rel$ make NO_DBCT=1 NO_BFD=1 NO_LCD=1&lt;br /&gt;
--------------------------- NOTICE ------------------------------&lt;br /&gt;
If you always get error, please run &amp;quot;make NO_CHECK=1&amp;quot; instead.&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
Checking whether host is big endian ... no&lt;br /&gt;
Checking gcc ... OK ( gcc version: 4.1.2 )&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
gcc -g -O2 -D_FILE_OFFSET_BITS=64 -DSTANDALONE -DDEFAULT_INLINE=0 -DMODET&amp;nbsp; -DMODET -I arch/arm -I arch/arm/common -I arch/arm/common/mmu -I arch/arm/mach -I arch/bfin/common -I arch/bfin/mach -I arch/coldfire/common -I device -I device/net -I device/lcd -I device/flash -I device/uart -I utils -I utils/share -I utils/main -I utils/config -I utils/debugger&amp;nbsp; -DARM&amp;nbsp; -I. -DNO_DBCT -DNO_BFD -DNO_LCD -o binary/skyeye binary/skyeye.o &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; --start-group -Lbinary -larm -ldev -lutils -lbfin -lcoldfire -lmips -lppc&amp;nbsp; --end-group&lt;br /&gt;
binary/libppc.a(ppc_vec.o): In function `ppc_opc_vctuxs':&lt;br /&gt;
/home/test/incoming/skyeye_1_2_3_Rel/arch/ppc/common//ppc_vec.c:2770: undefined reference to `truncf'&lt;br /&gt;
binary/libppc.a(ppc_vec.o): In function `ppc_opc_vctsxs':&lt;br /&gt;
/home/test/incoming/skyeye_1_2_3_Rel/arch/ppc/common//ppc_vec.c:2741: undefined reference to `truncf'&lt;br /&gt;
binary/libppc.a(ppc_vec.o): In function `ppc_opc_vrfiz':&lt;br /&gt;
/home/test/incoming/skyeye_1_2_3_Rel/arch/ppc/common//ppc_vec.c:2609: undefined reference to `truncf'&lt;br /&gt;
binary/libppc.a(ppc_vec.o): In function `ppc_opc_vexptefp':&lt;br /&gt;
/home/test/incoming/skyeye_1_2_3_Rel/arch/ppc/common//ppc_vec.c:2693: undefined reference to `pow'&lt;br /&gt;
binary/libppc.a(ppc_vec.o): In function `ppc_opc_vlogefp':&lt;br /&gt;
/home/test/incoming/skyeye_1_2_3_Rel/arch/ppc/common//ppc_vec.c:2672: undefined reference to `log'&lt;br /&gt;
/home/test/incoming/skyeye_1_2_3_Rel/arch/ppc/common//ppc_vec.c:2672: undefined reference to `log'&lt;br /&gt;
binary/libppc.a(ppc_vec.o): In function `ppc_opc_vrsqrtefp':&lt;br /&gt;
/home/test/incoming/skyeye_1_2_3_Rel/arch/ppc/common//ppc_vec.c:2651: undefined reference to `sqrt'&lt;br /&gt;
binary/libppc.a(ppc_vec.o): In function `ppc_opc_vrfin':&lt;br /&gt;
/home/test/incoming/skyeye_1_2_3_Rel/arch/ppc/common//ppc_vec.c:2564: undefined reference to `rintf'&lt;br /&gt;
collect2: ld returned 1 exit status&lt;br /&gt;
make: *** [binary/skyeye] Error 1&lt;/blockquote&gt;&lt;br /&gt;
　　5)看到有没有链接到pow的提示，想到pow应该是数据运算库中的函数，是不是因为数学库没有链接的原因？找到Makefile的 SKYEYE_LIB=-Lbinary -larm -ldev -lutils -lbfin -lcoldfire -lmips这一行，在后面添加了-lm，再编译，一切OK&lt;br /&gt;
&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Shell脚本调试技术</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2283.aspx" /><id>http://space.kakadoor.com/1923/archive/2283.aspx</id><published>2007-09-27T14:51:54Z</published><updated>2007-09-27T14:51:54Z</updated><content type="html">&lt;p&gt;本文全面系统地介绍了shell脚本调试技术，包括使用echo, tee, trap等命令输出关键信息，跟踪变量的值，在脚本中植入调试钩子，使用&amp;ldquo;-n&amp;rdquo;选项进行shell脚本的语法检查， 使用&amp;ldquo;-x&amp;rdquo;选项实现shell脚本逐条语句的跟踪，巧妙地利用shell的内置变量增强&amp;ldquo;-x&amp;rdquo;选项的输出信息等。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 一. 前言&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; shell编程在unix/linux世界中使用得非常广泛，熟练掌握shell编程也是成为一名优秀的unix/linux开发者和系统管理员的必经之 路。脚本调试的主要工作就是发现引发脚本错误的原因以及在脚本源代码中定位发生错误的行，常用的手段包括分析输出的错误信息，通过在脚本中加入调试语句， 输出调试信息来辅助诊断错误，利用调试工具等。但与其它高级语言相比，shell解释器缺乏相应的调试机制和调试工具的支持，其输出的错误信息又往往很不 明确，初学者在调试脚本时，除了知道用echo语句输出一些信息外，别无它法，而仅仅依赖于大量的加入echo语句来诊断错误，确实令人不胜其繁，故常见 初学者抱怨shell脚本太难调试了。本文将系统地介绍一些重要的shell脚本调试技术，希望能对shell的初学者有所裨益。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 本文的目标读者是unix/linux环境下的开发人员，测试人员和系统管理员，要求读者具有基本的shell编程知识。本文所使用范例在Bash3.1 +Redhat Enterprise Server 4.0下测试通过，但所述调试技巧应也同样适用于其它shell。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 二. 在shell脚本中输出调试信息&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 通过在程序中加入调试语句把一些关键地方或出错的地方的相关信息显示出来是最常见的调试手段。Shell程序员通常使用echo(ksh程序员常使用 print)语句输出信息，但仅仅依赖echo语句的输出跟踪信息很麻烦，调试阶段在脚本中加入的大量的echo语句在产品交付时还得再费力一一删除。针 对这个问题，本节主要介绍一些如何方便有效的输出调试信息的方法。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 1. 使用trap命令&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; trap命令用于捕获指定的信号并执行预定义的命令。&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 其基本的语法是:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; trap 'command' signal&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 其中signal是要捕获的信号，command是捕获到指定的信号之后，所要执行的命令。可以用kill &amp;ndash;l命令看到系统中全部可用的信号名，捕获信号后所执行的命令可以是任何一条或多条合法的shell语句，也可以是一个函数名。&lt;br /&gt;
&amp;nbsp; &amp;nbsp; shell脚本在执行时，会产生三个所谓的&amp;ldquo;伪信号&amp;rdquo;，(之所以称之为&amp;ldquo;伪信号&amp;rdquo;是因为这三个信号是由shell产生的，而其它的信号是由操作系统产生的)，通过使用trap命令捕获这三个&amp;ldquo;伪信号&amp;rdquo;并输出相关信息对调试非常有帮助。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 表 1. shell伪信号&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 信号名 何时产生&lt;br /&gt;
&amp;nbsp; &amp;nbsp; EXIT 从一个函数中退出或整个脚本执行完毕&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ERR 当一条命令返回非零状态时(代表命令执行不成功)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; DEBUG 脚本中每一条命令执行之前&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 通过捕获EXIT信号,我们可以在shell脚本中止执行或从函数中退出时，输出某些想要跟踪的变量的值，并由此来判断脚本的执行状态以及出错原因,其使用方法是：&lt;br /&gt;
&amp;nbsp; &amp;nbsp; trap 'command' EXIT　或　trap 'command' 0&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 通过捕获ERR信号,我们可以方便的追踪执行不成功的命令或函数，并输出相关的调试信息，以下是一个捕获ERR信号的示例程序，其中的$LINENO是一个shell的内置变量，代表shell脚本的当前行号。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ cat -n exp1.sh&amp;nbsp; &amp;nbsp; 1&amp;nbsp; ERRTRAP()&amp;nbsp; &amp;nbsp; 2&amp;nbsp; {&amp;nbsp; &amp;nbsp; 3&amp;nbsp; &amp;nbsp; echo &amp;quot;[LINE:$1] Error: Command or function exited with status $?&amp;quot;&amp;nbsp; &amp;nbsp; 4&amp;nbsp; }&amp;nbsp; &amp;nbsp; 5&amp;nbsp; foo()&amp;nbsp; &amp;nbsp; 6&amp;nbsp; {&amp;nbsp; &amp;nbsp; 7&amp;nbsp; &amp;nbsp; return 1;&amp;nbsp; &amp;nbsp; 8&amp;nbsp; }&amp;nbsp; &amp;nbsp; 9&amp;nbsp; trap 'ERRTRAP $LINENO' ERR&amp;nbsp; &amp;nbsp; 10&amp;nbsp; abc&amp;nbsp; &amp;nbsp; 11&amp;nbsp; foo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 其输出结果如下：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ sh exp1.shexp1.sh: line 10: abc: command not found[LINE:10] Error: Command or function exited with status 127[LINE:11] Error: Command or function exited with status 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 在调试过程中，为了跟踪某些变量的值，我们常常需要在shell脚本的许多地方插入相同的echo语句来打印相关变量的值，这种做法显得烦琐而笨拙。而通过捕获DEBUG信号，我们只需要一条trap语句就可以完成对相关变量的全程跟踪。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 以下是一个通过捕获DEBUG信号来跟踪变量的示例程序:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ cat &amp;ndash;n exp2.sh&amp;nbsp; &amp;nbsp; 1&amp;nbsp; #!/bin/bash&amp;nbsp; &amp;nbsp; 2&amp;nbsp; trap 'echo &amp;ldquo;before execute line:$LINENO, a=$a,b=$b,c=$c&amp;rdquo;' DEBUG&amp;nbsp; &amp;nbsp; 3&amp;nbsp; a=1&amp;nbsp; &amp;nbsp; 4&amp;nbsp; if [ &amp;quot;$a&amp;quot; -eq 1 ]&amp;nbsp; &amp;nbsp; 5&amp;nbsp; then&amp;nbsp; &amp;nbsp; 6&amp;nbsp; &amp;nbsp; b=2&amp;nbsp; &amp;nbsp; 7&amp;nbsp; else&amp;nbsp; &amp;nbsp; 8&amp;nbsp; &amp;nbsp; b=1&amp;nbsp; &amp;nbsp; 9&amp;nbsp; fi&amp;nbsp; &amp;nbsp; 10&amp;nbsp; c=3&amp;nbsp; &amp;nbsp; 11&amp;nbsp; echo &amp;quot;end&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 其输出结果如下：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ sh exp2.shbefore execute line:3, a=,b=,c=before execute line:4, a=1,b=,c=before execute line:6, a=1,b=,c=before execute line:10, a=1,b=2,c=before execute line:11, a=1,b=2,c=3end&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 从运行结果中可以清晰的看到每执行一条命令之后，相关变量的值的变化。同时，从运行结果中打印出来的行号来分析，可以看到整个脚本的执行轨迹，能够判断出哪些条件分支执行了，哪些条件分支没有执行。&lt;br /&gt;
&lt;br /&gt;
2. 使用tee命令&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 在shell脚本中管道以及输入输出重定向使用得非常多，在管道的作用下，一些命令的执行结果直接成为了下一条命令的输入。如果我们发现由管道连接起来的 一批命令的执行结果并非如预期的那样，就需要逐步检查各条命令的执行结果来判断问题出在哪儿，但因为使用了管道，这些中间结果并不会显示在屏幕上，给调试 带来了困难，此时我们就可以借助于tee命令了。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; tee命令会从标准输入读取数据，将其内容输出到标准输出设备,同时又可将内容保存成文件。例如有如下的脚本片段，其作用是获取本机的ip地址：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ipaddr=`/sbin/ifconfig | grep 'inet addr:' | grep -v '127.0.0.1'| cut -d : -f3 | awk '{print $1}'` #注意=号后面的整句是用反引号(数字1键的左边那个键)括起来的。echo $ipaddr&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 运行这个脚本，实际输出的却不是本机的ip地址，而是广播地址,这时我们可以借助tee命令，输出某些中间结果，将上述脚本片段修改为：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ipaddr=`/sbin/ifconfig | grep 'inet addr:' | grep -v '127.0.0.1'| tee temp.txt | cut -d : -f3 | awk '{print $1}'`echo $ipaddr&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 之后，将这段脚本再执行一遍，然后查看temp.txt文件的内容：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ cat temp.txtinet addr:192.168.0.1&amp;nbsp; Bcast:192.168.0.255&amp;nbsp; Mask:255.255.255.0&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 我们可以发现中间结果的第二列(列之间以:号分隔)才包含了IP地址，而在上面的脚本中使用cut命令截取了第三列，故我们只需将脚本中的cut -d : -f3改为cut -d : -f2即可得到正确的结果。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 具体到上述的script例子，我们也许并不需要tee命令的帮助，比如我们可以分段执行由管道连接起来的各 条命令并查看各命令的输出结果来诊断错误，但在一些复杂的shell脚本中，这些由管道连接起来的命令可能又依赖于脚本中定义的一些其它变量，这时我们想 要在提示符下来分段运行各条命令就会非常麻烦了，简单地在管道之间插入一条tee命令来查看中间结果会更方便一些。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 3. 使用&amp;quot;调试钩子&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 在C语言程序中，我们经常使用DEBUG宏来控制是否要输出调试信息，在shell脚本中我们同样可以使用这样的机制，如下列代码所示：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; if [ &amp;ldquo;$DEBUG&amp;rdquo; = &amp;ldquo;true&amp;rdquo; ]; thenecho &amp;ldquo;debugging&amp;rdquo;&amp;nbsp; #此处可以输出调试信息fi&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 这样的代码块通常称之为&amp;ldquo;调试钩子&amp;rdquo;或 &amp;ldquo;调试块&amp;rdquo;。在调试钩子内部可以输出任何您想输出的调试信息，使用调试钩子的好处是它是可以通过DEBUG变量来控制的，在脚本的开发调试阶段，可以先执 行export DEBUG=true命令打开调试钩子，使其输出调试信息，而在把脚本交付使用时，也无需再费事把脚本中的调试语句一一删除。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 如果在每一处需要输出调试信息的地方均使用if语句来判断DEBUG变量的值，还是显得比较繁琐，通过定义一个DEBUG函数可以使植入调试钩子的过程更简洁方便，如下面代码所示:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ cat &amp;ndash;n exp3.sh&amp;nbsp; &amp;nbsp; 1&amp;nbsp; DEBUG()&amp;nbsp; &amp;nbsp; 2&amp;nbsp; {&amp;nbsp; &amp;nbsp; 3&amp;nbsp; if [ &amp;quot;$DEBUG&amp;quot; = &amp;quot;true&amp;quot; ]; then&amp;nbsp; &amp;nbsp; 4&amp;nbsp; &amp;nbsp; &amp;nbsp; $@　　&amp;nbsp; &amp;nbsp; 5&amp;nbsp; fi&amp;nbsp; &amp;nbsp; 6&amp;nbsp; }&amp;nbsp; &amp;nbsp; 7&amp;nbsp; a=1&amp;nbsp; &amp;nbsp; 8&amp;nbsp; DEBUG echo &amp;quot;a=$a&amp;quot;&amp;nbsp; &amp;nbsp; 9&amp;nbsp; if [ &amp;quot;$a&amp;quot; -eq 1 ]&amp;nbsp; &amp;nbsp; 10&amp;nbsp; then&amp;nbsp; &amp;nbsp; 11&amp;nbsp; &amp;nbsp; &amp;nbsp; b=2&amp;nbsp; &amp;nbsp; 12&amp;nbsp; else&amp;nbsp; &amp;nbsp; 13&amp;nbsp; &amp;nbsp; &amp;nbsp; b=1&amp;nbsp; &amp;nbsp; 14&amp;nbsp; fi&amp;nbsp; &amp;nbsp; 15&amp;nbsp; DEBUG echo &amp;quot;b=$b&amp;quot;&amp;nbsp; &amp;nbsp; 16&amp;nbsp; c=3&amp;nbsp; &amp;nbsp; 17&amp;nbsp; DEBUG echo &amp;quot;c=$c&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 在上面所示的DEBUG函数中，会执行任何传给它的命令，并且这个执行过程是可以通过DEBUG变量的值来控制的，我们可以把所有跟调试有关的命令都作为DEBUG函数的参数来调用，非常的方便。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 三. 使用shell的执行选项&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 上一节所述的调试手段是通过修改shell脚本的源代码，令其输出相关的调试信息来定位错误的，那有没有不修改源代码来调试shell脚本的方法呢？答案就是使用shell的执行选项，本节将介绍一些常用选项的用法：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; -n 只读取shell脚本，但不实际执行&lt;br /&gt;
&amp;nbsp; &amp;nbsp; -x 进入跟踪方式，显示所执行的每一条命令&lt;br /&gt;
&amp;nbsp; &amp;nbsp; -c &amp;quot;string&amp;quot; 从strings中读取命令&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;ldquo;- n&amp;rdquo;可用于测试shell脚本是否存在语法错误，但不会实际执行命令。在shell脚本编写完成之后，实际执行之前，首先使用&amp;ldquo;-n&amp;rdquo;选项来测试脚本是否 存在语法错误是一个很好的习惯。因为某些shell脚本在执行时会对系统环境产生影响，比如生成或移动文件等，如果在实际执行才发现语法错误，您不得不手 工做一些系统环境的恢复工作才能继续测试这个脚本。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;ldquo;-c&amp;rdquo;选项使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令。当需要临时测试一小段脚本的执行结果时，可以使用这个选项，如下所示：&lt;br /&gt;
&amp;nbsp; &amp;nbsp; sh -c 'a=1;b=2;let c=$a+$b;echo &amp;quot;c=$c&amp;quot;'&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;quot;-x&amp;quot;选项可用来跟踪脚本的执行，是调试shell脚本的强有力工具。&amp;ldquo;-x&amp;rdquo;选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来，并且在行首显示一个&amp;quot;+&amp;quot;号。 &amp;quot;+&amp;quot;号后面显示的是经过了变量替换之后的命令行的内容，有助于分析实际执行的是什么命令。 &amp;ldquo;-x&amp;rdquo;选项使用起来简单方便，可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 如果把本文前面所述的trap &amp;lsquo;command&amp;rsquo; DEBUG机制与&amp;ldquo;-x&amp;rdquo;选项结合起来，我们 就可以既输出实际执行的每一条命令，又逐行跟踪相关变量的值，对调试相当有帮助。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 仍以前面所述的exp2.sh为例，现在加上&amp;ldquo;-x&amp;rdquo;选项来执行它：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ sh &amp;ndash;x exp2.sh+ trap 'echo &amp;quot;before execute line:$LINENO, a=$a,b=$b,c=$c&amp;quot;' DEBUG++ echo 'before execute line:3, a=,b=,c='before execute line:3, a=,b=,c=+ a=1++ echo 'before execute line:4, a=1,b=,c='before execute line:4, a=1,b=,c=+ '[' 1 -eq 1 ']'++ echo 'before execute line:6, a=1,b=,c='before execute line:6, a=1,b=,c=+ b=2++ echo 'before execute line:10, a=1,b=2,c='before execute line:10, a=1,b=2,c=+ c=3++ echo 'before execute line:11, a=1,b=2,c=3'before execute line:11, a=1,b=2,c=3+ echo endend&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 在上面的结果中，前面有&amp;ldquo;+&amp;rdquo;号的行是shell脚本实际执行的命令，前面有&amp;ldquo;++&amp;rdquo;号的行是执行trap机制中指定的命令，其它的行则是输出信息。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; shell的执行选项除了可以在启动shell时指定外，亦可在脚本中用set命令来指定。 &amp;quot;set -参数&amp;quot;表示启用某选项，&amp;quot;set +参数&amp;quot;表示关闭某选项。有时候我们并不需要在启动时用&amp;quot;-x&amp;quot;选项来跟踪所有的命令行，这时我们可以在脚本中使用set命令，如以下脚本片段所示：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; set -x　　　 #启动&amp;quot;-x&amp;quot;选项 要跟踪的程序段 set +x　　　　 #关闭&amp;quot;-x&amp;quot;选项&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; set命令同样可以使用上一节中介绍的调试钩子&amp;mdash;DEBUG函数来调用，这样可以避免脚本交付使用时删除这些调试语句的麻烦，如以下脚本片段所示：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; DEBUG set -x　　　 #启动&amp;quot;-x&amp;quot;选项 要跟踪的程序段 DEBUG set +x　　　 #关闭&amp;quot;-x&amp;quot;选项&lt;/p&gt;
&lt;p&gt;&amp;nbsp;四. 对&amp;quot;-x&amp;quot;选项的增强&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;quot;-x&amp;quot;执行选项是目前最常用的跟踪和调试shell脚本的手段，但其输出的调试信息 仅限于进行变量替换之后的每一条实际执行的命令以及行首的一个&amp;quot;+&amp;quot;号提示符，居然连行号这样的重要信息都没有，对于复杂的shell脚本的调试来说，还 是非常的不方便。幸运的是，我们可以巧妙地利用shell内置的一些环境变量来增强&amp;quot;-x&amp;quot;选项的输出信息，下面先介绍几个shell内置的环境变量：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $LINENO&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 代表shell脚本的当前行号，类似于C语言中的内置宏__LINE__&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $FUNCNAME&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 函数的名字，类似于C语言中的内置宏__func__,但宏__func__ 只能代表当前所在的函数名，而$FUNCNAME的功能更强大，它是一个数组变量，其中包含了整个调用链上所有的函数的名字，故变量${FUNCNAME [0]}代表shell脚本当前正在执行的函数的名字，而变量${FUNCNAME[1]}则代表调用函数${FUNCNAME[0]}的函数的名字，余 者可以依此类推。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $PS4&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 主提示符变量$PS1和第二级提示符变量$PS2比较常见，但很少有人注意到第四级提 示符变量$PS4的作用。我们知道使用&amp;ldquo;-x&amp;rdquo;执行选项将会显示shell脚本中每一条实际执行过的命令，而$PS4的值将被显示在&amp;ldquo;-x&amp;rdquo;选项输出的每 一条命令的前面。在Bash Shell中，缺省的$PS4的值是&amp;quot;+&amp;quot;号。(现在知道为什么使用&amp;quot;-x&amp;quot;选项时，输出的命令前面有一个&amp;quot;+&amp;quot;号了吧？)。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 利用$PS4这一特性，通过使用一些内置变量来重定义$PS4的值，我们就可以增强&amp;quot;-x&amp;quot;选项的输出信 息。例如先执行export PS4='+{$LINENO:${FUNCNAME[0]}} ', 然后再使用&amp;ldquo;-x&amp;rdquo;选项来执行脚本，就能在每一条实际执行的命令前面显示其行号以及所属的函数名。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 以下是一个存在bug的shell脚本的示例，本文将用此脚本来示范如何用&amp;ldquo;-n&amp;rdquo;以及增强的&amp;ldquo;-x&amp;rdquo;执行选项来调试shell脚本。这个脚本中定义了一个函数isRoot(),用于判断当前用户是不是root用户，如果不是，则中止脚本的执行&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ cat &amp;ndash;n exp4.sh&amp;nbsp; &amp;nbsp; 1&amp;nbsp; #!/bin/bash&amp;nbsp; &amp;nbsp; 2&amp;nbsp; isRoot()&amp;nbsp; &amp;nbsp; 3&amp;nbsp; {&amp;nbsp; &amp;nbsp; 4&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if [ &amp;quot;$UID&amp;quot; -ne 0 ]&amp;nbsp; &amp;nbsp; 5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 1&amp;nbsp; &amp;nbsp; 6&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&amp;nbsp; &amp;nbsp; 7&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0&amp;nbsp; &amp;nbsp; 8&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fi&amp;nbsp; &amp;nbsp; 9&amp;nbsp; }&amp;nbsp; &amp;nbsp; 10&amp;nbsp; isRoot&amp;nbsp; &amp;nbsp; 11&amp;nbsp; if [&amp;quot;$?&amp;quot; -ne 0 ]&amp;nbsp; &amp;nbsp; 12&amp;nbsp; then&amp;nbsp; &amp;nbsp; 13&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; echo &amp;quot;Must be root to run this script&amp;quot;&amp;nbsp; &amp;nbsp; 14&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit 1&amp;nbsp; &amp;nbsp; 15&amp;nbsp; else&amp;nbsp; &amp;nbsp; 16&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; echo &amp;quot;welcome root user&amp;quot;&amp;nbsp; &amp;nbsp; 17&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #do something&amp;nbsp; &amp;nbsp; 18&amp;nbsp; fi&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 首先执行sh &amp;ndash;n exp4.sh来进行语法检查，输出如下：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ sh &amp;ndash;n exp4.shexp4.sh: line 6: syntax error near unexpected token `else'exp4.sh: line 6: `&amp;nbsp; &amp;nbsp; &amp;nbsp; else'&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 发现了一个语法错误，通过仔细检查第6行 前后的命令，我们发现是第4行的if语句缺少then关键字引起的(写惯了C程序的人很容易犯这个错误)。我们可以把第4行修改为if [ &amp;quot;$UID&amp;quot; -ne 0 ]; then来修正这个错误。再次运行sh &amp;ndash;n exp4.sh来进行语法检查，没有再报告错误。接下来就可以实际执行这个脚本了，执行结果如下：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ sh exp4.shexp2.sh: line 11: [1: command not foundwelcome root user&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 尽管脚本没有语法错误了，在执行时却又报告了错误。错误信息还非常奇怪&amp;ldquo;[1: command not found&amp;rdquo;。现在我们可以试试定制$PS4的值，并使用&amp;ldquo;-x&amp;rdquo;选项来跟踪：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; $ export PS4='+{$LINENO:${FUNCNAME[0]}} '$ sh &amp;ndash;x exp4.sh+{10:} isRoot+{4:isRoot} '[' 503 -ne 0 ']'+{5:isRoot} return 1+{11:} '[1' -ne 0 ']'exp4.sh: line 11: [1: command not found+{16:} echo 'welcome root user'welcome root user&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 从输出结果中，我们可以看到脚本实际被执行的语句，该语句的行号以及所属的函数名也被打印出来，从中可以清楚的分析出脚本的执行轨迹以及所调用的函数的内部执行情况。由于执行时是第11行报错，这是一个if语句，我们对比分析一下同为if语句的第4行的跟踪结果：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; +{4:isRoot} '[' 503 -ne 0 ']'+{11:} '[1' -ne 0 ']'&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 可知由于第11行的[号后面缺少了一个空格，导致[号与紧挨它的变量$?的值1被shell解释器看作了一个整体，并试着把这个整体视为一个命令来执行，故有&amp;ldquo;[1: command not found&amp;rdquo;这样的错误提示。只需在[号后面插入一个空格就一切正常了。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; shell中还有其它一些对调试有帮助的内置变量，比如在Bash Shell中还有BASH_SOURCE, BASH_SUBSHELL等一批对调试有帮助的内置变量，您可以通过man sh或man bash来查看，然后根据您的调试目的,使用这些内置变量来定制$PS4，从而达到增强&amp;ldquo;-x&amp;rdquo;选项的输出信息的目的。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 五. 总结&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 现在让我们来总结一下调试shell脚本的过程：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; 首先使用&amp;ldquo;-n&amp;rdquo;选项检 查语法错误，然后使用&amp;ldquo;-x&amp;rdquo;选项跟踪脚本的执行，使用&amp;ldquo;-x&amp;rdquo;选项之前，别忘了先定制PS4变量的值来增强&amp;ldquo;-x&amp;rdquo;选项的输出信息，至少应该令其输出行 号信息(先执行export PS4='+[$LINENO]'，更一劳永逸的办法是将这条语句加到您用户主目录的.bash_profile文件中去)，这将使你的调试之旅更轻松。 也可以利用trap,调试钩子等手段输出关键调试信息，快速缩小排查错误的范围，并在脚本中使用&amp;ldquo;set -x&amp;rdquo;及&amp;ldquo;set +x&amp;rdquo;对某些代码块进行重点跟踪。这样多种手段齐下，相信您已经可以比较轻松地抓出您的shell脚本中的臭虫了。如果您的脚本足够复杂，还需要更强的调 试能力，可以使用shell调试器bashdb，这是一个类似于GDB的调试工具，可以完成对shell脚本的断点设置，单步执行，变量观察等许多功能， 使用bashdb对阅读和理解复杂的shell脚本也会大有裨益。&lt;/p&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Linux创建RAID设备</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2282.aspx" /><id>http://space.kakadoor.com/1923/archive/2282.aspx</id><published>2007-09-27T14:51:01Z</published><updated>2007-09-27T14:51:01Z</updated><content type="html">RAID分硬件RAID和软件RAID, 硬件RAID没甚么说的，用个RAID卡就OK.软件RAID稍微复杂一点。不过有了mdadm命令以后就简单多了。这里我做一个raid0。&lt;br /&gt;
&lt;br /&gt;
工具的选择&lt;br /&gt;
　　有两种:raidtools, mdadm. raidtools命令比较复杂，而且还要自己下载，确定很麻烦。而mdadm一般的linux都羽绒带了。所以推荐用这个工具。&lt;br /&gt;
&lt;br /&gt;
了解RAID&lt;br /&gt;
　　RAID 有五个级别，不过现在的Linux中，软件RAID也不过只有raid0, raid1,raid5.可以自己查相关的资料。&lt;br /&gt;
&lt;br /&gt;
准备硬盘(分区)&lt;br /&gt;
　　用fdisk 命令给硬盘分好区。假如有/dev/sda1,/dev/sdb1, /dev/sdc1可用。&lt;br /&gt;
&lt;br /&gt;
创建RAID&lt;br /&gt;
　　很简单，就一条命令&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mdadm -C /dev/md0 -l0 -n 3 /dev/sda1 /dev/sdb1 /dev/sdc1&lt;br /&gt;
说明：&lt;br /&gt;
-l 就是--level&lt;br /&gt;
-n 就是 --raid-devices&lt;br /&gt;
&lt;br /&gt;
格式化RAID设备&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mkfs /dev/md0&lt;br /&gt;
设置开机自动启动RAID设备　&lt;br /&gt;
生成/etc/mdadm.conf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mdadm -Ds &amp;gt; /etc/mdadm.conf&lt;br /&gt;
&lt;br /&gt;
ARRAY /dev/md0 level=raid0 num-devices=3 UUID=4f34f3fb:9e2b05fe:f4444b83:b159f363&lt;br /&gt;
&amp;nbsp; devices=/dev/sda1,/dev/sdb1,/dev/sdc1&lt;br /&gt;
然后改成如下格式&lt;br /&gt;
&lt;br /&gt;
device /dev/sda1 /dev/sdb1 /dev/sdc1&lt;br /&gt;
ARRAY /dev/md0 level=raid0 num-devices=3 UUID=4f34f3fb:9e2b05fe:f4444b83:b159f363&lt;br /&gt;
&lt;br /&gt;
一切OK,reboot,看看效果如何。&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>收集整理的Linux下的小技巧(一)</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2281.aspx" /><id>http://space.kakadoor.com/1923/archive/2281.aspx</id><published>2007-09-27T14:50:25Z</published><updated>2007-09-27T14:50:25Z</updated><content type="html">1.设置文本方式下的分辩率&lt;br /&gt;
在grub的启动参数中加入vga=xxx&lt;br /&gt;
value mode video ram&lt;br /&gt;
769 640 x 480 x 8 bit (1M)&lt;br /&gt;
785 640 x 480 x 16 bit (1M)&lt;br /&gt;
786 640 x 480 x 24 bit (1M)&lt;br /&gt;
771 800 x 600 x 8 bit (1M)&lt;br /&gt;
788 800 x 600 x 16 bit (1M)&lt;br /&gt;
789 800 x 600 x 24 bit (2M)&lt;br /&gt;
773 1024 x 768 x 8 bit (1M)&lt;br /&gt;
791 1024 x 768 x 16 bit (2M)&lt;br /&gt;
792 1024 x 768 x 24 bit (4M)&lt;br /&gt;
775 1280 x 1024 x 8 bit (2M)&lt;br /&gt;
794 1280 x 1024 x 16 bit (4M)&lt;br /&gt;
795 1280 x 1024 x 24 bit (8M&lt;br /&gt;
796 1600 x 1200 x 8 bit (2M)&lt;br /&gt;
798 1600 x 1200 x 16 bit (4M)&lt;br /&gt;
799 1600 x 1200 x 24 bit (4M) &lt;br /&gt;
&lt;br /&gt;
2.更改桌面分辨率到1024x768(有时无效,不知道为何)&lt;br /&gt;
修改/etc/X11/xorg.conf文件,修改前先备分此文件,以防万一.&lt;br /&gt;
注释掉设置行频的这一行(必须)&lt;br /&gt;
#HorizSync 31.5 - 37.9&lt;br /&gt;
在Section &amp;quot;Screen&amp;quot;的Subsection &amp;quot;Dispaley&amp;quot;中把Modes一行改成&lt;br /&gt;
Modes &amp;quot;1024x768&amp;quot;&lt;br /&gt;
&lt;br /&gt;
3.启动多个X桌面&lt;br /&gt;
用别名&lt;br /&gt;
alias X1='startx -- :1 -bpp 32 -quiet&amp;amp;'&lt;br /&gt;
alias X2='startx -- :2 -bpp 32 -quiet&amp;amp;'&lt;br /&gt;
或者直接用命令&lt;br /&gt;
startx -- :1 -bpp 32 -quiet&amp;amp;&lt;br /&gt;
startx -- :2 -bpp 32 -quiet&amp;amp;&lt;br /&gt;
然后可用CTRL+ALT+F8,CTRL+ALT+F9切换,依此类推到CTRL+ALT+F12&lt;br /&gt;
最简单的方法&lt;br /&gt;
startx -- :1&lt;br /&gt;
&lt;br /&gt;
4.调整显示器&lt;br /&gt;
xvidtune&lt;br /&gt;
&lt;br /&gt;
5.给文件输出加上行号&lt;br /&gt;
nl /etc/passwd&lt;br /&gt;
nl /etc/passwd -s '.'&lt;br /&gt;
在vi中&lt;br /&gt;
:%!nl&lt;br /&gt;
&lt;br /&gt;
6.大小写转换&lt;br /&gt;
cat filename | tr &amp;quot;[a-z]&amp;quot; &amp;quot;[A-Z]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
7.统计文件的行数&lt;br /&gt;
wc -l filename # line&lt;br /&gt;
wc -c filename # char&lt;br /&gt;
wc -w filename # word&lt;br /&gt;
&lt;br /&gt;
8.找回root帐号密码&lt;br /&gt;
进入单用户模式,对于用grub的用户,在启动参数后的kernel一行后加single,&lt;br /&gt;
然后可不用密码进入单用心模式,再在单用户模式下修改你的密码.&lt;br /&gt;
&lt;br /&gt;
9.设置grub密码 &lt;br /&gt;
如上8所述,实际上只要能够接触到机器,如果grub没有密码,就可以轻易地进入机器.&lt;br /&gt;
生成md5码&lt;br /&gt;
输入命令&lt;br /&gt;
grub-md5-crypt&lt;br /&gt;
然后输入法你要设置的密码,grub-md5-crypt就会生成一个字符串xxxxxxxx.&lt;br /&gt;
加入到你在grub配置文件/boot/grub/grub.conf(有的可能用在的/boot/grub/menu.lst)&lt;br /&gt;
在title的下一行加入&lt;br /&gt;
password --md5 xxxxxxxx&lt;br /&gt;
&lt;br /&gt;
10.用命令弹出光驱&lt;br /&gt;
eject # 弹出&lt;br /&gt;
eject -t # 弹回&lt;br /&gt;
很有意思&lt;br /&gt;
&lt;br /&gt;
11.反转文件在内容&lt;br /&gt;
tac /etc/passwd&lt;br /&gt;
在vi中&lt;br /&gt;
%!tac in vi&lt;br /&gt;
&lt;br /&gt;
12.输出文件前n行的几种方法&lt;br /&gt;
head -5 filename&lt;br /&gt;
awk 'NR==1,NR==5 {print $0}' filename&lt;br /&gt;
sed -n '1,5p' filename&lt;br /&gt;
此法可变通到输出文件的其它行&lt;br /&gt;
sed -n '5,$p' filename&lt;br /&gt;
&lt;br /&gt;
13.改变grub背景&lt;br /&gt;
grub背景用的是xpm文件在图片格式,因此你需要把你在图片转换成xpm格式,可用gimp&lt;br /&gt;
在X Window下,输入&lt;br /&gt;
gimp filename&lt;br /&gt;
修改图片的颜色数为14&lt;br /&gt;
right click on image-&amp;gt; image-&amp;gt;mode-&amp;gt;indexed-&amp;gt;color number 14&lt;br /&gt;
然后保存为xpm文件/yourpath/yourimage.xpm&lt;br /&gt;
也可以用命令&lt;br /&gt;
convert yourimage.jpg -colors 14 -geometry 640x480! yourimage.xpm&lt;br /&gt;
修改grub&lt;br /&gt;
在grub中添加&lt;br /&gt;
splashimage (hd0,0)/yourpath/yourimage.xpm&lt;br /&gt;
有的可能是&lt;br /&gt;
splashimage=(hd0,0)/yourpath/yourimae.xpm&lt;br /&gt;
分区(hdx,y),根据你的具体情况而定.另外也可以把图片压缩为.gz格式.&lt;br /&gt;
&lt;br /&gt;
14.ssh技巧&lt;br /&gt;
(1)不用login远程执行命令&lt;br /&gt;
格式:&lt;br /&gt;
ssh hostname command&lt;br /&gt;
如:&lt;br /&gt;
ssh hostname ls /usr/share/doc &lt;br /&gt;
(2)远程文件拷贝scp,windows下用pscp&lt;br /&gt;
scp localfile username@hostname:/newfilename&lt;br /&gt;
&lt;br /&gt;
15.Linux下使用NFS QuickStart&lt;br /&gt;
修改/etc/exports就可.如果不考虑安全问题,可在该文件中加入&lt;br /&gt;
/ master(rw) trusty(rw,no_root_squash)&lt;br /&gt;
再执行&lt;br /&gt;
service nfs restart&lt;br /&gt;
然后就可在远程主机上mount它了&lt;br /&gt;
mount hostname:/ /media&lt;br /&gt;
&lt;br /&gt;
16.ftp自动登陆下载shell脚本&lt;br /&gt;
SRC_FTP_SERVER=hostname&lt;br /&gt;
SRC_FTP_USER=anonymous&lt;br /&gt;
SRC_FTP_PASSWD=user@xxx.com&lt;br /&gt;
SRC_FTP_DIR=/diskimages/&lt;br /&gt;
echo &amp;quot;open $SRC_FTP_SERVER&lt;br /&gt;
user $SRC_FTP_USER $SRC_FTP_PASSWD&lt;br /&gt;
lcd ${TMP_DIR}&lt;br /&gt;
cd $SRC_FTP_DIR&lt;br /&gt;
binary&lt;br /&gt;
get $SRC_FTP_DIR/filename &amp;quot; | ftp -n 1&amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
17.命令下发送邮件&lt;br /&gt;
cat &amp;quot;mail content&amp;quot; | mail &lt;a href="mailto:yourname@domain.com"&gt;yourname@domain.com&lt;/a&gt; -s &amp;quot;mail title&amp;quot;&lt;br /&gt;
cat /dir/file_conent | mail &lt;a href="mailto:yourname@domain.com"&gt;yourname@domain.com&lt;/a&gt; -s &amp;quot;mail title&amp;quot; &lt;br /&gt;
带附件,用mutt&lt;br /&gt;
cat &amp;quot;mail content&amp;quot; | mutt &lt;a href="mailto:yourname@domain.com"&gt;yourname@domain.com&lt;/a&gt; -s &amp;quot;mail title&amp;quot; -a attach_file&lt;br /&gt;
cat /dir/file_conent | mutt &lt;a href="mailto:yourname@domain.com"&gt;yourname@domain.com&lt;/a&gt; -s &amp;quot;mail title&amp;quot; -a attach_file &lt;br /&gt;
&lt;br /&gt;
18.tar打包时去掉某些目录或文件&lt;br /&gt;
cd /&lt;br /&gt;
tar cvf usr.tar usr --exclude usr/share --exclude /usr/bin/unzip&lt;br /&gt;
添加排队目录时不要加/根符号&lt;br /&gt;
&lt;br /&gt;
19.显示xx天前/后的日期&lt;br /&gt;
date -d &amp;quot;now&amp;quot; #同date&lt;br /&gt;
date -d &amp;quot;today&amp;quot; #同date&lt;br /&gt;
date -d &amp;quot;45 days ago&amp;quot; # 45天前&lt;br /&gt;
date -d &amp;quot;45 days&amp;quot; # 45天后&lt;br /&gt;
&lt;br /&gt;
20.Linux使用*.rar文件&lt;br /&gt;
安装rar软件包(google一下就知道了)&lt;br /&gt;
压缩&lt;br /&gt;
rar a usr_share.rar usr/share&lt;br /&gt;
解开&lt;br /&gt;
rar x usr_share.rar /root &lt;br /&gt;
&lt;br /&gt;
21.用命令截屏&lt;br /&gt;
import -window root hello.jpg&lt;br /&gt;
&lt;br /&gt;
22.非交互方式文本转html&lt;br /&gt;
vim -c &amp;quot;:TOhtml&amp;quot; -c &amp;quot;:wq %&amp;quot; -c &amp;quot;:q&amp;quot; filename&lt;br /&gt;
&lt;br /&gt;
23.其它 &lt;br /&gt;
监视文件的变化&lt;br /&gt;
tail -f /var/log/messages&amp;nbsp; &lt;br /&gt;
命令行下HTML相关命令 &lt;br /&gt;
wget &lt;a target="_blank" href="http://www.xxxx.com/filename.tar.gz"&gt;www.xxxx.com/filename.tar.gz&lt;/a&gt; #下载文件&lt;br /&gt;
lynx &lt;a target="_blank" href="http://www.163.com/"&gt;www.163.com&lt;/a&gt; #命令行看网页&lt;br /&gt;
htmlview &lt;a target="_blank" href="http://www.163.com/"&gt;www.163.com&lt;/a&gt; #命令行看网页 &lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>收集整理的Linux下的小技巧(二)</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2280.aspx" /><id>http://space.kakadoor.com/1923/archive/2280.aspx</id><published>2007-09-27T14:49:45Z</published><updated>2007-09-27T14:49:45Z</updated><content type="html">1.清空文件&lt;br /&gt;
&lt;br /&gt;
:&amp;gt;filename&lt;br /&gt;
&amp;gt; filename&lt;br /&gt;
echo &amp;gt; filename&lt;br /&gt;
&lt;br /&gt;
2.无需输入密码使用ssh密钥登录&lt;br /&gt;
&lt;br /&gt;
ssh-keygen -b 1024 -t rsa&lt;br /&gt;
ssh server &amp;quot;mkdir .ssh; chmod 0700 .ssh&amp;quot;&lt;br /&gt;
scp ~/.ssh/id_rsa.pub server:~/.ssh/authorized_keys&lt;br /&gt;
这样就不在提示密码，直接可以登录server了&lt;br /&gt;
对文件复制、同步等操作都比较方便&lt;br /&gt;
&lt;br /&gt;
3.vncserverq启动指定的桌面&lt;br /&gt;
&lt;br /&gt;
vncserver :23&lt;br /&gt;
&lt;br /&gt;
4.更改整个目录的用户组&lt;br /&gt;
&lt;br /&gt;
find . -print -exec chown group.user '{}' ;&lt;br /&gt;
chown . group.usr -R&lt;br /&gt;
&lt;br /&gt;
5.更改提示符颜色&lt;br /&gt;
&lt;br /&gt;
larry 教我的，谢谢larry.&lt;br /&gt;
&lt;br /&gt;
PS1='[e[1;31;44m]root[e[0m]@H# '&lt;br /&gt;
ESC[code;code;&amp;hellip;&amp;hellip;codem&lt;br /&gt;
用下面所列的数码替换code所在位置.注意该命令中最后的&lt;br /&gt;
字母必须是小写的m。&lt;br /&gt;
a 文本属性&lt;br /&gt;
0 放弃任何属性(屏幕恢复到黑底白字)&lt;br /&gt;
1 粗体显示&lt;br /&gt;
4 下划线(只用于单色显示适配器)&lt;br /&gt;
5 闪烁显示&lt;br /&gt;
7 相反显示&lt;br /&gt;
8 对比显示&lt;br /&gt;
b 前景颜色&lt;br /&gt;
30 黑 31 红 32 绿 33 黄&lt;br /&gt;
34 蓝 35 品红 36 青 37 白&lt;br /&gt;
c 背景颜色&lt;br /&gt;
40 黑 41 红 42 绿 43 黄&lt;br /&gt;
44 蓝 45 品红 46 青 47&lt;br /&gt;
&lt;br /&gt;
6.查看重启记录&lt;br /&gt;
&lt;br /&gt;
last&lt;br /&gt;
&lt;br /&gt;
7.根据网络上的机器调整时间&lt;br /&gt;
&lt;br /&gt;
ntpdate ntp-server&lt;br /&gt;
network time protocal,ntp-server 需要打开ntpd&lt;br /&gt;
&lt;br /&gt;
8.刻录ISO&lt;br /&gt;
&lt;br /&gt;
mkisofs -o X_lfs.iso -J -R `pwd`/X_lfs&lt;br /&gt;
&lt;br /&gt;
9.浮点运算&lt;br /&gt;
&lt;br /&gt;
bc&lt;br /&gt;
echo &amp;quot;2.5*3.4&amp;quot; |bc&lt;br /&gt;
小数位数为2&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;scale=2; 5/3&amp;quot; |bc&lt;br /&gt;
dc&lt;br /&gt;
&lt;br /&gt;
10.监视某个命令的执行结果&lt;br /&gt;
&lt;br /&gt;
watch -n1 command&lt;br /&gt;
watch -n1 date&lt;br /&gt;
&lt;br /&gt;
11. 查看NFS Server上可以挂接的目录&lt;br /&gt;
&lt;br /&gt;
showmount -e hostname&lt;br /&gt;
showmount hostname&lt;br /&gt;
&lt;br /&gt;
12. 修改时区&lt;br /&gt;
&lt;br /&gt;
在/usr/share/zoneinfo/目录下,找到期望的时区,拷贝覆盖/etc/localtime&lt;br /&gt;
&lt;br /&gt;
13.查看硬件信息&lt;br /&gt;
&lt;br /&gt;
vi /etc/sysconfig/hwconf&lt;br /&gt;
&lt;br /&gt;
14.查看分区类型&lt;br /&gt;
&lt;br /&gt;
df -T&lt;br /&gt;
&lt;br /&gt;
15. 启动参数 pci=noacpi apic=0 可以加到linux rescue后面&lt;br /&gt;
&lt;br /&gt;
16.查看硬盘的速度&lt;br /&gt;
&lt;br /&gt;
hdparm -tT /dev/sda&lt;br /&gt;
&lt;br /&gt;
17.查看计算机是否支持VT&lt;br /&gt;
&lt;br /&gt;
egrep &amp;quot;^flags.*(vmx|svm)&amp;quot; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
18. 解开RPM包中的文件&lt;br /&gt;
&lt;br /&gt;
rpm2cpio rpmname.rpm | cpio --extract --make-directories&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>收集整理的Linux下的小技巧(三)</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2279.aspx" /><id>http://space.kakadoor.com/1923/archive/2279.aspx</id><published>2007-09-27T14:49:11Z</published><updated>2007-09-27T14:49:11Z</updated><content type="html">&lt;div class="tpc_content"&gt;1.远程copy大文件&lt;br /&gt;
&lt;br /&gt;
利用ssh和tar,一边压缩，一边copy. 当文件大小上G了以后比较有用.&lt;br /&gt;
如果你要copy的文件名为big_file.img,则可以用如下命令.&lt;br /&gt;
tar -czvf - big_file.img | ssh dest_host &amp;quot;cd /share/; tar -xvf&amp;quot;&lt;br /&gt;
copy 到dest_host的/share/目录.&lt;br /&gt;
&lt;br /&gt;
2.文件自动备份&lt;br /&gt;
&lt;br /&gt;
用rsync,查一下 rsync的manual就会了，很方便也比较简单。我用rsync来备份几百G的数据依然工作的非常好。&lt;br /&gt;
用rsync还有几个原因:&lt;br /&gt;
增量式备分&lt;br /&gt;
远程文件可进行一边压缩一边备分&lt;br /&gt;
&lt;br /&gt;
3.Linux X Window下连接Windows的桌面&lt;br /&gt;
&lt;br /&gt;
1).用rdesktop命令,请先安装rdestktop的RPM包,然后把Windows的远程桌面打开&lt;br /&gt;
2).用VNC，在Windows下安装 realvnc的server，然后在Linux下用vncviewer命令连接Windows的桌面&lt;br /&gt;
&lt;br /&gt;
4.用wget下载整个网站&lt;br /&gt;
&lt;br /&gt;
wget -r -p -np -k &lt;a target="_blank" href="http://www.shaohui.org/"&gt;http://www.shaohui.org&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
5.解决vim中文乱码问题&lt;br /&gt;
&lt;br /&gt;
把一下配置copy到你的vimrc里面,然后问题就解决了,另外对于中文的显示，pietty比putty做得更好。推荐一下。&lt;br /&gt;
&lt;br /&gt;
set fileencodings=utf-8,cp936,big5,latin1&lt;br /&gt;
an 20.4109 &amp;amp;Edit.-SEP6- &amp;lt;Nop&amp;gt;&lt;br /&gt;
an 20.4109.10 &amp;amp;Edit.Encoding.&amp;amp;GBK :set encoding=gbk&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4109.11 &amp;amp;Edit.Encoding.&amp;amp;Big5 :set encoding=big5&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4109.12 &amp;amp;Edit.Encoding.&amp;amp;UTF-8 :set encoding=utf-8&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4119.10 &amp;amp;Edit.Fileencodings.&amp;amp;GBK :set fileencodings=gbk&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4119.11 &amp;amp;Edit.Fileencodings.&amp;amp;Big5 :set fileencodings=big5&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4119.12 &amp;amp;Edit.Fileencodings.&amp;amp;UTF-8 :set fileencodings=utf-8&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4139 &amp;amp;Edit.gb\ \ convert.gb-&amp;gt;big5 :%!autogb -i gb -o big5&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4139 &amp;amp;Edit.gb\ \ convert.gb-&amp;gt;utf8 :%!autogb -i gb -o utf8&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4149 &amp;amp;Edit.big5\ \ convert.big5-&amp;gt;gb :%!autogb -i big5 -o gb&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4149 &amp;amp;Edit.big5\ \ convert.big5-&amp;gt;utf8 :%!autogb -i big5 -o utf8&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4159 &amp;amp;Edit.utf8\ \ convert.utf8-&amp;gt;gb :%!autogb -i utf8 -o gb&amp;lt;CR&amp;gt;&lt;br /&gt;
an 20.4159 &amp;amp;Edit.utf8\ \ convert.utf8-&amp;gt;big5 :%!autogb -i utf8 -o big5&amp;lt;CR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. 字符集转换&lt;br /&gt;
&lt;br /&gt;
也是用来解决中文乱码问题，尤其是用wget下载网页的时候出现的乱码,tip 5解决了用vim的乱码问题，但是用cat命令查看问题的时候依然乱码。最近想写个脚本去baidu mp3去抓歌曲，顺便解决了这个问题。&lt;br /&gt;
iconv -f gbk -t utf8 srcfile &amp;gt; dstfile&lt;br /&gt;
&lt;br /&gt;
7. Shell中多行变一行的方法&lt;br /&gt;
&lt;br /&gt;
一直都用vim来做，就是太ugly了一些。&lt;br /&gt;
vi filename -c &amp;quot;:%s/\n//g&amp;quot; -c &amp;quot;:x&amp;quot;&lt;br /&gt;
google了一把，有意外的收获&lt;br /&gt;
文本内容：&lt;br /&gt;
$cat test.txt&lt;br /&gt;
001&lt;br /&gt;
002&lt;br /&gt;
003&lt;br /&gt;
004&lt;br /&gt;
005&lt;br /&gt;
006&lt;br /&gt;
0000999&lt;br /&gt;
&lt;br /&gt;
需要格式化成：&lt;br /&gt;
001 002 003 004 005 006 0000999&lt;br /&gt;
&lt;br /&gt;
方法一、最好的答案&lt;br /&gt;
xargs &amp;lt; test.txt&lt;br /&gt;
&lt;br /&gt;
方法二、整个文件读入一个变量，然后直接打印，也很容易理解&lt;br /&gt;
a=`cat test.txt`;echo $a&lt;br /&gt;
方法三、使用tr把换行符替换成空格：&lt;br /&gt;
tr -s &amp;quot;\n&amp;quot; &amp;quot; &amp;quot; &amp;lt; test.txt;echo&lt;br /&gt;
&lt;br /&gt;
方法四、使用sed，把整个文件读入保持空间，处理最后一行的时候，替换所有换行符为空格，打印：&lt;br /&gt;
sed -n '1h;1!H;${g;s/\n/ /g;p;}' test.txt&lt;br /&gt;
&lt;br /&gt;
方法五、使用awk，读入一行打印一行，但是不打印换行符，最后一行多打印一个换行符：&lt;br /&gt;
awk '{printf(&amp;quot;%s &amp;quot;,$0);}END{print}' test.txt&lt;br /&gt;
&lt;br /&gt;
方法六、使用paste命令格式化打印，-d指定分隔符，-s表示合并成一行：&lt;br /&gt;
paste -d&amp;quot; &amp;quot; -s - &amp;lt; test.txt&lt;br /&gt;
&lt;br /&gt;
方法七、使用pr格式化打印，-s指定分隔符，-50指定每行打印多少域，-t指定取消页眉、页尾：&lt;br /&gt;
pr -50t -s&amp;quot; &amp;quot; test.txt&lt;br /&gt;
&lt;br /&gt;
8.Linux下的多线程下载工具&lt;br /&gt;
&lt;br /&gt;
wget是单线程下载，所以速度很慢。 prozilla是个不错的选择，有命令行的，也有GUI版本的，下载速度超级快。&lt;br /&gt;
官方网站：&lt;a target="_blank" href="http://prozilla.genesys.ro/"&gt;http://prozilla.genesys.ro/&lt;/a&gt;&lt;br /&gt;
安装很简单， 我用source自己make的。&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Linux下Mercurial (hg)配置说明</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2278.aspx" /><id>http://space.kakadoor.com/1923/archive/2278.aspx</id><published>2007-09-27T14:48:38Z</published><updated>2007-09-27T14:48:38Z</updated><content type="html">这个工具在国内很少人使用，所以中文资料匮乏．只有官方的website上有一些少得可怜的中文资料了．不过总体上来说，hg还是比较好用的。&lt;br /&gt;
&lt;br /&gt;
这里绍一下hg服务器的配置。关于hg在基本用法参见mercrial的官方网站。在做以下操作时，请到 &lt;a target="_blank" href="http://www.selenic.com/mercurial/"&gt;http://www.selenic.com/mercurial/&lt;/a&gt;下载安装hg.&lt;br /&gt;
&lt;br /&gt;
1.建立用户hgrepo&lt;br /&gt;
&lt;br /&gt;
其它用户将用这个账户用hg服务器push代码。&lt;br /&gt;
&lt;br /&gt;
useradd hgrepo -d /home/hgrepo # add user hgrepo&lt;br /&gt;
passwd hgrepo&lt;br /&gt;
&lt;br /&gt;
2.建立hg代码仓库&lt;br /&gt;
&lt;br /&gt;
如果代码仓库名称为project.hg,则可用如下命令。&lt;br /&gt;
&lt;br /&gt;
cd /home/hgrepo&lt;br /&gt;
mkdir project.hg&lt;br /&gt;
cd project.hg&lt;br /&gt;
hg init # 初始化代码仓库&lt;br /&gt;
建立一个测试文件&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hello, mercurial&amp;quot; &amp;gt; sample.txt&lt;br /&gt;
hg add&amp;nbsp; # add&lt;br /&gt;
hg ci&amp;nbsp; &amp;nbsp; # check in&lt;br /&gt;
&lt;br /&gt;
3. 打开http&lt;br /&gt;
&lt;br /&gt;
打开一个端口，让远程用户可以clone仓库中的代码.&lt;br /&gt;
在打开端口前请确定文件权限正确。&lt;br /&gt;
&lt;br /&gt;
更改文件权限&lt;br /&gt;
chown hgrepo.hgrepo /home/hgrepo/project.hg -R&lt;br /&gt;
chmod og+rw /home/hgrepo/project.hg -R&lt;br /&gt;
打开端口&lt;br /&gt;
&lt;br /&gt;
cd&amp;nbsp; /home/hgrepo/project.hg -R&lt;br /&gt;
hg serve -p 8002 &amp;amp;&lt;br /&gt;
可将上面两行加入/etc/rc.local这样就可以在开机的时候自动运行了。&lt;br /&gt;
&lt;br /&gt;
4.使用hg&lt;br /&gt;
&lt;br /&gt;
完成步骤3以后，我们就可以使用了。&lt;br /&gt;
&lt;br /&gt;
clone到本地&lt;br /&gt;
&lt;br /&gt;
例如你的服务器的名字为test.&lt;br /&gt;
&lt;br /&gt;
hg clone &lt;a target="_blank" href="http://test:8002/"&gt;http://test:8002&lt;/a&gt;&lt;br /&gt;
然后在本地目录就会出现一个project.hg的一个copy.&lt;br /&gt;
&lt;br /&gt;
修改Client端的配置&lt;br /&gt;
&lt;br /&gt;
更改.hg/hgrc，加上default-push和username&lt;br /&gt;
&lt;br /&gt;
[paths]&lt;br /&gt;
default = &lt;a target="_blank" href="http://test:8002/"&gt;http://test:8002&lt;/a&gt;&lt;br /&gt;
default-push = ssh://hgrepo@test//home/hgrepo/project.hg/&lt;br /&gt;
[ui]&lt;br /&gt;
username=shaohui.zheng&lt;br /&gt;
这样你就可用hg push 向服务器提交code了。这时服务器会问你passward,这个password就是用户hgrepo的password.&lt;br /&gt;
&lt;br /&gt;
Good Luck.&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Linux下非常实用的命令行工具</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2277.aspx" /><id>http://space.kakadoor.com/1923/archive/2277.aspx</id><published>2007-09-27T14:48:05Z</published><updated>2007-09-27T14:48:05Z</updated><content type="html">首先，这是一个确凿的事实，许多IT专业人士使用Linux命令行，即使在GUI也可用的情况下。嘿，我们的第一个Linux 命令行指南的点击量超过了5万次。但是让我们听一听来自IT专家的理由，在这个案例中，我们倾听来自工程部gotalk高级技术专家David Witham的理由。&lt;br /&gt;
&lt;br /&gt;
　　&amp;ldquo;我就靠着命令行为生。命令行给你对你所做的事情和需要完成的事情的最终控制权。如果没有命令来完成的话，你可以编写脚本或者管线来完成。使用GUI的话，所见即所得。你通常不能再构建你自己的GUI附件了。一个大的好处就是远程访问。使用命令行进行远程访问通常要容易得多，它占用的带宽比终端服务或者其他的图形化远程访问方式更少。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　Joe Klemmer:&lt;br /&gt;
&lt;br /&gt;
　　1 expect：&amp;ldquo;我使用expect来完成许多通常需要反复执行的需要很多时间的系统管理任务;类似在我的桌面电脑和服务器之间移动文件这样的事情就可以用expect来完成。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　2 lft：&amp;ldquo;lft就像是类固醇的追踪路由。你可以获得比追踪路由更多得多的信息，用于调试连接或者只是用来寻找机器或者系统在哪里。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　3 mc：&amp;ldquo;它是最好的文件管理器。自从我在DOS上使用了Norton Commander，从DOS到Linux的转换变得如此轻松。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　David Witham:&lt;br /&gt;
&lt;br /&gt;
　　4 sdiff：&amp;ldquo;sdiff对2个文本文件之间的差别产生对人类友好的描述。它将文件分列两侧，使用符号来显示只在左边文件中的行，还有2个文件之间有差异的行，还有只在右边文件存在的行。它的结果阅读起来比diff的输出要容易得多。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　Jim Reem:&lt;br /&gt;
&lt;br /&gt;
　　5 xargs：&amp;ldquo;xargs从标准输出的数据中创建命令行。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　6 for, while：&amp;ldquo;for, while用于&amp;lsquo;在一列选项中循环，对每个选项都完成一定的动作。&amp;rsquo;&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　7 read：用来&amp;ldquo;将标准输入的文本行读入shell变量，以便以后的处理&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　8 sort：用来&amp;ldquo;将文本按照字母或者数字顺序进行排列;支持多个排列关键字。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　9 uniq：用来&amp;ldquo;删除列表中重复的行&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　10 tr：用来&amp;ldquo;转换或者删除来自文本流的字符&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　11 od：用来&amp;ldquo;将二进制文件以十进制(或者十六进制)存储&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　12 wc：用来&amp;ldquo;统计文件中的字数&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　13 top：&amp;ldquo;好像vmstat，获得关于系统运行情况的视图，了解哪个进程占用了全部的内存。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　14 ps：&amp;ldquo;了解某个进程的细节&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　Christian P. Roberts:&lt;br /&gt;
&lt;br /&gt;
　　15 date：&amp;ldquo;在制订基准的时候，放在脚本中进行调用，以便输出当前的信息，很有用&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　16 env：&amp;ldquo;在解决dotfiles的麻烦的时候，用另外一个账号来查看环境变量。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　17 ln：&amp;ldquo;啊&amp;hellip;&amp;hellip;软链接是在网站上工作的必需品。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　18 mget：&amp;ldquo;用得不是非常多了，但是它在用一个命令处理多个文件方面确实不错。&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　19 nslookup：计算机的真实名字是什么&amp;hellip;&amp;hellip;或者&amp;ldquo;到那里去是否安全?&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
　　20 passwd：通常让其他人发送这个命令来设置一个我临时使用的密码。&lt;br /&gt;
&lt;br /&gt;
　　21 ps：通常用于连接&amp;ldquo;kill&amp;rdquo;命令&lt;br /&gt;
&lt;br /&gt;
　　22 uname：当在不同的计算机上工作的时候很有帮助，因为这些计算机在操作系统层面可能不同步。&lt;br /&gt;
&lt;br /&gt;
　　23 whoami：是的，我是谁&amp;hellip;&amp;hellip;意思就是&amp;ldquo;我在以什么身份运行?&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>如何制作Linux系统的安装光盘？</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2276.aspx" /><id>http://space.kakadoor.com/1923/archive/2276.aspx</id><published>2007-09-27T14:47:28Z</published><updated>2007-09-27T14:47:28Z</updated><content type="html">如何制作安装磁盘?&lt;br /&gt;
&lt;br /&gt;
　　你可以使用两中方法制作安装磁盘。在M$-DOS下，可以使用专门为其开发的rawrite命令（安装光盘 dosutils下），将boot.img（安装光盘images下）映像文件传输到软盘上；在linux下可以用命令dd，但不要把软驱设备mount 入系统。具体语法如下：&lt;br /&gt;
&lt;br /&gt;
　　e:&amp;gt;e:dosutilsrawrite&lt;br /&gt;
&lt;br /&gt;
　　Enter disk images source file name: &amp;hellip;&amp;hellip;imagesboot.img&lt;br /&gt;
&lt;br /&gt;
　　Enter target diskette drive: a:&lt;br /&gt;
&lt;br /&gt;
　　please insert a formatted diskette into drive A and press [Enter]&lt;br /&gt;
&lt;br /&gt;
　　或者&lt;br /&gt;
&lt;br /&gt;
　　# dd if=boot.img of=/dev/fd0 bs=1440K&lt;br /&gt;
&lt;br /&gt;
　　另注：boot.img基于光盘安装，bootnet.img基于网络安装，pcmcia.img和pcmciaadd.img基于PCMCIA引导盘的安装。rawrite工具只接受8.3类（短文件名.三扩展名）！&lt;br /&gt;
&lt;br /&gt;
　　在安装的时候我错过了制作启动盘，制作bootdisk方法。&lt;br /&gt;
&lt;br /&gt;
　　命令uname -a可以让你看到你的系统内核版本是多少，一般表示为&amp;hellip;&amp;hellip;kernel 2.x.xx-xx&amp;hellip;&amp;hellip;，然后你可以把一张空白的（当然，有数据资料的也可以，呵）软盘放到软驱里去，千万不要习惯地mount上软驱哟！直接打命令 mkbootdisk &amp;mdash;&amp;mdash;device /dev/fd0 2.x.xx-xx 就可以了。&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Ubuntu Linux系统常见问题解决方法集锦</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2275.aspx" /><id>http://space.kakadoor.com/1923/archive/2275.aspx</id><published>2007-09-27T14:46:52Z</published><updated>2007-09-27T14:46:52Z</updated><content type="html">一．系统问题&lt;br /&gt;
&lt;br /&gt;
　　1.系统无法启动&lt;br /&gt;
&lt;br /&gt;
　　可能问题是MBR受损或GRUB错误。可考虑两种方案：1 进入救援模式rescue mode，编辑/boot/grub/下的menu.lst 。2 修复MBR，备份MBR：dd if=/dev/had of=MBR-backup bs=512 count=1 ,恢复MBR：dd if=MBR-backup of=/dev/had bs=512 count=1 .&lt;br /&gt;
&lt;br /&gt;
　　2.启动到ubuntu logo时，卡机&lt;br /&gt;
&lt;br /&gt;
　　解决方案是编辑/boot/grub/menu.lst，找到此行：kernel /boot/vmlinz-2.6.15-10 root=/dev/hda1 ro quiet splash ,删掉splash ，重启后就不会出现logo.&lt;br /&gt;
&lt;br /&gt;
　　3.开机无法登陆图形界面&lt;br /&gt;
&lt;br /&gt;
　　此状况大多是由于X-server配置有误，需重新配置。配置文件: /etc/X11/xorg.conf .运行Ｘ配置过程：sudo dpkg-reconfigure xserver-xorg&lt;br /&gt;
&lt;br /&gt;
　　4.如何添加字体&lt;br /&gt;
&lt;br /&gt;
　　按Alt+F2键(功能类似ＭＳwindows中的&amp;lsquo;Win+R&amp;rsquo;)，出现&amp;lsquo;Run Application&amp;rsquo;对话框，从中输入fonts:///,然后运行会弹出字体文件夹，将要添加的字体拖进此文件夹即可。注意，添加的字体仅对当前用户有效。&lt;br /&gt;
&lt;br /&gt;
　　5.如何测试ＩＳＯ文件是否完整&lt;br /&gt;
&lt;br /&gt;
　　Command line : md5sum file_name&lt;br /&gt;
&lt;br /&gt;
　　将产生的３２位字符与文件附带的３２位验证码进行比较。&lt;br /&gt;
&lt;br /&gt;
　　6.如何察看文件夹中的隐藏文件&lt;br /&gt;
&lt;br /&gt;
　　单击文件浏览器(File Browser)中的&amp;ldquo;View&amp;rdquo;(视图)　&amp;egrave;&amp;ldquo;Show Hidden Files&amp;rdquo;(显示隐藏文件)，此时隐藏文件就会显示出来。也可以使用快捷键 &amp;ldquo;Ctrl+H&amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
　　7.图形桌面停止响应，如何处理&lt;br /&gt;
&lt;br /&gt;
　　两种解决方案：１　同时按下Alt+Ctrl+Backspace　此时将重启Ｘ-Windows. 2 按下Alt+F2，跳转到终端，登陆后运行sudo /etc/init.d/gdm stop,将关闭Ｘ-window而进入test-mode.然后再键入sudo /etc/init.d/gdm start，将重新启动X-window.&lt;br /&gt;
&lt;br /&gt;
　　8.如何释放磁盘空间&lt;br /&gt;
&lt;br /&gt;
　　首先，清空垃圾筒(Trash)中的内容，Trash在桌面的最右下角，点右键清空即可。&lt;br /&gt;
&lt;br /&gt;
　　其次，清理包缓存，每当由Synaptic或者自动升级管理器下载包时，该包将会被保存在/var/cache/apt/archives/ 下。通过运行以下命令将会在不影响系统情况下清除掉这些包。 sudo apt-get clean&lt;br /&gt;
&lt;br /&gt;
　　9.安装Windows后，Ubuntu不能启动&lt;br /&gt;
&lt;br /&gt;
　　原因是Windows将ＭＢＲ重写，导致系统无法从中读取有关Ubuntu的启动信息。解决方法是，将系统由ＣＤ启动，进入Rescue 模式，按回车键选择键盘布局和语言，之后会得到 有关硬盘分区的列表，选择安装有Ubuntu的分区，按回车。待出现shell提示符后输入 &amp;ldquo;grub-install /dev/hda&amp;rdquo; 将GRUB安装到硬盘。等待过程结束至输出&amp;ldquo;install finished&amp;rdquo;，然后输入&amp;ldquo;exit&amp;rdquo;重启计算机。&lt;br /&gt;
&lt;br /&gt;
　　10.忘记系统密码&lt;br /&gt;
&lt;br /&gt;
　　重启计算机，待看到GRUB时&lt;br /&gt;
&lt;br /&gt;
　　二．应用软件&lt;br /&gt;
&lt;br /&gt;
　　１. 无法关闭程序窗口&lt;br /&gt;
&lt;br /&gt;
　　利用xkill关闭。按下Alt+F2，输入xkill并按回车，此时鼠标变成一个小骷髅头的形状，单击要关闭的窗口即可。&lt;br /&gt;
&lt;br /&gt;
　　２．播放ＤＶＤ画面抖动和跳跃&lt;br /&gt;
&lt;br /&gt;
　　此状况多数是由于ＤＶＤ伺服器的ＤＭＡ模式没有启动，启动这种模式即可。&lt;br /&gt;
&lt;br /&gt;
　　Sudo hdparm /dev/sdc | grep dma&lt;br /&gt;
&lt;br /&gt;
　　如果ＤＭＡ没有启动，会看到　using_dma = 0 (off)&lt;br /&gt;
&lt;br /&gt;
　　要开启ＤＭＡ模式，运行 sudo hdparm &amp;ndash;d 1 /dev/sdc&lt;br /&gt;
&lt;br /&gt;
　　此时重新播放ＤＶＤ，若问题解决，应修改/etc/hdparm.conf并添加如下代码块:&lt;br /&gt;
&lt;br /&gt;
　　/dev/hdc {&lt;br /&gt;
&lt;br /&gt;
　　dma = on&lt;br /&gt;
&lt;br /&gt;
　　}&lt;br /&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Redhat系统下三种主要的软件包安装方法</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2274.aspx" /><id>http://space.kakadoor.com/1923/archive/2274.aspx</id><published>2007-09-27T14:43:51Z</published><updated>2007-09-27T14:43:51Z</updated><content type="html">&lt;p&gt;1.通过RPM软件包来安装&lt;br /&gt;
&lt;br /&gt;
　　说起RPM(REDHAT Package Management)标准的软件包，大家可能都会想起大名鼎鼎的REDHAT公司，正是RPM软件包发行方式的出现，使Linux中的应用软件安装变得简单。如果用户想安装按RPM方式发行的软件，只需简单地输入命令&amp;ldquo;rpm -ivh xxx.rpm&amp;rdquo;即可。&lt;br /&gt;
&lt;br /&gt;
　　比如用户想安装 OpenOffice.org-1.0.1.rpm软件包，只需输入命令&amp;ldquo;rpm -ivh OpenOffice.org-1.0.1.rpm&amp;rdquo;即可。RPM软件包发行方式的另一个优点是它能够方便地对已经安装的RPM软件包进行删除，只要使用 &amp;ldquo;rpm -e OpenOffice.org-1.0.1&amp;rdquo;命令就能将刚才安装的OpenOffice.org-1.0.1.rpm从硬盘上安全永久地删除。如果你是在 X-Window环境中安装/删除软件，那便有更好的办法，如果使用的是KDE，可以使用KDE自带的Kpackage程序来对软件进行添加或删除，如果是使用GNOME，则可以使用Gnorpm程序对软件进行管理。这两个程序都很像微软Windows中的&amp;ldquo;添加/删除程序&amp;rdquo;功能。以RPM软件包发行方式的软件是最容易安装和管理的，建议大家以后多采用这种模式来管理软件。&lt;br /&gt;
&lt;br /&gt;
　　2.Tar.gz(Tgz)软件包的安装&lt;br /&gt;
&lt;br /&gt;
　　以 Tar.gz为扩展名的软件包，是用Tar程序打包并用Gzip程序压缩的软件包。要安装这种软件包，需要先对软件包进行解压缩，使用&amp;ldquo;tar -zxfv　filename.tar.gz&amp;rdquo;可以对软件包进行解压缩，解压缩所得的文件在以Filename为名的目录中。进入该目录，可以看到解压缩出来的文件了。&lt;br /&gt;
&lt;br /&gt;
　　各种软件都有不同的安装方法，但是一般每个软件包解压缩后都有Install和Readme文件，帮助文件中会有详细的安装指导。以Tar.gz(或Tgz)包发行的软件有一个缺点，就是一般不带自动反安装程序，如果需要对已经安装的此类程序进行删除，就不得不仔细查看 Makefile中的安装路径和文件名，这些对于初学者有一些难度。&lt;br /&gt;
&lt;br /&gt;
　　3.Tar.bz2软件包的安装&lt;br /&gt;
&lt;br /&gt;
　　以Tar.bz2为扩展名的软件包，是用Tar程序打包并用Bzip2程序进行压缩的软件包。它的优点是压缩率非常高，需要使用&amp;ldquo;bunzip2 filename.tar.bz2&amp;rdquo;进行解压。但以该种方式发行的软件包与Tar.gz软件包有着同样的缺点，那就是删除非常麻烦。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><author><name>1923</name><uri>http://space.kakadoor.com/1923/default.aspx</uri></author></entry><entry><title>Linux中系统整体性能监控工具(编程开发)</title><link rel="alternate" type="text/html" href="http://space.kakadoor.com/1923/archive/2273.aspx" /><id>http://space.kakadoor.com/1923/archive/2273.aspx</id><published>2007-09-27T14:43:05Z</published><updated>2007-09-27T14:43:05Z</updated><content type="html">&lt;div class="tpc_content"&gt;Linux中常用的监控CPU整体性能的工具有： mpstat： mpstat 不但能查看所有CPU的平均信息，还能查看指定CPU的信息。 vmstat：只能查看所有CPU的平均信息；查看cpu队列信息； iostat: 只能查看所有CPU的平均信息。 sar： 与mpstat 一样，不但能查看CPU的平均信息，还能查看指定CPU的信息。 top：显示的信息同ps接近，但是top可以了解到CPU消耗，可以根据用户指定的时间来更新显示。 oprofile：OProfile 是一个低开销的系统全局的性能监视工具。它使用处理器上的性能监视硬件来检索关于内核以及系统上的可执行文件的信息，例如内存是何时被引用的；L2 缓存请求数量；收到的硬件中断数量等1. /proc/stat/包含了所有CPU活动的信息，该文件中的所有值都是从系统启动开始累计到当前时刻。[work@builder ~]$ cat /proc/statcpu 432661 13295 86656 422145968 171474 233 5346cpu0 123075 2462 23494 105543694 16586 0 4615cpu1 111917 4124 23858 105503820 69697 123 371cpu2 103164 3554 21530 105521167 64032 106 334cpu3 94504 3153 17772 105577285 21158 4 24intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0ctxt 19067887btime 1139187531processes 270014procs_running 1procs_blocked 0输出解释CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思（以第一行为例）为：参数 解释user (432661) 从系统启动开始累计到当前时刻，用户态的CPU时间（单位：jiffies） ，不包含 nice值为负进程。1jiffies=0.01秒nice (13295) 从系统启动开始累计到当前时刻，nice值为负的进程所占用的CPU时间（单位：jiffies） system (86656) 从系统启动开始累计到当前时刻，核心时间（单位：jiffies） idle (422145968) 从系统启动开始累计到当前时刻，除硬盘IO等待时间以外其它等待时间（单位：jiffies） iowait (171474) 从系统启动开始累计到当前时刻，硬盘IO等待时间（单位：jiffies） ，irq (233) 从系统启动开始累计到当前时刻，硬中断时间（单位：jiffies） softirq (5346) 从系统启动开始累计到当前时刻，软中断时间（单位：jiffies） CPU时间=user+system+nice+idle+iowait+irq+softirqintr这行给出中断的信息，第一个为自系统启动以来，发生的所有的中断的次数；然后每个数对应一个特定的中断自系统启动以来所发生的次数。ctxt给出了自系统启动以来CPU发生的上下文交换的次数。btime给出了从系统启动到现在为止的时间，单位为秒。processes (total_forks) 自系统启动以来所创建的任务的个数目。procs_running：当前运行队列的任务的数目。procs_blocked：当前被阻塞的任务的数目。2. /proc/loadavg该文件中的所有值都是从系统启动开始累计到当前时刻。该文件只给出了所有CPU的集合信息，不能该出每个CPU的信息。[root@localhost ~]# cat /proc/loadavg 4.61 4.36 4.15 9/84 5662每个值的含义为：参数 解释lavg_1 (4.61) 1-分钟平均负载lavg_5 (4.36) 5-分钟平均负载lavg_15(4.15) 15-分钟平均负载nr_running (9) 在采样时刻，运行队列的任务的数目，与/proc/stat的procs_running表示相同意思nr_threads (84) 在采样时刻，系统中活跃的任务的个数（不包括运行已经结束的任务）last_pid(5662) 最大的pid值，包括轻量级进程，即线程。假设当前有两个CPU，则每个CPU的当前任务数为4.61/2=2.313. uptimeuptime是Linux系统常用的命令，用来报告系统已经运行多长时间，依此显示的信息：现在时间，系统已经运行了的时间，目前有多少登陆用户， 1分钟系统平均负载，5分钟系统平均负载，15分钟系统平均负载。该命令从/proc/loadavg 中获得load average的信息。范例1：系统只用一个CPU[root@localhost ~]# uptime12:20:49 up 3 days,9:20, 5 users, load average 1.10 1.32 1.15 对于一个CPU的系统来说，范例1中的平均负载高了些。通常来说：如果系统有n个CPU而且平均负载小于n,则说明某些CPU还有空闲的时间片。通过该命令，你能知道CPU是否繁忙，但是无法知道为什么忙。4. mpstatmpstat是Multiprocessor Statistics的缩写，是实时系统监控工具。其报告与CPU的一些统计信息，这些信息存放在/proc/stat文件中。在多CPUs系统里，其不但能查看所有CPU的平均状况信息，而且能够查看特定CPU的信息。下面只介绍 mpstat与CPU相关的参数，mpstat的语法如下： mpstat [-P {|ALL}] [internal [count]] 参数的含义如下：参数 解释-P {|ALL} 表示监控哪个CPU， cpu在[0,cpu个数-1]中取值internal 相邻的两次采样的间隔时间count 采样的次数，count只能和delay一起使用当没有参数时，mpstat则显示系统启动以后所有信息的平均值。有interval时，第一行的信息自系统启动以来的平均信息。从第二行开始，输出为前一个interval时间段的平均信息。与CPU有关的输出的含义如下：参数 解释 从/proc/stat获得数据CPU 处理器ID user 在internal时间段里，用户态的CPU时间（%） ，不包含 nice值为负 进程 usr/total*100nice 在internal时间段里，nice值为负进程的CPU时间（%） nice/total*100system 在internal时间段里，核心时间（%） system/total*100iowait 在internal时间段里，硬盘IO等待时间（%） iowait/total*100irq 在internal时间段里，软中断时间（%） irq/total*100soft 在internal时间段里，软中断时间（%） softirq/total*100idle 在internal时间段里，CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 （%） idle/total*100intr/s 在internal时间段里，每秒CPU接收的中断的次数 intr/total*100CPU总的工作时间=total_cur=user+system+nice+idle+iowait+irq+softirqtotal_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirquser=user_cur user_pretotal=total_cur-total_pre其中_cur 表示当前值，_pre表示interval时间前的值。上表中的所有值可取到两位小数点。范例1：average mode (粗略信息)当mpstat不带参数时，输出为从系统启动以来的平均值。[work@builder linux-2.6.14]$ mpstat Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/16/200509:38:46 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s09:38:48 AM all 23.28 0.00 1.75 0.50 0.00 0.00 74.47 1018.59范例2: 每2秒产生了4个处理器的统计数据报告下面的命令可以每2秒产生了4个处理器的统计数据报告，一共产生三个interval 的信息，然后再给出这三个interval的平均信息。默认时，输出是按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的活跃状态。。[work@builder linux-2.6.14]$ mpstat -P ALL 2 3Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/16/200509:38:46 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s09:38:48 AM all 23.28 0.00 1.75 0.50 0.00 0.00 74.47 1018.5909:38:48 AM 0 2.01 0.00 1.01 0.50 0.00 0.00 96.48 5.0309:38:48 AM 1 51.26 0.00 3.02 1.01 0.00 0.00 44.72 7.0409:38:48 AM 2 17.09 0.00 2.01 0.50 0.00 0.00 81.41 0.0009:38:48 AM 3 22.61 0.00 1.01 0.00 0.00 0.00 76.38 1006.0309:38:48 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s09:38:50 AM all 24.22 0.00 1.25 1.25 0.00 0.00 73.28 1049.7509:38:50 AM 0 1.00 0.00 1.00 0.00 0.00 0.00 98.01 28.8609:38:50 AM 1 93.03 0.00 3.48 0.00 0.00 0.00 2.99 25.3709:38:50 AM 2 1.99 0.00 0.50 4.98 0.00 0.00 92.54 0.0009:38:50 AM 3 1.00 0.00 0.50 0.00 0.00 0.00 98.51 995.5209:38:50 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s09:38:52 AM all 23.69 0.00 2.37 0.37 0.00 0.12 73.44 1028.3609:38:52 AM 0 2.99 0.00 1.49 0.00 0.00 0.50 95.02 111.9409:38:52 AM 1 52.74 0.00 2.99 1.00 0.00 0.00 42.29 4.4809:38:52 AM 2 14.93 0.00 1.99 0.00 0.00 0.00 82.09 4.4809:38:52 AM 3 23.38 0.00 1.99 0.50 0.00 0.00 73.13 907.46Average: CPU %user %nice %system %iowait %irq %soft %idle intr/sAverage: all 23.73 0.00 1.79 0.71 0.00 0.04 73.73 1032.28Average: 0 2.00 0.00 1.16 0.17 0.00 0.17 96.51 48.75Average: 1 65.72 0.00 3.16 0.67 0.00 0.00 29.95 12.31Average: 2 11.31 0.00 1.50 1.83 0.00 0.00 85.36 1.50Average: 3 15.64 0.00 1.16 0.17 0.00 0.00 82.70 969.55[work@builder linux-2.6.14]$ 范例3：比较带参数和不带参数的mpstat的结果。在后台开一个2G的文件 cat 1.img /* 1.img=2GBytes然后在另一个终端运行mpstat命令[root@localhost ~]# mpstatLinux 2.6.13 (localhost.localdomain) 2005年12月15日13时48分52秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s13时48分52秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12[root@localhost ~]# mpstatLinux 2.6.13 (localhost.localdomain) 2005年12月15日13时48分53秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s13时48分53秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12[root@localhost ~]# mpstatLinux 2.6.13 (localhost.localdomain) 2005年12月15日13时48分53秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s13时48分53秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12[root@localhost ~]# mpstatLinux 2.6.13 (localhost.localdomain) 2005年12月15日13时48分54秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s13时48分54秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12[root@localhost ~]#然后再运行命令：mpstat 3 100 /*每隔3秒给出一次信息，共给出100次*/[root@localhost ~]# mpstat 3 100Linux 2.6.13 (localhost.localdomain) 2005年12月15日13时48分25秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s13时48分28秒 all 96.00 0.00 4.00 0.00 0.00 0.00 0.00 401.6713时48分31秒 all 96.01 0.00 3.65 0.00 0.33 0.00 0.00 393.3613时48分34秒 all 95.36 0.00 4.30 0.00 0.33 0.00 0.00 532.4513时48分37秒 all 94.00 0.00 5.67 0.00 0.33 0.00 0.00 400.3313时48分40秒 all 95.00 0.00 5.00 0.00 0.00 0.00 0.00 330.3313时48分43秒 all 95.33 0.00 4.33 0.00 0.33 0.00 0.00 337.3313时48分46秒 all 94.68 0.00 4.98 0.00 0.33 0.00 0.00 329.5713时48分49秒 all 95.67 0.00 4.00 0.00 0.33 0.00 0.00 417.3313时48分52秒 all 95.67 0.00 3.67 0.00 0.67 0.00 0.00 448.0013时48分55秒 all 94.02 0.00 5.32 0.00 0.33 0.33 0.00 410.9613时48分58秒 all 95.35 0.00 4.32 0.00 0.33 0.00 0.00 466.45[root@localhost ~]#上两表显示出当要正确反映系统的情况，需要正确使用命令的参数。vmstat 和iostat 也需要注意这一问题。5. vmstatvmstat是Virtual Meomory Statistics（虚拟内存统计）的缩写, 是实时系统监控工具。该命令通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数据，输出信息直接打印在屏幕。vmstat反馈的与CPU相关的信息包括：（1）多少任务在运行（2）CPU使用的情况（3）CPU收到多少中断（4）发生多少上下文切换下面只介绍 Vmstat与CPU相关的参数vmstat的语法如下： 　　vmstat [delay [count]] 参数的含义如下：参数 解释delay 相邻的两次采样的间隔时间count 采样的次数，count只能和delay一起使用当没有参数时，vmstat则显示系统启动以后所有信息的平均值。有delay时，第一行的信息自系统启动以来的平均信息。从第二行开始，输出为前一个delay时间段的平均信息。当系统有多个CPU时，输出为所有CPU的平均值。与CPU有关的输出的含义 (采用