2004年12月23日

    Red Hat Linux 8.0和9.0上测试通过。


服务器的安装略过不提,因为安装了开发工具的话默认就已经有了CVS。就算没有,更新软件包就可以搞定,除非你一定要安装最新版本。


1.首先创建用于CVS的组和用户:

代码:

#groupadd cvs

#useradd cvsroot -g cvs

#passwd cvsroot




OK,用户已经建立好了,cvsroot就是我们做CVS操作使用的。


2.修改配置文件

代码:

#more /etc/services | grep cvspserver




看看是否有

代码:

cvspserver 2401/tcp #CVS client/server operations

cvspserver 2401/udp #CVS client/server operations




这2行。系统自带了CVS时,这2行也已经有了,只需要确认一下。如果没有,请自己加上去。

然后必须创建启动脚本:

代码:

#vi /etc/xinet.d/cvspserver




内容如下

代码:

service cvspserver

{

disable = no

flags = REUSE

socket_type = stream

wait = no

user = root

server = /usr/bin/cvs

server_args = -f –allow-root=/home/cvsroot pserver

log_on_success += USERID

log_on_failure += USERID

}




其中server指定CVS可执行文件路径,默认安装就是/usr/bin/cvs。server_args指定源代码库路径及认证方式等,例子中把源代
码存放在cvsroot的主目录中,也可以另外指定路径,但必须注意权限设置,pserver是密码认证方式,这种方式的安全性要差一些,但操作起来比较
简单。请注意每行等号左右都有一个空格,否则无法启动服务。


3.初始化CVS

切换到cvsroot用户,然后进行初始化:

代码:

#cvs -d /home/cvsroot init




这个路径应该与cvspserver文件中指定的路径相同,初始化后会在此路径下面创建CVSROOT目录,存放用于CVS管理的一些文件。此时重新启动xinetd服务,CVS服务器应该能够启动了。

代码:

#service xinetd restart




当然,重新启动计算机也可以。确认是否启动:

代码:

#netstat -l | grep cvspserver




如果能看到

代码:

tcp 0 0 *:cvspserver *:* LISTEN




说明已经正常启动,没有的话请重新检查配置过程是否有错误或者遗漏。最后还必须检查防火墙的设置,把2401端口打开。


4.用户管理

CVS默认使用系统用户登录,为了系统安全性的考虑也可以使用独立的用户管理。CVS用户名和密码保存在CVSROOT目录下的passwd文件中,格式为:

代码:

用户名:密码:系统用户




也就是说,它把CVS用户映射到系统用户,这样我们就可以通过系统用户的权限设置来分配给用户不同的权限,而不需要让用户知道系统用户名和密码。

passwd文件默认并不存在,我们必须自己创建。文件中的密码字段使用MD5加密,不幸的是CVS没有提供添加用户名的命令,所以我们借用Apache的命令来完成这项工作:

代码:

#htpasswd passwd username




这个命令为username指定密码,并保存在passwd中,文件不存在时会自动创建。htpasswd命令不是为CVS而设,因此总有一些遗憾,它不
能自动添加映射到的用户名,不过没关系,我们设置好密码后,自己把这部分加上。我的做法是映射到cvsroot用户,如果需要映射其他的用户,请注意给相
应的目录设置好权限,否则CVS用户可能无法访问源代码仓库。

要彻底防止使用系统帐号登陆,可以编辑CVSROOT目录下的config文件,把

代码:

#SystemAuth=no




这一行前面的#去掉,CVS就不会验证系统用户了,否则当用户名不在passwd文件中时,CVS会进行系统用户的验证。

此外还必须配置读写权限,使用CVSROOT目录下的readers和writers文件进行这个工作。这2个文件默认也是没有的,没关系,自己创建就可
以了。readers文件记录拥有只读权限的用户名,每行一个用户;writers文件记录拥有读写权限的用户名,也是每行一个用户。注意,
readers文件比writers优先,也就是说出现在readers中的用户将会是只读的,不管writers文件中是否存在该用户。


配置完毕,先测试一下:

代码:

#cvs -d “:pserver:username@127.0.0.1:/home/cvsroot” login




这里假设用户名是username,本机登陆。出现密码提示,输入正确的密码后,登陆成功。如果提示访问被拒绝,请检查用户权限、目录权限以及防火墙设置。建议设置环境变量CVSROOT:

代码:

#export CVSROOT=:pserver:username@127.0.0.1:/home/cvsroot




以后就不需要输入-d参数了,但-d参数会覆盖这个环境变量的设置。


5.源代码仓库的备份和移动

基本上,CVS的源代码仓库没有什么特别之处,完全可以用文件备份的方式进行备份。需要注意的只是,应该确认备份的过程中没有用户提交修改,具体的做法可
以是停止CVS服务器或者使用锁等等。恢复时只需要把这些文件按原来的目录结构存放好,因为CVS的每一个模块都是单独的一个目录,与其他模块和目录没有
任何瓜葛,相当方便。甚至只需要在仓库中删除一个目录或者文件,便可以删除该模块的一些内容,不过并不建议这么做,使用CVS的删除功能将会有一个历史记
录,而对仓库的直接删除不留任何痕迹,这对项目管理是不利的。移动仓库与备份相似,只需要把该模块的目录移动到新的路径,便可以使用了。

如果不幸在备份之后有过一些修改并且执行了提交,当服务器出现问题需要恢复源代码仓库时,开发者提交新的修改就会出现版本不一致的错误。此时只需要把CVS相关的目录和文件删除,即可把新的修改提交。


6.更进一步的管理

CVSROOT目录下还有很多其他功能,其中最重要的就是modules文件。这个文件定义了源代码库的模块,下面是一个例子:

代码:

Linux Linux

Kernel Linux/kernel




这个文件的内容按行排列,每一行定义一个模块,首先是模块名,然后是模块路径,这是相对于CVS根目录的路径。它定义了两个模块,第一个是Linux模块,它位于Linux目录中,第二个是Kernel模块,这是Linux模块的子模块。

modules文件并非必须的,它的作用相当于一个索引,部分CVS客户端软件通过它可以快速找到相应的模块,比如WinCVS。


7.协同开发的问题

默认方式下,CVS允许多个用户编辑同一个文件,这对一个协作良好的团队来说不会有什么问题,因为多个开发者同时修改同一个文件的同一部分是不正常的,这
在项目管理中就应该避免,出现这种情况说明项目组内部没有统一意见。而多个开发者修改文件的不同部分,CVS可以很好的管理。

如果觉得这种方式难以控制,CVS也提供了解决办法,可以使用cvs admin
-l进行锁定,这样一个开发者正在做修改时CVS就不会允许其他用户checkout。这里顺便说明一下文件格式的问题,对于文本格式,CVS可以进行历
史记录比较、版本合并等工作,而二进制文件不支持这个操作,比如word文档、图片等就应该以二进制方式提交。对于二进制方式,由于无法进行合并,在无法
保证只有一个用户修改文件的情况下,建议使用加锁方式进行修改。必须注意的是,修改完毕记得解锁。

从1.6版本开始,CVS引入了监视的概念,这个功能可以让用户随时了解当前谁在修改文件,并且CVS可以自动发送邮件给每一个监视的用户告知最新的更新。


8.建立多个源代码仓库

如果需要管理多个开发组,而这些开发组之间不能互相访问,可以有2个办法:

a.共用一个端口,需要修改cvspserver文件,给server_args指定多个源代码路径,即多个—allow-root参数。由于xinetd的server_args长度有限制,可以在cvspserver文件中把服务器的设置重定向到另外一个文件,如:

代码:

server = /home/cvsroot/cvs.run




然后创建/home/cvsroot/cvs.run文件,该文件必须可执行,内容格式为:

代码:

#!/bin/bash

/usr/bin/cvs -f \

–allow-root=/home/cvsroot/src1 \

–allow-root=/home/cvsroot/src2 \

pserver




注意此时源代码仓库不再是/home/cvsroot,进行初始化的时候要分别对这两个仓库路径进行初始化,而不再对/home/cvsroot路径进行初始化。

b.采用不同的端口提供服务

重复第2步和第3步,为不同的源代码仓库创建不同服务名的启动脚本,并为这些服务名指定不同的端口,初始化时也必须分别进行初始化。

2004年07月30日

本文列出了大部分常见的Linux系统调用,并附有简要中文说明。

以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。

按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使用,不允许用户调用的系统调用,对个别本人稍觉不妥的地方作了一些小的修改,并对所有列出的系统调用附上简要注释。

其中有一些函数的作用完全相同,只是参数不同。(可能很多熟悉C++朋友马上就能联想起函数重载,但是别忘了Linux核心是用C语言写的,所以只能取成不同的函数名)。还有一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数我会在前面标上“*”号以示区别。

一、进程控制:

fork 创建一个新进程
clone 按指定条件创建子进程
execve 运行可执行文件
exit 中止进程
_exit 立即中止当前进程
getdtablesize 进程所能打开的最大文件数
getpgid 获取指定进程组标识号
setpgid 设置指定进程组标志号
getpgrp 获取当前进程组标识号
setpgrp 设置当前进程组标志号
getpid 获取进程标识号
getppid 获取父进程标识号
getpriority 获取调度优先级
setpriority 设置调度优先级
modify_ldt 读写进程的本地描述表
nanosleep 使进程睡眠指定的时间
nice 改变分时进程的优先级
pause 挂起进程,等待信号
personality 设置进程运行域
prctl 对进程进行特定操作
ptrace 进程跟踪
sched_get_priority_max 取得静态优先级的上限
sched_get_priority_min 取得静态优先级的下限
sched_getparam 取得进程的调度参数
sched_getscheduler 取得指定进程的调度策略
sched_rr_get_interval 取得按RR算法调度的实时进程的时间片长度
sched_setparam 设置进程的调度参数
sched_setscheduler 设置指定进程的调度策略和参数
sched_yield 进程主动让出处理器,并将自己等候调度队列队尾
vfork 创建一个子进程,以供执行新程序,常与execve等同时使用
wait 等待子进程终止
wait3 参见wait
waitpid 等待指定子进程终止
wait4 参见waitpid
capget 获取进程权限
capset 设置进程权限
getsid 获取会晤标识号
setsid 设置会晤标识号

二、文件系统控制

1、文件读写操作

fcntl 文件控制
open 打开文件
creat 创建新文件
close 关闭文件描述字
read 读文件
write 写文件
readv 从文件读入数据到缓冲数组中
writev 将缓冲数组里的数据写入文件
pread 对文件随机读
pwrite 对文件随机写
lseek 移动文件指针
_llseek 在64位地址空间里移动文件指针
dup 复制已打开的文件描述字
dup2 按指定条件复制文件描述字
flock 文件加/解锁
poll I/O多路转换
truncate 截断文件
ftruncate 参见truncate
umask 设置文件权限掩码
fsync 把文件在内存中的部分写回磁盘

2、文件系统操作

access 确定文件的可存取性
chdir 改变当前工作目录
fchdir 参见chdir
chmod 改变文件方式
fchmod 参见chmod
chown 改变文件的属主或用户组
fchown 参见chown
lchown 参见chown
chroot 改变根目录
stat 取文件状态信息
lstat 参见stat
fstat 参见stat
statfs 取文件系统信息
fstatfs 参见statfs
readdir 读取目录项
getdents 读取目录项
mkdir 创建目录
mknod 创建索引节点
rmdir 删除目录
rename 文件改名
link 创建链接
symlink 创建符号链接
unlink 删除链接
readlink 读符号链接的值
mount 安装文件系统
umount 卸下文件系统
ustat 取文件系统信息
utime 改变文件的访问修改时间
utimes 参见utime
quotactl 控制磁盘配额

三、系统控制

ioctl I/O总控制函数
_sysctl 读/写系统参数
acct 启用或禁止进程记账
getrlimit 获取系统资源上限
setrlimit 设置系统资源上限
getrusage 获取系统资源使用情况
uselib 选择要使用的二进制函数库
ioperm 设置端口I/O权限
iopl 改变进程I/O权限级别
outb 低级端口操作
reboot 重新启动
swapon 打开交换文件和设备
swapoff 关闭交换文件和设备
bdflush 控制bdflush守护进程
sysfs 取核心支持的文件系统类型
sysinfo 取得系统信息
adjtimex 调整系统时钟
alarm 设置进程的闹钟
getitimer 获取计时器值
setitimer 设置计时器值
gettimeofday 取时间和时区
settimeofday 设置时间和时区
stime 设置系统日期和时间
time 取得系统时间
times 取进程运行时间
uname 获取当前UNIX系统的名称、版本和主机等信息
vhangup 挂起当前终端
nfsservctl 对NFS守护进程进行控制
vm86 进入模拟8086模式
create_module 创建可装载的模块项
delete_module 删除可装载的模块项
init_module 初始化模块
query_module 查询模块信息
*get_kernel_syms 取得核心符号,已被query_module代替

四、内存管理

brk 改变数据段空间的分配
sbrk 参见brk
mlock 内存页面加锁
munlock 内存页面解锁
mlockall 调用进程所有内存页面加锁
munlockall 调用进程所有内存页面解锁
mmap 映射虚拟内存页
munmap 去除内存页映射
mremap 重新映射虚拟内存地址
msync 将映射内存中的数据写回磁盘
mprotect 设置内存映像保护
getpagesize 获取页面大小
sync 将内存缓冲区数据写回硬盘
cacheflush 将指定缓冲区中的内容写回磁盘

五、网络管理

getdomainname 取域名
setdomainname 设置域名
gethostid 获取主机标识号
sethostid 设置主机标识号
gethostname 获取本主机名称
sethostname 设置主机名称

六、socket控制

socketcall socket系统调用
socket 建立socket
bind 绑定socket到端口
connect 连接远程主机
accept 响应socket连接请求
send 通过socket发送信息
sendto 发送UDP信息
sendmsg 参见send
recv 通过socket接收信息
recvfrom 接收UDP信息
recvmsg 参见recv
listen 监听socket端口
select 对多路同步I/O进行轮询
shutdown 关闭socket上的连接
getsockname 取得本地socket名字
getpeername 获取通信对方的socket名字
getsockopt 取端口设置
setsockopt 设置端口参数
sendfile 在文件或端口间传输数据
socketpair 创建一对已联接的无名socket

七、用户管理

getuid 获取用户标识号
setuid 设置用户标志号
getgid 获取组标识号
setgid 设置组标志号
getegid 获取有效组标识号
setegid 设置有效组标识号
geteuid 获取有效用户标识号
seteuid 设置有效用户标识号
setregid 分别设置真实和有效的的组标识号
setreuid 分别设置真实和有效的用户标识号
getresgid 分别获取真实的,有效的和保存过的组标识号
setresgid 分别设置真实的,有效的和保存过的组标识号
getresuid 分别获取真实的,有效的和保存过的用户标识号
setresuid 分别设置真实的,有效的和保存过的用户标识号
setfsgid 设置文件系统检查时使用的组标识号
setfsuid 设置文件系统检查时使用的用户标识号
getgroups 获取后补组标志清单
setgroups 设置后补组标志清单

八、进程间通信

ipc 进程间通信总控制调用

1、信号

sigaction 设置对指定信号的处理方法
sigprocmask 根据参数对信号集中的信号执行阻塞/解除阻塞等操作
sigpending 为指定的被阻塞信号设置队列
sigsuspend 挂起进程等待特定信号
signal 参见signal
kill 向进程或进程组发信号
*sigblock 向被阻塞信号掩码中添加信号,已被sigprocmask代替
*siggetmask 取得现有阻塞信号掩码,已被sigprocmask代替
*sigsetmask 用给定信号掩码替换现有阻塞信号掩码,已被sigprocmask代替
*sigmask 将给定的信号转化为掩码,已被sigprocmask代替
*sigpause 作用同sigsuspend,已被sigsuspend代替
sigvec 为兼容BSD而设的信号处理函数,作用类似sigaction
ssetmask ANSI C的信号处理函数,作用类似sigaction

2、消息

msgctl 消息控制操作
msgget 获取消息队列
msgsnd 发消息
msgrcv 取消息

3、管道

pipe 创建管道

4、信号量

semctl 信号量控制
semget 获取一组信号量
semop 信号量操作

5、共享内存

