Debian学习笔记

整理:Jims of 肥肥世家

发布时间:2004年11月16日

最近更新:2009年09月02日,增加Bind服务器配置内容。

Abstract

Debian是Linux发行版当中最自由的一种。由位于世界各地上千名的自愿者不断开发和维护。它不属于任何的商业公司,完全由开源社区所有。本笔记记录Debian的相关知识和我在学习中遇到的各种问题及解决方法。该笔记也可说是我学习Linux过程中的积累成果。希望这些文字能帮到正在用Linux或正想进入Linux这个奇妙世界的朋友。

Sarge经过三年多的开发于2005年6月6日正式发布,替代Woody成为最新的Stable。testing的代号改为etch,unstable的代号还是sid。

Debian于2006年6月底停止对旧Stable版本Woody的支持。

Debian中代号为Sarge的发行版已获得开放源码发展实验室(OSDL)的电信运营商等级Linux(CGL)规格认证。


Table of Contents

1. 关于Debian
2. 文件系统
管理文件系统
优化文件系统
文件和目录的权限
文件系统属性
文件属性
文件访问控制列表(Access Control Lists,ACL)
加密文件系统
encfs
cfs
truecrypt
loop加密文件系统
Microsoft Private Floder
RAID
3. Bash
Bash的用户交互接口
环境变量
目录操作
通配符
输入/输出
后台作业
特殊字符
控制键
常用变量
用户环境配置
.bash_profile、.bashrc、和.bash_logout
选项
bash应用示例
fork炸弹
4. 软件包管理工具
dpkg
APT
apt-cache
apt-file
apt-key
wajig
建立一个混合系统
升级指定版本的软件包
保持指定软件包的版本
建立本地APT代理服务器
apt-spy介绍
5. 中文环境
国际化(Internationalization,简写为I18N)
字符集与编码
6. XFree86中的字体
两个字体处理系统
Xft
X11核心字体系统
参考资料
7. Debian桌面系统
Debian base系统安装
利用debootstrap工具安装Debian base系统
Debian启动过程简介
安装2.6.10内核,并支持图形化启动界面。
内核配置备忘录
几个内核相关文件介绍
安装GNOME中文桌面环境
配置“Debian菜单”
Gnome桌面环境常用功能的配置方法
安装KDE中文桌面环境
安装xfce4桌面环境
Nautilus
使用Nautilus脚本扩展文件管理功能
性能调整
使用GConf配置GNOME
8. 基础硬件配置篇
主板集成软猫的驱动方法
安装NVIDIA显卡3D驱动程序
Debian Way
使用官方安装包
配置示例
安装realtek8111/8168B千兆网卡
用r8168模块代替内核自带的r8169模块
配置有滑轮的串口鼠标
9. 网络配置篇
ADSL拔号上网配置
用pptp client连接远程VPN服务器
图形化配置方式
手动配置方式
设置Modem拔号网络
无线网络原理
无线网络配置
10. 软件应用篇
安装Compiz 3D桌面
中文字体模糊不清的解决方法
Iceweasel(Firefox)
Firefox的常用配置
firefox Extension
安装Adobe Reader 7.0 for Linux
安装rxvt中文终端
安装ALSA多媒体系统
使用minicom调试串口设备
使挂载的fat32和ntfs分区正常显示中文名
配置Java环境
安装
设置JAVA的中文显示
Fcitx中文输入法
常用配置
在Gnome下安装Fcitx并设置开机自启动
在KDE环境下设置fcit开机自启动
使用update-alternatives工具配置可选系统
安装星际译王
播放rmvb、rm格式文件
RealPlayer
totem
播放wmv和asf格式文件
浏览.chm格式文件
安装GDM
安装splash主题
安装QEMU模拟器
生成Debian软件包依赖关系图
登录Windows远程终端服务器
保存GNOME桌面环境中声卡的音量设置
屏幕截图
访问WebDAV服务
安装OpenOffice
用gaim登录google talk
安装Freemind
安装Emacs
利用KIO实现网络透明访问
在Linux下安装IE
安装Mutt
利用GnuPG加密文件
利用OpenSSL加密文件
利用pdftk处理pdf文档
安装AntiVir杀毒软件
处理rar格式压缩文档
使用tar备份文件
使用宽屏显示器
利用tor + privoxy访问tldp.org
使用screen管理远程会话
使用wget下载文件
安装Eclipse
运行内嵌X server
使用rsync同步数据
11. Debian服务器篇
在IBM X335服务器上安装Debian woody 3.0
手动安装HighPoint RocketRaid 2640x4阵列卡驱动程序
系统管理工具
Apache2
虚拟主机
性能调整
安全
通过openldap服务器进行用户验证
Exim4邮件服务器
邮件系统基础知识
Exim4邮件服务器的工作原理
安装与配置
安装Zope2.7
安装Zope 3.1.0b1
安装MySQL数据库
安装Samba服务器
设置磁盘配额
安装OpenLDAP目录服务器
安装HylaFAX传真服务器
安装
配置
安装Jabberd服务器
安装Jabberd2服务器
MoinMoin服务器
安装配置
访问控制列表(ACL)
用户验证
XML处理
文档
Plugin开发
About WiKi
安装Trac服务器
安装Subversion服务器
CUPS(Common UNIX Printing System)
TFTP服务器
安装Plone3.0
Oracle 11g
安装配置
数据库管理
Bind9
12. 系统安全
安全等级
安全策略
密码学原理
强化系统安全过程
检查系统
小技巧
检查网络
安装防火墙和过滤器
强化软件系统
灾备
文件访问控制
数据安全
强化身份验证机制
强化软件运行环境
强化网络通信
监控你的网络
强化日志管理
强化主机系统监控
PAM
PAM配置文件
PAM模块介绍
创建chroot环境
SSH
nmap
安全工具列表
13. Debian系统配置文件说明
/etc/passwd、/etc/shadow和/etc/group
/etc/login.defs
/etc/securetty
~/.gnomerc
~/.gtkrc.zh_CN
~/.gtkrc-2.0
/etc/modules
/etc/gdm.conf
/etc/kde3/kdm/kdmrc
/etc/services
/etc/protocols
/etc/network/interfaces
/etc/resolv.conf
/etc/host.conf
/etc/hosts
/etc/hostname
/etc/hosts.allow和/etc/hosts.deny
/etc/nsswitch.conf
/etc/hdparm.conf
14. 名词解释
inode节点
ELF(Executable Linking Format)
动态链接和静态链接
虚拟内存/交换空间
15. 小技巧
禁止非root用户登录系统
禁用CTRL+ALT+DEL组合键,防止非法重启电脑。
重新配置键盘布局
在终端下使用中文
内核模块配置工具modconf
配置文件备份技巧
用write命令与其他终端通信
/etc/issue文件的作用
/etc/motd文件的作用
用losetup虚拟光驱
/proc目录内的内存文件介绍
常用设备的I/O地址和中断
/var/run/utmp文件的作用
/var/log/wtmp文件的作用
用sysvinit管理服务进程
sync命令的作用
查看IDE硬盘参数信息
Linux下各种压缩文件格式介绍
时区配置
时间同步
用crontab管理自动化任务
用Ctrl+r组合键查找命令历史
用xvidtune工具调整显示模式
用apropos命令搜索man
用lsusb列出usb设备信息
安全地远程运行X程序
TCP可信端口范围
安全删除文件
在man中执行shell命令
用dd命令备份引导区信息
用dd命令生成任意大小的文件
查找setuid和setgid程序
查处二进制文件的工具
用lsof显示系统打开的文件
使用strings检查文件中的可打印字符
使用bing测试两台主机间的带宽
删除文件名以"-"开头的文件的方法
利用Windows引导器启动Linux系统
2.6.18以上内核生成头文件的方法
删除^M字符
DISPLAY变量的作用
16. 开源许可协议介绍
GPL
LGPL
FDL
BSD
MIT
MPL

List of Tables

2.1. Linux文件系统类型
3.1. 特殊字符
3.2. 控制键
7.1.
11.1. 访问协议
15.1. 一般设备的设定值

Chapter 1. 关于Debian

Debian发行版

Release  Date of Release  Code Name
Debian 5.0 (Lasest Stable)    14 February 2009       Lenny
Debian 4.0                    8 April 2007           Etch
Debian 3.1                    6 June 2005            Sarge
Debian 3.0                    19 July 2002           Woody
Debian 2.2                    15 August 2000         Potato
Debian 2.1                    March 9th, 1999        Slink
Debian 2.0                    July 24th, 1998        Hamm
Debian 1.3                    June 5th, 1997         Bo
Debian 1.2                    December 12th, 1996    Rex
Debian 1.1                    June 17th, 1996        Buzz
Debian 1.0                    Never released         -
Debian 0.93R6                 November 1995          -
Debian 0.93R5                 March 1995             -
Debian 0.91                   January 1994           -
Debian 0.01 through 0.90      August-December 1993   -

Chapter 2. 文件系统

文件系统是一个操作系统的重要组成部分,是操作系统在计算机硬盘存储和检索数据的逻辑方法。Linux通过VFS(虚拟文件系统)支持多种文件格式。Linux支持的各种常用的文件系统有以下几种。

Table 2.1. Linux文件系统类型

文件系统类型名称用途
Second Extended filesystemext2最常用的Linux文件系统
Three Extended filesystemext3ext2的升级版,带日志功能
Minix filesystemminixMinix文件系统,很少用
RAM filesystemramfs内存文件系统,速度超快
Network File System(NFS)NFS网络文件系统,由SUN发明,主要用于远程文件共享
DOS-FAT filesystemmsdosms-dos文件系统
VFAT filesystemvfatWindows95/98采用的文件系统
NT filesystemntfsWindows NT采用的文件系统
HPFS filesystemhpfsOS/2采用的文件系统
/proc filesystemproc虚拟的进程文件系统
ISO 9660 filesystemiso9660大部份光盘所用的文件系统
UFS filesystemufsSun OS所用的文件系统
Apple Mac filesystemhfsMacintosh机采用的文件系统
Novell filesystemncpfsNovell服务器所采用的文件系统
SMB filesystemsmbfsSamba的共享文件系统
XFS filesystemxfs由SGI开发的先进的日志文件系统,支持超大容量文件
JFS filesystemjfsIBM的AIX使用的日志文件系统
ReiserFS filesystemreiserfs基于平衡树结构的文件系统
Zettabyte File Systemzfs(暂定)Zettabyte File System是随Solaris 10一起发布的最新的文件系统。它是第一个128位的文件系统,包含多项创新技术。据Sun公司介绍,这是他们的最后一个文件系统,可见Sun公司对该文件系统的自信。该文件系统现时Linux还不支持,所以上面介绍文件类型时说明是暂定zfs。Sun ZFS文件系统的对外移植许可方式采用了CDDL标准,与Linux平台采用的GPL许可标准并不兼容 ,而导致了目前为止ZFS尚无法顺利地在Linux平台上使用。但开源社区启动了一个zfs on fuse项目,可以在Linux use space下使用zfs系统。

在Debian Administration上有篇文章,测试了ext3, reiser, xfs, jfs四种日志文件系统,XFS是综合评分最高的文件系统。网址是:http://www.debian-administration.org/articles/388

管理文件系统

使用mount命令就可在Linux中挂载各种文件系统,如:

debian:~# mount -t vfat /dev/hda1 /mnt/hda1

上面这条命令就把/dev/hda1这个fat分区挂载到了/mnt/hda1目录下。“-t”参数指定文件系统类型,常见的文件类型见上面“Linux文件系统类型”一表的内容。在挂载硬盘时,还有一个“-o”参数,它可指定挂载文件系统时的一些选项,如:

  • codepage=xxx,指定代码页,如936(简体中文)、437(英文)等。

  • iocharset=xxx,指定字符集,如utf8、gb2312等。

  • ro,以只读方式挂载。

  • rw,以读写方式挂载。

现在U盘已代替传统的磁盘成为移动存储的主流设备,在Linux中加载U盘也很简单,Linux把U盘看成一个SCSI设备,设备名是/dev/sda。加载命令如下:

debian:~# mount /dev/sda /mnt/usb

mount命令的参数选项是很丰富的,以上介绍的只是常用一些功能,详细介绍请参考man手册。

使用mkfs命令可以创建文件系统,如:

debian:~# mkfs -t ext2 /dev/fd0 1400

这条命令在软盘上创建一个容量为1.44M的ext2文件系统。

使用fsck命令可以检查文件系统,如:

debian:~# fsck -t ext2 /dev/hda3

使用mkswap命令可以创建swap空间,如:

debian:~# mkswap -c /dev/hda4
debian:~# swapon /dev/hda4      #启用新创建的swap空间,停用可使用swapoff命令

设备文件是Linux中一种特殊的文件,它对应每种硬件设备,如硬盘、软驱等。它可以像文件一样对它进行读写操作。设备文件位于/dev目录下,/dev/hda代表第一个IDE硬盘,/dev/fd0代表第一个软驱。/dev/null是一个虚设的设备,它就像一个无底的黑洞,任何对/dev/null的写入都会成功,但数据会消失得无影无踪,没有任何反馈。所以我们经常把不想在屏幕显示的信息全部送到/dev/null中。下面是一个设备文件的信息:

brw-rw----  1 root disk 3, 0 2005-07-07 05:29 /dev/hda

大家注意文件的size列,它是由逗号分隔的两个数字(3,0),第一个值代表主设备号(major device number),第二个值代表次设备号(minor device number)。主设备号对应内核相应的功能,而次设备号对应由驱动程序管理的特定设备。所以同一类设备的主设备号都是相同的,次设备号则不同。内核根据主设备号将I/O的要求导向到适当的驱动程序上,而该驱动程序以次要编号来判断出指定要使用的设备。系统安装同,默认已安装了大部份的设备文件,在/dev目录下可查询到很多的设备文件。但有时我们也需新增设备文件,这时我们可使用mknod命令,命令格式如下:

mknod -m permissions name type major minor
-m permissions参数可有可无,主要用于设置设备文件的权限
name是所要创建的设备名,要有完整的路径,如/dev/rhda
type是设备文件的类型,c代表字符设备,b代表块设备
major指定设备的主编号
minor指定设备的次编号

示例:
#  mknod -m 644 /dev/random c 1 8

使用dumpe2fs device | more可显示文件系统的详细信息。如:

debian:/var/log# dumpe2fs /dev/hdb1 |more
dumpe2fs 1.37 (21-Mar-2005)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          ef214b73-810a-4098-bf01-ab9a85d9c651
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      filetype sparse_super
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              3662848     #可用inode的数量
Block count:              7323624     #可用block的数量
Reserved block count:     366181      #保留块的数量
Free blocks:              428630
Free inodes:              3470727
First block:              0
Block size:               4096        #块大小
Fragment size:            4096
Blocks per group:         32768       #文件系统中每个块组的大小
Fragments per group:      32768
Inodes per group:         16352
Inode blocks per group:   511
Last mount time:          Thu Jul  7 20:09:57 2005
Last write time:          Thu Jul  7 23:42:51 2005
Mount count:              15
Maximum mount count:      30
Last checked:             Fri Jun 17 05:31:36 2005
Check interval:           2592000 (1 month)
Next check after:         Sun Jul 17 05:31:36 2005
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128

superblock是每个分区中最重要的信息,如果分区的superblock信息被破坏,则分区就不能使用。所以每个分区的superblock都被备份了。如果ext2文件系统的块组大小是32768,则superblock备份就存放在以32769开始的块组中。使用e2fsck -f -b 32769 /dev/hdb1就可用superblock备份信息修复文件系统的superblock

优化文件系统

块(block)是文件系统的最小存储单元,每个块的大小可以通过格式化文件系统来指定,一般每块的大小是1k或4k。下面是一个把分区格式化成ext2格式且每个块的大小为4k的示例。

debian:~# mkfs -t ext2 -b 4096 /dev/hda3

mkfs的-b选项可设置块大小(block size)。在这样的分区中,如果我们要保存一个4k大小的文件,则刚好占用一个block,如果要保存8k大小的文件,则要占用2个block;如果要保存5k大小的文件,一样也要占用2个block共8k大小的空间,第二个block上多余的3k空间不能再划分出来给其它文件使用。记住一点,block是文件系统分配磁盘空间的最小单位,为文件分配磁盘空间是按一个个block来分配的。基于block size优化部份,请参考以下原则:如果你要保存的文件数量多且每个文件的容量都较小,则设置较小的block size能有效提高磁盘的利用率,减少磁盘空间的浪费。如果你要保存的文件容量较大,则设置较大的block size可提高系统性能。

inode是block的索引号,inode保存了有关文件大小、文件在磁盘中第一个块的位置等的信息。在文件系统中检索文件其实就是通过文件的inode定位文件第一个数据块过程。默认1个inode节点指向1个block,如果1个inode指定2个block,则能减少磁盘inode的数量,提高文件的检索速度。要设置inode节点包含的数据块数量,则要在格式化文件分区时使用-i选项,下面是一个示例:

debian:~# mkfs -t ext2 -b 4096 -i 8192 /dev/hda3

8192刚好是4096的两倍,表示一个inode节点包含两个大小为4k的数据块。

ext3是带有日志功能的文件系统,能减少磁盘因意外断电所造成的数据丢失的机会。所以我们应该尽量使用ext3文件系统来代替较旧的ext2文件系统。使用mount命令可以把ext3分区挂载成ext2分区,只要使用-t ext2选项即可。如:

debian:~# mount -t ext2 /dev/hda3 /mnt/hda3

文件和目录的权限

Linux系统以安全性高著称,它有完善的文件和目录权限控制机制。使用ls -l命令可查看系统中文件和目录的权限。如:

debian:~# ls -l
drwxr-xr-x   3 root     root       4096 2005-05-05 02:01 SAPGUI
-rw-r--r--   1 root     root      66842 2005-03-27 17:20 Screenshot.png
-rw-r--r--   1 root     root         72 2005-03-03 20:24 setup.log
-rwxr-xr-x   1 root     root        268 2005-03-13 15:44 test
...

最左边的一串字符是文件和目录的权限控制字符串,权限字符串的第一个字母代表文件类型,不同字符代表不同的意思:

  • -,一般文件

  • d,目录

  • l,符号连接

  • b,块特殊文件

  • c,字符特殊文件

  • s,socket套接字

  • p,命名管道

后面9个字符分成三组,分别代表user(用户),group(组)和other(其它)的许可权限。每组有三个权限位,代表具体的权限:

  • r,表示文件可读或目录可读,位于三位权限组的第一位置。

  • w,表示文件可修改或目录可修改,位于三位权限组的第二位置。

  • x,表示文件可执行或目录中的文件可执行,位于三位权限组的第三位置。

  • s,表示set UID或set GID。位于user或group权限组的第三位置。如果在user权限组中设置了s位,则当文件被执行时,该文件是以文件所有者UID而不是用户UID执行程序。如果在group权限组中设置了s位,当文件被执行时,该文件是以文件所有者GID而不是用户GID执行程序。s权限位是一个敏感的权限位,容易造成系统的安全问题。请在设置时小心,并注意系统中已有的SUID或SGID文件和目录。

  • t,表示粘着位(sticky)。具有该位的文件和目录只有创建者才能删除。

  • -,表示没有权限。该字符可出现在任何位置,表示没有许可权限。

  • 权限位后面的数字3,1,1,1表示硬链接的链接数,3表示有三个硬链接,1表示有一个硬链接。

常用目录权限设置

  • 0755,所有人都可以查看目录的内容,但只有root或所有者才能修改。

  • 1777,所有人都可在该目录下创建文件,但不能删除其它用户创建的文件。一个典型目录就是/tmp。

  • 0700,只能由所有者访问的目录。如home目录。

当我们在linux中创建一个文件或目录时,系统通过umask环境变量来控制默认的权限位设置。umask的值多为022,在profile文件里设置。设置格式如下:

...
umask 022
...

在umask值的2表示屏蔽写权限,7表示屏蔽读写权限。最常用的值是022,027和077。

使用chmod,chown和chgrp改变文件的访问权限,使用setuid和setgid来改变特殊位。

使用ls -i filename命令可以列出文件的inode信息。如:

localhost:~# ls -i simple.png
32563 simple.png
32563就是simple.png的inode节点的值。

inode值相同的链接是硬链接,inode值不同的是软链接。

硬链接示例:

localhost:~# ls -li simple.png
32563 -rw-r--r-- 1 root root 1574 2005-12-15 14:59 simple.png
localhost:~# ln simple.png simple1.png            #创建硬链接
localhost:~# ls -il simple1.png
32563 -rw-r--r-- 2 root root 1574 2005-12-15 14:59 simple1.png
localhost:~# ls -li simple1.png
32563 -rw-r--r-- 2 root root 1574 2005-12-15 14:59 simple1.png   #inode值与simple.png一样。链接值变成2
#改变互为硬链接的文件内容时,另一个文件的内容也相应被改变。但删除一个文件不会影响另一个文件。

软链接示例:

localhost:~# ls -il simple.png
32563 -rw-r--r-- 1 root root 1574 2005-12-15 14:59 simple.png
localhost:~# ln -s simple.png simple1.png    #创建软链接
localhost:~# ls -il simple.png
32563 -rw-r--r-- 1 root root 1574 2005-12-15 14:59 simple.png
localhost:~# ls -il simple1.png
32836 lrwxrwxrwx 1 root root 10 2006-04-27 13:16 simple1.png -> simple.png   #inode值与simple.png不一样了。
#软链接相当于重新创建一个链接文件,inode值不同了。源文件的链接值也不会增加。删除源文件,软链接文件也失效。

文件系统属性

文件系统属性通过文件系统格式化设置后,在运行中,我们还可以通过tune2fs命令来修改文件系统的属性。下面列出该命令的常用选项。

-l <device>            列出指定分区文件系统的信息
-c <count>             设置启动时强制文件系统自检的分区挂载次数,设置为-1表示永远不自检
-i <day>               设置启动时强制文件系统自检的时间周期
-m <per>               设置保留块大小占总数据块的百分比
-j <device>            将ext2格式文件系统转换成ext3格式

下面用一些示例来说明以上各选项的作用。

debian:~# tune2fs -l /dev/hda3         #列出hda3分区的文件系统属性
tune2fs 1.40-WIP (14-Nov-2006)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          592267c7-1804-4d97-8abf-e88c4c6a7220
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal filetype needs_recovery sparse_super
Default mount options:    (none)
...
debian:~# tune2fs -c 100 /dev/hda3     #把强制自检的分区挂载次数设置为100
tune2fs 1.40-WIP (14-Nov-2006)
Setting maximal mount count to 100

debian:~# tune2fs -m 2 /dev/hda3       #把保留块大小设置为2%
tune2fs 1.40-WIP (14-Nov-2006)
Setting reserved blocks percentage to 2% (50042 blocks)

在这里顺便说明一下什么叫保留块,它是文件系统中磁盘中预留给管理员使用的空间,其他用户不能使用。其作用是一旦分区磁盘空间被填满,管理员还可以登录系统进行故障处理。现在的磁盘容量越来越大,如果我们还是按文件系统默认5%的要求设置保留块,则会浪费大量磁盘空间。所以适当调整该值能提高我们磁盘的有效利用率。

文件属性

使用lsattr和chattr命令可以显示和改变文件属性。

  • s(secure deletion),当文件被删除时,分配在该文件中的所有块都会清零,并写入磁盘,保证文件的数据被彻底清除,不能被访问。

  • u(undelete),该属性可保存被删除的文件内容。

  • c(compress),当文件保存在磁盘时,内核会自动压缩该文件。

  • S(synchronous),当修改具有该属性的文件时,所有更改将同步写入磁盘。

  • i(immutable),设置了该属性的文件不允许更改。

  • a(append only),文件只能以追加模式打开,只有root才能设置或删除主该属性。

  • d(no dump),具有该属性的文件不能被dump工具备份。

  • A(no atime),不更新atime值,atime是文件文件的访问时间戳。

文件访问控制列表(Access Control Lists,ACL)

传统的Linux文件系统的权限控制是通过user、group、other与r(读)、w(写)、x(执行)的不同组合来实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。例如,我们可能需把一个文件的读权限和写权限分别赋予两个不同的用户或一个用户和一个组这样的组合。传统的权限管理设置起来就力不从心了。为了解决这些问题,Linux开发出了一套新的文件系统权限管理方法,叫文件访问控制列表(Access Control Lists,ACL)。

要启用ACL,需内核提供ACL支持和安装ACL管理工具。现在的2.6内核都提供ACL支持,在编译内核时只要在file systems分支下,把Ext2 POSIX Access Control Lists或Ext3 POSIX Access Control Lists选中就可以了。用以下命令挂接硬盘启用文件系统ACL。

debian:~# mount -t ext2 -o acl /dev/hda1 /mnt/hda1

我们也可把选项写到/etc/fstab文件中,在需启用acl的分区选项包含acl参数。

ACL有两种,一种是存取ACL(access ACLs),针对文件和目录设置访问控制列表。一种是默认ACL(default ACLs),只能针对目录设置。如果目录中的文件没有设置ACL,它就会使用该目录的默认ACL。要设置ACL,首先要安装管理工具,它们分别是getfacl和setfacl,在debian中只要安装acl软件包即可。

debian:~# apt-get install acl

setfacl工具可为文件和目录ACL,命令格式如下:

setfacl -m <rules> <files>

rules的格式如下,多条规则间可用逗号分隔。

u:uid:perms   #为用户设置ACL,perms为r、w、x的组合
g:gid:perms   #为组设置ACL
o:perms      #为其它组设置ACL
m:perms      #设置有效权限屏蔽

下面是setfacl的实例:

debian:~# setfacl -m u:jims:rw testfile.txt   
#-m选项表示添加或修改文件或目录的权限访问列表

debian:~# setfacl -x u:jims:rw testfile.txt
#-x选项表示删除文件或目录的访问列表

要设置默认的ACL,只在rules前加一个d:,以表示指定一个目录,如:

debian:~# setfacl -m d:o:rx /data

getfacl用以显示文件或目录的ACL,如:

debian:getfacl debian.xml
# file: debian.xml
# owner: jims
# group: jims
user::rwx
group::r--
other::r--

tar和dump工具不能备份ACL文件,如果我们要备份ACL文件系统,可以使用star工具。另外,samba可通过--with-acl-support编译选项支持ACL。

加密文件系统

如果你想对保存在磁盘中的目录和文件进行加密,保护你个人信息的安全,我们可以使用加密文件系统。在Linux中的加密文件系统有很多种选择,如encfs(Encrypted Filesystem),cfs(Cryptographic Filesystem)和truecrypt等。

encfs

encfs为我们提供一个用户级的加密文件系统,每个用户都可为自已的目录或文件创建一个加密的文件系统。这个文件系统只能由你加载和访问,其他用户只能看到加密后的内容。encfs使用fuse库和fuse内核模块来提供文件系统的接口。encfs也是基于GPL的开源软件。

现在最新的2.6内核已支持fuse,我在这里测试的内核版本是2.16.17.1。使用前要把fuse编译进内核,需选中内核选项路径中的File systems-->Filesystem in Userspace support选项,重新编译。最后安装encfs相关软件:

debian:~# apt-get install encfs fuse-utils

系统默认创建一个fuse组,如果一般用户要在主目录下创建加密文件系统,则要把用户加入fuse组。下面是用一般用户创建加密文件系统的过程。

yangjing@localhost:~$ encfs ~/encode ~/decode                                          #创建命令,要用绝对路径
The directory "/home/yangjing/encode/" does not exist. Should it be created? (y,n) y   #创建加密文件系统目录
The directory "/home/yangjing/decode" does not exist. Should it be created? (y,n) y    #创建加密文件系统加载点
Creating new encrypted volume.
Please choose from one of the following options:
 enter "x" for expert configuration mode,
 enter "p" for pre-configured paranoia mode,
 anything else, or an empty line will select standard mode.
?> p

Paranoia configuration selected.

Configuration finished.  The filesystem to be created has
the following properties:
Filesystem cipher: "ssl/aes", version 2:1:1
Filename encoding: "nameio/block", version 3:0:1
Key Size: 256 bits
Block Size: 512 bytes, including 8 byte MAC header
Each file contains 8 byte header with unique IV data.
Filenames encoded using IV chaining mode.
File data IV is chained to filename IV.

-------------------------- WARNING --------------------------
The external initialization-vector chaining option has been
enabled.  This option disables the use of hard links on the
filesystem. Without hard links, some programs may not work.
The programs 'mutt' and 'procmail' are known to fail.  For
more information, please see the encfs mailing list.
If you would like to choose another configuration setting,
please press CTRL-C now to abort and start over.

Now you will need to enter a password for your filesystem.
You will need to remember this password, as there is absolutely
no recovery mechanism.  However, the password can be changed
later using encfsctl.

New Encfs Password:                               #输入验证密码
Verify Encfs Password:
yangjing@localhost:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda3             9.4G  7.6G  1.4G  85% /
tmpfs                 153M     0  153M   0% /dev/shm
tmpfs                  10M   56K   10M   1% /dev
//t02/yangjing         29G   26G  3.1G  90% /root/data
/dev/hda1             8.7G  7.7G  616M  93% /mnt/hda1
encfs                 9.4G  7.6G  1.4G  85% /home/yangjing/decode       #成功加载encfs文件系统
yangjing@localhost:~$

现在我们在decode目录下创建的任何内容都会自动被加密并保存在encode目录下。下面我们试试在加载点创建一些文件和目录。

yangjing@localhost:~$ cd decode/
yangjing@localhost:~/decode$ mkdir test
yangjing@localhost:~/decode$ echo 'encfs test' > test.txt
yangjing@localhost:~/decode$ ls
test  test.txt
yangjing@localhost:~/decode$ cd ../encode/
yangjing@localhost:~/encode$ ls
09LTiJuKxiD20yIN0k,l8Q5p  KaUAfbP3JMH8PAstrS-5b7eO   #文件和目录已自动生成并已加密
yangjing@localhost:~/encode$ cat 09LTiJuKxiD20yIN0k,l8Q5p
[e?f%v;-?B?'TDN{K6                                   #内容也已加密
yangjing@localhost:~/encode$  

使用完加密文件系统后,我们要把加密文件系统卸载掉。这样其他用户就只能看到~/encode目录下加密后的目录和文件,从而有效保护你私人信息的安全。

yangjing@localhost:~$ fusermount -u ~/decode          #卸载encfs文件系统
yangjing@localhost:~$ cd decode/
yangjing@localhost:~/decode$ ls                       #目录为空
yangjing@localhost:~/decode$ cd ../encode/
yangjing@localhost:~/encode$ ls                       #目录内容已加密
09LTiJuKxiD20yIN0k,l8Q5p  KaUAfbP3JMH8PAstrS-5b7eO
yangjing@localhost:~/encode$ cat 09LTiJuKxiD20yIN0k,l8Q5p
[e?f%v;-?B?'TDN{K6
yangjing@localhost:~/encode$ df                       #加密文件已卸载
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda3              9851340   7906980   1443936  85% /
tmpfs                   156208         0    156208   0% /dev/shm
tmpfs                    10240        56     10184   1% /dev
//t02/yangjing        30233600  27056640   3176960  90% /root/data
/dev/hda1              9068616   7977548    630408  93% /mnt/hda1

其他用户访问加密文件系统时的效果:

localhost:/etc# id
uid=0(root) gid=0(root) groups=0(root)
localhost:/etc# cd /home/yangjing/encode/
localhost:/home/yangjing/encode# ls
09LTiJuKxiD20yIN0k,l8Q5p  KaUAfbP3JMH8PAstrS-5b7eO          #密文
localhost:/home/yangjing/encode# vi 09LTiJuKxiD20yIN0k,l8Q5p
localhost:/home/yangjing/encode# cat 09LTiJuKxiD20yIN0k,l8Q5p
[e?f%v;-?B?'TDN{K6                                          #密文
localhost:/home/yangjing/encode#                            

在加密目录encode目录下,有一个文件叫.encfs5。它是加密文件系统的配置文件上,我们一定要备份好该文件,一旦丢失,你就不能恢复加密的文件。

cfs

truecrypt

loop加密文件系统

还有通过loop文件系统来实现加密文件系统的方法,请参考以下链接:

Microsoft Private Floder

微软也推出一个免费的文件加密软件叫Microsoft Private Floder,可对电脑中的文件进行加密,其他用户没有密码就不能访问,即使是管理员也一样。

RAID

RAID(Redundant Array of Inexpensive/independent Disks)是冗余磁盘陈列,可提高Linux磁盘性能和数据安全。

RAID级别介绍

  • RAID 0

    通过分带在多个磁盘上分布I/O,可提高磁盘的读写性能。但可用性差,不提供数据冗余保护。

  • RAID 1

    磁盘镜像,两个磁盘当一个磁盘使用,空间的利用率低,但它对数据提供了很好的保护。RAID 1平衡多个磁盘间的读,所以它的读性能是很好的。但当它写入数据时需同时在两块磁盘上操作,所以它的写性能很差。多用于文件服务器。

  • RAID 0+1

    综合RAID 0和RAID 1优点的一种RAID形式,在提高可用性的同时又提高写性能。

  • RAID 3

    通过在陈列中的一块单独的磁盘上存储奇偶校验信息来提供冗余。性能不佳,较少使用。

  • RAID 5

    带奇偶数据校验的分带冗余系统,最少需要三块磁盘,可用容量是n-1块磁盘的容量。数据以分带格式存储在所有磁盘上。任何一块磁盘故障,我们仍可使用,不会丢失数据。因为使用了分带技术,在多块磁盘间平衡了读取操作,所以有很好的读性能。因为要在多块磁盘上写入奇偶校验信息,所以写性稍差。RAID 5是现时最常用的一种RAID形式。

Chapter 3. Bash

Shell是UNIX系统的用户接口,它接受用户的指令,并将它翻译成操作系统可以理解的命令,最后将结果返回给用户。简单说就是用户和内核打交道的界面。在UNIX发展的历史中,出现了几种shell,第一个主要的shell是Bourne shell(以其发明者Steven Bourne命名),它始于1979年,包含在unix第一个流行版本版本7中,在系统中称为“sh”。另一个shellC shell,在系统称为csh,它由Berkeley的California大学的Bill Joy编写,它首次发布于1981年的UNIX Berkeley Software Distribute(BSD)中。C shell的名称来源于其语句命令与C语言的相似。还有一个使用较多的shell是Korn shell,它是一个商业产品,类似于bash。以下重点介绍一下bash。其它的shell大家可查阅相关资料。

Bash是GNU系统的标准shell,正式发布于1988年11月10日,Brain Fox编写了bash的最初版本,1989年初,Chet Ramey加入开发,负责大量的故障调试及加入许多有用的特性。现在bash由Chet Ramey负责维护。我们可免费从FSF(Free Software Foundation)得到0.99以上的版本。现在最新的版本是2.05b,它提供了作业控制、命令行编辑模式、自定义函数、高级I/O等先进功能。可以用bash的命令行选项-version或打印环境变量BASH_VERSION的值来获得版本号。

优秀的管理员也是懒惰的管理员,他们喜欢用shell帮助他们自动完成各种管理工作。Linux系统很多服务都是通过shell脚本来启动,通过查看这些脚本,你可以了解服务的启动过程,从而为故障论断和系统优化做好准备。

Bash的用户交互接口

Bash的用户接口也就是我们经常说的字符界面,这是我们与系统交互的主要环境,我们可通过这个接口管理我们的系统。在系统引导时,第一个需要运行的进程是init,由init再衍生出一个getty终端进程,该进程打开一个终端窗口,提供标准输入、标准输出和标准错误。然后执行程序/bin/login,login程序提示输入密码,加密并验证密码。通过验证后系统进入登录shell,也就是bash。不同的登录shell可在passwd文件设置。bash会通过几个配置文件来初始化用户环境。首先bash会查找/etc/profile,并执行其中的命令,初始化系统级别环境。然后在用户目录下查找.bash_profile文件,并执行里d面的命令,初始化用户级别的环境。用户级别的设置可覆盖系统级别设置。最后会执行.bashrc用户环境设置文件,这时,默认提示符美元符号将显示在屏幕上。

环境变量

进入bash后,系统可根据你的配置生成一系列的环境变量,这些环境变量可用export命令显示。下面是一些常的环境变量:

  • $LOGNAME,当前登录的用户名。

  • $HOME,当前用户的主目录。

  • $PATH,当前用户的命令搜索路径。

  • $LANG,当前系统的语言环境。

  • $TZ,时区

  • $MAILCHECK,检查新邮件的间隔,单位是秒。

  • $PS1,命令行提示符。

  • $PS2,二级命令行提示符,也就是当你的命令行很长,在一行写不下,转到第二行时出现的提示符。

  • $PWD,当前目录。

目录操作

Linux以树状结构组织文件和目录,目录可以包含文件,也可以包含其它目录。目录的最高层是根目录"/",其它所有文件和目录都是挂在根目录下,形成一个倒挂的目录树。

使用bash shell的cd命令可在目录树中移动,当前停留的位置叫工作目录或当前目录,可用"."表示。每个用户在/home目录下都有一个与用户名相同的目录,叫用户主目录。可用"~"符号表示,".."表示上一级目录。

jims@localhost:~$           #位于jims用户的主目录
jims@localhost:~$ cd .      
jims@localhost:~$           #没变化
jims@localhost:~$ cd ..
jims@localhost:/home$       #移动到上层目录
jims@localhost:/home$ cd ~
jims@localhost:~$           #回到用户主目录
jims@localhost:~$ pwd       #显示当前目录
/home/jims                      

通配符

在bash shell环境下,我们可用通配符来简化命令输入。

  • ?,匹配任意单个字符。

  • *,匹配任意字符串。

  • [set],匹配set中的任意字符。[!set]是取反操作,匹配不在set中的任意字符,如:

    [a-z]          匹配所有小写字符
    [0-9]          匹配所有数字
    [akz]          匹配a,k,z三个字符
    [.,;]          匹配句点,逗号和分号
    [!abc]         匹配除a,b,c之外的所有字符
    

下面是几个命令示例:

jims@localhost:~$ ls *.py         #显示当前目录下所有以.py结尾的文件
jims@localhost:~$ ls *.[cho]      #显示当前目录下所有以c,h,o结尾的文件
jims@localhost:~$ ls ???          #显示所有文件名为三个字符的文件

大括号"{}"可用于扩展任意字符串,如:

localhost:~/python# echo a{a,b,c}a
aaa aba aca

我们也可用大括号做为通配符使用,如:

jims@localhost:~$ ls *.{c,h,o}    #效果同ls *.[cho]

输入/输出

常用数据过滤命令

  • cat,将输入复制到输出。cat是"catenate"的缩写,是连接在一起的意思。

  • grep,从输入中检索字符串。

  • sort,对输入进行排序。

  • cut,从输入中抽取列。

  • sed,对输入进行编辑。

  • tr,对输入进行转换或删除操作。

使用"<"和">"可实现I/O重定向功能,如:

$ ls > filename     #输出重定向到filename文件,也就是生成一个filename文件,内容为ls命令执行的结果。
$ grep < filename   #grep的命令参数从filename文件读取。

使用"|"可实现管道(pipeline)操作,管道操作可以把一个命令的输出重定向到另一个命令的输入,而不是文件,如:

$ ls -l | more           #先进行ls -l操作,再对操作结果进行more操作

后台作业

bash shell允许在一个会话期间同时运行多个命令,正常情况下所有命令在前台运行。只有在一个命令运行完后才能输入一个命令。但如果我们在运行命令时在命令后加一个"&"符号,则该命令将转入后台运行,我们马上获得shell终端控制权,可输入另外一条命令。这种在后台运行的命令叫后台作业。后台作业主要用在一些需花很长时间来运行的命令上,如解压一个大的压缩文档。

$ tar zxvf xen.tar.gz&
[1] 2547              

使用jobs命令可以查看后台作业状态。

特殊字符

在bash中,有很多有特殊含义的特殊字符,下面是一个完整的列表:

Table 3.1. 特殊字符

字符含义
~主目录
`命令替换
#注释
$变量表达式
&后台作业
*字符通配符
(启动子shell
)停止子shell
\转义或续行
|管道操作符
[]通配符集
{}命令块
;shell命令分隔符,作用是可在一行输入多条shell命令。
'强引用,引号内所有内容保持字面意思。
"弱引用,引号内某些内容保持字面意思。
<输入重定向
>输出重定向
/路径分隔符
?通配符,匹配单个任意字符
!取反操作

控制键

通过控制键可以控制shell的行为,下面是一些常用的控制键。

Table 3.2. 控制键

控制键描述
Ctrl_C中止当前命令
Ctrl_D输入结束
Ctrl_\如果Ctrl_C无效,则中止当前命令
Ctrl_S禁止屏幕输出
Ctrl_Q开启屏幕输出
DEL或CTRL_?删除最后的字符
Ctrl_U删除整个命令行
Ctrl_Z暂停当前命令

常用变量

变量是随系统运行而变化的,灵活使这些变量可简化我们的操作和更好地控制bash shell的行为。

$# 脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的进程ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
$0 脚本名称
$1..$9 第N个参数

用户环境配置

为使Bash更好地为我们服务,我们需定制bash shell环境。

.bash_profile、.bashrc、和.bash_logout

  1. 上面这三个文件是bash shell的用户环境配置文件,位于用户的主目录下。其中.bash_profile是最重要的一个配置文件,它在用户每次登录系统时被读取,里面的所有命令都会被bash执行。.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。在Debian中使用.profile文件代替.bash_profile文件。

  2. .bashrc文件会在bash shell调用另一个bash shell时读取,也就是在shell中再键入bash命令启动一个新shell时就会去读该文件。这样可有效分离登录和子shell所需的环境。但一般来说都会在.bash_profile里调用.bashrc脚本以便统一配置用户环境。

  3. .bash_logout在退出shell时被读取。所以我们可把一些清理工作的命令放到这文件中。

在/etc目录的bash.bashrc和profile是系统级(全局)的配置文件,当在用户主目录下找不到.bash_profile和.bashrc\时,就会读取这两个文件。.bash_history是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISSIZE环境变量设置在历史记录文件里保存记录的条数。alias l = 'ls -l'是设置别名的语句,把它放在这些配置文档中就可使我们能用简单的'l'命令,代替'ls -l'命令。

Note

当我们修改了这些配置件后,可用source .bash_profile命令使修改内容马上生效。

选项

bash shell中的选项可控制shell的行为和功能,我们可以通过shopt命令来设置。使用set命令也可以,但它已被shopt替代,但为了向下兼容,set命令还是可以使用的。使用不带参数的shopt命令可以列出当前shell中只能由shopt设置的选项,用shopt -o可列出可由set命令设置的选项。

下面是一些可由set命令基本的选项,默认是关闭的。

emacs                  进入emacs编辑模式
vi                     进入vi编辑模式
ignoreeof              不允许单独使用Ctrl_D退出的用法,要使用exit。与IGNOREEOF=10等价
noclobber              不允许重定向覆盖已存在文件
noglob                 不允许扩展文件名通配符
nounset                使用未定义的变量时给出错误

下面是一些只能由shopt命令设置的选项。

cdspell          自动改正cd命令参数中的小错误
hostcomplete     以@开头时,按tab键可进行主机名的自动完成
dotgblob         以点开始的文件名被包含在路径名扩展中
mailwarn         显示邮件警告信息

shopt命令的选项如下:

-p          显示可设置选项及当前取值
-s          设置每一选项为on
-u          设置每一选项为off
-q          不输出信息
-o          

bash应用示例

fork炸弹

一段只有13个字符的脚本,能使你的系统因产生大量的进程耗尽系统资源而瘫痪。下面是这段脚本,大家千万不要在工作环境中使用,切记,切记!否则由此引起的一切后果,本人概不负责,呵呵。

.(){ .|.& };.

上面的代码用分段显示的方式会清楚一点,每行的意义是:

.()                     #定义名为.的函数
{                       #函数开始的大括号
 .|. &                  #函数主体,调用函数本身并利用管道调用一个新进程,放到后台运行。
}                       #函数结束的大括号
;                       #分号分隔脚本两部份
.                       #调用刚定义的.函数

当bash处于非POSIX模式中时,"."号优先解释为函数名而不是内嵌命令。而在POSIX模式下,"."号优先解释为内嵌点命令而不是函数名,该脚本不能运行。默认bash处于非POSIX模式,命令解释顺序为:

  1. 关健字,如:if,for等。

  2. 别名。

  3. 特殊内嵌命令,如:break、continue、eval、exec、exit、export等。POSIX模式的特殊内嵌命令还包括.(点号)和:(冒号)。在POSIX模式下会优先匹配点号。

  4. 函数。在非POSIX模式下会优先匹配函数。

  5. 非特殊内嵌命令,如cd,ls等。

  6. 最后解释的是脚本和执行程序。

要使用 POSIX 模式来运行 bash 脚本,可以使用以下三种方法:

  • 使用--posix选项启动bash。

  • 在运行bash前,使用set -o posix命令设置bash环境。

  • 使用/bin/sh启动bash。

知道了fork炸弹的原理了,我们可以通过调整用户可运行的进程数来限制fork炸弹的危害。

debian:~# ulimit -u 100
debian:~# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                        (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 2495
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
max rt priority                 (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 100
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
debian:~#                                                               

上面的命令限制用户只可运行100个进程。

Chapter 4. 软件包管理工具

由于UNIX的程序设计思想是不重复发明轮子,所以UNIX程序大多都会依赖现有的程序和工具来开发。Linux也继承了UNIX这种优良的传统。这带给我们的好处是开发效率成倍提高,结构灵活,扩展性好。但软件间复杂的依赖关系和冲突关系给软件的安装造成很大的障碍。所以成功的Linux发行版都开发有方便的软件包管理工具,让电脑自动帮我们解决软件包的依赖和冲突。软件包管理工具是区分不同发行版的重要特征之一。如:Debian使用dpkg,RedHat使用rpm,Gentoo使用emerge,Yellow Dog使用yum(Yellow Dog Updater),Arch Linux使用pacman。本章主要介绍Debian的软件包管理工具dpkg和它的一些前端工具,如apt-get,apt-file等。

dpkg

dpkg是Debian系统的软件包管理工具,它最初于1993年发布,是Debian系统最优秀的特性之一。它通过以下几种关系来标识软件包间的依赖性。分别是:

  • depends(依赖),运行A必须先安装B,且有版本的要求,不同版本也会造成依赖问题。

  • recommends(推荐),系统推荐的软件包可增强你所安装软件的关健功能。你可安装也可不安装。

  • suggests(建议),系统建议的软件包可增强你所安装软件的某些功能,你可安装也可不安装。

  • conflicts(冲突),安装了A则B不能正常运行。不要安装有冲突的软件包。

  • replaces(替换),软件包A中的软件会被软件包B中的软件移除或覆盖,不要安装该类软件包。

  • provides(提供),A软件包已提供B软件包的所有功能。你可安装也可不安装该类软件包。

dpkg软件包是一些以.deb结尾的文件,软件包信息集中存放在/var/lib/dpkg/目录下,其中/var/lib/dpkg/info存放有软件包的管理信息。

debian:/var/lib/dpkg/info# ls zhcon.* -l
-rw-r--r-- 1 root root   32 2006-09-26 20:56 zhcon.conffiles
-rwxr-xr-x 1 root root  104 2006-09-26 20:56 zhcon.config
-rw-r--r-- 1 root root 1755 2006-09-28 08:18 zhcon.list
-rw-r--r-- 1 root root 3147 2006-09-26 20:56 zhcon.md5sums
-rwxr-xr-x 1 root root  233 2006-09-26 20:56 zhcon.postinst
-rwxr-xr-x 1 root root  206 2006-09-26 20:56 zhcon.postrm
-rw-r--r-- 1 root root  906 2006-09-26 20:56 zhcon.templates
...

不同后缀的意义如下:

  • .conffiles,文本文件,记录软件包的配置文件列表。

  • .list,文本文件,存放软件包的文件列表和安装位置。

  • .md5sums,文本文件,记录软件包的md5信息,这些信息用来进行软件包验证。

  • .prerm,脚本文件,负责停止与软件包关联的daemon服务,在删除关联软件包之前执行。

  • .postrm,脚本文件,负责修改软件包链接或文件关联,或删除由它创建的临时文件。

  • .config,脚本文件,是软件包的安装配置脚本。

  • .preinst,脚本文件,在解包之前执行,做一些软件包安装前的准备工作。

  • .postinst,脚本文件,在解包之后执行,做一些软件包的安装配置工作。

  • .templates,文本文件,记录一些软件包的安装提示信息。

上面这些文件不是每个都必须的,根据不同的安装要求由软件包维护者自由设置。下面介绍dpkg工具的具体用法。使用dpkg -h命令可以列出该工具的所有语法:

debian:/var/lib/dpkg/info# dpkg -h
用法:dpkg [<选项> ...] <命令>

命令:
  -i|--install       <.deb 文件名> ... | -R|--recursive <目录> ...
  --unpack           <.deb 文件名> ... | -R|--recursive <目录> ...
  -A|--record-avail  <.deb 文件名> ... | -R|--recursive <目录> ...
  --configure        <软件包名> ... | -a|--pending
  -r|--remove        <软件包名> ... | -a|--pending
  -P|--purge         <软件包名> ... | -a|--pending
  --get-selections [<表达式> ...]     把已选中的软件包列表打印到标准输出。
  --set-selections                    从标准输入里读出要选择的软件。
  --clear-selections                  取消选中所有不必要的软件包。
  --update-avail <Packages 文件>      替换现有可安装的软件包信息。
  --merge-avail <Package 文件>        把文件中的信息合并到系统中。
  --clear-avail                       清除现有的软件包信息。
  --forget-old-unavail                忘却已被卸载的不可安装的软件包。
  -s|--status <软件包名> ...          显示软件包详尽的状态信息。
  -p|--print-avail <软件包名> ...     显示可供安装的版本详情。
  -L|--listfiles <软件包名> ...       列出所有“属于”该软件包(或多个)的文件。
  -l|--list [<表达式> ...             简明地列出软件包的状态。
  -S|--search <表达式> ...            搜寻拥有该文件(或多个文件)的包。
  -C|--audit                          检查搜寻残损的软件包。
  --print-architecture                显示 dpkg 体系架构。
  --compare-vesions <甲> <关系> <乙>  比较版本号 - 见下。
  --force-help                        显示本强制选项的帮助信息。
  -Dh|--debug=help                    显示有关出错调试的帮助信息。

  -h|--help                           显示本帮助信息。
  --version                           显示版本信息。
  --license | --licence               显示版权和许可证条文。

对归档文件使用 dpkg -b|--build|-c|--contents|-e|--control|-I|--info|-f|--field|
  -x|--extract|-X|--vextract|--fsys-tarfile (输入 dpkg-deb --help)。

供内部使用:dpkg  --assert-support-predepends | --predep-package |
  --assert-working-epoch | --assert-long-filenames | --assert-multi-conrep。

选项:
  --admindir=<目录>             使用 <目录> 而非 /var/lib/dpkg。
  --root=<目录>                 安装到另一个根文件系统。
  --instdir=<目录>              改变安装的根目录的同时保持管理(admin)目录不变。
  -O|--selected-only            忽略没有被选中安装或升级的软件包。
  -E|--skip-same-version        忽略版本与已安装软件版本相同的软件包。
  -G|--refuse-downgrade         忽略版本早于已安装软件版本的的软件包。
  -B|--auto-deconfigure         就算会影响其他软件包,也要安装。
  --no-debsig                   不去试图验证软件包的签名。
  --no-act|--dry-run|--simulate
                                仅仅报告我们要执行的操作 - 但是不执行。
  -D|--debug=<八进制数字>       开启调试功能(参见 -Dhelp 或者 --debug=help)。
  --status-fd <n>               发送状态改变的更新信号到文件描述符<n>。
  --log=<文件名>                把状态的更动和操作信息记录到 <文件名>。
  --ignore-depends=<软件包名>,... 忽略关于 <软件包名> 的所有依赖关系。
  --force-...                     忽视遇到的问题 - 参见 --force-help。
  --no-force-...|--refuse-...     当遇到问题时中止运行。
可供--compare-version 使用的比较运算符有:
 lt le eq ne ge gt        (如果版本号为空,那么就认为它先于任意版本号);
 lt-nl le-nl ge-nl gt-nl  (如果版本号为空,那么就认为它后于任意版本号);
 < << <= = >= >> >        (仅仅是为了与主控文件的语法兼容)。

介绍几个常用的命令选项:

  • 查询软件包

    debian:~# dpkg -l zhcon
    期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
    | 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
    |/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
    ||/ 名称                版本                简介
    +++-=====================-=====================-==========================================================
    ii  zhcon                 0.2.6-3               A Fast Console CJK System Using FrameBuffer
    

    如果我们不知道软件包的具体名称,我们也可使用通配符来查询。

    debian:~# dpkg -l zh*
    期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
    | 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
    |/ 错误?=(无)/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
    ||/ 名称                版本                简介
    +++-=====================-=====================-==========================================================
    un  zh-autoconvert        <无>                 (无相关介绍)
    un  zh-trans              <无>                 (无相关介绍)
    ii  zhcon                 0.2.6-3               A Fast Console CJK System Using FrameBuffer
    
  • 查看软件包的详细信息

    debian:~# dpkg -s zhcon
    Package: zhcon
    Status: install ok installed
    Priority: optional
    Section: utils
    Installed-Size: 7608
    Maintainer: Yu Guanghui <ygh@debian.org>
    Architecture: i386
    Version: 1:0.2.6-3
    Depends: libc6 (>= 2.3.6-6), libgcc1 (>= 1:4.1.1-12), libggi2 (>= 1:2.2.1), libncurses5 (>= 5.4-5), libpth2 (>= 2.0.7), libstdc++6 (>= 4.1.1-12), unicon-imc2, debconf
    Conflicts: unicon-im (<< 3.0.4-9)
    Conffiles:
     /etc/zhcon.conf 91253d7043a0cb35a395b4d73d906762
     /etc/zhcon.conf 91253d7043a0cb35a395b4d73d906762
    Description: A Fast Console CJK System Using FrameBuffer
     Zhcon is a fast Linux Console Chinese System which supports framebuffer
     device.It can display Chinese,Japanese or Korean double byte characters
     on console.
     Features include:
       Full support for Linux FrameBuffer device(from 640x480x8bpp to
         1024x768x32bpp)
       Multiple language support (GB2312,GBK,BIG5,JIS,KSCM)
       Auto-detect and convert between GB2312 and BIG5 encoding(like hztty)
       Hot key to change language encoding on the fly
       Can use input method from MS Windows 98 Chinese version or UCDOS for
         MS-DOS
    
  • 查看已安装软件包所安装的文件列表。

    debian:~# dpkg -L zhcon
    /.
    /usr
    /usr/bin
    /usr/bin/zhcon
    /usr/sbin
    /usr/share
    /usr/share/man
    ...
    
    /usr/lib
    /usr/lib/zhcon
    /usr/lib/zhcon/input
    /usr/lib/zhcon/input/big5-ary30.mb
    /usr/lib/zhcon/input/big5-cj.mb
    ...
    
    /etc
    /etc/zhcon.conf
    

    还没安装的软件包不能使用该命令列出文件列表。

  • 显示.deb软件包的内容,要显示的.deb软件包要在当前目录下。

    debian:~/inst# dpkg -I jabbin_2.0beta2-1_i386.deb
     新格式的 debian 软件包,格式版本 2.0。
     大小 2812370 字节:主控包=20219 字节。
         677 字节,   17 行      control
      136505 字节, 1316 行      md5sums
     Package: jabbin
     Version: 2.0beta2-1
     Section: net
     Priority: optional
     Architecture: i386
     Depends: libc6 (>= 2.3.6-6), libexpat1 (>= 1.95.8), libgcc1 (>= 1:4.1.0), libqt3-mt (>= 3:3.3.6), libspeex1, libssl0.9.8 (>= 0.9.8b-1), libstdc++6 (>= 4.1.0), libx11-6, libxext6, libxss1, zlib1g (>= 1:1.2.1)
     Installed-Size: 12428
     Maintainer: Andrew Donnellan <ajdlinux@gmail.com>
     Description: Jabber IM client with VoIP support
      Jabbin is a Jabber instant messaging client based on Psi.
      It has support for the Jingle P2P protocol, which is used
      for Voice over Internet Protocol (VoIP).
      .
      Jabbin is compatible with the VoIP protocol used by Google
      Talk.
      .
      Homepage: http://jabbin.com
    
  • 显示.deb包中的文件列表,要显示的.deb包要在当前目录下。

    debian:~/inst# dpkg -c jabbin_2.0beta2-1_i386.deb
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/bin/
    -rwxr-xr-x root/root   5904104 2006-08-03 05:25 ./usr/bin/jabbin
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/
    -rw-r--r-- root/root        83 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/dir-wcprops
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/wcprops/
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/text-base/
    drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/props/
    ...
    
  • 安装.deb软件包,要安装的.deb文件要在当前目录下。

    debian:~/inst# dpkg -i jabbin_2.0beta2-1_i386.deb
    (正在读取数据库 ... 系统当前总共安装有 107878 个文件和目录。)
    正预备替换 jabbin 2.0beta2-1 (使用 jabbin_2.0beta2-1_i386.deb) ...
    正在解压缩将用于更替的包文件 jabbin ...
    正在设置 jabbin (2.0beta2-1) ...
    debian:~/inst#
    

    使用该命令安装.deb包并不能自动解决软件包的依赖问题,需用dpkg -I查出该软件包的依赖要求手动解决。所以该方法一般用来安装第三方的.deb软件包。如果需系统自动解决软件包的依赖关系,则要使用apt、tasksel、dselect、aptitude或图形化的syanptic、KPackage等前端工具来安装软件包。

  • 删除软件包。

    debian:~/inst# dpkg -r zhcon
    (正在读取数据库 ... 系统当前总共安装有 107878 个文件和目录。)
    正在删除 zhcon ...
    debian:~/inst#
    

    我们也可用-P选项来删除软件包,它将会清除软件包的相关配置文件。

除了dpkg命令外,系统中还有一些以dpkg开头的命令,用来管理Debian软件包。常用的有:

  • dpkg-reconfigure,重新配置软件包。

  • dpkg-source, dpkg-gencontrol, dpkg-shlibdeps, dpkg-genchanges, dpkg-buildpackage, dpkg-dista ddfile,dpkg-parsechangelog。这些都是debian源码包的管理工具。

以xxx-source方式命名的软件包是源码软件包,包含软件的源代码。用apt-get工具下载后会自动存放到/usr/src目录下。

APT

软件包管理是区分不同发行版的一大特征,如RedHat使用RPM软件包来管理软件,Debian使用deb软件包来管理软件。apt是Debian的deb软件包高级管理工具,由一组以apt开头的命令组成,如apt-get、apt-cache和apt-setup等。它的最低底层还是调用dpkg程序来处理软件包的。通过apt-get工具可自动解决软件包的依赖关系,方便软件的安装和升级。它是Debian发行版的最大特色,一定要好好掌握。

要使用好apt-get就要配置好一个名为sources.list的资源列表,资源列表指向Debian系统的软件库,apt-get会从该软件库安装各种软件包。sources.list文件位于/etc/apt目录下,下面是Sarge、Etch和Sid三个版本的写法,你可任选一种,最好不要多版本混用:

#sources.list for Sarge(stable):
deb http://http.us.debian.org/debian stable main contrib non-free
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src http://http.us.debian.org/debian stable main contrib non-free
#deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free

#sources.list for Etch(testing):
deb http://http.us.debian.org/debian testing main contrib non-free
deb http://non-us.debian.org/debian-non-US testing/non-US main contrib non-free
deb http://security.debian.org testing/updates main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src http://http.us.debian.org/debian testing main contrib non-free
#deb-src http://non-us.debian.org/debian-non-US testing/non-US main contrib non-free

#sources.list for Sid(unstable):
deb ftp://ftp.us.debian.org/debian unstable main contrib non-free
deb ftp://non-us.debian.org/debian-non-US unstable/non-US main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src http://http.us.debian.org/debian unstable main contrib non-free
#deb-src http://non-us.debian.org/debian-non-US unstable/non-US main contrib non-free

sources.list文件的内容决定了Debian的版本。安全更新只存在于stable和testing版中,unstable没有安全更新。进入stable的软件都经过严格的依赖测试和安全测试,所以如果你想系统稳定,用于工作,最好使用stable,如果你想使用最新版的软件,就使用testing或unstable。Woody、Sarge和Sid是Debian 3.x三个版本中的代号,我们一般都是以代号来称呼debian不同版本。所有Debian发行版的代号全都取自电影Toy Story,Woody是那个牛仔,Sarge是绿色塑胶军队的领导,Sid是破坏玩具的小孩。

我们也可把Debian的发行光盘做为软件库,直接在光盘上安装软件。这时就要用到apt-cdrom命令。命令格式如下:

debian:~# apt-cdrom --help
apt 0.6.46.4 for linux i386 ,编译于 Dec  4 2006 17:48:23
Usage: apt-cdrom [options] command

apt-cdrom is a tool to add CDROM's to APT's source list. The
CDROM mount point and device information is taken from apt.conf
and /etc/fstab.

Commands:
   add - 增加一个CDROM安装源到sources.list列表
   ident - 报告CDROM的验证信息

Options:
  -h   帮助
  -d   指定CDROM挂装点
  -r   为一个已经识别的光盘改名
  -m   不挂装
  -f   快速模式,不检查软件包文件
  -a   完整扫描模式
  -c=? 指定读取的配置文件
  -o=? 设置附加选项
See fstab(5)

还有一种是使用硬盘上的目录做为源。我们把下载的iso文件挂载到系统的一个目录下,如挂载到/mnt/disk中。

deian:~# mount -o loop debian-testing-dvd-1.iso /mnt/disk

配置sources.list使用硬盘上的文件作为安装源。

deb file:///mnt/disk testing main

使用硬盘上的目录做为安装源的优势是安装速度快很多。安装一个gnome系统只要几分钟时间,如果上网下载可能要几十分钟。

  • apt-get update

    更新软件包信息库。在Debian中,软件包是通过一个数据库来管理的,通过这个数据库中可跟踪你系统中已安装、没有安装和现在可安装的软件包信息。apt-get安装软件包时就是依靠这个数据库来解决软件包间的依赖关系,从而可自动安装相关软件。我们需定期运行该命令,从而保持数据库的信息为最新。

  • apt-get install package_name1 package_name2 package_name3 ...

    安装软件包。如果软件包需其它软件包支持,apt-get会通过搜索软件包数据库找到这种依赖关系,一起下载相关软件。在一个命令行中可同时安装多个软件包,中间用空格隔开即可。安装的软件包默认会存放在/var/cache/apt/archives目录下,以便以后重新安装。如果已安装的软件包损坏了,你可通过--reinstall选项来重新安装。如:

    # apt-get --reinstall install package_name
    

    Note

    在需安装的软件包名后加一个减号会删除软件包,如:apt-get install package_name-。

    只是下载软件,不解包和安装使用-d选项,如:

    # apt-get -d install package_name
    

    使用--dry-run选项可使apt-get在安装软件包前进行测试,如:

    # apt-get install package_name --dry-run
    

    Debian软件包的名字和软件名不同,所以在安装前如不知道软件包的名字,可到Debian的官方软件库查询,网址是:http://www.debian.org/distrib/packages/。或者用下面介绍的apt-cache search package_name命令来查询。

  • apt-get remove package_name1 package_name2 package_name3 ...

    删除软件包。如果你想删除软件包,只要使用该命令即可。如果你想把该软件的配置文件也删除,可以用--purge选项,如:

    # apt-get --purge remove package_name
    

    Note

    类似地,在删除软件包名后加一个加号会安装软件包,如:apt-get remove package_name+。

  • apt-get source package_name1 package_name2 package_name3

    下载软件包的的源码版本。

  • apt-get build-dep package_name

    构造软件包的源码的编译环境,为编译软件包下载必须的其它软件包。

  • apt-get upgrade package_name1 package_name2 package_name3 ...

    软件包升级功能是APT系统这么成功的主要原因。通过该命令,我们就可把软件升级到最版本。在使用该命令前,最好先运行apt-get update命令,以更新软件包数据库。但该方案不是更新系统最好的方法,一些包会因为包依赖问题而保留(kept back)一些旧的软件包。Debian提供了一个更好的升级方案,就是用dis-upgrade。下面一节会详细介绍。

  • apt-get dist-upgrade

    更新整个Debian系统。可从网络或本地更新整个系统。它会重新安排好包的依赖性。如果有些包由于一些原因实在不能更新,我们可通过以下命令查询原因:

    # apt-get -o Debug::pkgProblemResolver=yes dist-upgrade
    

    Note

    用apt-show-versions -u可获得可升级软件包的列表。该命令还有一些有用的选项,可用-h选项查看详细帮助,了解更多功能。

  • apt-get clean

    删除下载了的软件包,当我们通过apt-get安装软件包时,APT会把软件包下载到本地/var/cache/apt/archives/目录。该命令会删除该文件夹内的除锁住外的所有软件包。该文件夹下的文件不可用rm命令删除,一定要使用apt-get命令来删除。

  • apt-get autoclean

    删除已下载的旧版本的软件包。该命令类似于上面的命令,但它会有选择地删除旧版本的软件包。

  • apt-get autoremove

    自动移除随其它软件自动安装但又不再有用的软件。

  • apt-get dselect-upgrade

    通过dselect的“建议”和“推荐”功能更新系统。dselect是Debian中一个功能强大的包管理工具。它可帮助用户选择软件包来安装,其中一个有用功能是它会建议和推荐安装其它相关软件包。我们可在APT中使用它这个功能。

  • apt-get check

    检查系统中已安装软件包的依赖性。

  • apt-get的secret cow powers

    debian:~# apt-get moo
             (__)
             (oo)
       /------\/
      / |    ||
     *  /\---/\
        ~~   ~~
    ...."Have you mooed today?"...
    

apt-cache

apt-cache是一个apt软件包管理工具,它可查询apt的二进制软件包缓存文件。通过它我们可查询软件包的状态信息。

  • apt-cache show package_name

    显示软件的信息,包括版本号,安装状态和包依赖关系等。

  • apt-cache search package_name

    搜索软件包,软件包名可用正则表达式。

  • apt-cache showpkg package_name

    显示软件包的依赖关系信息。

  • apt-cache stats

    显示当前数据源中软件包的统计信息。

  • apt-cache policy package_name

    显示软件包的安装状态和版本信息。

  • apt-cache depends package_name

    显示指定软件包所依赖的软件包。

  • apt-cache rdepends package_name

    显示软件包的反向依赖关系,即有什么软件包需依赖你所指定的软件包。

apt-file

apt-file是一个软件包查找工具,可以查到软件包所含的文件和安装的位置。

  • apt-file update

    更新软件包的文件库,第一次使用或apt-get update后都需运行一次。

  • apt-file search file_name

    查找该文件存在于哪些软件包中。

  • apt-file list package_name

    显示该软件包的文件。

apt-key

apt-key是Debian软件包的安全管理工具。每个发布的deb包,都是通过密钥认证的,apt-key用来管理密钥。

  • apt-key list

    列出已保存在系统中key。

  • apt-key add keyname

    把下载的key添加到本地trusted数据库中。

  • apt-key del keyname

    从本地trusted数据库删除key。

  • apt-key update

    更新本地trusted数据库,删除过期没用的key。

Note

apt-get是命令行方式的dpkg前台程序,不喜欢命令行方式的朋友也可以试试aptitude和synaptic这两个软件包。aptitude是一个字符界面的dpkg前端程序,synaptic是一个GTK界面的dpkg前端程序。

wajig

wajig是一个简单的软件包管理前端,和apt-get类似,但功能更多,它把apt-get、dpkg等Debian系统下的软件包管理工具都集成在一起,只用一个wajig命令就能完成各种复杂的管理工作。wajig是要额外安装的软件,同时需要python支持。base系统自带的软件包管理工具还是apt-get。

用apt-get install wajig即可安装wajig。它还有一个Gnome GUI前端界面,能通过鼠标点击完成所有的软件包管理工作。有关wajig的详细介绍请参考http://wajig.togaware.com/

建立一个混合系统

我们有时喜欢用一个Debian版本作为主系统,并使用其它版本的软件包,如我们用testing版为主系统,但有时又会用到unstable版里的新软件包。设置主系统你需编辑/etc/apt/apt.conf文件,在文件中加入以下内容:

APT::Default-Release "version";

这里的version就是Debian的发行版本,包括stable,testing和unstable。要从Debian另外的版本中安装软件包,需用以下的APT命令:

# apt-get -t version install package

为使上面的命令正常工作,需要在sources.list包含有相应的version资源连接。

你也可用以下命令指定安装软件包的版本。如:

# apt-get install nautilus=2.2.4-1

Note

安装不同版本的软件包容易造成系统包依赖性出错,所以应尽量避免在工作环境中使用。

升级指定版本的软件包

apt-show-versions可显示已安装软件包的版本,它提供了一种安全的方法从混合版本环境中升级指定版本的软件包。如以下命令只升级unstable的软件包:

# apt-get install `apt-show-versions -u -b | grep unstable`

保持指定软件包的版本

有时你或许不想升级某些软件包,这时我们可“pin”住这些软件包,使它们不能被升级。我们可很容易实现该功能,只要编辑/etc/apt/preferences配置文件。该文件的格式如下:

Package: <package>                       
     Pin: <pin definition>                       
     Pin-Priority: <pin's priority>

建立本地APT代理服务器

Debian系统软件包的安装需要有较好的网络环境。如果上网环境不理想,如用电话拔号上网,则会花大量的时间在下载安装软件包上。虽然我们也可从CDROM上安装软件,但不能及时更新软件包。apt-proxy服务器则为我们提供了一种在局域网上共享软件包缓存的机制。安装过的软件包都会保存在apt-proxy服务器上,当其他用户需安装相同的软件包时,apt工具会先在apt-proxy服务器上下载,只有当你想安装的软件包在apt-proxy服务器上找不到时,才真正到互联网上去下载。

使用apt-proxy服务器能有效提高软件包的下载速度,并节省网络的带宽。使用的用户越多,效果越明显。安装apt-proxy服务器的方法很简单,直接用apt-get install apt-proxy命令安装即可。

安装完apt-proxy服务器后,配置程序会自动启动apt-proxy服务器进程,apt-proxy服务器默认使用9999端口监听网络请求。配置文件是/etc/apt-proxy/目录下apt-proxy-v2.conf,里面的配置选项有很多,这里介绍主要的部份。我们找到debian节,backends选项配置软件库的源地址,security节的backends选项配置安全更新的源地址。如:

[debian]
;; The main Debian archive
;; You can override the default timeout like this:
;timeout = 30

;; Rsync server used to rsync the Packages file (NOT YET IMPLEMENTED)
;;rsyncpackages = rsync://ftp.de.debian.org/debian

;; Backend servers, in order of preference
backends =
        http://ftp.us.debian.org/debian
        http://ftp.de.debian.org/debian
        http://ftp2.de.debian.org/debian
        ftp://ftp.uk.debian.org/debian

[security]
;; Debian security archive
backends =
        http://security.debian.org/debian-security
        http://ftp2.de.debian.org/debian-security

配置完后重启服务器使配置生效。客户端的配置关键是修改sources.list文档,把软件包的源地址改成apt-proxy服务器的地址就可以了。如:

#sources.list for Sarge(stable):
deb http://192.168.3.3:9999/debian stable main contrib non-free
deb http://192.168.3.3:9999 stable/updates main contrib non-free
deb-src http://192.168.3.3:9999/debian stable main contrib non-free

设置完sources.list文档后,需运行apt-get update更新软件包的源信息。更新完成后就可使用apt工具安装软件包啦。

apt-spy介绍

Debian安装源服务器有很多,apt-spy工具可以帮助我们找到最快的服务器。不同服务器的下载速度相差很远的,有的只有几k,而有的可以达到200-300k。象debian这样依赖网络的操作系统,找到一个快速稳定的安装源服务器是很重要的。

使用apt-get install apt-spy命令即可安装该工具。安装完成后,使用以下命令测试Debian安装源的下载速度。

debian:/etc# apt-spy -d unstable -a asia -t 5

SERVER: ftp.linuxforum.net
Benchmarking FTP...
                Error: a timeout was reached

SERVER: mirrors.geekbone.org
Benchmarking FTP...
                Downloaded 584136 bytes in 9.41 seconds
                Download speed: 60.64 kB/sec
Benchmarking HTTP...
                Downloaded 574808 bytes in 5.88 seconds
                Download speed: 95.52 kB/sec

SERVER: debian.cn99.com
Benchmarking FTP...
                Error: couldn't connect to host
Benchmarking HTTP...
                Downloaded 2434408 bytes in 5.14 seconds
                Download speed: 462.79 kB/sec
...

命令行中的-d选项指定发行版本,如stable、testing、unstable。-a选项指定debian安装源服务器的区域,如asia、Europe、North-America等。这些区域信息保存在/etc/apt-spy.conf文档中,如果要测试所有服务器,还可用ALL关健字代替具体的区域。-t选项指定连接超时阀值,阀值以秒为单位,设置较小的阀值能有效提高测试速度,忽略慢速服务器。

测试完成后,apt-spy会自动更新你的sources.list文件。apt-spy在更新你的sources.list前会备份一次sources.list文件,把原来的sources.list复制为sources.list.bak。但每运行一次apt-spy命令它都会生成一个新的sources.list.bak文件,把旧的sources.list.bak覆盖掉。所以在使用apt-spy命令前最好先备份好原来的sources.list文件。

Chapter 5. 中文环境

国际化(Internationalization,简写为I18N)

国际化是指软件能用于多国语言环境的能力,它在系统的低层函数库中提供一组标准的函数接口,能根据本地化(locale)设置显示该地区语言环境的信息。本地化(Localization 简写为L10N)是指将本地区的语言环境数据安装在系统底层的数据库中,以便让系统函数存取来显示正确的文字信息。多语言化(Multilingualization 简写为M17N)是指程序可以处理多种语言的过程。本地化和多语言化都是国际化框架中的组成部份。

本地化在Linux中通过locale来设置程序运行的不同语言环境,locale是(Local Environment)的缩写,它是一个语言环境数据库。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集编码方式。在locale环境中,有一组变量,代表国际化环境中的不同设置:

  1. LC_COLLATE

    定义该环境的排序和比较规则

  2. LC_CTYPE

    用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。

  3. LC_MONETARY

    货币格式

  4. LC_NUMERIC

    非货币的数字显示格式

  5. LC_TIME

    时间和日期格式

  6. LC_MESSAGES

    应用程序显示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如LANGUANE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"。

  7. LANG

    LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。

  8. LC_ALL

    它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。

一个例子:

设置前,使用默认locale:
debian:~# locale
LANG="POSIX"
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

设置后,使用zh_CN.GDK中文locale:
debian:~# export LC_ALL=zh_CN.GBK
debian:~# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.GBK"
LC_NUMERIC="zh_CN.GBK"
LC_TIME="zh_CN.GBK"
LC_COLLATE="zh_CN.GBK"
LC_MONETARY="zh_CN.GBK"
LC_MESSAGES="zh_CN.GBK"
LC_PAPER="zh_CN.GBK"
LC_NAME="zh_CN.GBK"
LC_ADDRESS="zh_CN.GBK"
LC_TELEPHONE="zh_CN.GBK"
LC_MEASUREMENT="zh_CN.GBK"
LC_IDENTIFICATION="zh_CN.GBK"
LC_ALL=zh_CN.GBK

"C"是系统默认的locale,"POSIX"是"C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。

在Debian中安装locales的方法如下:

  • 通过apt-get install locales命令安装locales包

  • 安装完成locales包后,系统会自动进行locale配置,你只要选择所需的locale,可以多选。最后指定一个系统默认的locale。这样系统就会帮你自动生成相应的locale和配置好系统的locale。

  • 增加新的locale也很简单,用dpkp-reconfigure locales重新配置locale即可。

  • 我们也可手动增加locale,只要把新的locale增加到/etc/locale.gen文件中,再运行locale-gen命令即可生成新的locale。再通过设置上面介绍的LC_*变量就可设置系统的locale了。下是一个locale.gen文件的样例。

    # This file lists locales that you wish to have built. You can find a list
    # of valid supported locales at /usr/share/i18n/SUPPORTED. Other
    # combinations are possible, but may not be well tested. If you change
    # this file, you need to rerun locale-gen.
    #
    
    zh_CN.GBK GBK
    
    zh_CN.UTF-8 UTF-8
    

在安装了locale支持的系统中,在/usr/share/locale目录下保存locale的信息,在/usr/share/consolefonts目录下保存字体信息,在/usr/lib/gconv目录下保存字符转换模块的信息。总结:如果要在Linux下正确显示中文信息,需要做以下工作。

  • 系统本身要有国际化支持,Linux的国际化支持是很完善的。

  • 安装本地locale,如:zh_CN.GB2312、zh_CN.UTF-8等。

  • 安装中文字体,如:文泉驿和文鼎的中文字体等。

  • 设置中文的环境变量,如:LANG=zh_CN.GB2312、LANG=zh_CN.UTF-8等。有几个地方都可以设置locale环境变量。

    • 一个是在X Window的登录管理器中可以设置,如GDM、KDM。

    • 一个是在X Window Session初始化时设置,在/etc/X11/Xsession.d目录下的所有脚本在X Window Session初始化时都会自动运行,所以我们可把export LANG="zh_CN.GB2312"这条设置命令放到任意的脚本中。建议放到中文输入法的启动脚本中。示例:(这是我手工创建的启动fcitx中文输入法的脚本91fcitx)

      debian:/etc/X11/Xsession.d# cat 91fcitx
      export LANG="zh_CN.UTF-8"
      export XMODIFIERS="@im=fcitx"
      export XIM_PROGRAM=fcitx
      export XIM=fcitx
      fcitx&
      
    • 在shell的启动脚本中设置,如在.bashrc、.bash_profile等文件中直接加入export LANG="zh_CN.UTF-8"命令。

    • 还可以在shell中直接用export LANG="zh_CN.UTF-8"命令设置。但如果使用该命令设置的环境变量只在当前shell中有效。

  • 在应用程序中配置使用中文显示。

要在Shell中正常显示系统的中文提示信息和支持中文输入。LANG和shell的编码配置需一致,并安装有中文locale。如:LANG和shell的编码都配置成zh_CN.utf8,并安装有zh_CN.utf8这个locale。如果shell和LANG配置不同,则中文显示乱码;如果LANG里设置的locale没有安装,则不能显示系统的中文提示信息,只会显示英文提示信息。

在不同的locale环境下会生成具有不同编码的文件,如在gb2312环境下创建的文件就具有gb2312编码,在utf-8环境下创建的文件就具有utf-8编码。如果我们在gb2312环境下打开utf-8编码的文件中文部份就会显示乱码。在Linux中有一个叫iconv的程序可以帮助我们进行文件编码的转换工作。下面的示例是把一个使用gb2312编码的文件转换成utf-8编码的文件:

debian:~/Desktop# iconv -f gb2312 -t utf-8 7月.txt -o 77.txt

-f选项指定源文件的编码,-t选项指定转换后文件的编码,7月.txt是要转换的文件,-o选项指定转换后输出的文件名。

字符集与编码

字符集(Charset)也就是字符的集合,有英文字符的集合、简体中文汉字字符的集合等,如:ASCII字符集、ISO 8859字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。这些字符集是不能直接在计算机中使用,需要进行编码。编码(Encoding)也就是对字符集按一定的顺序和规则用数字进行编码,一个数字对应一个字符。编码方式有GB2312-1980,UTF-8和UTF-16等。

Chapter 6. XFree86中的字体

字体设置在X系统中是一项较复杂而又非常重要的内容,字体是我们一进入X window就必须整天面对的,清晰、美观的字体会使我们工作起来赏心悦目,轻松愉快。XFree86是X系统在X86架构中的免费实现,也是现在Linux系统默认的X系统。为了设置好字体,我们需了解XFree86系统中的字体系统的原理和实现技术。只是照抄网上的设置可能也可配置出一套效果不错的字体,但这样我们只会知其然而不其所以然,不能融会贯通,灵活应用。请随我慢慢进入XFree86中的字体系统,一窥其中的奥秘。

Note

有关X系统和XFree86的资料可参考我整理的X window学习笔记,里面对这两个系统的历史渊源有详细介绍。

两个字体处理系统

XFree86系统有两套的字体系统,这也是为什么X window中字体设置较复杂的原因之一。这两套的字体系统分别是:核心X11字体系统和Xft字体系统。核心X11字体系统是应用最广泛的一套字体系统,所有的X系统都支持。Xft字体系统是一个新的字体技术,只能用在基于XFree86系统的X系统上,但该套字体系统配置简单,容易使用,将是未来发展的方向。

Xft

Xft是一个library,它没有自已的配置机制,它依靠fontconfig库来配置和定制字体,Xft负责字体的显示。也就是说,fontconfig是一种让X系统可以找到某种字体的库,而Xft是负责在X系统中把fontconfig库找到的字体如何显示出来的库。所以讨论Xft字体配置其实就是讨论fontconfig。fontconfig包含在XFree86发布版中。

fontconfig的作用:

  • 自动搜索字体路径,发现新拷贝的字体。

  • 当需显示的字体不存在时,会自动选择其它字体代替显示。这也就是我们在美化字体时为什么要调整字体的排列顺序的原因。

  • 配合Xft等X系统的渲染引擎,实现质量的字体输出。

fontconfig的配置文件有三个,一个是系统级的配置文件,位于/etc/fonts/fonts.conf,该目录下还有一个local.conf,一般我们只修改local.conf文件,fonts.conf一般不建议去修改。第三个配置文件是用户主目录下的~/.fonts.conf,它是用户级的字体配置文件,只对当前用户有效。这三个文件的格式是一样的,都是一个XML格式的文件。该XML文件的语法规则在fonts.dtd里定义。详细的配置介绍请参考中国Linux公社中的“Linux高质量字体研究”论坛。

在Xft字体系统中安装新的字体是很简单的,只需把字体文件拷贝到fonts.conf中指定的字体文件目录即可,fontconfig会自动感知新字体。默认的字体目录有四个,分别是:

  1. /usr/share/fonts

  2. /usr/X11R6/lib/X11/fonts/Type1

  3. /usr/local/share/fonts

  4. ~/.fonts

把新字体文件拷贝到字体目录后,我们就可用fc-list命令列出新安装的字体,如果没有,可用fc-cache -f -v命令手动更新系统字体配置。这样,再运行fc-list就应该可以看到新安装的字体了。使用Xft字体系统是不用配置/etc/X11/XF86config-4的,也不用重启X服务器使配置生效。Xft字体系统比起传统的X11核心字体系统来说真的是方便很多。所以它是未来的发展方向。目前,并不是所有的应用程序都支持Xft字体系统。下面是各类程序对Xft字体系统的支持情况介绍:

  • GTK+2.x和QT程序都可以使用Xft字体系统,但GTK+1.x程序是不支持Xft字体系统的,它只能使用X11核心字体系统。

  • GTK+2.2版本及以上的程序默认使用Xft字体系统,不用进行配置。GTK+2.0程序如果要使用Xft,则需设置环境变量GDK_USE_XFT=1。

  • GTK+2.x程序字体配置可通过gnome桌面系统提供的gnome-font-properties工具来配置,该工具可在GNOME桌面环境中的"应用程序"--"桌面首选项"--"字体"中找到。GTK+2.x程序还有一个全局配置文件/etc/gtk-2.0/gtkrc,里面可设置GTK+2.x程序所用字体,该文件的内容如下:

    style "gtk-default-zh-cn" {
        font_name = "Bitstream Vera Sans 10,SimSun 10"
        }
        class "GtkWidget" style "gtk-default-zh-cn"
    

    这样GTK+2.x程序的英文会用10号的Bitstream Vera Sans字体显示,中文会用10号的SimSun字体显示。

  • QT程序的默认字体可在KDE的“控制中心”--“外观和主题”--“字体”中设置,也可运行qtconfig图形化配置工具设置。但好象控制中心的设置优先级高于qtconfig工具。

  • 在KDE环境下,我们可以安装gtk-qt-engine软件包。安装了该软件包后,在KDE桌面环境的控制中心的主题和外观栏目下就会多出一个GTK Styles and Fonts的配置项。在这里我们就可以配置GTK程序的主题风格和字体。

X11核心字体系统

配置X11核心字体有两步,第一步是建立字体目录,在该目录中包含字体文件。第二步是配置X服务器,使它能使用这些字体。下面我以配置simsun.ttc字体为例说明:

  • X服务器的字体目录一般默认已建好,如/usr/X11R6/lib/X11/fonts/truetype。我们把simsun.ttc拷贝到该目录。

  • 生成字体索引文件,如果是位图字体则只有一个fonts.dir索引文件,如果是像simsun.ttc这样的可缩放字体则还需要一个fonts.scale索引文件。索引文件可通过工具自动生成,如果是TrueType字体,可使用ttmkfdir工具。其它的字体可用mkfontdir和mkfontscale这两个工具来生成。simsun.ttc是TrueType字体,所以我用ttmkfdir工具生成fonts.scale:

    debian:/usr/X11R6/lib/X11/fonts/truetype# ttmkfdir
    

    fonts.dir文件和fonts.scale内容是一样的,所以可直接拷贝。如果不用拷贝的方式,用mkfontdir命令也可以,结果是一样的。

  • 设置XF86config-4配置文件,确定包含上述字体路径和正确加载X字体模块。

    Section "Files"
    #       FontPath        "unix/:7110"                    # local font server
            # if the local font server has problems, we can fall back on these
            FontPath        "/usr/X11R6/lib/X11/fonts/truetype"
            FontPath        "/usr/lib/X11/fonts/misc"
            FontPath        "/usr/lib/X11/fonts/cyrillic"
            FontPath        "/usr/lib/X11/fonts/100dpi/:unscaled"
            FontPath        "/usr/lib/X11/fonts/75dpi/:unscaled"
            FontPath        "/usr/lib/X11/fonts/Type1"
            FontPath        "/usr/lib/X11/fonts/CID"
            FontPath        "/usr/lib/X11/fonts/Speedo"
            FontPath        "/usr/lib/X11/fonts/100dpi"
            FontPath        "/usr/lib/X11/fonts/75dpi"
    EndSection
    
    Section "Module"
    #       Load    "GLcore"
            Load    "bitmap"
            Load    "dbe"
            Load    "ddc"
            Load    "dri"
            Load    "extmod"
    #       Load    "freetype"
            Load    "glx"
            Load    "int10"
            Load    "record"
            Load    "speedo"
            Load    "type1"
            Load    "vbe"
            Load    "xtt"
    EndSection
    

    从XFree86转到X.org后,配置文件使用/etc/X11/xorg.conf代替原来的XF86Config-4。在X.org中,使用开源的freetype模块,所以要注释掉xtt模块,重新启用freetype。

    Section "Module"
    #       Load    "xtt"
            Load    "GLcore"
            Load    "bitmap"
            Load    "dbe"
            Load    "ddc"
            Load    "dri"
            Load    "extmod"
            Load    "freetype"
            Load    "glx"
            Load    "int10"
            Load    "record"
            Load    "speedo"
            Load    "type1"
            Load    "vbe"
    EndSection
    

    如果没启用freetype模块,则系统会找不到GB2312和GB18030编码的X11核心中文字体,影响freemind、xmms等要使用X11核心字体程序的中文显示。

    字体模块列表:

    • bitmap:位图字体,支持的字体文件有*.bdf,*.pcf和*.snf。

    • type1:Type1字体,支持的字体文件有*.pfa和*.pfb,还有CIDFonts。

    • speedo:Bitstream Speedo字体,支持的字体文件有*.spd。

    • freetype:TrueType字体,支持的字体文件有*.ttf和*.ttc。,在X.org系统中,xtt模块功能合并到该模块中。

    • xtt:另一个的TrueType字体模块,支持的字体文件有*.ttf和*.ttc。在X.org系统中,不使该模块,该模块的功能合并到freetype模块中。

  • 重启X服务器后就可使用simsun中文字体了,或者使用xset fp rehash命令重新刷新字体。xlsfonts命令可列出系统中已安装的X11核心字体。

Note

如果你是使用Debian系统,则可使用defoma(Debian Font Manager)工具来帮你完成以上设置。该工具的使用请参考本文“Debian的安装和配置”一章的内容。

GTK+1.x程序使用X11核心字体系统。要在GTK+1.x程序中使用simsun字体,需配置/etc/gtk/gtkrc.zh_CN文件,内容如下:

# This file defines the fontsets for Chinese language (zh) using
# the simplified chinese standard GuoBiao as in mainland China (CN)
#
# 1999, Pablo Saratxaga <pablo@mandrakesoft.com>
#

style "gtk-default-zh-cn" {
fontset = "-*-bitstream vera Serif-medium-r-normal-*-*-120-*-*-p-*-microsoft-cp1252,\
-*-simsun-medium-r-normal-*-12-*-*-*-*-*-gbk-0"
}
class "GtkWidget" style "gtk-default-zh-cn" 

这样GTK+1.x程序可显示中文了,中文使用simsun字体,英文使用bitstream vera sans字体。

Chapter 7. Debian桌面系统

Linux等开源软件的优点是可配置性强,同一种功能可通过不同的方法来实现,所以我们使用的系统都会有差别,配置方式也不尽相同。为了积累知识和备忘,我把我在安装和配置Debian桌面系统的所有操作都记录在该章节中。

Debian base系统安装

Debian发行版为我们提供了灵活的安装方式,可以先安装一个很小的(几十兆)base系统,再通过网络更新系统和安装其它应用软件。这种方式要求有较好的网络环境,比如ADSL。我就是采用这种方式安装的,下面是我的具体操作步骤:

  • 一般我们都是到www.debian.org网站去下载iso文档。不一定要到上面介绍的网址去下载。在www.debian.org网站上主要有三种iso镜像,分别是full image,netinst image和business card image。full image顾名思义就是全镜像,包括debian发行版所有内容,可以通过镜像安装debian发行版的所有内容。netinst image就是网络安装镜像,包含安装程序和一个基本系统,大约180M左右。安装这个基本系统后再通过网络安装其它软件。business cart image比网络安装镜像更小,只有几十兆。它不包含基本系统,只有安装程序。

    了解了debian发行版所提供的安装镜像后,我们就可以根据自已的需求选择适合自已的安装方法。

  • 用启动光盘启动电脑,在出现boot:提示符状态后直接按回车载入开始安装。在出现boot:提示符时按F1可以显示帮助信息。如果我们的安装镜像是包含Deiban-installer的,则可以在boot:状态下输入installgui命令启动图形化安装界面。

  • 对硬盘分区,我的分区在安装之前已用分区工具分好,所以可直接挂接。我设置了一个交换分区(swap)和一个linux分区(ext2)。完成格式化后把分区挂接为根分区。接着就可配置主机名和网络了,我的网卡需加载设备驱动模组才能识别,我的网卡是最常见的RTL-8139,选择“ne”模组支持即可。最后选安装基本系统开始安装。

    Note

    如果启动盘找不到硬盘,可用我的方法,先用一些分区工具分好区再装,或下载500多兆那个启动盘,在出现boot:提示符时打bf24启动应该就可以找到硬盘了。

  • 安装完基本系统后,需配置系统的启动信息。Debian默认使用lilo做为启动管理器,我的系统中本来已有windows XP系统,我用lilo来统一管理双系统的启动,所以我把lilo安装到MBR中。

  • 取出光盘重启电脑,成功启动Linux后,系统会自动运行base-config程序进行系统的初始配置,配置的内容有:

    • 时区设置:亚洲/上海

    • 设置root用户密码和启动shadow

    • 设置sorucelist为http方式

    • 我不想用exim作为我的邮件客户端,所以不配置exim程序。

  • 进入Debian系统后,首先要配置ADSL拔号程序,通过ADSL连接Internet。ADSL使用pppoe协议来进行通信,pppoe使用以太网帧封装ppp数据帧,再通过ppp链路传送出去。所以系统要先安装有pppoe和ppp软件包。Debian提供了一个字符界面的配置向导pppoeconf来帮我们配置ADSL连接。安装pppoeconf会自动把pppoe和ppp包也一起安装。运行该程序按提示填上ADSL帐号和密码。运行pon连接,poff断开连接,plog查看连接状态。

  • 成功连接Internet后就可进行下一步安装了,首先把系统升级到testing。把/etc/apt/sources.list里所有的stable改成testing。再运行apt-get update获取最新的软件包信息,最后运行apt-get dist-upgrade更新整个系统。以后升级系统中的软件只需运行apt-get update和apt-get upgrade两步即可。apt-get dist-upgrade只用于debian系统版本的升级,如stable升级到testing。

  • 更新完系统后,需运行lilo -v -v -v更新启动信息,否则在系统重启时会出现LI两个字符后停住,不能正常启动系统。

利用debootstrap工具安装Debian base系统

debootstrap可以在一个运行中的Debian系统中安装一套全新的Deiban base系统,我们可以把新系统安装在一个目录中或一个分区中。安装完成后用chroot命令就可进入新安装的系统中,就好象在我们的系统中多了一套全新的操作系统一样,这对我们进行系统和服务的测试是很有用的。

安装方法很简单,先下载debootstrap软件包。

debian:~# apt-get install debootstrap

安装完debootstrap后,我们就可用它来安装Debian base系统啦,debootstrap的命令格式如下:

debootstrap --arch <架构> <版本> <debian的安装挂载点> <镜像站点的URL>

我在i386机器的电脑上安装sid版的debian系统,安装在/root/base目录下,选用的镜像站点为http://debian.cn99.com/debian。

debian:~# debootstrap --arch i386 sid base http://debian.cn99.com/debian
I: Retrieving Release
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Found additional base dependencies: update-inetd
I: Checking component main on http://debian.cn99.com/debian...
I: Retrieving adduser
I: Validating adduser
I: Retrieving apt
I: Validating apt
I: Retrieving apt-utils
I: Validating apt-utils
I: Retrieving aptitude

...

安装完成后,我们就可以用chroot命令进入新的系统。为了使一些程序正常运行,我们还要挂装proc文件系统。

debian:~# chroot base
debian:/# mount proc

Debian启动过程简介

Debian与其它的Linux发行版一样,系统启动主要分三个阶段,第一个阶段是BIOS启动阶段,第二个阶段是kernel启动阶段,第三个阶段是init初始化系统阶段。当电脑加电启动时会首先运行主板flash Memory中的程序,主要任务是检测电脑的基础组件,如主板、内存和硬盘等。当基础组件检测完成后,找到引导设备后,电脑就会进入kernel启动阶段。kernel启动阶段通过MBR中的引导程序(LILO or GRUB)把内核映像装入内存运行。Kernel启动阶段完成后,就开始启动系统的第一个进程init,它完成一系统初始化工作,使Linux系统可以正常使用。init进程是Linux系统所有进程的父进程。本节重点介绍init初始化程序。

init程序的配置文件是/etc/inittab。内容如下:

# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:5:initdefault:    #默认的启动级别为5

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS    #第一个执行的初始化脚本

# What to do in single-user mode.
~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
#ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

在这个配置文件中,以“#”号开头的内容是注释信息。第一个执行的脚本是/etc/init.d/rcS,它会执行/etc/rcS.d目录下的所有脚本。/etc/rcS.d目录下的脚本名都以大写字母“S”和一个顺序号开头,它们在系统初始化时都要被执行。如果某个脚本你不想执行,则改成以大写字母“K”开头即可。以”K“开头的脚本会先被执行,它调用了脚本的stop参数,用来关闭一些进程,接着再执行以”S“开头的脚本,它调用了脚本的start参数,用以启动进程。其实/etc/rcS.d目录下的所有脚本都是符号链接,真正执行的脚本存放在/etc/init.d目录下。脚本会按从小到大的顺序执行,以S40开头的脚本执行之后,本地文件系统已加载,网络已启动,所有的驱动程序完成初始化。S60的脚本执行之后,系统时钟已设置,NFS文件系统已加载,文件系统已可用。

执行完系统级的初始化脚本后,init程序会继续执行默认运行级别指定的启动脚本。如指定的默认运行级别是5则会执行/etc/rc5.d目录下的脚本,如果是1则会执行/etc/rc1.d目录下的脚本。/etc/rc5.d目录下的脚本名的命名格式和rcS.d目录下的脚本一样,也是一些以“S”或“K”开头的符号链接。以“S”开头表示启动,以“K”开头的表示禁止。Debian系统定义了从0到6共7个运行级别。每个级别代表意义如下:

  • Runlevel 0:关机操作,关闭所有程序,如果内核支持APM,还可以自动关闭主机电源。

  • Runlevel 1:单用户模式,提供一个root shell和只读的文件系统,该级别用于进行系统恢复。

  • Runlevel 2,3,4,5:多用户模式,由用户自由设定。

  • Runlevel 6:与级别0类似,但它不关闭电脑,而是重启电脑。

update-rc.d命令用以维护不同级别下的启动脚本,它会自动在rc?.d目录下创建到/etc/init.d目录中脚本的链接。在运行该命令前,请确保你要添加的启动脚本已位于/etc/init.d目录下。下面是一个update-rc.d命令示例:

debian:/etc# update-rc.d foo start 99 2 3 4 5 . stop 01 0 1 6 .
 Adding system startup for /etc/init.d/foo ...
   /etc/rc0.d/K01foo -> ../init.d/foo
   /etc/rc1.d/K01foo -> ../init.d/foo
   /etc/rc6.d/K01foo -> ../init.d/foo
   /etc/rc2.d/S99foo -> ../init.d/foo
   /etc/rc3.d/S99foo -> ../init.d/foo
   /etc/rc4.d/S99foo -> ../init.d/foo
   /etc/rc5.d/S99foo -> ../init.d/foo

/etc/inittab配置文件有专门的指令控制init进程的运行,指令格式如下:

id:runlevels:action:command

id是指令标识,runlevels表示运行级别,action表示执行的时机,command表示执行的命令。如:

l5:5:wait:/etc/init.d/rc 5

其中15是指令标识符,5是运行级别,wait表示进入运行级别时就开始执行”/etc/init.d/rc 5“命令,在执行命令期间,init程序会停下来,直到命令执行完成后init才继续往下执行。action有很多种,下面分别介绍:

  • respawn,启动命令并监视命令的执行,当进程退出时,会再次执行该命令。

  • wait,进行指定运行级别时,执行指定的命令,并且init进程会暂停,直到命令执行完成再继续。

  • once,进行指定运行级别时,执行一次指定命令。

  • boot,命令在系统引导时就被执行,不受运行级别约束。

  • bootwait,同上,但init进程会停下来等命令执行完才继续往下执行。

  • off,禁用所有运行级别下的某个命令。

  • initdefault,指定在系统引导时进入哪个运行级别。

  • powerwait,在电源不足时需要运行的命令,init进程会暂停,直到指定的命令完成。

  • powerfailnow,同上,但init进程不会暂停。

  • powerokwork,电源恢复正常后需运行的命令,init进程暂停,直到命令执行完成。

  • ctrlaltdel,在捕获到Ctrl+Alt+Del组合键时执行的命令。

  • kbdrequest,把特殊的动作映射到特定的按键上。

安装2.6.10内核,并支持图形化启动界面。

光盘上的内核较旧,所以成功安装完成系统后,一般都要更新内核,以支持更多的硬件和提高系统性能。在Debian发行版中,更新内核也可使用apt-get install kernel-image-2.x.x方式来直接更新。但这样更新有两个问题,一是内核包的更新要滞后于Linux内核的更新速度,也就是说采用该方式你用不到最新的内核;二是内核包不是针对你的计算机编译的,所以性能和配置可能会不符合你的要求。我一般不用这种方式更新我的内核,而是采用直接编译内核源码,再用make-kpkg命令打包的方式来安装。make-kpkg是Debian的内核打包工具,它可编译Linux源码,并打包成Debian格式的内核安装包。这样我们即可使用最新的Linux内核,又可用Debian的方式安装和管理内核包,一举两得。现在来看看具体的安装过程,我把2.4.20内核更新到最新的2.6.10。

  • 到http://www.kernel.org下载最新的2.6.10内核,解压到/usr/src目录下。

  • 安装编译2.6内核所需的软件

    # apt-get install kernel-package ncurses-dev fakeroot module-init-tools
    
  • 在/usr/src/linux-2.6.10目录下运行以下命令配置和编译新内核:

    # make menuconfig
    # make-kpkg clean
    # fakeroot make-kpkg --revision=mykernel.1.0 kernel_image
    

    如果编译失败,可运行上面的命令重新配置和编译。内核配置信息默认会保存在/usr/src/linux-2.6.10/.config文件中。make-kpkg是kernel-package软件包的工具之一,/usr/share/doc/kernel-package/README.gz文档有kernel-package软件包的详细使用说明。

  • 内核编译完成后在/usr/src目录下就会生成一个kernel-image-2.6.10_mykernel.1.0_i386.deb软件包,用以下命令安装:

    # dpkg -i kernel-image-2.6.10_mykernel.1.0_i386.deb
    

    这样,在/boot目录下会生成System.map-2.6.10,vmlinuz-2.6.10文件。在安装内核时会提示是否制作启动盘和是否自动配置LILO,我都选择NO。用手动方式设置LILO。打开/etc/lilo.conf文件,修改相关部份的内容,修改的内容如下:

    ...
    #使用图形菜单
    bitmap=/boot/coffee.bmp
    bmp-colors=14,11,,15,9,0
    #bmp-table=120p,173p,1,15,17
    bmp-timer=254p,432p,1,0,0
    # Installs the specified file as the new boot sector
    # You have the choice between: bmp, compat, menu and text
    # Look in /boot/ and in lilo.conf(5) manpage for details
    #
    install=bmp
    ...
    #内核配置
    default=Linux2.6.10
    
    image=/boot/vmlinuz-2.6.10
            label=Linux2.6.10
            read-only
    #       restricted
    #       alias=1
    
    image=/boot/vmlinuz-2.4.20-bf2.4
            label=Linuxold
            read-only
            optional
    #       restricted
    #       alias=2
    ...
    
  • 用lilo -v -v -v更新启动信息。如果没有出错信息则可重启电脑,默认是以新内核来启动的。用上下光标可选择不同的启动内核。

Note

如想用dpkg -i命令 重新安装相同修订版本的内核,需要手工做一些清理工作。把/boot/System.map-2.6.10、/boot/vmlinuz-2.6.10和/lib/modules/2.6.10改名备份起来或删除掉,但为了安全,建议采用改名备份方式。安装时会提示需重启来重建/lib/modules/2.6.10目录,按继续即可。

内核配置备忘录

  • 由2.4内核升级到2.6内核时,由于2.6内核的模块工具与2.4不同了,所以需先更新系统的模块工具程序module-init-tools。更新步骤如下:

    1. www.kernel.org网站下载module-init-tools工具包。

    2. 用tar解包,配置软件包。

      ./configure --prefix=/sbin
      
    3. 把旧的/sbin/insmod和/sbin/rmmod改名为/sbin/insmod.old和/sbin/rmmod.old,以便区分新旧程序。运行以下命令完成改名动作。

      make moveold
      
    4. 编译安装。

      make
      make install
      
    5. 生成模块配置文件。

      ./generate-modprobe.conf /etc/modprobe.conf
      
  • 内核配置完成后,在退出配置菜单时如果选择保存配置,则会在当前目录中生成一个.config文件,以文本的形式记录内核的所有配置参数。该配置文件会在下次用make menuconfig命令配置内核时自动导入。我们也可以通过内核配置菜单最下面的导入和存盘功能导入其它内核配置文件和把当前配置以任意的名字保存在其它地方。

  • Loadable module support-->Module unloading选项可允许卸载已加载的内核模块。通过该功能,我们可以通过rmmod module_name和modprobe module_name命令改变内核模块的加载参数。

  • 如需支持富士FinePix 2800 Zoom数码相机,需选中Device Drivers-->USB support-->UHCI HCD(most Intel and VIA) support支持。如果成功配置,在启动时会自动检测到数码相机,并自动把相机的存储卡挂接在/media/usbdisk目录下。如果对自已机器上的USB设备接口不清楚,可用# lspci -v命令来列出本机的设备信息。

  • 在我的Fosa手提电脑上编译内核2.6.10以支持USB鼠标和触摸板。用lspci -v命令列出本机USB设备的硬件信息如下:

    0000:00:01.2 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 07) (prog-if 10 [OHCI])
            Subsystem: Silicon Integrated Systems [SiS] USB 1.0 Controller
            Flags: bus master, medium devsel, latency 64, IRQ 11
            Memory at 000d0000 (32-bit, non-prefetchable) [size=4K]
    

    USB设备接口类型是OHCI的,所以配置内核时选中Device Drivers--->Usb Support--->OHCI HCD support,并把它编译进内核。重启手提电脑,自检时出现如下信息,驱动成功。

    ohci_hcd 0000:00:01.2: Silicon Integrated Systems [SiS] USB 1.0 Controller
    ohci_hcd 0000:00:01.2: USB HC TakeOver from BIOS/SMM
    ohci_hcd 0000:00:01.2: irq 11, pci mem 0xd0000
    ohci_hcd 0000:00:01.2: new USB bus registered, assigned bus number 1
    ohci_hcd 0000:00:01.2: resetting from state 'reset', control = 0x0
    ohci_hcd 0000:00:01.2: enabling initreset quirk
    ohci_hcd 0000:00:01.2: OHCI controller state
    ohci_hcd 0000:00:01.2: OHCI 1.0, with legacy support registers
    ohci_hcd 0000:00:01.2: control 0x083 HCFS=operational CBSR=3
    ohci_hcd 0000:00:01.2: cmdstatus 0x00000 SOC=0
    ohci_hcd 0000:00:01.2: intrstatus 0x00000044 RHSC SF
    ohci_hcd 0000:00:01.2: intrenable 0x8000000a MIE RD WDH
    ohci_hcd 0000:00:01.2: hcca frame #0003
    ohci_hcd 0000:00:01.2: roothub.a 01000203 POTPGT=1 NPS NDP=3
    ohci_hcd 0000:00:01.2: roothub.b 00000000 PPCM=0000 DR=0000
    ohci_hcd 0000:00:01.2: roothub.status 00008000 DRWE
    ohci_hcd 0000:00:01.2: roothub.portstatus [0] 0x00010301 CSC LSDA PPS CCS
    ohci_hcd 0000:00:01.2: roothub.portstatus [1] 0x00000100 PPS
    ohci_hcd 0000:00:01.2: roothub.portstatus [2] 0x00000100 PPS
    usb usb1: new device strings: Mfr=3, Product=2, SerialNumber=1
    usb usb1: default language 0x0409
    usb usb1: Product: Silicon Integrated Systems [SiS] USB 1.0 Controller
    usb usb1: Manufacturer: Linux 2.6.10 ohci_hcd
    usb usb1: SerialNumber: 0000:00:01.2
    usb usb1: hotplug
    usb usb1: adding 1-0:1.0 (config #1, interface 0)
    usb 1-0:1.0: hotplug
    hub 1-0:1.0: usb_probe_interface
    hub 1-0:1.0: usb_probe_interface - got id
    hub 1-0:1.0: USB hub found
    hub 1-0:1.0: 3 ports detected
    hub 1-0:1.0: standalone hub
    hub 1-0:1.0: no power switching (usb 1.0)
    hub 1-0:1.0: global over-current protection
    hub 1-0:1.0: power on to power good time: 2ms
    hub 1-0:1.0: local power source is good
    hub 1-0:1.0: no over-current condition exists
    ohci_hcd 0000:00:01.2: created debug files
    hub 1-0:1.0: state 5 ports 3 chg ffff evt ffff
    usbcore: registered new driver hiddev
    ohci_hcd 0000:00:01.2: GetStatus roothub.portstatus [0] = 0x00010301 CSC LSDA PPS CCS
    hub 1-0:1.0: port 1, status 0301, change 0001, 1.5 Mb/s
    hub 1-0:1.0: debounce: port 1: total 100ms stable 100ms status 0x301
    ohci_hcd 0000:00:01.2: GetStatus roothub.portstatus [0] = 0x00100303 PRSC LSDA PPS PES CCS
    usb 1-1: new low speed USB device using ohci_hcd and address 2
    ohci_hcd 0000:00:01.2: GetStatus roothub.portstatus [0] = 0x00100303 PRSC LSDA PPS PES CCS
    usb 1-1: skipped 1 descriptor after interface
    usb 1-1: new device strings: Mfr=0, Product=2, SerialNumber=0
    usb 1-1: default language 0x0409
    usb 1-1: Product: USB OpticalWheel Mouse
    usb 1-1: hotplug
    usb 1-1: adding 1-1:1.0 (config #1, interface 0)
    usb 1-1:1.0: hotplug
    hub 1-0:1.0: port 2, status 0100, change 0000, 12 Mb/s
    hub 1-0:1.0: port 3, status 0100, change 0000, 12 Mb/s
    usbhid 1-1:1.0: usb_probe_interface
    usbhid 1-1:1.0: usb_probe_interface - got id
    input: USB HID v1.10 Mouse [USB OpticalWheel Mouse] on usb-0000:00:01.2-1
    usbcore: registered new driver usbhid
    drivers/usb/input/hid-core.c: v2.0:USB HID core driver
    mice: PS/2 mouse device common for all mice
    input: AT Translated Set 2 keyboard on isa0060/serio0
    Synaptics Touchpad, model: 1
     Firmware: 4.6
     180 degree mounted touchpad
     Sensor: 18
     new absolute packet format
     Touchpad has extended capability bits
     -> four buttons
     -> multifinger detection
     -> palm detection
    input: SynPS/2 Synaptics TouchPad on isa0060/serio4
    

    /etc/X11/XF86config-4配置文件中与鼠标配置相关的内容如下:

    Section "InputDevice"
            Identifier      "Configured Mouse"
            Driver          "mouse"
            Option          "CorePointer"
            Option          "Device"                "/dev/psaux"
            Option          "Protocol"              "Auto"
            Option          "Emulate3Buttons"       "true"
            Option          "ZAxisMapping"          "4 5"
    EndSection
    Section "InputDevice"
            Identifier      "Generic Mouse"
            Driver          "mouse"
            Option          "SendCoreEvents"        "true"
            Option          "Device"                "/dev/input/mice"
            Option          "Protocol"              "Auto"
            Option          "Emulate3Buttons"       "true"
            Option          "ZAxisMapping"          "4 5"
    EndSection
    
    ...
    
    Section "ServerLayout"
            Identifier      "Default Layout"
            Screen          "Default Screen"
            InputDevice     "Generic Keyboard"
            InputDevice     "Configured Mouse"    #这里的两个Mouse设备标识名要对应上面
            InputDevice     "Generic Mouse"
    EndSection
    
  • 配置内核支持图形化启动界面。以下网站http://www.bootsplash.org/有详细介绍。为了支持图形化启动界面,我们需为内核打补丁。我的内核版本是2.6.10。到http://www.bootsplash.de/files/下载与内核对应的补丁文件bootsplash-3.1.4-2.6.10.diff。用以下命令为内核源码打上该补丁:

    # cd /usr/src/linux-2.6.10
    # patch -p1 < bootsplash-3.1.4-2.6.10.diff
    

    接着配置内核,选中以下选项,以下所有选项不能以内核模块形式编译,都要直接编译进内核:

    1. Device Drivers --> Block Devices --> Initial RAM disk(initrd) support

    2. Device Drivers --> Graphics Support --> VGA 16-color graphics support

    3. Device Drivers --> Graphics Support --> VESA VGA graphics support

    4. Device Drivers --> Graphics Support --> Console display driver support --> Framebuffer Console support

    5. Device Drivers --> Graphics Support --> Bootsplash configuration --> Bootup splash Screen

      Note

      该选项在打了内核补丁后才会出现。

    6. File systems --> Miscellaneous filesystems --> Compressed ROM file system support (cramfs)

    配置内核后就可以用上面介绍的方法重新编译内核了。下一步是安装bootsplash工具。把下面这句加到/etc/apt/source.list里。

    deb http://www.bootsplash.de/files/debian/ unstable main
    

    用以下方法安装:

    # apt-get update
    # apt-get install bootsplash
    # apt-get install sysv-rc-bootsplash       该软件包启用进度条和动画
    

    在配置bootsplash时会问你是否安装一个新的bootsplash主题替换已存在的主题。如果你是第一次安装,请选择none,这样将会自动生成一个/boot/initrd.splash映像,并设置一个默认的newlinux主题。

    接下来要更新启动器了,我是用lilo的,配置内容如下:

    default=Linux2.6.10
    
    image=/boot/vmlinuz-2.6.10
            label=Linux2.6.10
            read-only
            initrd=/boot/initrd.splash       #新增选项,指出映像文件
            vga=791                          #新增选项,设置显示像素1024X768
            append="splash=verbose"          #新增选项,设置显示模式为详细
    #       restricted
    #       alias=1
    

    vga的取值见下表:

    Table 7.1. 

    Colors640X480800X6001024X7681280X1024
    256(8 bit)769 or 0x301771 or 0x303773 or 0x305775 or 0x307
    32000(15 bit)784 or 0x310787 or 0x313790 or 0x316793 or 0x319
    65000(16 bit)785 or 0x311788 or 0x314791 or 0x317794 or 0x31A
    16.7 Mill.(24 bit)786 or 0x312789 or 0x315792 or 0x318795 or 0x31B

    Note

    791为十进制表示法,0x317为十六进制表示法。较旧的lilo不支持十六进制,需用十进制表示法。

    运行lilo命令更新启动信息,重启电脑就可看到有底图的开机画面了。如果选择append="splash=silent",则不会显示启动信息,只会显示一幅开机图和一条进度条,就象Windows一样。

    安装其它主题的方法也很简单,用apt-cache search bootsplash查出主题的名称再用apt-get安装即可,使用Debian就是方便。

  • 安装手提电脑上的板载SIS声卡。用lspci -v获得的与声卡相关的信息如下:

    00:01.4 Multimedia audio controller: Silicon Integrated Systems [SiS] SiS PCI Audio Accelerator (rev 02)
            Subsystem: Alpha-Top Corp Unknown device b500
            Flags: bus master, medium devsel, latency 64, IRQ 10
            I/O ports at 1400 [size=256]
            Memory at ec001000 (32-bit, non-prefetchable) [size=4K]
            Capabilities: [dc] Power Management version 2
    

    通过上网搜索,发现用Trident声卡的内核模块可以驱动它。现在我们一般都是使用ALSA(高级Linux声音架构)来支持声卡。在以下路径中选中ALSA的Trident内核驱动,重新编译内核。

    Device Drivers --->Sound --->Advanced Linux Sound Architecture  --->PCI devices  --->Trident 4D-Wave DX/NX; SiS 7018
    

    安装完新内核,重启系统Linux就可以认到声卡,进入系统后,我们还要安装ALSA软件包才能使用声卡。有关ALSA多媒体系统的安装请参考本书“安装ALSA多媒体系统”一节的内容。

  • 用新内核重启时提示VFS不能挂接问题(由kennycx兄分享)

    提示出错信息类似以下内容:

    VFS:Cannot open root device "hdb2" or unknow-block(0,0)
    Please append a correct "root=" boot option
    kernel panic-not syncing: VFS:Unable to mount root fs on unknow-block(0,0) 
    

    以下是由网友提供的一些解决方法,以供参考:

    • 原因一:ext2文件格式支持没有编译进内核,不论你使用ext3或其它文件格式,ext2支持都必须直接编译进内核,不能以内核模块形式编译。

    • 原因二:如果使用initrd.img启动系统,则cromfs必须编译进内核。(由西安交通大学的张成分享)

    • 原因三:没有生成initrd.img文件,使用make-kpkg --initrd选项重新编译内核即可。

    • 运行make menuconfig配置内核时出现如下出错信息:

      debian:/usr/src/linux-source-2.6.24# make menuconfig
        HOSTCC  scripts/kconfig/lxdialog/checklist.o
      In file included from scripts/kconfig/lxdialog/checklist.c:24:
      scripts/kconfig/lxdialog/dialog.h:32:20: error: curses.h: 没有那个文件或目录
      In file included from scripts/kconfig/lxdialog/checklist.c:24:
      ...............
      

      系统缺少libncurses5-dev包,安装该包后重新运行make menuconfig就可以了。

  • 使用Grub启动器代替LiLo启动。

    • 首先用apt-get install gurb安装相关软件。

    • 再用gurb-install /dev/hda命令在分区上创建启动信息。

    • 使用update-grub命令自动生成menu.lst文件。

    • 编辑/boot/grub/menu.lst文件以满足你的需求,最后重启计算机。

    Note

    如果启动失败,可用Live系统(如Knoppix)或rescure模式启动计算机,再mount启动分区,chroot到故障系统来进行修复。

  • 由2.6.10内核升级到2.6.23.1内核,重新编译2.6.23内核后重启系统提示网卡接口eth0不能启动。提示找不到eth0接口。

    由于转换2.6.23.1内核后,启用了新的udev模块来管理设备。所以问题出现在udev模块上。经查看udev模块的规则,发现/etc/udev/rules.d/z25_persistent-net.rules中对于eth0网卡接口的MAC地址描述出错。改正后重启主机,问题解决。有关udev规则的配置,可参考以下网址:http://reactivated.net/writing_udev_rules.html

  • 如果电脑的内存是4G或大于,在编译时要选择大于16G的选项。如果通过apt-get安装则要选择有linux-image-xxx.xxx.xxx-bigmem的内核软件包。

Note

在配置内核时要小心,对一些自已不清楚的内核功能最好不要去动它,最好保护默认设置。还有要养成随时备份.config文件的习惯,以便在内核配置出错时能快速恢复回正确的配置。

几个内核相关文件介绍

编译完成新内核后,会生成几个文件,这些文件是内核启动所需要的,这里简单介绍一下。

  • vmlinux,编译出来的最原始的内核文件,没有压缩,位于源码根目录下。该内核文件不能用来启动系统。

  • vmlinuz,这个就是我们要引导的内核,它一般是一个链接文件,位于根目录下。真正的文件位于/boot文件夹下。z表示压缩的内核,vm表示virtual memory的意思。linux支持虚拟内存,可利用硬盘空间作为虚拟内存使用。在编译内核时,通过make zImage或make bzImage生成zImage或bzImage原始压缩内核文件,这些内核文件位于debian:/usr/src/linux-2.6.23.9/arch/i386/boot#目录下;接着我们会把它拷贝到/boot目录下并改名为vmlinuz;最后在根目录下创建一个到该文件的同名链接文件。bzImage表示big zImage的意思,zImage是老式的内核文件格式,在新的内核版本中已不使用了,现在生成的内核是bzImage格式的内核文件。这两种内核文件的区别是,zImage解压缩内核到低端内存中(第一个640K),bzImage解压缩内核到高端内存中(1M以上)

    这两个内核文件都是使用gzip软件压缩的,但文件头部内嵌有gzip解压缩代码,能在启动时自动解压缩内核。使用gzip是不能正常解压内核的。

    在源码根目录生成的vmlinux是一个没有压缩的内核文件。

    如果在/boot目录下存在多个版本的内核文件,则可用vmlinuz-xxxx的方式命名。但根目录下的vmlinuz链接文件名一般不变。

  • initrd-x.x.x.img,initrd是"initial ramdisk"的简写。作用是在内核引导前加载相应的硬件模块,为内核引导做准备。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd可使用mkinitramfs工具创建。

  • System.map,内核符号映射文件,位于/boot目录下,与内核名要对应。内核编译完成后,在源码根目录下就会生成一个System.map文件。我们要把它拷贝到/boot目录下并改成相关的名称。如内核名为vmlinuz-2.6.23.9,则这个内核符号映射文件就应该命名为System.map-2.6.23.9。

安装GNOME中文桌面环境

  • 安装基本的X系统

    # apt-get install x-window-system-core
    
  • 安装GNOME桌面环境

    # apt-get install gnome
    
  • 到现在为止,我们已成功安装完成gnome桌面环境了,但桌面的语言环境默认是英文的,为了能显示中文,我们需安装中文字体和中文locales,开源的中文字体现在很少,且效果都不是很理想,所以Linux中文化还有很多工作要做。其中较好的有文鼎科技贡献的arphic TrueType字体,在Debian中字体包的名字分别是:

    • ttf-arphic-bkai00mp:文鼎PL中楷(Big5码)

    • ttf-arphic-bsmi00lp:文鼎PL细上海宋(Big5码)

    • ttf-arphic-gbsn00lp:文鼎PL简报宋(GB码)

    • ttf-arphic-gkai00mp:文鼎PL简中楷(GB码)

    使用apt-get工具就可方便地安装,并能自动设置好Xft字体系统和X11核心字体系统。如果只是安装文鼎的字体,桌面中文字体的表现不佳,尤其是小字体,会出现模糊不清的情况。台湾的萤火飞(Firefly)在文鼎开源字体的基础上作了修改,形成文鼎PL新宋体(AR PL New Sung,fireflysung.ttf),令字体显示清晰很多,基本上可达到Windows上的效果。所以建议安装,安装方法如下:

    把以下的deb源加到/etc/apt/source.list中:

    deb http://apt.debian.org.tw unstable main
    

    之后运行以下命令自动安装:

    debian:~# apt-get update
    debian:~# apt-get install ttf-arphic-newsung
    

    安装完成后就可使用该AR PL New Sung字体了。除了用apt-get工具安装外,我们还可手动安装。详细的安装方法可参考本文“XFree86中的字体”一章的内容。字体文件fireflysung.ttf可到http://www.study-area.org/apt/firefly-font/这个网址,或http://cle.linux.org.tw/fonts/FireFly/这个网址下载。

    有版权的中文字体有很多,下面我以最常用的simsun字体为例介绍一下使用defoma(Debian Font Manager)工具安装的过程。全手动的安装过程请参考本文中的“XFree86中的字体”一章中的内容。

    • 把windows系统中Fonts目录下的simsun.ttc拷贝到X系统的字体目录下。字体目录可以是/usr/share/fonts/,也可以是/usr/X11R6/lib/X11/fonts。我把simsun.ttc放到/usr/X11R6/lib/X11/fonts/truetype目录下。为方便管理字体,我需安装defoma字体管理程序。安装方法如下:

      Note

      dfontmgr是defoma的GUI介面,可选安装,可简化配置过程,建议安装。

      #apt-get install defoma      
      #apt-get install x-ttcidfont-conf   这个是truetype字体配置工具可自动生成fonts.dir和fonts.scale文件。 
      #apt-get install libft-perl libttf2   这些是字体管理需用到的函数库
      #defoma-hints truetype simsun.ttc > simsun.hints  
      上面这个命令可生成simsum.hints文件,把该文件放到/etc/defoma/hints目录中。该文件的内容根据你的选择配置会有所不
      同,下面内容与你实际生成的文件内容会有所区别:
      category truetype
      begin /usr/X11R6/lib/X11/fonts/truetype/simsun.ttc
      Family = Sim-Sun
      FontName = SimSun-Medium
      Encoding = Unicode
      Location = Chinese-China English
      Charset = ISO10646-1 GB2312 BIG5 ISO8859-1
      UniCharset = GB2312 BIG5 ISO8859-1
      GeneralFamily = SimSun
      Weight = Medium
      Width = Fixed
      Shape = Upright
      Alias = Sim-SunGB SimSunGB
      Foundry = Sim
      Priority = 20
      X-Family = SimSun
      X-ElementAlias=foundry=default:family=simsun:resx=72:resy=72
      TTCap = halfwidth-bw=0.5 italic-angle=0.167 no-roblique no-oblique no-ritalic
      end
      
      注册字体:
      #defoma-font reregister-all simsun.hints
      在/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType目录会自动生成fonts.dir和fonts.scale文件,并建立一个到字体文件的链接。
      如果要删除字体,请用以下命令,现在当然不用删除了。
      #defoma-font unreregister-all simsun.hints
      

      最后修改XF86Config-4或xorg.conf,把以下两句加到字体文件搜索路径小节中。

          FontPath    "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
          FontPath    "/var/lib/defoma/x-ttcidfont-conf.d/dirs/CID"
      

      最的,重启X server使配置生效。

  • 用apt-get install locales安装zh_CN.GB2312,zh_CN.GBK和zh_CN.UTF8三种中文编码环境。并设置UTF-8为系统默认编码

  • #apt-get install gdm安装Gnome的显示管理器,最后重启系统即可。显示管理器的作用是用来管理X会话,提供图形化的登录界面。

配置“Debian菜单”

安装完GNOME后,在应用程序栏中有一个“Debian菜单”项,默认是空白的,什么菜单项也没有。这个“Debian菜单”栏是Debian系统特有的,它参考了一些窗口管理器(FVWM2)的菜单管理方式,设计成一个通用的Debian菜单管理系统,不论你使用什么桌面环境或窗口管理器,在“Debian菜单”栏中都能找到Debian系统所安装的软件。要使用该菜单,需安装menu软件包,并用update-meuns命令生成Debian菜单项。

Note

第一次运行update-menus后,需重启X会话才能生成Debian菜单。

基本上每一个Debian系统的应用程序都会有一个菜单配置文件,用以定义该程序的菜单项名称、位置和命令行选项等参数。该配置文件一般位于/usr/lib/menu、/etc/menu或~/.menu目录下。下面是Gnumeric程序菜单项的配置文件格式示例:

?package(gnumeric):\                定义软件包名,每条配置信息要在一行中写完,所以要用反斜杠续行
       needs="X11"\                 定义该菜单项需在X11环境中使用
       section="Apps/Math"\         定义菜单项的路径位置
       title="Gnumeric"\            定义菜单项的标题
       command="gnumeric" \         定义命令和选项
       hints="Gnome,Spreadsheets" \ 定义一些提示信息
       icon="/usr/share/pixmaps/gnumeric.xpm"  定义菜单项的图标

该配置文件一般由Debian软件包管理者维护,在软件安装时通过软件配置脚本,把配置文件拷贝到相应的menu路径,并调用update-menus命令更新“Debian菜单”栏。这样,每安装一个新软件包,在“Debian菜单”栏就可找到它的菜单项了,且不受桌面系统或窗口管理器的限制,实现了统一的菜单界面接口。

有关Debian菜单系统的详细介绍可参考Debian的官方文档,位于http://www.nl.debian.org/doc/packaging-manuals/menu.html/index.html

Gnome桌面环境常用功能的配置方法

安装好Gnome后还要通过很多配置才能使Gnome符合我们的使用要求。下面记录一些常用功能的配置位置,方便大家快速配置Gnome。

安装KDE中文桌面环境

KDE是一个强大的桌面环境,用QT开发,发展到现在,已与Windows平台十分地相似,使用起来十分方便。下面介绍在Debian下安装中文KDE桌面环境的过程

  • 首先,我们需安装x-window系统,与安装gnome桌面环境一样:

                debian:~# apt-get install x-window-system-core
              
  • 接着就可安装kde系统,为了减少不必要的软件包,我只安装了KDE的核心软件包:

                debian:~# apt-get install kde-core
              
  • 好了,现在基本的kde环境已安装好,我们可用startx命令启动它。现在的kde是英文环境的。接下来我们要安装kde的国际化包kde-i18n-zh*,这里用星号表示安装所有的中文国际化软件包,你也可根据实际情况选择。这些国际化软件包里包含了KDE桌面环境的中文显示信息。

                debian:~# apt-get install kde-i18n-zh*
              
  • 在kde中要显示中文还要安装中文字体。有关字体的安装请参照上一节“安装gnome中文桌面环境”中有中文字体安装的内容。这里就不再介绍了。装完中文字体后,就可在KDE“控制中心”-->“区域和辅助功用”-->“国家/地区和语言”里添加中文语言,记住,要把中文语言放到第一位。这样,英文的KDE桌面环境就变成中文的了。

  • 安装中文locales,方法同GNOME桌面系统。

开源软件都是跨平台的,在KDE中我们也可使用GNOME平台(基于GTK+)的程序,如firefox。在Debian系统的KDE中有一个软件包叫gtk2-engines-gtk-qt,可帮我们在KDE平台下管理GTK+程序的主题和字体配置,使GTK+程序就就像QT程序一样方便地进行配置。该套软件包中的主题配置引擎叫GTK-Qt Theme Engine,是由Freedesktop.org维护的,Freedesktop.org通过开发软件和制定标准,志在消除各X window桌面平台间的差异。GTK-Qt Theme Engine的网址是:http://www.freedesktop.org/wiki/Software_2fgtk_2dqt。在KDE中安装和配置gtk2-engines-gtk-qt软件包的方法如下:

  1. 用以命令安装gtk2-engines-gtk-qt软件包:

                debian:~# apt-get install gtk2-engines-gtk-qt
              
  2. 安装完成后,就可在KDE的“控制中心”-->“外观和主题”-->“GTK Styles and Fonts”中配置GTK+程序的主题和字体。通过该工具,GTK+程序就可使用QT丰富的主题,并可在控制中心中方便地修改GTK+程序的字体。

安装xfce4桌面环境

xfce是一个轻量级的桌面环境,可运行在多种类UNIX平台。它的口号是“让一切运行得更快”。它有自已的一套窗口管理器、文件管理器和面板管理器等组件。安装方法很简单,用以下命令安装即可:

debian:~# apt-get install xfce4

相关的依赖软件包都会自动安装,我是用startx命令启动X系统的。以前我在系统中安装了KDE,所以默认是进入KDE桌面环境。现在我要把默认的桌面环境切换到Xfce4。要实现该功能,我们只要使用update-alternatives命令把默认的窗口管理器换成Xfce4的即可。

可用以命令显示当前系统安装的窗口管理器:

debian:~# update-alternatives --display x-window-manager
x-window-manager - status is manual.
 link currently points to /usr/bin/kwin
/usr/bin/kwin - priority 50
/usr/bin/xfwm4 - priority 60
 slave x-window-manager.1.gz: /usr/share/man/man1/xfwm4.1.gz
Current `best' version is /usr/bin/xfwm4.

用以下命令设置:

update-alternatives --config x-window-manager

There are 2 alternatives which provide `x-window-manager'.

  Selection    Alternative
-----------------------------------------------
      1        /usr/bin/kwin
*+    2        /usr/bin/xfwm4

Press enter to keep the default[*], or type selection number: 2
Using `/usr/bin/xfwm4' to provide `x-window-manager'.

用startx启动X系统时就会自动进入Xfce4桌面环境了,Xfce的Logo是一个奔跑的小老鼠,喻意小巧、快速。进入Xfce4桌面环境,我们可看到一个很简洁的桌面。屏幕顶部是一条任务栏,屏幕底部是一组快捷按钮。Xfce的中文支持做得不错,界面基本上都是中文的,使用起来很方便。要配置Xfce,我们可点击屏幕底部的“设置”快捷按钮来配置。它会打开一个Xfce配置管理器,可对Xfce桌面环境的窗口管理器、文件管理器和会话管理器等进行配置。通过右击桌面还可显示一个弹出菜单,Xfce所有的功能都可在这里配置和使用。

用过Xfce后,感觉它的菜单反应速度真的很快,基本上是即点即出。装载程序也比在KDE和GNOME里快了一点。喜欢简洁、快捷桌面环境的朋友赶快安装Xfce试一试吧。

Nautilus

Nautilus是一个文件管理器,与Windows中的资源管理器类似。它是一个开源软件,是GNOME桌面环境默认的文件管理器,项目网址是:http://www.gnome.org/projects/nautilus/

使用Nautilus脚本扩展文件管理功能

Nautilus是GNOME桌面环境中一个优秀的图形化文件管理工具,通过该工具,我们能方便地管理和浏览我们的文件。它是为文件管理而设计的,但它也可作为ftp,smb,WebDAV等基于WEB的应用程序的客户端。除了固定的功能外,我们还可通过编写自已的脚本来扩展它的功能,下面介绍如何使用该功能。

  • 建立一个shell或python、perl等的脚本,并设置可执行权限。

  • 把脚本拷贝到~/.gnome2/nautilus-scripts目录下。

  • 用nautilus访问一次该目录,这样就可通过右击文件,选“脚本”来调用该脚本了。

以后每新建一个脚本,都要使用nautilus访问一次~/.gnome2/nautilus-scripts才能使新脚本生效。这种用户可随意添加脚本的功能使nautilus的功能可无限扩展。Nautilus官方网站上已有很多脚本可下载使用。网址是:http://www.gnome.org/projects/nautilus/

性能调整

Nautilus文件管理器是Gonme中使用频率最高的工具之一,下面介绍几个提高Nautilus性能的方法,使我们能有效地使用该工具。

在Nautilus中,与性能相关的首选项通常都可有三个可选项值,通过调整这三个选项值可达到调整Nautilus性能的目的,这三个选项值分别是:

  • 总是(always)---对本地文件和其它文件系统上的文件都有效。性能最差,占用CPU资源和网络带宽最多。

  • 本地文件(local_only)---只对本地文件有效。性能较好,能减少对CPU资源的占用。

  • 从不(never)---选项无效。性能最好,能大大减少CPU资源和网络带宽的占用。

下面介绍使用这些选项的首选项,每一个首选项代表Nautilus的一个功能。你可用上面介绍的选项值进行配置,以达到性能最优。

  • 图标中显示文字(show_icon_text)

    该选项的功能是控制是否在图标中显示文件中的内容片段。可通过以下命令设置为never:

    # gconftool-2 --type string --set /apps/nautilus/preferences/  show_icon_text never
    

    此外,还可通过Nautilus菜单的“编辑--首选项--预览--图标中显示文字”路径进行设置。

  • 显示缩略图(show_image_thumbnails)

    该选项控制是否在文件管理器内显示图像的缩略图。可通过以下命令设置为never:

    # gconftool-2 --type string --set /apps/nautilus/preferences/  show_icon_text never
    

    此外,还可通过Nautilus菜单的“编辑--首选项--预览--显示缩略图”路径进行设置。

  • 预听声音文件(preview_sound)

    该选项控制是否预听声音文件。可通过以下命令设置为never:

    # gconftool-2 --type string --set /apps/nautilus/preferences/preview_sound never
    

    此外,还可通过Nautilus菜单的“编辑--首选项--预览--预听声音文件“路径进行设置。

  • 统计项目数量(show_directory_item_counts)

    该选项控制是否显示文件夹内项目的数量,如果文件夹内的文件很多,开启该选项将使文件夹的打开速度减慢。建议关闭该功能。设置方法如下:

    # gconftool-2 --type string --set /apps/nautilus/preferences/  show_directory_item_counts never
    

    此外,还可通过Nautilus菜单的“编辑--首选项--预览--统计项目数量\\“路径进行设置。

使用GConf配置GNOME

GConf是GNOME2.0桌面系统的一个应用程序参数配置系统,它可集中存储和管理各种应用程序的配置参数,就象Windows平台的注册表一样。该系统对系统管理员来说是很有用的,系统管理员可通过该工具方便地管理他们的系统。GConf还有一个非常COOL的功能,就是“process transparent”(进程无关性),也就是说,如果我在一个应用程序中修改了一个参数,马上其它使用同一参数的应用程序同样会感受到参数的改变。网上资源:http://www.gnome.org/projects/gconf/

Chapter 8. 基础硬件配置篇

主板集成软猫的驱动方法

很多笔记本电脑都集成有软猫,下面介绍在Debian/Linux上如何驱动软猫。

我的内核版本环境:

         debian:~# uname -a
         Linux debian 2.6.17.1 #1 Thu Aug 24 10:20:25 CST 2006 i686 GNU/Linux
       

用lspci -v命令列出我笔记本电脑上软猫的信息如下:

         00:01.6 Modem: Silicon Integrated Systems [SiS] AC'97 Modem Controller (rev a0) (prog-if 00 [Generic])
         Flags: bus master, medium devsel, latency 173, IRQ 9
         I/O ports at 1800 [size=256]
         I/O ports at 1080 [size=128]
         Capabilities: [48] Power Management version 2
       

http://linmodems.technion.ac.il下载一个叫scanModem的检测工具。它会详细检测你的系统和modem,检查完成后,在当前目录生成一个Modem的目录,有关检测结果就包含在里面。Modemdata.txt显示了主板上集成软猫的更详细的信息。

         card 1: Modem [SiS SI7013 Modem], device 0: Intel ICH - Modem [SiS SI7013 Modem - Modem]
       

要驱动这个软猫,要重新编译内核,选中以下选项:

         Device Drivers --->Sound --->Advanced Linux Sound Architecture  --->PCI devices  ---> Intel/SiS/nVidia/AMD MC97 Modem (EXPERIMENTAL)
       

编译完成后,会生成snd_intel8x0m模块,这是软猫的内核驱动,它直接与硬件通信,最后我们还需安装一个支持软猫的驱动程序sl-modem-daemon。

         debian:~# apt-get install sl-modem-daemon
       

sl-modem-daemon软件包会进行一些自动配置,生成/dev/modem和/dev/ttySL0链接。

重启电脑,用lsmod命令可以查看snd-intel8x0m模块是否已加载。

         debian:~# lsmod
         Module                  Size  Used by
         smbfs                  53688  2
         ppdev                   6788  0
         lp                      8260  0
         thermal                11016  0
         fan                     3300  0
         button                  4976  0
         processor              15568  1 thermal
         ac                      3492  0
         battery                 8356  0
         usb_storage            52992  0
         8250_pci               18112  0
         snd_intel8x0m          13196  5                       #成功加载snd_intel8x0m模块
         snd_ac97_codec         80352  1 snd_intel8x0m
         snd_ac97_bus            1856  1 snd_ac97_codec
         snd_pcm                65864  4 snd_intel8x0m,snd_ac97_codec
         snd_timer              17316  1 snd_pcm
         snd                    35864  12 snd_intel8x0m,snd_ac97_codec,snd_pcm,snd_timer
         sis_agp                 5956  1
         agpgart                26320  1 sis_agp
         8250_pnp                8352  0
         8250                   16180  2 8250_pci,8250_pnp
         serial_core            14560  1 8250
         parport_pc             33220  1
         parport                28296  3 ppdev,lp,parport_pc
         joydev                  7488  0
         evdev                   7296  0
         soundcore               6592  1 snd
         snd_page_alloc          7400  2 snd_intel8x0m,snd_pcm
       

如果能正常加载snd-intel8x0m模块,就可以启动sl-modem-daemon进程了。

         debian:/etc/init.d# ./sl-modem-daemon start
         starting SmartLink Modem driver for: modem:1.
         Creating /dev/modem symlink, pointing to: /dev/ttySL0.
       

正常启动sl-modem-daemon进程后,我们就可使用软猫啦。通过上面我们介绍的minicom和wvdial工具可以测试软猫。注意,软猫的设备端口号是/dev/ttySL0。

安装NVIDIA显卡3D驱动程序

NVIDIA显卡是现时市面上最常用的显卡,下面介绍在Debian系统中NVIDIA显卡3D驱动程序的安装方法。通过xorg内建的nvidia显卡驱动模块也可驱动NVIDIA显卡进入X-Window,但没有3D加速功能,不能使用3D桌面。有两种安装Nvidia驱程的方法。一种是使用Nvidia官方的提供的安装包,一种是使用Debian包管理器,建议使用Debian包管理器来安装。下面分别介绍两种安装方法。

Debian Way

由于Nvidia官方驱动程序不是开源的,如果要通过Debian way方式来安装驱动程序,则需要把non-free和contrib源添加到sources.list文件中,接着运行apt-get update命令更新软件包库。Nvidia驱动程序包含两部份:内核模块和用户空间GLX库。安装也要按这个顺序进行,先安装内核模块再安装用户空间GLX库。在安装源里已包含了一些已编译好的内核模块,如果与你内核版本一致,则可直接用apt-get install命令安装。 如果没有则要下载nvidia-kernel-source源码包进行手动编译安装。手动编译安装步骤如下:

  • 下载nvidia驱动源码包:

    debian:~# apt-get install nvidia-kernel-sources
    
  • 查看/usr/share/doc/nvidia-kernel-source目录下的README.Debian文档,里面介绍手动编译驱动程序内核模块的方法。这里又分两种内核环境,一种是使用debian标准的内核(用apt-get下载安装的内核),一种是使用自已重新定制编译的内核。两种环境下的编译方法有所区别。我使用的是debian标准内核。内核版本是2.6.24-1-686-bigmem。

    编译内核模块需要用到内核头文件,我们要检查/usr/src目录下是否有相应的内核头文件目录,如果没有则要安装相应的内核头文件。安装命令如下:

    debian:/usr/src# apt-get install linux-headers-`uname -r`
    

    接着要设置两个环境变量:

    debian:/usr/src# export KVERS=$(uname -r)
    debian:/usr/src# export KSRC=/usr/src/linux-headers-$KVERS
    
    
  • 开始编译内核模块。

    debian:/usr/src/modules/nvidia-kernel# debian/rules binary_modules
    

    编译完成生成一个安装包保存在debian:/usr/src/modules目录下。我生成的是包名是nvidia-kernel-2.6.24-1-686-bigmem_173.14.09-5_i386.deb

  • 安装驱动程序内核模块。

    debian:/usr/src/modules# dpkg -i nvidia-kernel-2.6.24-1-686-bigmem_173.14.09-5_i386.deb
    
  • 安装用户空间GLX库。

    debian:/usr/src/modules# apt-get install nvidia-glx${VERSION}
    
  • 配置Xorg使用nvidia 3D驱动程序,修改/etc/X11/xorg.conf文件。在Module一节添加以下内容。

        load "glx"
    

    Note

    注释掉“dri”模块和“GLCore”模块。

    在Device一节,修改Driver选项:

        Driver    "nvidia"
    

    重启X Window,使驱动生效。如果成功安装,在启动X Window时会出现NVIDIA的标志。

Note

/usr/share/doc/nvidia-glx/目录下的README.txt.gz文档是“NVIDIA Accelerated Linux Graphics Driver README and Installation Guide”,强烈建议大家在安装前和安装后都要看看。

使用官方安装包

我的Linux内核是2.6.10,到NVIDIA的官方网站http://www.nvidia.com下载最新for linux IA32的驱动程序。我安装时的最新版本是Version 1.0-7174,下载的驱程文件名为NVIDIA-Linux-x86-1.0-7174-pkg1.run。这个版本的驱动可在2.6内核中正常工作,旧一些的版本在2.6内核的Linux系统中安装会出现问题。具体的安装过程如下:

  • 安装nvidia驱动时需要编译nvidia内核接口层,所以要先安装内核源码和内核头文件。

    debian:~# apt-get install linux-source-2.6.10 linux-headers-2.6.10
    

    进入/usr/src目录,解开linux的内核源码包。

  • 修改驱动程序的文件属性为可执行。

    debian:~# chmod +x NVIDIA-Linux-x86-1.0-7174-pkg1.run 
    
  • 退出X Window到字符终端模式。在驱动程序所在目录下输入以下命令开始驱动程序的安装。

    debian:~/inst# ./NVIDIA-Linux-x86-1.0-7174-pkg1.run
    
  • 安装完成后,修改/etc/X11/XF86config-4文件。在修改前最好把源文件备份一下。

    把显示驱动设置章节的内容改成:
    Section "Device"
            Identifier      "Generic Video Card"
            Driver          "nvidia"
    EndSection
    
    修改加载模块设置章节的内容,确保加载了以下模块
    Load "glx"
    
    并取消以模块的加载
    Load "dri"
    Load "GLcore"
    

    Note

    新版的驱动在安装后期会自动运行nvidia-xconfig工具自动修改xorg.conf配置文档。

  • 重启X Window,使驱动生效。如果成功安装,在启动X Window时会出现NVIDIA的标志。进入系统后也可用lsmod命令列出加载的nvidia模块信息。

在/usr/share/doc/NVIDIA_GLX-1.0目录下的README文件中有nvidia驱动程序的安装说明和配置说明。在安装NVIDIA驱动程序时,最好先浏览一下该文档。我们还可通过nvidia-settings程序来调整显卡的参数。

nvidia驱动程序还有几个安装选项比较有用,这里简单介绍一下。

  • --extract-only,只解出驱动程序包而不安装。

  • --uninstall,反安装驱动程序。

  • --latest,连接到nvidia ftp服务器,报告最新的驱动版本和最新驱动的url链接。

  • --update,连接到nvidia ftp服务器,下载最新的驱动并安装。

配置示例

我的显卡是8600GTS,整个xorg.xonf配置文档的内容如下:

debian:~# cat /etc/X11/xorg.conf
# xorg.conf (xorg X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the xorg.conf manual page.
# (Type "man xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
#   sudo dpkg-reconfigure -phigh xserver-xorg

Section "Files"
EndSection

Section "InputDevice"
   Identifier   "Generic Keyboard"
   Driver       "kbd"
   Option       "CoreKeyboard"
   Option       "XkbRules"     "xorg"
   Option       "XkbModel"     "pc104"
   Option       "XkbLayout"    "us"
EndSection

Section "InputDevice"
   Identifier   "Configured Mouse"
   Driver       "mouse"
   Option       "CorePointer"
   Option       "Device"      "/dev/input/mice"
   Option       "Protocol"    "ImPS/2"
   Option       "Emulate3Buttons"    "true"
EndSection

Section "Module"
   load "glx"                      # 关健修改点
EndSection

Section "Device"
   Identifier   "Nvidia 8600GTS"   # 可自由修改
   Driver"nvidia"                  # 关健修改点
EndSection

Section "Monitor"
   Identifier    "通用显示器"
   Option        "DPMS"
   HorizSync     28-64
   VertRefresh   43-60
EndSection

Section "Screen"
   Identifier    "Default Screen"
   Device        "Nvidia 8600GTS"  # 与Device一节的Identifier选项匹配
   Monitor       "通用显示器"      # 与Monitor一节的Identifier选项匹配
   DefaultDepth24
      SubSection  "Display"
         Modes "1280x1024" "1280x960" "1024x768" "800x600"
      EndSubSection
EndSection

Section "ServerLayout"
   Identifier    "Default Layout"
   Screen        "Default Screen"
   InputDevice   "Generic Keyboard"
   InputDevice   "Configured Mouse"
EndSection
      

安装realtek8111/8168B千兆网卡

最新的linux内核通过r8169内核模块支持realtek8111/8168B网卡,不用另外安装。我的linux内核版本是2.6.22。

如果想自已编译网卡驱动,则可按以下步骤进行。首先到realtek的官方网站下载最新的网卡驱程。按readme文件的方法编译,生成r8168.ko内核模块。修改/etc/modules文件,把r8168添加进去。配置/etc/network/interfaces文件,启用eth0接口。重启电脑或运行/etc/init.d/networking脚本重启网络。

用r8168模块代替内核自带的r8169模块

我电脑的网卡是RTL8111/8168B,2.6.18-6-686内核自带了r8169内核驱动可以驱动该网卡。但在使用中有问题,影响samba服务器的网络下载速度。所以我到官方网站下载了对应8168网卡的驱动自已编译。加载新的r8168.ko内核模块后,samba服务器的网络下载速度提高很多。

r8168模块编译和替换操作步骤如下:

         编译和安装和加载r8168.ko内核模块
         make clean modules
         make install
         rmmod r8169
         insmod r8168.ko
         
         替换r8169模块
         rm /lib/modules/2.6.18-6-686/kernel/drivers/net/r8169.ko
         depmod -a
         mkinitramfs -o /boot/initrd.img-`uname -r` `uname -r` 
         重启电脑
       

配置有滑轮的串口鼠标

参考http://www.xfree86.org/4.4.0/里的Mouse Support in XFree86一章的内容,配置XF86Config-4文件,内容如下:

         Section "InputDevice"
         Identifier      "Configured Mouse"
         Driver          "mouse"
         Option          "CorePointer"
         Option          "Device"                "/dev/ttyS0"
         Option          "Protocol"              "IntelliMouse"
         Option          "Emulate3Buttons"       "true"
         Option          "ZAxisMapping"          "4 5"
         EndSection
       

关键是要选对Protocol,不要用Auto。可手工配置/etc/X11/XF86config-4文件,也可用dpkg-reconfigure xserver-xfree86命令自动配置。配置后重启X服务器使配置生效。串口鼠标的滑轮可正常工作,左右键同时按可粘贴鼠标选中的内容,相当于Ctrl+v的复制功能。

Note

Protocol不能设为“Auto”,否则,滑轮不能正常使用。

Chapter 9. 网络配置篇

ADSL拔号上网配置

连接ADSL线路要使用PPPOE协议,PPPOE用以太网帧封装PPP数据帧,使点对点通信具有以太网的优点。在上面安装Debian basic系统中我已介绍了使用pppoeconf工具配置ADSL连接的内容。这章将详细介绍拔号设置的过程和配置参数。

pppoeconf是一个自动配置工具,可帮助我们快速配置好ADSL拔号连接。该工具修改和生成的文件都位于/etc/ppp目录下。还有,Modem拔号和VPN拔号的配置文件也都位于该目录下。在/etc/ppp目录下有一个名为peers的目录,该目录下保存的是每个连接的配置参数文件。ppp目录的内容如下:

        debian:/etc/ppp# ls
        chap-secrets  ip-up.d      ipv6-up.d       options.ttyXX  ppp_on_boot.dsl
        ip-down       ipv6-down    no_ppp_on_boot  pap-secrets    resolv
        ip-down.d     ipv6-down.d  options         peers          resolv.conf
        ip-up         ipv6-up      options.pptp    ppp_on_boot
      

下面介绍一些重要的文件和目录。

  • options文件是pppd程序的全局性配置文件。

  • options.pptp文件是pptp拔号连接的全局性配置文件。安装了pptp-linux软件包才会有该配置文件。

  • chap-secrets文件保存使用chap加密验证所需的用户名和密码。

  • pap-secrets文件保存使用pap加密验证所需的用户名称密码。

  • ip-up脚本会在ppp连接建立后执行。主要执行一些始初化工作,如路由修改、DNS服务器修改等。该脚本还会自动执行ip-up.d目录下所有脚本。

  • ip-down脚本会在ppp连接中止时执行。主要执行一些清理和复位工作,回复到启动ppp连接建立前的状态。该脚本也会自动执行ip-down.d目录下的所有脚本。

  • ppp_on_boot和ppp_on_boot.dsl是modem和adsl连接的启动脚本,在系统启动时实现自动拔号功能。

pon/poff和plog是三个用来管理ppp连接的程序,其中pon用来启动连接,poff用来中止连接,plog用来显示连接状态日志信息。在我的机器上直接运行不带参数的pon命令会自动启动/etc/ppp/peers/dsl-provider连接。这个默认启动的连接可在/etc/network/interfaces里设置。设置方法请参考interfaces的手册页。pon后跟一个连接名就可以启动不同的连接。

/etc/ppp/peers/dsl-provider是adsl拔号的参数文件,登录用户名和密码保存在chap-secrets文件中。

        
      

用pptp client连接远程VPN服务器

远程维护能有效减轻系统管理员的工作强度,并能提高管理效率。所以系统管理员一般都会设置VPN服务器以支持远程安全登录。现在的VPN服务器一般都同时支持pptp和IPSec两种协议,在Debian中我们可通过pptp client客户端连接远程VPN服务器。pptp client是一种开源的pptp客户端,位于http://pptpclient.sourceforge.net/,网站上有pptp client的详细介绍。要使用pptp client,我们可手工安装配置,也可通过图形化的配置工具来进行安装和配置。下面分别介绍这两种方式的配置过程。

图形化配置方式

  • 首先我们要先安装pptp client软件包。

                  # apt-get install pptp-linux
                
  • 成功安装pptp-linux软件包后,就要安装图形化配置工具pptpconfig,它是一个PHP脚本。安装方法如下:

    1. 把以下内容添加到你Debian系统的资源列表中,它位于/etc/apt/sources.list。

                        # James Cameron's PPTP GUI packaging
                        deb http://quozl.netrek.org/pptp/pptpconfig ./
                      
    2. 更新系统软件包信息

                        # apt-get update
                      
    3. 安装pptpconfig软件包

                        # apt-get install pptpconfig
                      

      安装时Debian会把pptpconfig所依赖的其它相关软件包一起安装。

  • 运行pptpconfig,配置连接参数。

    • server标签依次填上本地连接名,服务器名或IP,域(可选),用户名和密码。

    • Routing标签用来设置路由信息。可用"xxx.xxx.xxx.xxx/xx"的形式增加新的路由。我增加了一条到192.168.3.0/24的路由,以访问该网段。routing style选All to Tunnel,可改变本机的缺省路由,使本机的所有的网络流量都通过该通道。

    • DNS标签用来设置建立pptp连接后如何进行名称解析。不启用自动配置,将使用手工输入的DNS服务器代替/etc/resolv.conf里的名称服务器进行名称解析。启用自动配置,将会用拔号自动获得的DNS服务器替代/etc/resolv.conf里的DNS服务器,两种方式/etc/resolv文件都会被pptpconfig自动备份。连接断开后,pptpconfig会自动恢复旧有/etc/resovl.conf文件。

    • Encryption标签用于设置加密信息。

    • Miscellaneous标签可配置一些调试信息和连接状态。

手动配置方式

pptpconfig是GTK+程序,需在X window环境下才能运行。但多数我们都是在字符终端模式下登录远程VPN服务器,再启用SSH连接进行远程系统维护的。在字符终端模式下我们就要手动配置pptp连接。这里有三个程序可以帮到我们管理连接,会别是pon、poff和plog。pon用于VPN拔号,poff用于断开VPN连接,plog用于显示连接在状态信息。假设我们已建立了一个名为remote的VPN连接,则可用以下命令连接VPN服务器。

          debian:~# pon remote      # 建立一个VPN连接
          debian:~# plog            # 查看VPN连接状态信息
          debian:~# poff remote     # 断开VPN连接
        

用ifconfig命令可以查看建立的接口,一般是ppp0。如果我们要通过VPN访问远程网络上的服务器,则要添加路由信息。假设本地网的网关地址是192.168.18.1,远程VPN服务器的地址是62.33.24.79,要访问VPN服务器后的应用服务器,应用服务器IP地址是192.168.5.3。则要添加以下两条路由信息。

          debian:~# route add 62.33.24.79 gateway 192.168.18.1
          debian:~# route add -net 192.168.5.0 netmask 255.255.255.0 dev ppp0   
        

Note

关健是要添加一条到VPN服务器的路由,网关设置为你刚从ISP处获取的IP地址或本地网的网关地址。

remote这个VPN连接的信息主要存放在两个文件中,分别是/etc/ppp/chap-secrets和/etc/ppp/peers/remote。这两个文件的配置格式如下。

  • /etc/ppp/chap-secrets文件示例:

    # Secrets for authentication using CHAP
    # client        server  secret                  IP addresses
    username remote password *
    
  • /etc/ppp/peers/remote文件示例:

    # tunnel remote, written by pptpconfig $Revision: 1.2 $
    
    # name of tunnel, used to select lines in secrets files
    remotename remote
    
    # name of tunnel, used to name /var/run pid file
    linkname remote
    
    # name of tunnel, passed to ip-up scripts
    ipparam remote
    
    # data stream for pppd to use
    pty "pptp 62.33.24.79 --nolaunchpppd "
    
    # domain and username, used to select lines in secrets files
    name username
    
    persist
    
    # do not require the server to authenticate to our client
    noauth
    
    # end of tunnel file
    

    使用时需用真实的username和password代替配置文件中这两项内容。

除了使用pon命令连接外,我们也可以使用pptp在命令行启动pptp连接。由于pptp也是要调用remote配置文件,所以要注释掉remote配置里pty "pptp 62.33.24.79 --nolaunchpppd "这一行内容。

          debian:~# pptp vpn_server_ip call remote
        

设置Modem拔号网络

Modem拔号网络的速度慢,但在一些环境下还是很有用。如传真和点对点连接。下面这篇有关Modem设置的文章就是我在配置Fax服务器时记录下来。

在配置拔号网络前,请先用上面介绍的Minicom工具与Modem通信,确定Modem在Linux下能正常工作。Modem拔号采用PPP协议与远程的拔号服务器建立连接。在Debian系统下,有一个叫pppconfig配置可帮助我们快速配置pppd拔号网络。运行pppconfig,按向导一步下配置下去就可以了。配置完成保存后,在/etc/ppp/peers目录下会生成一个配置文件,默认是provider。该文件的内容如下:

        debian:/etc/ppp/peers# cat provider
        # This optionfile was generated by pppconfig 2.3.10.
        #
        #
        hide-password
        noauth
        connect "/usr/sbin/chat -v -f /etc/chatscripts/provider"
        debug
        /dev/ttyS0
        115200
        defaultroute
        noipdefault
        user "96169"
        
        ipparam provider
        
        usepeerdns
      

用以下命令启动拔号连接:

        debian:~# pon provider       #如果你的连接名不是provider,请用你所起的连接名代替
      

用以下命令可查看连接日志:

debian:~# plog                 
Aug 29 09:54:01 debian pppd[1708]: sent [IPCP ConfReq id=0x3 <addr 218.20.81.4> <ms-dns1 61.144.56.101> <ms-dns3 202.96.128.86>]
Aug 29 09:54:01 debian pppd[1708]: rcvd [IPCP ConfAck id=0x3 <addr 218.20.81.4> <ms-dns1 61.144.56.101> <ms-dns3 202.96.128.86>]
Aug 29 09:54:01 debian pppd[1708]: Cannot determine ethernet address for proxy A RP
Aug 29 09:54:01 debian pppd[1708]: local  IP address 218.20.81.4
Aug 29 09:54:01 debian pppd[1708]: remote IP address 218.20.64.62
Aug 29 09:54:01 debian pppd[1708]: primary   DNS address 61.144.56.101
Aug 29 09:54:01 debian pppd[1708]: secondary DNS address 202.96.128.86
Aug 29 09:54:01 debian pppd[1708]: Script /etc/ppp/ip-up started (pid 1711)
Aug 29 09:54:02 debian pppd[1708]: Script /etc/ppp/ip-up finished (pid 1711), status = 0x0

用以下命令关闭连接:

        debian:~# poff
      

用以下命令显示连接状态信息:

        debian:~# pppstats
        IN   PACK VJCOMP  VJUNC  VJERR  |      OUT   PACK VJCOMP  VJUNC NON-VJ
        9532    145      0      0      0  |       97      5      0      0      5
      

另外一种方法是利用wvdial这个拔号工具实现Modem拔号上网。操作方法也很简单,先下载wvdial软件包:

        debian:~# apt-get install wvdial
      

下载完软件后会自动运行wvdial的配置程序,要求输入电话号码、用户名和密码。配置程序会自动检测你的Modem并生成/etc/wvdial.conf文件。文件内容如下:

[Dialer Defaults]          #默认的拔号设置,可设置多个Dialer
Phone = 96169
Username = 1
Password = 1
New PPPD = yes
Modem = /dev/ttyS0
Baud = 115200
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ISDN = 0
Modem Type = Analog Modem

当然,我们也可手动运行wvdialconf这个配置程序,如:

debian:~# wvdialconf /etc/wvdial.conf
Scanning your serial ports for a modem.

ttyS0<*1>: ATQ0 V1 E1 -- OK
ttyS0<*1>: ATQ0 V1 E1 Z -- OK
ttyS0<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyS0<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyS0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyS0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyS0<*1>: Modem Identifier: ATI -- TP560 Data/Fax/Voice 56K Modem
ttyS0<*1>: Speed 4800: AT -- OK
ttyS0<*1>: Speed 9600: AT -- OK
ttyS0<*1>: Speed 19200: AT -- OK
ttyS0<*1>: Speed 38400: AT -- OK
ttyS0<*1>: Speed 57600: AT -- OK
ttyS0<*1>: Speed 115200: AT -- OK
ttyS0<*1>: Max speed is 115200; that should be safe.
ttyS0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK

Found a modem on /dev/ttyS0.
Modem configuration written to /etc/wvdial.conf.
ttyS0<Info>: Speed 115200; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"

配置完成后,用wvdial命令启动拔号:

debian:~# wvdial       #启动默认拔号器,如有多个拔号器,可用wvdial dialer格式指定
--> WvDial: Internet dialer version 1.53
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Modem initialized.
--> Sending: ATDT96169
--> Waiting for carrier.
ATDT96169
CONNECT 45333/V42BIS
--> Carrier detected.  Waiting for prompt.
*********************************
* Quidway A8010 Internet Server *
* welcome!!                     *
*********************************
please input username:
--> Looks like a login prompt.
--> Sending: 1
--> Don't know what to do!  Starting pppd and hoping for the best.
--> Starting pppd at Tue Aug 30 11:11:39 2005
--> pid of pppd: 1858

出现以上信息说明pppd连接成功,用ifconfig可以查看到一个ppp0的连接。

无线网络原理

参考资料:http://linuxwireless.org/

无线网络模式:

  • AccessPoint (AP) infrastructure mode

  • Station infrastructure mode

  • Monitor mode

  • Ad-Hoc (IBSS) mode,自治模式,各台带有无线网卡的电脑自动组成一个对等网络,无需AP设备。下面是两台安装有无线网卡的电脑组成Ad-Hoc网络的示例:

     电脑A:
     编辑/etc/network/interfaces文档,添加以下内容:
     auto wlan0
     iface wlan0 inet static
     address 192.168.1.100
     netmask 255.255.255.0
     wireless-channel 6
     wireless-essid mynetwork
     wireless-mode ad-hoc
     电脑B:
     编辑/etc/network/interfaces文档,添加以下内容:         
     auto wlan0
     iface wlan0 inet static
     address 192.168.1.101
     netmask 255.255.255.0
     wireless-channel 6
     wireless-essid mynetwork
     wireless-mode ad-hoc
     
     编辑完成后,保存文档。在两台电脑上使用ifup wlan0启动无线接口后就可互相通信了。
              

    也可以使用iwconfig命令手动输入无线参数。如:

    ifconfig wlan0 down
    iwconfig wlan0 channel 6
    iwconfig wlan0 essid mynetwork
    iwconfig wlan0 mode ad-hoc
    ifconfig wlan0 up
    ifconfig wlan0 192.168.1.100 netmask 255.255.255.0
    另一台电脑按上面的方式配置,但要把IP地址改成192.168.1.101
              
  • Wireless Distribution System (WDS)

  • Mesh

无线网络由于不须要电缆就可以建立连接,更容易受到黑客的攻击。我们可通过多种加密手段来保障无线通信的安全。下面简要介绍一下。

WEP(有线等效加密)

采用WEP 64位或者128位数据加密。

WPA-PSK [TKIP]

采用预共享密钥的Wi-Fi保护访问,采用WPA-PSK标准加密技术,加密类型为TKIP。

WPA2-PSK [AES]

采用预共享密钥的Wi-Fi保护访问(版本2),采用WPA2-PSK标准加密技术,加密类型为AES。

WPA-PSK [TKIP] + WPA2-PSK [AES]

允许客户端使用WPA-PSK [TKIP]或者WPA2-PSK [AES]。

注意:WEP已被证实是不安全的加密方式,很容易被破解,建议不要使用。我们应该使用WPA方式的加密方式来保护我们的无线网络。

无线网络功率与dBm对照表:

        dBm	     Watts
        0	     1.0 mW
        1	     1.3 mW
        2	     1.6 mW
        3	     2.0 mW
        4	     2.5 mW
        5	     3.2 mW
        6	     4 mW
        7	     5 mW
        8	     6 mW
        9	     8 mW
        10	     10 mW
        11	     13 mW
        12	     16 mW
        13	     20 mW
        14	     25 mW
        15	     32 mW
        16	     40 mW
        17	     50 mW
        18	     63 mW
        19	     79 mW
        20	     100 mW
        21	     126 mW
        22	     158 mW
        23	     200 mW
        24	     250 mW
        25	     316 mW
        26	     398 mW
        27	     500 mW
        28	     630 mW
        29	     800 mW
        30	     1.0 W
        31	     1.3 W
        32	     1.6 W
        33	     2.0 W
        34	     2.5 W
        35	     3.2 W
        36	     4.0 W
        37	     5.0 W
        38	     6.3 W
        39	     8.0 W
        40	     10 W
        41	     13 W
        42	     16 W
        43	     20 W
        44	     25 W
        45	     32 W
        46	     40 W
        47	     50 W
   

无线网络配置

在linux中配置无线网络需要使用wireless-tools软件包和wpa_supplicant软件包。前者只可配置WEP无线网络,而后者可配置WPA无线网络。我们可根据网络环境自由选择。

手动方式:

  • 使用iwconfig命令查看无线接口,iwconfig工具包含在 wireless-tools软件包中,如果系统没有iwconfig程序则先安装该软件包。如果你的无线网卡能正常驱动则可以查看到wlan0这个无线网接口。如:

                debian:~# iwconfig
                lo        no wireless extensions.
                
                eth0      no wireless extensions.
                
                wmaster0  no wireless extensions.
                
                wlan0     IEEE 802.11bg  ESSID:""
                          Mode:Managed  Frequency:2.412 GHz  Access Point: Not-Associated
                          Tx-Power=0 dBm
                          Retry min limit:7   RTS thr:off   Fragment thr=2352 B
                          Encryption key:off
                          Power Management:off
                          Link Quality:0  Signal level:0  Noise level:0
                          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
                          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
              
  • 使用ifconfig wlan0 up命令启动无线接口。正常启动无线接口后,使用ifconfig命令就可能看到wlan0无线网接口了。

                root@bt:~# ifconfig
                lo        Link encap:Local Loopback
                          inet addr:127.0.0.1  Mask:255.0.0.0
                          UP LOOPBACK RUNNING  MTU:16436  Metric:1
                          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                          collisions:0 txqueuelen:0
                          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
                
                wlan0     Link encap:Ethernet  HWaddr 00:18:4d:19:f0:24
                          UP BROADCAST MULTICAST  MTU:1500  Metric:1
                          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                          collisions:0 txqueuelen:1000
                          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
                
                wmaster0  Link encap:UNSPEC  HWaddr 00-18-4D-19-F0-24-00-00-00-00-00-00-00-00-00    -00
                          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                          collisions:0 txqueuelen:1000
                          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
              

    我的网卡是TL-WN321G+,启动网卡时不成功,给出的出错提示是SIOCSIFFLAGS: no such file or directory 。用dmesg命令查看启动信息时发现有以下出错信息:

    usbcore: registered new interface driver rt73usb
    usbcore: registered new interface driver rt2500usb
    phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware.
    		

    经分析应该是系统没有安装该网卡的 firmware。 用以下命令安装相应的firmware后就可以正常启动了。

    debian:~# apt-get install firmware-ralink
    		
  • 无线网卡接口启动后,我们就可以搜索下附近的无线网络。

                debian:~# iwlist wlan0 scan
                wlan0     Scan completed :
                          Cell 01 - Address: 00:21:29:B6:C0:D2
                                    ESSID:"linksys5-3"
                                    Mode:Master
                                    Channel:6
                                    Frequency:2.437 GHz (Channel 6)
                                    Quality=70/100  Signal level:-36 dBm
                                    Encryption key:on
                                    IE: Unknown: 000A6C696E6B737973352D33
                                    IE: Unknown: 010882848B962430486C
                                    IE: Unknown: 030106
                                    IE: Unknown: 050400010000
                                    IE: Unknown: 2A0104
                                    IE: Unknown: 2F0104
                                    IE: Unknown: 32040C121860
                                    IE: Unknown: DD0E0050F204104A0001101044000102
                                    IE: Unknown: DD090010180200F4000000
                                    IE: WPA Version 1
                                    Group Cipher : TKIP
                                    Pairwise Ciphers (1) : TKIP
                                    Authentication Suites (1) : PSK
                                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
                                    24 Mb/s; 36 Mb/s; 54 Mb/s; 6 Mb/s; 9 Mb/s
                                    12 Mb/s; 48 Mb/s
                                    Extra:tsf=000000015010d183
                                    Extra: Last beacon: 2248ms ago
              

    通过搜索我们可以了解无线网络的参数,为下一步配置无线网接口参数作好准备。通过上面的信息,我们可以知道有一个linksys5-3的无线网络,该网络使用channel 6,采用的加密方式是WPA,MAC地址是00:21:29:B6:C0:D2。

  • 接下来我们要为无线网卡配置参数,这些参数用以连接无线网络。

                iwconfig wlan0 ESSID linksys5-3
                iwconfig wlan0 channel 6
                iwconfig wlan0 key on
                iwconfig wlan0 key xxxxxxx
              

    这里用key设置的 密码是WEP加密的密码,如果是用WPA加密的需要用到wpa_supplicant工具包。官方网站:http://w1.fi/wpa_supplicant/

    • 安装wpa_supplicant工具包。

                      apt-get install wpasupplicant
                    
    • 配置wps_supplicant工具的配置文档/etc/wpa_supplicant.conf。该文档可手工创建,内容如下:

                      ctrl_interface=DIR=/var/run/wpa_supplicant
                      #
                      # home network; allow all valid ciphers
                      network={
                               ssid="home"
                               scan_ssid=1
                               key_mgmt=WPA-PSK
                               psk="very secret passphrase"
                      }
                    

      wpa_supplicant.conf配置参数说明可参考man文档,man文档里还有各种网络环境下的配置示例,非常值得一看。官方网站也有配置示例可参考。下面是我从网上摘录的配置示例,仅供参考:

                      ctrl_interface=/var/run/wpa_supplicant
                      
                      # 确保只有root用户能读取WPA的配置
                      ctrl_interface_group=0
                      
                      # 使用wpa_supplicant来扫描和选择AP
                      ap_scan=1
                      
                      # 简单的情形:WPA-PSk密码验证方式,PSK是ASCII密码短语,所有合法的加密方式都允许连接
                      network={
                               ssid="simple"
                               psk="very secret passphrase"
                               priority=5       # 优先级越高,就能越早匹配到
                      }
                      
                      # 与前面的设置相同,但要求对特定的SSID进行扫描(针对那些拒绝广播SSID的AP)
                      network={
                               ssid="second ssid"
                               scan_ssid=1
                               psk="very secret passphrase"
                               priority=2
                      }
                      
                      # 仅使用WPA-PSK方式。允许使用任何合法的加密方式的组合
                      network={
                               ssid="example"
                               proto=WPA
                               key_mgmt=WPA-PSK
                               pairwise=CCMP TKIP
                               group=CCMP TKIP WEP104 WEP40
                               psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
                               priority=2
                      }
                      
                      # 明文连接方式(不使用WPA和IEEE802.1X)
                      network={
                               ssid="plaintext-test"
                               key_mgmt=NONE
                      }
                      
                      # 共享WEP秘钥连接方式(不使用WPA和IEEE802.1X)
                      network={
                               ssid="static-wep-test"
                               key_mgmt=NONE
                               wep_key0="abcde"
                               wep_key1=0102030405
                               wep_key2="1234567890123"
                               wep_tx_keyidx=0
                               priority=5
                      }
                      
                      # 共享WEP秘钥连接方式(无WPA和IEEE802.1X),使用共享秘钥IEEE802.11验证方式
                      network={
                               ssid="static-wep-test2"
                               key_mgmt=NONE
                               wep_key0="abcde"
                               wep_key1=0102030405
                               wep_key2="1234567890123"
                               wep_tx_keyidx=0
                               priority=5
                               auth_alg=SHARED
                      }
                      
                      # 在IBSS/ad-hoc网络中使用WPA-None/TKIP
                      network={
                               ssid="test adhoc"
                               mode=1
                               proto=WPA
                               key_mgmt=WPA-NONE
                               pairwise=NONE
                               group=TKIP
                               psk="secret passphrase"
                      }
                    
    • 运行wpa_supplicant建立连接。

                      debian:~# wpa_supplicant -D wext -i wlan0 -c /etc/wpa_supplicant.conf
                      CTRL-EVENT-SCAN-RESULTS
                      CTRL-EVENT-SCAN-RESULTS
                      Trying to associate with 00:21:29:b6:c0:d2 (SSID='linksys5-3' freq=2437 MHz)
                      Associated with 00:21:29:b6:c0:d2
                      WPA: Key negotiation completed with 00:21:29:b6:c0:d2 [PTK=TKIP GTK=TKIP]
                      CTRL-EVENT-CONNECTED - Connection to 00:21:29:b6:c0:d2 completed (auth) [id=0 id_str=]
                    
  • 通过上面的配置,我们已可与无线AP建立连接。如果要正常通信还需设置无线网卡的IP地址。如果网络使用dhcp动态分配IP地址,则运行dhclient wlan0命令即可,如果网络使用静态IP地址,则要手动运行以下命令设置IP。

                ifconfig wlan0 192.168.2.5 netmask 255.255.255.0
              

    这时你应该已可以Ping得通同网段的其它电脑了。我们想通过接入点连接互联网或其它网段,如果你的IP配置方式是采用静态IP的话,则还需设置网关。

                route add -net default netmask 0.0.0.0 gw 192.168.2.1
              

自动方式:

  • 启用无线网络要编辑interfaces文件,添加如下内容:

                auto wlan0
                iface wlan0 inet dhcp
                pre-up wpa_supplicant -B -i wlan0 -Dwext -c /etc/wpa_supplicant.conf
                post-down killall -q dhclient wpa_supplicant
              

    我们的无线网卡的接口名为wlan0,使用dhcp服务器获取IP地址。接着按上面介绍的方法配置好wpa_supplicant.conf文档。

  • 最后,使用/etc/init.d/networking restart命令重启网络。使用iwconfig命令可以查看无线接口信息。

连接没有密码的开放网络的配置方式(采用 dhcp方式获取):

        ifconfig wlan0 up
        iwconfig wlan0 essid linksys5-1
        iwconfig wlan0 channel 6
        iwconfig wlan0 ap 00:21:29:B6:C0:D2
        dhclient wlan0
      

Chapter 10. 软件应用篇

安装Compiz 3D桌面

如果你的显卡是3D加速卡,而且按我上面介绍的方法正确安装了3D加速驱动程序。那我们就可以安装Compiz 3D桌面了。Compiz是一个3D的综合窗口管理器,可以用来替换Gnome的Metacity窗口管理器。Compiz借助Xgl这个新的X server通过OpenGL驱动实现很炫的3D效果。Xgl是由Novell开发的新一代X server,他借助OpenGL技术充分发挥了新一代显卡优异的3D立体画面表现能力。通过Compiz窗口管理器的帮助,使我们的桌面可以表现出放大缩小桌面、可旋转的3D桌面、果冻效果、水波等等立体特效。这个计划最初由David Reveman发起,并于2006年1月2日发布第一版。Xgl开源后归并入freedesktop.org。

在Debian系统上安装Compiz很简单,分两步操作,第一步要修改xorg.conf配置文档,把以下选项添加到Device配置小节:

Option "AddARGBGLXVisuals" "true"

添加一个新的配置小节:

Section "Extensions"
    Option "Composite" "true"
EndSection

确保Screen配置小节中以下选项为24:

DefaultDepth    24

以上修改是针对我的Nvidia显卡,如果是Ati显卡设置有所区别,请参考官方网站进行修改。修改完xorg.conf配置文件后,要重启X window使配置生效。

第二步操作是安装Compiz软件包及相关工具,用apt-get install compiz命令安装相关软件。安装完成后,运行以下命令验证系统是否已支持direct rendering功能。

debian:~# glxinfo | grep direct
direct rendering: Yes               
# 返回Yes则说明系统已支持direct rendering,如果系统提示找不到glxinfo命令,则要手动安装mesa-utils软件包。

运行以下命令启动compiz 3D窗口管理替换当前运行的窗口管理器。

compiz --replace

成功启动后,按住Crtl + Alt后左右移动鼠标就可看到3D桌面旋转的效果了。接着我们可以把compiz窗口管理器的启动命令放到gnome启动会话列表中,使进入gnome桌面环境时自动使用compiz替换默认的metacity窗口管理器。设置方法是:系统--首选项--会话--启动程序--添加会话。把上面启动命令compiz --replace放到新增会话的命令行栏目中。重启系统,compiz就会自动加载了。

Compiz 3D桌面的效果多数通过快捷键实现,compizconfig-backend-gconf软件包是gnome桌面环境下compiz配置程序,我们可以通过它来启动和关闭一些效果。下面是一些常用的快捷键列表。

    * 切换窗口 = Alt + Tab
    * 铺开显示全部窗口 = 指针移到屏幕右上角作为开关;单击窗口使之缩放到前台。
    * 切换立方体桌面 = Ctrl + Alt + 左/右箭头
    * 切换立方体桌面 + 活动窗口跟随 = Ctrl + Shift + Alt + 左/右箭头
    * 手动旋转立方体 = Ctrl + Alt + 左键单击并拖拽桌面空白处
    * 窗口透明/不透明 = Alt + 滚轮
    * 放大一次 = 超级键 + 右击
    * 手动放大 = 超级键 + 滚轮向上
    * 手动缩小 = 超级键 + 滚轮向下
    * 移动窗口 = Alt + 左键单击
    * 移动窗口时贴住边框 = Ctrl + Shift + 左键拖动
    * 调整窗口大小 = Alt + 中击
    * 动态效果减速 = Shift + F10
    * 水纹 = 按住 Ctrl+超级键
    * 雨点 = Shift-F9
    * 桌面展开= Ctrl + Alt + 下箭头,然后按住 Ctrl + Alt 和左/右箭头选择桌面

超级键即是键盘上的win键,更多操作请参考官方网站

中文字体模糊不清的解决方法

中文字体模糊不清的原因是字体配置不好引起的,有关X window的字体系统在上面已讲过,这里就不再细讲了。现在多数的程序都支持Xft字体系统的fontconfig库,所以调整该字体系统就可使程序达到很好的显示效果。具体调整方法是把以下代码加入到~/.fonts.conf中的<fontconfig>和</fontconfig>元素内。Xft字体的配置文件有三个,其中/etc/fonts/local.conf是本地字体配置文件,我们可在该文件内添加或修改字体配置,但好象新版的Xft的配置文件又有了变化,不使用local.conf文件了。fonts.conf是系统级的字体配置文件,一般不要修改该文件,它通过include指令应用local.conf文件里的配置信息。~/.fonts.conf是用户级字体配置文件,优先级最高。

~/.fonts.conf默认是没有的,我们可参照/etc/fonts/local.conf手工创建或直接拷贝该文件。

<!--my fonts additions configure-->
<!-- 关闭所有10至15号字体的抗锯齿功能-->
<match target="font" >
   <test compare="more" name="pixelsize" qual="any">
      <double>10</double>
   </test>
   <test compare="less" name="pixelsize" qual="any">
      <double>15</double>
   </test>
   <edit mode="assign" name="antialias" >
      <bool>false</bool>
   </edit>
</match>

<!-- 调整文字间距过大问题 -->
<match target="font">
<test target="pattern" name="lang" compare="contains">
<string>zh-tw</string>
<string>zh-cn</string>
<string>ja</string>
<string>ko</string>
</test>
<edit name="spacing">
<const>proportional</const>
</edit>
<edit name="globaladvance">
<bool>false</bool>
</edit>
</match>

<!-- 重排字体显示的优先级,使中英文字体更美观,排在最前面的字体会优先显示,如果没有该字体,则使用下一行的字体,以次类推。 -->
<alias>
      <family>serif</family>
      <prefer>
         <family>Bitstream Vera Serif</family>
         <family>Times New Roman</family>
         <family>Times</family>
         <family>AR PL New Sung</family>
         <family>AR PL Mingti2L Big5</family>
         <family>AR PL SungtiL GB</family>
         <family>Ming(ISO10646)</family>
         <family>SimSun</family>
         <family>Kochi Mincho</family>
         <family>Baekmuk Batung</family>
      </prefer>
  </alias>

<alias>
      <family>sans-serif</family>
      <prefer>
         <family>Bitstream Vera Sans</family>
         <family>Arial</family>
         <family>Verdana</family>
         <family>Helvetica</family>
         <family>AR PL New Sung</family>
         <family>Ming(ISO10646)</family>
         <family>AR PL kaitiM Big5</family>
         <family>AR PL kaitiM GB</family>
         <family>Kochi Gothic</family>
         <family>Baekmuk Dotum</family>
      </prefer>
  </alias>

<alias>
      <family>monospace</family>
      <prefer>
         <family>Bitstream Vera Sans Mono</family>
         <family>Courier New</family>
         <family>Courier</family>
         <family>AR PL New Sung</family>
         <family>Ming(ISO10646)</family>
         <family>Kochi Mincho</family>
         <family>Baekmuk Batung</family>
      </prefer>
  </alias>

Iceweasel(Firefox)

由于firefox商标版权是非自由的,所以Debian使用了Iceweasel来代替firefox。由于编写本文档时debian还是使用firefox,所以我就不更新旧的内容了,其实只是名称的差别,使用和配置是一样的。。

Firefox是基于Mozilla的一种轻便型Web浏览器,以快速、灵活和功能强大而深得自由软件爱好的青睐。在Debian中有现成的deb软件包,安装很简单方便。用以下命令即可完成Firefox中文版的安装:

debian:~# apt-get install mozilla-firefox mozilla-firefox-locale-zh-cn

Firefox的常用配置

  • 界面字体配置:Firefox是一个GTK+2程序,所以有关Firefox菜单界面的字体配置可参考GTK+2程序字体配置进行配置。

  • 网页显示字体配置:进入”编辑--首选项--基本信息--字体和颜色“菜单路径设置即可。要网页显示的字体好看和清晰关键是配置好Debian系统的中文字体显示。可参考本学习笔记的相关内容。

  • 支持Java的配置:

    • 首先要在firefox中启用java支持功能,在”编辑--首选项--网页特性“路径下把”启用java“这个选项选上。

    • 接着配置java的插件,下面介绍的是手动配置的方法,如果我们使用上面介绍的Debian方式安装java软件包的话,则这些链接已自动建立好了,不用手工配置的。这里介绍手工配置方式主要是想说明java插件在Foxfire中的配置原理。在正确安装Java运行环境的前题下,进入/usr/lib/mozilla-firefox/plugins/目录。运行以下命令生成到java插件的一个链接:

      debian:/usr/lib/mozilla-firefox/plugins# ln -s /usr/lib/j2re1.5-sun/plugin/i386/ns7/libjavaplugin_oji.so
      

      如果你有使用Debian的alternatives配置系统,则在/etc/alternatives目录下应该已有一个firefox-javaplugin.so链接文件指向/usr/lib/j2re1.5-sun/plugin/i386\/ns7/libjavaplugin_oji.so。所以在这里你只需建一个指向该链接的链接即可。如:

      debian:/usr/lib/mozilla-firefox/plugins# ln -s /etc/alternatives/firefox-javaplugin.so libjavaplugin.so
      

      是不是很复杂,其实归根到底就是要在/usr/lib/mozilla-firefox/plugins目录下建一个到/usr/lib/j2re1.5-sun/plugin/i386/ns7/libjavaplugin_oji.so链接。

  • 支持在线pdf文件显示:

    • 以Adobe Reader 7.0 for Linux软件提供的pdf插件为例进行说明。同样,在配置前需完成Adobe Reader 7.0 for Linux软件包的安装,并确保acroread命令所在路径包含在系统环境的搜索路径中,也就是说能在系统任何路径中打acroread命令都能正常启动程序。我的acroread是安装在/usr/local/Adobe/Acrobat7.0/bin目录下的,所以我要把它拷贝到/usr/bin目录下。

    • acroread的pdf插件位于/usr/local/Adobe/Acrobat7.0/Browser/intellinux目录下,名为nppdf.so。用以下命令在firefox的插件目录创建一个到该文件的链接即可,如:

      debian:/usr/lib/mozilla-firefox/plugins# ln -s /usr/local/Adobe/Acrobat7.0/Browser/intellinux/nppdf.so
      

      安装好插件后,如果用firefox点击一个网页中的pdf文件链接,firefox会自动调用acroread程序来显示该pdf文件。

    • 访问http://toolbar.google.com网址可以安装Google ToolBar工具。

  • 在FireFox中,可在地址栏打上about:加配置关键字来配置FireFox或者显示一些信息。下面列出一些常用的关键字,以供参考:

    • about: -- 显示FireFox版本信息。

    • about:config -- 配置FireFox的所有参数。

    • about:credits -- 显示开发者及对Mozilla作出贡献的人。

    • about:blank -- 打开一个空白页面。

    • about:buildconfig -- 显示FireFox的编译时的参数。

    • about:cache -- 这个不用介绍了吧,显示缓存内容。

    • about:plugins -- 显示已安装的插件信息。

    • about:mozilla -- 显示Mozilla宣言。

    由于google toolbar不支持iceweasel,所以在iceweasel上安装google toolbar时会提示你要安装firefox。其实我们可以通过修改iceweasel的配置来骗过google。方法很简单:在iceweasel浏览器上输入about:config打开配置表,找到general.useragent.extra.firefox选项,把选项中的Iceweasel改成Firefox即可。

  • 默认情况下,Firefox左上角的Google搜索栏不能直接打入关键字进行搜索,而是直接链接到google的主页上,很多人都不喜欢这种设置,也包括我自己啦。下面让我们修改一下Firefox的配置,使我们能在搜索栏上直接搜索。首先,在地址栏上打入about:config进入配置面页,过滤google关键字可找到两个选项,分别是:browser.search.param.Google.1.custom和browser.search.param.Google.1.default。把这两个选项的值都删掉。现在,我们就可在搜索栏直接用google进行搜索。

    现在Google已提供Firefox的Toolbar插件,在Toolbar中就可直接搜索了,Firefox自带的搜索栏都很少用了。

  • 开启即输即功能,可使我们在页面中直接输入关健字,Firefox会自动弹出查找栏并在当前页中匹配输入的关键字。启用方法是选中"Edit"->"Preferences"->"Advanced"->"Accessibility"->"begin finding when begin typing"选项。

firefox Extension

firefox可通过Extension扩展自身的功能,现在网上已有大量的扩展套件可供下载。每个扩展套件是使用XUL开发的xpi程序,在网上点击即可安装。下面介绍我接触和使用过的一些套件。

安装Adobe Reader 7.0 for Linux

在Debian系统中暂时还没有acroread包,所以我们需到Adobe网站下载源码或rpm文件安装。下载的地址是:ftp://ftp.adobe.com/pub/adobe/reader/unix/7x/7.0/。我下载的是rpm包,用rpm -ivh安装即可。默认它是安装在/usr/local/Adobe/Acrobat7.0目录。

安装rxvt中文终端

rxvt是一个功能强大的的终端,它占用资源少,启动速度快,很多人都喜欢使用它。所以我在这里介绍一下Debian系统中rxvt中文终端的安装。在Debian中有很多个rxvt包,可用apt-cache search rxvt命令查询。主要有以下三类,一个就叫rxvt,不支持中文显示;一个叫rxvt-ml,支持GB和BIG5中文编码;还有一个叫rxvt-unicode,支持unicode编码。第一种不支持中文,这里就不讨论了。下面分别讨论rxvt-ml和rxvt-unicode两种rxvt终端的安装。

Note

在使用rxvt中文终端前,需先把GNOME或KDE桌面的中文环境配置好。这样才能在rxvt中正常显示中文和使用中文输入法(我用fcitx)。

  • 安装rxvt-ml

    debian:~# apt-get install rxvt-ml
    

    安装完成后,在/usr/bin目录下会生成几个rxvt程序,分别是crxvt crxvt-big5 crxvt-gb grxvt krxvt 和一个指向/etc/alternatives/rxvt的链接文件rxvt。这六个程序分别对应不同的语言编码环境,crxvt-gb用于中文GB编码环境;crxvt-big5用于大五码编码环境;krxvt用于日文环境,我测试过,krxvt也可用于中文环境;grxvt用于greek键盘环境;crxvt也是用于大五码环境;rxvt链接默认指向krxvt。

    对于我们来说,只需使用crxvt-gb这个程序就可以了。为了能正常显示中文,我们需把locale环境配置成zh_CN.GB2312。具体配置方式可参见GNOME和KDE桌面环境中的locale配置。重启X会话使locale生效,这样就可用crxvt-gb使用rxvt中文终端了。

  • 安装rxvt-unicode

    debian:~# apt-get install rxvt-unicode
    

    安装完成后,直接运行rxvt或rxvt-unicode即可,对locale好象没有什么要求。rxvt-unicode还有两个程序,一个是urxvtd(daemom),一个是urxvtc(client)。通过这对程序可用一个线程打开任意多个终端窗口,大大提高程序启动的速度,并有效减少内存的占用。rxvt-unicode可支持多国语言,但程序启动比crxvt-gb慢好多,而且对中文字符的支持也不是太好,比如全角的双引号,在rxvt-unicode中会变得很大,很不协调。所以功能和性能,不可能两全其美哦。

rxvt的配置选项是很丰富的,你可通过命令行或X资源文件来配置。命令行方式只能一次性改变rxvt的设置,如:

debian:~# rxvt -fn 8X16 -fg black -bg white      
上句的设置表示使用8X16的字体,终端屏幕为白底黑字。

有时我想把调整好的配置保存起来,不用每次都在命令行输入大量的配置信息。这时我们可以用X系统的资源文件~/.Xresources,如果用户主目录如没有可自行创建。内容如下:

! my rxvt setting  
Rxvt.background:black
Rxvt.foreground:white
Rxvt.colorBD:yellow
Rxvt.colorUL:green
Rxvt.multichar_encoding:gb2312
Rxvt.scrollBar:True
Rxvt.scrollBar_right:True
Rxvt.scrollBar_floating: False
Rxvt.scrollstyle: next
Rxvt.saveLines:1500
Rxvt.color0:black
Rxvt.color1:red
Rxvt.color2:#3a5da3
Rxvt.color3:#4b76cc
Rxvt.color4:RoyalBlue4
Rxvt.color5:magenta
Rxvt.color6:#a1b5dd
Rxvt.color7:#8a95aa
Rxvt.color8:#616668
Rxvt.color9:#075982
Rxvt.color10:#0f82bc
Rxvt.color11:#13a9f4
Rxvt.color12:SkyBlue2
Rxvt.color13:#63c2f2
Rxvt.color14:#6caccc
Rxvt.color15:#dbeff9
Rxvt.font:-b&h-lucidatypewriter-medium-r-normal-*-14-*-*-*-*-*-iso8859-*
Rxvt.mfont:-*-*-medium-r-normal-*-16-*-*-*-c-*-gb*-*
Rxvt.menu:/etc/X11/rxvt.menu
Rxvt.preeditType:Root

Note

在rxvt-unicode中资源文件的名称前缀改为rxvt,而不是Rxvt。

修改完资源文件后,需运行以下命令使配置生效,或重启X会话。一般我们选择前者:

debian:~# xrdb .Xresources

rxvt的配置参数有很多,可使我们定置出个性化的终端。详细的参数可查询man页或用rxvt --help列出。配置很简单方便的,有兴趣的朋友可测试一下。我在这里就不一一介绍了。

Note

GNOME和KDE环境下rxvt中文终端的设置方式是一样的。

fcitx输入法在rxvt中好象不能通过设置单击L_SHIFT键进行中英文切换,只能设置“双击中英文切换=1”,通过双击L_SHIFT进行中英文切换。

安装ALSA多媒体系统

这里以KDE环境为例说明,GNOME和其它桌面环境也大同小异。我安装了kde-core软件包,所以只有基本的kde系统,很多功能还没有,要手工配置,其中多媒体声音系统就是其中之一。我是以2.6.10内核,ES1371声卡为例进行说明的,具体的安装步骤如下:

  1. 首先是要编译内核,我选用了较新的Advanced Linux Sound Architechture(ALSA)系统,取消Open Sound System(OSS)系统。并在ALSA下选择你的声卡驱动,把它编译进内核。用这个新内核启动系统。

  2. 进入KDE桌面环境后,用以下命令安装alsa-base和kmix软件包,alsa-base软件包提供alsa声音系统所需的软件支持,alsa-utils提供一个alsa系统管理工具集。kmix是一个KDE的混音器,用以调节音量。GNOME的混音器包含在GStreamer多媒体架构中:

    如果是KDE环境,用以下命令安装:

    debian:~# apt-get install alsa-base alsa-utils kmix
    

    如果是GNOME环境,用以下命令安装:

    debian:~# apt-get install libgstreamer0.8-0 gstreamer0.8-alsa
    
  3. 安装完相关软件后,要运行以下命令配置alsa系统:

    debian:~# alsaconf
    

    按提示选择你的声卡。如果选择正确,最终将显示成功配置alsa系统的提示信息。

  4. 最后,就可用kmix或gstreamer调节音量,如果是KDE桌面环境就可在kde控制中心的多媒体配置中进行声音测试了。如果是GNOME的话可在“应用程序”--“桌面首选项”--“音效”里进行测试。

ALSA声音系统的设备文件位于/dev/snd目录下,而Oss声音系统的设备文件位于/dev目录下,如/dev/audio、dev/dsp、/dev/midi、/dev/mixer、/dev/music、/dev/sequencer等。如果装了OSS模拟层,在ALSA声音系统下也会有/dev/dsp等文件。

ALSA项目的网址:http://www.alsa-project.org/

使用minicom调试串口设备

minicom是一个串口通信工具,就像Windows下的超级终端。可用来与串口设备通信,如调试交换机和Modem等。它的Debian软件包的名称就叫minicom,用apt-get install minicom即可下载安装。

第一次运行minicom时会提示没有默认的配置文件,但不影响使用。进入minicom程序后会自动连接串口设备,我连接的串口设备是外置式的实达捷豹2000 Modem。如果成功连接,则显示OK和一些初始化信息。如:

Welcome to minicom 2.1

OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n           
Compiled on Dec  9 2004, 08:45:12.                                           
                                                                             
Press CTRL-A Z for help on special keys                                      
                                                                             
                                                                             
OK                                                                           
AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0                                             
OK                          

在这个状态下我们就可用Modem的AT命令与modem交互。如:

at&v   #显示配置表

---ACTIVE PROFILE---
B0 L2 M1 X4 W2 N1 E1 Q0 V1 T &O0 &Q0 &P0 &Y0 &J0 &R1 &D2 &C1 &S0 &U0 &K3 \N5 \V 
S0:0 S1:0 S2:43 S3:13 S4:10 S5:8 S6:6 S7:60 S8:2 S9:6 S10:14 S11:95 S12:100 S13 
---STORED PROFILE 0---                               
B0 L2 M1 X4 W2 N1 E1 Q0 V1 T &O0 &Q0 &P0 &Y0 &J0 &R1 &D2 &C1 &S0 &U0 &K3 \N5 \V 
S0:0 S2:43 S3:13 S4:10 S5:8 S6:6 S7:60 S8:2 S9:6 S10:14 S11:95 S12:100 S19:0 S2 
---STORED PROFILE 1---
B0 L2 M1 X4 W2 N1 E1 Q0 V1 T &O0 &Q0 &P0 &Y0 &J0 &R1 &D2 &C1 &S0 &U0 &K3 \N5 \V 
S0:0 S2:43 S3:13 S4:10 S5:8 S6:6 S7:60 S8:2 S9:6 S10:14 S11:95 S12:100 S19:0 S2 
---TELEPHONE NUMBER---
&Z0=
&Z1=96169
&Z2=2025819220065

OK

atdt96169    #拔96169
CONNECT 48000/V42BIS
                                                                                
*********************************                                               
* Quidway A8010 Internet Server *                                               
* welcome!!                     *                                               
*********************************                                               
please input username:1                                                         
please input password:*                                                         
Entering PPP mode.                                                              
Async interface address is unnumbered(Ethernet0)                                
Header compression will match your system.                                      
Your IP address is: 218.20.82.129 MTU is 1500 bytes

要挂机的话可先按Ctrl+A切换到命令模式,再H键。当屏幕很花时,在命令模式下按C键可清屏。AT命令还有很多,下面给出一些常用的以供参考。

AT&F             恢复出厂设置
ATZ0             软复位
AT&V             显示配置表
AT&W0,1          存写配置表0,1
ATDT96169        音频拔号96169
AT&Z0=96169      保存电话号码到Z0位置,从配置表可查看位置信息
ATDS 0           拔第一个位置的号码
AT&S0=0          禁止自动应答功能
AT&S0=N(1-255)   振铃N次后自动应答
ATM0             关闭扬声器声音
ATM1             接收载波时(拔通后)关闭扬声器声音
ATM2             扬声器一直处于开状态
ATM3             正在接收载波和拔号时关闭扬声器声音
ATL1,2,3         设置扬声器的音量     

默认的minicom配置文件位于/etc/minicom目录下,文件名为minirc.dfl。

一般来说,在使用minicom前需进行配置,以便正确连接串口设备。有两种方式可配置minicom,一种是用minicom -s命令直接从命令行进入配置菜单;另一种方式是用不带参数的minicom命令进入minicom后,在命令模式中配置。minicom的命令模式可Ctrl+A进行切换。按Z键可查看所有的命令。按O键,可进入minicom的配置菜单。在这里我们可配置上传下载文件保存的路径、串口的参数、拔号参数等。配置完成后,可用Save setup as..菜单把配置参数以文件的形式保存起来,下次就可直接用minicom filename命令调用该参数文件了。用Save setup as dfl命令可把配置存在minirc.dfl这个默认配置文件中。

minicom的使用不难,关键是要先了解你所连接串口设备的参数。用man minicom可查看详细的帮助。

在Linux下也有图形界面的超级终端工具叫gtkterm,用GTK+开发。对比minicom,gtkterm相对容易使用。这里也就不详细介绍了,大家用apt-get install gtkterm命令安装后,用gtkterm -p /dev/ttyS0命令连接串口设备即可。gtkterm的官方网站是:http://www.jls-info.com/julien/linux/

还有一个工具叫cu,也可以连接串口设备。

使挂载的fat32和ntfs分区正常显示中文名

  • 自动加载方式:

    编辑/etc/fstab文件,把原来的

    /dev/hda2 /mnt/hda2 vfat auto,users,exec 0 0                   
    /dev/hda5 /mnt/hda5 ntfs auto,users,exec,ro,umask=000 0 0
    

    改成

    /dev/hda2 /mnt/hda2 vfat iocharset=gb2312,users,exec 0 0
    /dev/hda5 /mnt/hda5 ntfs iocharset=gb2312,users,exec,ro,umask=000 0 0
    
  • 手工加模式:

    在shell下输入以下命令

    # mount /dev/hda2 /mnt/hda2/ -t vfat -o iocharset=gb2312
    # mount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312
    

如果你要挂接的Windows分区是ntfs分区,而Linux系统采用的locale是zh_CN.GB2312或zh_CN.GBK,分区成功挂接后,会出现一些中文文件名的文件不能识别文件类型的情况。解决办法是把Linux的locale换成zh_CN.UTF-8。在挂接分区时把iocharset参数的值由gb2312换成utf8即可。

配置Java环境

安装

Debian官方没有维护专门的Java软件包,所以不能直接用apt-get工具来安装。在Debian系统中要安装Java,有两种方式,一种是用传统方式;一种是Debian方式。下面分别介绍:

传统方式:

  • 到SUN官方网站下载最新jre包,我下载的是jre-1_5_0_01-linux-i586.bin,并把该文件的属性改成可执行,直接执行该文件。

    debian:~/inst# chmod +x jre-1_5_0_01-linux-i586.bin
    debian:~/inst# ./jre-1_5_0_01-linux-i586.bin 
    

    程序运行后会当前目录下生成一个名为jre1.5.0_01的目录。

  • 把该目录拷贝到/usr/local/jre1.5.0_01,并在你的系统初始化脚本中增加以下两个环境变量。在我的系统中,我把这两句放到~/.gnomerc文件中。

    export CLASSPATH="/usr/local/jre1.5.0_01/lib"
    export JAVA_HOME="/usr/local/jre1.5.0_01" 
    

    重启系统或手工执行以上两个export命令后,就可使用java命令了,你可用java -version命令进行测试。使用传统方式安装的java没有归并到Debian软件包体系中,所以在Debian的软件包数据库中不会存在java的依赖关系信息。且不能用Debian的软件包管理程序进行管理,只能手工维护。也就是说,如果我们要删除java,只能手工删除目录和环境变量。

Debian方式(推荐):

  • 我们可以通过java-package包提供的make-jpkg程序,从SUN官方的java软件包生成一个Debian软件包。java-package软件包可通过apt-get命令安装。

    debian:~# apt-get install java-package
    
  • 下载官方的java软件包,并用以下命令生成Debian格式的java软件包。注意,make-jpkg程序不能在root环境下运行,我们要使用fakeroot程序。

    debian~:# cp jre-1_5_0_01-linux-i586.bin /home/jims/.
    debian~:# chown jims /home/jims/jre-1_5_0_01-linux-i586.bin
    debian~:# su - jims
    jims@debian:~$ fakeroot make-jpkg jre-1_5_0_01-linux-i586.bin
    

    程序运行完成后,在当前目录下就会生成一个Debian软件包sun-j2re1.5_1.5.0+update01_i386.deb。

  • 以root身份安装该软件包。

    debian~:# dpkg -i sun-j2re1.5_1.5.0+update01_i386.deb
    
  • 最后设置java的环境变量。

    export CLASSPATH="/usr/lib/j2re1.5-sun/lib/"
    export JAVA_HOME="/usr/lib/j2re1.5-sun/"
    

    用java -version进行测试。用这种方式安装的java会把java软件包的相关信息储存在Debian软件包数据库,可用apt-get工具进行管理。如果要删除java,只要运行以下命令即可。

    debian:~# apt-get --purge remove sun-j2re1.5
    

建议使用Debian方式安装java,这样其它依赖于Java的Debian软件包才能被正常安装。现在,在debian软件库的non-free部份已有现成的sun-java-jdk软件包,配置好sources.list后就可直接用apt-get命令安装。

设置JAVA的中文显示

在Linux环境下,如果Java的字体设置不对,Java程序会把中文显示成一些方框符号或问号。为了使基于Java的程序能正常显示中文,需进行字体配置 。下面是在Debian环境下的配置方法,其它发行版的修改方法也一样,只是需修改的文件的路径名不同罢了。

  1. 找到.../jre/lib/目录,在我的debian系统上是/usr/lib/j2se/1.4/jre/lib。该目录下有很多以font开头的文件,其中font.properties是java默认的字体配置文件。用font.properties.zh_CN.Sun覆盖原来的font.properties文件。

  2. 修改新的font.properties文件,以SimSum字体为例,把以下设置

    serif.0=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1
    serif.1=-Hanyi-HanyiSong-medium-r-normal--*-%d-*-*-c-*-gbk-0
    

    更改成

    serif.0=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1
    serif.1=-misc-SimSun-medium-r-normal--*-%d-*-*-c-*-gb2312.1980-0
    

    按以上的方式把文件中的所有字体进行同样的设置。如果不知道本机安装了什么字体,可用xlsfonts命令列出。

以上的设置适用于1.4版的java,1.5版的java的字体设置有较大的变化,字体配置文件名变成fontconfig.properties。经测试,在1.5中有两种设置中文字体的方法,一种就是与1.4的方法一样,需配置fontconfig.properties文件。在/usr/lib/j2re1.5/lib目录下有很多以.src结尾的配置源文件,代表在不同平台下的标准配置。我们可以它们为蓝本拷贝成fontconfig.properties。然后再根据你系统中所安装的X11核心中文字体来配置字体名和字体文件路径。第二种方法很简单,只要在/usr/lib/j2re1.5/lib/fonts目录下建立一个fallback目录,并把中文字体文件拷贝或链接到该目录中即可,根本不用配置其它东西。

Fcitx中文输入法

Fcitx的全称是Free Chinese Input Toy for X,这是一个由中国人开发的输入法软件,项目网址位于http://www.fcitx.org。Fcitx已进入Debian软件包系统,用apt-get install fcitx即可安装。它的配置文件是~/.fcitx/config。该文件是GB2312编码的,编辑时要注意。你可在该文件中配置输入法的字体,显示效果和快捷键等,配置简单明。

常用配置

~/.fcitx/config是主要的配置文档,内容如下:

[程序]
显示字体(中)=*
显示字体(英)=Courier
显示字体大小=14
主窗口字体大小=12
是否使用AA字体=1

[输出]
数字后跟半角符号=1
Enter键行为=2
分号键行为=2
大写字母输入英文=1
转换英文中的标点=1
联想方式禁止翻页=1

[界面]
候选词个数=5
主窗口是否使用3D界面=0
输入条使用3D界面=2
主窗口隐藏模式=1
显示虚拟键盘=1
是否自动隐藏输入条=1
输入条是否居中=1
首次显示输入条=1
#输入条固定宽度仅适用于码表输入法,0表示不固定宽度
输入条固定宽度=400
序号后加点=0
显示打字速度=1
光标色=92 210 131
主窗口背景色=220 220 220
主窗口线条色=100 180 255
主窗口输入法名称色=170 170 170 150 200 150 0 0 255
输入窗背景色=240 240 240
输入窗提示色=255 0 0
输入窗用户输入色=0 0 255
输入窗序号色=200 0 0
输入窗第一个候选字色=0 150 100
#该颜色值只用于拼音中的用户自造词
输入窗用户词组色=0 0 255
输入窗提示编码色=100 100 255
#五笔、拼音的单字/系统词组均使用该颜色
输入窗其它文本色=0 0 0
输入窗线条色=100 200 255
输入窗箭头色=255 150 255
虚拟键盘窗背景色=220 220 220
虚拟键盘窗字母色=80 0 0
虚拟键盘窗符号色=0 0 0

#除了“中英文快速切换键”外,其它的热键均可设置为两个,中间用空格分隔
[热键]
打开/关闭输入法=CTRL_SPACE
#中英文快速切换键 可以设置为L_CTRL R_CTRL L_SHIFT R_SHIFT
中英文快速切换键=L_SHIFT
双击中英文切换=0
击键时间间隔=250
光标跟随=CTRL_K
GBK支持=CTRL_M
联想支持=CTRL_L
反查拼音=CTRL_ALT_E
全半角=SHIFT_SPACE
中文标点=ALT_SPACE
上一页=-
下一页==
第二三候选词选择键=SHIFT

[输入法]
使用拼音=1
使用双拼=0
使用区位=0
使用码表=1
提示词库中的词组=0

[拼音]
使用全拼=0
拼音自动组词=1
保存自动组词=0
增加拼音常用字=CTRL_8
删除拼音常用字=CTRL_7
删除拼音用户词组=CTRL_DELETE
#拼音以词定字键,等号后面紧接键,不要有空格
拼音以词定字键=[]
#重码调整方式说明:0-->不调整  1-->快速调整  2-->按频率调整
拼音单字重码调整方式=2
拼音词组重码调整方式=1
拼音常用词重码调整方式=0
是否模糊an和ang=0
是否模糊en和eng=0
是否模糊ian和iang=0
是否模糊in和ing=0
是否模糊ou和u=0
是否模糊uan和uang=0
是否模糊c和ch=0
是否模糊f和h=0
是否模糊l和n=0
是否模糊s和sh=0
是否模糊z和zh=0

同一目录下还有一个配置文档叫profile,主要记录输入法的默认行为,如输入法窗口的位置,是否有联想功能等。下面内容是我的profile文档的示例:

版本=3.2.1
主窗口位置X=500
主窗口位置Y=1
输入窗口位置X=312
输入窗口位置Y=668
是否全角=0
是否中文标点=1
是否GBK=0
是否光标跟随=0
是否联想=0
当前输入法=1
禁止用键盘切换=1
简洁模式=0

在Gnome下安装Fcitx并设置开机自启动

如果我们安装了im-switch包,系统则会根据locale自动配置输入法环境,不用我们手工配置,方便了很多。im-switch软件包的配置信息位于/etc/X11/xinit/xinput.d/目录下。建议大家安装该软件包。

下是手动配置的原始方法,仅作为参考。

  1. 把以下几项设置写到/etc/X11/Xsession.d/55gnome-session_gnomerc或用户主目录的~/.gnomerc文件里,~/.gnomerc文件如果没有可以自已创建。55gnome-session_gnomerc脚本会检查系统中是否存在~/.gnomerc文件,如果有,就会用source .gnomerc命令执行。所以为统一管理配置,建议使用~/.gnomerc文件。把以下内容放入该文件。

    export XIM_PROGRAM=fcitx
    export XIM=fcitx
    export XMODIFIERS="@im=fcitx"
    fcitx&
    
  2. 接着要设置Gnome系统语言环境为zh_CN.GB2312或zh_CN.GBK或zh_CN.UTF-8,可在GDM登录窗口按左下角的LANGUAGE(语言)选项设置。也可用#dpkg-reconfigure locales命令配置。

  3. 重新启动GDM,fcitx输入法就会自动启动了。fcitx的配置文件在~/.fcitx目录下,你可根据自已的需求配置。

在KDE环境下设置fcit开机自启动

同上,如果我们安装了im-switch软件包就不用手动配置,系统自动会帮我们根据locale环境配置好输入法。

在正确定安装KDE中文桌面环境的前提下,具体的操作方式请参见上面的相关内容。在/etc/X11/Xsession.d/目录下新建一个文件92fcitx,内容如下:

export LANG="zh_CN.UTF-8"     #设置中文locales,如果不设,fcitx启动后乱码,不能使用。
export XIM_PROGRAM=fcitx
export XIM=fcitx
export XMODIFIERS="@im=fcitx"
fcitx&

Note

在kdm中好象不能像GDM一样设置locales,所以需手动用export设置。

在/etc/X11/Xsession.d/目录下的所有配置文件在X启动时都会被自动执行。所以我就利用了这个特性,在该目录下新建了一个92fcitx文件,用以启动fcitx。类似于gnome环境下的/etc/X11/Xsession.d/55gnome-session_gnomerc文件的作用。注意,这不是唯一的方法,因为在x启动过程中会自动运行很多个脚本,所以在这些脚本中插入fcitx的启动脚本也是可行的。这就是linux高可配置的体现。

使用update-alternatives工具配置可选系统

update-alternatives是dpkg的实用工具,用来维护系统命令的符号链接,以决定系统默认使用什么命令。在Debian系统中,我们可能会同时安装有很多功能类似的程序和可选配置,如Web浏览器程序(firefox,konqueror)、窗口管理器(wmaker、metacity)和鼠标的不同主题等。这样,用户在使用系统时就可进行选择,以满足自已的需求。但对于普通用户来说,在这些程序间进行选择配置会较困难。update-alternatives工具就是为了解决这个问题,帮助用户能方便地选择自已喜欢程序和配置系统功能。下面一个显示可选的窗口管理器的示例:

root@debian:~# update-alternatives --display x-window-manager
x-window-manager - status is auto.                 #当前配置状态为自动方式
 link currently points to /usr/bin/metacity        #当前的窗口管理器是metacity
/usr/X11R6/bin/twm - priority 40                   #下面是可选的窗口管理器列表,后面的数字表示优先级
 slave x-window-manager.1.gz: /usr/X11R6/man/man1/twm.1x.gz
/usr/bin/wmaker - priority 50
 slave x-window-manager.1.gz: /usr/share/man/man1/wmaker.1x.gz
/usr/bin/larswm - priority 20
 slave x-window-manager.1.gz: /usr/share/man/man1/larswm.1x.gz
/usr/bin/fluxbox - priority 50
 slave x-window-manager.1.gz: /usr/share/man/man1/fluxbox.1.gz
/usr/bin/xfwm - priority 20
 slave x-window-manager.1.gz: /usr/share/man/man1/xfwm.1.gz
/usr/bin/icewm - priority 50
 slave x-window-manager.1.gz: /usr/share/man/man1/icewm.1x.gz
/usr/bin/metacity - priority 60
 slave x-window-manager.1.gz: /usr/share/man/man1/metacity.1.gz
Current `best' version is /usr/bin/metacity.        #自动选择方式会选择优先级高的程序

重新设置窗口管理器方法:

root@debian:~# update-alternatives --config x-window-manager

There are 7 alternatives which provide `x-window-manager'.

  Selection    Alternative
-----------------------------------------------
      1        /usr/X11R6/bin/twm
      2        /usr/bin/wmaker
      3        /usr/bin/larswm
      4        /usr/bin/fluxbox
      5        /usr/bin/xfwm
      6        /usr/bin/icewm
*+    7        /usr/bin/metacity

Press enter to keep the default[*], or type selection number:

星号表示当前系统使用的,加号表示优先级最高的。输入数值可修改默认配置,直接按回车保持原来状态。

修改debian系统默认浏览器的示例:

debian:~#update-alternatives --config x-www-browser

There are 3 alternatives which provide `x-www-browser'.

  Selection    Alternative
-----------------------------------------------
      1        /usr/bin/mozilla
*+    2        /usr/bin/epiphany
      3        /usr/bin/mozilla-firefox

Press enter to keep the default[*], or type selection number: 3
Using `/usr/bin/mozilla-firefox' to provide `x-www-browser'.

下面再举一个通过update-alternatives修改鼠标主题的示例。

同上示例,通过以下命令可列出当前鼠标可用主题:

root@debian:~# update-alternatives --config x-cursor-theme

There are 5 alternatives which provide `x-cursor-theme'.

  Selection    Alternative
-----------------------------------------------
      1        /etc/X11/cursors/core.theme
      2        /etc/X11/cursors/redglass.theme
      3        /etc/X11/cursors/whiteglass.theme
      4        /etc/X11/cursors/handhelds.theme
*+    5        /usr/share/themes/Industrial/cursor.theme

Press enter to keep the default[*], or type selection number:

现在我们从网上下载一个新的主题,要把它安装到系统上,并设置新安装的鼠标主题为默认配置。

  • 我下载了一个5507-Golden-XCursors-3D-0.8.tar.bz2鼠标主题,解压后生成Golden-XCursors-3D-0.8目录,该目录下有两个目录,一个是default目录,存放索引文件;一个是Gold目录,存放主题内容。

  • 将包中Gold目录拷贝到/usr/X11R6/lib/X11/icons中。

  • 将包中default/index.theme拷贝到/usr/X11R6/lib/X11/icons/default中。

  • 将包中default目录中的index.theme改名拷贝成/etc/X11/cursors/Gold.theme。

  • 安装主题

    root@debian:~# cd /etc/alternatives
    root@debian:/etc/alternatives# update-alternatives --install x-cursor-theme x-cursor-theme /etc/X11/cursors/Gold.theme 70
    
  • 由于我系统的x-cursor-theme使用了自动配置方式,而优先级70为最高级别,所以Gold.theme已自动设置为默认配置了,我们可用以命令查询:

    root@debian:/etc/alternatives# update-alternatives --display x-cursor-theme
    x-cursor-theme - status is auto.
     link currently points to /etc/X11/cursors/Gold.theme
    /etc/X11/cursors/core.theme - priority 30
    /etc/X11/cursors/redglass.theme - priority 20
    /etc/X11/cursors/whiteglass.theme - priority 20
    /etc/X11/cursors/handhelds.theme - priority 20
    /usr/share/themes/Industrial/cursor.theme - priority 40
    /etc/X11/cursors/Gold.theme - priority 70
    Current `best' version is /etc/X11/cursors/Gold.theme.
    
  • 这样鼠标主题已生效。你试一下把光标指向桌面的快捷方式上,是不是出现了一个金手指。

安装星际译王

学习开源软件,需查看大量的英文资料,所以翻译软件是必须的一个工具。星际译王是一个由中国人开发的开源翻译软件,支持真人发音。软件主页是http://stardict.sourceforge.net,下面是我在Debian系统中的安装过程。

  • 软件安装

    # apt-get install stardict
    
  • 接着要安装词典,在软件主页上有几种词典可供选择,下载解压后拷贝到/usr/shart/stardict/dic目录下,重启stardict即可。下面以XDICT英汉词典的安装过程为例进行说明。

    # tar -jxvf stardict-xdict-ec-gb-2.4.2.tar.bz2
    # cd stardict-xdict-ec-gb-2.4.2
    # cp * /usr/share/stardict/dic/.
    
  • 星际译王支持真人发音,安装方法是到软件主页上下载真人发音库WyabdcRealPeopleTTS.tar.bz2。然后把它解压到/usr/share目录,重启星际译王即可。如果不能发音,请检查音量设置或检查是否启用了音效服务器(esound),进程名叫esd,如果没有启用音效服务器,星际译王是不会发音的。检查方法可使用gnome-sound-properties命令或通过GNOME桌面的“应用程序”--“桌面首选项”--“音效”路径来如果没有安装,可用以下命令安装:

    debian:#~ apt-get install esound esound-common esound-clients
    

    用以下命令运行:

    debian:#~ esd&
    

    重启星际译王,在首选项中打开音效选项就可以使用到真人发音功能啦。

星际译王还支持在pdf文件中即点即译功能,我在Adobe Reader7.0已测试通过。用Adobe Reader打开pdf文件时,默认是"hand tool"模式,也就是光显示是手型的。这时是不能即点即译的。需设置"select tool"模式,也就是光标是"工"字型时我们就可点选pdf文件中的单词进行即时翻译。

播放rmvb、rm格式文件

rmvb和rm是最常用的视频文件格式,网上的压缩电影多数都是使用这些格式。在Debian中,其实也可说是在Linux中,播放rmvb和rm格式文件的方法有两种。一种是使用最正宗的RealPlayer播放器,另一种是使用xine或Mplayer等播放软件再加上相应的解码器。下面我将分别介绍这两种方法。

RealPlayer

到RealPlayer官方网站http://www.real.com/linux/下载RealPlay10GOLD.bin文件。并把该文件的权限设置为可执行,执行该文件即可安装。

# chmod a+x RealPlayer10GOLD.bin
# ./RealPlayer10GOLD.bin

接着按提示把RealPlayer安装到指定的目录中。在我的系统中用root用户登录系统后启动不了RealPlayer,需用一般用户登录才能用。但一般用户默认是不能使用音频设备的,所以需把一般用户加到audio组里,这样播放rmvb或rm才有声音。

totem

totem是一个使用xine库的多媒体播放器,可播放多种媒体格式的文件,如mp3,avi等。但要播放rmvb格式文件需添加解码器。我使用的是Mplayer的解码器。到http://www.mplayerhq.hu/MPlayer/releases/codecs/下载realplayer解码器rp9codecs-20050115.tar.bz2。用tar -xjvf rp9codecs-20050115.tar.bz2命令解压,把解压出来的rp9codecs-20050115目录下所有文件拷贝到~/.gnome2/totem-addons/就可以了。我现在就是用totem来播放所有的多媒体文件。

播放wmv和asf格式文件

在Linux下使用Mplayer和totem也可以播放Windows平台的wmv和asf文档。只要安装相应的解码包就可以了。如果你使用的提Totem,则可以到http://www.mplayerhq.hu/MPlayer/releases/codecs/下载essential-20060501.tar.bz2解码包。解压后把essential-20060501目录下的所有文件拷贝到~/.gnome2/totem-addons/目录。这样,你的Totem就可以播放wmv和asf文件啦。

浏览.chm格式文件

chm格式的文件是Microsoft HTML Help文档,是Microsoft用来打包帮助文件的。由于Windows平台的优势,chm格式也成为了电子书的主要打包格式。虽然chm格式文档是Windows平台的专用文档格式,在Linux下我们也同样可以浏览。现在已有多种工具可以浏览chm格式文档。包括:xchm、chmsee、gnochm和kchmviewer等。

还有一个工具叫arCHMage,基于pyCHM库开发的解包工具,可以把chm文档解压成多个html文档。

安装GDM

GDM即是GNOME显示管理器(GNOME Display Manager),用来管理你的X会话,提供登录窗口。类似XDM,但比XDM稳定和有趣得多。它的主页位于http://yippi.hypermall.com/gdm/index.shtml

  • 安装GDM主题

    当我们使用GDM显示管理器时,可以选择丰富的主题。GDM主题的目录在/usr/share/gdm/themes中,安装时可通过gdmconfig程序来自动安装。具体安装步骤如下:

    1. 首先到网上下载你喜欢的GDM主题,http://gnome-look.org/有很多,你可随意下载,主题文件类似于21329-gdm-debian-white.tar.gz。下载后存放到任意一个目录中。

    2. 运行gdmsetup程序,打开gdm配置窗口。在"通用"标签栏,确认你在本地启用了"图形欢迎程序"选项。接着,选择"图形安装程序"标签,这里列出了已安装的所有GDM主题,默认已有三个。按右下角的"安装新主题"按钮,会打开文件选择窗口,选择你刚下载的主题文件后按"安装"就可以了。是不是很方便,快到网上下载你喜欢的主题,使你的登录界面与众不同,更有个性。

安装splash主题

splash主题就是在输入用户名称密码登录后,载入gnome时,在屏幕中间显示系统加载进度的图片。该图片放在/usr/share/images/desktop-base/或/usr/share/pixmaps/splash目录下。在Debian中它属可选系统,可用update-alternatives工具来配置,配置的参数是desktop-splash。配置方法如下:

  1. 首先到网上下载splash主题,推荐http://gnome-look.org网站。把下载的图片放到上面介绍的其中一个目录中。

  2. 运行update-alternatives --config desktop-splash命令显示和配置可用的splash主题。在列表中应该包含你刚下载的主题:

    debian:/etc/alternatives# update-alternatives --config desktop-splash
    
    There are 4 alternatives which provide `desktop-splash'.
    
      Selection    Alternative
    -----------------------------------------------
     +    1        /usr/share/images/desktop-base/Splash-debblue.png
          2        /usr/share/images/desktop-base/Splash-Debian.png
    *     3        /usr/share/images/desktop-base/Splash-Debian_red.png
          4        /usr/share/pixmaps/splash/gnome-splash.png
    
    Press enter to keep the default[*], or type selection number: 4
    

    +号代表优先级最高的选项,也即是建议选项,星号表示当前选项。

安装QEMU模拟器

QEMU是一个开源的Pc模拟器,功能和Vmware类似,但Vmware是商业产品。QEMU项目位于以下网址:http://fabrice.bellard.free.fr/qemu/。QEMU现时能支持的操作系统已有很多,包括Windows系列平台和各Unix like平台,具体的情况可到QEMU的项目网站查看。和Vmware相比,暂时来说,模拟的系统的运行速度还不理想,但QEMU的开发社区很活跃,软件更新较快,是很有前途的一个开源模拟器,让我们多些关注它的发展。

我在Debian系统上安装了QEMU,并在QEMU的模拟环境中成功安装了Winme系统。下面是我的安装过程。

  • qemu软件的安装

    debian:~# apt-get install qeum
    
  • 创建名为winme.img的磁盘映像文件,文件大小为1G。

    debian:~# qemu-img create winme.img 1G
    
  • 把winme启动光盘放放光驱,用以下命令在QEMU模拟环境中引导启动光盘。

    debian:~# qemu -hda winme.img -cdrom /dev/cdrom -boot d
    

    -hda参数表示把winme.img磁盘映像文件挂接成IDE接口的第一块硬盘,-boot d表示从光驱启动系统。成功从光盘引导启动后就可按Windows标准的安装程序进行系统安装。

  • 安装成功后,整个Windows me系统就打包成一个winme.img磁盘映像文件,如果要从该映像文件中启动系统,可用以下命令。

    debian:~# qemu -hda winme.img -boot c
    

    -boot c参数表示从硬盘启动系统,也就是从winme.img磁盘映像文件启动系统。

qemu的命令行参数是很灵活的,可用qemu -h查看。我的电脑配置是PII 600 256M内存,用qemu模拟的Windows Me速度较慢,还达不到可正常使用的水平。作为一个开源的模拟器,做到这个程度已很不错了,希望qemu开发组能尽提高模拟器的性能,为开源社区提供一个可行的模拟器解决方案,让我们能彻底放弃vmware这些商业的模拟器。qemu还有一个加速的patch,可使qeum的速度大大提高,但好象在debian的软件包中没有包含该patch,所以还没测试过。

生成Debian软件包依赖关系图

Debian软件包管理系统会自动管理软件的依赖关系,使我们在安装软件时方便了很多,不用理会复杂的软件依赖关系,这也是Debian发行版的一大特色。但了解软件包的依赖关系对你熟悉Linux和进行系统开发是很有好处的,所以Debian也提供了工具帮我们生成软件包的依赖关系图。操作步骤如下,首先,安装相关的工具:

debian:~# apt-get install apt-rdepends springgraph

用以下命令生成软件包的依赖关系图:

debian:~# apt-rdepends -d zope | springgraph > zope.png

这样就生成了zope软件包的依赖关系图zope.png。

使用apt-cache也可以生成文本格式的依赖关系图。

debian:~# apt-cache dotty > debian.dot
debian:~# cat debian.dot
"darksnow" -> "libxext6";
"darksnow" -> "libxfixes3";
"darksnow" -> "libxi6";
"darksnow" -> "libxinerama1";
"darksnow" -> "libxrandr2";
"darksnow" -> "libxrender1";
"darksnow" -> "darkice";
"libpq5" -> "libc6";
"libpq5" -> "libcomerr2";
"libpq5" -> "libkrb53";
"libpq5" -> "libssl0.9.8";
"zeroc-ice-services" -> "icestorm";
"zeroc-ice-services" -> "icegrid";
"zeroc-ice-services" -> "icebox";
"zeroc-ice-services" -> "icepatch2";
"zeroc-ice-services" -> "glacier2";
"zeroc-ice-services" -> "freeze";
"xfonts-kappa20" -> "xfonts-utils";
"xfonts-kappa20" -> "xbase-clients"[color=springgreen];
"liblocale-maketext-lexicon-perl" -> "perl";
"liblocale-maketext-lexicon-perl" -> "liblocale-maketext-perl";
"libdnas-application-0.32.5-0" -> "libc6";
"libdnas-application-0.32.5-0" -> "libdlisp0";
"libdnas-application-0.32.5-0" -> "libdnas-core-0.32.5-0";
"libdnas-application-0.32.5-0" -> "libdshconfig1";
"grip" -> "libart-2.0-2";
...

登录Windows远程终端服务器

Windows提供了一种远程桌面系统,可使用户远程登录进行系统管理或作为终端服务器运行各种应用软件。要连接Windows远程桌面,需在Windows客户端安装相应的软件(tsclient)。如果你是Windows服务器管理员肯定使用过该工具,因为远程桌面能大大方便系统管理员远程维护服务器。在Linux系统中,我们也可通过rdesktop工具连接Windows远程桌面。

debian:~# apt-get install rdesktop

使用方法:

debian:~# rdesktop -f -a 16 192.168.0.2

-f表示全屏显示,-a 16表示使用16 bit色,192.168.0.2是Windows服务器地址。

我们也可在命令行中直接指定用户名和密码,实现快速登录。

debian:~# rdesktop -a 16 -u yangjing -p - t07
Password:在这里输入你的登录密码

-u选项指定用户名,-p选项指定密码,但在命令行中直接给出密码是一种很不安全的操作,所以我们在-p选项后再加多一个横杠,指定在下面的Password指示符后输入密码。用这种方法输入的密码对于shell是不可见的,可以有效防止密码泄漏。

Note

退出远程桌面时要选择“注销”,不要选择“关机"。

在debian下也有一个图形化终端程序叫tsclient。用apt-get install tsclient命令安装即可,配置界面与windows类似。

保存GNOME桌面环境中声卡的音量设置

在我的GNOME桌面环境中使用了ALSA声音系统。装好系统后,终于可在Linux中听我喜欢的爱尔兰风笛了。但美中不足的是每次重启电脑后,音量设置都复位了,需重新调整音量。经研究,原来是我没有把ALSA声音系统的当前设置状态保存到/var/lib/alsa/asound.state中。而每次重启电脑时,ALSA系统的初始化脚本(/etc/init.d/alsa)会用/var/lib/alsa/asound.state这个默认的配置文件来设置ALSA系统的状态。所以就造成用户自已配置的状态失效,每次重启都还原到初始状态。OK,知道原因了,就可对症下药了。有一个工具叫alsactl,它可自动把当前配置信息保存到/var/lib/alsa/asound.state中。alsactl包含在alsa-utils软件包中。用以下命令安装:

debian:~# apt-get install alsa-utils

把音量、音色等调整好后,再用以下命令把当前声卡的状态保存到/var/lib/alsa/asound.state文件中:

debian:~# alsactl store

重启电脑,马上就可聆听到自由的声音了。

屏幕截图

在Linux下有很多屏幕载图的工具,下面简单介绍一下:

  • 在GNOME桌面中自带了一个屏幕截图工具,位于“动作”栏内。该工具功能很少,只能截取当前屏幕。

  • 在GIMP中也可截图,在“文件”--“获取”菜单下有一个“屏幕抓图”选项可进行屏幕截图。它可截取任意图窗口的内容,并自动输入到GIMP中,我们可方便地进行处理和保存。

  • 安装ImageMagick软件,它有一个工具叫import可用于屏幕截图。该工具有很多选项,功能强大。

  • Ksnapshot是KDE桌面环境的载屏工具。

  • scrot是一个专门的截屏工具,功能也很多,可随意截取鼠标选取区域的内容。

访问WebDAV服务

WebDAV的全称是“Web-base Distributed Authoring and Versioning”。它是HTTP协议的扩展,允许我们在远程管理和编辑Web服务器上的文件。现在很多Web服务器都支持WebDAV,包括最有名的Apache和Zope。要访问WebDAV服务,需要安装客户端,这里介绍的一个工具叫Cadaver,它是一个字符界面的工具,类似于FTP。支持文件的上传、下载和在线编辑等功能。它是一个自由软件,在GNU GPL协议下发布。

安装方法很简单,使用apt-get install cadaver即可完成。下面介绍一下主要的用法:

  • 连接远程Web服务器

    debian:~# cadaver www.ringkee.com
    Authentication required for Zope on server `www.ringkee.com':
    Username: username
    Password: pasword
    dav:/>
    
  • 输入用户名和密码即可登录入服务器,使用类似ftp的命令就可以操作服务器上的文件,使用h命令可列出所有的命令。

    dav:/> h
    Available commands:
     ls         cd         pwd        put        get        mget       mput
     edit       less       mkcol      cat        delete     rmcol      copy
     move       lock       unlock     discover   steal      showlocks  version
     checkin    checkout   uncheckout history    label      propnames  chexec
     propget    propdel    propset    search     set        open       close
     echo       quit       unset      lcd        lls        lpwd       logout
     help       describe   about
    Aliases: rm=delete, mkdir=mkcol, mv=move, cp=copy, more=less, quit=exit=bye
    dav:/>
    

    常用的命令有ls--列出文件,put--上传文件,get--下载文件,cat--显示文件内容,edit--在线编辑文件,quit--退出。

安装OpenOffice

Linux下的办公套件首选OpenOffice,功能极为强大,完全能满足正常办公的需求。安装命令如下:

debian~:# apt-get install openoffice.org openoffice.org-l10n-zh-cn openoffice.org-help-zh-cn

OpenOffice软件包有70多兆,下载的时间较长,请耐心等待。

用gaim登录google talk

Gaim是一个跨平台的IM客户端,支持多种IM协议,如AIM、MSN和Jabber等。Google talk是Google推出的IM服务,它采用了开放的XMPP协议。下面介绍如何在Gaim中登Google talk。

登录Google talk需要有Gmail帐号,在登录前请先准备好。在Debian中安装Gaim软件很简单,Debian已有一个gaim软件包,真接apt-get install gaim即可。

安装完成后就可运行gaim了。点击“帐户”--“添加”按钮添加一个新帐户。依次填入以下信息:

协议:Jabber
用户名:jims.yang       #不含Gmail.com后缀的Gmail帐户名
服务器:gmail.com       
资源:Gaim              #默认值       
密码:xxxx              
别名:Jims              #别名,可选填写

接着点击“显示全部选项”,配置Jabber选项:

选中“若可用则使用TLS”和“允许在不加密流上的纯文本验证”两个选项
端口:5222
连接服务器:talk.google.com
代理类型:无代理

点击“保存”,完成帐户设置。点击在线即可连接google talk。

安装Freemind

Freemind是一种名为Mind Mapping(思维导图)的软件,可帮助我们整理头脑中的放射性思维。在Debian中的freemind是0.7.1版的,已比较旧了,少了很多功能。所以我们不安装该版本。我们直接到freemind官方网站上去下载最新的Debian软件包。freemind的官方网址是:http://freemind.sourceforge.net/

我的安装过程如下:

  • 下载freemind_0.8.0-1_all.deb和libforms-java_1.0.5-2_all.deb这两个软件包。Freemind是用Java写的,在安装freemind之前需用Debian方式安装配置好jre(Java Runtime Environment),版本要求1.4或以上的版本。有关Java的安装方法可参考本笔记中的“配置Java环境”一节的内容。

  • 用以下命令开始安装:

    debian:~/inst# dpkg -i freemind_0.8.0-1_all.deb 
    选中了曾被取消选择的软件包 freemind。
    (正在读取数据库 ... 系统当前总共安装有 58065 个文件和目录。)
    正在解压缩 freemind (从 freemind_0.8.0-1_all.deb) ...
    dpkg:依赖关系问题使得 freemind 的配置工作不能继续:
     freemind 依赖于 librelaxng-datatype-java;然而:
      软件包 librelaxng-datatype-java还没有被安装。
     freemind 依赖于 libjaxp1.2-java;然而:
      软件包 libjaxp1.2-java还没有被安装。
     freemind 依赖于 libcommons-lang-java;然而:
      软件包 libcommons-lang-java还没有被安装。
     freemind 依赖于 libforms-java;然而:
      软件包 libforms-java还没有被安装。
    dpkg:处理 freemind (--install)时出错:
     依赖关系问题 - 仍未被配置
    在处理时有错误发生:
     freemind
    
  • 上面提示有包依赖问题,我们可用以下命令自动安装依赖包:

    debian:~/inst# apt-get -f install
    正在读取软件包列表... 完成
    正在分析软件包的依赖关系树... 完成
    正在更正依赖关系... 完成
    将会安装下列的额外的软件包:
      libcommons-lang-java libjaxp1.2-java librelaxng-datatype-java
    下列软件包将被【卸载】:
      freemind
    下列【新】软件包将被安装:
      libcommons-lang-java libjaxp1.2-java librelaxng-datatype-java
    共升级了 0 个软件包,新安装了 3 个软件包,要卸载 1 个软件包,有 30 个软件未被升级。
    有 1 个软件包没有被完全安装或卸载。
    需要下载 260kB 的软件包。
    解压缩后将会空出 2863kB 的空间。
    您希望继续执行吗?[Y/n]
    
  • 接着安装下载的libforms-java_1.0.5-2_all.deb软件包。

    debian:~/inst# dpkg -i libforms-java_1.0.5-2_all.deb 
    
  • 最后安装freemind_0.8.0-1_all.deb软件包。

    debian:~/inst# dpkg -i freemind_0.8.0-1_all.deb 
    (正在读取数据库 ... 系统当前总共安装有 58143 个文件和目录。)
    正预备替换 freemind 0.8.0-1 (使用 freemind_0.8.0-1_all.deb) ...
    正在解压缩将用于更替的包文件 freemind ...
    正在设置 freemind (0.8.0-1) ...
    

用freemind命令即可进入程序,程序菜单已全部汉化,使用起来很方便。freemind创建的文件格式是以.mm为后缀的。它可导出多种文件格式,如XHTML、PNG和OpenOffice文档等。如果你想把你做的.mm文件放到网站使其他人访问,你可以处用freemind-browser软件包。该软件包在http://sourceforge.net/projects/freemind/下载。解开后有两个文件,分别是freemindbrowser.html和freemindbrowser.jar。把它们和要显示的freemind文件拷贝到Web服务器上,最后修改freemindbrowser.html文件,如:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<!-- This launcher works fine with Explorer (with Javascript or without) as
     well as with Mozilla on Windows -->
<head>
  <title>2006年工作计划</title>            #改这里
  <!--   ^ Put the name of your mind map here -->
</head>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
  <APPLET CODE="freemind.main.FreeMindApplet.class"
          ARCHIVE="freemindbrowser.jar" WIDTH="100%" HEIGHT="100%">
  <PARAM NAME="type" VALUE="application/x-java-applet;version=1.4">
  <PARAM NAME="scriptable" VALUE="false">
  <PARAM NAME="modes" VALUE="freemind.modes.browsemode.BrowseMode">
  <PARAM NAME="browsemode_initial_map"
         VALUE="http://localhost/freemind/2006.mm">    #改这里,指向你要显示的freemind文件名
  <!--          ^ Put the path to your map here  -->
<param NAME="initial_mode" VALUE="Browse">
<param NAME="selection_method" VALUE="selection_method_direct">
</applet>
</body>
</html>

在浏览器上打上http://localhost/freemiad/freemindbrowser.html即可访问你的2006.mm文件了。通过这种方式访问freemind文件,你可在浏览器中通过点击来打开和关闭层次。你也可把导出的HTML文档全部拷贝到Web服务器上,在浏览器上直接访问。

freemind通过Plugin扩展freemind的功能。下面分别介绍:

  • 安装freemind-plugins-svg_0.8.0+01-4_all.deb包

    debian:~/inst# dpkg -i freemind-plugins-svg_0.8.0+01-4_all.deb 
    选中了曾被取消选择的软件包 freemind-plugins-svg。
    (正在读取数据库 ... 系统当前总共安装有 67956 个文件和目录。)
    正在解压缩 freemind-plugins-svg (从 freemind-plugins-svg_0.8.0+01-4_all.deb) ...
    dpkg:依赖关系问题使得 freemind-plugins-svg 的配置工作不能继续:
     freemind-plugins-svg 依赖于 libbatik-java (>= 1.6);然而:
      软件包 libbatik-java还没有被安装。
     freemind-plugins-svg 依赖于 rhino;然而:
      软件包 rhino还没有被安装。
    dpkg:处理 freemind-plugins-svg (--install)时出错:
     依赖关系问题 - 仍未被配置
    在处理时有错误发生:
     freemind-plugins-svg
    debian:~/inst# apt-get install libbatik-java rhino
    正在读取软件包列表... 完成
    正在分析软件包的依赖关系树... 完成
    您可能需要运行“apt-get -f install”来纠正下列错误:
    下列的软件包有不能满足的依赖关系:
      libbatik-java: 依赖: libbsf-java 但是它将不会被安装
                     依赖: libavalon-framework-java (>= 4.2.0-1) 但是它将不会被安装
                     依赖: libcommons-io-java 但是它将不会被安装
                     依赖: libcommons-logging-java 但是它将不会被安装
    E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt-get -f install”(也可以指定一个解决办法)。
    debian:~/inst# apt-get -f install
    正在读取软件包列表... 完成
    正在分析软件包的依赖关系树... 完成
    正在更正依赖关系... 完成
    将会安装下列的额外的软件包:
      libavalon-framework-java libbatik-java libbsf-java libcommons-io-java
      libcommons-logging-java rhino
    建议安装的软件包:
      libavalon-framework-java-doc jython liblog4j1.2-java liblogkit-java
      rhino-doc
    下列【新】软件包将被安装:
      libavalon-framework-java libbatik-java libbsf-java libcommons-io-java
      libcommons-logging-java rhino
    共升级了 0 个软件包,新安装了 6 个软件包,要卸载 0 个软件包,有 5 个软件未被升级。
    有 1 个软件包没有被完全安装或卸载。
    需要下载 5798kB 的软件包。
    解压缩后会消耗掉 9257kB 的额外空间。
    您希望继续执行吗?[Y/n]
    获取:1 http://ftp.us.debian.org unstable/main libbsf-java 1:2.3.0+cvs20050308-5  [195kB]
    获取:2 http://ftp.us.debian.org unstable/main libavalon-framework-java 4.2.0-1 [72.3kB]
    获取:3 http://ftp.us.debian.org unstable/main libcommons-io-java 1.0-2 [43.5kB]
    获取:4 http://ftp.us.debian.org unstable/main libcommons-logging-java 1.0.4-3 [126kB]
    获取:5 http://ftp.us.debian.org unstable/contrib libbatik-java 1.6-2 [4841kB] 
    获取:6 http://ftp.us.debian.org unstable/main rhino 1.5.R5-4 [520kB]          
    下载 5798kB,耗时 26s (217kB/s)                                                
    选中了曾被取消选择的软件包 libbsf-java。
    (正在读取数据库 ... 系统当前总共安装有 67962 个文件和目录。)
    正在解压缩 libbsf-java (从 .../libbsf-java_1%3a2.3.0+cvs20050308-5_all.deb) 
    ...选中了曾被取消选择的软件包 libavalon-framework-java。
    正在解压缩 libavalon-framework-java (从 .../libavalon-framework-java_4.2.0-1_all.deb) 
    ...选中了曾被取消选择的软件包 libcommons-io-java。
    正在解压缩 libcommons-io-java (从 .../libcommons-io-java_1.0-2_all.deb) 
    ...选中了曾被取消选择的软件包 libcommons-logging-java。
    正在解压缩 libcommons-logging-java (从 .../libcommons-logging-java_1.0.4-3_all.deb) ...
    选中了曾被取消选择的软件包 libbatik-java。
    正在解压缩 libbatik-java (从 .../libbatik-java_1.6-2_all.deb) ...
    选中了曾被取消选择的软件包 rhino。
    正在解压缩 rhino (从 .../rhino_1.5.R5-4_all.deb) ...
    正在设置 libbsf-java (2.3.0+cvs20050308-5) ...
    
    正在设置 libavalon-framework-java (4.2.0-1) ...
    正在设置 libcommons-io-java (1.0-2) ...
    正在设置 libcommons-logging-java (1.0.4-3) ...
    
    正在设置 libbatik-java (1.6-2) ...
    正在设置 rhino (1.5.R5-4) ...
    
    正在设置 freemind-plugins-svg (0.8.0+01-4) ...
    debian:~/inst# 
    

安装Emacs

Emacs无疑是编辑器的王者,历史悠久,功能强大,我这篇笔记就是使用emacs加psgml-mode完成的。现在Emacs对中文的支持已很好了,完全可以用于中文的生产环境。本章主要介绍Emacs在Debian下的安装和配置过程。具体的使用可参考我的Emacs学习笔记。

  • 安装软件包:

    debian:~# apt-get install emacs21 mule-ucs
    

    mule-ucs是emacs的编码包,现在已支持UTF-8编码和多种中文编码。如果要在emacs中正确处理中文信息就要安装该软件包。

  • 安装完成后,用emacs启动编辑器,默认启动的是X环境的emacs,如果不想进入X环境的emacs,则用emacs -nw启动即可。如果你不想用X环境的emacs,可以直接安装不包含X环境的软件包emacs21-nox。

  • 全局的配置文件位于/etc/emacs/site-start.d目录下,该目录有多个文件,当emacs启动时会读取每个文件的配置信息,文件的命名格式与/etc/rc*.d目录的文件类似,作用也类似。如40mule-ucs.el就是启用多国语言编码的配置文件,它的载入顺序是40。

  • 本地配置文件在用户主目录下,叫.emacs。默认没有创建,你可手动自已创建。

利用KIO实现网络透明访问

通过KIO-enable的应用软件,如Konqueror。我们能象本地文件一样访问和操作网络上的文件。KIO支持多种网络协议的透明访问,如ftp,smb,ldap,ssh,nfs,webdav等。这些由KIO支持的协议叫kioslaves。

  • 通过ssh协议访问

    fish://hostname or fish://username@hostname or fish://username:password@hostname

  • 通过smb协议访问

    smb://hostname or smb://username@hostname or smb://username:password@hostname

  • 通过webdav协议访问

    webdav://www.ringkee.com/

KDE下的打开文件对话框也是KIO-enable的,我们可在该对话框里用fish://等的格式打开远程主机上的文件。这里有个完整的kioslaves列表。http://docs.kde.org/stable/en_GB/kdebase/kioslave/index.html

在Linux下安装IE

在Linux上已经有了FireFox这么好的浏览器,为什么我们还需要IE呢。对一般用户来说可能不需要,但对Web开发人员来说就不同啦。为了获得最好的用户体验,Web应用程序应该能适应多种主流的浏览器。这使得他们在开发程序时需在不同的浏览器上进行测试。在Linux平台下,利用Wine软件我们已可完美地运行IE浏览器。这使得Web开发人员不需在Linux和Windows平台间来回切换。

IEs4Linux是一个快速安装IE的脚本,我们可到http://www.tatanka.com.br/ies4linux/index-en.html下载。在运行该脚本前,请确认系统已安装Winecabextract。安装过程如下:

localhost:~/inst/ies4linux-2.0beta8# ./ies4linux
Wine exited with a successful status
You are root! This is very discouraged! IE is too insecure for you to give him root access.
Want a tip from a friend? Run me as your normal user or, what's better, if you can, create a separate user ju
st do handle your IEs.              #警告信息:因为IE不安全,以root用户运行会有安全隐患

Welcome, root! I'm IEs4Linux.
I can install IE 6, 5.5 and 5.0 for you easily and quickly.
You are just four 'enter's away from your IEs.

I'll ask you some questions now. Just answer y or n (default answer is the bold one)

IE 6 will be installed automatically.
Do you want to install IE 5.5 SP2 too? [ y | n ] n          #选择n,不安装IE 5.5 SP2

And do you want to install IE 5.01 SP2? [ y | n ] n         #选择n,不安装IE 5.01 SP2

IEs can be installed using one of the following locales:
EN-US PT-BR DE FR ES IT PT HU RU NL SV
JA KO NO DA CN TW FI PL AR HE CS EL TR
Default is EN-US. Hit enter to keep it or choose a different one:
CN     #输入CN

By default, I will install everything at /root/.ies4linux
I will also install Flash 8 plugin and create Desktop shortcuts.
Is that ok for you? (To configure advanced options type n) [ y | n ]     #选择默认的安装目录就可以啦

All right! Let's start the installations...

Downloading everything we need       #脚本自动到网上下载安装IE所需的文件
 DCOM98.EXE
 mfc40.cab
 249973USA8.exe
 ADVAUTH.CAB
 CRLUPD.CAB
 HHUPD.CAB
 IEDOM.CAB
 IE_S1.CAB
 IE_S2.CAB
 IE_S5.CAB
 IE_S4.CAB
 IE_S3.CAB
 IE_S6.CAB
 SCR56EN.CAB
 SETUPW95.CAB
 FONTCORE.CAB
 FONTSUP.CAB
 VGX.CAB
 swflash.cab
[ OK ]

Installing IE 6                     #开始安装
 Initializing
 Creating Wine Prefix
 Extracting CAB files
 Processing inf file
Wine exited with a successful status
 Installing IE 6
 Installing TTF Fonts
 Installing RICHED20
Wine exited with a successful status
 Installing ActiveX MFC40
Wine exited with a successful status
 Installing DCOM98
Wine exited with a successful status
 Installing registry
 Finalizing
[ OK ]

Installing Flash Player 8
 Extracting files
 Installing flash on ie6
Wine exited with a successful status
[ OK ]

IEs 4 Linux installations finished!  #安装成功,自动运行IE

安装Mutt

Mutt是一个功能强大的邮件客户端软件,它使用Linux传统的字符界面。

安装:

debian:#~ apt-get install mutt

全局配置文件是/etc/Muttrc,每用户配置文件是~/.muttrc。

在命令行状态直接打mutt即可进入mutt,一些常用键说明:

  • ?,显示帮助信息。

  • c,切换邮箱文件,可以是mbox,Maildir。

  • d,作删除标记。

  • v,查看附件。

  • q,退出。

  • 左右键,查看上/下一封邮件。

  • 空格键,翻页。

常用配置说明:

  • set spoolfile="/var/mail/mail"

    指定spool mailbox文件位置,如果你的spool mailbox不是在默认位置(/var/spool/username)就需配置该项。

  • 如果Mutt在配置编译选项时使用了--enable-pop标识,则可使用Mutt通过POP协议收信,配置方法是把以下设置加入你的.muttrc文档,进入mutt后按G即可连接POP服务器收取信件。

    set pop_host="pop.21cn.com"
    set pop_user="username"
    set pop_pass="password"
    

邮件的附件都是MIME(Multi-Purpose Internet Mail Extension)格式的,在Mutt中可以直接打开,控制使用什么程序打开附件的设置位于mailcap文件中。全局配置位于/etc/mailcap中,用户配置位于~/.mailcap中。

Mutt项目网站上有详细的配置和使用说明,这里就不一一介绍啦,请到Mutt项目网址:http://www.mutt.org查看。

利用GnuPG加密文件

gpg是pgp加密软件的免费版本,由Gnu工程开发,不存在任何专利或许可问题。它符合RFC2440号文档所定义的OpenPGP标准。gpg在加密文件时使用的是公共密钥加密方法。下面介绍使用gpg的步骤:

创建gpg密钥,过程如下:

debian:~# gpg --gen-key
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

请选择您要使用的密钥种类:
   (1) DSA 和 ElGamal (默认)
   (2) DSA (仅用于签名)
   (5) RSA (仅用于签名)
您的选择? 1                             #选择密钥种类
DSA 密钥对会有 1024 位。
ELG-E 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)           #选择密钥长度
您所要求的密钥尺寸是 2048 位
请设定这把密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)                    #选择密钥有效期
密钥永远不会过期
以上正确吗?(y/n)y                       #确认以上选择

您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合
成用户标识,如下所示:
    “Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>”

真实姓名:jims.yang                      #输入用户标识,包括真实姓名,邮件地址和注释
电子邮件地址:jims.yang@gmail.com
注释:jims.yang's GnuPG key
您选定了这个用户标识:
    “jims.yang (jims.yang's GnuPG key) <jims.yang@gmail.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?o       #确认以上输入
您需要一个密码来保护您的私钥。           #输入口令短语

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
.++++++++++++++++++++++++++++++.+++++++++++++++.+++++.++++++++++.+++++++++++++++..++++++++++..+++++++++++++++++++++++++..++++++++++++++++++++.+++++.>+++++.............+++++
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
+++++.+++++.++++++++++....+++++...+++++..+++++++++++++++.++++++++++++++++++++..++++++++++.++++++++++.+++++.+++++++++++++++++++++++++++++++++++....++++++++++.+++++++++++++++....>+++++.+++++^^^
gpg: 密钥 4688E183 被标记为绝对信任
公钥和私钥已经生成并经签名。

gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性:  1 已签名:  0 信任度:0-,0q,0n,0m,0f,1u
pub   1024D/4688E183 2006-10-31
密钥指纹 = 7C15 5515 0E08 9ACB 37C1  0C6F 67BE 56AB 4688 E183
uid                  jims.yang (jims.yang's GnuPG key) <jims.yang@gmail.com>
sub   2048g/53BF4033 2006-10-31
debian:~#

完成密钥创建后,生成一对密钥,一个是私用密钥,一个是公共密钥。私用密钥要保存好,不能泄漏给任何人,私钥已被你输入的口令短语加密。公钥需分发给其他人,用来加密将要发送给你的文件。你收到加密文件后,就可用你的私钥进行解密。公钥可用以下命令提取出来:

debian:~# gpg --armor --export > jims.key
debian:~# cat jims.key
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)

mQGiBEVGv0URBACC7hr4AYAgHwFcBpfnQr2taKtfm2Pklcf7GBBnwjFycvValgiK
yu7GdVNuvf+Nyv1z/gmOHJCuYmeIOkKrNqBc/8sAYqvoztDUTeP+UhGqELNzQouV
a1er9HSzabsRzSYmtqW7ZdXV05MRGFfM8KJDP2PbXL00tgaMbLSkrPUQcwCgpcLJ
9Hv6cirDDh1xAtvW7oVuVTsD/1KyRnsv1V+vMU9x9+U/zA4Ai3ZmEqAGwTQuLFUg
q8+ex9sWmOHOG/VO7O4MdgH1Go+KzaU60gkCV3md23LGSBKc1kBPmFkb5pNrQM5M
SCtbBvRb54pTbajdxaPpzydnagOlBtSbjQ4eJEAioFq1mzUlStZjAJfN0UuMLvz4
JWffA/9ZIQ1pb7AYelZi+soOHDnAtZnsg7rN9FfzYTSg+XrtulC0jurVcUppQgd6
R+jq89A7IWfeK0QcQ4QuBe3uQ4ZgxBLY6qo13qac7V3xM3LmknhTI49x3DdjpHgf
nGYigS3w0frXtOh/qupwsojiX3H9V+uLk1vit/UvACweAksl6rQ3amltcy55YW5n
IChqaW1zLnlhbmcncyBHbnVQRyBrZXkpIDxqaW1zLnlhbmdAZ21haWwuY29tPohg
BBMRAgAgBQJFRr9FAhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQZ75Wq0aI
4YNnJgCgjxl6WEm11HoVbJhpnbTQ/4YN79YAn3KwBzZLMTWfpQbzghMXGZsWrO/6
uQINBEVGv0wQCAC5rug6OD73TiNJN0o5FepUbl0Cp/5IIbnOcFQQNEP/r/ShjByv
ZP8zU3ZgxHQe5n7kqOZy9SMnZ8A75XYDRqhyBjHWnXRqXGgqBnvj43TfzUt7c45I
C3mZT6K6l4mS1RkO6Khps//PrrLFQjMCkYL4ih5/yJkV70Co9t52wuBMfyjvAWyh
WdxJ4YAaWs34vn9etfTaSfSvDveMoh3skfUzy0ftxf7vzJGvrosWaYTn5EDyVx5k
hXNAXNwuewKULn4tFZVWcDjDQ8Bqg4ai8X4Raw5inuC4JI4Au7dwIWI24vJxWRH6
mXs+E0EccrWUcHw2VsD2m9KC/3G3n7OD2HSXAAMFB/42hMTFY9iXs4U14kP5ac7x
NgdkK8ZRPQi5BOzqZ5f9MeeHV1g7rlhOIMmbYFNn5aGfc6DR1p3moLTbME238Mbp
GAejMNLN4NSLgPOCJykwDNrYA0vLnZlB9uswKBETdEWIX1GdguWBkVY0GbPLs0JO
bcym0i2Ro3TfC9oAUSsXrul+NyXGpRsQ3qFpOXINEITb0aMwdKPYrt5jQqYQCrcP
Nwi4zaEh9Y56X9mUhHvMl4hehmP8OEHCf6JDP6uzMxjY9LHWs0j0NhHGQqClJQbx
SJYuEmCZ7ITEfM5dGbYc6Xh+XQkggsGpjWXEmaYiQcrx2eVJk+uGYu4+zEYO70RX
iEkEGBECAAkFAkVGv0wCGwwACgkQZ75Wq0aI4YPflQCfQgzT29btw7b5TAK6kG5Z
isr1oeAAn0JgNmaJf5AwEwhixIiUVxZYHnfe
=Uff0
-----END PGP PUBLIC KEY BLOCK-----
debian:~#

--armor开关表示以ASCII格式输出内容。生成的jims.key文件的内容就是我的公钥,我们可以通过电子邮件把公钥分发出去。当我们收到很多人的公钥时,为了使用和保管方便,gpg提供一个文件专门存放公钥。这个文件叫pubring.gpg,位于~/.gnupg目录下。用以下命令可把公钥导入该文件。

debian:~# gpg --import test.key

重复以上命令可以添加多个公钥,要查看pubring.gpg文件中保存了多少个公钥,可用以下命令:

debian:~# gpg -kv
/root/.gnupg/pubring.gpg
------------------------
pub   1024D/4688E183 2006-10-31
uid                  jims.yang (jims.yang's GnuPG key) <jims.yang@gmail.com>
sub   2048g/53BF4033 2006-10-31

下面测试使用公钥来加密一个文件。

debian:~# gpg -ea -r 4688E183 a.py

-e开关表示加密,-a开关(--armor)表示使用ASCII格式加密,-r开关指定加密公钥。运行该命令后,在当前目录下会生成一个a.py.asc文件,该文件就是经过加密的文件。使用-a开头生成的加密文件比源文件大了不少,我们也可不用-a开头,生成的加密文件后缀会变为.gpg,文件大小与源文件相差不大。那我们什么时候应该使用-a开关,什么时候不应该使用呢?当我们通过电子邮件附件的形式发送加密文件,由于不同邮件服务器或邮件客户端对附件的处理会有不同,所以我们在这种情况下应该使用-a开关,把加密文件存成ASCII格式。如果加密文件是通过HTTP、scp或ftp等协议进行传输,则不用使用-a开关,以节省磁盘空间。总而言之,只要用来传送加密文件的传输机制有能力处理二进制文件,就不需要加-a加关。

当我们收到使用公钥加密的文件时,就可以使用我们私钥进行解密。

debian:~# gpg -o a.py -d a.py.asc

您需要输入密码,才能解开这个用户的私钥:“jims.yang (jims.yang's GnuPG key) <jims.yang@gmail.com>”
2048 位的 ELG-E 密钥,钥匙号 53BF4033,建立于 2006-10-31 (主钥匙号 4688E183)

gpg: 由 2048 位的 ELG-E 密钥加密,钥匙号为 53BF4033、生成于 2006-10-31
      “jims.yang (jims.yang's GnuPG key) <jims.yang@gmail.com>”

-o选项表示输出的文件名,-d选项表示进行解密操作。

利用OpenSSL加密文件

OpenSSL作为Apache和SSH的加密组件已为大家所熟知,OpenSSL软件包并非只有libcrypto或libssl这样的动\\ 态链接库,还有一个命令行程序叫openssl,利用openssl程序我们可以用多种加密算法对文件进行加密操作,如:

debian:~# openssl enc -bf -e -a -in a.py -out a.bf
enter bf-cbc encryption password:
Verifying - enter bf-cbc encryption password:
生成一个a.bf加密文件,内容如下:
2FsdGVkX1/V1j1vzqspuhvxKPvHfb8uXgP6dlT+yrwQz0tJ9eT2f0aTTD0dUJWb
ZSY4jtoqdzmO3U0KFLOMHj+Wac+QW49bts9vQ8dAZi6JPzPvCiJNbNUKWZy33Z1X
khs473aE3dgSZbxCT/0VpQ==

enc -bf选项表示使用blowfish算法;-e选项表示加密;-a选项表示使用ASCII格式进行编码。-in选项指定要\ 加密的文件,-out选项指定加密后生成的文件名。解密的语法与加密类似:

debian:~# openssl enc -bf -d -a -in a.bf -out a.bf.txt
enter bf-cbc decryption password:

解密的选项与加密差不多,-d表示解密,其它选项的作用与加密时一样。

利用pdftk处理pdf文档

pdftk是一个pdf hack工具软件,可对pdf文档进行分页、合并、加密等处理。官方网站是:http://www.accesspdf.com/index.php。这个网站还有其它处理pdf文档的工具和库,有兴趣的朋友可以去看看。在Debian中已包含有pdftk包,直接用apt-get install pdftk命令安装即可。

安装完成后我们就可以使用pdftk工具了,命令名有软件包名一样也叫pdftk,它的手册页有该命令的详细介绍,下面我只列举几个示例,具体内容请大家参考pdftk的手册页。

  • 把几个pdf文档合并成一个新的pdf文档。

    debian:~/inst# pdftk short.pdf HowTo.Base64.pdf cat output new.pdf
    

    new.pdf这个新文档包含short.pdf和HowTo.Base64.pdf两个pdf文档的内容。在合并文档时,我们还可使用通配符和句柄选项。下面是使用通配符的示例:

    debian:~/inst# pdftk *.pdf cat output new.pdf
    

    上面命令的作用是我们可把当前目录下所有的pdf文档合并成一个new.pdf文档。下面是使用句柄选项的示例:

    debian:~/inst# pdftk A=short.pdf B=HowTo.Base64.pdf cat A B output new.pdf
    

    A和B就是句柄选项,一定要使用大写字母。cat后跟着的A和B可省略,变为:

    debian:~/inst# pdftk A=short.pdf B=HowTo.Base64.pdf cat output new.pdf
    
  • 随意删除或旋转页面。下面是一个把指定页码的页面移出pdf文档的示例。

    debian:~/inst# pdftk new.pdf cat 1-96 98-end output new1.pdf
    

    新生成的new1.pdf文档不包含页码为97的页面。cat选项后跟的参数用以指定页码范围和页面方向的限定条件。1-96表示从1到96页,98-end表示从98页至文档末尾。所以输出的新pdf文档不包含页码为97的页面。除了示例中的具体数值,还可使用一些限定字符。odd和even表示奇偶页码。N, S, E, W, L, R, D表示文档版面的旋转角度(N: 0, E: 90, S: 180, W: 270, L: -90, R: +90, D: +180)。如:1-6odd表示1,3,5;1-6even表示2,4,6;1-endE表示整篇文档所有页面都旋转90度。

  • 合并两个pdf文档,其中有一个是加密的,在合并时要使用句柄选项来指定密码。下面是一个示例,shortsec.pdf是一个加密过的pdf文档,在合并时如果没有指定密码,则会出错:

    debian:~/inst# pdftk A=shortsec.pdf B=HowTo.Base64.pdf cat output new1.pdf
    Error: Failed to open PDF file:
       shortsec.pdf
       OWNER PASSWORD REQUIRED, but not given (or incorrect)
    Errors encountered.  No output created.
    Done.  Input errors, so no output created.
    

    下面通过句柄选项指定密码则可以正常合并。

    debian:~/inst# pdftk A=shortsec.pdf B=HowTo.Base64.pdf input_pw A=123 cat output new1.pdf
    
  • 加密pdf文件,默认使用128-bit强度加密。

    debian:~/inst# pdftk short.pdf output shortsec.pdf user_pw 123
    

    上面的命令会生成一个加密的pdf文件shortsec.pdf,加密密码是123。打开该文档时会提示输入密码,否则不能访问该文档。pdf文档的密码通过user_pw选项指定。

  • 解密pdf文件。

    debian:~/inst# pdftk shortsec.pdf input_pw 123 output shortunsec.pdf
    

    shortunsec.pdf就是解密后的文档,打开该文档不会再提示要输入密码。

安装AntiVir杀毒软件

AntiVir是德国著名的安全软件公司H+BEDV开发的杀毒软件,对于个人用户可以免费使用。到AntiVir的官方网站http://www.free-av.de/即可免费下载。把下载的软件包解开后就可以安装,安装方法是在程序目录执行install脚本即可。

AntiVir程序会安装在/usr/lib/AntiVir目录,配置文件会安装在/etc/目录。antivir是主要的命令行程序,使用antivir -h可以查看详细的用法。下面介绍几种常用的操作。

手动更新病毒库

debian:/usr/lib/AntiVir# ./antivir --update
AntiVir / Linux Version 2.1.10-37
Copyright (c) 2007 by Avira GmbH.
All rights reserved.

checking for updates

on disk       |  upd server
--------------+--------------
02.01.10.37   =  02.01.10.37  [antivir]
06.35.00.01   =  06.35.00.01  [antivir0.vdf]
06.37.01.151  =  06.37.01.151 [antivir1.vdf]
06.38.01.100  =  06.38.01.100 [antivir2.vdf]
06.38.01.116  <  06.38.01.117 [antivir3.vdf]
--------------+--------------
antivir3.vdf 100% |********************************************************|   48 KB   24.32 KB/s   0:00 ETA

on disk       |  upd server
--------------+--------------
06.38.01.117  =  06.38.01.117 [antivir3.vdf]
--------------+--------------

06.38.01.116 --> 06.38.01.117 the VDF database (inc)  (/usr/lib/AntiVir/antivir3.vdf)

AntiVir successfully updated itself

avupdater是自动更新病毒库的脚本,在安装软件时已自动安装在/etc/init.d目录,在系统启动后,它会在后台自动运行。我们可通过configantivir脚本配置avupdater的行为。

杀毒

debian:/usr/lib/AntiVir# ./antivir /root/ --allfiles -s
AntiVir / Linux Version 2.1.10-37
Copyright (c) 2007 by Avira GmbH.
All rights reserved.

VDF version: 6.38.1.117 created 09  5月 2007

For private, non-commercial use only.
auto excluding /sys/ from scans (is a special fs)
auto excluding /proc from scans (is a special fs)
auto excluding /root/data from scans (is a network share)
auto excluding /root/books from scans (is a network share)
checking drive/path (list): /root/
- /root/.mozilla/firefox/za0e1drl.default/ScrapBook/data/20061219115051/4.jpg

--allfiles选项表示所有文件,-s选项表示递归地搜索所有目录。

处理rar格式压缩文档

rar是流行的压缩文档格式,在Linux下也有对应的解压工具。这里介绍两种,一种是图形界面的ark或file-roller,一种是字符界面的rar程序。ark是KDE平台上的应用程序,file-roller是GNOME平台上的应用程序。ark和file-roller默认是不能解压rar格式的压缩文件的,只有在系统中安装了字符界面的rar程序后才能使用这两种GUI工具来解压rar格式的压缩文件。

ark有Debian包,直接用apt-get install ark命令安装即可。在KDE桌面环境中,点击rar文档就会自动调用ark来打开,很方便的。file-roller的安装方法也一样,用apt-get install file-roller安装即可。

字符界面的rar程序我们可到http://www.rarsoft.com/download.htm下载。下载后用以下命令解压:

debian:~/inst# tar -zxvf rarlinux-3.7.0.tar.gz
rar/
rar/file_id.diz
rar/license.txt
rar/Makefile
rar/order.htm
rar/rarfiles.lst
rar/rar.txt
rar/readme.txt
rar/technote.txt
rar/whatsnew.txt
rar/rar
rar/rar_static
rar/unrar
rar/default.sfx
debian:~/inst#                                

接着运行make命令把程序安装在用户的程序目录。

debian:~/inst/rar# make
mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
cp rar unrar /usr/local/bin
cp rarfiles.lst /etc
cp default.sfx /usr/local/lib
debian:~/inst/rar#                                

直接输入rar命令会输出命令的帮助。如把rar文档解压到当前目录的命令如下:

debian:~/inst# rar e 19_84.rar

RAR 3.70   Copyright (c) 1993-2007 Alexander Roshal   22 May 2007
Shareware version         Type RAR -? for help


Extracting from 19_84.rar

Extracting  NASM中文手册.pdf                                      OK
All OK

使用tar备份文件

tar是Linux系统下内建的备份工具,使用方便,功能强大。结合shell编程更能实现自动备份功能 。下面介绍如何使用该工具完成我们日常的数据备份和恢复工作。

下面是一个简单的示例,把当前文件夹下的所有文件打包成一个压缩文件img.tar.gz:

debian:~/img# tar -czvpf img.tar.gz * 

各种参数的意义:

c        创建新打包文件
z        用gzip压缩打包文件
v        打包时对文件进行校验
p        打包后保持原文件的属性
f        打包成文档文件格式(img.tar.gz)

tar的参数很多很灵活,可进行很多细致的控制。如指定路径和排除目录等。下面的例子把~/img目录打包,但不包含test目录或test文件。最后一个点表示除test目录外的所有内容,千万不要忘记了。

debian:~# tar -czvpf img1.tar.gz --directory ~/img --exclude=test .

对已创建好的打包文件,我们还可对打包文件进行添加和更新操作。-r参数表示在打包文件后添加新内容,-u参数表示只添加更新过的文件。

debian:~/img# tar -rf img.tar.gz abc.py
debian:~/img# tar -uf img.tar.gz abc.py

备份的目的是为了能在出现灾难或意外删除数据后能及时恢复数据。使用tar命令的-x参数可帮助镒恢复数据,命令格式如下:

debian:~# tar -xzvpf img1.tar.gz

在生成备份文件时,我们可用shell命令生成与日期相关的文件。如下所示:

debian:~# tar -zcvpf img`date '+%Y%B%d'`.tar.gz img/.

生成的打包文件名为:img2007九月29.tar.gz

把上面的命令放在cron中每天定期自动执行就可按日期生成不同的备份文件,使我们的备份数据更完整和安全。但这样又带来一个问题,就是备份文件日积月累会占用大量的硬盘空间。人工定期删除是一个方法,但不适合我们这些懒惰的linuxer。我们需要一个自动把过期数据删除的命令。find命令是一个好选择。

把7天前的数据删除
find /archive/backup* -mtime +7 -exec rm -r {}

把30天前的数据删除
find /archive -name 'backup-*' -mtime +30 | xargs rm -f

tar使用-T选项可从配置文件中读取文件列表来进行打包。

debian:~# vi backup.conf
a.py
jims.key
debian:~# tar -czvpf backup.tar.gz -T backup.conf
a.py
jims.key
debian:~#                                          

使用宽屏显示器

现在的宽屏LCD显示器已越来越流行了,在Linux中使用宽屏显示器可通过配置xorg.conf配置文档实现。配置参数如下:

Section "Monitor"
    Identifier     "phile"
#    HorizSync       28.0 - 51.0
#    VertRefresh     43.0 - 60.0
     Modeline "1440x900_60.00"  106.47  1440 1520 1672 1904  900 901 904 932  -HSync +Vsync
    Option         "DPMS"
EndSection

关键是要设置Modeline参数,通过运行以下命令获取1400x900分辨率60Hz的Modeline参数:

debian:~# gtf 1440 900 60

利用tor + privoxy访问tldp.org

tldp.org上有大量有用的linux文档,是我们学习linux不可多得的宝贵资源。但由于网络过滤原因,已经不能访问很长时间了。要访问它只能通过代理服务器来访问。现在我们介绍一个本地代理和安全路由的方法来访问这个网站。路由软件即是tor,代理软件即是privoxy。安装过程如下:

  • 使用apt-get install tor privoxy安装这两个软件。

  • 把/etc/privoxy/config文件中第五节的"forward-socks4a / 127.0.0.1:9050 ."选项的注释符号去掉使该配置生效。

  • 打开firefox浏览器,下载安装torbutton插件。通过浏览器右下角的状态栏启动或禁止tor功能。

  • 重启tor和privoxy服务。访问http://torcheck.xenobite.eu/验证是否成功安装tor和privoxy。

  • 验证成功后就可以访问http://tldp.org和被外部防火墙过滤掉的网站了。

tor和privoxy的功能很强大,配置参数有很多,有时间再细看了。现阶段只要能满足我访问tldp.org网站就可以了。

在安装tor时,除了建议安装privoxy外,还建议安装了tsocks和socat两个软件。tsocks是透明socks代理软件,通过配置/etc/tsocks.conf文件实现自动使用socks代理功能。socat是一个多用途中继器,能创建可双向通信的数据流。

使用tor+privoxy才可以访问的网站有:

使用screen管理远程会话

在Linux环境中我们都会使用ssh或telnet等远程登录软件登录服务器进行系统维护工作。一些维护命令运行需花费很长的时间,我们就要一直挂在服务器上直到命令运行完毕才能登出。如果我们在维护命令还没运行完毕就登出服务器或关闭终端窗口,维护命令就会马上中断。中断的原因是由SIGHUP 信号造成的。当我们用ssh登录服务器时,在服务器上就会为用户打开一个ssh shell环境。以后我们所做的所有操作都是在这个shell环境中进行的。使用pstree命令可以看出这种关系。

[root@t02 root]# pstree  14426
sshd---sshd---bash-+-emacs
                   `-vim

当我们断开连接或关闭终端时会产生SIGHUP信号关闭服务器上的ssh shell进程。由此进程所派生出来的子进程也会中断。使用screen程序可以解决这个问题。

在各种Linux发行版中,screen软件一般都已安装在系统中,直接打screen回车就可进入screen窗口。如果没有也用apt-get install screen命令安装。

进入screen shell环境后,我们可以执行各种命令,当命令运行时间较长时,我们可以临时中断screen会话,但命令还是在后台继续运行的。中断screen会话的命令是使用组合键Ctrl+a d。我们可以查询后台的screen会话:

[root@debian root]# screen -ls
There is a screen on:
        13974.pts-0.t02 (Detached)
1 Socket in /tmp/screens/S-root.

使用screen -r 13974命令重返screen会话。

screen的管理命令都是以Ctrl+a开头的。下面是一些常用的绑定组合。

  • Ctrl+a d,退出会话,命令在继续运行。

  • Ctrl+a ?,显示键的绑定信息。

  • Ctrl+a c,创建一个screen窗口。

  • Ctrl+a Ctrl+a,切换screen shell。

  • Ctrl+a k,杀掉当前screen shell。

下面介绍几个常用screen命令行选项。

  • screen -ls,显示screen会话。

    [root@debian root]# screen -ls
    There are screens on:
            13974.pts-0.t02 (Detached)
            14657.pts-3.t02 (Detached)
    2 Sockets in /tmp/screens/S-root.
    
  • screen -r screen-id,重返指定的screen会话

    [root@t02 root]# screen -r 14657
    
  • screen -wipe,删除死掉的screen会话。

screen有两级配置文件,会别位于/etc/screenrc和$HOME/.screenrc。在配置文件中我们可以定制绑定键、启动选项等。

在Linux下还有几种工具可以达到类似以上的效果。分别是:

  • nohup,把它加到要运行的程序前面,该程序就会忽略HUP信号。一般我们还会加上&把程序放到后台运行。如:

    debian:~# nohup cp -a inst/. backup/.&
    
  • setsid,该命令会为程序打开一个新的会话,和当前终端进程分离出来。新会话的PPID是1,而不是当前终端进程的PID,这样也就不会受到终端进程的HUP信号的影响。如:

    debian:~# setsid cp -a inst/. backup/.&
    
  • 把命令放到子shell里运行,脱离当前shell。把程序放到()里运行就会使程序在子shell中运行。同上,新会话的PPID是1,而不是当前终端进程的PID。如:

    debian:~# (cp -a inst/. backup/.&)
    
  • disown,使运行中的进程忽略HUP信号。如:

    debian:~# disown -h %1   #使后台作业1忽略HUP信号
    debian:~# disown -ah     #使所有后台作业忽略HUP信号
    debian:~# diwown rh      #使正在运行中的作业忽略HUP信号
    

使用wget下载文件

wget是GNU项目中一个下载工具,支持HTTP, HTTPS和FTP协议。它是一个命令行工具,可被脚本或cron例程调用。wget有非常多的功能,可稳定地传输大容量文件。

使用方法很简单。输入以下命令就可以下debian光盘映像文件了。

debian:~# wget http://cdimage.debian.org/cdimage/weekly-builds/i386/iso-dvd/debian-testing-i386-DVD-1.iso

wget的选项很多,下面介绍一些wget的常用选项。

  • debian:~# wget -i filename.txt
    

    把需下载文件的链接放到filename.txt文件中。运行上面的命令会自动下载这些链接。

  • debian:~# wget -A=iso http://www.example.com/download/
    

    只下载http://www.example.com/download/目录下后缀为iso的文件。如果是不想下载iso文件,则用-R选项。

  • debian:~# wget -c http://www.example.com/download/debian.iso
    

    -c选项表示继续下载以前没下载完的文件,也就是我们所说的断点续传功能。

  • debian:~# wget -r http://www.example.com/download
    

    遍历下载download目录中的文件。

  • debian:~# wget -m http://www.example.com/
    

    镜像http://www.example.com站点。

Note

注意:早期版本的wget不支持大文件的传输,最好升级到最新版本。

网上查到的选项中文说明,对新手很有用,谢谢原作者的努力。

wget各种选项分类列表

* 启动 

  -V,  --version           显示wget的版本后退出
  -h,  --help              打印语法帮助
  -b,  --background        启动后转入后台执行
  -e,  --execute=COMMAND   执行`.wgetrc'格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc

* 记录和输入文件 

  -o,  --output-file=FILE     把记录写到FILE文件中
  -a,  --append-output=FILE   把记录追加到FILE文件中
  -d,  --debug                打印调试输出
  -q,  --quiet                安静模式(没有输出)
  -v,  --verbose              冗长模式(这是缺省设置)
  -nv, --non-verbose          关掉冗长模式,但不是安静模式
  -i,  --input-file=FILE      下载在FILE文件中出现的URLs
  -F,  --force-html           把输入文件当作HTML格式文件对待
  -B,  --base=URL             将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
       --sslcertfile=FILE     可选客户端证书
       --sslcertkey=KEYFILE   可选客户端证书的KEYFILE
       --egd-file=FILE        指定EGD socket的文件名

* 下载 

       --bind-address=ADDRESS   指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
  -t,  --tries=NUMBER           设定最大尝试链接次数(0 表示无限制).
  -O   --output-document=FILE   把文档写到FILE文件中
  -nc, --no-clobber             不要覆盖存在的文件或使用.#前缀
  -c,  --continue               接着下载没下载完的文件
       --progress=TYPE          设定进程条标记
  -N,  --timestamping           不要重新下载文件除非比本地文件新
  -S,  --server-response        打印服务器的回应
       --spider                 不下载任何东西
  -T,  --timeout=SECONDS        设定响应超时的秒数
  -w,  --wait=SECONDS           两次尝试之间间隔SECONDS秒
       --waitretry=SECONDS      在重新链接之间等待1...SECONDS秒
       --random-wait            在下载之间等待0...2*WAIT秒
  -Y,  --proxy=on/off           打开或关闭代理
  -Q,  --quota=NUMBER           设置下载的容量限制
       --limit-rate=RATE        限定下载输率

* 目录 

  -nd  --no-directories            不创建目录
  -x,  --force-directories         强制创建目录
  -nH, --no-host-directories       不创建主机目录
  -P,  --directory-prefix=PREFIX   将文件保存到目录 PREFIX/...
       --cut-dirs=NUMBER           忽略 NUMBER层远程目录

* HTTP 选项 

       --http-user=USER      设定HTTP用户名为 USER.
       --http-passwd=PASS    设定http密码为 PASS.
  -C,  --cache=on/off        允许/不允许服务器端的数据缓存 (一般情况下允许).
  -E,  --html-extension      将所有text/html文档以.html扩展名保存
       --ignore-length       忽略 `Content-Length'头域
       --header=STRING       在headers中插入字符串 STRING
       --proxy-user=USER     设定代理的用户名为 USER
       --proxy-passwd=PASS   设定代理的密码为 PASS
       --referer=URL         在HTTP请求中包含 `Referer: URL'头
  -s,  --save-headers        保存HTTP头到文件
  -U,  --user-agent=AGENT    设定代理的名称为 AGENT而不是 Wget/VERSION.
       --no-http-keep-alive  关闭 HTTP活动链接 (永远链接).
       --cookies=off         不使用 cookies.
       --load-cookies=FILE   在开始会话前从文件 FILE中加载cookie
       --save-cookies=FILE   在会话结束后将 cookies保存到 FILE文件中

* FTP 选项 

  -nr, --dont-remove-listing   不移走 `.listing'文件
  -g,  --glob=on/off           打开或关闭文件名的 globbing机制
       --passive-ftp           使用被动传输模式 (缺省值).
       --active-ftp            使用主动传输模式
       --retr-symlinks         在递归的时候,将链接指向文件(而不是目录)

* 递归下载 

  -r,  --recursive          递归下载--慎用!
  -l,  --level=NUMBER       最大递归深度 (inf 或 0 代表无穷).
       --delete-after       在现在完毕后局部删除文件
  -k,  --convert-links      转换非相对链接为相对链接
  -K,  --backup-converted   在转换文件X之前,将之备份为 X.orig
  -m,  --mirror             等价于 -r -N -l inf -nr.
  -p,  --page-requisites    下载显示HTML文件的所有图片

* 递归下载中的包含和不包含(accept/reject) 

  -A,  --accept=LIST                分号分隔的被接受扩展名的列表
  -R,  --reject=LIST                分号分隔的不被接受的扩展名的列表
  -D,  --domains=LIST               分号分隔的被接受域的列表
       --exclude-domains=LIST       分号分隔的不被接受的域的列表
       --follow-ftp      

安装Eclipse

debian有现成的Eclipse包,直接用apt-get install eclipse命令安装就可以了。Eclipse是一个全能的开发环境,各种功能可以通过安装插件实现。下面介绍一些常用插件的安装方法。

  • 安装subclipse插件实现subversion功能。

    Eclipse的svn插件叫subclipse ,官方网址是http://subclipse.tigris.org/。它为Eclipse提供了一个update site:http://subclipse.tigris.org/update。

    安装方法是打开Eclipse,按以下菜单路径选择:Help -> Software Updates -> Find and Install -> Search for new features to install ->New Remote Site。在URL中输入http://subclipse.tigris.org/update。Eclipse就会自动安装该插件了。安装成功后,在File->New->Others下面就可以看到SVN文件夹。

    这里简单介绍一下subclipse插件的使用方法。首先在Eclipse中打开SVN资源库,菜单路径:Window -> Open Perspective -> Other ->SVN资源库。打开SVN资源库视图后,在视图的空白处右击选择新建->资源库位置,接着输入资源库的url,输入用户名和密码后,就可在当前视图中显示你的SVN资源库了。添加完成你的资源库后,右击刚新建的资源库选择“取出(checkout)”,按取出向导把SVN资源库导出到Eclipse项目空间。这样我们就可在Resource视图中看到导出的项目。在Resource视图中编辑完项目后,通过右击项目名选择Team->提交把更新提交到我拉的SVN资源库。在Eclipse的帮助文档中有详细的介绍,如果想进一步了解subclipse的功能可以去看看。

安装过程和使用过程中的问题列表:

  • 安装的插件可通过Help->Software Updates->Manage configuration界面管理,如禁用、启用和显示插件属性等。

  • 运行eclipse时出现JVM terminated. Exit code=127出错。出错的原因是debian使用修改后浏览器iceweasel包代替后firefox或mozilla,修改/usr/bin/eclipse脚本文件,使脚本能正确配置MOZILLA_FIVE_HOME变量。下面是修改后eclipse脚本文件节选。

    ....
    
    # Set path for the Mozilla SWT binding
    MOZILLA_FIVE_HOME=${MOZILLA_FIVE_HOME%*/}
    if false && [ -n "$MOZILLA_FIVE_HOME" -a -e $MOZILLA_FIVE_HOME/libgtkembedmoz.so ]; then
        :
    elif [ -e /usr/lib/mozilla/libgtkembedmoz.so ]; then
        export MOZILLA_FIVE_HOME=/usr/lib/mozilla
    elif [ -e /usr/lib/firefox/libgtkembedmoz.so ]; then
        export MOZILLA_FIVE_HOME=/usr/lib/firefox
    elif [ -e /usr/lib/xulrunner/libgtkembedmoz.so ]; then
        export MOZILLA_FIVE_HOME=/usr/lib/xulrunner
    elif [ -e /usr/lib/mozilla-firefox/libgtkembedmoz.so ]; then
        export MOZILLA_FIVE_HOME=/usr/lib/mozilla-firefox
    elif [ -e /usr/lib/mozilla/libgtkembedmoz.so ]; then
        export MOZILLA_FIVE_HOME=/usr/lib/mozilla
    elif [ -e /usr/lib/icedove/libgtkembedmoz.so ]; then       # 新增内容,配置MOZILLA_FIVE_HOME环境变量
        export MOZILLA_FIVE_HOME=/usr/bin/iceweasel
    else
    
    ...
    

    Note

    如果没有安装icedove则要先安装,这样才会有libgtkembedmoz.so这个文件。

运行内嵌X server

有两个程序可以在X window中运行一个内嵌的X server,一个是Xnest,另一个是Xephyr。

  • Xnest是一个内嵌的X server,可以在X server上再开一个内嵌的X server。该功能对于调试GUI程序和开发手机小屏幕GUI程序很有用。安装方法:

    debian:~# apt-get install xnest
    

    运行内嵌X server:

    debian:~# Xnest :1 &
    

    :1表示内嵌的X server在1号显示屏上显示。

  • Xephyr是一个比较新的内嵌X server,安装方法:

    debian:~# apt-get install xserver-xephyr
    

    运行方法:

    debian:~# Xephyr -query localhost -screen 800x600 :1
    

使用rsync同步数据

rsync程序由samba项目组开发,用以同步数据。rsync命令格式如下:

        Local:  rsync [OPTION...] SRC... [DEST]
        
        Access via remote shell:
        Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
        Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
        
        Access via rsync daemon:
        Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
        Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
      

rsync有六种工作模式,分别是:

  1. 拷贝本地文件。当SRC和DEST路径信息中不包含单个冒号(:)分隔符时启动这种工作模式。

  2. 使用一个远程shell程序(如rsh、ssh)来实现将本地文件拷贝到远程机器 。当DEST路径地址中包含单个冒号(:)分隔符时启动该模式。

  3. 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的文件拷贝到本地机器。当SRC地址路径包含单个冒号(:)分隔符时启动该模式。

  4. 从远程rsync服务器中拷贝文件到本地机器。当SRC路径信息包含(::)分隔符时启动该模式。

  5. 从本地机器拷贝文件到远程rsync服务器中。当DEST路径信息包含(::)分隔符时启动该模式。

  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

实例:

  • 把服务器上的books目录同步到本地,-r选项表示包含子目录,-a选项表示归档模式,-u选项表示更新,--delete选项表示如果服务器上的文件删除了,则本地的归档文件也相应删除,--progress选项表示显示同步过程。

            rsync.exe -rau --delete --progress root@192.168.3.22:/home/wj/books .
              

    定期执行以下命令就可以保持服务器上和本地的books目录的数据同步了。

在windows平台下的rsync命令包含在cwrsync软件包中。命令格式同linux平台下的一样,只是windows平台下的目录表示方法有差别。如需表示d盘则要写成/cygdrive/d的形式。

Chapter 11. Debian服务器篇

Debian的服务器应用范围是很广的,支持各种网络服务器,如DNS、Sabma和Zope等。本章主要介绍在Debian系统下各种服务器的安装配置。

在IBM X335服务器上安装Debian woody 3.0

硬件配置情况:一台IBM X335服务器,配置Intel Xeon 2.8G CPU,1G内存,两个36G硬盘(RAID 1),BroadCom bcm5700千兆网卡。软件配置:Debian woody stable 3.0,采用bootbf2.4.iso进行网络安装,安装步骤如下:

  1. 下载相关软件:

    bootbf2_4_iso.zip,到这里下载http://people.debian.org/~blade/boot-floppies/netinst-full-pre/。解压密码是:“Yes, I know that this data may be harmful!”。

    LSI53C1030和bcm5700驱程,到这里下载2_4_20-modules_bin.zip。解压密码是:“Yes, I know that this data may be harmful!”。

    把解压出来iso刻录成启动光盘,驱程用dd if=2_4_20-modules.bin of=/dev/fd0写到1.44M软盘上。

    Note

    驱程需与Debian内核版本匹配才可驱动。

  2. 准备好软件后,就可开始安装。在光盘启动,出现boot:提示符后直接按回车载入安装程序,首先选择键盘。

  3. 接着安装程序提示检测不到硬盘,需加载驱动模块。这时插入驱程软盘,按回车,出现可加载模块列表,按顺序选择mptbase.o,mptscsih.o加载LSI53C1030驱动,注意,不能先加载mptscsih.o,否则加载不成功。接着可加载bcm5700.o网卡驱动模块,加载成功后退出。这时安装程序应该就可找到硬盘和网卡了。

  4. 加载完驱程后,首先进行硬盘分区和格式化工作。

  5. 配置网卡,因为需进行网络安装,所以网卡要在这里配置好。

  6. 配置系统模块,如没特别的设备,按默认就可以了。

  7. 开始安装基本系统,很快就完成,因为才安装几十兆的内容。

  8. 安装完基本系统后,就可设置系统启动配置,使系统可直接从硬盘启动,选择把lilo安装到MBR中。这时你也可做一张开机盘,以备进行故障恢复。

  9. 现在可重启服务器。如果启动成功,Debian会自动运行base-config进行系统始初配置。配置后,就可登录系统了。

由于默认安装的2.4.20内核不支持超线程技术和大内存,所以需重新编译内核。我以编译2.4.28内核为例说明,2.6内核的编译方法也是一样的。

  1. 安装内核编译所需的一些工具:

    # apt-get install kernel-package ncurses-dev fakeroot
    
  2. 到内核站点http://www.kernel.org下载最2.4.28内核原码包:

    # cd /usr/src
    # wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.28.tar.bz2
    
  3. 下载完成后,就可解包和配置内核,配置内核前需了解清楚机器的硬件配置情况:

    # tar -xjf linux-2.4.28.tar.bz2
    # cd linux-2.4.28/
    # make menuconfig
    

    配置内核时,我主要修改了三个内容

    1. 修改Processor type and features里有关CPU和内存的内容,把CPU类型从P3改为P4,支持4个CPU,支持4G内存;

    2. 选择Fusion MPT device support,把Fusion MPT(base+ScsiHost)drivers编译进内核。

    3. 选择Network device support,进入Ethernet(1000Mbit)类,把Broadcom Tigon3 support编译进内核。

    我还把一些明确不需要的模块删除了,以精简内核,配置完成后存盘退出。你也可把配置的内核参数文件保存起来,以备以后重新编译内核时导入使用。

  4. 配置完内核后就可进行实质的编译工作了,按以下命令依次执行:

    # make dep
    # make-kpkg clean
    # fakeroot make-kpkg --revision=mykernel.1.0 kernel_image
    

    如果在编译过程异常中止,我们需运行以下命令重新配置内核:

    # make clean
    # make menuconfig
    
  5. 内核编译完成后,就会在/usr/src目录下生成一个名为kernel-image-2.4.28_mykernel.1.0_i386.deb的内核安装包。我们用以下命令安装新内核:

    # dpkg -i kernel-image-2.4.28_mykernel.1.0_i386.deb
    

    内核安装时,会把vmlinuz-2.4.28和System.map-2.4.20拷贝到/boot目录下。并有一些自动配置过程,包括制作启动盘和配置lilo启动信息。启动盘可做可不做,但lilo启动信息配置就不要做,我试过几次,如果做了系统就起不来了。我们可手动配置/etc/lilo.conf来实现多重内核启动。把以下信息添加到/etc/lilo.conf中:

    
    prompt           #这句可使系统启动时出现内核选择菜单。
    timeout=100      #提供10秒的选择时延。
    ...
    image=/boot/vmlinuz-2.4.28
           label=Linux-2.4.28
    ...
    

    最后运行以下命令把引导信息写入MBR。

    # lilo -v -v -v
    

    Note

    其实一个-v选项就可以了,多几个-v选项只是可多显示一些信息。

  6. 到现在为止,新内核的编译配置已全部完成,重启服务器,选择新内核引导系统。

2.6内核的编译过程和上面的一样。主要是配置内核时菜单会有些不同。在2.6内核中,模块是用module-init-tools来管理的,所以如果需加载模块,就要安装该工具。

手动安装HighPoint RocketRaid 2640x4阵列卡驱动程序

在我安装2640x4卡的时候,官方的debian驱动包还没有出来,只有源码,所以只好自已手动从源码开始安装驱动程序了。我们需把阵列卡驱动编译成内核模块的形式,在系统启动时加载。首先,下载官方驱程源码,在2.6.18-486内核的debian环境下编译,生成一个2.6.18-486版的驱动内核模块。接着在2.6.18-6-686内核的debian系统下再编译生成一个2.6.18-6-686版的驱动内核模块。为什么我要生成两个版本的内核驱动模块呢?这是因为我安装的debian 40r5系统在安装时使用的是2.6.18-486内核,安装完成后的系统内核是为2.6.18-6-686。 而加载的内核模块要与系统的内核匹配才能正常加载,所以我们需要两个内核版本的驱动模块,一个在安装时使用,一个供安装后的新系统使用。如果我们要加载的内核模块与系统的内核版本不一致,则在加载内核模块时会出错,并提示无效格式出错信息。这两个版本的内核模块的使用时机下面会详细介绍。

好了,准备好驱动内核模块后,就可以开始安装了。安装前期的过程就不细讲了,本节内容主要讲述阵列卡的安装。安装到搜索硬盘的时候会报错,提示找不到可以安装的磁盘介质。这时我们选择返回选项返回到安装菜单,选择运行shell进入shell环境,开始安装阵列卡驱动。把装有驱动程序的软盘放到软驱中,挂载软盘,加载驱程。

mount /dev/fd0 /floppy
insmod /floppy/rr26xx-2.6.18-486.ko

成功加载后,用lsmod命令可以看到阵列卡驱程的的内核模块名是rr26xx。退出shell返回安装菜单,再次选择磁盘探测,这时就可以找到磁盘阵列了。接下来按正常步骤分区和安装系统。所有安装步骤完成后系统会提示要重启电脑,先不要按继续按钮,返回到安装菜单,我们要为新系统安装阵列卡驱动,因为我们前面加载的驱程是临时的,系统重启后就会失效。如果这时重启系统就会出错,电脑会因找不到硬盘而停留在加载根文件系统的地方。

要使系统在启动时加载驱动程序,我们需要把驱动编译成内核模块并放到initrd.img始初化内存盘中。initrd.img 在内核启动时会导入内存,生成一个虚拟的文件系统,由该虚拟的文件系统加载系统启动必须的内核模块。通过把阵列卡的内核驱动模块放进initrd.img就可使系统在加载根文件之前加载阵列驱动模块,使内核能找到阵列卡上的硬盘正常启动系统。有关initrd的工作原理请参考本书相关内容。具体操作步骤如下:

  1. 首先进入shell,挂载刚安装了新系统的硬盘,把2.6.18-6-686版的驱动模块拷贝到新系统的/lib/modules/2.6.18-6-686/kernel/drivers/scsi/目录。并进入新系统的chroot环境。

    mount /dev/sda1 /mnt
    cp /floopy/rr26xx-2.6.18-6-686.ko /mnt/lib/modules/2.6.18-6-686/kernel/drivers/scsi/.
    chroot mnt
    
  2. 在2.6内核中可以用mkinitramfs工具来生成initrd.img。mkinitramfs工具的配置信息位于/etc/initramfs-tools目录下,其中/etc/initramfs-tools/modules文件包含需添加进initrd.img文件的内核模块列表。我们把驱动模块名rr26xx添加到该文件中,模块名可用lsmod命令查询得到。

  3. 运行depmod -a 2.6.18-6-686更新/lib/modules/2.6.18-6-686/modules.dep文件,该文件定义模块依赖关系,使内核模块能按正确的顺序正确加载。更新modules.dep文件后,查询该文件中可以发现rr26xx模块要依赖scsi_mod模块。

  4. 运行以下命令生成新的initrd.img,在生成新的initrd.img文件前最好先备份旧文件。

    mkinitramfs -o /boot/initrd.img-2.6.18-6-686 2.6.18-6-686
    

    -o参数设定输出文件名,最后的2.6.18-6-686指定生成初始化内存盘的内核版本号,该版本号要与系统启动的内核版本号一致。

  5. 检查/boot/grub/menu.1st文件的启动项中initrd参数指定的文件是否正确。如果没问题就可以重启电脑了。在内核启动时会出现如下阵列卡驱动程序加载的信息。

    ...
    Nov 20 18:26:18 t022 kernel: SCSI subsystem initialized
    Nov 20 18:26:18 t022 kernel: rr26xx: module license 'Proprietary' taints kernel.
    Nov 20 18:26:18 t022 kernel: rr26xx:RocketRAID 26xx controller driver v1.0.08.0402 (Nov 15 2008 00:14:59)
    Nov 20 18:26:18 t022 kernel: ACPI: PCI Interrupt 0000:01:00.0[A] -> GSI 16 (level, low) -> IRQ 169
    Nov 20 18:26:18 t022 kernel: rr26xx:adapter at PCI 1:0:0, IRQ 169
    Nov 20 18:26:18 t022 kernel: rr26xx:Start to probe device 1
    Nov 20 18:26:18 t022 kernel: rr26xx:Start to probe device 2
    Nov 20 18:26:18 t022 kernel: rr26xx:Start to probe device 3
    Nov 20 18:26:18 t022 kernel: scsi0 : rr26xx
    Nov 20 18:26:18 t022 kernel:   Vendor: HPT       Model: DISK_0_0          Rev: 4.00
    Nov 20 18:26:18 t022 kernel:   Type:   Direct-Access                      ANSI SCSI revision: 00
    ...
    

highpoint为阵列卡提供了方便的管理程序,在官方网站上有三种管理界面可以选择,分别是web界面,gtk界面和cli命令行界面。我选择了web界面管理方式。安装方法如下,首先到官方网站下载软件包。官方网站上只提供rpm格式的软件包,没有deb包。我们可以用alien程序把rpm软件包转换成deb格式,再用dpkg -i命令安装。具体操作步骤如下:

debian:~/inst/hpt2640x4WebGUI# alien --scripts hptsvr-https-1.4-8.i386.rpm
hptsvr-https_1.4-9_i386.deb generated
debian:~/inst/hpt2640x4WebGUI# dpkg -i hptsvr-https_1.4-9_i386.deb
Selecting previously deselected package hptsvr-https.
(Reading database ... 21670 files and directories currently installed.)
Unpacking hptsvr-https (from hptsvr-https_1.4-9_i386.deb) ...
Setting up hptsvr-https (1.4-9) ...
 Adding system startup for /etc/init.d/hptdaemon ...
   /etc/rc0.d/K20hptdaemon -> ../init.d/hptdaemon
   /etc/rc1.d/K20hptdaemon -> ../init.d/hptdaemon
   /etc/rc6.d/K20hptdaemon -> ../init.d/hptdaemon
   /etc/rc2.d/S20hptdaemon -> ../init.d/hptdaemon
   /etc/rc3.d/S20hptdaemon -> ../init.d/hptdaemon
   /etc/rc4.d/S20hptdaemon -> ../init.d/hptdaemon
   /etc/rc5.d/S20hptdaemon -> ../init.d/hptdaemon
Starting hptsvr daemon.

安装完成后,打开浏览器输入https://localhost:7402就可打开管理程序的登录窗口,默认的用户名是RAID,密码是hpt,注意,用户名是大写的。在管理程序中可以对阵列进行初始化,删除等高危操作,所以为安全起见,登录后的首要操作是修改管理程序的登录密码。

系统管理工具

Linux是一个开放的、高可配置的操作系统,一个合格的Linux系统管理员应该可支持不同应用环境的要求。下面介绍一些管理工具,可帮助我们了解系统状态和优化系统。

  1. top

    top命令可实时地显示Linux系统的进程、CPU、内存、负载等的信息。它是我们了解系统整体状态最好的工具。

    top - 10:06:09 up 31 days,  2:14,  1 user,  load average: 0.00, 0.00, 0.00
    Tasks:  47 total,   1 running,  46 sleeping,   0 stopped,   0 zombie
     Cpu0 :  0.0% us,  0.0% sy,  0.0% ni, 100.0% id,  0.0% wa,  0.0% hi,  0.0% si
     Cpu1 :  0.3% us,  0.0% sy,  0.0% ni, 99.7% id,  0.0% wa,  0.0% hi,  0.0% si
    Mem:   1034732k total,   472336k used,   562396k free,    16460k buffers
    Swap:  1052248k total,        0k used,  1052248k free,   357940k cached
    
      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND          
         1 root      16   0  1504  480 1352 S  0.0  0.0   0:00.59 init            
         2 root      RT   0     0    0    0 S  0.0  0.0   0:00.06 migration/0    
         3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0   
         4 root      RT   0     0    0    0 S  0.0  0.0   0:00.04 migration/1  
         5 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1 
         6 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 events/0        
         7 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 events/1       
         8 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 khelper       
         9 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 kblockd/0    
         10 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 kblockd/1   
         11 root      17   0     0    0    0 S  0.0  0.0   0:00.00 khubd      
         38 root      15   0     0    0    0 S  0.0  0.0   0:00.00 pdflush   
         37 root      15   0     0    0    0 S  0.0  0.0   0:00.00 kirqd    
         41 root       6 -10     0    0    0 S  0.0  0.0   0:00.00 aio/0   
         40 root      16   0     0    0    0 S  0.0  0.0   0:00.00 kswapd0
         42 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 aio/1 
    

    top命令的运行状态是一个实时的显示过程,我们可在这个界面监控系统运行情况。我们可通过几个按键来控制top命令,如按q可退出top命令状态,按s可输入信息的更新频率等。这些命令可按h帮助键查询。如:

    Help for Interactive Commands - procps version 3.2.1
    Window 1:Def: Cumulative mode Off.  System: Delay 3.0 secs; Secure mode Off.
    
      Z,B       Global: 'Z' change color mappings; 'B' disable/enable bold
      l,t,m     Toggle Summaries: 'l' load avg; 't' task/cpu stats; 'm' mem info
      1,I       Toggle SMP view: '1' single/separate states; 'I' Irix/Solaris mode
    
      f,o     . Fields/Columns: 'f' add or remove; 'o' change display order
      F or O  . Select sort field
      <,>     . Move sort field: '<' next col left; '>' next col right
      R       . Toggle normal/reverse sort
      c,i,S   . Toggle: 'c' cmd name/line; 'i' idle tasks; 'S' cumulative time
      x,y     . Toggle highlights: 'x' sort field; 'y' running tasks
      z,b     . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
      u       . Show specific user only
      n or #  . Set maximum tasks displayed
    
      k,r       Manipulate tasks: 'k' kill; 'r' renice
      d or s    Set update interval
      W         Write configuration file
      q         Quit
              ( commands shown with '.' require a visible task display window ) 
    Press 'h' or '?' for help with Windows,
    any other key to continue 
    
  2. ps

    ps命令可查询系统的进程状态,常用的命令参数是ps aux,该命令可显示所有用户的进程,如果进程的命令太长,则显示的进程信息会不全。我们可用ps auxw命令来加长显示,w参数可多加几个,最多可加三个,以显示更长的进程信息。

    debian:~# ps aux
    USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0  1416  448 ?        S    May24   0:06 init [3] 
    root         2  0.0  0.0     0    0 ?        SW   May24   0:00 [keventd]
    root         3  0.0  0.0     0    0 ?        SW   May24   0:00 [keventd]
    root         4  0.0  0.0     0    0 ?        SW   May24   0:00 [keventd]
    root         5  0.0  0.0     0    0 ?        SW   May24   0:00 [keventd]
    root         6  0.0  0.0     0    0 ?        SWN  May24   0:11 [ksoftirqd_CPU0]
    root         7  0.0  0.0     0    0 ?        SWN  May24   0:11 [ksoftirqd_CPU1]
    root         8  0.0  0.0     0    0 ?        SWN  May24   0:10 [ksoftirqd_CPU2]
    root         9  0.0  0.0     0    0 ?        SWN  May24   0:10 [ksoftirqd_CPU3]
    root        10  0.0  0.0     0    0 ?        SW   May24  17:29 [kswapd]
    root        11  0.0  0.0     0    0 ?        SW   May24   0:00 [kreclaimd]
    root        12  0.0  0.0     0    0 ?        SW   May24  15:47 [bdflush]
    root        13  0.0  0.0     0    0 ?        SW   May24   0:00 [kupdated]
    root        14  0.0  0.0     0    0 ?        SW   May24   0:00 [mdrecoveryd]
    root        21  0.0  0.0     0    0 ?        SW   May24   0:00 [scsi_eh_2]
    root        24  0.0  0.0     0    0 ?        SW   May24   0:47 [kjournald]
    root        84  0.0  0.0     0    0 ?        SW   May24   0:00 [khubd]
    root       177  0.0  0.0     0    0 ?        SW   May24   0:59 [kjournald]
    root       178  0.0  0.0     0    0 ?        SW   May24   0:00 [kjournald]
    root       514  0.0  0.0  1476  600 ?        S    May24   0:06 syslogd -m 0
    

    要显示进程树的依赖关系可用以下命令:

    debian:~# ps axuf
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.1  0.2   1944   648 ?        S    07:59   0:02 init [5]
    root         2  0.0  0.0      0     0 ?        SN   07:59   0:00 [ksoftirqd/0]
    root         3  0.0  0.0      0     0 ?        S<   07:59   0:00 [events/0]
    root         4  0.0  0.0      0     0 ?        S<   07:59   0:00 [khelper]
    root         5  0.0  0.0      0     0 ?        S<   07:59   0:00 [kthread]
    root         7  0.0  0.0      0     0 ?        S<   07:59   0:00  \_ [kacpid]
    root        73  0.0  0.0      0     0 ?        S<   07:59   0:00  \_ [kblockd/0]
    root        76  0.0  0.0      0     0 ?        S<   07:59   0:00  \_ [khubd]
    root       139  0.0  0.0      0     0 ?        S    07:59   0:00  \_ [pdflush]
    root       140  0.0  0.0      0     0 ?        S    07:59   0:00  \_ [pdflush]
    root       142  0.0  0.0      0     0 ?        S<   07:59   0:00  \_ [aio/0]
    root       733  0.0  0.0      0     0 ?        S<   07:59   0:00  \_ [kseriod]
    root       820  0.0  0.0      0     0 ?        S<   07:59   0:00  \_ [exec-osm/0]
    root       141  0.0  0.0      0     0 ?        S    07:59   0:00 [kswapd0]
    root       830  0.0  0.0      0     0 ?        S    07:59   0:00 [kjournald]
    root      1402  0.0  0.1   1736   392 ?        Ss   08:00   0:00 dhclient -e -pf /var/run/dhclient.eth0.pid -l
    root      1409  0.0  0.4   6004  1272 ?        Ss   08:00   0:00 /sbin/mount.smbfs //t02/yangjing /root/data -
    root      1420  0.0  0.0      0     0 ?        S    08:00   0:00 [smbiod]
    root      1422  0.0  0.3   5936  1240 ?        Ss   08:00   0:00 /sbin/mount.smbfs //t02/books /root/books -o
    root      1633  0.0  0.1   1628   604 ?        Ss   08:00   0:00 /sbin/syslogd
    root      1639  0.0  0.1   1580   372 ?        Ss   08:00   0:00 /sbin/klogd -x
    root      1688  0.0  1.2   3788  3788 ?        SLs  08:00   0:00 /usr/sbin/slmodemd --alsa -c CHINA modem:1
    root      1772  0.0  0.1   1572   560 ?        Ss   08:00   0:00 /usr/sbin/acpid -c /etc/acpi/events -s /var/r
    root      1791  0.0  6.7  24084 21076 ?        S    08:00   0:00 /usr/lib/AntiVir/antivir --updater-daemon
    root      1829  0.0  0.5   4532  1856 ?        Ss   08:00   0:00 /usr/sbin/cupsd
    102       1836  0.0  0.2   2160   768 ?        Ss   08:00   0:00 /usr/bin/dbus-daemon-1 --system
    109       1874  0.0  0.3   5372  1004 ?        Ss   08:00   0:00 /usr/sbin/exim4 -bd -q30m
    root      1886  0.0  0.1   1624   356 ?        Ss   08:00   0:00 /usr/sbin/gpm -m /dev/input/mice -t exps2
    uucp      2005  0.0  0.4   4680  1388 ?        Ss   08:00   0:00 /usr/sbin/faxq
    uucp      2007  0.0  0.3   4360  1116 ?        Ss   08:00   0:00 /usr/sbin/hfaxd -i 4559
    uucp      2024  0.0  0.6   4788  1948 ?        S    08:00   0:00 /usr/sbin/faxgetty ttySL0
    root      2034  0.0  0.1   1748   552 ?        Ss   08:00   0:00 /usr/sbin/inetd
    daemon    2099  0.0  0.1   1824   408 ?        Ss   08:00   0:00 /usr/sbin/atd
    root      2106  0.0  0.2   2188   876 ?        Ss   08:00   0:00 /usr/sbin/cron
    root      2148  0.0  0.0   1424   168 ?        S    08:00   0:00 /usr/bin/vmnet-bridge -d /var/run/vmnet-bridg
    root      2158  0.0  0.2   2644   636 ?        Ss   08:00   0:00 /usr/bin/kdm
    root      2162  1.6  4.1  33132 13004 tty7     S<s+ 08:00   0:19  \_ /usr/X11R6/bin/X -br -nolisten tcp :0 vt7
    root      2189  0.0  0.4   3628  1372 ?        S    08:00   0:00  \_ -:0
    root      2216  0.0  0.3   4744  1232 ?        Ss   08:01   0:00      \_ /bin/sh /usr/bin/startkde
    root      2286  0.0  0.2   4472   708 ?        Ss   08:01   0:00          \_ /usr/bin/ssh-agent /usr/bin/ssh-a
    root      2287  0.0  0.2   4468   708 ?        Ss   08:01   0:00          \_ /usr/bin/ssh-agent /usr/bin/start
    root      2334  0.0  0.1   1560   336 ?        S    08:01   0:00          \_ kwrapper ksmserver
    

    STAT栏表示进程的状态,共有以下几种:

    • R-----运行中

    • S-----睡眠中

    • I-----停止

    • Z-----僵死

  3. kill

    kill命令可终止进程,后接进程号即可。如我们可用上面的ps命令查出你想终止的进程的进程号为299,用kill 299则可把该进程终止。 kill命令一些常用参数说明。

    • -1或-HUP,中止进程,如果进程是系统服务,则进程会重载配置文件并重启。

    • -15或-TERM,中止进程,并清除无用的文件和进程。这是最优雅地中止进程的方式。

    • -9或-KILL,强行中止进程,这是最粗暴地中止进程的方式。

  4. free

    free可显示系统的内存使用情况。-b、-k、-m三个参数表示以bytes,kilobytes和megabytes为单位显示内存的使用情况。

    debian:~# free -m
                 total       used       free     shared    buffers     cached
    Mem:          2010       2005          5        456        146       1150
    -/+ buffers/cache:        708       1301
    Swap:         2000        127       1872
    
  5. uptime

    uptime命令可以显示系统的运行状态信息,它可显示的内容有:系统已运行的时间,目前的登录用户数,系统在过去1分钟、5分钟和15分种内的平均负载。下面是一个示例。

    debian:~# uptime
     08:20:47 up 17 min,  1 user,  load average: 0.07, 0.28, 0.26
    

    上面信息表示现在的时间是08:20:47,系统已运行了17分种,有1个用户登录到系统,过去1分种、5分钟、15分钟的平均负载分别是0.07,0.28和0.26。

  6. sync

    强制把内存中缓存的数据写回硬盘,以防数据丢失。

  7. vmstat

    使用vmstat 2 命令可每隔2秒显示一行系统信息,这些信息包括CPU占用效、内存使用情况和磁盘IO等。通过它我们可实时监控系统的资源使用情况,进行系统优化。

    debian:~# vmstat 2
       procs                      memory    swap          io     system         cpu
     r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy  id
     0  0  0 130804   6000 149744 1179340   0   0     0     1    1     2   0   0   2
     0  0  0 130804   6000 149744 1179396   0   0    28   162  266   387   0   0 100
     0  0  0 130804   6000 149744 1179472   0   0    30   110  222   280   0   0  99
     1  0  0 130804   6000 149744 1179516   0   0    22   122  235   306   9   2  89
     0  0  0 130804   6000 149748 1179580   0   0    24   148  373   469  10   1  90
     1  0  0 130804   6000 149748 1179628   0   0    24    90  271   356  13   1  85
     1  0  0 130804   6000 149748 1179700   0   0    28   118  263   322  23   2  76
     0  0  0 130804   6000 149748 1179760   0   0    30   148  279   409  14   1  85
    
  8. sar

    sar工具可帮我们收集动态的系统信息,它的参数很丰富,功能强大。sar工具的特点是可通过计数器和计数间隔来定期、定量地输出系统状态信息。如:

    debian:~# sar -b 2 10
    
    09时47分48    tps      rtps      wtps   bread/s   bwrtn/s
    09时47分50    23.50      3.50     20.00     28.00    176.00
    09时47分52    47.50      6.50     41.00     52.00    424.00
    09时47分54    28.50      4.50     24.00     36.00    204.00
    09时47分56    52.00      9.50     42.50     76.00    352.00
    09时47分58    30.50      5.00     25.50     40.00    216.00
    09时48分00    28.50      4.50     24.00     36.00    204.00
    09时48分02    32.00      3.50     28.50     28.00    412.00
    09时48分04    46.00      5.50     40.50     44.00    388.00
    09时48分06    26.00      5.00     21.00     40.00    196.00
    
    09时48分06      tps      rtps      wtps   bread/s   bwrtn/s
    09时48分08    35.00      5.00     30.00     40.00    264.00
    Average:      34.95      5.25     29.70     42.00    283.60
    

    上面的命令表示隔2秒输出一条磁盘I/O信息,共输出10条。-b表示输出磁盘I/O信息,如果是-B则可输出paging信息,参数还很多,请用man sar查看。

  9. watch

    watch命令可重复执行某个命令,监控命令的执行状态。下面这个命令可让我们监控Z2.log文件的大小变化。

    debian:~# watch -n 3 du /home/Jims/zope/log/Z2.log
    

    -n 3表示每隔3秒执行一次du /home/Jims/zope/log/Z2.log。

  10. sysctl

    使用sysctl -a可显示所有运行中的内核参数,用sysctl -w fs.file-max=10240 命令可修改fs.file-max内核参数的值,并使参数马上生效。但重启系统后,参数设置会失效,因为命令行只能修改运行中的内核参数。如果我们要把参数设置固定下来,可把内核参数写入/etc/sysctl.conf文件。该文件的格式如下:

    # /etc/sysctl.conf - Configuration file for setting system variables
    # See sysctl.conf (5) for information.
    
    # Controls IP packet forwarding
    net.ipv4.ip_forward = 0
    
    # Controls source route verification
    net.ipv4.conf.default.rp_filter = 1
    
    # Controls the System Request debugging functionality of the kernel
    kernel.sysrq = 0
    
    # Controls whether core dumps will append the PID to the core filename.
    # Useful for debugging multi-threaded applications.
    kernel.core_uses_pid = 1
    
  11. ulimit

    使用ulimit -a可显示系统的资源限制情况。

    debian:~# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    max nice                        (-e) unlimited
    file size               (blocks, -f) unlimited
    pending signals                 (-i) unlimited
    max locked memory       (kbytes, -l) unlimited
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024            #最多可打开1024个文件
    pipe size            (512 bytes, -p) 8               #管道的最大值
    POSIX message queues     (bytes, -q) unlimited
    max rt priority                 (-r) unlimited
    stack size              (kbytes, -s) 8192            #堆栈的最大值
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) unlimited
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    
  12. lsof

    显示打开的文件,可按用户(lsof -u userid),按程序(lsof -c program)显示,下面的命令显示yangjing用户打开的文件。

    debian:~# lsof -u yangjing
    COMMAND  PID     USER   FD   TYPE DEVICE    SIZE   NODE NAME
    su      2492 yangjing  cwd    DIR    3,3    4096 585622 /home/yangjing
    su      2492 yangjing  rtd    DIR    3,3    4096      2 /
    su      2492 yangjing  txt    REG    3,3   27000 536692 /bin/su
    ....
    
  13. netstat

    netstat -nal可显示所有的网络连接。

    debian:~# netstat -nal
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 0.0.0.0:37              0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:9               0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:8010            0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:4559            0.0.0.0:*               LISTEN
    tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN
    tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
    tcp        0      0 192.168.6.195:38238     192.168.3.2:22          ESTABLISHED
    tcp        0      0 192.168.6.195:36031     192.168.3.4:5222        ESTABLISHED
    tcp        0      0 192.168.6.195:41702     192.168.3.2:445         ESTABLISHED
    tcp        0      0 192.168.6.195:41703     192.168.3.2:445         ESTABLISHED
    udp        0      0 0.0.0.0:9               0.0.0.0:*
    udp        0      0 0.0.0.0:68              0.0.0.0:*
    udp        0      0 0.0.0.0:8010            0.0.0.0:*
    udp        0      0 0.0.0.0:631             0.0.0.0:*
    Active UNIX domain sockets (servers and established)
    Proto RefCnt Flags       Type       State         I-Node Path
    unix  2      [ ACC ]     STREAM     LISTENING     2856     @/tmp/fam-root-
    unix  2      [ ACC ]     STREAM     LISTENING     3177     /tmp/orbit-root/linc-932-0-2094001684ddb
    unix  2      [ ACC ]     STREAM     LISTENING     3243     /tmp/orbit-root/linc-940-0-1af7207c191da
    unix  2      [ ACC ]     STREAM     LISTENING     2621     /tmp/.X11-unix/X0
    unix  2      [ ACC ]     STREAM     LISTENING     6049     /tmp/orbit-root/linc-d04-0-5643868fdcf06
    unix  2      [ ACC ]     STREAM     LISTENING     2742     /tmp/ssh-GdGZSq2216/agent.2216
    unix  2      [ ACC ]     STREAM     LISTENING     2745     /tmp/ssh-qKCByg2216/agent.2216
    unix  2      [ ACC ]     STREAM     LISTENING     2787     /tmp/ksocket-root/kdeinit__0
    unix  2      [ ACC ]     STREAM     LISTENING     2789     /tmp/ksocket-root/kdeinit-:0
    unix  2      [ ACC ]     STREAM     LISTENING     2800     /tmp/.ICE-unix/dcop2319-1158105681
    ...
    
  14. df

    df可以按文件系统显示磁盘的使用情况,如果带-h参数,则可以k,M,G这种直观的计量单位显示磁盘容量。

    debian:~# df -h
    文件系统              容量  已用 可用 已用% 挂载点
    /dev/hda3             9.4G  8.2G  742M  92% /
    devshm                153M     0  153M   0% /dev/shm
    //t02/yangjing         29G   26G  3.0G  90% /root/data
    //t02/books           236G  189G   47G  81% /root/books
    /dev/hda1             8.7G  7.5G  753M  92% /mnt/hda1
    
  15. du

    du可以按目录显示每个文件使用磁盘大小的情况,同样也可带-h参数,-c参数还可显示统计值。

    debian:~# du -hc python
    8.0K    python/pdb
    12K     python/zope3
    32K     python
    32K     总计
    
  16. pppstats

    使用pppstats可得到ppp连接的状态信息。

Apache2

Apache是Internet上应用最广的Web Server。Apache2是Apache1.x的升级版本,集成了大量最新的技术。

虚拟主机

Listen 80
Listen 8000

<VirtualHost *:80>
 ServerName www.example1.com
 DocumentRoot /var/www/example1
</VirtualHost>

<VirtualHost *:8000>             
 ServerName www.example2.com
 DocumentRoot /var/www/example2
</VirtualHost>

虚拟主机中的端口号需与Listen中定义的端口号对应。在Listen中定义过的监听端口才能在VirtualHost中使用。

性能调整

/etc/apache2/apache2.conf文件

<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 10000
</IfModule>

安全

  • 隐藏服务器版本信息

    #
    # ServerTokens
    # This directive configures what you return as the Server HTTP response
    # Header. The default is 'Full' which sends information about the OS-Type
    # and compiled in modules.
    # Set to one of:  Full | OS | Minor | Minimal | Major | Prod
    # where Full conveys the most information, and Prod the least.
    #
    ServerTokens Prod
    
    #
    # Optionally add a line containing the server version and virtual host
    # name to server-generated pages (internal error documents, FTP directory
    # listings, mod_status and mod_info output etc., but not CGI generated
    # documents or custom error documents).
    # Set to "EMail" to also include a mailto: link to the ServerAdmin.
    # Set to one of:  On | Off | EMail
    #
    ServerSignature Off
    

通过openldap服务器进行用户验证

这里介绍apache2.2通过openldap服务器进行用户验证的配置。

<Location /portal>
  AuthType Basic
  AuthName "TigerHead Portal System"
  AuthBasicProvider ldap                   #启用ldap验证功能
  AuthLDAPBindDN cn=admin,dc=com           #指定BindDN
  AuthLDAPBindPassword '12345'             #指定密码
  AuthLDAPURL ldap://127.0.0.1/dc=samba,dc=tigerhead,dc=com?uid?sub?     #指定ldap url
  Require ldap-filter &(uid=*)             #指定过滤条件
  SetHandler python-program
  PythonInterpreter portal
  PythonPath "['/data/moin/portal/'] + sys.path"
  PythonHandler MoinMoin.request::RequestModPy.run
</Location>

Apache2.0版中有关ldap验证的AuthLDAPEnabled和AuthLDAPAuthoritative指令都取消了。

Exim4邮件服务器

邮件系统基础知识

在实现安装邮件服务器之前,让我们先来学习一些邮件系统的基础知识。

一个完整的邮件系统应该包含三部份内容:邮件用户代理(MUA,Mail User Agent),邮件传送代理(MTA,Mail Transport Agent)和邮件分发代理(MDA,Mail Deliver Agent)。

  • MUA是mail、pine、mutt等程序,负责查看邮件、编写邮件和向MTA发送邮件。

  • MTA是sendmail,postfix,qmail和Exim等服务器,负责邮件在Internet中的传递,从一个MTA服务器发送到另一个MTA服务器。当一个MTA收到一封从另一个MTA传递过来的邮件时,如果邮件中的域名地址和本机域名地址一样,则MTA会把邮件收下来,保存在MTA的接收邮件队列中。如果邮件的域名地址与本机的不一样,则会根据域名进行转发,这个过程在mail系统中叫做relay。

  • MDA是procmail等程序,负责从MTA中收取邮件,并根据用户名保存到用户邮箱。

smtp和pop3是邮件系统中重要的一对协议,smtp用于发送邮件,pop3用于接收邮件。下面分别介绍它们的命令。

POP3 命令包括:
USER username 认证用户名
PASS password 认证密码认证,认证通过则状态转换
APOP name,digest 认可一种安全传输口令的办法,执行成功导致状态转换,请参见 RFC 1321 。
STAT 处理请求 server 回送邮箱统计资料,如邮件数、 邮件总字节数
UIDL n 处理 server 返回用于该指定邮件的唯一标识, 如果没有指定,返回所有的。
LIST n 处理 server 返回指定邮件的大小等
RETR n 处理 server 返回邮件的全部文本
DELE n 处理 server 标记删除,QUIT 命令执行时才真正删除
RSET 处理撤消所有的 DELE 命令
TOP n,m 处理 返回 n 号邮件的前 m 行内容,m 必须是自然数
NOOP 处理 server 返回一个肯定的响应
QUIT 希望结束会话。如果 server 处于"处理" 状态,则现在进入"更新"状态,删除那些标记成删除的邮件。如果 server 
处于"认可"状态,则结束会话时 server 不进入"更新"状态 。

SMTP 命令包括:
HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM 命令中指定的地址是发件人地址
RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。
DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应 OK
RSET 重置会话,当前传输被取消
QUIT 结束会话 

Exim4邮件服务器的工作原理

Exim4被设计成能高效地、不间断地在Internet上运行,而且能处理各种混合邮件。Exim4是如何投递邮件和接收邮件的呢?有何安全机制能确保邮件的安全呢?这节将简单介绍Exim4的工作原理。

Exim4处理的每封邮件都以一个16位字符的名称标识,该标识由三部份组成,以"-"号分隔,如:1GS3YU-0000zG-Nd。这些字符是经过base编码的,第一部份的原始信息是接收邮件的时间,第二部份的原始信息是接收邮件的进程id,第三部份的信息与配置文件中localhost_number的设置相关。标识名与时间和进程相关,有效保证了标识名的唯一性。

Exim4通过基于TCP/IP的SMTP协议从其它主机收取邮件。Exim4接收邮件后,会把邮件分成两个文件保存在spool目录,在我的机器上就是/var/spool/exim4/input/目录。这两个文件的命名规则是邮件标识后加-D和-H。以-D结尾的文件保存着邮件正文的信息,以-H结尾的文件保存邮件的头信息。在一些操作系统上,同一目录下包含太多的文件会造成性能问题,所以Exim4也可通过设置split_spool_directory选项,在input目录下再创建62个子目录来保存邮件信息。这62个子目录以单个字母和数字命名(26个小写字母+26个大写字母+10个数字共62个数字和字母)。这样的设置,使邮件的排队只在子目录下进行,而不是一个目录所有邮件。所以即使在邮件量不大的情况下也能效提升邮件系统的性能。

接收的邮件会停留在spool目录直到邮件被传递到接收者或被管理员删除。如果邮件不能被传递,则邮件会被打上"frozen"标记,并且不会再尝试投递该邮件。但管理员可以设置ignore_bounce_errors_after和timeout_frozen_after选项,指定一定时间后解除邮件的"frozen"状态。

当Exim4处理邮件时会把处理过程的日志信息保存在/var/log/exim4目录下。其中mainlog日志记录了大量的信息,从中我们可以跟踪Exim4处理邮件的过程。在一个大负载的服务器上,生成大量的日志信息会影响服务器的性能,所以我们也可以用no_message_logs参数禁止日志功能。

router和transport是Exim4传递邮件过程中两个重要的环节,router负责处理邮件地址,并把邮件传递给不同的transport作进一步处理,transport负责把spool中的邮件传递到目的地,完成投递过程。有两种的transport,一种是本地transport,它的目的地是文件或者本机管道(pipe);另一种transport是远程transport,它的目的地是远程主机。如果一封邮件有多个接收者,则它可能会通过多个transport进行投递。

router和transport都有不同的driver,实现不同的功能。

router drivers:

  • accept,

  • dnslookup,

  • ipliteral,

  • iplookup,

  • manualroute,

  • queryprogram,

  • redirect,

transport drivers:

  • appendfile,

  • autoreply,

  • lmtp,

  • pipe

  • smtp

安装与配置

用以下命令安装exim4邮件系统:

debian:#~ apt-get install exim4 exim4-config exim4-daemon-light

下载完成后会自动运行配置向导,我们也可运行dpkg-reconfigure exim4-confg命令配置Exim4服务器。exim4的配置文件位于/etc/exim4目录下,update-exim4.conf.conf文件的配置内容由上面的命令产生,经常改变的命令都集中在这里,而exim4.conf.template文件是Exim4的主配置文件,里面通过DEBCONFsomethingDEBCONF的方式引用update-exim4.conf.conf文档的something内容。

exim4.conf.template是Exim4的配置文件,它以分段的格式组织各配置参数。一般的配置参数放在配置文件的最开头,其它所有的可选配置参数都以"beging+段名"的形式作为段的开始标识。下面是一些可选段:

  • ACL,设置SMTP邮件的ACL(访问控制列表)。

  • authenticators,设置验证模式。

  • routers,设置不同的router,处理不同类型的邮件地址,并确定如何发送邮件。

  • transports,设置不同的transport,把信息传递到不同的目的地。

  • retry,设置重试的规则,当邮件不能马上投递时,我们可设置一些重试规则进行再次投递。

  • rewrite,定义邮件地址的重写规则。

  • local_scan,使用local_scan()函数的功能。要用LOCAL_SCAN_HAS_OPTIONS=yes选项开启。

exim4的配置文件有两种方式,一种是集中式的,所有的配置都集中在exim4.conf.template文件中,一种是分散式的,配置文件按功能不同分散成很多个文件存放在conf.d目录下。一般建议新手使用集中式。

下面是一个update-exim4.conf.conf的示例,它可通过debconf程序自动生成,生成后我们可用文本编辑器来修改它。这个示例把exim4配置成通过网上的smarthost来发送Internet邮件。

# /etc/exim4/update-exim4.conf.conf
#
# Edit this file and /etc/mailname by hand and execute update-exim4.conf
# yourself or use 'dpkg-reconfigure exim4-config'
#
# Please note that this is _not_ a dpkg-conffile and that automatic changes
# to this file might happen. The code handling this will honor your local
# changes, so this is usually fine, but will break local schemes that mess
# around with multiple versions of the file.
#
# update-exim4.conf uses this file to determine variable values to replace
# the DEBCONFsomethingDEBCONF strings in the configuration template files.
#
# Most settings found in here do have corresponding questions in the
# Debconf configuration, but not all of them.
#
# This is a Debian specific file

dc_eximconfig_configtype='smarthost'           #用smarthost发信;通过SMTP或fetchmail接收信件
dc_other_hostnames=''
dc_local_interfaces='127.0.0.1'                #只接收本机的SMTP请求,只在本机使用Exim4
dc_readhost=''
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='smtp.21cn.com'                   #远程的SMTP主机,我们通过它来发送邮件
CFILEMODE='644'
dc_use_split_config='false'                    #不使用分散方式的配置文件
dc_hide_mailname='false'
dc_mailname_in_oh='true'

编辑/etc/mailname文档,该文档记录你所发邮件的域名后缀。我的mailname只有一条记录,内容如下:

debian

运行update-exim4.conf命令可以测试/etc/exim4下的配置文件有没有语法错误,如果正常则会生成一个有效简洁的配置文件备份,保存在/var/lib/exim4/config.autogenerated文件中,方便我们查看。

用以下命令还可测试Exim4的配置有否出错:

debian:#~ exim4 -bV
Exim version 4.63 #1 built 23-Aug-2006 17:21:47
Copyright (c) University of Cambridge 2006
Berkeley DB: Sleepycat Software: Berkeley DB 4.3.29: (September  6, 2005)
Support for: crypteq iconv() IPv6 GnuTLS move_frozen_messages
Lookups: lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dsearch nis nis0 passwd
Authenticators: cram_md5 plaintext
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Configuration file is /var/lib/exim4/config.autogenerated

启动exim4

ebian:/etc/init.d# ./exim4 restart
Stopping MTA for restart: exim4_listener.
Restarting MTA: exim4.

本地邮件发送测试:

debian:~# exim4 -bt fax
R: system_aliases for fax@debian
R: userforward for fax@debian
R: procmail for fax@debian
R: maildrop for fax@debian
R: local_user for fax@debian
fax@debian
  router = local_user, transport = maildir_home

外部邮件发送测试:

debian:#~ exim4 -bt jims.yang@gmail.com
R: smarthost for jims.yang@gmail.com
jims.yang@gmail.com
  router = smarthost, transport = remote_smtp_smarthost
  host smtp.cdn.21cn.com [202.104.32.230]

测试通过后,我们就可正式发送邮件啦。为了清楚显示邮件的传送过程,我们使用了-v参数。fax是我系统上的一个用户,主机名为debian,所以fax用户的本机邮件地址就是fax@debian。

debian:~# exim4 -v fax@debian
from:root
to:fax@debian
subject:local mail test
test will be ok.
.
LOG: MAIN
  <= yjnet@21cn.com U=root P=local S=318
debian:~# delivering 1GQemL-0001eD-Pq
R: system_aliases for fax@debian
R: userforward for fax@debian
R: procmail for fax@debian
R: maildrop for fax@debian
R: local_user for fax@debian
T: maildir_home for fax@debian
LOG: MAIN
  => fax <fax@debian> R=local_user T=maildir_home
LOG: MAIN
  Completed

出现Completed说明邮件已发送成功,切换到fax用户我们就可以收到新的邮件啦。下面我们来试试发送Internet。在正式测试之前,我们还要做一些配置。因为通过smtp.21cn.com发送邮件是要经过用户验证的。

  • 把登录smtp.21cn.com的用户名和密码写入/etc/exim4/passwd.client文档。

    # password file used when the local exim is authenticating to a remote
    # host as a client.
    #
    # see passwd_client(5) for more documentation
    #
    # Example:
    ### target.mail.server.example:login:password
    smtp.cdn.21cn.com:yjnet:1234
    

    smtp.cdn.21cn.com是真正的stmp服务器名,而smtp.21cn.com是别名。在这里一定要用真正的smtp服务器名,否则验证不通过。如何知道真正的smtp服务器名呢?很简单,用我们最常用的ping命令即可。

    debian:~# ping smtp.21cn.com
    PING smtp.cdn.21cn.com (202.104.32.230): 56 data bytes
    

    yjnet是登录用户名,1234是登录密码。

  • 把系统用户对应的外部邮件地址写入/etc/exim4/email-addresses文件。

    # This is /etc/email-addresses. It is part of the exim package
    #
    # This file contains email addresses to use for outgoing mail. Any local
    # part not in here will be qualified by the system domain as normal.
    #
    # It should contain lines of the form:
    #
    #user: someone@isp.com
    #otheruser: someoneelse@anotherisp.com
    root:yjnet@21cn.com
    

    这里的外网邮件用户名yjnet要与passwd.client中的登录用户名yjnet一致。如果不一致,会造成个别mail client不能正常发送邮件。

  • exim4默认是不使用明文的验证方式的,因为明文的密码很容易在网上被截取。但smtp.cdn.21cn.com是使用明文验证的,所以我们要打开exim4的明文验证模式。修改/etc/exim4/exim4.conf.template,加入AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS = 1配置参数。添加参数时要注意,一定要把该参数放到本配置小节的最开头,这样在后面才能有效引用该参数。

    ######################################################################
    #                   AUTHENTICATION CONFIGURATION                     #
    ######################################################################
    
    begin authenticators
    
    ....
    
    # Because AUTH PLAIN and AUTH LOGIN send the password in clear, we
    # only allow these mechanisms over encrypted connections by default.
    # You can set AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS to allow unencrypted
    # clear text password authentication on all connections.
    
    AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS = 1
    
    ....
    

配置完成要重启exim4服务器使配置生效。下面我们就可测试用smtp.21cn.com服务器发邮件啦。

debian:~# exim4 -v jims.yang@gmail.com
from:yjnet@21cn.com
to:jims.yang@gmail.com
subject:test from exim4
测试邮件正文。
.
LOG: MAIN
  <= yjnet@21cn.com U=root P=local S=327
debian:~# delivering 1GQfnH-0001hE-PY
R: smarthost for jims.yang@gmail.com
T: remote_smtp_smarthost for jims.yang@gmail.com
Connecting to smtp.cdn.21cn.com [202.104.32.230]:25 ... connected
  SMTP<< 220 21cn.com SMTP Server 5 of AIMC 2.9.5.2 (DELAYED).
  SMTP>> EHLO debian
  SMTP<< 250-21cn.com, helo (DELAYED)
         250-EXPN
         250-HELP
         250-8BITMIME
         250-AUTH=LOGIN PLAIN
         250-AUTH LOGIN PLAIN
         250 XTMD
  SMTP>> AUTH PLAIN ****************
  SMTP<< 504 Unknown authentication mechanism
LOG: MAIN
  plain authenticator failed H=smtp.cdn.21cn.com [202.104.32.230] 504 Unknown authentication mechanism
  SMTP>> AUTH LOGIN
  SMTP<< 334 VXNlcm5hbWU6
  SMTP>> ********
  SMTP<< 334 UGFzc3dvcmQ6
  SMTP>> ********
  SMTP<< 235 OK Authenticated
  SMTP>> MAIL FROM:<yjnet@21cn.com> AUTH=root@debian
  SMTP<< 250 Ok
  SMTP>> RCPT TO:<jims.yang@gmail.com>
  SMTP<< 250 User <jims.yang@gmail.com> is not local, will forward to <64.233.167.114:25>.
  SMTP>> DATA
  SMTP<< 354 Start mail input; end with <CRLF>.<CRLF>
  SMTP>> writing message and terminating "."
  SMTP<< 250 Requested mail action okay, completed.  Message-ID=<E1GQfnH-0001hE-PY@debian>
  SMTP>> QUIT
LOG: MAIN
  => jims.yang@gmail.com R=smarthost T=remote_smtp_smarthost H=smtp.cdn.21cn.com [202.104.32.230]
LOG: MAIN
  Completed

成功发送。

安装Zope2.7

Zope是一个开源的、面向对象的Web服务器,主要用Python语言编写。在Debian平台上也有相应的软件包,安装方式也比其它平台简单很多。下面介绍一下Zope2.7的安装步骤:

  1. # apt-get install zope2.7

  2. 配置时会要回答几个问题,直接按回车选默认方式即可。软件会安装在/usr/lib/zope2.7目录下,实例目录是/var/lib/zope2.7/instance,实例目录开始为空,也就是说没有安装默认实例,需手动用mkzope2.7instanc程序安装。

  3. 用下面命令创建实例

    debian:~# mkzope2.7instance
    
    Quick reminder:
    To run zope on an instance of type >=2.7 , use
      /var/lib/zope2.7/instance/<instance>/bin/runzope
    To start the server on the instance, use
     ' /var/lib/zope2.7/instance/<instance>/bin/zopectl start '
    
    No instances were found in /var/lib/zope2.7/instance
    You may create one now
    Hit any key to go on, ctrl-c to stop      #直接回车创建一个新实例
    
    Please choose a directory in which you'd like to install
    Zope "instance home" files such as database files, configuration
    files, etc.
    
    Directory:/var/lib/zope2.7/instance/test  # 指定test实例目录
    Please choose a username and password for the initial user.
    These will be the credentials you use to initially manage
    your new Zope instance.
    
    Username: admin                           #创建zope初始用户  
    Password:
    Verify password:
    
    You may want to customize /var/lib/zope2.7/instance/<instance>/etc/zope.conf
    debian:~/instance#                        #test实例创建完成
    
  4. 启动实例

    debian:~#cd /var/lib/zope2.7/instance/test/bin
    debian:/var/lib/zope2.7/instance/test/bin#./zopectl start
    . daemon process started, pid=7811        #实例成功启动
    
  5. 实例启动后,就可用浏览器访问了,地址是http://localhost:9673。用创建实例时创建的始初用户和密码就可登录进管理界面进行系统管理。

安装Zope 3.1.0b1

Zope 3.1.0b1是Zope 3第一个正式发布的版本,它取消了X代号,表示Zope 3已逐渐成熟,可用于产品开发。Debian的Sarge版软件包还没有包含Zope 3,所以只能从源码安装。具体的安装步骤如下:

  • 首先,让我们来看一下Zope 3.1.0b1的系统要求。它要求Python 2.3.5或以上版本支持,并要安装有python-dev,该软件包提供编译Python模块所需的静态库、头文件和distutils工具。Debian默认是没有安装该软件包的,用apt-get install python-dev安装即可。如果没有python-dev软件包,在编译Zope 3时会出错,出错信息如下:

    error: invalid Python installation: unable to open /usr/lib/python2.3/config/Mak efile (No such file or directory)
    make: *** [build] 错误 1
  • 我下载的打包源码文件名为Zope-3.1.0b1.tgz,用以下命令安装:

    debian:~/inst# tar zxvf Zope-3.1.0b1.tgz
    debian:~/inst# cd Zope-3.1.0b1
    debian:~/inst/Zope-3.1.0b1# ./configure       
    
    Configuring Zope 3 installation
    
    Testing for an acceptable Python interpreter...
    
    Python version 2.3.5 found at /usr/bin/python
    
    The optimum Python version (2.3.5) was found at /usr/bin/python.
    debian:~/inst/Zope-3.1.0b1# make
    /usr/bin/python install.py -q build
    debian:~/inst/Zope-3.1.0b1# make test      #测试会出错,但也可安装
    /usr/bin/python install.py -q build
    /usr/bin/python test.py -v
    Running UNIT tests at level 1
    Running UNIT tests from /root/inst/Zope-3.1.0b1/build/lib.linux-i686-2.3
    ...............................................................................
    debian:~/inst/Zope-3.1.0b1# make install           #默认安装到/usr/local/Zope-<version>目录
    /usr/bin/python install.py -q build
    /usr/bin/python install.py -q install --skip-build --home "/usr/local/Zope-3.1.0b1"
    
  • 安装完成后,就要创建Zope实例。

    debian:/usr/local/Zope-3.1.0b1/bin# ./mkzopeinstance
    Please choose a directory in which you'd like to install Zope
    'instance home' files such as database files, configuration files,
    etc.
    
    Directory: /var/lib/zope3.1.0b1                            #输入实例的路径
    
    Please choose a username for the initial administrator account.
    This is required to allow Zope's management interface to be used.
    
    Username: admin                                            #创建管理员
    
    Please provide a password for the initial administrator account.
    
    Password:                                                  #设置管理员密码
    Verify password:
    debian:/usr/local/Zope-3.1.0b1/bin# ./runzope&
    ------
    2005-06-21T00:29:03 WARNING ZODB.FileStorage Ignoring index for /var/lib/zope3.1.0b1/var/Data.fs
    ------
    2005-06-21T00:29:03 INFO PublisherHTTPServer zope.server.http (HTTP) started.
            Hostname: debian
            Port: 8080
    ------
    2005-06-21T00:29:03 INFO PublisherFTPServer zope.server.ftp started.
            Hostname: debian
            Port: 8021
    ------
    2005-06-21T00:29:03 INFO root Startup time: 17.049 sec real, 16.400 sec CPU
    
  • 用浏览器访问http://localhost:8080/即可进入Zope 3,用刚才创建实例时设置的用户和密码即可以管理员身份登录ZMI。

Zope 3的安装已完成,Zope 3与Zope 2在设计思路上有很大的不同,我们需花时间熟悉一下Zope 3的管理界面和开发方法。

Zope3.1已发布,从源码编译安装的方法和上面介绍的一样。在Debian的Sid系统中已可用apt-get命令安装Zope3包了,大大简化了安装过程。

安装MySQL数据库

MySQL是最著名的开源数据库,现在正在开发的5.0版将具有大量的新特性,如存储过程和事务处理等。MySQL的性能正一步步地迫近Oracle、DB2等商业大型数据库,给这些产品造成了很大的压力。

在Debian中安装MySQL服务器是很方便的,使用apt-get命令即可完成。

debian:~# apt-get install mysql-server mysql-client

mysql-server是服务器程序,mysql-client是客户端程序。我们可通过客户端程序来管理服务器,也可通过一些开源的GUI程序来维护服务器,如phpmyadmin,mysqlcc等。推荐使用phpmyadmin这个B/S的管理程序,通过浏览器就可方便高效地管理网络上的数据库。

有关MySQL数据库的管理使用请参考本站的MySQL学习笔记。

安装Samba服务器

Samba服务器是Linux平台上的Windows文件服务器和打印服务器,可供Windows用户或Linux用户共同使用,是Linux与Windows之间信息沟通的桥梁。安装命令如下:

debian~:# apt-get install samba smbclient

samba是服务器软件包,smbclient是客户端软件包,可选安装。Samba服务器的配置文件叫smb.conf,位于/etc/samba/目录下。在/usr/share/samba/目录下也有一个smb.conf文件备份,如果你在配置服务器时把/etc/samba/smb.conf改乱了,就可以用该文件来恢复到初始状态。启动脚本位于/etc/init.d/目录下,叫samba,如果修改了smb.conf配置文件,可用samba restart命令重启Samba服务器。

/etc/default/samba文件可设置samba服务器的启动方式,是daemons还是inetd,默认的设置是采用daemons方式的:

# Defaults for samba initscript
# sourced by /etc/init.d/samba
# installed at /etc/default/samba by the maintainer scripts
#

#
# This is a POSIX shell fragment
#

# How should Samba (smbd) run? Possible values are "daemons"
#       or "inetd".
RUN_MODE="daemons"

关闭服务器可用smbcontrol这个程序。命令格式如下:

debian:~# smbcontrol smbd shutdown

为使Samba服务器正常使用,还需作一些设置。

  • 在系统中创建test用户

    debian~:# useradd -m test
    
  • 增加samba用户

    debian~:# smbpasswd -a test
    

    Note

    samba的用户名必须与Linux系统的用户名一致,但密码可以不同。用户登录Sabma服务器时的密码是使用sabpasswd程序设置的密码。

  • 修改/etc/samba/smb.conf文件,把安全级别设置成用户级。这样,连接Samba服务器的每个用户都需提供用户名和密码。我们还要启用加密密码功能,这样NT以上的系统才能正常连接Samba服务器。下面是一个配置文件示例。

    #
    # Sample configuration file for the Samba suite for Debian GNU/Linux.
    #
    #
    # This is the main Samba configuration file. You should read the
    # smb.conf(5) manual page in order to understand the options listed
    # here. Samba has a huge number of configurable options most of which
    # are not shown in this example
    #
    # Any line which starts with a ; (semi-colon) or a # (hash)
    # is a comment and is ignored. In this example we will use a #
    # for commentary and a ; for parts of the config file that you
    # may wish to enable
    #
    # NOTE: Whenever you modify this file you should run the command
    # "testparm" to check that you have not many any basic syntactic
    # errors.
    #
    
    #======================= Global Settings =======================
    
    [global]
    
    ## Browsing/Identification ###
    
    # Change this to the workgroup/NT-domain name your Samba server will part of
       workgroup = DEBIAN_FANS
    
    # server string is the equivalent of the NT Description field
       server string = %h server (Samba %v)
    
    # Windows Internet Name Serving Support Section:
    # WINS Support - Tells the NMBD component of Samba to enable its WINS Server
    ;   wins support = no
    
    # WINS Server - Tells the NMBD components of Samba to be a WINS Client
    # Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
    ;   wins server = w.x.y.z
    
    # This will prevent nmbd to search for NetBIOS names through DNS.
       dns proxy = no
    
    # What naming service and in what order should we use to resolve host names
    # to IP addresses
    ;   name resolve order = lmhosts host wins bcast
    
    
    #### Debugging/Accounting ####
    
    # This tells Samba to use a separate log file for each machine
    # that connects
       log file = /var/log/samba/log.%m
    
    # Put a capping on the size of the log files (in Kb).
       max log size = 1000
    
    # If you want Samba to only log through syslog then set the following
    # parameter to 'yes'.
    ;   syslog only = no
    
    # We want Samba to log a minimum amount of information to syslog. Everything
    # should go to /var/log/samba/log.{smbd,nmbd} instead. If you want to log
    # through syslog you should set the following parameter to something higher.
       syslog = 0
    
    # Do something sensible when Samba crashes: mail the admin a backtrace
       panic action = /usr/share/samba/panic-action %d
    
    
    ####### Authentication #######
    
    # "security = user" is always a good idea. This will require a Unix account
    # in this server for every user accessing the server. See
    # /usr/share/doc/samba-doc/htmldocs/ServerType.html in the samba-doc
    # package for details.
       security = user
    
    # You may wish to use password encryption.  See the section on
    # 'encrypt passwords' in the smb.conf(5) manpage before enabling.
       encrypt passwords = yes
    
    # If you are using encrypted passwords, Samba will need to know what
    # password database type you are using.
       passdb backend = tdbsam guest
    
       obey pam restrictions = yes
    
    ;   guest account = nobody
       invalid users = root
    
    # This boolean parameter controls whether Samba attempts to sync the Unix
    # password with the SMB password when the encrypted SMB password in the
    # passdb is changed.
    ;   unix password sync = no
    
    # For Unix password sync to work on a Debian GNU/Linux system, the following
    # parameters must be set (thanks to Augustin Luton <aluton@hybrigenics.fr> for
    # sending the correct chat script for the passwd program in Debian Potato).
       passwd program = /usr/bin/passwd %u
       passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n .
    
    # This boolean controls whether PAM will be used for password changes
    # when requested by an SMB client instead of the program listed in
    # 'passwd program'. The default is 'no'.
    ;   pam password change = no
    
    
    ########## Printing ##########
    
    # If you want to automatically load your printer list rather
    # than setting them up individually then you'll need this
    ;   load printers = yes
    
    # lpr(ng) printing. You may wish to override the location of the
    # printcap file
    ;   printing = bsd
    ;   printcap name = /etc/printcap
    
    # CUPS printing.  See also the cupsaddsmb(8) manpage in the
    # cupsys-client package.
    ;   printing = cups
    ;   printcap name = cups
    
    # When using [print$], root is implicitly a 'printer admin', but you can
    # also give this right to other users to add drivers and set printer
    # properties
    ;   printer admin = @ntadmin
    
    
    ######## File sharing ########
    
    # Name mangling options
    ;   preserve case = yes
    ;   short preserve case = yes
    
    
    ############ Misc ############
    
    # Using the following line enables you to customise your configuration
    # on a per machine basis. The %m gets replaced with the netbios name
    # of the machine that is connecting
    ;   include = /home/samba/etc/smb.conf.%m
    
    # Most people will find that this option gives better performance.
    # See smb.conf(5) and /usr/share/doc/samba-doc/htmldocs/speed.html
    # for details
    # You may want to add the following on a Linux system:
    #         SO_RCVBUF=8192 SO_SNDBUF=8192
       socket options = TCP_NODELAY
    
    # The following parameter is useful only if you have the linpopup package
    # installed. The samba maintainer and the linpopup maintainer are
    # working to ease installation and configuration of linpopup and samba.
    ;   message command = /bin/sh -c '/usr/bin/linpopup "%f" "%m" %s; rm %s' &
    
    # Domain Master specifies Samba to be the Domain Master Browser. If this
    # machine will be configured as a BDC (a secondary logon server), you
    # must set this to 'no'; otherwise, the default behavior is recommended.
    ;   domain master = auto
    
    # Some defaults for winbind (make sure you're not using the ranges
    # for something else.)
    ;   idmap uid = 10000-20000
    ;   idmap gid = 10000-20000
    ;   template shell = /bin/bash
    
    #======================= Share Definitions =======================
    
    [homes]
       comment = Home Directories
       browseable = yes
    
    # By default, the home directories are exported read-only. Change next
    # parameter to 'yes' if you want to be able to write to them.
       writable = no
    
    # File creation mask is set to 0700 for security reasons. If you want to
    # create files with group=rw permissions, set next parameter to 0775.
       create mask = 0700
    
    # Directory creation mask is set to 0700 for security reasons. If you want to
    # create dirs. with group=rw permissions, set next parameter to 0775.
       directory mask = 0700
    
    # Un-comment the following and create the netlogon directory for Domain Logons
    # (you need to configure Samba to act as a domain controller too.)
    ;[netlogon]
    ;   comment = Network Logon Service
    ;   path = /home/samba/netlogon
    ;   guest ok = yes
    ;   writable = no
    ;   share modes = no
    
    [printers]
       comment = All Printers
       browseable = no
       path = /tmp
       printable = yes
       public = no
       writable = no
       create mode = 0700
    
    # Windows clients look for this share name as a source of downloadable
    # printer drivers
    [print$]
       comment = Printer Drivers
       path = /var/lib/samba/printers
       browseable = yes
       read only = yes
       guest ok = no
    # Uncomment to allow remote administration of Windows print drivers.
    # Replace 'ntadmin' with the name of the group your admin users are
    # members of.
    ;   write list = root, @ntadmin
    
    # A sample share for sharing your CD-ROM with others.
    ;[cdrom]
    ;   comment = Samba server's CD-ROM
    ;   writable = no
    ;   locking = no
    ;   path = /cdrom
    ;   public = yes
    
    # The next two parameters show how to auto-mount a CD-ROM when the
    #       cdrom share is accesed. For this to work /etc/fstab must contain
    #       an entry like this:
    #
    #       /dev/scd0   /cdrom  iso9660 defaults,noauto,ro,user   0 0
    #
    # The CD-ROM gets unmounted automatically after the connection to the
    #
    # If you don't want to use auto-mounting/unmounting make sure the CD
    #       is mounted on /cdrom
    #
    ;   preexec = /bin/mount /cdrom
    ;   postexec = /bin/umount /cdrom
    
    [d]
    writable = yes
    path = /mnt/hda5
    valid users = root         #指定有效用户,只有root用户能访问该共享目录。
    create mask = 0660
    directory mask = 0770
    

这样,最基本的Samba服务器就设置好了,在Windows上就可用test用户名访问Samba服务器上的/home/test目录了。我们还设置了一个共享目录d,指向本机的/mnt/hda5目录。该共享只能由root用户访问。当然,同test用户一样,在连接前要先用smbpasswd -a root命令创建叫root的samba用户。在Linux下我们可以用smbclient //samba_server/sharename命令访问samba服务器共享目录。

Samba服务器的功能是很强大的,有关Samba服务器的详细配置和使用介绍请参考网站上的Samba学习笔记。

Note

由于网卡驱动的问题会严重影响samba服务器的网络下载速度,我试过r8168的卡如果用了r8169的驱动就会出现这个问题。上传速度没问题,但下载速度慢了几乎有10倍。

设置磁盘配额

我们可通过quota来设置磁盘的配额,限定某个用户只能使用有限的硬盘空间,这在文件服务器和邮件服务器上是很常用的。Linux通过quota程序支持磁盘配额,它以分区(partition)为单位进行设置的。设置步骤如下:

  • 确定内核支持quota功能,然后下载安装quota程序。

    debian:~# apt-get install quota
    
  • 修改/etc/fstab文件,在分区上启用quota功能。我的home目录是放到一个单独的分区中的,我现在要在该分区中启用quota,则需把fstab中的:

    LABEL=/home      /home         ext3    defaults      1 2
    

    改成:

    LABEL=/home      /home         ext3    defaults,usrquota,grpquota      1 2
    
    

    usrquota和grpquota是新增的内容,表示在该分区内启用用户配额(usrquota)和组配额(grpquota)。用户配额可限制某个用户可使用的磁盘空间,组配额可限制某个组所有成员总共可使用的磁盘空间。

    重新启动系统或重新安装分区,使fstab里的配置生效,我们可查看/etc/mtab文件以确定我们的修改是否生效,下面是一个生效后mtab文件。

    debian:~#mount -a -o remount        #重新安装分区
    debian:~# vi /etc/mtab
    /dev/sda1 / ext3 rw 0 0
    none /proc proc rw 0 0
    usbdevfs /proc/bus/usb usbdevfs rw 0 0
    none /dev/pts devpts rw,gid=5,mode=620 0 0
    /dev/sda2 /home ext3 rw,usrquota,grpquota 0 0   #启用了quota
    none /dev/shm tmpfs rw 0 0
    /dev/sda3 /usr ext3 rw 0 0
    /dev/sda6 /data ext3 rw 0 0
    
  • 运行quotacheck程序收集磁盘资料,并在/home目录下生成aquota.group和aquota.user文件。

    debian:~# quotacheck -cavug
    

    如果出现# quotacheck: Cannot get quotafile name for /dev/sda1的情况,请先手工在/home目录下创建这两个文件,然后再运行上面这个命令。

    debian:/home#touch aquota.group;touch aquota.user
    

    这是quota的一个Bug,但不影响正常使用。

  • 现在我们可以启动quota了,执行以下命令即可。

    debian:~# quotaon -av
    
  • 接下来要针对用户设置配额了,我们可使用edquota命令来做。

    debian:~# edquota -u test
    Disk quotas for user test (uid 513):
    Filesystem       blocks       soft       hard     inodes     soft     hard
      /dev/sda2        28          0          0         6        0        0
    

    这是test用户还没设置配额时的情况,soft表示软限制,当我们使用磁盘时可以超过该值,但要在指定的期间内将磁盘的容量降到soft以下;hard表示硬限制,用户使用磁盘是绝对不能超过该值的。所以soft的值是要低于hard值的,相当于给用户一个缓冲的区间。这里有两对soft和hard,前一对以blocks为单位设置,后一对以inodes为单位设置。如果以inodes设置,则可限制用户可创建的文件和文件夹的数量。我们一般使用blocks来设置磁盘配额。设置完成后的情况如下。

    Disk quotas for user test (uid 513):
    Filesystem       blocks       soft       hard     inodes     soft     hard
      /dev/sda2        28         20480      30720         6        0        0
    

    设置的容量是以K为单位的,这里的软限制设置了20M,硬限制设置了30M。blocks和inodes下的数值是系统自动计算出来的,代表当前用户已使用的blocks和inodes。如果soft和hard为0则表示没有设置限额。

  • 设置soft的宽限期间用edquota -t命令,该设置是针对分区设置的,不能细化到用户。

  • quotaoff命令用来关闭quotaoff,在关机或重启机器时,请先用该命令关闭quota。

  • quotastats命令可显示quota的状态信息。

  • repquota命令可用来显示分区中各用户的配额使用情况。

安装OpenLDAP目录服务器

在Debian系统中安装openldap是很简单的,它有一个配置向导可帮我们快速建立一个目录服务。安装命令如下:

debian:~# apt-get install slapd ldap-utils

与目录服务相关的软件包系统会自动安装。安装完成后,系统会自动运行一个配置向导,依次回答以下问题即可:

Domain name         #目录的根
Organization name   #根下的组织
Admin password      #目录服务器的管理员密码
Verify password     #验证密码
Allow LDAPv2 protocol     #是否允许LDAPv2

配置完成后,可用以下命令测试目录服务器:

debian:~# ldapsearch -x -b 'cn=admin,dc=com'
# extended LDIF
#
# LDAPv3
# base <cn=admin,dc=com> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# admin, com
dn: cn=admin,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

dc=com是我的目录服务器的根,cn=admin,dc=com是我的目录服务器的根管理员。这个管理员在我的目录服务器中拥有像Linux系统中root一样的权限。

推荐使用phpldapadmin这Web管理程序来管理ldap服务器。有关openldap的详细配置说明和使用请参考网站上的openldap学习笔记。

安装HylaFAX传真服务器

HylaFAX是一个开放源码的传真服务器,它可为企业提供一个强大而可靠的传真服务。HylaFAX基于C/S架构,在局域网内只要有一台连接FAX Modem的HylaFAX传真服务器,就可为局域网内所有的用户提供传真功能。作为企业应用,高负载能力是必须具备的,HylaFAX可连接多台Modem,为企业提高优异的传真性能。

安装

在Debian系统中提供一个HylaFAX-server软件包,用以安装HylaFAX服务器。在安装该软件包前,请用上文介绍的工具和方法确定Modem在你的Debian系统中能正常工作。下面是具体的安装步骤:

  • 安装服务器软件包和一些工具软件:

    debian:~# apt-get install hylafax-server hylafax-client
    
  • 安装完软件包后,hylafax还不能运行,还要运行faxsetup命令配置你的传真服务器。该配置过程会检测Modem的传真功能并要求输入传真机的一些参数,如国家码、地区码和本机号码等。最后faxsetup还会生成一个faxmaster的用户,该用户负责管理传真服务器。配置完成后,HylaFAX服务应该已启动了,以后每次重启动服务器都会自动运行。

    HylaFAX的启动脚本名叫hylafax,位于/etc/init.d/目录下。在该目录下运行./hylafax start命令可以手动启动HylaFAX传真服务器。HylaFAX正常启动后会产生三个进程,用ps命令可以查看:

    uucp      5139  0.0  0.4   6976  1392 ?        Ss   16:53   0:00 /usr/sbin/faxq
    uucp      5141  0.0  0.3   4372  1116 ?        Ss   16:53   0:00 /usr/sbin/hfaxd -i 4559
    uucp      5149  0.0  0.6   7088  2004 pts/2    S    16:53   0:00 /usr/sbin/faxgetty ttyS0
    
  • 现在,我们可用faxstat命令来查询服务器状态。

    debian:~# faxstat
    Password:
    HylaFAX scheduler on debian: Running
    Modem ttyS0 (85789877): Running and idle
    
  • 出现以上信息说明服务器已正常运行,我们可用sendfax命令来测试一下发送传真。

    debian:~# sendfax -n -d 88886666 test.ps
    

    test.txt文档就通过我们的HylaFAX传真服务器发送到88886666传真机上了。我们可到/var/spool/hylafax/log查看发送的日志。

  • 接收的传真会自动保存在/var/spool/hylafax/recvq目录下,文件格式是tif的。tif是一种图形文档格式,我们可以用支持tif文档格式的看图软件直接打开,有些看图软件打开tif会变形,而Windows自带的图片查看器可以完美支持tif文档。我们也可以用fax2ps程序把tif格式文档转换到ps格式文档,再用ghostview浏览。

传真服务器已安装完成,但要在企业中投入正常使用,还需进一步的配置。

配置

hylafax的配置文档位于/etc/hylafax目录下,而实际的工作目录是/var/spool/hylafax,接收到的传真和一些日志信息都保存在该目录。该目录下还有一个etc目录,内容与/etc/hylafax的一样,但我们不要手动修改这个目录中的配置文件,而是要修改/etc/hylafax目录下的,否则启动服务器会出错。每当我们修改了/etc/hylafax目录的配置文件后,重启hylafax都会自动把/etc/hylafax中修改过的文件拷贝到/var/spool/hylafax/etc/目录,完成同步。

/etc/hylafax目录下几个重要的配置文件说明:

  • hfaxd.conf,HylaFAX Client-Server Protocol Configuration。

  • hyla.conf,System-wide client configuration file

  • config.ttyS0,FAX端口的配置文件。

faxaddmodem,用于添加或修改Modem配置

用info hylafax-config命令可以查看config.ttyS0的配置参数说明。下面是我的config.ttyS0配置文件的内容。我的Modem是一个外置的Modem,接到COM1上。

CountryCode:            86       #国际区号
AreaCode:               020      #国内区号
FAXNumber:              85528685 #传真号码
LongDistancePrefix:     1
InternationalPrefix:    011
DialStringRules:        /etc/hylafax/dialrules
ServerTracing:          1
SessionTracing:         11
RecvFileMode:           0600     #接收到的传真文档的访问权限
LogFileMode:            0600     #日志文档的访问权限
DeviceMode:             0600     #设备的访问权限
RingsBeforeAnswer:      4        #响4声后才开始传真
SpeakerVolume:          off
GettyArgs:              "-h %l dx_%s"
LocalIdentifier:        "NothingSetup"
TagLineFont:            etc/lutRS18.pcf
TagLineFormat:          "From %%l|%c|Page %%P of %%T"
MaxRecvPages:           25
#
#
# Modem-related stuff: should reflect modem command interface
# and hardware connection/cabling (e.g. flow control).
#
ModemType:              Class1          # use this to supply a hint
ModemRate:              19200           # rate for DCE-DTE communication
ModemFlowControl:       rtscts          # default
#
ModemNoFlowCmd:         AT&K0           # setup no flow control
ModemHardFlowCmd:       AT&K3           # setup hardware flow control
ModemSoftFlowCmd:       AT&K4           # setup software flow control
ModemSetupDTRCmd:       AT&D2           # setup so DTR drop resets modem
ModemSetupDCDCmd:       AT&C1           # setup so DCD reflects carrier (or not)
#
ModemMfrQueryCmd:       !Rockwell
ModemModelQueryCmd:     !RC288DPi
ModemRevQueryCmd:       ATI3            # product information
#
ModemDialCmd:           ATDT%s          # T for tone dialing

如果使用分机,在发送传真前要先拔一个号码。以拔号码9为例,则应该这样设置:1、不检测拔号音,2、设置:ModemDialCmd: ATDT9W%s。

faxadduser,添加用户,这里指的用户是指访问HylaFAX传真服务的用户,和系统用户是不同的。

probemodem,用于检测Modem信息。

xferfaxstats可显示发送传真的统计信息。recvstats可显示接收传真的统计信息。

手动模拟收到传真后的自动处理过程,通过这种模拟我们可以测试faxrcvd脚本。

debian:#~ cd /var/spool/hylafax
debian:#~ ./bin/faxrcvd recvq/fax000000011.tif ttyS0 "000000032" ""

000000032是接收ID号,log目录下的日志文件名就是由字母"c"+接收ID号组成的。

http://www.hylafax.org/howto/faxrcvd/中有几个转换pdf格式文档和发送邮件的faxrcvd脚本可供参考。

安装Jabberd服务器

Jabber是一个IM(即时通信)服务器,使用开放的XMPP协议,它的信息流是XML格式的,可实现跨平台通信。通过Jabber转换器,Japper还可与MSN,Yahoo等即时通信服务器连接。一举打破现时IM平台互不兼容的格局。Google talk就是使用Jabber/XMPP来实现的。

Jabber服务器软件有很多种,具体可到这个网址查询:http://www.jabber.org/software/servers.shtml。其中jabberd是用C写的一个Jabber服务器,在Debian中有一个jabber软件包可安装jabberd1.4.3服务器。现在最新的jabberd是2.x版本的,包含了jabber的最新功能,但支持的组件较少,jabberd1.4.x版本中没有包含最新的功能,如不支持SASL。但它的支持组件很多,而且很稳定。所以这里我以jabberd1.4.3版的jabberd服务器进行介绍。

用Debian标准的软件安装方法即可完成软件包的下载和安装。

debian:~# apt-get install jabber

安装完软件后,jabberd服务就会自动启动。我们可用telnet程序与服务器连接测试一下服务器是否能正常工作。

debian:~# telnet localhost 5222   #5222是jabberd服务的默认端口号
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

在上面的状态下输入以下xml文本内容:

<stream:stream
  to='localhost'
  xmlns='jabber:client'
  xmlns:stream='http://etherx.jabber.org/streams'>

按回车,jabber服务器会显示如下信息:

<?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' id='431E92B1' xmlns='jabber:client' from='localhost'>

如果出现如下的信息,则说明jabberd服务器已正常运行。我们可用</stream:stream>语句关闭信息流,退同telnet状态。。

下面我们可以开始配置jabber服务器。jabber的配置文件在/etc/jabber目录下,叫jabber.xml。首先,我们需配置主机名,上面我们是用localhost主机名来测试的。正式使用的话需要有一个唯一的名称来标识该服务器。用vi程序打开该文件,找到这句:

 <host><jabberd:cmdline flag="h">localhost</jabberd:cmdline></host>

把localhost改成你的主机名,我的主机名是debian,存盘退出。现在我们就可用主机名来访问jabberd服务了,如:

debian:~# telnet debian 5222
Trying 127.0.0.1...
Connected to debian.      #主机名已改变
Escape character is '^]'.

现在我们可以添加一个jabber帐号了,我们可以通过gaim之类的jabber客户端软件自动添加,也可手动方法添加。下面介绍用telnet手动添加的方法,这种方法可让我们详细了解jabberd服务的添加用户的处理过程。

debian:~# telnet debian 5222
Trying 127.0.0.1...
Connected to debian.
Escape character is '^]'.
<stream:stream 
to="debian"
xmlns="jabber:client"
xmlns:stream="http://etherx.jabber.org/streams">

系统显示以下信息:

<?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' id='431E9B0B' xmlns='jabber:client' from='debian'>

使用以下XML查询注册需提供些什么信息:

<iq id='reg1' type='get'>
  <query xmlns='jabber:iq:register'/>
</iq>

查询的结果如下:

<iq id='reg1' type='result'>
  <query xmlns='jabber:iq:register'><password/><password/>
        <instructions>Choose a username and password to register with this server.</instructions>
        <name/>
        <email/>
      <username/></query>
</iq>

这里显示注册需提供password,username,email和name四项信息。下面我把按要求把注册信息发给服务器:

<iq id="reg2" type="set">
<query xmlns="jabber:iq:register">
<username>test</username>
<password>12345</password>
<name>test</name>
<email>test@debian</email>
</query>
</iq>     #在这里按回车,如果出现以下信息,则说明注册成功。
<iq id='reg2' type='result'/>

每个注册用户的信息保存在/var/lib/jabber/目录下。现在我们可以用刚注册的帐号登录jabber服务器了,在登录之前,我们可用以下XML命令查询服务器登录需要些什么信息:

<iq id="auth1" type="get">
<query xmlns="jabber:iq:auth">
<username>test</username>
</query>
</iq>

返回的信息如下:

<iq id='auth1' type='result'>
<query xmlns='jabber:iq:auth'>
<username>test</username>
<digest/><password/><resource/></query>
</iq>

<digest/>和<password/>分别表示加密格式的密码和纯文本格式的密码,只需选其中一种即可。<resource>是必须填的,表示连接服务的资源,如我们现在采用的telnet。登录的XML命令如下,我们采用的是不加密的密码方式:

<iq id="auth2" type="set">
<query xmlns="jabber:iq:auth">
<username>test</username>
<password>12345</password>
<resource>telnet</resource>
</query>
</iq>         #这里按回车,如果出现以下信息,则说明登录成功。
<iq id='auth2' type='result'/>

最后,我们要把test用户切换到在线状态。

<presence/>          #按回车后会显示以下的欢迎信息
<message from='debian' to='test@debian'>
        <subject>Welcome!</subject>
        <body>Welcome to the Jabber server -- we hope you enjoy this service! For information about how to us
e Jabber, visit the Jabber User&apos;s Guide at http://jabbermanual.jabberstudio.org/</body>
      <x xmlns='jabber:x:delay' from='test@debian' stamp='20050907T08:01:29'>Offline Storage</x></message>

现在,我们就可发送和接收信息了。发送信息的XML命令格式如下:

<message to="jims@debian">
<body>hello jims</body>
</message>

如果jims用户已在gaim中登录,则会显示“hello jims”的信息。如果在gaim中发一条叫“hello test,this m essage form gaim.”给test@debian,则会在telnet里收到如下格式的信息:

<message type='chat' to='test@debian/telnet' from='yangjing@debian/Gaim'><x xmlns='jabber:x:event'><composing
/></x><body>hello test,this message form gaim.</body><html xmlns='http://jabber.org/protocol/xhtml-im'><body 
xmlns='http://www.w3.org/1999/xhtml'>hello test,this message form gaim.</body></html></message>

用以下命令可退出会话:

</stream:stream>

从上面的信息可以看到,在jabber传送的信息流是XML格式的。这为jabber服务的扩展提供了很好的发展空间。

安装Jabberd2服务器

jabberd2服务器还没正式进入Debian的软件包,但我们可从源码开始安装。下面介绍如何在Debian平台中如何从源码安装jabberd-2.0s10。这里的2.0s10表示jabberd2.0的第十个stable发行版。

  • 到jabberd的官方网站下载最新的软件包jabberd-2.0s10.tar.gz。用tar -zxvf jabberd-2.0s10.tar.gz命令解压后会在当前目录下生成jabberd-2.0s10目录。

  • 进入源码目录,我们就可以用configure工具配置软件包。但在配置前,先要安装一些支持软件包,分别是libssl-dev和libidn11-dev,还有libmysqlclient14-dev,该软件包用于支持Mysql数据库作为后台数据存储和用户验证,如果你想通过ldap目录服务器来进行用户认证,则还需安装libldap2-dev软件包。准备好后,运行以下命令配置jabberd2:

    debian:~/inst/jabberd-2.0s10# ./configure --prefix=/usr/local/jabberd2 --enable-ldap --enable-debug
    

    配置成功后,运行make和make install即可把软件安装到/usr/local/jabberd2目录中。

  • 现在可以配置服务器了,jabberd2的配置文件位于/usr/local/jabberd2/etc/jabberd目录下,配置文件的文本是XML格式的。现在我们要修改sm.xml和c2s.xml这两个配置文件,把真实的服务器名写到这两个配置文件中:

    修改sm.xml文件,把id标签内的localhost改成真实服务器名
    <!-- Session manager configuration -->
    <sm>
      <!-- Our ID on the network. Users will have this as the domain part of
           their JID. If you want your server to be accessible from other
           Jabber servers, this ID must be resolvable by DNS.s
           (default: localhost) -->
      <id>localhost</id>
    
    ...
    
    修改c2s.xml文件,也是把id标签内的localhost改成真实服务器名
    
    ...
    
     <!-- Local network configuration -->
      <local>
        <!-- Who we identify ourselves as. This should correspond to the
             ID (host) that the session manager thinks it is. You can
             specify more than one to support virtual hosts, as long as you
             have additional session manager instances on the network to
             handle those hosts. The realm attribute specifies the auth/reg
             or SASL authentication realm for the host. If the attribute is
             not specified, the realm will be selected by the SASL
             mechanism, or will be the same as the ID itself. Be aware that
             users are assigned to a realm, not a host, so two hosts in the
             same realm will have the same users.
             If no realm is specified, it will be set to be the same as the
             ID. -->
        <id>localhost</id>
    
    ...
    
    
  • jabberd2默认使用MySQL来存放数据和进行用户认证。所以我们还要配置MySQL数据库,为jabberd2增加相应的数据库和表。jabberd2软件包已为我们提供了一个MySQL脚本自动完成数据库和表的创建。这个脚本位于源码目录下的tools目录中,文件名是db-setup.mysql。该目录还有针对不同数据库(Oracle、PostgreSQL)的脚本可用。我们以管理员身份登录MySQL服务器,用以下命令运行db-setup.mysql脚本。在运行脚本前,请确保该脚本在当前目录下。

    debian:~/inst/jabberd-2.0s10/tools# mysql
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 68 to server version: 4.0.24_Debian-10sarge1-log
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> \. db-setup.mysql
    Query OK, 1 row affected (0.00 sec)
    
    Database changed
    Query OK, 0 rows affected (0.13 sec)
    
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 0 rows affected (0.02 sec)
    ...
    

    创建完数据库和表后,我们还要配置该数据库的访问权限,很简单,运行以下命令即可:

    mysql> grant select,insert,delete,update on jabberd2.* to jabberd2@localhost identified by '123456';
    Query OK, 0 rows affected (0.00 sec)
    

    现在我们就在MySQL数据库创建一个jabberd2用户,密码是123456。该用户可以在jabberd2数据库中做select,insert,delete,update操作。为了使jabberd2服务器能登录该数据库,我们还需用"jabberd2"和"123456"这两个参数更新sm.xml和c2s.xml两个配置文件的相关内容。

    修改sm.xml文件
    ...
    <!-- Storage database configuration -->
      <storage>
        <!-- By default, we use the MySQL driver for all storage -->
        <driver>mysql</driver>
    
        <!-- Its also possible to explicitly list alternate drivers for
             specific data types. -->
        <!-- Store vcards in a PostgreSQL database instead -->
        <!--
        <driver type='vcard'>pgsql</driver>
        -->
    
        <!-- MySQL driver configuration -->
        <mysql>
          <!-- Database server host and port -->
          <host>localhost</host>
          <port>3306</port>
    
          <!-- Database name -->
          <dbname>jabberd2</dbname>
    
          <!-- Database username and password -->
          <user>jabberd2</user>
          <pass>123456</pass>
    ...
    
    修改c2s.xml
    
    ...
     <!-- MySQL module configuration -->
        <mysql>
          <!-- Database server host and port -->
          <host>localhost</host>
          <port>3306</port>
    
          <!-- Database name -->
          <dbname>jabberd2</dbname>
    
          <!-- Database username and password -->
          <user>jabberd2</user>
          <pass>123456</pass>
        </mysql>
    ...
    
    
  • 最后一步,根据sm.xml或c2s.xml中pidfile标签的内容创建进程ID目录。在我的机器上sm.xml配置文件中pidfile标签的内容如下:

     <pidfile>/usr/local/jabberd2/var/jabberd/pid/sm.pid</pidfile>
    

    创建pid目录的命令如下:

    debian:/usr/local/jabberd2# mkdir -p var/jabberd/pid/
    

    是否创建该目录对服务器的正常运行没有影响,只是有了该目录后,当服务器运行时,在该目录下会生成jabberd2服务进程Id文件,我们可跟踪jabberd2服务器的进程Id号。

  • 启动服务器

    debian:/usr/local/jabberd2/bin# ./jabberd
    

    如果启动不成功,可查询系统日志或用-D选项启动服务器。

服务器启动后,我们就可用Gaim等客户端连接它。具体操作和上一节内容一样,这里就不再讲了。

除了上面介绍的使用MySQL数据库作为用户认证数据库外,我们还可使用LDAP目录服务进行用户认证。下面介绍具体的配置过程,我选用的LDAP服务器是OpenLDAP,版本号是2.2.23-8。

  • 要使jabberd2使用LDAP目录服务,需在源码配置时加--enable-ldap选项,并安装libldap2-dev软件包。

  • 配置c2s.xml文件以支持ldap认证:

    ...
     <!-- Authentication/registration database configuration -->
      <authreg>
        <!-- Backend module to use -->
        <module>ldap</module>               #启用ldap认证模块,默认是MySQL
    
        <!-- Registration configuration -->
        <register>
          <!-- Account registration is enabled by default (provided the
               auth/reg module in use supports it). Comment this out to
               disable. -->
               
       <!--   <enable/> -->  #注释该行,禁止用户自由注册,启用ldap认证后,该功能失效。jabberd2暂时还不支持在LDAP服务器上创建用户信息。
    
    ...
    
    <!-- LDAP module configuration -->      #开始配置LDAP服务参数
        <ldap>
          <!-- LDAP server host and port (default: 389) -->
          <host>Ldap_server</host>          #配置LDAP服务器主机名
          <port>389</port>                  #配置LDAP服务器端口
    
          <!-- Use LDAP v3 if possible. If disabled, v2 will be used.
               Encryption options are only available if v3 is enabled. -->
          <!--
          <v3/>
          -->
    
          <!-- Encryption. If enabled, this will create an encrypted channel
               to the LDAP server using the LDAP STARTTLS mechanism. -->
          <!--
          <starttls/>
          -->
    
          <!-- Encryption. If enabled, this will create an encrypted channel
               to the server using the old-style "ldaps://" mechanism. It is
               recommended that you use <starttls/> instead of this. -->
          <!--
          <ssl/>
          -->
    
          <!-- DN to bind as for searches. If unspecified, the searches
               will be done anonymously. -->
    
          <binddn>cn=admin,dc=com</binddn>    #配置登录LDAP服务器的DN
          <bindpw>123456</bindpw>             #配置登录密码
    
    
          <!-- LDAP attribute that holds the user ID (default: uid) -->
          <uidattr>uid</uidattr>              #配置用户认证属性
    
          <!-- base DN of the tree. You should specify a DN for each
               authentication realm declared in the <local/> section above,
               by using the realm attribute. -->
          <basedn realm=''>dc=user,dc=company,dc=com</basedn>  #配置搜索路径起点
         <!-- <basedn>o=Example Corp.</basedn> -->
        </ldap>
    
    ...
    
  • 配置sm.xml文件,启用auto-create功能,自动始初化会话。

    ...
      <!-- User options -->
      <user>
        <!-- By default, users must explicitly created before they can start
             a session. The creation process is usually triggered by a c2s
             component in response to a client registering a new user.
    
             Enableing this option will make it so that a user create will be
             triggered the first time a non-existant user attempts to start
             a session. This is useful if you already have users in an
             external authentication database (eg LDAP) and you don't want
             them to have to register. -->
    
        <auto-create/>          
    #该功能只在禁用公开注册,采用外部验证数据库时启用,开启该功能后,当用户第一次登录时,jabberd2会自动把用户信息插入到active表。
    #如果开启公开注册功能,则应该禁用该功能,用户信息会在注册时自动插入到active表。
    ...
    
  • 配置完成后,重启Jabberd2服务器,如果配置正确,可在系统日志/var/log/message文件看到以下信息:

    ...
    
    Nov 24 11:33:17 t03 jabberd/sm[29600]: initialised storage driver 'mysql'     #成功连接MySQL数据库
    Nov 24 11:33:17 t03 jabberd/sm[29600]: version: jabberd sm 2.0s10
    
    ...
    
    Nov 24 11:33:17 t03 jabberd/c2s[29602]: starting up
    Nov 24 11:33:17 t03 jabberd/c2s[29602]: process id is 29602, written to /usr/local/jabberd2/var/jabberd/pid/c2s.pid
    Nov 24 11:33:17 t03 jabberd/c2s[29602]: ldap: configured 1 realms
    Nov 24 11:33:17 t03 jabberd/c2s[29602]: initialised auth module 'ldap'        #成功连接LDAP服务器
    Nov 24 11:33:17 t03 jabberd/c2s[29602]: [t03.tigerhead] configured; realm=(null)
    

在jabberd2中,我们可以设置默认的好友列表模板,当用户第一次登录系统时就会自动获得该列表,不用手动一个用户一个用户地添加。要启用该功能,首先要在sm.xml配置文件的内进行配置。jabberd2默认是没有打开该功能的,我们只要在sm.xml文件中把template内的roster标签前的注释符删除即可。如:

...
    <!-- Templates. If defined, the contents of these files will be
         stored in the users data store when they are created. -->
    <template>

        <roster>/usr/local/jabberd2/etc/jabberd/templates/roster.xml</roster>

    </template>
...

从上面的配置可以看以,默认的模块是存放在/usr/local/jabberd2/etc/jabberd/templates/roster.xml目录下的。我们编辑roster.xml文件,按以下格式添加用户列表。

<!-- This is the roster template. If enabled in sm.xml, new users will
     get this roster by default. -->
<query xmlns='jabber:iq:roster'>
  <!--
  <item name='Helpdesk' jid='helpdesk@localhost' subscription='both'><group>Support</group></item>
  -->
  <item name='ringkee' jid='ringkee@company.com' subscription='both'><group>IT</group></item>
  <item name='diu167' jid='diu167@company.com' subscription='both'><group>IT</group></item>
  <item name='dongrui' jid='dongrui@company.com' subscription='both'><group>IT</group></item>
  <item name='sally' jid='sally@company.com' subscription='both'><group>IT</group></item>
  <item name='xmr' jid='xmr@company.com' subscription='both'><group>IT</group></item>
</query>

上面设置了一个IT组,里面有5个用户。修改roster.xml文件后,不用重启服务器就可使修改生效。当用户首次登录时,这5个用户列表会自动下载到客户端。这种下载动作只会在用户首次登录系统时发生。当用户第一次登录时,jabberd2会在active表中插入一条记录,记录登录的用户帐号名和登录时间等信息。jabberd2以此判断用户是否第一次登录。同时把模板中的用户列表信息按登录用户的不同保存在roster-items和roster-groups两个表中。当用户第二次登录时,jabberd2在active中可以查询到用户帐号信息,就不会再把模板中的用户列表信息保存到roster-items和roster-groups表中。而是直接下载roster-items和roster-groups表中的用户列表信息来使用。当用户在客户端手工删除用户列表后,jabberd2会直接删除roster-items和roster-groups表中的用户列表信息。这样,下次用户登录时就找不到用户列表了,所以我们不要随便删除用户列表信息。为了使删除后的用户列表能重新下载或更新,我们可在active表中删除该用户的帐号记录。下次用户登录系统时,系统还会把你当成是首次登录,又会自动下载模板中的用户列表。

jabberd2系统的所有信息都保存在MySQL数据库的jabberd2数据库中。一面介绍jabberd2数据库各个表的作用。

  • active表,存放用户名和用户第一次登录的时间。表中的记录在用户第一次登录系统时插入,以后用户登录系统不影响该记录的内容。

  • authreg表,当选择MySQL数据库作为jabberd2的用户验证数据库时,该 表才有意义。它用以存放用户的验证信息,如用户名、密码和范围。

  • disco-items表,记录离线信息。

  • logout表,记录用户最近的登出信息,包括jid和时间戳。

  • motd-message表,记录XML格式的MOTD(Message Of The Day)信息。

  • motd-message表,记录接收的MOTD信息内容,包括jid和时间戳。

  • privacy-default表,

  • privacy-items表,

  • private表,以XML格式存放用户的私人信息,如收藏夹、爱好等。

  • queue表,存放排序信息。

  • roster-groups表,保存已分组的用户列表信息。

  • roster-items表,保存用户列表信息,包含验证状态信息。

  • vacation-setting表,

  • vcard表,保存用户帐号信息,包含用户名、住址、URL和职务等。

jabberd2服务器由一系列的进程组成,各进程互相依赖。如果要手动杀死jabberd2进程,则要按一定的顺序。如:

#!/bin/bash
killall router
killall resolver
killall c2s
killall s2s
killall sm

由于Jabber协议的开放性,造就了众多的开源的Jabber客户端,在http://www.jabber.org上有一个Jabber Client软件的列表可供参考。我试过几种,从功能和中文支持上推荐PsiGaim两种。还有一个基于Web的Jabber客户端jwchat,它利用punjab这个HTTP jabber client接口和Ajax技术,可在浏览器上登录jabber服务器进行即时通信。jwchat网站上有一个Demo,大家可以去看看,很不错的。但我没安装成功,有谁成功安装,请指点一二。

MoinMoin服务器

MoinMoin是用Python语言写的一个开源WiKi服务器,由德国人开发,基于GNU GPL协议发布。MoinMoin的软件架构很灵活,通过Python能很容易进行功能扩展,现在已开发出大量的Plugins。MoinMoin不使用后台数据库存放数据,而是以文本的形式存放在服务器目录中。debin Wiki网站使用的WiKi系统就是MoinMoin。Moin是德国北部方言"好"、"早上好"的意思,MoinMoin是"很好"的意思。

安装配置

MoinMoin不带Web服务器,需与Web服务器配合才能进行WiKi页面的发布。MoinMoin支持的Web服务器有Apache+CGI、Apache+FastCgi、Apache+Mod_Python、IIS、TwistedWeb和WebLogic等。下面介绍一下MoinMoin+TwistedWeb和Apache2+Mod_Python两种方式在Debian系统下的安装过程。

  • 在安装MoinMoin前请安装好Python,最好使用最新的版本。安装MoinMoin的命令如下:

    debian:~# apt-get install python2.4-moinmoin moinmoin-common
    

    Note

    安装软件包时要注意版本问题,2.3的包不能和2.4的包混用。

    MoinMoin的源码被安装到/usr/lib/python2.4/site-packages/MoinMoin目录。/usr/share/moin目录存放MoinMoin系统的模板,内容大致有以下几类:

    • /usr/share/moin/data目录存放WiKi Pages,Users,etc。只能被MoinMoin访问。

    • /usr/share/moin/underlay目录存放默认的WiKi Pages,有多种语言版本的帮助文档、默认页面文档等。只能被MoinMoin访问。

    • /usr/share/moin/htdocs目录存放网页元素,如图片、主题风格等。可被Web Server访问

    • /usr/share/moin/server目录存放服务器启动脚本示例。

    • /usr/share/moin/config目录存放配置文件示例。

    通过拷贝模板目录中的文件,就可生成不同的WiKi实例。MoinMoin的软件升级也很简单,只需用新版的模板文件下覆盖旧文就可以了。

  • 创建MoinMoin实例

    在服务器上创建一个目录用于存放实例,目录名不能是wiki,它已被系统保留使用,一个不错的选择是mywiki。

    debian:~# mkdir mywiki
    

    从模板目录拷贝实例所需文件。

    debian:~# cp -rf /usr/share/moin/data ~/mywiki
    debian:~# cp -rf /usr/share/moin/underlay ~/mywiki
    debian:~# cp /usr/share/moin/config/wikiconfig.py ~/mywiki
    
  • 设置实例目录权限

    Debian中的MoinMoin系统默认使用www-data用户运行WiKi服务器。所以我们的权限设置是:

    debian:~# chown -R www-data.www-data ~/mywiki
    debian:~# chmod -R ug+rw ~/mywiki
    debian:~# chmod -R o-rwx ~/mywiki
    
  • 配置TwistedWeb方式,这里介绍的MoinMoin版本是1.3.1的。

    • 首先,我们要安装好twisted,安装命令如下:

      debian:~# apt-get install python2.4-twisted python2.4-twisted-bin
      
    • 安装完Twisted后,就可以开始配置了。TwistedWeb的MoinMoin配置文件是mointwisted.py,执行文件是mointwisted,这两个文件我们可从模板目录拷贝到实例目录。如:

      debian:~# cp /usr/share/moin/server/mointwisted mointwisted.py ~/mywiki
      

      用vim等文本编辑器打开mointwisted.py配置文件,需修改两个地方,以指向正确的配置文件路径,修改后的内容如下:

      """
          twisted.web based wiki server
      
          Run this server with mointwisted script on Linux or Mac OS X, or
          mointwisted.cmd on Windows.
          
          @copyright: 2004-2005 Thomas Waldmann, Oliver Graf, Nir Soffer
          @license: GNU GPL, see COPYING for details.
      """
      
      # System path configuration
      
      import sys
      
      # Path of the directory where wikiconfig.py is located.
      # YOU NEED TO CHANGE THIS TO MATCH YOUR SETUP.
      #sys.path.insert(0, '/etc/moin')
      sys.path.insert(0,'/root/mywiki')     #修改1:指向你的wikiconfig.py文件所在的目录
      # Path to MoinMoin package, needed if you installed with --prefix=PREFIX
      # or if you did not use setup.py
      
      # Path to the directory where farmconfig is located (if different).
      #sys.path.insert(0, '/etc/moin')      #修改2:注释掉该行内容,从1.5版开始已默认注释该行
      
      # Debug mode - show detailed error reports
      ## import os
      ## os.environ['MOIN_DEBUG'] = '1'
      
      from MoinMoin.server.twistedmoin import TwistedConfig, makeApp
          
          
      class Config(TwistedConfig):
          
          # Server name
          # Used to create .log, .pid and .prof files
          name = 'mointwisted'
          
          # Path to moin shared files (default '/usr/share/moin/wiki/htdocs')
          docs = '/usr/share/moin/htdocs'
      
          # The server will run with as this user and group (default 'www-data')
          user = 'www-data'                   
          group = 'www-data'
      
          # Port (default 8080)
          # To serve privileged port under 1024 you will have to run as root
          port = 8080                         
      
          # Interfaces (default [''])
          # The interfaces the server will listen to. 
          # [''] - listen to all interfaces defined on the server
          # ['red.wikicolors.org', 'blue.wikicolors.org'] - listen to some
          # If '' is in the list, other ignored.
          interfaces = ['']
      
          # How many threads to use (default 10, max 20)
          # The more threads you use, the more memory moin uses. All thread
          # use one CPU, and will not run faster, but might be more responsive
          # on a very busy server.
          threads = 10
      
          # Set logfile name (default commented)
          # This is the *Apache compatible* log file, not the twisted-style logfile.
          # Leaving this as None will have no Apache compatible log file. Apache
          # compatible logfiles are useful because there are quite a few programs
          # which analyze them and display statistics.
          ## logPath = 'mointwisted.log'
      
          # Memory profile (default commented)
          # Useful only if you are a developer or interested in moin memory usage
          ## from MoinMoin.util.profile import TwistedProfiler
          ## memoryProfile = TwistedProfiler('mointwisted',
          ##                            requestsPerSample=100,
          ##                            collect=0)
      
          # Hotshot profile (default commented)
          # Not compatible with threads.
          ## hotshotProfile = name + '.prof'
      
      
      # Create the application
      application = makeApp(Config)
      
    • 配置MoinMoin Wiki系统

      Single Wiki的配置文件是wikiconfig.py,位于实例目录下,它默认已可很好工作。它的内容如下:

      # -*- coding: utf-8 -*-                 #为了在MoinMoin中使用中文,请用utf-8编码
      # IMPORTANT! This encoding (charset) setting MUST be correct! If you live in a
      # western country and you don't know that you use utf-8, you probably want to
      # use iso-8859-1 (or some other iso charset). If you use utf-8 (a Unicode
      # encoding) you MUST use: coding: utf-8
      # That setting must match the encoding your editor uses when you modify the
      # settings below. If it does not, special non-ASCII chars will be wrong.
          
      """ 
          MoinMoin - Configuration for a single wiki
          
          If you run a single wiki only, you can omit the farmconfig.py config
          file and just use wikiconfig.py - it will be used for every request
          we get in that case.
          
          Note that there are more config options than you'll find in
          the version of this file that is installed by default; see
          the module MoinMoin.multiconfig for a full list of names and their
          default values.
          
          Also, the URL http://moinmoin.wikiwikiweb.de/HelpOnConfiguration has
          a list of config options.
          
          @copyright: 2000-2005 by Juergen Hermann <jh@web.de>
          @license: GNU GPL, see COPYING for details.
      """ 
          
      from MoinMoin.multiconfig import DefaultConfig
      
          
      class Config(DefaultConfig):
          
          # Wiki identity ----------------------------------------------------
          
          # Site name, used by default for wiki name-logo [Unicode]
          sitename = u'Untitled Wiki'      #你的WiKi网站的名称
          
          # Wiki logo. You can use an image, text or both. [Unicode]
          # Example: u'<img src="/wiki/mywiki.png" alt="My Wiki">My Wiki'
          # For no logo or text, use ''
          logo_string = sitename           #WiKi的logo
          
          # The interwiki name used in interwiki links
          interwikiname = None
          
          
          # Critical setup  ---------------------------------------------------
      
          # Misconfiguration here will render your wiki unusable. Check that
          # all directories are accessible by the web server or moin server.
          
          # If you encounter problems, try to set data_dir and data_underlay_dir
          # to absolute paths.
          
          # Where your mutable wiki pages are. You want to make regular
          # backups of this directory.
          data_dir = './data/'
          
          # Where read-only system and help page are. You might want to share
          # this directory between several wikis. When you update MoinMoin,
          # you can safely replace the underlay directory with a new one. This
          # directory is part of MoinMoin distribution, you don't have to
          # backup it.
          data_underlay_dir = './underlay/'
      
          # This must be '/wiki' for twisted and standalone. For CGI, it should
          # match your Apache Alias setting.
          url_prefix = '/wiki'
          
          
          # Security ----------------------------------------------------------
          
          # Security critical actions (disabled by default)
          # Uncomment to enable options you like.
          allowed_actions = ['DeletePage', 'AttachFile', 'RenamePage']  #允许删除、上传和改名操作,操作受ACL约束。
      
          # Enable acl (0 to disable)
          acl_enabled = 1                            #开启ACL(访问控制列表)功能
      
          # IMPORTANT: grant yourself admin rights! replace YourName with
          # your user name. See HelpOnAccessControlLists for more help.
          # All acl_rights_xxx options must use unicode [Unicode]
          acl_rights_before = u"YourName:read,write,delete,revert,admin"   #替换YourName,该用户具有管理员权限。
      
          # Link spam protection for public wikis (Uncomment to enable)
          # Needs a reliable internet connection.
          #from MoinMoin.util.antispam import SecurityPolicy
      
      
          # Mail --------------------------------------------------------------
      
          # Configure to enable subscribing to pages (disabled by default)
          # or sending forgotten passwords.
      
          # SMTP server, e.g. "mail.provider.com" (empty or None to disable mail)
          mail_smarthost = ""
      
          # The return address, e.g "My Wiki <noreply@mywiki.org>"
          mail_from = ""
      
          # "user pwd" if you need to use SMTP AUTH
          mail_login = ""
      
      
          # User interface ----------------------------------------------------
      
          # Add your wikis important pages at the end. It is not recommended to
          # remove the default links.  Leave room for user links - don't use
          # more than 6 short items.
          # You MUST use Unicode strings here, but you need not use localized
          # page names for system and help pages, those will be used automatically
          # according to the user selected language. [Unicode]
          navi_bar = [                                         #FrontPage中的导航栏,可根据自已需求增减。
              # Will use page_front_page, (default FrontPage)
              u'%(page_front_page)s',
              u'RecentChanges',
              u'FindPage',
              u'HelpContents',
          ]
      
          # The default theme anonymous or new users get
          theme_default = 'modern'                             #默认的页面风格
      
          # Language options --------------------------------------------------
      
          # See http://moinmoin.wikiwikiweb.de/ConfigMarket for configuration in 
          # YOUR language that other people contributed.
      
          # The main wiki language, set the direction of the wiki pages
          default_lang = 'zh'                                  #默认语言
      
          # You must use Unicode strings here [Unicode]        #页面默认正则式,
          page_category_regex = u'^Category[A-Z]'              #以Category字符串开头的页面是分类页面
          page_dict_regex = u'[a-z]Dict$'                      #以Dict字符串结束的页面是字典页面
          page_form_regex = u'[a-z]Form$'                      #以Form字符串结尾的页同是表单页面
          page_group_regex = u'[a-z]Group$'                    #以Group字符串结尾的页面是组页面
          page_template_regex = u'[a-z]Template$'              #以Template字符串结尾的页同是模板页面
      
          # Content options ---------------------------------------------------
      
          # Show users hostnames in RecentChanges
          show_hosts = 1
      
          # Enumerate headlines?
          show_section_numbers = 0
      
          # Charts size, require gdchart (Set to None to disable).
          chart_options = {'width': 600, 'height': 300}
      

      完整的配置选项可在MoinMoin/multiconfig.py文件找到,wikiconfig.py中的配置就是继承它的。multiconfig.py文件里的选项是默认配置,不要去修改它。如果我们要修改这些默认配置,可在wikiconfig.py中重新设置它即可。

      multiconfig.py中一些默认权限配置选项说明:

      • acl_enabled = 1选项配置是否记用ACL,1表示启用,0表示不启用。

      • acl_rights_default = u"Trusted:read,write,delete,revert Known:read,write,delete,revert All:read,write"选项设置了默认的WiKi页面权限。当WiKi页面没有设置ACL是,就统一采用该设置。

      • acl_rights_before = u""选项中的权限设置优先级高于WiKi页面中ACL的设置和上面的默认ACL设置。所以一般在该选项中配置我们MoinMoin系统的管理员。该选项默认在multiconfig.py文件中没有设置。我们要在MoinMoin实例中的wikiconfig.py文件中设置,具体设置请见上同的wikiconfig.py示例。

      • acl_rights_after = u""选项中的权限设置优先级低于WiKi页面中ACL的设置和上面的默认ACL设置。

      • acl_rights_valid = ['read', 'write', 'delete', 'revert', 'admin']选项列出了可以设置权限。

      • allowed_actions = []选项设置允许的系统定义操作。这些操作有删除页面、页面改名和上传附件等。这些操作的访问权限也会页面的ACL约束。

      • attachments = None选项设置可通过浏览器直接访问附件。如果要设置该选项,请确保上传到Web服务器上的附件不能被执行。设置方法可参考http://moinmoin.wikiwikiweb.de/HelpOnConfiguration/FileAttachments的内容。

    • 启动MoinMoin WiKi服务器

      debian:~/mywiki# ./mointwisted start
      

      在当前目录会生成一个叫twistd.log的日志文件。如果成功启动,日志文件的内容为:

      2005/12/13 11:48 CST [-] Log opened.
      2005/12/13 11:48 CST [-] twistd 2.0.1 (/usr/bin/python2.4 2.4.2) starting up
      2005/12/13 11:48 CST [-] reactor class: twisted.internet.selectreactor.SelectReactor
      2005/12/13 11:48 CST [-] Loading mointwisted.py...
      2005/12/13 11:48 CST [-] Enabling Multithreading.
      2005/12/13 11:48 CST [-] Loaded.
      2005/12/13 11:48 CST [-] MoinMoin.server.twistedmoin.MoinSite starting on 8080
      2005/12/13 11:48 CST [-] Starting factory <MoinMoin.server.twistedmoin.MoinSite instance at 0xb76004cc>
      2005/12/13 11:48 CST [-] set uid/gid 33/33
      

      MoinMoin成功启动后,在浏览器上打开http://server_name:8080网址即可访问。停止服务器用stop参数即可。用不带参数的mointwisted命令可以查看命令参数,如:

      debian:~/mywiki# ./mointwisted 
      error: nothing to do
      
      mointwisted - MoinMoin daemon
      
      usage: mointwisted command
      
      commands:
        start     start the server
        stop      stop the server
        restart   stop then start the server
        kill      kill the server
      
      @copyright: 2004-2005 Thomas Waldmann, Nir Soffer
      @license: GNU GPL, see COPYING for details.
      
  • Apache2+Mod_Python方式,这里我选用了最新的1.5版的MoinMoin软件包。

    • 第一步要先安装Mod_Python模块,要求使用mod_python 3.1.3或以上版本的Mod_Python模块。安装命令如下:

      debian:~# apt-get install libapache2-mod-python2.3
      

      下载完软件包后Debian系统会自动进行软件包的配置,回答"Yes"启用Mod_Python模块。这样在/etc/apache2/mods-enabled目录下会创建一个链接到/etc/apache2/mods-available/mod_python.load文件。该文件配置了装载mod_python模块的语句,如:

      LoadModule python_module /usr/lib/apache2/modules/mod_python.so
      
    • 第二步是创建WiKi实例,步骤同上。

    • 第三步是配置wikiconfig.py,内容如下:

      # -*- coding: utf-8 -*-                         #使用UTF-8编码
      # IMPORTANT! This encoding (charset) setting MUST be correct! If you live in a
      # western country and you don't know that you use utf-8, you probably want to
      # use iso-8859-1 (or some other iso charset). If you use utf-8 (a Unicode
      # encoding) you MUST use: coding: utf-8
      # That setting must match the encoding your editor uses when you modify the
      # settings below. If it does not, special non-ASCII chars will be wrong.
      
      """
          MoinMoin - Configuration for a single wiki
      
          If you run a single wiki only, you can omit the farmconfig.py config
          file and just use wikiconfig.py - it will be used for every request
          we get in that case.
      
          Note that there are more config options than you'll find in
          the version of this file that is installed by default; see
          the module MoinMoin.multiconfig for a full list of names and their
          default values.
      
          Also, the URL http://moinmoin.wikiwikiweb.de/HelpOnConfiguration has
          a list of config options.
      
          ** Please do not use this file for a wiki farm. Use the sample file
          from the wikifarm directory instead! **
      
          @copyright: 2000-2005 by Juergen Hermann <jh@web.de>
          @license: GNU GPL, see COPYING for details.
      """
      
      from MoinMoin.multiconfig import DefaultConfig
      
      
      class Config(DefaultConfig):
      
          # Wiki identity ----------------------------------------------------
      
          # Site name, used by default for wiki name-logo [Unicode]
          sitename = u'Untitled Wiki'                   #你的WiKi网站的名称
      
          # Wiki logo. You can use an image, text or both. [Unicode]
          # For no logo or text, use '' - the default is to show the sitename.
          # See also url_prefix setting below!
          logo_string = u'<img src="/wiki/common/moinmoin.png" alt="MoinMoin Logo">'    #网站Logo
      
          # name of entry page / front page [Unicode], choose one of those:
      
          # a) if most wiki content is in a single language
          #page_front_page = u"MyStartingPage"
      
          # b) if wiki content is maintained in many languages
          page_front_page = u"FrontPage"                #启用首页
      
          # The interwiki name used in interwiki links
          #interwikiname = 'UntitledWiki'
          # Show the interwiki name (and link it to page_front_page) in the Theme,
          # nice for farm setups or when your logo does not show the wiki's name.
          #show_interwiki = 1
      
      
      
          # Critical setup  ---------------------------------------------------
      
          # Misconfiguration here will render your wiki unusable. Check that
          # all directories are accessible by the web server or moin server.
      
          # If you encounter problems, try to set data_dir and data_underlay_dir
          # to absolute paths.
      
          # Where your mutable wiki pages are. You want to make regular
          # backups of this directory.
          data_dir = '/root/mywiki/data/'                #设置data目录路径,要用绝对路径
      
          # Where read-only system and help page are. You might want to share
          # this directory between several wikis. When you update MoinMoin,
          # you can safely replace the underlay directory with a new one. This
          # directory is part of MoinMoin distribution, you don't have to
          # backup it.
          data_underlay_dir = '/root/mywiki/underlay/'   #设置underlay目录路径,要用绝对路径
      
          # This must be '/wiki' for twisted and standalone. For CGI, it should
          # match your Apache Alias setting.
          url_prefix = '/wiki'                           
      
      
          # Security ----------------------------------------------------------
      
          # This is checked by some rather critical and potentially harmful actions,
          # like despam or PackageInstaller action:
          superuser = [u"moin_admin", ]                  #设置超级用户,1.5版新增选项
      
          # IMPORTANT: grant yourself admin rights! replace YourName with
          # your user name. See HelpOnAccessControlLists for more help.
          # All acl_rights_xxx options must use unicode [Unicode]
          #acl_rights_before = u"YourName:read,write,delete,revert,admin"   #设置管理权限
      
          # Link spam protection for public wikis (Uncomment to enable)
          # Needs a reliable internet connection.
          #from MoinMoin.util.antispam import SecurityPolicy
      
      
          # Mail --------------------------------------------------------------
      
          # Configure to enable subscribing to pages (disabled by default)
          # or sending forgotten passwords.
      
          # SMTP server, e.g. "mail.provider.com" (None to disable mail)
          mail_smarthost = "smtp.21cn.com"             #使用21cn的smtp服务器发送邮件
      
          # The return address, e.g u"Jürgen Wiki <noreply@mywiki.org>" [Unicode]
          mail_from = u"yjnet<yjnet@21cn.com>"         #发送者
      
          # "user pwd" if you need to use SMTP AUTH
          mail_login = "yjnet 123456"                #SMTP服务器验证,以"user password"格式填写
      
      
          # User interface ----------------------------------------------------
      
          # Add your wikis important pages at the end. It is not recommended to
          # remove the default links.  Leave room for user links - don't use
          # more than 6 short items.
          # You MUST use Unicode strings here, but you need not use localized
          # page names for system and help pages, those will be used automatically
          # according to the user selected language. [Unicode]
          navi_bar = [                                        #设置导航栏
              # If you want to show your page_front_page here:
              u'%(page_front_page)s',
              u'RecentChanges',
              u'FindPage',
              u'HelpContents',
          ]
      
          # The default theme anonymous or new users get
          theme_default = 'modern'                            #设置网页主题峁
      
      
          # Language options --------------------------------------------------
      
          # See http://moinmoin.wikiwikiweb.de/ConfigMarket for configuration in
          # YOUR language that other people contributed.
      
          # The main wiki language, set the direction of the wiki pages
          language_default = 'zh'                             #设置默认语言
      
          # You must use Unicode strings here [Unicode]
          page_category_regex = u'^Category[A-Z]'
          page_dict_regex = u'[a-z]Dict$'
          page_form_regex = u'[a-z]Form$'
          page_group_regex = u'[a-z]Group$'
          page_template_regex = u'[a-z]Template$'
      
          # Content options ---------------------------------------------------
      
          # Show users hostnames in RecentChanges
          show_hosts = 1
      
          # Enable graphical charts, requires gdchart.
          #chart_options = {'width': 600, 'height': 300}
      
    • 第四步是配置在Apache2中配置Mod_Python,在/etc/apache2/conf目录下创建一个moin_mop_python.conf的配置文档,内容如下:

      Alias /wiki/ "/usr/share/moin/htdocs/" 
      
      <Location /mywiki>
        SetHandler python-program
      # Add the path of your wiki directory
        PythonPath "['/root/mywiki/'] + sys.path"
        PythonHandler MoinMoin.request::RequestModPy.run
      </Location>
      

      如果要Apache同时处理两个Wiki实例,除要按上面介绍的方法创建实例目录外,还需在每个Location中添加PythonInterpreter,指定Python解析器的名称空间。如:

      Alias /wiki/ "/usr/share/moin/htdocs/"
      
      <Location /mywiki>
        SetHandler python-program
        PythonInterpreter mywiki                            # 指定名称空间为mywiki
      # Add the path of your wiki directory
        PythonPath "['/root/mywiki/'] + sys.path"
        PythonHandler MoinMoin.request::RequestModPy.run
      </Location>
      
      <Location /secondwiki>
        SetHandler python-program
        PythonInterpreter secondwiki                         # 指定名称空间为secondwiki
      # Add the path of your wiki directory
        PythonPath "['/root/secondwiki/'] + sys.path"        # /root/secondwiki是另外一个wiki实例的目录
        PythonHandler MoinMoin.request::RequestModPy.run
      </Location>
      

      配置完成后,需重启Apache服务器,查询Apache日志可看到服务器的启动状态,Apache的日志存放在/var/log/apache2目录下。成功启动后,访问http://moinserver/mywiki即可打开进入MoinMoin,访问http://moinserver/secondwiki就可访问另一个MoinMoin。

    • 最后,我们还要安装中文语言包。我们先要在MoinMoin中用登录界面创建一个有管理员权限的用户,在该例中就是moin_admin用户。以该用户登录后再访问http://moinserver/mywiki/SystemPagesSetup网页安装中文语言包。如果你没有管理权限,访问该页面时在语言包前面是不会显示"安装"按钮的。

    • 从moin1.5.1升级到moin1.5.3的操作很简单,首先备份好/usr/lib/python2.3/site-packages/MoinMoin目录和/usr/share/moin目录。接着删除这两个目录和实例目录下的underlay目录,安装新版本的moinmoin系统。最后把/usr/share/moin/underlay目录拷贝到实例目录,修改该目录的访问权限。升级完成要重启服务器。注意,如果你修改了/usr/lib/python2.3/site-packages/MoinMoin目录和/usr/share/moin目录下文件的内容,升级完成后要重新修改或用旧文件覆盖。

访问控制列表(ACL)

语法:

#acl [+-]User[,SomeGroup,...]:[right[,right,...]] [[+-]OtherUser:...] [[+-]Trusted:...] [[+-]Known:...] [[+-]All:...] [Default]
参数说明:
User      用户名
SomeGroup 组名
Trusted   一个特殊组,包括所有通过HTTP-Basic-authentication验证的用户
Known     一个特殊组,包括所有有效用户 (使用 cookie 验证方法)
All       一个特殊组,包括所有用户 
Default   一个特殊项,使用配置文件中acl_rights_default中的值
right     表示权限,可以是 read、write、delete、revert 和 admin的组合,允许为空,表示没有任何权限。

权限说明:
read     读权限
write    编辑权限
delete   删除页面和附件的权限
revert   有还原旧版本的权限
admin    具有管理ACL的权限

ACL放在网页内容的前面,下面一个ACL示例,所有用户有浏览权限,moin_admin用户具有所有权限:

#acl moin_admin:read,write,delete,revert,admin All:read

这是网页正文。
MoinMoin ACL示例。
...

MoinMoin按ACL设置的顺序匹配用户,一旦匹配就不会搜索后面的配置。如上例,当我以moin_admin用户登录后访问该网页,它匹配了第一个用户名,则MoinMoin的ACL执行过程就停止,不会去再去匹配后面的ACL。所以我们在设置ACL时,应按用户、特殊组、普通组、Known、All的顺序设置。

在MoinMoin中,组是用网页来维护的,在配置文件中的page_group_regex = u'[a-z]Group$'选项规定,以任意的小写字母组合后接Group结尾命名的页面都是一个组,如:testGroup,网页内每个最高列表项代表一个组成员,下例设置了test1,test2,test3三个用户。:

#acl moin_admin:read,write,delete,revert,admin All:read
 *test1
 *test2
 *test3
... 

在ACL设置中,MoinMoin引入"+"号和"-"号,改变ACL的配置规则,使ACL配置更灵活。当用户请求一个具有"+"或"-"号的ACL的页面时,只在用户名和权限同时匹配时才动作,"+"表示授予权限用户权限,"-"号表示禁止用户的权限,并停止ACL匹配。如果用户名和权限有一个不匹配,则继续搜索下一个ACL项。下面有一个示例:

#acl SomeUser:read,write SomeGroup:read,write,admin All:read
可以写成:
#acl -SomeUser:admin SomeGroup:read,write,admin All:read
或
#acl +All:read -SomeUser:admin SomeGroup:read,write,admin

wikiconfig.py配置文档中可以设置系统级的ACL,它将影响系统中的所有页面。系统级ACL分别通过acl_rights_default,acl_rights_before和acl_rights_after这三个配置参数来设置。acl_rights_default控制系统默认的ACL,当文档中没有设置ACL时就按acl_rights_default的配置设置文档的ACL;acl_rights_before的ACL在文档的ACL之前执行,也就是说在acl_rights_before里设置的ACL的优先级高于文档的ACL,一般在这里设置系统管理员的ACL。acl_rights_after的ACL是对文档ACL的补充,优先级低于文档中的ACL。

用户验证

使用Apache basic auth进行用户验证

MoinMoin的用户信息存放在instance/data/user目录下,每个用户都有一个类似1137395855.97.12542的文件,里面记录着用户名、密码和显示样式等信息,MoinMion利用这些信息来进行用户验证和权限的控制。MoinMoin默认是使用Cookis来验证用户的,从1.3版开始,我们也可使用基于HTTP的用户验证,也就是说可以使用其它的用户数据库,如LDAP。不论使用Cookis还是HTTP方式,user目录下一定要存在一个与之对应的用户文件。因为MoinMoin只会使用该用户文件中的信息进行权限控制,所以在MoinMoin的配置文件中有一个user_autocreate参数,当把该选项设置为真时,当第一次用Apache basic auth方式登录MoinMion时,系统会自动在user目录下创建一个用户文件,该用户文件里不保存用户密码,只保存用户名和个人定制配置信息。采用HTTP验证方式,要修改两个文件,一个是wikiconfig.py,一个是moin_mod_python.conf。

wikiconfig.py文件中修改的内容如下:

...
from MoinMoin.auth import http
...
class Config(DefaultConfig):
...
   user_autocreate=1
   auth=[http]
...

修改后的moin_mod_python.conf:

Alias /wiki/ "/usr/share/moin/htdocs/"

<Location /portal>
  AuthType Basic
  AuthName "Portal"
  AuthUserFile "/etc/apache2/moinmoin.passwd"
  Require valid-user
  SetHandler python-program
# Add the path of your wiki directory
  PythonPath "['/data/moin/portal/'] + sys.path"
  PythonHandler MoinMoin.request::RequestModPy.run
</Location>

moinmoin.passwd用户文件可用htpasswd2文件创建。需重启Apache服务器使配置生效。

使用Apache+LDAP进行用户验证

原理同上,只是验证数据我们存放在LDAP目录数据库。我使用OpenLDAP做为LDAP服务器。因为Apache+LDAP方式也是通过MoinMoin的HTTP验证模块进行的,所以wikiconfig.py的配置同上面的是一样的。这里的关健是要配置好Apache与LDAP服务器的连接。Apache需安装有mod_ldap.so和auth_ldap.so模块,如果已安装,可在/usr/lib/apache2/modules目录下查询到。在Debian中这两个模块默认是不启动的,可在/etc/apache2/mods-enable目录下创建一个auth_ldap.load链接来启动它,如:

debian:/etc/apache2/mods-enabled# ln -s /etc/apache2/mods-available/auth_ldap.load auth_ldap.load

auth_ldap.load文件会装载mod_ldap.so和auth_ldap.so这两个模块。下面配置moin_mod_python.conf,修改后的内容如下:

Alias /wiki/ "/usr/share/moin/htdocs/"
#LDAP连接Cache参数
LDAPSharedCacheSize 200000
LDAPCacheEntries 1024
LDAPCacheTTL 600
LDAPOpCacheEntries 1024
LDAPOpCacheTTL 600

<Location /portal>
  AuthType Basic                                    #验证类型
  AuthName "Portal"                                 #验证名,显示在验证栏
  AuthLDAPEnabled on                                #启用LDAP验证
  AuthLDAPBindDN cn=admin,dc=com                    #连接LDAP服务器的用户
  AuthLDAPBindPassword '1'                          #连接LDAP服务器的用户密码
  AuthLDAPURL ldap://127.0.0.1/dc=user,dc=company,dc=com?uid?   #连接URL
  AuthLDAPAuthoritative on                          #只允许LDAP验证方式
  Require valid-user
  SetHandler python-program
# Add the path of your wiki directory
  PythonPath "['/data/moin/portal/'] + sys.path"
  PythonHandler MoinMoin.request::RequestModPy.run
</Location>

mod_ldap模块提供了一个监控LDAP认证连接Cache信息的功能,在配置文件中增加以下标签即可。

<Location /cache-info>
SetHandler ldap-status
</Location>
~

Note

上面介绍的方法是在apache2.0中实现的,apache2.2中有关ldap验证的指令有些变化。可参考本笔记中"Apache2"一文的内容。

重启Apache服务器使配置生效。现在我们就可以通过LDAP服务器中的用户连接MoinMion了。访问http://moinserver/cache-info即可显示LDAP认证连接Cache信息。

XML处理

如果你的系统中安装了4suite这个XML处理软件包,MoinMoin可在线解析XML文档。

MoinMoin会根据页面正文第一行是否以<?xml开头来判断是否要启动XML处理。MoinMoin也支持可在线解析DocBook文档,要支持在线解析DocBook文档,还需安装一个docboot-xsl包,该软件包包含把DocBook格式文档转换成HTML格式文档所需的样式表,安装完成后,HTML样式表位于/usr/share/xml/docbook/stylesheet/nwalsh/html目录。最后,我们需对MoinMoin进行配置,让它启动XSLT转换功能和指定转换DocBook的样式表目录。启动XSLT转换功能的选项是allow_xslt = 1,默认值为0,表示禁用XSLT转换功能。样式表目录选项为docbook_html_dir,在Debian Sarge中,它的默认值已是正确的啦,为/usr/share/xml/docbook/stylesheet/nwalsh/html/,不用修改。但权限有问题,不能被www-data所访问和修改,我们要用以下命令进行修改。

debian:/usr/share/xml/docbook/stylesheet# chown -R www-data.www-data nwalsh  

修改完成后,重启MoinMoin服务器。创建一个DocBook格式的文档,如:

#format docbook
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
                    "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
                    >
<book>
  <chapter>
    <title>test</title>
     <para>test</para>
  </chapter>
</book>

按保存,MoinMoin会把上面的DocBook文档自动转换成HTML文档输出。注意,DocBoo文档的encoding一定要用utf-8。我是在python2.4环境下做以上测试的,在python2.3中测试不成功,会出现字符编码出错提示。还有一个问题就是不能使用本地的dtd文件,会提示docbookx.dtd文档不存在错误。好象上面示例使用网上的dtd就没问题,但利用网上dtd时,HTML输出速度慢。从上面的测试结果来看,在WiKi中自动转换DocBook还不是很实用,一个是速度问题,上面已说过。另一个是编辑器问题,基于Web的编辑界面大简单了,远远比不上emacs等工具。

文档

有关MoinMoin的使用可参考自带的帮助文档,有很多都是中文版的了,查询起来很方便的。在MoinMoin的官方网站http://moinmoin.wikiwikiweb.de/上也有最新的教材可参考。有关中文化方面,现在的MoinMoin已支持I18n,会根据浏览器的设置自动显示多国语言。中文化支持也有很多志愿者在做,教材和帮助很多都是中文的了。如果你想为MoinMoin的中文化做贡献,请到http://moinmaster.wikiwikiweb.de/注册个帐号,然后把你的帐号放到MoinPagesEditorGroup页面就可以进行翻译了。

小提示:

  • 任何用户在页面中添加ACL都需要有管理权限(admin)。

  • wikiconfig.py配置文档编码需是UTF-8格式的,如果不是UTF-8格式,就不能在该文档中使用中文。我们可用Kwrite编辑器来把它保存成UTF-8格式的。

  • /usr/lib/python2.3/site-packages/MoinMoin/theme目录存放MoinMoin的各种主题处理脚本,修改这些脚本可实现界面功能的增减,如取消标题搜索栏等。

  • /usr/share/moin/htdocs/目录下存放有各种主题的CSS文档,修改这些文档可实现界面风格的改变,如布局、字体大小和背景颜色等。

  • 删除页面时,页面文件不会从data/pages目录真正删除,它只是把文件的当前版本号增一,并在edit-log中记录删除日志。要真正删除页面,只能通过shell删除页面所在的目录。

  • 当用户创建个人页面后,每当用户编辑完任意一个页面,都会生成一个备份,存放在username/MoinEditorBackup目录下。个人页面是指以用户名命名的WiKi页面。

Plugin开发

MoinMoin系统是一个高可扩展的系统,我们能在不改变原有软件架构的基础上进行二次开发以扩展MoinMoin的功能。这类扩展在MoinMoin里叫Plugin,有Macro(宏)、Parser(解析器)、Action(操作)、Formatter(格式化工具)、Theme(主题)等。系统级的插件存放在/usr/lib/python2.3/site-packages/MoinMoin/目录下。用户级的插件存放在实例的data/plugin目录下。下面分别介绍这些插件的开发过程。

  • Macro能使用我们在WiKi页面中插入处理逻辑,扩展WiKi页面的功能。如我们可以开发计数器,日历等。Macro的调用方式是在页面中用[[MacroName(args,...)]]语法调用。MacroName是宏的名称,在macro目录下对应一个MacroName.py文件。下面以一个计数器的例子说明一下。我在macro目录下创建一个count.py文件,内容如下:

    #-*- coding:utf-8 -*-
    import time
    
    def execute(macro,args):      #macro表示宏的实例,args表示传入该宏的参数
            try:
                    now = time.localtime()[7]
                    totle = int(args)
                    count = totle - now + 1
                    if count > 1:
                            html = "<font color=red>%s</font>" % count
                    else:
                            html = "<font color=red>0</font>"
            except:
                    html="<font color=red>(出错啦!请输入一个数字)</font>"
            return macro.formatter.rawHTML(html)           #输出HTML
    

    要使新创建的宏生效,需重启服务器。在WiKi页面中用[[count(100)]]即可调用该宏。

About WiKi

WiKi概念是由Ward Cunningham(中文译文为:沃德.坎宁安)于1995年提出,并创建了第一个WiKi网站---波特兰模式知识库(Portland Pattern Repository)。WiKi这个名词源自夏威夷语wee kee wee kee的缩减化英语wiki,原意是"快点,快点"的意思。国内把WiKi译成"维客"。

除MoinMoin外,还有很多其它WiKi引擎:

  • MadiaWiKi,全球最大的WiKi系统--维基百科就是基于它创建的。

  • UseModWiKi,用Perl实现的WiKi引擎。

  • TwikiClone,用Perl实现的WiKi引擎。

  • PmWiKi,基于PHP开发的WiKi引擎。

  • WakkaWiKi,另一个用PHP写的WiKI引擎,CooCooWakka是中国人根据WakkaWiKi开发的中文版。

  • TikiWiKi,提供内容管理和WiKi功能。

  • JspWiKi,用JSP开发的WiKi引擎。

  • ZWiKi,Zope应用平台上的WiKi系统。

安装Trac服务器

Trac是用Python写的一个基于Web的事件跟踪系统,它使用WiKi作为文档的格式,Subversion作为版本控制系统。可帮助开发人员进行源码版本管理、Bug跟踪和讨论。Debian Sarge带的Trac是0.8版本,该版本好象有问题,安装完成后不能创建Trac环境。Sid带是0.9版的,可正常使用。下面以0.9版为例介绍安装过程。

  • 安装和配置

    要安装Trac,需先安装Subversion、SQLite和ClearSilver。详细需求请参考官方网站http://projects.edgewall.com/trac/wiki/TracInstall。如果你使用的是Debian,则用apt-get install trac命令安装即可,Trac依赖的所有软件包系统会自动安装。安装完成后,就可进行配置了。Trac可以设置成Standalone服务器,只供本机使用。也可以与Apache等Web服务器集成,如果与Apache集成,则可配置成CGI、FastCGI或Mod_Python等方式。

    配置成Standalone方式:

    • 创建Subversion库:

      debian~:# svn create /root/subversion
      
    • 初始化Trac环境:

      debian~:# trac-admin /root/trac initenv
      

      /root/trac目录不用事先创建,Trac会自动创建。初始化时,trac-admin程序会问你项目名、数据库连接字串和Subversion库位置这三个参数。如果你的数据库是使用SQLite,则它的连接串是sqlite:db/trac.db,系统已默认指定了。所有初始化参考都会保存在/root/trac/conf/trac.ini文件中。

      [wiki]
      ignore_missing_pages = false
      
      [header_logo]
      src = common/trac_banner.png
      alt = Trac
      height = 73
      link = http://trac.edgewall.com/
      width = 236
      
      [logging]
      log_file = trac.log      #日志文件名,位于trac/log目录下
      log_level = DEBUG        #日志级别,分别是CRITICAL、ERROR、WARN、INFO和DEBUG
      log_type = file          #日志形式,file:生成trac.log日志文件,syslog:通过命名管道/dev/log传送到syslogd
      
      [trac]
      default_charset = iso-8859-15
      ignore_auth_case = false
      permission_store = DefaultPermissionStore
      check_auth_ip = true
      database = sqlite:db/trac.db
      templates_dir = /usr/share/trac/templates
      default_handler = WikiModule
      metanav = login,logout,settings,help,about
      mainnav = wiki,timeline,roadmap,browser,tickets,newticket,search
      repository_dir = /data/subversion
      
      [notification]
      always_notify_owner = false
      smtp_always_cc =
      smtp_password =
      smtp_enabled = false
      smtp_replyto = trac@localhost
      smtp_port = 25
      always_notify_reporter = false
      smtp_server = localhost
      smtp_from = trac@localhost
      smtp_user =
      
      [project]
      url = http://example.com/
      footer =  Visit the Trac open source project at<br /><a href="http://trac.edgewall.com/">http://trac.edgewall.com/</a>
      name = Developer
      descr = My example project
      icon = common/trac.ico
      
      [mimeviewer]
      php_path = php
      enscript_path = enscript
      tab_width = 8
      max_preview_size = 262144
      
      [attachment]
      max_size = 262144
      
      [timeline]
      changeset_show_files = 0
      ticket_show_details = false
      default_daysback = 30
      
      [ticket]
      default_version =
      default_component = component1
      default_type = defect
      restrict_owner = false
      default_milestone =
      default_priority = major
      
      [browser]
      hide_properties = svk:merge
      

      详尽的配置选项说明请参考官方的TracGuide文档。

    • 启动Trac服务:

      debian~:# tracd --port 8000 /root/trac
      

      使用浏览器访问"http://localhost:8000"即可访问Trac系统了。

    Standalone方式只能由本机访问,不能放到网上共享。所以我们一般都是把Trac配置成与Apache服务器集成的形式。这时,我们要配置Apache服务器,告诉它如何执行Trac的CGI程序。如果你的系统是Debian,则在/etc/apache2/conf.d目录下创建一个trac.conf文件,内容如下:

    Alias /trac/chrome/common /usr/share/trac/htdocs
    <Directory "/usr/share/trac/htdocs">
      Order allow,deny
      Allow from all
    </Directory>
    ScriptAlias /trac /usr/share/trac/cgi-bin/trac.cgi
    <Location "/trac">
      SetEnv TRAC_ENV "/data/trac/"
    </Location>
    
    <Location "/trac/login">           #设置Trac用户验证
      AuthType Basic
      AuthName "Trac"
      AuthUserFile /etc/apache2/trac.passwd            #trac.passwd文件用htpasswd2命令生成
      Require valid-user
    </Location>
    
    

    最后不要忘记设置Trac实例目录/data/trac的访问权限,使它能被Apache实例访问,设置方法如下:

    debian:~# chown -R www-data.www-data /data/trac
    

    重启服务器,使用浏览器访问"http://apache_server/trac"即可。

    我们也可以在一台服务器上安装多个trac实例来管理多个Subversion库。假设我们有两个Subversion库,分别是project1和project2,我们就可先用trad-admin命令分别创建两个trac实例,再针对这两个实例配置trac.conf,如:

    Alias /trac/chrome/common /usr/share/trac/htdocs
    <Directory "/usr/share/trac/htdocs">
      Order allow,deny
      Allow from all
    </Directory>
    
    ScriptAlias /trac/project1 /usr/share/trac/cgi-bin/trac.cgi
    <Location "/trac/project1">
      SetEnv TRAC_ENV "/data/trac/project1"
    </Location>
    
    <Location "/trac/project1/login">           #设置Trac用户验证
      AuthType Basic
      AuthName "Trac"
      AuthUserFile /etc/apache2/trac.passwd     #trac.passwd文件用htpasswd2命令生成
      Require valid-user
    </Location>
    
    ScriptAlias /trac/project2 /usr/share/trac/cgi-bin/trac.cgi
    <Location "/trac/project2">
      SetEnv TRAC_ENV "/data/trac/project2"
    </Location>
    
    <Location "/trac/project2/login">           
      AuthType Basic
      AuthName "Trac"
      AuthUserFile /etc/apache2/trac.passwd            
      Require valid-user
    </Location>
    
    

    这样,我们就可用http://servertotrac/trac/project1和http://servertotrac/trac/project2访问两个项目。

    通过FastCGI和Mod_Python方式的配置方法请参考Trac Project网站http://projects.edgewall.com/trac/

  • 管理访问许可

    Trac的许可权限管理简单而有效,它可通过trac-admin命令来管理。用trac-admin可管理用户的许可权限,但用户的管理是通过Apache的htpasswd2命令设置的,根据上面的Apache CGI配置,用户名和密码是存放在/etc/apache2/trac.passwd文件中。下面这个命令可用来列出当前有效的许可权限和已设置的许可权限。

    debian:~# trac-admin /data/trac permission list
    User       Action
    --------------------------
    anonymous  BROWSER_VIEW
    anonymous  CHANGESET_VIEW
    anonymous  FILE_VIEW
    anonymous  LOG_VIEW
    anonymous  MILESTONE_VIEW
    anonymous  REPORT_SQL_VIEW
    anonymous  REPORT_VIEW
    anonymous  ROADMAP_VIEW
    anonymous  SEARCH_VIEW
    anonymous  TICKET_CREATE
    anonymous  TICKET_MODIFY
    anonymous  TICKET_VIEW
    anonymous  TIMELINE_VIEW
    anonymous  WIKI_CREATE
    anonymous  WIKI_MODIFY
    anonymous  WIKI_VIEW
    
    
    Available actions:
     BROWSER_VIEW, CHANGESET_VIEW, CONFIG_VIEW, FILE_VIEW, LOG_VIEW,
     MILESTONE_ADMIN, MILESTONE_CREATE, MILESTONE_DELETE, MILESTONE_MODIFY,
     MILESTONE_VIEW, REPORT_ADMIN, REPORT_CREATE, REPORT_DELETE, REPORT_MODIFY,
     REPORT_SQL_VIEW, REPORT_VIEW, ROADMAP_ADMIN, ROADMAP_VIEW, SEARCH_VIEW,
     TICKET_ADMIN, TICKET_APPEND, TICKET_CHGPROP, TICKET_CREATE, TICKET_MODIFY,
     TICKET_VIEW, TIMELINE_VIEW, TRAC_ADMIN, WIKI_ADMIN, WIKI_CREATE,
     WIKI_DELETE, WIKI_MODIFY, WIKI_VIEW
    

    上面列出的内容是还没进行许可权限设置时的情况,Available actions段的内容就是有效许可权限的列表,每个权限的解析可查询TracGuide中的TracPermission节的内容。其中TRAC_ADMIN许可相当于Linux中的root用户,拥有最高的权限。如果我们要把TRAC_ADMIN许可授予jims用户,则可这样设置:

    debian:~# trac-admin /data/trac permission add jims TRAC_ADMIN
    

    WIKI_ADMIN是WIKI系统的管理员,具有WIKI_CREATE,WIKI_DELETE, WIKI_MODIFY, WIKI_VIEW权限。也就是WIKI页面的创建、删除、修改和查看四种权限,授予方式同上。

    删除用户的许可可用remove关健字,如:

    debian:~# trac-admin /data/trac permission remove jims TRAC_ADMIN
    

    在Trac的权限管理中可以设置组以简化权限配置,下例将设置一个admin组,具有TRAC_ADMIN许可权限,把jims和ringkee两个用户加入到该组中,使他们也具有TRAC_ADMIN许可权限:

    debian:~# trac-admin /data/trac permission add admin TRAC_ADMIN
    debian:~# trac-admin /data/trac permission add ringkee admin
    debian:~# trac-admin /data/trac permission add jims admin
    

    在Trac的用户中,有两个默认的用户,一个是anonymous,表示匿名用户;一个是authenticated,表示所有已通过验证的用户。我们可以把许可权赋予这两个用户,从而简化我们的许可权限配置。

  • 定制Ticket字段

    Trac的Ticket是可定制的,除默认的Priority、Milestone、Component等字段之外,我们还可增加自已的字段。方法是在trac.ini里增加[ticket-custom]配置段。配置语法如下:

    字段名(FIELD_NAME) = 字段类型(TYPE)
     字段名选项(FIELD_NAME.OPTION) = 值(VALUE)
     ...
    

    下面是有效的字段类型和选项说明:

        * text: A simple (one line) text field.
              o label: Descriptive label.
              o value: Default value.
              o order: Sort order placement. (Determines relative placement in forms.) 
        * checkbox: A boolean value check box.
              o label: Descriptive label.
              o value: Default value (0 or 1).
              o order: Sort order placement. 
        * select: Drop-down select box. Uses a list of values.
              o options: List of values, separated by | (vertical pipe).
              o value: Default value (Item #, starting at 0).
              o order: Sort order placement. 
        * radio: Radio buttons. Essentially the same as select.
              o label: Descriptive label.
              o options: List of values, separated by | (vertical pipe).
              o value: Default value (Item #, starting at 0).
              o order: Sort order placement. 
        * textarea: Multi-line text area.
              o label: Descriptive label.
              o value: Default text.
              o cols: Width in columns.
              o rows: Height in lines.
              o order: Sort order placement. 
    

    下面是一些示例:

    [ticket-custom]
    
    test_one = text
    test_one.label = Just a text box
    
    test_two = text
    test_two.label = Another text-box
    test_two.value = Just a default value
    
    test_three = checkbox
    test_three.label = Some checkbox
    test_three.value = 1
    
    test_four = select
    test_four.label = My selectbox
    test_four.options = one|two|third option|four
    test_four.value = 2
    
    test_five = radio
    test_five.label = Radio buttons are fun
    test_five.options = uno|dos|tres|cuatro|cinco
    test_five.value = 1
    
    test_six = textarea
    test_six.label = This is a large textarea
    test_six.value = Default text
    test_six.cols = 60
    test_six.rows = 30
    
  • 备份和恢复

    Trac系统的备份和恢复也可使用trac-admin工具来完成,还可支持热备份。备份命令如下:

    debian:~# trac-admin /data/trac hotcopy ~/backup 
    

    执行该命令时,Trac会自动锁住SQLite数据库,并把/data/trac目录拷贝到~/backup目录。恢复备份也很简单,只需停止Trac进程,如Apache服务器或tracd服务器。接着把~/backup整个目录恢复回/data/trac目录就可以了。

  • 软件更新

    当有新版的Trac软件推出时,为了使用新的功能和减少Bugs,我们需把旧版本的Trac系统升级到新版本。在Debian中系统,Trac软件包的安装脚本会自动帮我们完成升级,但了解手动升级方法可使我们对Trac软件的结构有更深的认识,所以我在这里也简单介绍一下如何手动升级Trac软件包。

    • 为了减少软件冲突,最好把旧版软件包的程序删除:

      debian:~# rm -rf /usr/lib/python2.3/site-packages/trac
      debian:~# rm -rf /usr/share/trac
      

      Note

      /data/trac实例目录不能删除。

    • 升级软件包,下载最新的Trac软件包,并安装:

      debian:~/inst/trac-0.9.2# python setup.py install 
      
    • 升级实例:

      debian:~# trac-admin /data/trac upgrade
      
    • 升级文档:

      debian:~# trac-admin /data/trac wiki upgrade
      

安装Subversion服务器

Subversion是新一代的开源版本控制系统,用以取代CVS。有关Subversion最详尽的资料就是官方的Subversion Book了。它是由开源社区编写的自由图书,已通过O'Reilly Media出版。下面简单介绍一下Subversion在Debian下的安装和配置过程。

  • 安装:

    debian:~# apt-get install subversion subversion-tools
    
  • 创建一个新的储存库:

    debian:~# svnadmin create /data/svn
    

    在/data/svn目录创建一个新的空储存库,数据储存方式默认采用Berkeley DB。

  • 导入你的源码:

    debian:~# svn import /data/ldap file:///data/svn/ldap
    

    把/data/ldap整个目录导入到储存库中的ldap目录中,储存库的ldap目录会自动创建。

  • 显示储存库内容:

    debian:~# svn list file:///data/svn/ldap
    ldap_add.py
    ldap_del.py
    ldap_modify.py
    ldap_search.py
    

    显示ldap目录内容,成功导入。

上面我使用了file:///形式的URL来访问Subversion库,这表示在本地通过文件系统访问。但我们的Subversion库可能需要通过网络被其它用户访问,这就需要用到其它的协议,下表是Subversion支持的各种访问协议:

Table 11.1. 访问协议

协议访问方法
file:///通过本地磁盘访问。
http://与Apache组合,通过WebDAV协议访问。
https://同上,但支持SSL协议加密连接。
svn://通过svnserve服务自定义的协议访问。
svn+ssh://同上,但通过SSH协议加密连接。

下面介绍与Apache组合通过WebDAV方式访问Subversion库的方式:

  • 首先要安装好Apache2,并安装好提供WebDAV访问和svn访问的的mod_dav模块和mod_dav_svn模块:

    debian:~# apt-get install apache2 libapache2-svn
    
  • 配置文件位于/etc/apache2/mods-enabled/目录下,配置文件共有两个,分别是dav_svn.conf和dav_svn.load,dav_svn.load文件负责装载必要的模块,内容如下:

    # Load mod_dav_svn when apache starts
    LoadModule dav_svn_module /usr/lib/apache2/modules/mod_dav_svn.so
    LoadModule authz_svn_module /usr/lib/apache2/modules/mod_authz_svn.so
    

    在装载mod_dav_svn.so前,必须先装载mod_dav.so模块。它由dav.load文件控制,内容如下:

    LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so
    

    dav_svn.conf是mod_dav_svn.so模块的配置文件,内容如下:

    # dav_svn.conf - Example Subversion/Apache configuration
    #
    # For details and further options see the Apache user manual and
    # the Subversion book.
    
    # <Location URL> ... </Location>
    # URL controls how the repository appears to the outside world.
    # In this example clients access the repository as http://hostname/svn/
    <Location /svn>                                 #设置访问路径
    
      # Uncomment this to enable the repository,
       DAV svn                                      #启用
    
      # Set this to the path to your repository
       SVNPath /data/subversion                     #设置储存库路径,仅支持单个储存库,该路径要可被Apache进程访问。
      #SVNParentPath /data/subversion               #如果subversion下有多个储存库,则用SVNParentPath
      # The following allows for basic http authentication.  Basic authentication
      # should not be considered secure for any particularly rigorous definition of
      # secure.
    
      # to create a passwd file                     #按下面的步骤创建Apache用户验证文件
      # # rm -f /etc/apache2/dav_svn.passwd
      # # htpasswd2 -c /etc/apache2/dav_svn.passwd dwhedon
      # New password:
      # Re-type new password:
      # Adding password for user dwhedon
      # #
    
      # Uncomment the following 3 lines to enable Basic Authentication
       AuthType Basic                               #启用Apache基础验证
       AuthName "Subversion Repository"             #设置验证框标题
       AuthUserFile /etc/apache2/dav_svn.passwd     #指定验证用户文件名
    
      # Uncomment the following line to enable Authz Authentication
       AuthzSVNAccessFile /etc/apache2/dav_svn.authz  #启用目录级别授权,dav_svn.authz是授权配置文档
    
      # The following three lines allow anonymous read, but make
      # committers authenticate themselves.
    
      #<LimitExcept GET PROPFIND OPTIONS REPORT>    #允许匿名访问,不允许Commit,不能与AuthzSVNAccessFile同时使用
        Require valid-user                         
      #</LimitExcept>
    
    </Location>
    

    修改/data/subversion目录访问权限使它可被Apache进程访问,我的Apache是用www-data启动的,所以设置方法如下:

    debian:~# chown -R www-data.www-data /data/subversion
    

    通过Apache的用户验证功能可以区别匿名用户和验证用户,从而赋予匿名用户读权限和验证用户读/写的权限。这些权限只能在全局范围内设置,不能设置具体的某个目录是否能被某个用户操作。要实现目录级别的授权,就要使用mod_authz_svn.so模块提供的AuthzSVNAccessFile指令。它会指定一个授权文档,该授权文档设置具体的目录权限。根据上面的配置,授权文档名叫dav_svn.authz,它的内容如下:

    [groups]              #定义组
    admin=jims,ringkee
    tests=tester1,tester2
    
    [erp:/]              #定义erp储存库根目录的访问权限
    @admin=rw            #admin组有读写权限
    tests=r              #test用户只有读权限
    
    [oa:/test]           #定义oa储存库下test目录的访问权限
    *=                   #禁止所有用户访问,星号代表所有用户,权限为空代表没有任何权限
    ringkee=rw           #打开ringkee用户的读写权限
    

    在该文件中使用的用户需在apache2的用户文件/etc/apache2/dav_svn.passwd中预先设置好。我们也可以通过OpenLDAP服务器来进行用户验证。设置方法同本书中安装MoinMoin服务器中"使用Apache+LDAP进行用户验证"一节的内容,这里就不再介绍了。

subversion命令列表参考:

Subversion 命令列客户端: svn
svn add
svn cat
svn checkout
svn cleanup
svn commit
svn copy
svn delete
svn diff
svn export
svn help
svn import
svn info
svn list
svn log
svn merge
svn mkdir
svn move
svn propdel
svn propedit
svn propget
svn proplist
svn propset
svn resolved
svn revert
svn status
svn switch
svn update

Subversion 命令列服务端:
svnadmin list-unused-dblogs
svnadmin create
svnadmin dump
svnadmin help
svnadmin load
svnadmin lstxns
svnadmin recover
svnadmin rmtxns
svnadmin setlog
svnlook author
svnlook cat
svnlook changed
svnlook date
svnlook diff
svnlook dirs-changed
svnlook help
svnlook history
svnlook info
svnlook log
svnlook proplist
svnlook tree
svnlook youngest

CUPS(Common UNIX Printing System)

CUPS是Linux/UNIX环境下的打印系统,它把应用程序输出的数据转换成打印机能够识别的数据,然后输出到打印设备进行打印。现在的CUPS已得到大多数打印设备厂商的支持,能够支持大量的打印设备。

CUPS自带了一些常用型号的打印机驱动程序,一般的打印机它都能很好地驱动。如果驱动不了,我们也可到http://linuxprinting.org/网站上去查,它上面有大量的有关Linux打印驱动的信息。

运行以下命令安装CUPS:

debian:~# apt-get install cupsys

安装完成后,登录http://localhost:631即可进入CUPS的管理界面。在这个界面我们可以添加打印机和管理打印作业。下面以添加网络上Win98共享出来的HP LaserJet 5100打印机为例进行介绍。

  • 由于我们要添加的打印机位于Win98上,Linux是通过Samba提供的SMB来与Win98系统通信的,所以我们要先配置好Samba客户端。smbclient是Samba的测试工具,可以连接任何的SMB服务,我们就用它来测试与Win98系统的连接是否正常。

    debian:#~ smbclient -L winprinter
    Password:                     #共享密码,如果没有就直接按回车
    
            Sharename       Type      Comment
            ---------       ----      -------
            PRINTER$        Disk
            HP              Printer    
            IPC$            IPC       远程进程间通信
    
            Server               Comment
            ---------            -------
    
            Workgroup            Master
            ---------            -------
    

    winprinter是共享打印机的机器名,操作系统是Windows98。从上面列出的信息我们可以看到一个叫HP的打印机被共享了出来。

    在配置Samba客户端时我们要注意一下字符集的问题。Windows98是使用GB2312字符集的,而我们的Linux系统很多时候是使用UTF8字符集。如果两边的字符集不相同,则Samba在连接使用中文机器名的Win98系统时会出错。出错信息如下:

    session request to  failed (Called name not present)
    session request to *SMBSERVER failed (Called name not present)
    

    解决方法是在smb.conf中添加unix charset和dos charset配置参数,分别指定两边的安符集,如:

    [global]
    ...
    unix charset = UTF8
    dos charset = GB2312
    ...
    
  • 确认samba能正常连接Win98系统后,我们还要检查系统是否安装了smbspool程序,并且在CUPS的backend目录下是否正确创建了smb链接。CUPS最终是通过smbspool来把文件传输到SMB打印机上的。

    debian:/usr/lib/cups/backend# ls -l
    总计 16
    -rwxr-xr-x 1 root root 7199 2006-08-21 22:36 beh
    lrwxrwxrwx 1 root root    3 2006-08-29 13:54 http -> ipp
    -rwxr-xr-x 1 root root 5124 2005-08-31 14:38 hylafax
    lrwxrwxrwx 1 root root   24 2006-08-29 13:54 ipp -> ../backend-available/ipp
    lrwxrwxrwx 1 root root   24 2006-08-29 13:54 lpd -> ../backend-available/lpd
    lrwxrwxrwx 1 root root   29 2006-08-29 13:54 parallel -> ../backend-available/parallel
    lrwxrwxrwx 1 root root   21 2006-08-17 10:35 smb -> ../../../bin/smbspool           #是否有这个链接
    lrwxrwxrwx 1 root root   27 2006-08-29 13:54 socket -> ../backend-available/socket
    lrwxrwxrwx 1 root root   24 2006-08-29 13:54 usb -> ../backend-available/usb
    
  • 有关samba的客户端的内容配置好后,我们就可添加打印机啦。添加打印机的方法有很多种,可以使用KDE的控制中心中添加,也可通过CUPS管理网页添加,这里介绍后者。

    • 启动CUPS后台进程后,在浏览器上打开http://localhost:631地址就可以进入CUPS的管理界面。点击"Add Printer"链接,输入你要创建的打印机的名称、位置和描述信息。

    • 点击"Continue"进入下一步,这里将选择你的打印设备,由于我们是通过SAMBA连接Windows打印机,所以选择"Windows Printer via SAMBA"设备。

    • 点击"Continue",输入打印设备的URI,我们这里输入smb://winprinter/hp。

    • 点击"Continue",选择打印机的制造厂商,我们这里选择HP。

    • 点击"Continue",选择打印机的驱动程序,我们这里选择HP LaserJet Series PCL 6 CUPS(en)。

    • 最后,点击"Add Printer"完成打印机的添加。这时会弹出个认证窗口,输入root和密码就可以啦。

  • 点击"Printers"标签页,这里列出我们在CUPS上安装的所有打印机,在这里我们可以打印测试页。点击"Jobs"标签可以查看打印作业。

到此为止,我们就成功完成一台HP激光打印机的安装,安装其它打印机的步骤也大同小异。这里就不一一介绍啦。CUPS的配置文档位于/etc/cups/目录下,其中printer.conf文档就是打印机配置文档,我们也可通过手动修改该文档来配置打印机。

TFTP服务器

我在一台交换机上配置了DHCP服务器,为内网几个网段中的主机提供自动分配IP地址的服务。但在交换机上配置的DHCP服务的地址池是保存在内存中的,当交换机断电或重启后,地址池中的IP地址会被清空。这样会造成IP地址的不稳定。为解决这个问题,我们需要安装一个tftp服务器,把地址池保存在tftp服务器上。另外,这台tftp服务器也可作为以后交换机配置备份或映像升级之用。tftp(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行文件传输的协议。tftp使用udp的69号端口进行文件传输,不具有用户认证和授权功能。相对ftp协议,tftp的系统开销更小。tftp的种种特性显示,它并不适宜传输大容量的文件。多用于备份系统的配置信息和保存系统映像。

现在我们开始在Debian中安装tftp服务器。安装tftpd软件包包含tftp服务器端软件,tftp软件包包含客户端软件。使用apt-get命令安装这两个软件包。

debian:~#apt-get install tftpd tftp

tftpd服务器是通过inetd服务来启动的,所以成功安装tftpd软件包后,在/etc/inetd.conf配置文件上中就会增加有关tftpd服务器的项目,如下所示:

....

#:BOOT: Tftp service is provided primarily for booting.  Most sites
# run this only on machines acting as "boot servers."
tftp            dgram   udp     wait    nobody  /usr/sbin/tcpd  /usr/sbin/in.tftpd /srv/tftp

....

/srv/tftp是tftpd服务器的数据目录,要手动创建。由于tftp没有用户认证的授权机制,所以该目录的访问权限应该设置成允许s所有用户都可以访问。

debian:/# mkdir -p /srv/tftp
debian:/# chmod -R 777 srv

测试上传一个文件,192.168.0.2是我的tftp服务器的IP地址。

debian:~# tftp 192.168.0.2
tftp> put a.bf.txt
Sent 99 bytes in 0.3 seconds
tftp>

现在我们到tftp服务器上的/srv/tftp目录就可以看到我们刚才上传的文件了。到现在为止,一台tftp服务器已安装完成。虽然tftp没有用户认证功能,但tftpd服务是通过inetd管理的,我们可配置tcpd来限制主机对tftp服务的访问。在这里我们配置只允许192.168.0.6这个IP地址的主机访问我们的tftp服务器。

配置默认规则为所有主机都不能访问inetd服务
debian:/etc# vi hosts.deny
ALL: ALL                  

只允许本机和192.168.0.6访问tftpd服务
debian:/etc# vi hosts.allow
in.tftpd: LOCAL,192.168.0.6

保存配置后,除本机和192.168.0.6这台主机外,所有主机都不能访问tftpd服务了。通过查询/var/log/syslog日志文件可以跟踪到限制访问的信息。

Aug 16 13:56:10 server in.tftpd[17190]: refused connect from 192.168.0.246 (192.168.0.246)

安装Plone3.0

Plone是基于Zope应用平台开发的CMS系统,在开源CMS领域具有很高的知名度。最新版本是Plone3.0,于2007年8月21日正式发布。下面介绍一下Plone3.0的安装过程。

首先,我们要到Plone.org网站上下载安装程序。由于Plone3.0是新出的,所以Debian软件库里还没包含该软件,所以我们要用Plone接供的安装程序来安装。Plone提供了多种平台的安装程序,我们下载for linux的就可以了。下载后用tar命令解压,运行程序目录中的install.sh安装脚本开始安装Plone3.0。有关安装的帮助可以查看程序目录下的README.txt文档,里面详细介绍了安装Plone3.0的要求和方法。下面记录我安装的过程。

  • 默认Plone3.0会安装在/opt目录下,相关的Python版本也会自动安装在这个目录,不会和你系统上原有的Python系统的版本冲突。

    debian:/data/inst/Plone-3.0-UnifiedInstaller#./install.sh standalone
    

    install.sh脚本有两个参数,一个是zeo,一个是standalone。分别对应zeo集群模式和单独实例模式。一般选standalone就可以啦。

  • 安装脚本会自动创建zope实例,并设置好管理员用户名和密码。下面就是安装到最后时显示的信息。

    ...
    
    Zope binaries installed successfully.
    Now run '/opt/Plone-3.0/bin/mkzopeinstance.py'
    Adding Zope library path to site-packages
    uid=1004(plone) gid=1004(plone) groups=1004(plone)
    User 'plone' already exists. No need to create it.
    Generating random password ...
    Creating Instance ...
    Extracting Plone tarball ...
    Writing random password to file ...
    Setting appropriate file ownership and permissions ...
    Creating Plone site at /Plone in ZODB ...
    Added Plone
    Finished adding Plone site
    
    #####################################################################
    ######################  Installation Complete  ######################
    
    Use the account information below to log into the Zope Management Interface
    The account has full 'Manager' privileges.
    
      Username: admin            #管理员用户名
      Password: RnDoQclp         #管理员密码
    
    Before you start Plone, you should review the settings in:
    
      /opt/Plone-3.0/zinstance/etc/zope.conf               #新创建的zope实例的配置文件
    
    Adjust the ports Plone uses before starting the site, if necessary
    
    To start Plone, issue the following command in a Terminal window:
    
      sudo /opt/Plone-3.0/zinstance/bin/zopectl start      #启动zope实例命令
    
    To stop Plone, issue the following command in a Terminal window:
    
      sudo /opt/Plone-3.0/zinstance/bin/zopectl stop       #停止zope实例命令
    
    
    Plone successfully installed at /opt/Plone-3.0
    See /opt/Plone-3.0/zinstance/adminPassword.txt
    for password and startup instructions
    
    Ask for help on plone-users list or #plone
    Submit feedback and report errors at http://dev.plone.org/plone
    
    This installer was created by Kamal Gill (kamalgill at mac.com)
    Maintainers for Plone 3 are Kamal Gill and Steve McMahon (steve at dcn.org)
    
  • 现在让我们启动实例。

    debian:/opt/Plone-3.0/zinstance/bin# ./zopectl start
    . daemon process started, pid=6599
    

    现在zope实例已在服务器的8080端口启动监听客户端请求,用浏览器打开http://server:8080/Plone网址就可以访问Plone网站了。访问http://server:8080/manager可访问zope实例的管理界面。管理员的用户名和密码记录在/opt/Plone-3.0/zinstance/adminPassword.txt文件中。

Oracle 11g

安装配置

  • 系统要先安装有X系统,并运行xhost +命令打开X系统的访问权限。

  • 安装前需创建一个oracle用户,并初始化用户环境。把以下命令添加到.bash_profile文件。

    export LC_ALL=en_US
    export ORACLE_BASE=/data/oracle
    export ORACLE_SID=orcl
    export DISPLAY=":0.0"
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
    export PATH=$PATH:$ORACLE_HOME/bin
    export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
    
  • 用oracle用户登录,下载oracle11g源文件,解压后可查看目录中的welcom.html网页,里面有官方的系统安装和管理文档。在安装前要好好看一看,特别是Database Quick Installation Guide一章的内容。里面介绍了安装oracle11g的硬件和软件要求。

  • 根据Database Quick Installation Guide的内容创建好相应的oinstall和dba组,把oracle用户设置成这两个组的成员,运行runInstaller脚本安装oracle11g了。

数据库管理

  • 如果你忘记了sys用户密码,可在服务器上用OS认证方式登录进行重置。

    oracle@debian:~$ sqlplus / as sysdba
    
    SQL*Plus: Release 11.1.0.6.0 - Production on Fri Jun 27 11:11:05 2008
    
    Copyright (c) 1982, 2007, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL>ALTER USER SYS IDENTIFIED BY ****
    
  • 登录OEM管理系统。用以下命令启动OEM控制台。

    oracle@debian:~# emctl start dbconsole
    

    登录地址:

    https://127.0.0.1:1158/em/console/logon/logon
    
  • netca和netmgr是两个配置网络参数的工具,netca提供向导方式来配置网络组件,netmgr提供手动方式来配置网络组件。主要配置sqlnet.ora、tnsnames.ora和listener.ora。我们在连接数据库服务器可以使用以下命令:

    debian:~# sqlplus sys/password@orcl as sysdba
    

    执行上面这条命令时,sqlplus首先通过查看sqlnet.ora配置文件知道可以使用tnsnames连接服务器,接着在tnsnames.ora中查找orcl配置项,使用orcl配置项中的地址信息(ADDRESS=)和数据库服务名(SERVICE_NAME=)信息来连接数据库服务器。

    服务器端通过listener.ora配置文档配置监听器,由监听器负责接受客户端的网络连接申请并转交给oracle服务进程。所以如果不是远程连接则不需要使用listener,而且关闭listener不会影响已经建立的连接。

  • 更改数据库字符集,只能从子集向超集转换。注意:请在做以下操作之前备份你的数据库。

    SQL> shutdown immediate
    SQL> startup mount
    SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
    SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
    SQL> ALTER DATABASE OPEN;
    SQL> alter session set events '10046 trace name context forever,level 12';
    SQL> alter database character set ZHS16GBK;
    

    还有一条命令可以绕过子集超集检验直接转换,请慎用。

    SQL> alter database character set INTERNAL_USE ZHS16GBK;
    
  • 在客户端远程连接数据库时,需要配置本地net服务名,其中要填服务器上的数据库服务名(service_name),这个参数是从Oracle9i开始引入的新参数。一般默认是“orcl.数据库域名”。如果不确定,我们可以在服务器端查到,以sysdba身份登录数据库,运行以下命令。

    SQL> show parameter service_name;
    
    NAME              TYPE         VALUE
    ------------------------------------ ----------- ------------------------------
    service_names     string       orcl.test
    
  • 数据库名用以标识每一个数据库,用参数DB_NAME表示。可用以下命令查询数据库名:

    SQL> select name from v$database;
    
    NAME
    ---------
    ORCL
    
  • 数据库实例名,运行中(实例化的)数据库的标识,操作系统通过实例名与数据库交互。一般与数据库名一一对应,但在oracle并行服务器架构中,数据库名和实例名是一对多的关系。数据库实例名用instance_name表示。可用以下命令查询:

    SQL> select instance_name from v$instance;
    
    INSTANCE_NAME
    ----------------
    orcl
    

    操作系统中的ORACLE_SID环境变量与实例名对应。

  • 数据库域名用于分布式数据库结构中唯一标识数据库,就像万维网中的域名。用以下命令查询:

    SQL> show parameter domain
    
    NAME          TYPE      VALUE
    ----------- ----------- ------------------------------
    db_domain     string    test
    
  • 全局数据库名=“数据库名” +“.” + “数据库域名”

  • 由oracle8i开始,数据库与客户端的连接主机串开始使用数据库服务名,之前的使用实例名。

Bind9

Bind是我们最常用到的DNS服务器之一,下面介绍bind在Debian平台下的安装和配置。

安装方法很简单,用apt-get install bind9命令即可。bind9的配置文档主要位于/etc/bind目录,默认工作目录位于/var/cache/bind目录。

/etc/bind目录下的配置文档说明:

  • named.conf,标准配置文件,一般不用修改。该配置文档主要定义一些通用的设置,如localhost的正反解区域。

  • named.conf.local,区域定制配置文件,如果我们要新增正反解区域就要在该文档中设置。

  • named.conf.options,选项参数定制配置文件,该文档主要设置DNS服务器的行为规则。

  • 一些以db开头的文档是区域解析文档。如db.local是localhost的正解文档,db.empty是一个解析文档样板,如果要新增自定义解析文档则可拷贝该文档后改名再修改。

  • rndc.key文档定义主从服务器的同步密钥。

下面开始配置我的Bind服务器。该要服务器为内网用记提代互联网的域名解析,同时还要负责内网192.168.1网段提供xxx.tiger的域名解析。如把dns.tiger解析为192.168.1.2。

  1. 修改named.conf.local配置文档,增加我的正反解区域。

                zone "tiger" {
                type master;
                file "/etc/bind/db.tiger";
                };
                zone "1.168.192.in-addr.arpa" {
                type master;
                file "/etc/bind/db.tiger.arpa";
                };            
              
  2. 修改named.conf.options配置文档,增加我的选项。

                options {
                directory "/var/cache/bind";
                forwarders {           //启用转发功能,外网域名解析会转发给指定IP的DNS服务器进行解析
                61.28.10.68;
                210.21.4.130;
                };
                forward only;
                allow-transfer{"none";};       //禁用区域传送功能,提高服务器安全性。
                
                auth-nxdomain no;    # conform to RFC1035
                listen-on-v6 { any; }; 
                };            
              
  3. 拷贝db.empty生成一个新的正解区域文档和一个反解区域文档。按自已的要求配置正反解区域文档。下面的配置创建了一个tiger区域的正解文档。

                $TTL    86400
                @       IN      SOA     tiger. root.tiger. (
                1         ; Serial
                604800         ; Refresh
                86400         ; Retry
                2419200         ; Expire
                86400 )       ; Negative Cache TTL
                ;
                @       IN      NS      dns.tiger.
                dns  IN      A       192.168.1.2
                test IN      A       192.168.1.3
              

    下面是tiger区域的反解文档。

                $TTL    86400
                @       IN      SOA     tiger. root.tiger. (
                1         ; Serial
                604800         ; Refresh
                86400         ; Retry
                2419200         ; Expire
                86400 )       ; Negative Cache TTL
                ;
                @       IN      NS      dns.tiger.
                2       IN      PTR     dns.
                3       IN      PTR     test.
              
  4. 配置完成重启bind服务器。正常启动后服务器会监听53端口。修改/etc/resolv.conf文件,设置使用本地的dns服务器。使用dig www.g.cn命令就可以测试服务器是否能正常转发DNS解析,使用dig test.tiger命令可以查看是否正常解析本地域名。

下面介绍主从DNS服务器的配置过程,由于DNS服务器是网络的基础设施,如果DNS服务器故障会造成网络应用的中断。所以一般在网络上都有多台的DNS服务器同时提供服务。最简单的配置类型是主从方式,利用两台DNS服务器提供冗余备份服务。

  1. 首先配置主DNS服务器上的named.conf.options文档,指定从DNS服务器IP地址。配置完成重启bind服务。

                options {
                directory "/var/cache/bind";
                
                forwarders {
                61.28.10.68;
                210.21.4.130;
                };
                forward only;
                
                allow-transfer {192.168.1.3;};     //指定从DNS服务器地址
                auth-nxdomain no;    # conform to RFC1035
                listen-on-v6 { any; };
                };
              
  2. 配置主DNS服务器上的区域文档,新增DNS域。

                $TTL    86400
                @       IN      SOA     tiger. root.tiger. (
                1         ; Serial
                604800         ; Refresh
                86400         ; Retry
                2419200         ; Expire
                86400 )       ; Negative Cache TTL
                ;
                @       IN      NS      dns.tiger.
                @       IN      NS      test.tiger.       //新增的从DNS域
                dns  IN      A       192.168.1.2
                test IN      A       192.168.1.3
              

    同理,修改反解区域文档。

                $TTL    86400
                @       IN      SOA     tiger. root.tiger. (
                1         ; Serial
                604800         ; Refresh
                86400         ; Retry
                2419200         ; Expire
                86400 )       ; Negative Cache TTL
                ;
                @       IN      NS      dns.tiger.
                @       IN      NS      test.tiger.    //新增的从DNS域
                2       IN      PTR     dns.
                3       IN      PTR     test.
              
  3. 接着配置从DNS服务器上的named.conf.options文档。该配置文档和主服务器上类似,只是少了all-transfer选项。

                options {
                directory "/var/cache/bind";
                
                forwarders {
                61.28.10.68;
                210.21.4.130;
                };
                forward only;
                
                auth-nxdomain no;    # conform to RFC1035
                listen-on-v6 { any; };
                };
              
  4. 接着配置从DNS服务器上的named.conf.local文档,新增区域配置参数,设置从服务器参数和指定主服务器地址。

                zone "tiger" {
                type slave;               //类型设置为slave
                masters {192.168.1.2;};   //指定master的IP地址
                file "named.tiger";
                };
                zone "1.168.192.in-addr.arpa" {
                type slave;
                masters {192.168.1.2;};
                file "named.tiger.arpa";
                };  
              
  5. 配置完成,重启从DNS服务器上的bind服务。区域文档named.tiger和named.tiger.arpa不用手工创建,可从主服务器上自动传送过来。

主从服务器的同步是靠区域文档中的Serial参数来控制的。当主DNS服务器上的区域文档改变后,只要把区域文档中的 Serial参数值增1,则从DNS服务器就会自动同步区域文档。

Chapter 12. 系统安全

系统安全是应用的基础,一个安全的系统才能长时间不间断运行,有效支持我们的应用。建立一个安全的系统需要一个好的软硬件平台,但更重要的是要有一个优秀的系统管理员能及时地发现安全问题和解决安全问题。

安全等级

如何评价一个系统的安全程度,美国国家计算机安全中心(NCSC)制定了可信任计算机标准评价准则(TCSEC Trusted Computer System Evaluation Criteria)对计算机系统进行分级。共有4个类别7个等级,分别是:

A类

A1级:验证设计级(Verified Design),A1级是这套评价标准里的最高安全级别。要求组成系统的每个组件都需提供安全保证,并在出厂、销售、安装等的步骤中仍需保持这些特性。

B类

B3级:安全域级(Security Domain)

B2级:结构化保护级(Structured Protection)

B1级:标记安全保护级(Label Security Protection)

C类

C2级:受控安全保护级,Unix、Linux和Windows NT都是C2级的产品。

C1级:自主安全保护级(Discretionary Security Protection)

D类

D1级:安全保护欠缺级,Dos、Windows 95/98是D1级的产品。

TCSEC标准是计算机系统安全评估的第一个正式标准,于1985年12月由美国国防部公布。最初的TCSEC是一个军用的标准,后来延用于民用领域。随着技术的不断发展,新的功能被不断开发出来,对安全的评价标准提出了新的要求。欧洲四国(英、法、德、荷)提出了评价满足保密性、完整性、可用性要求的信息技术安全评价准则(ITSEC)。之后,美国联合英、法、德、荷和加拿大,会同国际化标准化组织(OSI)共同提出信息技术安全评价通用准则(CC for ITSEC)。

CC是目前最全面的安全评价准则,1996年6月,CC的第一版发布;1998年5月,第二版发布;1999年10月CC V2.1版发布,并正式成为ISO标准。

有关各种安全评价准则的详细介绍请参考相关的文档,这里就不一一展开说明了。

安全策略

在这个世界上没有绝对的安全,我们说这台服务器安全并不是说它绝对不会有安全风险,不会受到损害。只能说明该台服务器的安全可信度高,不易受到侵害。相反,如果我们说这台服务器不安全,即可信度低,则这台服务器可能是一些服务的配置有安全漏洞或没有做数据冗余。每种环境、每种应用的可信度要求是有不同的,不能一概而论,如作为企业中心数据库服务器的可信度要求就比内部WEB服务器的可信度要求高。需投入更多的资金和时间对数据库服务器进行配置和优化。为确保系统安全,我们需制定安全策略。安全策略涉及系统、网络、数据和人员等方方面面,制定的安全策略应考虑以下几个安全要素。

  • 机密性,信息或信息片段只应由合法用户访问,防止信息被非法用户访问。

  • 数据完整性,防止数据被非法修改或删除。

  • 可用性,防止服务的中断。

  • 一致性,确保提供的服务行为保持一致。

  • 可控性,控制用户对系统的访问。

  • 审计,记录用户的正常操作和错误操作,一旦发生事故,可通过日志追查事故的发生过程。

为了使安全策略更有效,更符合实际情况,我们在制定安全策略前需先进行风险评估,风险评估的内容包括:

  • 保护的范围和内容,并对所保护内容的价值进行估算。

  • 需防御的侵害。

  • 你可利用的资源,包括资金、人员、时间。

风险评估的步骤:

  • 收集、识别安全策略需保护的资产。这里说的资产不仅仅指计算机,还应包括数据、文档、企业利益和人人利益等。我们可把这些资产分成有形资产和无形资产两类。

    有形资产包括:

    • 计算机及其外设

    • 网络设备及线路

    • 电子文档

    • 软件

    • 系统日志

    无形资产包括:

    • 员工安全及健康

    • 员工的合法权益

    • 企业的形象

    • 客户的满意度

    • 员工的经验和知识

    • 系统密码

  • 收集、识别可能发生的侵害与威胁。包括:

    • 员工离职

    • 员工被收买

    • 员工无意或蓄意破坏

    • 电脑失窃

    • 计算机病毒

    • 黑客入侵

    • 网络线路故障

    • 洪水、雷击和台风等自然灾害

    • 硬件故障

    • 系统Bug

  • 费用-效益分析,分别计算损失费用和预防费用,并按损失的大小和发生机率的大小排列。优先处理损失大,发生机率高的项目。费用-效益分析可产生大量的数据,通过数据的展现,使管理层能更好地理解IT系统安全的重要性,投入更多的资源,提高可信息度。

无论你采取什么措施和投入多少资源,安全风险都是不能完全消除的。但我们可以把风险减低到我们可以接收的程度。同时,要求系统管理员不断跟踪系统变化和最新威胁,及时更新系统,才能使系统处于高可信度的状态。

一个完善的安全系统还包含一系列的说明文档,如安全策略、安全标准和安全指南。

  • 安全策略是一种指导性的文档,具有通用性,一旦确定,很少改动。安全策略应该包含以下内容。第一,它明确保护的对象和原因。第二,它明确了保护的责任。第三,它为解析和解决后续可能出现的冲突提供基础。

  • 安全标准通常需要用"必须"这个词来强调。如数据备份标准,网络使用标准。标准并不牵涉具体的技术实现,它只是一种安全事务的描述。

  • 安全指南是指安全事务的具体操作指南,可指引用户进行一步步的操作,指南会涉及具体的技术和工具。

制定安全策略应注意的内容:

  • 在编制安全文档时,需明确指定责任人,使大家明确自已所担当的责任。

  • 使用肯定的语气,明确指出用户应该做什么和应该怎么做。

  • 要培训用户,培养他们的安全意识。

  • 制定的规定或制度要权责一致,谁具有相应的安全职责就应该赋予他相应的权力,使他能保证安全职责的顺利执行。

  • 确定安全管理范围,应该包括的范围有:在家办公的计算机,外来的临时接入的计算机,PDA,远程接入的计算机,移动存储设备(U盘,CD,DVD等)。

  • 使用"没有特别声明禁止的事,默认是允许的"或"没有特别声明允许的事,默认是禁止的"两句中的一句作为安全描述的补充说明。

  • 在安全要求高的地方,可以设置二层或多层防御。加多几把锁虽然不能彻底防止入侵的风险,但可增加入侵的难度和时间。

安全是一个过程,需不断改进、验证和调整。

密码学原理

我们使用密码控制用户登录系统,授予相应的访问权限,用加密算法对信息进行加密和签名后,才在网上进行传输,密码和加密技术是我们确保系统安全的第一道屏障。密码学原理是这个技术的理论基础,这一节我们简单介绍一下密码学的原理。

常用算法

  • symmetric ciphers(对称加密算法),对称加密算法有DES, 3DES, Blowfish, AES (Rijndael), RC5, RC6,Serpent, 和 IDEA。可把信息加密成密文进行传送,在接收方再进行解密恢复成明文。

  • asymmetric ciphers(非对称加密算法),RSA是最常用的一种非对称加密算法,该算法会生成一对公钥和私钥,私钥自已保存,公钥可公开给用户。用一个密钥加密的信息只能由另外密钥对中另外一个密钥进行解密。

  • message digests(信息摘要),常用的摘要算法有MD5和SHA-1,它采用一种不可逆的算法,从一段信息中能很快计算出一个固定长度的值(摘要值),但要从摘要值中反向推导出信息内容基本上是不可能的。而且当原始信息改动一个字符,生成的摘要值就完全不同。通过这种特性,可把信息摘要用于验证传输数据的完整性。

  • digital signatures(数字签名)

信息安全的定义

  • Confidentiality(机密性),利用对称加官算法中的密钥在通信前对信息进行加密,密文在通信线路中传输,在接收方,用相同的密钥对信息进行解密。在传输前需进行密钥分发是它的一个弱点。

  • Integrity(完整性),在传输两端分别对信息进行摘要计算,比较前后两个摘要值就可确定信息在传输中有没有被篡改。

  • Authentication(验证),发送方用对信息进行摘要计算后再用私钥加密该摘要信息,最后用对称加密算法对这个包含明文信息和用私钥加密的摘要进行加密,形成密文。接收方解密出发送方用私钥加密的摘要值后,用发送方的公钥再解密摘要信息,如果成功,则验证了信息来源的正常性且不可否认性。接收方还可对接收的信息进行摘要计算,再与接收的摘要值比较,确认数据在传输过程中是否被修改过。

  • Non-repudiation(不可否认),验证和不可否认是关联的。

强化系统安全过程

下面介绍如何一步步地强化我们的Linux系统。

检查系统

在强化系统前,我们要检查我们的系统是否正常,在一个不正常运行或已受黑客破坏的系统上进行安全强化是没有任何意义的。

用户是系统安全的实体,系统通过用户来执行各种操作,所以我们强化安全的第一步就是确定系统中是否存在不合法的用户。在/etc/passwd文件中保存了系统所有的用户。下面列出Linux系统默认创建的一些系统用户。

  • root,超级用户,系统安全的焦点所在。

  • daemon,用来处理后台服务(程序)的用户。

  • bin,系统级二进制文件所有者,没有执行程序的权限。

  • mail,处理电子邮件。

  • uucp,拥有控制串口的权限。

  • news,处理Usenet新闻组。

  • lp,处理打印系统。

  • nobody,不拥有任何帐号,是执行非特权操作的默认帐号。

  • www或http,运行Web服务。

  • named,运行BIND服务器的帐号。

  • sshd,运行ssh服务的帐号。

  • backup,进行系统备份的帐号。

系统对应每个用户名赋予一个数字,叫uid(用户标识符),系统实际上是通过这个uid来控制用户行为的。uid为0的是超级用户,所以root的uid是0。如果我们把其他用户的uid设置成0,则这个用户也就变成了超级用户。还有一个gid(组标识符),在/etc/group文件中可查到系统上所有组。我们可把有相同权限的用户组成一个组,便于管理。在linux中,可用id命令查看当前用户uid和gid信息。在一个正常的系统中,应该只存在一个uid为0的root帐号,如果你的系统中还存其它uid为0的帐号,那你可要小心啦,这很可能是黑客所为。

debian:#~ id
uid=0(root) gid=0(root) groups=0(root)
	

用w或last命令查看用户登录帐号信息:

debian:#~ w
 10:18:15 up  1:50,  1 user,  load average: 0.11, 0.23, 0.27
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     :0       -                08:34   ?xdm?   8:42m  0.09s /bin/sh /usr/bin/startkde

如果发现可疑帐号,我们可以用以下命令来锁住它:

debian:#~ passwd -l username

如果系统被黑客攻陷,黑客一般会启动一些后台进程来干坏事。我们要经常运行"ps -aux"查看进程或用"netstat -ap"来查进程所监听的端口。一旦发现不熟悉的进程,应该马上进行追查。

另外一个记录黑客事件的地方就是日志文件,Linux提供详细的日志信息记录用户或进程的操作过程,通过一些失败操作的日志记录我们就可以发现黑客的蛛丝马迹。/var/log/message日志记录了大量系统级的日志信息,是我们关注的焦点。一些有经验的黑客会清除日志来隐藏所做的操作,这将给我们追查带来困难,但我们也可从日志记录的完整性方面进行分析,查出问题。

小技巧

下面介绍的内容将帮助你提高系统安全。

  • 找出所有的suid和sgid文件

    # find / \( -perm -004000 -o -perm -002000 \) -type f -print 
    

    模式004000表示suid,模式002000表示sgid。

  • 用mount的nosuid选项在安装文件系统时关闭suid和sgid。

    # mount -o nosuid /dev/hdb1 /mnt/hdb1
    
  • 在lilo.conf里设置密码控制,使用户在开机时需输入开机密码。

    ...
    
    timeout=00         #系统启动不进行倒数,直接启动指定内核
    restricted         #启用安全控制
    password=xxxxxx    #设置安全控制密码
    ...
    

    由于lilo.conf包含有开机密码,所以我们需把该文件的访问权限设置成只有root用户可访问,且不能更改。操作步骤如下:

    debian:~# chmod 0600 /etc/lilo.conf
    debian:~# chattr +i /etc/lilo.conf
    debian:~# lilo -v            #使lilo.conf配置生效
    

    chattr +i这个命令也适用于一些重要的文件,以防被破坏或恶意修改。

  • 在bash shell下输入的每条命令,都会存放在内存,当退出当前shell时,内存中的命令就会保存在.bash_history文件中。它们最多可记录500条命令。该功能的好处是可以记录你输入过的命令,方便查询和重复调用。但如果你在命令行上输入过密码,则很可能会泄漏给其他人,造成安全问题。所以我们要根据自已的安全要求和使用习惯,重新设置历史命令的记录情况。保存的命令行数受bash shell的HISTSIZE和HISTFILESIZE这两个环境变量控制。HISTSIZE控制当前shell中保存在内存中的历史命令行数,这些命令可用上下方向键来重复调用。HISTFILESIZE控制退出当前shell时保存在.bash_history文件中的命令行数,.bash_history里记录的命令行会在下一次登录shell时被读入内存供用户调用。这两个命令在/etc/profile文件中设置,设置方法如下:

    HISTSIZE=20
    HISTFILESIZE=0
    
  • 在/etc/profile时设置TIMEOUT环境变量,使bash shell在一定的时间内没有操作的情况下自动注销。如:

    TIMEOUT=60              #60秒没操作,bash shell将自动注销
    
  • 口令限制

  • 终端使用限制

  • 登录限制

  • 防火墙

  • 身份验证

  • 加密

  • 数字签名

  • 内容检查

  • 反病毒、反垃圾邮件

检查网络

网络服务是造成安全漏洞最主要的源头之一,为了确保系统的安全,我们要确保网络服务的安全。通常的做法是关闭掉不用的网络服务,或对有安全漏洞的服务增加安全措施。下面介绍如何加固网络安全。

  • 当我们重新安装一台服务器后,应首先关闭网络功能。等我们配置好网络安全后再连接上网络。我们可用ifconfig命令关闭网络。

    debian:~# ifconfig eth0 down
    

    如果有多个网卡,重复以上命令把eth0改成eth1、eth2...就可以啦。

  • 确定机器所需的服务和所需服务的依赖关系。

  • 关闭不需的服务,在各种发行版中,都有工具来管理服务。如rcconf,chkconfig,ntsysv等。

  • 重启系统,复查服务的配置情况是否正确。

  • 如果服务配置一切正常,则我们可以重新连接网络。

安装防火墙和过滤器

现在最新的Linux内核都是使用iptables作为防火墙软件,过滤器则使用tcp_wrappers。

iptables通过设置防火墙规则控制网络通信。用以下命令可以检查系统是否已启用iptables防火墙规则。

debian:~# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

如果出现如上的输出,则说明系统还没有设置防火墙规则。我们要根据实际情况进行设置。如果系统已设置有防火墙规则,则我们不能随便修改规则,需与设置规则的管理员联系,了解规则的作用和含意,以便日后进行维护。

tcp_wrappers过滤器用于保护通过Internet超级守护进程(inetd或xinetd)实现的服务。它主要靠两个文件来控制过滤规则,一个是/etc/hosts.allow,一个是/etc/hosts.deny。这两个文件的具体含义和设置请参考后面的debian常用配置文件说明一章的内容。

强化软件系统

软件是计算机的灵魂,计算机依靠软件完成实现各种功能。配置不当的软件或不必要的软件都会给系统造成安全问题。所以强化软件也是我们确保系统安全的重要步骤之一。我们应该采用最小化的原则,只安装必须的软件,下载软件时要到可信的网站下载,并使用MD5和GPG签名来验证软件包。

灾备

世上没有一个绝对安全的系统,我们应该随时做好灾难恢复的准备。有关灾难恢复的内容很多,可以用一章的内容来讨论。这里只给出一些常用的做法。

  • 尽量不要