shmctl 控制共享内存
shmget 获取共享内存
shmat 连接共享内存
shmdt 拆卸共享内存
2004年07月29日

     日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。

  在Linux系统中,有三个主要的日志子系统:

  连接时间日志–由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。

  进程统计–由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。

  错误日志–由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

  常用的日志文件如下:

  access-log         纪录HTTP/web的传输

  acct/pacct         纪录用户命令

  aculog           纪录MODEM的活动

  btmp            纪录失败的纪录

  lastlog           纪录最近几次成功登录的事件和最后一次不成功的登录

  messages          从syslog中记录信息(有的链接到syslog文件)

  sudolog           纪录使用sudo发出的命令

  sulog           纪录使用su命令的使用

  syslog           从syslog中记录信息(通常链接到messages文件)

  utmp            纪录当前登录的每个用户

  wtmp            一个用户每次登录进入和退出时间的永久纪录

  xferlog           纪录FTP会话

  utmp、wtmp和lastlog日志文件是多数重用UNIX日志子系统的关键–保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件utmp中;登录进入和退出纪录在文件wtmp中;最后一次登录文件可以用lastlog命令察看。数据交换、关机和重起也记录在wtmp文件中。所有的纪录都包含时间戳。这些文件(lastlog通常不大)在具有大量用户的系统中增长十分迅速。例如wtmp文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把wtmp配置成循环使用。它通常由cron运行的脚本来修改。这些脚本重新命名并循环使用wtmp文件。通常,wtmp在第一天结束后命名为wtmp.1;第二天后wtmp.1变为wtmp.2等等,直到wtmp.7。

  每次有一个用户登录时,login程序在文件lastlog中察看用户的UID。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后login程序在lastlog中纪录新的登录时间。在新的lastlog纪录写入后,utmp文件打开并插入用户的utmp纪录。该纪录一直用到用户登录退出时删除。utmp文件被各种命令文件使用,包括who、w、users和finger。

  下一步,login程序打开文件wtmp附加用户的utmp纪录。当用户登录退出时,具有更新时间戳的同一utmp纪录附加到文件中。wtmp文件被程序last和ac使用。

具体命令
  wtmp和utmp文件都是二进制文件,他们不能被诸如tail命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac来使用这两个文件包含的信息。

  who:who命令查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。例如:who(回车)显示

  chyang     pts/0 Aug     18 15:06

  ynguo     pts/2 Aug     18 15:32

  ynguo     pts/3 Aug     18 13:55

  lewis     pts/4 Aug     18 13:35

  ynguo     pts/7 Aug     18 14:12

  ylou     pts/8 Aug     18 14:15

  如果指明了wtmp文件名,则who命令查询所有以前的纪录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。

  w:w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如:w(回车)显示:3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27。

  USER   TTY    FROM     LOGIN@ IDLE JCPU PCPU  WHAT

  chyang pts/0 202.38.68.242  3:06pm 2:04 0.08s 0.04s -bash

  ynguo pts/2 202.38.79.47   3:32pm 0.00s 0.14s 0.05   w

  lewis pts/3 202.38.64.233  1:55pm 30:39 0.27s 0.22s -bash

  lewis pts/4 202.38.64.233  1:35pm 6.00s 4.03s 0.01s sh /home/users/

  ynguo pts/7 simba.nic.ustc.e 2:12pm 0.00s 0.47s 0.24s telnet mail

  ylou  pts/8 202.38.64.235  2:15pm 1:09m 0.10s 0.04s  -bash

  
  users:users用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。例如:users(回车)显示:chyang lewis lewis ylou ynguo ynguo

  last:last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如:

  chyang pts/9  202.38.68.242 Tue Aug 1 08:34 – 11:23 (02:49)

  cfan  pts/6  202.38.64.224 Tue Aug 1 08:33 – 08:48 (00:14)

  chyang pts/4  202.38.68.242 Tue Aug 1 08:32 – 12:13 (03:40)

  lewis pts/3  202.38.64.233 Tue Aug 1 08:06 – 11:09 (03:03)

  lewis pts/2  202.38.64.233 Tue Aug 1 07:56 – 11:09 (03:12)

  如果指明了用户,那么last只报告该用户的近期活动,例如:last ynguo(回车)显示:

  ynguo  pts/4 simba.nic.ustc.e Fri Aug 4 16:50 – 08:20 (15:30)

  ynguo  pts/4 simba.nic.ustc.e Thu Aug 3 23:55 – 04:40 (04:44)

  ynguo  pts/11 simba.nic.ustc.e Thu Aug 3 20:45 – 22:02 (01:16)

  ynguo  pts/0 simba.nic.ustc.e Thu Aug 3 03:17 – 05:42 (02:25)

  ynguo  pts/0 simba.nic.ustc.e Wed Aug 2 01:04 – 03:16 1+02:12)

  ynguo  pts/0 simba.nic.ustc.e Wed Aug 2 00:43 – 00:54 (00:11)

  ynguo  pts/9 simba.nic.ustc.e Thu Aug 1 20:30 – 21:26 (00:55)

  ac:ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间。例如:ac(回车)显示:total 5177.47

  ac -d(回车)显示每天的总的连结时间

  Aug 12 total 261.87

  Aug 13 total 351.39

  Aug 14 total 396.09

  Aug 15 total 462.63

  Aug 16 total 270.45

  Aug 17 total 104.29

  Today total 179.02

  ac -p (回车)显示每个用户的总的连接时间

  ynguo 193.23

  yucao 3.35

  rong 133.40

  hdai 10.52

  zjzhu 52.87

  zqzhou 13.14

  liangliu 24.34

  total 5178.24

  lastlog:lastlog文件在每次有用户登录时被查询。可以使用lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示”**Never logged**。注意需要以root运行该命令,例如:

  rong      5   202.38.64.187         Fri Aug 18 15:57:01 +0800 2000

  dbb                           **Never logged in**

  xinchen                         **Never logged in**

  pb9511                         **Never logged in**

  xchen     0   202.38.64.190         Sun Aug 13 10:01:22 +0800 2000

  另外,可一加一些参数,例如,last -u 102将报告UID为102的用户;last -t 7表示限制上一周的报告。

  进程统计
  UNIX可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它对还跟踪一个侵入者有帮助。与连接时间日志不同,进程统计子系统缺省不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。Accton命令的形式accton file,file必须先存在。先使用touch命令来创建pacct文件:touch /var/log/pacct,然后运行accton: accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的accton命令。

  lastcomm命令报告以前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。下面的例子:

  crond     F   root   ??   0.00 secs Sun Aug 20 00:16

  promisc_check.s S   root   ??   0.04 secs Sun Aug 20 00:16

  promisc_check     root   ??   0.01 secs Sun Aug 20 00:16

  grep          root   ??   0.02 secs Sun Aug 20 00:16

  tail          root   ??   0.01 secs Sun Aug 20 00:16

  sh           root   ??   0.01 secs Sun Aug 20 00:15

  ping      S   root   ??   0.01 secs Sun Aug 20 00:15

  ping6.pl    F   root   ??   0.01 secs Sun Aug 20 00:15

  sh           root   ??   0.01 secs Sun Aug 20 00:15

  ping      S   root   ??   0.02 secs Sun Aug 20 00:15

  ping6.pl    F   root   ??   0.02 secs Sun Aug 20 00:15

  sh           root   ??   0.02 secs Sun Aug 20 00:15

  ping S root ?? 0.00 secs Sun Aug 20 00:15

  ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15

  sh root ?? 0.01 secs Sun Aug 20 00:15

  ping S root ?? 0.01 secs Sun Aug 20 00:15

  sh root ?? 0.02 secs Sun Aug 20 00:15

  ping S root ?? 1.34 secs Sun Aug 20 00:15

  locate root ttyp0 1.34 secs Sun Aug 20 00:15

  accton S root ttyp0 0.00 secs Sun Aug 20 00:15

  进程统计的一个问题是pacct文件可能增长的十分迅速。这时需要交互式的或经过cron机制运行sa命令来保持日志数据在系统控制内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和/var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。sa缺省情况下先读它们,然后读pacct文件,使报告能包含所有的可用信息。sa的输出有下面一些标记项:

  avio–每次执行的平均I/O操作次数

  cp–用户和系统时间总和,以分钟计

  cpu–和cp一样

  k–内核使用的平均CPU时间,以1k为单位

  k*sec–CPU存储完整性,以1k-core秒

  re–实时时间,以分钟计

  s–系统时间,以分钟计

  tio–I/O操作的总数

  u–用户时间,以分钟计

  例如:

  842   173.26re    4.30cp 0avio 358k

  2   10.98re     4.06cp 0avio 299k find

  9   24.80re     0.05cp 0avio 291k ***other

  105   30.44re     0.03cp 0avio 302k ping

  104   30.55re     0.03cp 0avio 394k sh

  162   0.11re     0.03cp 0avio 413k security.sh*

  154   0.03re     0.02cp 0avio 273k ls

  56   31.61re     0.02cp 0avio 823k ping6.pl*

  2   3.23re     0.02cp 0avio 822k ping6.pl

  35   0.02re     0.01cp 0avio 257k md5sum

  97   0.02re     0.01cp 0avio 263k initlog

  12 0.19re 0.01cp 0avio 399k promisc_check.s

  15 0.09re 0.00cp 0avio 288k grep

  11 0.08re 0.00cp 0avio 332k awk

  用户还可以根据用户而不是命令来提供一个摘要报告。例如sa -m显示如下:

      885   173.28re    4.31cp 0avk

  root  879   173.23re    4.31cp 0avk

  alias 3   0.05re     0.00cp 0avk

  qmailp 3   0.01re     0.00cp 0avk

Syslog设备
  Syslog已被许多日志函数采纳,它用在许多保护措施中–任何程序都可以通过syslog 纪录事件。Syslog可以纪录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。

  Syslog设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日之中出现)。

  
  每个syslog消息被赋予下面的主要设备之一:

  LOG_AUTH–认证系统:login、su、getty等

  LOG_AUTHPRIV–同LOG_AUTH,但只登录到所选择的单个用户可读的文件中

  LOG_CRON–cron守护进程

  LOG_DAEMON–其他系统守护进程,如routed

  LOG_FTP–文件传输协议:ftpd、tftpd

  LOG_KERN–内核产生的消息

  LOG_LPR–系统打印机缓冲池:lpr、lpd

  LOG_MAIL–电子邮件系统

  LOG_NEWS–网络新闻系统

  LOG_SYSLOG–由syslogd(8)产生的内部消息

  LOG_USER–随机用户进程产生的消息

  LOG_UUCP–UUCP子系统

  LOG_LOCAL0~LOG_LOCAL7–为本地使用保留

  Syslog为每个事件赋予几个不同的优先级:

  LOG_EMERG–紧急情况

  LOG_ALERT–应该被立即改正的问题,如系统数据库破坏

  LOG_CRIT–重要情况,如硬盘错误

  LOG_ERR–错误

  LOG_WARNING–警告信息

  LOG_NOTICE–不是错误情况,但是可能需要处理

  LOG_INFO–情报信息

  LOG_DEBUG–包含情报的信息,通常旨在调试一个程序时使用

  syslog.conf文件指明syslogd程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。所以如果指明”crit”,那所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,如果想把所有邮件消息纪录到一个文件中,如下:

  #Log all the mail messages in one place

  mail.* /var/log/maillog

  其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为”err”或更高。例如:

  # Save mail and news errors of level err and higher in aspecial file.

  uucp,news.crit /var/log/spooler

  当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

  #Everybody gets emergency messages, plus log them on anther machine

  *.emerg *

  *.emerg @linuxaid.com.cn

  alert消息应该写到root和tiger的个人账号中:

  #Root and Tiger get alert and higher messages

  *.alert root,tiger

  有时syslogd将产生大量的消息。例如内核(”kern”设备)可能很冗长。用户可能想把内核消息纪录到/dev/console中。下面的例子表明内核日志纪录被注释掉了:

  #Log all kernel messages to the console

  #Logging much else clutters up the screen

  #kern.* /dev/console

  用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别”none”禁止一个设备:

  #Log anything(except mail)of level info or higher

  #Don’t log private authentication messages!

  *.info:mail.none;autHPriv.none /var/log/messages

  在有些情况下,可以把日志送到打印机,这样网络抢劫服务器者怎么修改日志都没有用了。通常要广泛纪录日志。Syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。

  有个小命令logger为syslog(3)系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。用法:logger 例如:logger This is a test!

  它将产生一个如下的syslog纪录:Aug 19 22:22:34 tiger: This is a test!

  注意不要完全相信日志,因为攻击者很容易修改它的。

  5. 程序日志

  许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的文件为sulog。同样的还有sudolog。另外,想Apache有两个日志:access_log和error_log。

  6. 其他日志工具

  chklastlog

  ftp://coast.cs.purdue.edu/pub/tools/unix/chklastlog/

  chkwtmp

  ftp://coast.cs.purdue.edu/pub/tools/unix/chkwtmp/

  dump_lastlog

  ftp://coast.cs.purdue.edu/pub/tools/unix/dump_lastlog.Z

  spar

  ftp://coast.cs.purdue.edu/pub/tools/unix/TAMU/

  Swatch

  http://www.lomar.org/komar/alek/pres/swatch/cover.html

  Zap

  ftp://caost.cs.purdue.edu/pub/tools/unix/zap.tar.gz

  日志分类方法

  http://csrc.nist.gov/nissc/1998/proceedings/paperD1.pdf

OpenSSH

OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持 SSH 协议的版本 1.3、1.5、和 2。自从 OpenSSH 的版本 2.9 以来,默认的协议是版本 2,该协议默认使用 RSA 钥匙。

1. 为什么使用 SSH?
使用 OpenSSH 工具将会增进你的系统安全性。 所有使用 OpenSSH 工具的通讯,包括口令,都会被加密。 telnet 和 ftp 使用纯文本口令,并被明文发送。这些信息可能会被截取,口令可能会被检索,然后未经授权的人员可能会使用截取的口令登录进你的系统而对你的系统造成危害。你应该尽可能地使用 OpenSSH 的工具集合来避免这些安全问题。
另一个使用 OpenSSH 的原因是,它自动把 DISPLAY 变量转发给客户机器。换一句话说,如果你在本地机器上运行 X 窗口系统,并且使用 ssh 命令登录到了远程机器上,当你在远程机器上执行一个需要 X 的程序时,它会显示在你的本地机器上。如果你偏爱图形化系统管理工具,却不能够总是亲身访问该服务器,这就会为你的工作大开方便之门。

2. 配置 OpenSSH 服务器
要运行 OpenSSH 服务器,你必须首先确定你安装了正确的 RPM 软件包。openssh-server 软件包是必不可少的,并且它依赖于 openssh 软件包的安装与否。
OpenSSH 守护进程使用 /etc/ssh/sshd_config 配置文件。Red Hat Linux 9 安装的默认配置文件在多数情况下应该足以胜任。如果你想使用没有被默认的 sshd_config 文件提供的方式来配置守护进程,请阅读 sshd 的说明书(man)页来获取能够在配置文件中定义的关键字列表。
要启动 OpenSSH 服务,使用 /sbin/service sshd start 命令。要停止 OpenSSH 服务器,使用 /sbin/service sshd stop 命令。如果你想让守护进程在引导时自动启动,请参阅相关资料来获取关于如何管理服务的信息。
如果你重新安装了 Red Hat Linux 系统,任何在它被重装前使用 OpenSSH 工具连接到这个系统上的客户在它被重装后将会看到下列消息:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.

重装后的系统会为自己创建一组新的身份标识钥匙;因此客户会看到 RSA 主机钥匙改变的警告。如果你想保存系统原有的主机钥匙,备份 /etc/ssh/ssh_host*key* 文件,然后在系统重装后恢复它。该过程会保留系统的身份。当客户机在该系统重装后试图连接它,它们就不会看到以上的警告信息。(还有一种解决方法见:http://chinaunix.net/forum/viewtopic.php?t=109562&start=0)

3. 配置 OpenSSH 客户
要从客户机连接到 OpenSSH 服务器上,你必须在客户机器上装有 openssh-clients 和 openssh 软件包。

3.1. 使用 ssh 命令
ssh 命令是 rlogin、rsh 和 telnet 命令的安全替换。它允许你在远程机器上登录并在其上执行命令。
使用 ssh 来登录到远程机器和使用 telnet 相似。要登录到一个叫做 penguin.example.net 的远程机器,在 shell 提示下键入下面的命令:
ssh penguin.example.net
第一次使用 ssh 在远程机器上登录时,你会看到和下面相仿的消息:
The authenticity of host penguin.example.net cant be established.
DSA key fingerprint is 94:68:3a:3a:bc:f3:9a:9b:01:5d:b3:07:38:e2:11:0c.
Are you sure you want to continue connecting (yes/no)?
键入 yes 来继续。这会把该服务器添加到你的已知主机的列表中,如下面的消息所示:
Warning: Permanently added penguin.example.net (RSA) to the list of known hosts.
下一步,你会看到向你询问远程主机口令的提示。在输入口令后,你就会在远程主机的 shell 提示下了。如果你没有指定用户名,你在本地客户机器上登录用的用户名就会被传递给远程机器。如果你想指定不同的用户名,使用下面的命令:
ssh username@penguin.example.net
你还可以使用 ssh -l username penguin.example.net。
ssh 命令可以用来在远程机器上不经 shell 提示登录而执行命令。它的语法格式是: ssh hostname command。譬如,如果你想在远程主机 penguin.example.net 上执行 ls /usr/share/doc 命令,在 shell 提示下键入下面的命令:
ssh penguin.example.net ls /usr/share/doc
在你输入了正确的口令之后, /usr/share/doc 这个远程目录中的内容就会被显示,然后你就会被返回到你的本地 shell 提示下。

3.2. 使用 scp 命令
scp 命令可以用来通过安全、加密的连接在机器间传输文件。它与 rcp 相似。
把本地文件传输给远程系统的一般语法是:
scp localfile username@tohostname:/newfilename
localfile 指定源文件,username@tohostname:/newfilename 指定目标文件。
要把本地文件 shadowman 传送到你在 penguin.example.net 上的账号内,在 shell 提示下键入(把 username 替换成你的用户名):
scp shadowman username@penguin.example.net:/home/username
这会把本地文件 shadowman 传输给 penguin.example.net 上的 /home/username/shadowman 文件。
把远程文件传输给本地系统的一般语法是:
scp username@tohostname:/remotefile /newlocalfile
remotefile 指定源文件,newlocalfile 指定目标文件。
源文件可以由多个文件组成。譬如,要把目录 /downloads 的内容传输到远程机器 penguin.example.net 上现存的 uploads 目录,在 shell 提示下键入下列命令:
scp /downloads/* username@penguin.example.net:/uploads/

3.3. 使用 sftp 命令
sftp 工具可以用来打开一次安全互动的 FTP 会话。它与 ftp 相似, 只不过,它使用安全、加密的连接。它的一般语法是:sftp username@hostname.com。一旦通过 验证,你可以使用一组和使用 FTP 相似的命令。请参阅 sftp 的说明书页(man)来获取这些 命令的列表。要阅读说明书页,在 shell 提示下执行 man sftp 命令。sftp 工具只在 OpenSSH 版本 2.5.0p1 以上才有。

3.4. 生成钥匙对
如果你不想每次使用 ssh、scp 或 sftp 时都要输入口令来连接远程机器,你可以生成一对授权钥匙。
钥匙必须为每个用户生成。要为某用户生成钥匙,用想连接到远程机器的用户身份来遵循下面的步骤。如果你用根用户的身份完成了下列步骤,就只有根用户才能使用这对钥匙。
从 OpenSSH 版本 3.0 开始,~/.ssh/authorized_keys2、~/.ssh/known_hosts2 和 /etc/ssh_known_hosts2 就会过时。SSH 协议 1 和 2 共享 ~/.ssh/authorized_keys、~/.ssh/known_hosts 和 /etc/ssh/ssh_known_hosts 文件。
Red Hat Linux 9 默认使用 SSH 协议 2 和 RSA 钥匙。
窍门
如果你重装了 Red Hat Linux,但是想保留现有的钥匙对,备份你的主目录中的 .ssh 目录。重装后,把该目录复制回主目录。该进程可为系统上的所有用户进行,包括根用户。

3.4.1. 为版本 2 生成 RSA 钥匙对
使用下列步骤来为 SSH 协议的版本 2 生成 RSA 钥匙对。从 OpenSSH 2.9 开始,它已成为默认设置。
1. 要生成 RSA 钥匙对与协议的版本 2 合作,在 shell 提示下键入下列命令:
ssh-keygen -t rsa
接受 ~/.ssh/id_rsa 的默认位置。输入一个与你的帐号口令不同的口令句,再输入一次来确认。
公钥被写入 ~/.ssh/id_rsa.pub。密钥被写入 ~/.ssh/id_rsa。决不能把密钥出示给任何人。
2. 使用 chmod 755 ~/.ssh 命令改变你的 .ssh 目录的许可权限。
3. 把 ~/.ssh/id_rsa.pub 的内容复制到你想连接的机器上的 ~/.ssh/authorized_keys 文件中。如果 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/id_rsa.pub 文件复制到那个机器上的 ~/.ssh/authorized_keys 文件中。
4. 如果你运行的是 GNOME,跳到第 3.4.4 节。如果你没在运行 X 窗口系统,跳到第 3.4.5 节。

3.4.2. 为版本 2 生成 DSA 钥匙对
使用下面的步骤来为 SSH 协议的版本 2 生成 DSA 钥匙对。
1. 要生成用于协议的版本 2 的 DSA 钥匙对,在 shell 提示下键入下面的命令:
ssh-keygen -t dsa
接受 ~/.ssh/id_dsa 的默认位置。输入一个与你的帐号口令不同的口令句,再输入一次来确认。
窍门
口令句是用来验证用户的一串词汇和字符。 口令句和一般口令的不同之处在于:在口令句中你可以使用空格或制表符。口令句通常比一般口令长,因为它们通常使用短语而不仅仅用一个词。
公钥被写入 ~/.ssh/id_dsa.pub。密钥被写入 ~/.ssh/id_dsa。决不能把密钥出示给任何人,这一点很重要。
2. 使用 chmod 755 ~/.ssh 命令改变你的 .ssh 目录的许可权限。
3. 把 ~/.ssh/id_dsa.pub 的内容复制到你想连接的机器中的 ~/.ssh/authorized_keys 文件中。如果文件 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/id_dsa.pub 文件复制到那个机器上的 ~/.ssh/authorized_keys文件中。
4. 如果你运行的是 GNOME,跳到第 3.4.4 节。如果你没在运行 X 窗口系统,跳到 第 3.4.5 节。

3.4.3. 为版本 1.3 和 1.5 生成 DSA 钥匙对
使用下面的步骤来生成用于 SSH 协议版本 1 的 RSA 钥匙对。如果你只在使用 DSA 的系统间连接,则不需要 RSA 版本 1.3 或 RSA 版本 1.5 钥匙对。
1. 要生成 RSA (版本 1.3 和 1.5 协议)钥匙对,在 shell 提示下键入下列命令:
ssh-keygen -t rsa1
接受默认的位置 (~/.ssh/identity)。输入和你的帐号口令不同的口令句。再输入一次来确认。
公钥被写入 ~/.ssh/identity.pub。密钥被写入 ~/.ssh/identity。不要把你的密钥出示给任何人。
2. 使用 chmod 755 ~/.ssh 和 chmod 644 ~/.ssh/identity.pub 命令改变你的 .ssh 目录和密钥的许可权限。
3. 把 ~/.ssh/identity.pub 的内容复制到你想连接的机器中的 ~/.ssh/authorized_keys 文件中。如果文件 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/identity.pub 文件复制到远程机器上的 ~/.ssh/authorized_keys 文件中。
4. 如果你运行的是 GNOME,跳到第 3.4.4 节。如果你没在运行 GNOME, 跳到第 3.4.5 节。

3.4.4. 在 GNOME 中配置 ssh-agent
ssh-agent 工具可以用来保存你的口令句,因此你不必在每次引发 ssh 或 scp 连接时都输入口令。如果你在使用 GNOME,openssh-askpass-gnome 工具可以用来在你登录到 GNOME 时提示你输入口令句,并把它一直保留到你从 GNOME 中注销之时。你不必为本次 GNOME 会话中任何 ssh 或 scp 连接输入口令或口令句。如果你不打算使用 GNOME,请参阅第 3.4.5 节。
要在 GNOME 会话中保存口令句,遵循下列步骤:
1. 你需要安装 openssh-askpass-gnome 软件包;你可以使用 rpm -q openssh-askpass-gnome 命令来判定该软件包是否已被安装。如果它没有被安装,从你的 Red Hat Linux 光盘集合、Red Hat FTP 镜像站点、或使用 Red Hat 网络 来安装它。
2. 点击「主菜单」(在面板上)=> 「首选项」 => 「更多首选项」 => 「会话」。然后点击「启动程序」标签。点击「增加」,在「启动命令」文本字段内输入 /usr/bin/ssh-add。把它的优先级设为比任何现存命令都高的数字以确保它最后才执行。ssh-add 的优先级数字最好是 70 或更高。优先级数字越高,优先级越低。如果你列出了其它程序,该程序的优先级应该最低。点击「关闭」来退出该程序。
3. 注销后再登录进 GNOME;换一句话说,重新启动 X 服务器。在 GNOME 启动后,一个提示你输入口令句的对话框就会出现。输入要求的口令句。如果你把 DSA 和 RSA 两者都配置了,你会被提示两者都输入。从现在起,你就不会被 ssh、 scp 或 sftp 提示输入口令了。

3.4.5. 配置 ssh-agent
ssh-agent 可以用来储存你的口令句,因此你在每次使用 ssh 或 scp 连接时就不必总是输入它。如果你不在运行 X 窗口系统,则在 shell 提示中遵循这些步骤。如果你在运行 GNOME,但是不想配置它来在你登录时提示你输入口令(参阅第 3.4.4 节),这个过程可以在类似 xterm 的终端窗口中进行。如果你在运行 X 却不是 GNOME,这个过程可以在终端中进行。可是,你的口令只能在该终端窗口中被记住,它不是全局设置。
1. 在 shell 提示下,键入下面的命令:
exec /usr/bin/ssh-agent $SHELL
2. 然后,键入下面的命令:
ssh-add
接着,输入你的口令。如果你配置了不止一个钥匙对,你会被提示输入每个口令。
3. 当你注销后,口令句就会被忘记。你必须在每次登录到虚拟控制台或打开终端窗口时都执行这两条命令。

4. 其它资料
OpenSSH 和 OpenSSL 工程处于不断地开发中,因此关于它们的最新信息通常位于它们的官方网站中。OpenSSH 和 OpenSSL 工具的说明书(man)页也是个获取详细信息的好地方。

4.1. 安装了的文档
* ssh、scp、sftp、sshd 和 ssh-keygen 的说明书(man)页 — 关于它们的说明书页包括如何使用这些命令的信息,以及所有能与它们一起使用的参数。

4.2. 有用的网站
* http://www.openssh.com — OpenSSH FAQ 网页、错误报告、邮件列表、工程宗旨、以及关于安全功能的更技术性的解释。
* http://www.openssl.org — OpenSSL FAQ 网页、邮件列表、以及对于工程宗旨的描述。
* http://www.freessh.org — 用于其它平台的 SSH 客户软件。

鉴于大家在使用VI 的时候有一定的陌生,在这里借花献佛,希望对大家学习UNIX有所帮助,并希望大家能结合使用unix的心得体会对这些经验进行进一步的扩展。

1.交换两个字符位置

xp
2.上下两行调换
ddp
3.把文件内容反转
:g/^/m0/ (未通过)

4.上下两行合并
J
5.删除所有行
dG
6.从当前位置删除到行尾
d$
7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了

由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
8.
:ab string strings
例如 “:ab usa United States of America” ,
当你在文见里插入 usa 时
United States of America 就蹦出来了
9.
:map keys new_seq
定义你当前 键盘命令
10.
:set [all]
vi or ex 的编辑状态
如 显示每行 :set nu
11.
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的
下面。

12.
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S

13.

:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串

14.光标控制

k:上移 nk 上移n行
j:下移 nj 下移n行

将光标移到第n行,按下 mk
将光标移到第m行,按下 “ay’k
即将第n到m的行存到a寄存器,以此类推,b,c……..寄存器等

这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用

想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可,以此类推,b,c……..寄存器等

在当前屏幕中
H 跳到第一行
M 跳到中间一行
L 跳到最后一行

15.
表8-2 删除命令
删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的
位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括
该字符)之间的内容
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容

修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容

.重复上一次修改!

表8-4 替换命令
替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符

vi替换使用规则:
:g/s1/s/s2/s3/g
第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串

16.

fx
往右移动到 x 字符上
Fx
往左移动到 x 字符上
tx
往右移动到 x 字符前
Tx
往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次
,
逗号,配合 f 和 t 使用,反方向重复一次

17. vi 环境选项 Solaris ksh

noautoindent nomodelines noshowmode
autoprint nonumber noslowopen
noautowrite nonovice tabstop=8
nobeautify nooptimize taglength=0
directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
noedcompatible prompt tagstack
noerrorbells noreadonly term=vt100
noexrc redraw noterse
flash remap timeout
hardtabs=8 report=5 ttytype=vt100
noignorecase scroll=11 warn
nolisp sections=NHSHH HUuhsh+c window=23
nolist shell=/bin/ksh wrapscan
magic shiftwidth=8 wrapmargin=0
mesg noshowmatch nowriteany

For C-Shell:
setenv EXINIT “set nu”
For Bourne or Korn Shell:
EXINIT=”set nu”; export EXINIT
For Korn Shell Only (alternate method):
typeset -x EXINIT=”set nu”
在 .profile 里设置 vi 的环境选项 , 以上均测试过

18.标记文本

  mchar   用字母char标记当前光标的位置
  `char   移至char所标记处
  ’char   移至char标记所在行的开头处
  ”     移至当前行上一次所在位置(在光标移动之后)――一个双引号
  ”    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号

19.
同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)

也可以使用:
:e#
进行切换

20.
sco 下VI 要在文本前同样的字符加用
%s/^/要加的内容/g 要在文本后同样的字符加
%s/$/要加的内容/g

21.
如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。

cat filename |tr -d ‘\015′ >newfile
不同的unix系统还存在一些其他不同的命令,如:doscp
sed 也可以实现这个功能.

dos2unix filename filename2
反之
unix2dos filename filename2

在vi 中用:$s/^M//g
^是crtl-V crtl-M

22.如何在“unix命令行”下将一个文件的某字符串用另一个串换掉

sed ’s/string1/string2/gp’ file1 > file2

23.将/etc/hosts下所有的地址都ping 2次

1 #/usr/bin/sh
2 #grad /etc/hosts and ping each address
3 cat /etc/hosts|grep -v ‘^#’ | while read LINE
4 do
5 ADDR=`awk ‘{print $1}’`
6 for MACHINE in $ADDR
7 do
8 ping $MACHINE -n 2
9 done
10 done

LINUX引导过程
首先说明一下,这里讲的是LINUX引导经过的步骤,而不涉及KERNEL引导过程的内部
细节。希望本文能对初学LINUX的朋友有所帮助。

一、从BIOS到KERNEL
计算机在接通电源之后首先由BIOS进行自检,即进行所谓的POST(Power On Self
Test),然后依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入“引导块”。
如通常BIOS中设的引导顺序为C在最前面,那么就把C盘(第一个IDE硬盘)的第0柱面
,第0头的第1个扇区读入内存,然后跳到那里开始执行。这个扇区有一个大家熟悉的
名字——MBR(Main Boot Record)。换句话说,MBR里面存放的是一小段程序以及分
区表的数据。在使用WIN9X和DOS时,这里面放的代码就把分区表里标记为Active的分
区的第一个扇区(一般存放着操作系统的引导代码)读入内存并跳转到那里开始执行。

而在用LILO引导LINUX时,有两种选择:
(1) 把LILO安装在MBR。这时就由BIOS直接把LILO代码调入内存,然后跳转执行
LILO。即
BIOS——>LILO(在MBR中)——>KERNEL
(2) 把LILO安装在LINUX分区,并把LINUX分区设为Active。这时,BIOS调入的是
WIN9X/DOS下的MBR代码,然后由这段代码来调入LILO的代码(位于活动分区的第一个
扇区)。即
BIOS——>MBR——>LILO(在活动分区的第一个扇区)——>KERNEL
因为在读入及执行MBR时,操作系统还没有起来,所以只能用BIOS提供的INT13来进
行磁盘操作,而INT13只能读写硬盘1024柱面之前的数据,由此可知任何操作系统的引
导代码必须在1024柱面之前。对于LINUX来说,不管你使用方式(1)还是方式(2)启动,
都要保证KERNEL放在1024柱面之前。只有在KERNEL起来以后,才有读/写1024柱面以后
数据的能力。因为LINUX不使用INT13来进行硬盘操作。从上面我们也可以看到,不存在
什么“WIN95可以,而LINUX不可以”的问题,作为操作系统要能被正确引导,在现有
的BIOS下,它们的引导部分都必须在1024柱面之前。如果操作系统本身还是基于INT13
来进行磁盘操作的话,那么它也只能读/写1024柱面之前的数据。

二、从KERNEL到login prompt
在KERNEL起来之后,将生成第一个进程——init,实际上是执行了/sbin/init。ini
t的工作是根据/etc/inittab来执行相应的脚本进行系统初始化,如设置键盘、字体,
装载模块,设置网络,等等。

/etc/inittab文件的每一行包括四个域:
id:runlevels:action:process
runlevel是运行模式,通常为0-6。模式0是halt,模式6是reboot,模式1是单用户,
模式2/3是多用户,模式5是运行xdm以图形界面方式登录。id为标识符,通常为两个
字母。process为需要执行的程序或脚本。action包括有:
(1) defaultinit —— 指定缺省的运行模式(runlevel)
(2) sysinit —— 指定运行的第一个程序/脚本,此时runlevels域不起作用。
(3) boot —— 在sysinit之后执行,runlevels域不起作用
(4) bootwait —— 同boot,但init会等待该命令结束
(5) once —— 在进入有runlevels指定的运行模式时运行
(6) wait —— 同上,但init会等待该命令结束
(7) respawn —— 在进入相应runlevel时执行,并且若该进程结束,init会再起
一个进程执行同样的命令
(Cool ctrlaltdel —— 指定在用户按下Ctrl-Alt-Del时执行的命令

对于Redhat来说,执行的顺序为:
/etc/rc.d/rc.sysinit # 由init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
/sbin/mingetty # 等待用户登录

三、/etc/rc.d/rc.sysinit及/etc/rc.d/rc
在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
调入keymap以及系统字体
启动swapping
设置主机名
设置NIS域名
检查(fsck)并mount文件系统
打开quota
装载声卡模块
设置系统时钟
等等。

/etc/rc.d/rc则根据其参数指定的运行模式来执行相应目录下的脚本。凡是以Kxx开
头的,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的
顺序按xx从小到大来执行。例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上
述方式调用/etc/rc.d/rc3.d/下的脚本。
值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚
本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之
后,登录之前执行的命令。

四、init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc
的action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登
录。至此,LINUX的启动结束。

五、对于Slackware,作为sysinit的脚本是/etc/rc.d/rc.S,运行模式1的脚本是
/etc/rc.d/rc.K,运行模式2、3、4、5的脚本是/etc/rc.d/rc.M。另外,装载模块
的命令都集中在/etc/rc.d/rc.modules中,/etc/rc.d/rc.local为登录前执行的最
后一个脚本。

问 题:我们公司有两台LINUX服务器,每个服务器只有一个硬盘。所以
备份的问题就显得特别重要。我们装有mysql数据库。当然同时也要解
决mysql备份的问题。

目 的:host 机器(最终所有备份都在其上留备份)ship机器(保存host机器备份)

方 法:通过shell脚本,打包相关要备份的文件。然后通过ftp操作下载,上载完成解决方案。
两台机器root 通过crontab 让脚本在各自机器定时。
建议host 每天早上3点
建议ship 每天早上6点
注意点:
两台服务器系统时间最好相差不要超过1小时。
此脚本是每周礼拜6执行备份的。当然你也可以修改成每月或每天备份。
当然也可以修改成一个增量备份脚本。

具体脚本:
以下为host机器脚本
#//////////////host机器脚本///////////////
#! /bin/sh
HOST=”abc.com”
USER=”backup_use” #ship机器backup_use用户
PASSWORD=”backup_use” #ship机器对应用户密码
BACKUPDIR=”/home/backup_use/ship” #host机器backup_use用户目录
BACKUPDIR2=”/home/backup_use/host” #host机器backup_use用户目录
MYSQLPASS=”abc” #ship 机器mysql root 用户密码
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/nusphere/mysql/bin
DOW=`date +%a`
DM=`date +%Y%b%d`

FILE1=ship-virtual-$DM.tar.gz
FILE2=ship-mysqldata-$DM.tar.gz
FILE3=ship-szeasy-$DM.tar.gz
FILE4=ship-other-$DM.tar.gz
#
FIL1=$BACKUPDIR2/host-main-$DM.tar.gz
FIL2=$BACKUPDIR2/host-mysqldata-$DM.tar.gz
FIL3=$BACKUPDIR2/host-other-$DM.tar.gz
#
DIRECTORIE1=”/www /home/jjd” # 要备份的目录1
DIRECTORIE2=”/etc /var/named /usr/local/nusphere/apache/conf” # 要备份的目录2
#
if [ $DOW = "Sat" ]; then # 每个礼拜六完全备份
tar -zcpf $FIL1 $DIRECTORIE1
tar -zcpf $FIL3 $DIRECTORIE2
mysqldump –all-databases -q -uroot -p$MYSQLPASS |gzip > $FIL2
ftp -i -n < $BACKUPDIR/$COMPUTER-mysqldata-$DM.tar.gz
fi
########################################################################

Jp

RPM命令手册
一、安装

命令格式:

rpm -i (or –install) options file1.rpm … fileN.rpm

参数:

file1.rpm … fileN.rpm 将要安装的RPM包的文件名

详细选项:
-h(or –hash)安装时输出hash记号(“#”)
–test 只对安装进行测试,并不实际安装。
–percent 以百分比的形式输出安装的进度。
–excludedocs 不安装软件包中的文档文件
–includedocs 安装文档
–replacepkgs 强制重新安装已经安装的软件包
–replacefiles 替换属于其它软件包的文件
–force 忽略软件包及文件的冲突
–noscripts 不运行预安装和后安装脚本
–prefix <path> 将软件包安装到由 <path> 指定的路径下
–ignorearch 不校验软件包的结构
–ignoreos 不检查软件包运行的操作系统
–nodeps 不检查依赖性关系
–ftpproxy <host> 用<host>作为FTP代理
–ftpport <port>指定FTP的端口号为 <port>

通用选项

-v 显示附加信息
-vv 显示调试信息
–root <path>让RPM将<path>指定的路径做为”根目录”,这样预安装程序和后安
装程序都会安装到这个目录下
–rcfile <rcfile> 设置rpmrc文件为 <rcfile>
–dbpath <path>设置RPM 资料库存所在的路径为<path>

二、删除

命令格式:

rpm -e (or –erase) options pkg1 … pkgN

参数

pkg1 … pkgN:要删除的软件包

详细选项

–test 只执行删除的测试
–noscripts 不运行预安装和后安装脚本程序
–nodeps 不检查依赖性

通用选项

-vv 显示调试信息
–root <path> 让RPM将<path>指定的路径做为”根目录”,这样预安装程序和后安装
程序都会安装到这个目录下
–rcfile <rcfile> 设置rpmrc文件为 <rcfile>
–dbpath <path> 设置RPM资料库存所在的路径为<path>

三、升级

命令格式

rpm -U (or –upgrade) options file1.rpm … fileN.rpm

参数

file1.rpm … fileN.rpm 软件包的名字

详细选项

-h(or –hash)安装时输出hash记号(“#”)
–oldpackage 允许”升级”到一个老版本
–test 只进行升级测试
–excludedocs 不安装软件包中的文档文件
–includedocs 安装文档
–replacepkgs 强制重新安装已经安装的软件包
–replacefiles 替换属于其它软件包的文件
–force 忽略软件包及文件的冲突
–percent 以百分比的形式输出安装的进度。
–noscripts 不运行预安装和后安装脚本
–prefix <path> 将软件包安装到由 <path> 指定的路径下
–ignorearch 不校验软件包的结构
–ignoreos 不检查软件包运行的操作系统
–nodeps 不检查依赖性关系
–ftpproxy <host> 用 <host> 作为 FTP代理
–ftpport <port>指定FTP的端口号为 <port>

通用选项

-v 显示附加信息
-vv 显示调试信息
–root <path> 让RPM将<path>指定的路径做为”根目录”,这样预安装程序和后安装程序都会安装到这个目录下
–rcfile <rcfile> 设置rpmrc文件为 <rcfile>
–dbpath <path> 设置RPM 资料库存所在的路径为 <path>

四、查询

命令格式:

rpm -q (or –query)options

参数:

pkg1 … pkgN :查询已安装的软件包

详细选项

-p <file>(or “-”)查询软件包的文件
-f <file>查询<file>属于哪个软件包
-a 查询所有安装的软件包
–whatprovides <x> 查询提供了 <x>功能的软件包
-g <group> 查询属于<group>组的软件包
–whatrequires <x> 查询所有需要 <x> 功能的软件包

信息选项

<null> 显示软件包的全部标识
-i 显示软件包的概要信息
-l 显示软件包中的文件列表
-c 显示配置文件列表
-d 显示文档文件列表
-s 显示软件包中文件列表并显示每个文件的状态
–scripts 显示安装、卸载、校验脚本
–queryformat (or –qf)以用户指定的方式显示查询信息
–dump 显示每个文件的所有已校验信息
–provides 显示软件包提供的功能
–requires (or -R) 显示软件包所需的功能

通用选项

-v 显示附加信息
-vv 显示调试信息
–root<path>让RPM将<path>指定的路径做为”根目录”,这样预安装程序和后安装程序都会安装到这个目录下
–rcfile <rcfile> 设置rpmrc文件为 <rcfile>
–dbpath <path> 设置RPM 资料库存所在的路径为 <path>

五、校验已安装的软件包

命令格式:

rpm -V (or –verify, or -y) options

参数

pkg1…pkgN 将要校验的软件包名

软件包选项

-p <file> Verify against package file <file>
-f <file> 校验<file>所属的软件包
-a Verify 校验所有的软件包
-g <group> 校验所有属于组 <group> 的软件包

详细选项

–noscripts 不运行校验脚本
–nodeps 不校验依赖性
–nofiles 不校验文件属性

通用选项

-v 显示附加信息
-vv 显示调试信息
–root <path>让RPM将<path>指定的路径做为”根目录”,这样预安装程序和后安装程序都会安装到这个目录下
–rcfile<rcfile>设置rpmrc文件为<rcfile>
–dbpath <path> 设置RPM 资料库存所在的路径为<path>

六、校验软件包中的文件

语法:

rpm -K (or –checksig)options file1.rpm …fileN.rpm

参数:

file1.rpm … fileN.rpm 软件包的文件名

Checksig–详细选项

–nopgp 不校验PGP签名

通用选项

-v 显示附加信息
-vv 显示调试信息
–rcfile <rcfile> 设置rpmrc文件为 <rcfile>

七、其它RPM选项

–rebuilddb 重建RPM资料库
–initdb 创建一个新的RPM资料库
–quiet 尽可能的减少输出
–help 显示帮助文件
–version 显示RPM的当前版本

一个典型的桌面Linux系统包括3个主要的软件层—linux内核、C库和应用程序代码。
内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进行会话。内核之上是C库,负责把POSIX API转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数。应用程序依靠驱动内核来完成特定的任务。
在设计嵌入式应用的时候,可以不按照这种层次,应用程序越过C库直接和内核会话,或者把应用和内核捆绑在一起,甚至可以把应用写为内核的一个线程,在内核中运行,虽然这样在移植上带来了困难,但考虑嵌入式系统对尺寸要求小的特点,是完全可行的。不过我们使用三层软件结构的模式来学习嵌入式linux将会是我们认识更清晰,简单可行并使应用具有弹性。

快速入门,最简单的建立嵌入式Linux应用的方法就是从我们使用的桌面Linux入手,安装一个喜爱的版本,把我们的某个应用作为初始化的一部分,框架就算完成了。当然,嵌入式linux应用远比我们的桌面版本功能简单专一,它也许就是一个用于足彩的终端机,或是一个数码音频播放器,这些系统除了使用嵌入式CPU外,仅仅再需要一个串口,网口等少量的输入输出接口就可以完成它们特定的应用了。在软件上,它可以按照三层的概念由内核装载器,定制的内核和较少的为特定任务设计的静态连接的应用程序组成。之所以使用静态连接的应用程序,是因为少量的静态连接程序所要的存储空间,比同样数量的动态连接的程序所占的空间小,这个平衡点需要我们在实际开发中去获取。也许你正在设计的是个PDA,它的应用程序较多,那么你很可能就要使用动态连接程序来减少存储空间。在你的/bin或者/sbin目录下,用厂列表看看bash,ifconfig,vi…,也许只用几十K,当你运行 ldd /bin/bash 时,你会看到它们都和好几个库文件相连。好了,这样看来,我们得把PC想像成一个嵌入式硬件平台,再重新制作一个特定功能的嵌入式linux。

再进行实际操作之前,先来搞清楚几个基础知识。
内核装载器Loader,它的作用是把内核从外部存储器,移动到内存中。它只作这个事情,一旦完成了调入内核的工作,Loader就跳转到内核位置开始执行。不同架构有不同的Loader,在x86结构的PC上,通常使用的loader有LILO,GRUB,syslinux,syslinux在嵌入式linux中也同样工作。其他非x86架构的应用中,你必须使用专门的loader,或者自己编写loader来装入内核。也有不使用loader的情况,系统加电以后,内核直接从烧录有映象的Flash上开始执行。
内核,一旦内核开始执行,它将通过驱动程序初始化所有硬件,这可以从我们的pc机监视器的输出看出来,每个驱动程序都打印一些有关它的信息。初始化完成后,计算机就准备运行嵌入式应用。也许一个,也许是多个应用程序组成了嵌入式应用,但通常首先调用的是init(通过loader 向核心传入init=/program 可以定制首先运行的程序)。桌面linux中,init会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用中,可以根据实际的情况决定是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了。
initrd文件系统,initrd以一种把内核从存储介质装入到内存的相同的机制来装入一个小型文件系统。这个文件系统最好是以压缩的方式存储在介质上的,解压缩到RAM盘上。通过使用initrd,包含有核心驱动和启动脚本的小文件系统,就可以直接从介质上和内核一起启动起来,内核届压缩这个文件系统,并执行这个文件系统上叫做/linuxrc的脚本文件,这个脚本通常会把启动过程中所需要的驱动程序装入。脚本退出以后,initrd文件系统也卸下了,启动过程进入真正初始化过程。对于嵌入式来讲,可以将需要的应用软件都运行在这个initrd文件系统上,只要/linxrc文件不结束,内核启动过程的其他部分就不会继续。
做个试验:
cp /boot/initrd-2.4.20.img /tmp
cd /tmp
mv initrd-2.4.2-.img initrd.img.gz
gunzip initrd.img.gz
mount -o loop initrd.img /mnt
cd /mnt
ls
cat linuxrc 可以看到里面执行了加载了两个模块的操作,你在启动linxu的时候会看见屏幕打印信息。

入门试验,制作一个简单的应用:我们使用一张软盘启动一台假象的只有一个串口,键盘输入,显示输出的x86架构的linux系统,执行的特定应用就是运行minicom,通过串口拨号。需要软件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx代表版本号 ,开始之前,在主目录建立一个目录,来释放这两个软件包:
cd
mkdir -p project/minilinux
cd project/minilinux
tar zxvf minicom-xx.src.tar.gz
tar zxvf syslinux-xx.tar.gz

1、裁减linux内核(需要系统安装内核文件包)

配置内核的时候,我们需要选择这些:摸块编入内核,386处理器、物理内存off、支持ELF、标准PC软盘、支持RAM盘(4096)、支持initial RAM disk (initrd)、虚你终端、虚拟终端控制台、标准串口、ext2文件系统、控制台驱动,VGA text console、DOS FAT、MSDOS文件系统,其他的都可以不要,这样内核编出来较小。
步骤:
cd /usr/src/linux
make mrproper
make xconfig
make dep && make bzImage
得到 /usr/src/linux/arch/i386/boot/目录的内核文件bzIamge。

2、编译一个静态的minicom ,把它作为将来的linuxrc
cd minicom-xx/src
vi Makefile
修改下面这行
minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES)
rm -f minicom 下面的行加上 -static,连接为静态程序
(LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS)

vi minicom.c
找到 if (real_uid==0 && dosetup==0 ) 删除这个判断条件语句,主要是用于权限判断的,因为这个嵌入应用不关注权限问题,否则会出错。
make
得到可执行程序,用ldd 检查一下是不是静态程序。

3、准备initrd压缩文件image.gz
dd if=/dev/zero of=image bs=1k count=4096
losetup /dev/loop0 image
mke2fs -m 0 /dev/loop0
mounmt -t ext2 /dev/loop0 /mnt/
mkdir -p /mnt/dev
mkdir -p /mnt/usr/share/terminfo/l/
cd /dev
cp -a consle null tty tty0 zero mem /mnt/dev
cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux
cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc
umount /mnt
losetup -d /dev/loop0
sync
gzip -9 image

4、制作软盘引导,并拷贝文件 bzimage image.gz 到软盘

A.使用grub
fdformat /dev/fd0
mke2fs /dev/fd0
mount /mnt/fd0 /mnt/floppy
mkdir -p /mnt/floppy/boot/grub
cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub
执行 grub,在软盘上创建引导
grub > root (fd0)
grub > setup (fd0)
grub > quit

cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy

编辑 /mnt/floppy/boot/grub/grub.conf
default =0
timeout-=10
title minilinux
root (fd0)
kernel /bzImage
initrd /image.gz

卸下软盘
umount /mnt/floppy

B. 使用syslinux
fdformat /dev/fd0
mkfs.msdos /dev/fd0
mount -t msdos /dev/fd0 /mnt/floppy

cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy

cp syslinux-xx/ldlinxu.sys /mnt/floppy
cat > /mnt/floppy/syslinux.cfg
LABEL linux
KERNEL bzimage
APPEND initrd=image.gz

umont /mnt/floppy
syslinux-xx/syslinux /dev/fd0
sync

5、用软盘启动计算机,如果幸运,minicom的运行画面出现在屏幕上。

到此,我们的单应用嵌入式linux做好了,但它还很简陋,没有什么实际用途,但通过这个实验,可以了解嵌入式系统的大致结构和开发过程。在进行实际的嵌入式开发时,通常要在PC机上借助嵌入式linux开发工具包,如:uclinux,bluecat等,对相应的硬件平台(目标机)进行软件编写编译,调试成功后,将内核及应用程序写入到目标机的存储器中,从而完成整个应用。

这是篇好文章,我建议大家都来看看]
作者:enfuzion 发表时间:2003/01/13 04:30pm

完全用 GNU/Linux 工作
— 摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质
我已经半年没有使用 Windows 的方式工作了。Linux 高效的完成了我所
有的工作。

GNU/Linux 不是每个人都想用的。如果你只需要处理一般的事务,打游
戏,那么你不需要了解下面这些了。

我不是一个狂热的自由软件份子,虽然我很喜欢自由软件。这篇文章也不
是用来推行自由软件运动的,虽然我觉得自由软件运动是非常好的。

这篇文章也不是用来比较 Linux 和 Windows 内核效率,文件系统,网络
服务的。我现在是作为一个用户而不是一个开发者来说话的,我们的讨论是基于操作,
应用层面的。是为了告诉大学里还不了解,或者不理解 UNIX 的科学工作者和大学生,
UNIX 比 Windows 更适合用于科学研究工作,请大家理解 UNIX 的工作方式,不要用
Windows 的标准来要求 Linux,而要用一个科学工作者的标准来要求自己,用 UNIX 的
思想来武装自己。

我显然是反对在大学,特别是理工科专业推广 Windows 的。我也反对在
对“娃娃” 们的计算机启蒙教育中使用 Windows。因为 Windows 不论从技术上,经济
上,思想风格上都是与我们培养高科技人才的目标格格不入的。Windows 的流行属于历
史遗留问题,爷爷一级的人当然已经不可救药,但是我们不应该让下一代继续走上歧
途。

UNIX 不是计算机专家的专利
当我建议一些非计算机专业的人用 Linux 的时候,很多人说:“UNIX 是
计算机系的人用的,我们不能理解。” “UNIX 是男孩用的,我们女孩不用。”

但是其实世界上的大多数科学家和工程师几乎用的都是 UNIX 作为他们的
电脑工具。就因为它简单,可靠,稳定,强大,有趣。甚至很多时候 UNIX 就是唯一的
选择。

你说:“我们都会用 UNIX 的话,你们计算机专业的人还用来干什么?”
很容幸的告诉你,计算机专业的有一部分人就是专门为你们提供这样强大而方便的计算
机工具的。如果他们制造的工具只有自己会用的话,那这个工具还有什么用?

理解 GNU/Linux
不要用 Windows 的标准来要求 Linux。

由于GNU/Linux这个词太长,下面如果没有特别指明,“Linux”就是指
“GNU/Linux”。

在这个年代,恐怕没有人需要我来介绍 Linux 是什么了吧?如果你觉得
“Linux 只不过是跟 DOS 差不多的东西”,那请问问你旁边的 Linux 用户,Linux 到
底是什么?

那为什么我还要写一篇这样的文章?因为,我发现还有很多人不不理解
Linux 和 UNIX,虽然他们也在用它,但是他们有时会问:“为什么 Linux 不能像
Windows 那样 ……?”,“怎么Redhat Linux不能 mount NTFS 分区!”,“Linux
下用什么整理硬盘?”,“什么时候OpenOffice才能完全兼容Word文件啊?”,“现在
还有什么Windows能干的事情Linux干不了的?”……

他们有40G的硬盘,却只为 Linux 分配了2G空间,有时还抱怨“这个东西
怎么占这么多硬盘!” 似乎 Windows 该占用大部分硬盘。他们把重要的数据装在
Windows的分区,似乎信不过Linux。他们总是到处寻找新奇的,好看的GUI程序,对命
令行的东西一概不屑一顾。他们对Drag&Drop,菜单配置,自动升级非常感兴趣。他们
如果找到一个很像 Windows 程序的 Linux 程序,一定会很高兴的说:“哈哈!Linux
也能……了!” 如果Linux在某种测试中胜过Windows,他们会高兴得跳起来。他们没
有办法用Linux解决问题的时候,甚至用Wine来运行Windows程序。有时实在没办法,只
好重起到 Windows,或者干脆省得麻烦,在 Windows 下装一个 VMWare 虚拟一个
Linux 玩。

你如果出现了上面的情况,说明你的思想受到了 Windows 的某种潜移默
化的影响和误导。你没有能够从本质上理解存在于 Linux 身上的 UNIX 思想。你支持
Linux,你喜欢 Linux,你能从中感觉到快乐,这非常好。你现在只需要明白的是:
Linux 从来就不是一个玩具,它是天才UNIX的后代。UNIX 是自晶体管发明以来最伟大
的发明,它从诞生那一天开始就比 Windows 的设计出色。

你要体会什么叫做“设计”,一个糟糕的设计并不是到后来缝缝补补就可
以变好的,而一个出色的设计,不但可以以不变应万变,而且可以影响到后来者。一个
出色的设计配上一个出色的实现,那就是非常出色的发明。Linux 就是这样的一个出色
的发明。Linux 并不需要追赶 Windows,也不需要打垮微软。它的最终目标是改变整个
计算机世界,还人们自由,给人们乐趣和方便。

Unix 是简单的,你不需要成为一个天才也能理解这种简单。

UNIX的设计者 Dennis Ritchie 说:“Unix is simple. It just takes
a genius to understand its simplicity.” 但是我不这么认为,因为我不是一个天
才,但是我却勇敢的把 Windows 完全删除掉,遇到不明白的事情的时候努力用 UNIX
的方式去解决,而不是寻求 Windows 的帮助。现在我体会到了 UNIX 的思想和好处,
我可以用比 Windows 高效几倍的效率工作。因为我相信这样的信念:“Windows 能办
到的事 Linux 一定能办到,而且办的更好。”

这小节开头的话应该改成:“Unix 是简单的,你不需要成为一个天才或
是计算机专家。但是在这个冲斥着 Windows 错误观念的世界,你需要信念和勇气才能
理解它的简单。” 我下面就告诉你一些我理解到的东西。首先,你要知道的是微软在
国际科学领域是根本没有地位的。

微软的地位
微软的名声在欧洲和美国的大学里,特别是在计算机系里之坏,大家可能
有所耳闻。我认识的 MIT,Stanford 的教授,贝尔实验室的专家,甚至一个欧洲小国
的高中计算机老师都绝口不提微软的名字。在他们眼里,微软只是一个没有真技术,专
靠在落后国家商业宣传和垄断经营的小公司。这个“小”并不是说它人少,钱少,而是
说它先进技术少。

我上次和王益合作写了一个算法演示程序,那个算法是贝尔实验室一位科
学家Steven Fortune很天才的发明,为了程序能够被身边大多数人使用,我们选择了
VC+MFC 作为平台。我在分析算法时还得到 Fortune 很热情的鼓励,寄给我一份资料,
还多次回信耐心的给我讲解了很多细节。但是程序完成之后,我把样品发给 Fortune,
他回信说:“对不起。我机器上没有 MFC。” 话说的很客气,但是我已经感觉到了他
对 Windows 的不屑。然后我把 MFC 静态编译进程序再发给他,他就没有再回信了。他
显然不是瞧不起我,而是确实有难处。

你能感觉到这位科学家对微软和 Windows 是什么态度了吧?不是反感,
而是他心里根本没有 Windows 这个东西!微软在高科技领域没有发展,那么它怎么生
存呢?到发展中国家去发展一下,他们的人民还对电脑一无所知,我说不定甚至可以打
入大学的计算机系呢。我送他们软件,我捐钱盖大楼,我出钱找图灵奖获得者来演讲,
让他们觉得我们都是科学家!

好了,现在全国的大学包括清华,几乎所有人机器必装盗版 Win2000,
Office XP,学校的选课系统是非IE不能正确浏览,论文用 Word 编辑,演示用ppt做,
email 的通知附件是 doc 文件,你不用 Word 打不开,连 863 项目都用 VC 写程序
了。我很久以前就看到一份报纸说,“微软为什么不严厉打击盗版?” 这篇文章说,
微软非但不打击中国的盗版行为,而且有放任之趋势。放长线吊大鱼,“以后我要你们
加倍的来还我!” 确实如此,它的目的快实现了。

Windows 笼罩下的中国计算机教育
说句丢脸的话,比尔盖茨很久以前是我的偶像…… //blush

在中国,比尔盖茨被很多人奉为神圣,“少年电脑天才”,甚至有的人提
到他的名字就做出“抱拳对天”的姿势。很多人谈到微软的“新技术”,“高科技”
都是眉飞色舞。各种“VC编程圣经”,“深入了解 Visual C++”之类的书,在开头几
页都会出现非常肉麻的字眼,“在那团团的混沌中,一个开天辟地的精灵,Windows
1.0,诞生了……”

微软的软件被这么多人盗用,那么人们是怎样使用这些盗版程序的呢?先
看看电脑培训班,教的都是一些 DOS 命令,打字,Windows 基本操作,Word 文档处
理,PowerPoint,高级班可能有 Excel,Access…… 参加各种微软认证考试,MCSE,
MSDE 的人络绎不绝。考试辅导班都贴出了“280元,考过为止”之类的字样。考试参考
资料更是昂贵,有些电脑书店整整两书架都是“Microsoft Press”的东西。我有个同
学参加认证考试,每门考试都要200多元。而且你一次考不过可以再考,又要交钱。他
后来还津津乐道跟我说,看我,花了XXXX(一个四位数)元考过了微软认证,得到一张比
尔盖茨亲笔签名的证书和价值6000元的 Windows XP 内部发行版。

“电脑要从娃娃抓起”,我们再来看看娃娃们学的是什么。大部分家长给
孩子买了电脑之后,他们首先就会装一个盗版的 Windows,然后买来盗版的游戏开始
玩。如果哪个孩子会用 Delphi 编程序,那可不得了。报社记者,电视台争相报导,
说,某某学校的初中生某某,在别人都还在玩电脑游戏这种“初级阶段”的时候就已经
用 Delphi 写程序了。镜头还瞄准了他显示器上面的像框中的比尔盖茨头像!

我刚进入大学计算机系时还不懂得什么是操作系统,因为我以前只用过
“中华学习机”。看到新入学的同学们各个谈论的都是 “Windows 95”,“VC”……
我简直觉得我落后了好几十年一样,整个一土人,根本跟他们答不上话。好不容易找到
一个比较熟的同学问了一下:“你们天天谈论的瘟95是什么啊?”答:“win95就是一
个操作系统,跟DOS是一类。”“朵死是什么?” “你连DOS都不知道是什么?别在计
算机系混了。” 学校上课当然不讲VC编程之类的东西,但是上 Pascal 的老师有一次
就说:“嗨,我们学校真是落后。现在别人都用 C, C++,甚至 VC 了,我们还在讲
Pascal。不知道什么时候才能有VC课啊。你们出去也是要用VC的,只好自学了。” 于
是,有些同学很多时候上课都捧着一本很重的“Windows 编程大全”之类的书,根本没
有听课。吃饭时就念念有词的跟我说,“代码的优化是无止境的”,“匈牙利命名法真
是伟大的发明” …… 这就是中国很多大学计算机系的情况。

感觉到无知了?这不是偶然的,而是微软长久以来埋下的伏笔。它要让无
知的大家都把它奉为神圣,它要让支持UNIX,Xwindow的人一旦说 UNIX 好,Xwindow
好的时候,都被一群人围着说教:“这个 Windows 也能做到”,“你对 Windows 有偏
见”,“微软才是主流啊”,“你敢瞧不起 win2k?”,“.NET 就是世界潮流”,
“微软的毕竟是新技术”,“有钱就是有技术”…… 甚至在一番论战比较后败下来还
是要说:“Windows 性能差点,但是易用性强”,“Windows 是老百姓用的,要求别那
么高”,“微软那么有钱,以后想超过 UNIX 还不容易吗?”……

发达国家的计算机教育
我前段时间在 USENET 发文问有关 Scheme 语言的问题时,认识了一位丹
麦人。他解决了我所有的问题,并且建议我阅读一些很“深奥”的有关程序语言语法,
文法的书,他告诉我很多网站可以学习 LISP,Scheme,人工智能,算法。他叫我看
Jonathan Rees 的论文 “Syntactic Closures”。他还打包给我寄过来一份 MIT 的
“How to Design Programs”。他说他在自己的 PC 机上装的是 Linux,他用 Emacs 编
辑,运行 Scheme 程序。他对 Emacs 的了解和爱好真是使人惊讶。他大学本科毕业时
做的毕业设计是一个 Scheme 解释器。这对于我来说是望尘末及了。

他是那么的不厌其烦,我的每一个问题他都详细的回答。我有时都觉得过
于详细了,怎么这么耐心啊?我觉得他似乎是我的高中老师。他是什么样的人呢?我好
奇的打听了他的情况。原来,他是丹麦一所普通高中的计算机老师。

他说他在高中里讲授程序设计和算法,计算机语言文法。他说用
Scheme,他的学生不用再为内存泄漏等程序语言本身的问题而烦恼,而专注于问题和
算法本身。有利于培养学生解决问题的能力,特别是用计算机解决数学问题的能力。

天哪!为什么欧洲出现那么多数学家,几何学家?你看看别人重视的是什
么!我们的计算机教育如果继续这样下去,只会沿着弯路越走越远!

微软和它的朋友们的如意算盘
下面来看看微软的收入是怎么来的。首先,Windows 98系列操作系统,一
个就是 100 多美元,每次升级又是几乎同样的价钱。Windows NT 还要贵几倍,而且有
用户数目限制,5个用户的,10个用户的…… 以后如果要增加用户数目还要按比例付
钱。

花了如此多钱买来的操作系统就能用了吗?它竟然连压缩程序都没有提供
!你装上 Windows 之后一般第一件事就是去下载一个 WinZip 吧,“只要 29 美
元”。Windows 会中病毒啊,马上花 70 美元买一个 Norton AntiVirus 吧。还有黑客
呢?再买一个 Norton Internet Security 好了,100 美元。系统需要优化,磁盘需要
整理,买一个 Norton System Works 是你最佳的解决方案,100美元。

可是你现在还是不能干正事啊!你想要一个 Word, PowerPoint?那就买
一套 Office XP 吧,一起买便宜些,$459.90。

那些程序不会用啊!那些菜单怎么设置,到底有什么功能啊?看“帮助”
也学不会。买本书看看吧,我推荐“Special Edition Using Microsoft Office
XP”,不贵,$27.99。这本书里面大部分是屏幕抓图,还是买一本旧的比较划算,
$17.85。

你如果只是当个秘书,上面的差不多还凑合了。可是你有更高的追求,你
想成为 Windows 程序员。首先买一个 Visual Studio.NET 吧,要不然怎么编译程序。
$494.95。

为了紧跟微软动向,世界潮流,不能不注册个 MSDN 什么的吧?这个贵一
点,不过物有所值啊,$2,799。

嗯,你现在已经是上层阶级,白领人士了。你现在可以像这样“自由”
的,“安全”的生活了:

为什么要反对使用 Windows
很多人都说不应该完全否定 Window,Windows 也有它的长处。不应该骂
微软。

对。Windows 容易操作,适合普通用户。如果微软把它自己定位在 P&G,
Philips 那样的地位,能够给我们的百姓提供周到的,完善的,价廉物美的服务。那我
肯定是很喜欢它的。

但是从上面的种种情况说明,微软是一个野心极大的国际垄断组织!它的
产品没有一个是不出问题的:Windows 不稳定,容易中病毒,而微软不为大家免费提供
杀毒软件。我就是要让你们花钱买我的朋友 Symantec 的杀毒软件,谁叫你们已经上了
我的贼船?这叫什么售后服务啊!

你买来微软的程序,安装的时候一般都有一个协议,说:“由于微软的程
序造成你的数据损坏或丢失,微软概不负责。” 我想很多人肯定觉得这个不合理,不
想按那个 “I accept”。但是你的软件买都买来了,钱都花了,现在一按 “I
decline”,安装程序马上就会退出。你只好被迫点击了 “I accept”!这不是不平等条
约吗?

我已经目睹了好几个朋友的文档被 Microsoft Word 损坏,有的是编辑了
十多天的30多页的论文,有的是费了很大工夫做出来的个人简历,那个朋友为此失去了
到自己向往的 P&G 工作的机会。就在他要投简历的前一个晚上,就在那一瞬间…… 不
知道他痛哭的时候有没有想起要投诉微软,可是谁叫我们用的都是盗版呢,况且你还点
击了 “I accept”。

微软仗势已经占有大部分PC市场,制定不符合国际标准的“微软的标
准”,以不合理的方式压制其它公司的软件,这个问题已经在美国司法部闹了很久了。
他甚至在 Windows 系列操作系统中放置能够通过网络泄漏用户信息的代码,以至于
Windows 刚进入澳大利亚时被澳大利亚政府禁止使用。

有些人说:“微软毕竟开创了一个历史,造就了今天的 IT 行业。” 但
是,如果没有微软,我们今天早就用上非常稳定,非常可靠,非常方便,非常“傻瓜”
的软件了!微软是阻挡信息技术发展的罪魁祸首。

微软的程序的工作方式(注意,我只是说操作方式,病毒的事情另外算)确
实适合于一般家庭,上上网,发发邮件,打打游戏都不错。可是微软却要把自己包装成
什么“高科技”企业,要在世界各地设置“研究院”,在大学计算机系赠送不适合用于
科研的 Windows 产品,甚至出钱请图灵奖得主来中国畅谈“二十一世纪的计算”,还
在大会上宣传自己的 .NET 技术。非要把别人认为自己是科学的,自己是领导世界高科
技的。但是呢?它什么高科技也没有。欧洲,美国,哪一个关键部门在用微软的东西?
NASA? DOE? CERN? 你仔细想一想,微软的程序对人类到底有什么重大作用?

什么是 Windows 能干而 Linux 干不了的事情?
“Windows 能干而 Linux 干不了的事情,那就是不需要干的事情。”

有个朋友看我半年没有用 Windows,有时就会问我:“你只用 Linux,有
没有发现有些 Windows 能处理的事情 Linux 干不了?”

我回答说:“Windows 能干而 Linux 干不了的事情,那就是不需要干的
事情。”

Windows 能做的有益的事情 Linux 都能做
Windows 下的某些功能确实是我们需要的,那么 Linux 的开发者们和用
户也需要这种功能,他们就会去实现这种功能,而且比 Windows 的方式好得多。由于
大多数科学家,工程师用的都是 Linux 或者某种商业 UNIX, 所以几乎所有商业的科学
工程程序,比如 Matlab, Mathematica, AutoCAD, Candence的,Synopsys的,Avant!
的……全都是先有 UNIX 的版本(包括Linux),然后再考虑移植给 Windows,甚至根本
不移植给 Windows,因为 Windows 的机器一般没有足够的能力运行这样的程序。你不
要以为只有 Windows 才有 PSpice, UNIX 的 HSpice 要好得多,而且可以运行在大型
主机上。当然它们不是免费的,但是它们值那个价钱。

但是 Windows 下有些东西在 Linux 下没有很相似的,或者你找到很多类
似的,但是它们每一个比起 Windows 的那个程序都要差很多,那么原因有两种可能性

有一个完全类似的程序,但是由于它乍一看不漂亮,被你忽略了。
而其它程序虽然看起来很漂亮,但是它们是一些初学编程的人写的。现在
由于 Gtk, Qt 的诞生,Linux 下开发图形界面程序极其简单,很多初中生甚至小学生
都可以随手编出一些漂亮不中用的程序。如果你整天寻找这样的程序挑来挑去,永远也
找不到你满意的。当然也有一流的程序用 Gtk 和 Qt,比如 GVIM 就可以用 Gtk 作为
图形界面,我还知道 Synopsys 一些程序用了 Qt。

我曾经也犯过这样的错误,从外表区分一切。结果优秀的 FVWM, lftp,
Mutt, wget 都被我忽略过。当我找回它们的时候,我是那么的羞愧不已,它们现在都
是我的朋友 Smile 我第一次看到 FVWM 觉得它只不过是一个有很厚很难看边框的东西。可
是现在,我的同学看到 FVWM 都说:“哇!真漂亮。”

有另一种完全不同的方式可以达到相同的目的,甚至更好。
很多人很关心 Open Office, Star Office, AbiWord, … 他们多么盼望
有一天某一个 Linux 程序能够完全兼容的打开一个复杂的 doc 文档。但是你永远也不
可能有那一天。为什么呢?因为微软为了占有市场,必定不会让其它系统的程序能够完
全兼容它的文档格式。它一定会不断变化 doc 文档的内部结构,隐藏一些秘密,让其
它公司的程序打开 doc 文档时总是有某种问题,从而你必需购买 Microsoft Office
和 Windows。

你应该想一下,那么多的高智商的大学教授,科学家,学生,他们用的都
是 Linux 或者其它类型的 UNIX,他们没有 Word 可用,怎么处理文档呢?这么多年没
有一个像 Open Office 的程序出现,难道大家没有办法写文档吗?

显然不是这样。你看看那些高水平的学术杂志,论文,那些大学教授的网
页,那些漂亮的幻灯片,它们是什么做的?原来 UNIX 用户早就有非常方便的 troff,
LaTeX, SGML 等东西可以处理文档,而且它们比起 Word 都要高明的多。Word 显然被
这些大拿忽略了,以至于很久以来没有人想在 Linux 下开发一个类似 Word 的程序,
除非某些公司想抢微软的饭碗。

很多人留着 Windows 在硬盘上的原因无非是为了用 Word 和
PowerPoint。我见过一个教授,他的 Windows 笔记本电脑上除了 PowerPoint 什么都
没有。有一天演示的时候,他指着堆乱字符说:“对不起,这是一个公式……怎么每次
都是这样……” 其实有比 PowerPoint 好几百倍的东西可以制造幻灯片,你可以用最
简单的方法制造世界一流效果的论文和幻灯片。你待会儿可以看看我的TeX网页,你就
会知道为什么我可以完全离开 Windows。

Windows 能做的那些没用的事情 Linux 永远做不好
电脑游戏
有些人说 Linux 下不能玩 Windows 下所能得到的所有游戏。的确,
Linux 下虽然也有少量的游戏,比如 Quake。但是它没有 Counter Strike, 没有 Star
Craft, ……

并不是说电脑游戏不该玩,但是应该适可而止。电脑是用来处理事务,帮
助你学习,解决问题的工具,而不是一个玩具!整天沉迷于电脑游戏中,而不出去感觉
外面的世界,你会变得越来越冷酷,越来越缺乏人情味。你与真实的世界越来越远。

你可以在 CS 里杀人,你可以在 Tomb Raider 里探险,你甚至可以在
Tony Hawk’s Pro Skaters 里滑板…… 但是 It’s not real!你虽然有很高的“反恐
技巧”,但是遇到歹徒的时候,你是那么的怯懦;你虽然控制 Laura 伸手敏捷,但是
你打篮球的时候怎么总是被人断球?你虽然可以轻易的在 THPS 里作出一个 “360
kickflip to hangten grind to fakie”,但是你踩在自己的滑板上的时候还不会
ollie!

说回来,如果你偶尔玩一下电脑游戏未尝不可。但是世界上有远比
Windows + PC 更好的游戏方式。Sony 的 PlayStation2, SEGA 的 DreamCast,
Nintendo 的 N64,Namco 的街机……每一个都比 Windows 游戏精彩,每一个都有如此
高的3D性能,以至于 Pentium4, Itanium + GForce4 都无法与它们比美!

Linux 的用户们都是关心解决世界的关键问题的份子,他们哪里有时间用
自己的机器来玩游戏啊?他们每天用Linux高效的做完自己的工作就到阳光下享受自然
去了。要玩游戏也是玩一些类似推箱子,贪吃蛇之类的智力小游戏。所以,你知道为什
么 Linux 几乎没有游戏了吧?Smile

“整理硬盘,优化系统”
这是一个非常有意思的话题,仅次于有关“病毒”的话题。相信很多
Windows 用户都有整理硬盘的经历。在很多 Windows 用户眼里,“硬盘用久了,会出
现碎片,速度会减慢,需要一个程序来整理,整理硬盘的时候不要做其它工作”,这好
像是天经地义的事情。

我也曾经津津有味的看着 Norton Defrag 一点一点的把我的硬盘排序,
调整,用图形的方式显示出来,然后报告:“100% 没有碎片。你的硬盘现在已经达到
最佳状态。” 我现在才发觉我那时是多么的幼稚。

Linux 和 UNIX 用户似乎从来没有“整理硬盘”这种说法呢?你觉得很奇
怪吗?如果你觉得很奇怪,那说明你的思想在某种程度上被微软的垃圾程序禁锢了。你
需要明白,UNIX 的大型主机很多必须是一天24小时,一年365又1/4天不停运转的,要
是每个星期都要整理一次硬盘,在整理的时候几乎不能干任何事情,那是绝对行不通的

Linux 机器根本不用整理硬盘,这就是为什么没有看到过 Linux 用户整
理硬盘。Linux 的文件系统是比 Windows 的 FAT, FAT32, NTFS 高明得多的文件系
统,它们不但可以对文件设置权限,实施完全的保护,而且可以“越用越整齐”,“越
用碎片越少”!你应该把文件大部分放在 Linux 的分区,而不是 Windows 分区,因为
它比 Windows 分区可靠得多。

还有更滑稽的事情就是有很多“Norton System Doctor”,“Windows 优
化大师”,“超级兔仔注册表魔法” 之类的程序存在,而且价格昂贵。似乎一个操作
系统本来应该有很多问题,需要别的厂商做程序来“优化”它,而且为了得到优化,你
需要付钱!这些问题 Linux 根本就没有,所以不需要什么优化。Linux 内核本身就是
高度优化的。

IDE
有些人在抱怨为什么 Linux 没有一个良好的 IDE 开发环境。Linux 现在
已经有一些 IDE 了,但是总是有很多问题。你是不是正在寻找,正在期望 Linux 某一
天可以有一个VC那样的开发环境?你有没有发现你正在进入微软给你设下的怪圈?你为
什么一定要用 IDE?你说:“IDE 开发迅速,调试方便,适合大型程序……” 那说明
微软的程序在你脑子里已经比较根深蒂固,你需要好好清醒一下了,看看我来告诉你。

高明的 UNIX 程序员不用 IDE,IDE 从来就是给初级 Windows 程序员用
的。

你看看大型的 UNIX 程序,包括 Linux 内核,各种网络服务程序,
Xwindow 程序在内,哪一个是 IDE 搞出来的?我们实验室的 EDA 程序也没有一个是
IDE 弄的,我还知道 Candence, Synopsys,Mentor 的高性能的图形界面 EDA 程序也
都不是 IDE 写的。你信不信,微软的人在写 Windows 本身的时候也根本不用 IDE。微
软内部程序员最喜欢的编辑器其实是 VIM,用 VIM 的微软程序员上次向乌干达的可怜
儿童捐助了1000多美元,这是值得称赞的。

有一次某杂志采访一些出名的 Linux 内核程序员,包括 Linus 在内,没
有一个人用 IDE,有的人用 VIM,有的用 Emacs,只有 Linus 说“GNU Emacs is
evil”,但是其实他用的是一种跟 Emacs 有同样键绑定功能的 MicroEmacs。大家都
是用编辑器编辑了程序文件,然后用 make 这样的自动工具调用 gcc 编译器完成编译
工作的。甚至高级的 Windows 程序员也不用 IDE,他们可以从命令行调用 cl,nmake
来编译自己的程序。虽然这样的 Windows 程序员很少,但是他们却是最了解
Windows,最高明的 Windows 程序员。

为什么 UNIX 程序员不用 IDE?明白了这个道理你就能体会到 UNIX 的设
计思想了。首先,一个 IDE 集成了编辑器,编译器,汇编器,调试器,跟踪器…… 这
个编辑器功能肯定比不上 VIM 或 Emacs,编译器比不上 GCC,汇编器比不上 as,调试
器比不上 gdb, ddd, 跟踪器比不上 strace, ltrace, truss。你得到的是一套整合的
低能的程序。如果你对调试器的功能不满意,你只好换用另外一套 IDE,但是这套 IDE
的热键,菜单,编辑器功能,按钮…… 跟原来那个有很大不同。你不得不花很多时间
来熟悉新的环境,而不能保持原来的某些东西。

而在 UNIX 下就不一样了。你可以用你最喜欢的 VIM 编辑程序,你在
VIM 里可以调用 GNU make,make 可以调用 gcc, ld, … make 的出错信息可以被
VIM 捕获,VIM 能帮你在源程序里定位。你如果喜欢 icc, 你可以让 make 用 icc 而
不是 gcc。你如果觉得 gdb 跟踪变量时比较麻烦,你可以用 ddd 来显示各种数据结构
之间的关系。你还可以在 Emacs 里调用 gdb,那样就可以同步显示源代码了。而且
VIM 和 Emacs 还可以编辑很多其它东西,比如信件,LaTeX 文档,HTML,配置文
件…… 你不用另外找一个什么编辑器来干这些杂活了。很多程序比如 Mutt, tin 都可
以在内部使用 VIM,这样就更方便了。实际上 make 在其它方面还能帮你很多忙,我的
每一个比较大型的 LaTeX 文档都是用 make 维护的。

Linux 能干的高精尖的事情 Windows 都干不了
当然有很多事情是Linux/UNIX的专利了。因为 Windows 只能装在 PC 机
上,好像以前也有 Alpha 可以使用 Windows NT,但是就是没见到有人用。PC 机的能
力是很低的,像我们编程序处理 NP-Hard 问题的人,用 Windows 的机器显然速度不
够,而且有时一个问题算上几天甚至几个星期,Windows 机器是以“死机”著称的,我
们怎么能放心?

所以几乎所有科学计算程序,EDA 程序,高性能图像处理程序都不是
Windows 的。他们有时也会移植一些给 Windows,但是常常降低那些程序的能力。你比
较过 Windows 版本的 Mathematica 和 Linux 的有什么区别吗?

IBM 制造的最大的并行计算机有 8000 多个处理器,Windows 不可能有能
力管理这么多处理器,它用的是什么操作系统?答案是 Linux。

《泰坦尼克号》电影里的三维动画,那么细腻逼真,Windows机器能做出
来吗?不行。那也是 Linux 机器做的。

民航总局用来训练地情人员的虚拟现实训练设备,Windows 当然无能为
力。那都是商业的 IRIX 机器。

UNIX 是最早支持 TCP/IP 网络协议的系统。它上面有很多可以互相协作
的网络服务程序,它们经过多年的使用和修订,已经达到比较完善的程度。而就在1997
年,微软的比尔盖茨还在扬言:“Internet 是没有前途的。” 微软的这个“远见卓
识”大家应该都已见识,它后来加上的网络服务程序IIS漏洞之多,让公安部都频频发
出警报,大家也是见识了的。

其实你知道了,Windows 没有一样有用的事情能比 UNIX 干的更好。

Linux 干不了的有用的事情 Windows 照样干不了
当然 Linux 不是万能的。它也有不能干的事情,电脑也有干不了的事
情。但是 Linux 干不了的事情,Windows 肯定也干不了。这些事情就是我们需要探
索,需要努力的事情了。在你探索的过程中,Linux 必定是你的好伙伴。

不要把Linux和Xwindow掩盖起来!
不要把我们的用户当成傻瓜。

什么?你早就知道 Windows 是垃圾?噢!你怎么不早说呢!害我废话这
么多。嘿嘿。

“好了。你知道 Windows 是垃圾,你现在用什么?”

“Linux + Xwindow”

“那我问你,Xwindow 是什么样的?”

“不就是跟 Windows 差不多吗?只不过 ‘Start’ 按钮比较方,而且上面
不是一个 Windows 标志,而是一个脚丫子。点击一下居然还有很漂亮的中文菜单。我
喜欢!”

“你知道什么是‘根窗口’吗?”

“不知道。从来没听说过呢?”

“根窗口就是遮盖整个屏幕的那个最大的窗口。”

“哪儿有什么窗口啊!我没有看到呢?”

你发现了问题吗?这些 Linux 用户说是在用 Linux 和 Xwindow,但是他
们对 Linux 和 Xwindow 几乎完全不了解。很多人用了那么久 Xwindow 都不知道根窗
口是什么东西,不知道其实按钮也是窗口,不知道窗口管理器和其它程序有什么关系,
大家都以为窗口上面的按钮是程序自己放上去的,不知道窗口的“class name”,
“resource name”是什么东西。他们也不知道 .Xdefaults 是用来干什么的。特别是
他们很多人都不知道 Xwindow 的字体是如何命名的,什么是 fontset,有了一个新的
字体也不知道怎么安装。

他们被遮在 Linux 之上的一层一层的包装迷惑了,他们等待有图形界面
的工具来帮助完成一切事情,他们认为 Linux 跟 Windows 一样,只是麻烦一点。他们
知道 Linux 内核很好,但是他们感觉不到 Linux 和 Xwindow 在操作层面的天生的先
进性,随后不久就把 Linux 完全删除掉了。你发现没有,要用户理解 UNIX 和
Xwindow 的操作层面的先进性,才是留住用户的最好办法。如果用户体会不到操作时的
方便和高效,内核再好他们也不会理会。

但是用摹仿 Windows 的作法来吸引用户,永远会失败的。因为 Linux 如
果摹仿 Windows 那一套低效率的方式,那么 Linux 的这套“低效率方式”永远比不上
Windows 的那一套“低效率方式”。那么用户就会说:“这个 Linux,没有一样比的上
Windows。”

Linux 天生就是继承了 UNIX 的高效的工作方式,为什么我们要把它掩盖
起来?我们为什么只告诉用户 KDE 的菜单怎么用?我们为什么不能像早期的 Xwindow
书籍那样第一节就告诉用户什么是 X server, 什么是 X client,什么是 Window
Manager, 什么是根窗口。第二章就告诉用户窗口有哪些属性,什么是 classname,
resource name, hint,怎样使用 .Xdefaults, xrdb ……

在这里我又不得不说一下那些 Linux 的发行公司和写书的人,他们把
Linux 和 Xwindow 包装起来,却没有从基本上告诉用户 Xwindow 的工作原理。很多书
籍讲授的层次就是在 Gnome, KDE 的菜单操作的层次,靠大量抓图来占篇幅,“繁荣”
Linux 书籍市场。

现在很多人已经把能够利用别人的库写出一个好看的程序作为自己编程水
平的象征。在这个“图形化”,“可视化” 的年代,你如果还在用 troff, LaTeX 写
文档,你还在用 VIM 自己编辑 HTML,用 Mutt 处理邮件,你还在用文本模式的 gdb
调试程序,你还在用 Xlib 写程序, 你还在用 tin 上 USENET,你还在自己写
Makefile,写机器代码,你还在玩 Clossal Cave 这样的字符模式冒险游戏,那你就是
老古董。

其实这种思想是错误的。虽然你是一个坚决的 Linux 支持者,但是你的
思想是 Windows 的思想。你认为图形界面,菜单,按钮就可以解决一切问题,就可以
给你高效方便。你还是没能摆脱微软给你的潜移默化的东西。你其实离不开 Windows
那样的环境,你迟早会删掉自己的 Linux。

GUI vs. CLI
做一个坚定不移的“两面派”

大家看到这个标题是不是热血沸腾?两派大虾都可以围攻我了:

GUI派用户:“哇!我一看你这小子就是 CLI 的。要不然自己写什么
Makefile?用什么 Mutt?”

CLI派用户:“切~ 你还用 X!高手都不用 X。你是 GUI 那边的。”

可怜的我:“555~~ 你们都不要我~~ GUI 和 CLI 就那么水火不容吗
?”

计算机界这样的门派之分还很多。很有特点的就是 CLI 和 GUI 了。CLI
(Command LIne) 的狂热份子声称永远不用 X。我上次在实验室看到一个同学用一个
SecureCRT 登录到 Sun 机器,然后用一个 vanilla vi 编辑程序,我建议他启动一个
GVIM 过来显示在 Exceed 上可以有语法加亮。但是他坚决反对,说:“高手不用X。你
想想,要是我在一个很慢的网络连接怎么用 X?而且好多服务器没有装 X 程序。”

但是我们实验室的网速可够快,Windows 机器都有 Exceed 啊,而且 Sun
机器有全套 X 客户程序包括 GVIM。他说他是 CLI 的坚决拥护者,但是他却在用
Windows,他后来打开了好几个 SecureCRT,每次从文本框输入地址,用户名和密码,
从下拉菜单选择 “SSH2″,然后点击“Connnect”。他还不断的夸SecureCRT是“网络管
理员投票选出的最受欢迎的登录方式”。老天,SecureCRT 本身就是个 GUI 啊,他其
实没有明白 Xwindow 的好处。

你说我是 GUI 的?我虽然很少在 console 下工作。但是我对 bash, VIM
很熟悉,我可以让 bash 按照我的键绑定方式来工作。我可以在 rxvt 里使用 Mutt 来
收发 email。我的每个桌面上都常常堆放着一打不同大小的 rxvt。我用 VIM 编辑
LaTeX。我自己写 Makefile 来维护 LaTeX 文档。我有时用 mpg321 来放 mp3。我上
BBS用的我自己写的 expect 脚本。 好了,CLI 派的朋友可以收我做盟友了 Smile

你说我是 CLI 的老古董?我的 FVWM 被我配置为可以“手写操作”,我
只要画一个”r”就可以启动 rxvt,我只要画一个 “U” 就可以启动 GVIM,…… 我用
GVIM 语法加亮模式编辑程序,我用 Mozilla 浏览网页,…… GUI 派的现在好像认我
做朋友了 Smile

好了。CLI 派的朋友,虽然我很喜欢命令行,但是我有时在屏幕上左右画
一下就可以执行:

Module FvwmConsole -terminal rxvt -geometry 45×5-0+0 \
-bg gold -fg midnightblue \
-fn “-adobe-courier-medium-r-*-*-14-*-*-*-*-*-*-*”
你是不是现在又想把我逐出师门?

GUI 派的朋友,虽然我很喜欢窗口。但是我可以在 FvwmConsole 里输入

All (rxvt) MoveToDesk
把我所有的 rxvt 移动到我现在工作的桌面。“这家伙,怎么这么快就叛
变了!”

其实何必分什么 GUI 和 CLI,UNIX 和 Xwindow 都是工业标准,它们从
设计那天开始就有非常灵活的用法,各个程序,不管是 GUI 还是命令行的都可以互相
协作。UNIX 和 X 是一家,何必搞的那么偏激,非此即彼?你从我上面的行为可以看出
GUI 和 CLI 的模糊界线吗?我就是坚定不移的“两面派”。

UNIX 是简单的
“我相信简单就是最好,如果太复杂,我是不能理解的。” —Seymour
Cray

很多第一次用 Linux 的人会惊奇的发现,Linux 的程序居然不用“安
装”就可以运行,程序拷贝到随便那个目录都可以用,而不是一定要占用你第一个分区
的空间。程序的设置只是一些简简单单的文本文件。你根本不需要什么“注册表修改
器” 就可以改变系统的设置。这就叫做简单,但是简单就是美。虽然这只是 UNIX 简
单性的一个肤浅的认识,你已经体会到了某些东西。

但是简单并不意味着功能弱,并不意味着落后。相反,简单意味着强大,
意味着生命力。

我不会再继续阐述我理解到的“UNIX 的简单”,因为这个需要自己去体
会。

UNIX 是永恒的
有人说:“Plan9 会取代 UNIX,Mach 会取代 Linux 内核。”

但是你如果是一个深入体会了 UNIX 的人,你就会知道:UNIX 的思想是
永恒的,不管时过境迁,Plan9 是否代替 UNIX,UNIX 的灵魂都会在 Plan9 身上现形

我为同一个设备写过 Linux 内核和 Windows VxD 驱动程序。写 Linux
驱动程序时,我对 UNIX 设计的完美的一致性,远见性所折服。UNIX 用同样界面的
read(), write() 系统调用就可以对不同的对象:普通文件,设备文件,管道,管道文
件,socket,……进行统一的读写操作。我跟本不需要写一个测试用的应用程序就可以
对我的设备驱动进行测试,因为 cat, cp, dd, 它们也使用了同样的 read(),
write(),设备和普通文件在应用程序眼里没有区别。在那个还没有 Smalltalk, 没有
C++ 的年代,UNIX 的设计者已经使用了所谓的 “面向对象方法”。对,C 语言也可以
实现面向对象。

UNIX 的系统调用几十年都没有很大变化,这非但不是顽固,不进步的象
征,反而是 UNIX 的远见卓识的体现!这就跟 TeX 程序几十年都不变的情况差不多。
这些才是真正的永恒的 master piece! 你应该改变所有软件都必需从 0.1, 1.0, 1.1,
1.2, 2.0, …, 3.0, 3.1, 95, 98, 2000, XP, … 不断升级的想法。

Windows 就不同了,它在最开头只是一个 DOS 之上的图形包装而已。后
来为了兼容以前的糟糕设计,不得不加上很多累赘。我写 VxD 驱动程序的时候就深有
体会,Windows 95 程序对设备的操作只有用 DeviceIoControl,我不得不写了两个应
用程序来对设备驱动进行测试。Windows 内核的不一致性和隐密性使我非常恼火。不过
Windows WDM 驱动程序现在也有了 ReadFile, WriteFile,…… 那说明什么?那说明
Windows 在向 UNIX 学习,或者有可能是某个 UNIX 设计人员在微软打了几天临工,顺
手加了几个 UNIX 的东西进去。这样做是没有用的,Windows 从一开始就是非常糟糕的
设计,它的历史的包袱太沉重了,缝缝补补有什么用?它只能永远的被 UNIX 甩在身后

UNIX 是强大的
让聪明人干任何他们想干的事情。

UNIX 的一个特点就是非常高的灵活性,Xwindow 也具有这种灵活性。这
种灵活性体现在哪里呢?

UNIX 的程序一般都有很多参数,不管你现在用的着用不着,总有人需要
某些参数。它们的行为很多都可以用配置文件来改变。比如 GNU bash, 通常缺省的命
令行输入方式是 Emacs 方式,但是只要我编辑一个 .inputrc 文件,就可以把它变成
vi 的输入方式,而且我还可以自己绑定键序列到某些操作。我可以用 shopt 来设置它
的很多特点,比如是否进行通配符扩展,是否可以把一个变量当作一个目录来cd,是否
可以自动纠正某些明显的目录名打字错误 ……

UNIX 程序设计的思想是提供给用户“机制”,而不限制用户制定“政
策”。这是一个重要的尊重用户的作法。

我们再来看看 Xwindow。Xwindow 是一个出色的设计,它把显示服务器和
客户程序分开。一个显示上既可以显示本机上的程序,也可以显示别的机器上的 X 程
序,而它们都遵守你的窗口管理器的统一指挥,它们之间可以方便的传送剪贴版数据,
各种事件 …… 比如有时我的 XFree86 上会出现四个不同机器上的 XTerm,两个不同
机器上的 GVIM,…… 它们统一受本机上的 FVWM 指挥。

Xwindow 程序都具有很多很多命令行参数和 resource 参数。你可以随意
的在命令行或者 .Xdefaults 文件设置所有的颜色,字体,尺寸…… 而且如果你用
xrdb 把 .Xdefaults 导入到根窗口,那么其它机器上没有经过配置的同样的程序,显
示到你的机器上的时候也会遵守同样的外观规定。

Xwindow 的窗口具有 Property, 也就是一些可以自己定义的共享数据(原
子)。正是因为这些 Property 的存在,使得 Xwindow 具有无比强大的生命力。X 的窗
口管理器和其它客户程序之间并没有统一的协议,但是后来出现了 ICCCM(客户程序间
通信规范),这个规范就是通过 property 定义的。现在又有人定义了一套“扩展的窗
口协议(EWM Hints)”,使得 Xwindow 可以具有某些 Windows 的特征,比如一个工具
条程序可以告诉窗口管理器:“这个屏幕下面被我占据了24个像素的空间,你最大化程
序的时候不要越过这个界线。”

一个强大的窗口管理程序比如 FVWM,它收到这样的提示时,可以答应工
具条程序的这个要求,也可以不答应。一切选择的权力在于谁?当然是用户了!一切窗
口乖乖听话,FVWM 给予用户最大的尊重。

你想想,是不是有些 Windows 程序常常弹出一个窗口要你选择 “Yes or
No”?你不点击它它就不下去。你觉不觉得你的程序在侵犯你的尊严?你是一个人,一
个智慧的生物,怎能受到一个程序如此的待遇?

还有就是很多 Windows 程序把人当成傻瓜,而它是“智能程序”。比
如,有一个程序就是喜欢把你的每句话第一个字母都变成大写,我不说它是谁了,你遇
到的时候就知道了。如果连“一句话开头一个字母要大写”这么明显的问题都需要程序
帮你纠正的话,人脑还用来干什么?况且如果你故意想要不大写的话,那就更麻烦了,
我楞是没有从它那一大堆菜单里找到怎么关闭这个愚蠢的选项。

只有符号才能完全操纵计算机。

我们来说说很多初学 Linux 的用户。虽然他们在用 Linux,但是他们打
心眼儿里是觉得 Windows 的工作方式好,他们希望 Linux 有一天能“像Windows那
样”。你说:“我鼠标一点,我菜单一拉,…… 就可以完成我的操作。” 但是我要告
诉你:“Linux 从来没有摹仿 Windows,将来也不会。Linux 从诞生之日起,它的工作
方式就比 Windows 的先进。Linux 属于能勇敢面对符号的人。只有符号才能完全操纵
计算机。”

看看优秀的 UNIX 程序,XFree86, FVWM, VIM, Emacs, proftpd, Mutt,
wget, tin, … 没有一个不是用配置文件来设置选项的。为什么这些程序没有方便的
菜单可以用来配置?难道它们的设计者就那么低能,连个图形配置界面也写不出来?

当然不是。因为图形界面配置方式的能力是极其有限的,而配置文件和程
序语言的表达能力却是无限的。用图形界面配置这些程序的话,如果你想达到配置文件
的效果,你需要成百上千的菜单,checkbox, radio button, … 到时候你根本没办法
找到你需要修改的地方了!而各个程序的配置文件的语法都有很多相似之处,一般就是
一些命令,设置一些变量,参数,…… 一旦用会了一个,其它的也就容易理解了。如
果你用惯了 awk, sed, Perl,你会觉得那才是真正的自动化啊。

鼠标虽然是很好的工具,但是它的表达能力是有限的。你不可能光用鼠标
就让电脑完全明白你的意思,它毕竟只有3个按钮。看看我的MetaPost页你就能体会到
鼠标的这一弱点。所以我们虽然很喜欢鼠标,但是却不能完全依赖它。

各个小程序的完美配合

这就是UNIX最重要的特点了,它就是UNIX设计的思想。让每个程序只具有
一项专门的能力,然后让它们合作。Xwindow也继承了这种好传统。

这恐怕就是Windows和其它操作系统望尘末及的地方了。UNIX 程序设计之
统一,配合之完美,真使我难以置信!shell, grep, find, awk, sed, make, Perl,
Emacs, vi, tin, Mutt, … 它们是那么的具有一致性!你一旦学会了 sed 的正则表
达式,其它程序基本上都能用了。你一旦学会了 vi 和 VIM, 你会发现它的操作是那么
的有规律性,似乎vi的设计者在几十年前就已经设计好了 VIM 在今天的完美而统一的
操作方式!而且vi的操作还体现在 Mutt, tin 等很多程序中。你甚至可以把 bash 设
置为 vi 的输入方式来输入命令行,我就是这么做的。一个程序可以调用另外一个程序
来得到数据,可以把数据交给它处理后返回来,可以在自己的窗口里“嵌入”另外一个
程序。

在 Windows 和其它非 UNIX 操作系统中,这种合作是非常困难的。我曾
经在 Windows 下使用 Perl来进行一些自动工作。但是 Windows 的文件操作,管道是
如此的不稳定,程序之间基本不能合作。你别想在 Visual Studio 窗口里面嵌入
UltraEdit 编辑器,你别想用一个 expect 脚本来控制 telnet 到水木清华BBS。

Windows 的程序都是大而全,大而杂,所有的电子邮件程序都需要自己提
供编辑器,自己发送和收取邮件,自己显示邮件的附件。每一个BBS程序都提供自己的
Virtual Terminal, 自己的通讯代码。每一个 IDE 都自己提供编辑器,编译器,汇编
器,调试器。人们为了使用一种新的程序,需要适应所有这些它提供的界面,而不能使
用自己喜欢的编辑器的键绑定,菜单组织…… 不能 DIY!

你要知道,最高级的电脑是定做的,自己想要什么什么CPU,什么主板,
多少内存,什么硬盘,键盘,鼠标,显示器都是自己选择的。最高级的滑板,自己想要
什么牌子的版面,什么牌子的沙,什么桥,什么轮子,什么轴承,也都是自己选的。最
高级的乒乓球拍,木板,胶皮,海绵,胶水都是可以自己选择…… 而用 Windows 程
序,你得到的是大杂烩,就像你去买“品牌机”,只有那么几种配置,而且附带很多你
不需要的软件和服务;就像你去买组装好的滑板,你想要大一点的轮子和窄一点的板
子,但是你没有这种选择余地!Windows 程序就相当于最廉价,最次的滑板。但是它却
会花你更多的钱,因为一旦一个部件坏了,或者你不喜欢了,你不能另外找一个好的换
掉它,你必需重新买全套配件!

而 UNIX 和 Xwindow 就是高档的“组装货”。比如我用 Mutt 的时候,
我可以用 VIM 也可以用 pico 来编辑邮件,我可以用 ImageMagick 也可以用 xv 来显
示附件里的图片,我可以用 lynx 把 HTML 附件转成文本嵌入窗口中,我也可以把
HTML 附件交给 Mozilla 图形显示。我可以让 GnuPG 帮我把邮件进行数字签名和加
密,我也可以用其它 PGP 程序。我想让 Postfix 而不是 sendmail 帮我发出邮件,我
想让 fetchmail 帮我收邮件,转发给 postfix,然后被我自己写的Perl过滤器处
理…… 这一切我都可以办到!我可以选择我最喜欢的专门的程序来完成专门的工作,
然后把它们结合在一起,我也可以分别得到它们的好处。

学 UNIX 绝对不是浪费时间
有人告诉我:“你看我用 Windows 什么都不用学。而用 Linux,光是安
装就花了我一个星期!”

首先,我要告诉你的是,你装 Linux 花了一个星期,不是因为 Linux 不
好装,而是因为你已经习惯了 Windows,对 Linux 最初难以理解而已。你想一想你最
初安装 Windows 的时候呢?你花了多少时间搞明白什么是硬盘分区?什么是盘符?什
么是目录?你认为 Windows 就是那么容易可以学会的吗?虽然你觉得没花时间学,但
是你以前在用别人的机器的时候已经耳濡目染,自然就了解了。而且由于你想要 Linux
和 Windows 并存于硬盘上,又增加了安装难度。而且你肯定没有得到有经验的 Linux
用户的帮助,否则他们会在 20 分种之内帮你搞定。一个星期也太夸张了 Razz

如果一开始用的就是Linux就没有这个问题。你想想如果你没有用过
windows,你肯定会很习惯 /etc, /usr, /usr/local ,… 而不是 C:, D:, E:, …
是不是?如果你只用过 Linux,你第一次用 windows 时恐怕也会问:“/bin 目录哪里
去了啊?”

最重要的是,你用惯了的UNIX工具,它们可以伴随你一生,而不会那么容
易变化或消失。你可以永远不用再换另外的工具了。除非那个工具比你这个好的太多,
而且可以完全模拟你现在的工具。

我们实验室一个60多岁的老师,用vi, cc, make, …都几十年了,他以
前的经验绝对没有白费,而且教会了我们一批又一批的学生。vi 伴随着 UNIX 的最初
发行而诞生,直到今天还是世界上头两号编辑器之一!有些人的 FVWM 配置文件已经用
了 10 多年,现在完全不经修改还可以用。

看看 Windows 的工具,你从 Borland C++ 换到 VC, 就必需适应新的环
境:菜单不同了,颜色不同了,按钮不同了,帮助信息不同了,热键不同了,编译器参
数,调试器功能也不同了,…… 那个时候恐怕花要花你很多时间去适应。当你刚刚适
应了 VC, 你又要换成 VJ, PowerBuilder, C++Builder, …

很多windows程序员都是这样,开头在dos下用Turbo C, 然后是 Borland
C, VC, C++ Builder, ……不断追赶微软的潮流。而且微软的SDK, MFC, .NET ……
什么都在不断变化,不断出问题,又不断的在修改…… Windows 程序员不得不买又厚
又重的 Microsoft Press 的书籍,看了才一个月,又过时了。今天你才学会了写
VxD,明天你就必须用 WDM 了。你不得不注册 MSDN 才能赶上 Microsoft 的步伐。很
多人说:“计算机是贵族的专业。” 这就是微软一手造成的。

这些东西才是没完没了的浪费大家的时间和金钱的。这是是浪费生命!我
们为什么不使用从诞生就那么一致和完美的 UNIX?你需要理解先进工具的设计理念。
UNIX 的工具就像我们用的汽车,它的离合器,油门,刹车,方向盘,后视镜,永远都
在同样的位置。用惯了的话,你对你的汽车的每一个部件都会了如指掌,甚至你自己都
可以修车了。这难道不好吗?

有人说:“你说我们需要了解 UNIX,难道你要开车还必须了解汽车的结
构吗?” 你去问问开车的司机,哪一个不了解汽车的结构的,那他的驾照就是混来
的。你难道想要傻瓜型的“微软牌汽车”吗?我们来看看:

你买的微软牌汽车最开头只有一个座位,每加一个座位你得向汽车公司付
钱。车上的防撞气囊不时会冒出来,说是为了你的安全。每开100英里要大修一次,每
过一年要换一次引擎。附带的,你还必须换用由微软汽车公司指定的石油公司提供的新
型号的机油。你的车出了问题,但是法律规定,你不准私自拆开你的汽车来修理,你必
需到微软汽车公司指定的维修点去,需要付相当多的钱才能修好一个小毛病。

最可气的是,你每换一个型号的微软牌汽车,它的刹车和离合器都在不同
的位置,你需要重新去考驾驶执照。如果这辆汽车在途中刹车失灵,你受了重伤,你也
不能状告微软汽车公司,因为你买来汽车之后必须签一个合同,说“由于微软牌汽车对
你和家人造成的一切死伤,微软概不负责。”

怎样完全用 GNU/Linux 工作
说了这么多 Windows 的不好。我还没有告诉你我怎么用 Linux 处理有些
必要的事情。

半年以前我由于中文老是配置不好,一直是双系统,不时需要重起到
Win2k 来处理汉字。后来我找到了 miniChinput, XSIM 和 SCIM 输入法。这下可以处
理汉字了。而且 VIM 和 Emacs 对汉字支持越来越好。我的大部分文本是用 VIM 编辑
的,包括程序,信件,网页,LaTeX 论文,MetaPost 绘图语言。

我不用 Word 这样的程序写论文,而是用 LaTeX,因为这是世界上效果最
好,最方便的论文工具,是大多数学术杂志要求的格式。幻灯都是用 ConTeXt 做的,
用起来很简单,而且效果非常漂亮。你可以看看我的TeX介绍。

至于绘图,你可以用很多可视化的工具,比如 xfig,dia。但是对于我来
说,任何可视化的工具都不能完成某些任务,我需要一种可以精确描述图形的语言。我
找到了MetaPost。它简单又好用,而且效果是世界一流的。我的插图,如果不是图像,
都是 MetaPost 画出来的。

我曾经抱怨 mozilla-mail 经常突然消失,损坏我好几封快要完成的信
件。后来我发现 mozilla 的邮件处理程序确实是不稳定的,功能又弱,有经验的 UNIX
用户都不用这样的程序。Mutt 是一个非常稳定可靠的 UNIX 邮件处理程序,而且功能
非常强大。

我曾经为 Gnome 和 KDE 的不稳定而烦恼。现在我找到了非常强大的
FVWM。KDE,Gnome 也能和 FVWM 一起工作。虽然 Gnome 和 KDE 总体不稳定,但是某
些部件程序还不错,很多 gtk, Qt 的程序也很不错,它们很多都是可以独立于这些桌
面环境运行的。

Linux 有很多强大方便的工作方式是 Windows 没有的,或者有类似的东
西,但是很差劲或者用起来不方便。比如 ssh 服务,rsync,cvs,expect ……

结论
我写这么多的目的是什么?我希望喜欢 Linux 的朋友,完全清除微软和
Windows 灌输在你脑子里的谬论,别再相信它们所谓的“新技术”,别再追赶
Windows,因为追赶 Windows = 倒退。马克思有一个思想很重要,“新生事物并不一
定是在最近出现的。” UNIX,Xwindow, TeX 虽然都比 Windows 先出现,但是它们才
是先进生产力的代表。我们要清楚的认识到什么才是真正的现代化,什么才是真正的自
动化。

消除学计算机很难的幻觉,勇敢的拿起像 bash, FVWM, TeX, VIM,
Emacs, Mutt …… 这样强大的程序,勇敢的面对符号。不要再埋怨“Linux 为什么不
能像 Windows 那样”,不要再浪费时间试用这样那样的程序,不要再忙着升级。你需
要理解 UNIX 的工作方式,因为那是大多数科学家的工作方式。Linux 可以成为你的好
朋友,你需要认识它,了解它,信任它,才能完全的靠它来高效的工作。当然,在游戏
机,手机,掌上电脑里,或者在用电脑来娱乐的时候,用一些“傻瓜软件”还是不错的
Smile

我希望小学,中学的计算机老师能够提高自己的素质,在孩子们的启蒙教
育中充分利用 Linux 神秘的特点,引起孩子们对数学,对符号的好奇心。诱导他们用
计算机来解决世界上的有趣问题,而不要把教学的范围局限于计算机的操作和它自身的
问题。

附录: 我用来处理日常事务的 Linux 程序
好了好了。我知道你发现自己应该转向 Linux,你很后悔当初为什么中了
微软的邪。但是不要着急。因为这些东西本来只是工具,它们是用来完成你的主要任务
的辅助而已。你以前选错了工具,这不要紧。你还是拥有你自己原来的专业技能,那才
是最重要的。工具的东西只有慢慢适应转换,不能一蹴而就,否则你会感到非常没意
思,甚至放弃。

如果你只想做一个像我这样的普通用户,主要目的是用 Linux 来完成自
己的任务,那就可以不用系统管理员或者网络管理员的标准来要求自己,因为当一个系
统和网络管理员确实很辛苦。这里我对实验室的网管同学鞠一躬,谢谢你的指点和帮助
Smile 不用把你的机器当成网络服务器,不用开放没有必要的服务,设置好 ssh, ftp 已
经足够了。这样会省去了解很多没必要了解的东西的时间。不用过度考虑“安全”,因
为 Linux 缺省已经很安全了。不过你有兴趣了解更多那也无妨。

下面给出一些推荐使用的可以处理一般事情的程序。至于你的专业上要用
到的科学和工程软件比如 Matlab, Mathematica, Maple, HSpice, Design
Compiler, …… 还有其它物理上的,化学上的,生物上的 …… 都必然有 Linux 和
UNIX 的版本。当然他们很多不是免费的,不要总是觉得什么都应该免费,自由不等于
免费。它们是经过很多人辛勤劳动的产物,是可靠的程序,它们物有所值。

下面列出我常用的一些 Linux 程序。一个列表里可能有很多,那是为了
方便你来选择,我列出了比较信得过的。但其实很多只有第一个是我真正在用的,我不
喜欢试用程序。我不是一个合格的网络管理员,我的服务器都只设置了我自己需要的功
能,那样可以省去我很多麻烦 Razz

Shell: bash。它结合了 csh 和 ksh 的优点,并且有 readline 功能,
你可以随意绑定自己的键盘。
编辑器: VIM, Emacs。
程序开发: GCC, make, ld, Scheme48, j2sdk, Perl, Python, Tcl/Tk

论文,幻灯工具:LaTeX, ConTeXt
绘图工具:MetaPost。这个语言太强了,以至于我只用它了。你不熟悉的
话可以用 xfig, dia 来画一些流程图之类的图片。
图像处理:ImageMagick。其中的 import 程序可以屏幕抓图,convert
程序可以转换图像格式,display 可以显示图片和简单编辑(缩放,换质量,转格式,
简单绘图,简单虑镜)。通常我就这么点需要。如果你要更强大的图像工具可以用
Gimp, 它几乎和 Photoshop 差不多。
自动管理工具:make。我可以用make来自动编译程序,自动编译文档,自
动更新插图…… 全自动,而且不会重复劳动。
数值计算程序:SciLab。这个程序基本上可以代替 Matlab。
代数计算程序:MAXIMA。这个程序基于世界上最老的计算机代数系统之一
: 由美国能源部(DOE)发行的 MIT Macsyma 系统。它是用 Common Lisp 实现的。很多
现在的符号计算程序比如 Maple 都从 MAXIMA 身上学到很多东西。它现在经过 DOE 批
准以GPL发行,永远是一个自由软件。
加密程序:GnuPG。我的 PGP 密钥就是它搞出来的。
打包,压缩程序。什么都有: tar, gzip, bzip2, zip, rar, …
虚拟光驱程序。Linux 不需要虚拟光驱程序,直接 mount 就行了。
ftp 服务器:proftpd, vsftpd。proftpd 功能很强,但是我只用了最简
单的一种设置。
WWW 服务器:apache。(我一般没有开)
ftp 客户程序:lftp,ncftp。它们都是文本方式操作的,但是比起图形
界面的方便的多。比如 lftp 几乎具有 bash 的所有方便功能,Tab 补全,bookmark,
queue, 后台下载,镜像…… Linux 也有图形界面的 ftp 客户程序,但是大多不稳
定,有很多问题。这就是很多人抱怨 Linux 不如 Windows 的一个小原因。还有很多人
用 Wine 模拟 Windows 的 leapftp,其实 lftp 比 leapftp 好很多,你需要的只是适
应一下。
自动下载工具:wget。它非常稳定,有一次我下载一个程序,用 IE 和
Mozilla 下载回来的文件都是坏的,最后还是 wget 可靠的传输了数据。用它甚至可以
镜像整个网站,比起 WebZip 这样的 Windows 程序强多了,而且不会因为你不付钱就
在下载回来的网页里强制插入广告。
虚拟终端:rxvt, xterm, gnome-terminal, mlterm, …
X server: XFree86
窗口管理器:FVWM。编译加入了 libstroke。
中文输入:XSIM。被我修改过以适应 FVWM 的需要。另外推荐你还可以用
SCIM。
email 处理:Mutt + Postfix + fetchmail
看 PDF, PS, DJVU 文件:Acrobat Reader, xpdf, GhostScript, gv,
djvu工具包和 netscape 插件。
看CAJ文档。我从来不看CAJ之类的文档,如果找不到PDF或PS,直接去图
书馆借最好。
看网页:Mozilla, Phoenix, lynx。Mozilla-Xft 的显示效果比 IE 好很
多。
英汉字典:IBM智能词典,星际译王。
编辑网页:我用 VIM 直接写 HTML。你如果想要图形方式的可以用其它的
比如 screem, BlueFish。
登录其它 UNIX, Linux 机器:openSSH, telnet。 我喜欢用 openSSH 把
其它机器的 X 程序通过 ssh 加密的隧道传到我机器上显示。
登录 Windows2000 server 的 display service: rdesktop,…我有一
天试了一下,不错。后来就没有用过了。
同步程序:rsync。我用 rsync 通过 ssh 来跟某些机器同步数据,或者
做自己机器上不同目录间的同步。
上BBS:rxvt(或任何一种终端) + telnet + chatbot(helloooo 机器人的
程序)
QQ, ICQ: 我没有 QQ 或 ICQ。不过你可以用 Gaim, 它同时支持 QQ, ICQ
和很多其它的即时通信方式。ICQ 用户也可以用 Licq。
放录像:MPlayer, RealPlayer。MPlayer 太好了,直接就可以放 VCD,
DVD, divx, wma, wmv … 用 Windows 的同学都很羡慕我,说 Windows 要放这个需要
大堆插件。rm 最好还是用 realplayer 放,它也是免费的。
放音乐: xmms(mp3,ogg都可以), mpg321(放mp3), ogg123(放ogg)。
mpg321 不如 xmms 管理音乐文件那么方便,但是有时我还是用 mpg321 放 mp3 作为背
景音乐,因为懒得开一个xmms窗口 Smile
游戏:我觉得 KDE 的那个 ksokoban(推箱子),很好玩 Smile
看 Word 文档。请 Word 用户把文档全部转为 PDF 或 PS 再给我,文档
里没有特殊的格式干脆就用文本吧,何必那么麻烦。以前很奇怪的是,通知里本来没有
什么特殊的格式居然还要发doc附件的email。现在好了,我们系发通知都用文本,
PDF,甚至图片了 Razz
其它程序:还有很多我需要用而你不一定用得着的。比如,Doctor
Scheme, Scheme48, Scsh, kawa…这些程序只有 Doctor Scheme 有Windows版本。还
有很多幕后工作但是你一般不察觉的:xinetd, telnetd, sshd, crond, atd, lpd,
… 他们都比 Windows 的对应者强的多,或者根本没有对应者。