-
2007-01-22
nfs优化
1.设置块大小
mount命令的risize和wsize指定了server端和client端的传输的块大小。如果没有指定,那么,系统根据nfs的版本来设置缺省的risize和wsize大小。大多数情况是4K(4096bytes),对于nfs v2,最大是8K,对于v3,在server端设置risize和wsize的限制,最大块大小在kernel的常量NFSSVC_MAXBLKSIZE,该常量在usr/src/linux2.4/include/linux/nfsd/const.h.所有的2.4的的client都支持最大32K的传输块。系统缺省的块可能会太大或者太小,这主要取决于你的kernel和你的网卡,太大或者太小都有可能导致nfs速度很慢。具体的可以使用Bonnie,Bonnie++,iozone等benchmark来测试不同risize和wsize下nfs的速度。当然,也可以使用dd来测试。
#time dd if=/dev/zero of=/testfs/testfile bs=8k count=1024这是来测试nfs写
#time dd if=/testfs/testfile of=/dev/null bs=8k 这是测试nfs读
测试时文件的大小至少时系统RAM的两倍,每次测试都使用umount 和mount对/testfs进行挂载,通过比较不同的块大小,得到优化的块大小。
2.网络传输包的大小
网络在包传输过程,对包要进行分组,过大或者过小都不能很好的利用网络的带宽,所以对网络要进行测试和调优。可以使用ping -s 2048 -f hostname进行 ping,尝试不同的package size,这样可以看到包的丢失情况。同时,可以使用nfsstat -o net 测试nfs使用udp传输时丢包的多少。
因为统计不能清零,所以要先运行此命令记住该值,然后可以再次运行统计。如果,经过上面的统计丢包很多。那么可以看看网络传输包的大小。使用下面的命令:
#tracepath node1/端口号
#ifconfig eth0
比较网卡的mtu和刚刚的pmtu,使用#ifconfig eth0 mtu 16436设置网卡的mtu和测试的一致。当然如果risize和wsize比mtu的值大,那么的话,server端的包传到client端就要进行重组,这是要消耗client端的cpu资源。此外,包重组可能导致网络的不可信和丢包,任何的丢包都会是的rpc请求重新传输,rpc请求的重传有会导致超时,严重降低nfs的性能。可以通过查看/proc/sys/net/ipv4/ipfrag_high_thresh和/proc/sys/net/ipv4/ipfrag_low_thresh了解系统可以处理的包的数目,如果网络包到达了ipfrag_high_thresh,那么系统就会开始丢包,直到包的数目到达ipfrag_low_thresh。
3.nfs挂载的优化
timeo:如果超时,客户端等待的时间,以十分之一秒计算。
retrans:超时尝试的次数。
bg:后台挂载,很有用
hard:如果server端没有响应,那么客户端一直尝试挂载。
wsize:写块大小
rsize:读块大小
intr:可以中断不成功的挂载
noatime:不更新文件的inode访问时间,可以提高速度。
async:异步读写。
4.nfsd的个数
缺省的系统在启动时,有8个nfsd进程。
#ps -efl|grep nfsd
通过查看/proc/net/rpc/nfsd文件的th行,第一个是nfsd的个数,后十个是线程是用的时间数,第二个到第四个值如果很大,那么就需要增加nfsd的个数。
具体如下:
#vi /etc/init.d/nfs
找到RPCNFSDCOUNT,修改该值,一般和client端数目一致。
然后,重启服务。
#service nfs restart
#mount -a
5.nfsd的队列长度
对于8个nfsd进程,系统的nfsd队列长度是64k大小,如果是多于8个,就要相应的增加相应的队列大小,具体的在/proc/sys/net/core/【rw】mem_default和/proc/sys/net/core/【rw】mem_max。队列的长度最好是每一个nfsd有8k的大小。这样,server端就可以对client的请求作排队处理。如果要永久更改此值
#vi /etc/sysctl.conf
加入
net.core.【rw】mem_max=数目
net.core.【rw】mem_default=数目
#service nfs restart -
- Create the destination folder (C:\cygwin or D:\cygwin as appropriate). Default permissions will be for administrators and SYSTEM only. Add SERVER\Users with modify control to the list. These permissions will be inherited to the rest of the folder as it is populated.
- Create a directory to locally store the cygwin packages e.g. C:\temp\cygwinarchive. Open a browser window to the following URL http://www.cygwin.com/setup.exe and save the installation file setup.exe to the archive directory just created (C:\temp\cygwinarchive in this example)
- Double click on the downloaded cygwin setup program. The current version is 2.510.2.2 (February 3rd, 2006). Click 'Next' and answer the prompts :
- Leave default "install from internet"
- Install to root directory c:\cygwin
- leave default "install for all users"
- leave default text file type "unix / binary"
- Set local package directory to c:\temp\cygwinarchive (the directory created in step 2 above). This should be the default.
- Leave the default "direct connection"
- Select a mirror (any of the ones with starting with http://mirror in the name). The package list will be downloaded.
- The 'Select Packages' window can be stretched. Click on the plus sign to expand the categories. Install at least the following list of packages.
- From Admin, select all packages.
- From Archive, select unzip and zip packages.
- From Base, leave the default, select all packages.
- From Doc, leave the default, man and 'cygwin doc' packages.
- From Editors, select vim package.
- From Net, select openssh (openssl will get checked automatically), rsync and tcp_wrappers packages.
- When you've selected these packages, click 'Next'. The installation tells you which packages it is installing as it progresses.
- Uncheck 'Create desktop icon'. Leave default 'Add to start menu'. Click 'Finish'.
- A post install script runs a few final commands. Then you should see a message saying 'Installation complete'. Click 'OK'.
Edit C:\cygwin\cygwin.bat. Make sure it contains these lines - you will need to add the line setting the CYGWIN environment variable.
@echo off set CYGWIN=binmode tty ntsec C: chdir \cygwin\bin bash --login -i
- Test cygwin to make sure it works. Start, Programs, Cygnus Solutions, Cygwin Bash Shell - should get a command window with a prompt saying 'Administrator@servername'. This is a bash shell and you can use unix or DOS / NT type commands e.g.
- 'ls /bin' to see the cygwin bin directory
- 'dir c:' to see the contents of the C: directory
- Type "control d" or "logout" to exit the shell.
- If you get a message saying 'cannot create /home/userid', run this command from the cygwin window "mkpasswd -l >/etc/passwd".
- While you're in the cygwin shell window, run this command to change the mount prefix from "/cygdrive" to "/".
mount -s --change-cygdrive-prefix /
- Also, create a home directory where you can place user startup files. The default location is the "Documents and Settings" folder. Creating a /home directory and using the -p switch to assign the home directory when adding a new user keeps all the cygwin files under the c:\cygwin directory.
- mkdir -p /home
Installing the SSH daemon service
- From a cygwin prompt (Start, All Programs, Cygwin ?), run ssh-host-config to create the service, set up the ssh host keys and create the sshd_config file in /etc/. Note that 2 local users are created, one called sshd to handle privilege separation and one that is required on Windows 2003 called sshd_server that runs the service in order to use public key authentication. You should see output like this:
$ ssh-host-config Generating /etc/ssh_host_key Generating /etc/ssh_host_rsa_key Generating /etc/ssh_host_dsa_key Overwrite existing /etc/ssh_config file? (yes/no) yes Generating /etc/ssh_config file Overwrite existing /etc/sshd_config file? (yes/no) yes Privilege separation is set to yes by default since OpenSSH 3.3. However, this requires a non-privileged account called 'sshd'. For more info on privilege separation read /usr/share/doc/openssh/README.privsep. Should privilege separation be used? (yes/no) yes Warning: The following function requires administrator privileges! Should this script create a local user 'sshd' on this machine? (yes/no) yes Generating /etc/sshd_config file Added ssh to C:\WINDOWS\system32\drivers\etc\services Warning: The following functions require administrator privileges! Do you want to install sshd as service? (Say "no" if it's already installed as service) (yes/no) yes You appear to be running Windows 2003 Server or later. On 2003 and later systems, it's not possible to use the LocalSystem account if sshd should allow passwordless logon (e. g. public key authentication). If you want to enable that functionality, it's required to create a new account 'sshd_server' with special privileges, which is then used to run the sshd service under. Should this script create a new local account 'sshd_server' which has the required privileges? (yes/no) yes Please enter a password for new user 'sshd_server'. Please be sure that this password matches the password rules given on your system. Entering no password will exit the configuration. PASSWORD=xxxxxxx User 'sshd_server' has been created with password 'xxxxxxxx'. If you change the password, please keep in mind to change the password for the sshd service, too. Also keep in mind that the user sshd_server needs read permissions on all users' .ssh/authorized_keys file to allow public key authentication for these users!. (Re-)running ssh-user-config for each user will set the required permissions correctly. Which value should the environment variable CYGWIN have when sshd starts? It's recommended to set at least "ntsec" to be able to change user context without password. Default is "ntsec". CYGWIN=binmode ntsec tty The service has been installed under sshd_server account. To start the service, call net start sshd' or cygrunsrv -S sshd'. Host configuration finished. Have fun!
- You can start the service from the services MMC panel, or using either of the commands listed above ("net start sshd" or "cygrunsrv -S sshd").
Generating public/private SSH keys for a user
- If you need to generate ssh public and private keys for a user on this machine who will be uploading data or logging in to a remote machine, you will need to carry out this step. Sign on as the user who needs the keys created. They will automatically be in their home directory. Run ssh-user-config to setup the ssh keys. Create only an SSH2 RSA identity (use a null passphrase - just press return). Output should be similar to this :
cygwinadmin@HICKORY ~ $ ssh-user-config Shall I create an SSH1 RSA identity file for you? (yes/no) no Shall I create an SSH2 RSA identity file for you? (yes/no) (yes/no) yes Generating /home/pswander/.ssh/id_rsa Enter passphrase (empty for no passphrase):Press ENTER Enter same passphrase again:Press ENTER Do you want to use this identity to login to this machine? (yes/no) yes Shall I create an SSH2 DSA identity file for you? (yes/no) (yes/no) no Configuration finished. Have fun!
- Update the file /home/userid/.ssh/authorized_keys with any public keys from other users who you wish to be able to connect to this user's account. Refer to this document for more information. Make sure each entry you add is all on one line.
- Make sure the service is running (state 4 = running)
$ sc query sshd SERVICE_NAME: sshd TYPE : 10 WIN32_OWN_PROCESS STATE : 4 RUNNING (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 - Test the service from the cygwin prompt using "ssh -v localhost". You will get challenged with the new host key and will have to enter your password as you connect. You should see output like this:
The authenticity of host 'localhost (127.0.0.1)' can't be established. RSA key fingerprint is 75:8a:67:20:0d:75:dd:06:64:04:d0:ac:23:c7:74:ba. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'localhost' (RSA) to the list of known hosts. The last line is: You are successfully logged in to this server!!!
- Test the service from a remote host. You can now update the authorized_keys file with the public key file from the user and host you want to connect from. Then test your connection from that host by issuing the command "ssh userid@servername dir c:\"
Adding and removing users from the passwd file
- You can add domain or local users using the mkpasswd command. Test what would be added for a domain user with this command:
mkpasswd -d domain_name -u joeuser
- You can add an ads domain user to the passwd file and give him a home directory in /home with this command:
mkpasswd -d ads -p /home -u kscully >>/etc/passwd
- You can add local users using the -l switch instead of the -d switch. Be careful not to use the -d domain_name switch without specifying a user or you will get entries for ALL doamin users in the passwd file.
- Users can be removed and both users and groups can be updated by starting a cygwin shell and using vi to edit the /etc/passwd and /etc/group files.
Restricting SSH access to specific servers
- Working on a netsh script to restrict access to specific servers.
- cygrunsrv --install sshd --path '/usr/sbin/sshd' --env 'PATH=/bin;/sbin' --env 'CYGWIN=ntsec tty' -a -D
Switching the user who runs the service
- In a normal installation, the ssh-host-config script creates a local user called sshd_server under whose credentials the ssh daemon runs. This is fine for local shell access to the server and secure file transfers to and from the server, but it is not possible to access any network resources while the service is running under the local user account.
- The solution is to run the service under a domain user account - one that has access to the shares or servers remote from the server running sshd. In order to switch the service to run under a different user, these steps must be carried out :
- Open "Computer Management", open the Services tab, right click on the "Cygwin sshd" service and stop the service.
- Right click on the "Cygwin sshd" service again and select properties. Under the 'Log On' tab, switch the name of the account the service is running from ".\sshd_server" to domain\userid, where domain and userid correspond to a userid with access to the resources you require in the domain. You will be prompted for this user's password.
- Open Control Panel -> Administratice Tools -> Local Security Settings -> Local Policies. Then click on 'User Rights Assignment'. Make sure the domain user you specified in step one is in the list for these 4 rights :
- Adjust memory quotas for a process
- Create a token object
- Log on as a service (already granted if you completed step 1)
- Replace a process level token
- Add the domain user to the local password file
mkpasswd -d domain -u userid >> /etc/passwd - Change to ownership of the files required by the sshd service owner. Open a cygwin bash session and run these commands for your userid
$ chown userid /var/log/sshd.log $ chown -R userid /var/empty $ chown userid /etc/ssh* - In the services tab again, right click on the 'Cygwin sshd' service and select 'start'. Check the event log for a successful start, or for errors in case the service does not start successfully.
-
2006-09-29
基于AS4配置时间服务器
在linux下,我们可以通过自带的NTP(Network Time Protocol)协议通过网络使自己的系统保持精确的时间。可用的公共时间服务器列表可以从下面的地址获取:
http://ntp.isc.org/bin/view/Servers/NTPPoolServers
什么是NTP
NTP是用来使系统和一个精确的时间源保持时间同步的协议。建议大家在自己管理的网络中建立至少一台时间服务器来同步本地时间,这样可以使得在不同的系统上处理和收集日志和管理更加容易。
同样,也有很多免费的NTP客户端可供Windows使用,你可以用它们来同步你windows的系统时间。
下载和安装
本文介绍如何在AS4上安装时间服务器(本文也同样适用于redhat和fedora core的其他版本),如果想获得NTP的最新版本,你可以下载tar包自己编译,这里只介绍RPM方式安装的NTP服务软件。
AS4带的NTP版本是4.2.0,你可以用下面的命令查看是否已经安装了这个软件包:
# rpm -qa|grep ntp
ntp-4.2.0.a.20040617-4.2
如果发现没有安装,请从光盘上安装这个软件。执行下面命令安装NTP的RPM包:
# rpm -ivh ntp-4.2.0.a.20040617-4.2.i386.rpm
/etc/ntp.conf这是NTP的主要配置文件,里面设置了你用来同步时间的时间服务器的域名或者IP地址,下面是到互联网同步时间的最基本的配置:
首先定义我们喜欢的时间服务器:
server pool.ntp.org
接下来,我们设置上面两台服务器的访问权限,在这个例子中我们不允许它们修改或者查询我们配置在Linux上的NTP服务器
restrict default nomodify notrap noquery (这个默认在配置文件中就存在)
接下来设置允许访问我们时间服务器的客户机地址,通常这些服务器都应该位于我们自己局域网内。请注意,配置中noquery已经去掉了:
restrict 192.168.0.0 mask 255.255.255.0 notrust nomodify notrap
在上例中,掩码地址扩展为255,因此从192.168.0.1-192.168.0.254的服务器都可以使用我们的NTP服务器来同步时间。
最后,也是最重要的是默认的限制配置要从你配置文件中删除,否则它将覆盖你所有的配置选项,你将发现如果不删除该配置,你的时间服务器将只能和自己通讯。如果ntp.conf中有以下一行,请将它注释(AS4附带的ntp默认没有):
# restrict default ignore
保存你的配置文件,然后对每个你在ntp.conf里配置的时间服务器执行2编查询命令:
# ntpdate pool.ntp.org
27 Jun 10:12:01 ntpdate[25475]: adjust time server pool.ntp.org offset -0.127154 sec
# ntpdate ntp.research.gov
27 Jun 10:12:06 ntpdate[25478]: adjust time server pool.ntp.org offset 0.010008 sec
使NTP进程自启动
为了使NTP服务可以在系统引导的时候自动启动,执行:
# chkconfig ntpd on
启动/关闭/重启NTP的命令是:
# /etc/init.d/ntpd start
# /etc/init.d/ntpd stop
# /etc/init.d/ntpd restart
默认情况下,我们配置的NTP服务器不会去时间源那里同步时间,所以必须修改/etc/ntp/step-tickers文件,加入我们的时间源,这样每次通过/etc/init.d/ntpd 来启动服务的时候就会自动更新时间了
切记每次修改了配置文件后都需要重新启动服务来使配置生效。可以使用下面的命令来检查NTP 服务是否启动,你应该可以得到一个进程ID号:
# pgrep ntpd
检查时间服务器是否正确同步
使用下面的命令检查时间服务器同步的状态:
# ntpq -p
输出:
remote refid st t when poll reach delay offset jitter
==============================================================================
-jj.cs.umb.edu gandalf.sigmaso 3 u 95 1024 377 31.681 -18.549 1.572
milo.mcs.anl.go ntp0.mcs.anl.go 2 u 818 1024 125 41.993 -15.264 1.392
-mailer1.psc.edu ntp1.usno.navy. 2 u 972 1024 377 38.206 19.589 28.028
-dr-zaius.cs.wis ben.cs.wisc.edu 2 u 502 1024 357 55.098 3.979 0.333
+taylor.cs.wisc. ben.cs.wisc.edu 2 u 454 1024 347 54.127 3.379 0.047
-ntp0.cis.strath harris.cc.strat 3 u 507 1024 377 115.274 -5.025 1.642
*clock.via.net .GPS. 1 u 426 1024 377 107.424 -3.018 2.534
ntp1.conectiv.c 0.0.0.0 16 u - 1024 0 0.000 0.000 4000.00
一个可以证明同步问题的证据是所有远程服务器的jitter值是4000并且delay和reach的值是0。
remote refid st t when poll reach delay offset jitter
==============================================================================
LOCAL(0) LOCAL(0) 10 l - 64 7 0.000 0.000 0.008
ntp-cup.externa 0.0.0.0 16 u - 64 0 0.000 0.000 4000.00
snvl-smtp1.trim 0.0.0.0 16 u - 64 0 0.000 0.000 4000.00
nist1.aol-ca.tr 0.0.0.0 16 u - 64 0 0.000 0.000 4000.00
可能的原因有:
配置文件中的restrict default ignore没有被注释
有防火墙阻断了与server之间的通讯
此外每次重启NTP服务器之后大约要3-5分钟客户端才能与server建立正常的通讯连接,否则你执行ntpdate ip的时候将返回:
27 Jun 10:20:17 ntpdate[21920]: no server suitable for synchronization found
配置Linux客户端
在linux客户端上执行ntpdate ntp_server_ip 就可以根据时间服务器统一局域网的时间了,将上面的命令放到cron里每天早上3点定期执行,crontab –e 然后输入
0 3 * * * /usr/sbin/ntpdate ntp_server_ip -
2006-04-12
Linux下面查看硬件信息的工具dmidecode的介绍
dmidecode是一个非常好的软件,它可以全面的显示你系统的信息,包括bios、cpu、内存等信息。
我用的是e.pku.edu.cn搜索到的dmidecode-2.4.tar.gz, 安装过程很简单:
[root@tony dmidecode-2.4]#mv dmidecode-2.4.tar.gz /usr/local/
[root@tony dmidecode-2.4]#tar -xzvf dmidecode-2.4.tar.gz
[root@tony dmidecode-2.4]# make install
install -m 755 dmidecode /usr/local/sbin
install -m 755 biosdecode /usr/local/sbin
install -m 755 ownership /usr/local/sbin
install -m 755 vpddecode /usr/local/sbin
install -m 644 man/dmidecode.8 /usr/local/man/man8
install -m 644 man/biosdecode.8/usr/local/man/man8
install -m 644 man/ownership.8 /usr/local/man/man8
install -m 644 man/vpddecode.8 /usr/local/man/man8 就完成了。
可以看到上面有四个可执行文件分别是:dmidecode、biosdecode、ownership、v pddecode。我们最常用的是前两个命令。用dmidecode可以显示非常详细的硬件信息。
另外,还有些小技巧。比如,显示有几条内存:
dmidecode |grep -A16 "Memory Device$"
显示CPU的详细信息: dmidecode |grep -A42 "Processor"|more
注:-A42表示显示一下的行数,你可以根据自己的情况修改。查看,主板的序列号
dmidecode |grep 'Serial Number'dmidecode | grep 'Serial Number' | awk '{print $3}' | tail -1
-------------------------------------------------------------------------
$ dmesg 命令不是很简介方便吗?
robinswan 评论于:2006-03-28 22:47:33 (219.136.73.★) -
2006-03-27
解決 Linux ip_conntrack: table full 的方法
原本 Linux NAT 用得好好的, 沒想到幾天前卻出現了無法上網的情況, 而系統記錄也出現了這樣的訊息:
ip_conntrack: table full, dropping packet.
後來才知道, Linux NAT 的 ip_conntrack 模組會記錄 tcp 通訊協定的 established connection 記錄, 而且預設 timeout 時間長達五天 (432,000 秒), 因此只要 LAN 中有人使用 P2P 軟體 (如: eDonkey、BT...) 就容易發生這種問題.
解決方法 (1): 加大 ip_conntrack_max 值
查出原本的 ip_conntrack_max 值:
指令: cat /proc/sys/net/ipv4/ip_conntrack_max寫入理想的數值 (每一個 ip_conntrack buffer 會佔用 292 Bytes)
指令: echo "數值" > /proc/sys/net/ipv4/ip_conntrack_max
例如: echo "81920" > /proc/sys/net/ipv4/ip_conntrack_max
這個效果是暫時的, 如果要每次開機都使用新的數值, 需將上述指令寫入 /etc/rc.d/rc.local
或是在 /etc/sysctl.conf 加入: net.ipv4.ip_conntrack_max = 數值
或使用指令: sysctl -w net.ipv4.ip_conntrack_max=數值解決方法 (2): 降低 ip_conntrack timeout 時間
重設 ip_conntrack_tcp_timeout_established (原值: 432000, 單位: 秒)
指令: echo "數值" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
例如: echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established開機自動設置的作法同方法(1).
其他相關指令:
查看目前 ip_conntrack buffer 使用狀況
指令: grep conn /proc/slabinfo結果實例: ip_conntrack 3024 4090 384 409 409 1 (各值說明如下)
ip_conntrack the cache name 3024 the number of currently active objects 4090 the total number of available objects 384 the size of each object in bytes 409 the number of pages with at least one active object 409 the total number of allocated pages 1 the number of pages per slab are given man slabinfo 可查詢詳細說明.
查出目前 ip_conntrack 記錄最多的前五名 IP
指令: cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 5結果實例:
2816 192.168.1.100 14 163.30.85.129 6 220.132.142.175 6 127.0.0.1 4 218.187.5.223 由此可知, 192.168.1.100 佔用了絕大多數的 buffer, 推斷這個 IP 的 User 可能使用了 P2P 軟體.
-
2006-03-21
用SrvRepor远程监控Linux服务器
系统管理员不在机房时,如何继续对Linux服务器进行监控和管理,如何全面了解Linux服务器的运行状态,是系统管理员需要面对的问题。实现对Linux服务器远程管理和监控的方法很多,这里主要介绍使用SrvReport这款Linux专用远程监控软件,对Linux服务器进行远程监控管理。
SrvReport配置方法
SrvReport是一款功能强大的Linux服务器远程监控软件。它能够根据Linux系统管理员的设定,定期把Linux服务器运行状况的各种参数通过电子邮件的方式发送到指定的电子信箱中。SrvReport所发送的记录Linux服务器运行状况信息的邮件,不只是简单地采用了HTML或TXT格式。邮件中的HTML文件里采用了柱型条、高亮度对比文字、表格和详细列表记录的方式,对Linux服务器运行状况的各项参数进行了分类记录。使得Linux系统管理员通过阅读HTML邮件,很容易就能对Linux服务器的情况有一个很全面的了解。
SrvReport这款开发源码软件的安装和配置相当简单。用户可以从http://sourceforge.net/project/showfiles.php?group_id=98398下载到最新版本的SrvRepor压缩包。通过以下命令解压SrvRepor压缩包:
# tar xzfv srvreport-x.xx.tgz
进入SrvReport/bin目录,将srvreport.pl文件加入到Linux系统中的crontab,以便让SrvReport定期运行。在编辑bin/srvreport.conf.文件时,在“mailAddr:”中填写用户指定接收SrvRepor所产生报告的电子邮件地址。
在编辑bin/srvreport.conf文件时,除了要填写指定接受报告的电子邮件信箱之外,还需要根据实际情况,修改bin/srvreport.conf文件中诸如HTML报告存储地址、报告图片存储地址和报告所需要记录的信息项目等几个模块参数。
参考配置
为了方便配置SrvReport,用户可以从其软件压缩包的/DOC目录中查看一份名为EXAMPLE.HTML的完整的srvreport.conf文件的配置清单。以下就是笔者按照“EXAMPLE.HTML”所配置的一份srvreport.conf配置清单,以粗体显示的变量可以根据Linux服务器和网络的实际情况进行修改。## Configuration File for SrvReport # Receiver of the mail-report(接收srvreport报告的电子邮件地址) MailReport = webmaster@myschool.org # 20041116130854.htm for saving the html-report(保存HTML报告的文件名) # may contain %%YYYY, %MM, %DD, which will be replaced with # the apropriate values (%YYYY, %MM, %DD分别表示年、月、日。一般由srvreport自动生成) FileReport = ../web/html/%%YYYY-%%MM-%%DD.html # path where the images are located(图片文件所保存的路径) FileReportImgPath = ../../images/ # If you want an up-to-date file, then you should set this to 1 (如果你需要最新的文件报告,可以将FileReportCreateAlways和ReportWithTime的值设置为1) FileReportCreateAlways = 1 ReportWithTime = 1 # This defines the order of the report (定义srvreport所要监控的Linux服务器所提供的服务) order = Traffic CPUUsage WebServer FTPServer FTPLogs Postfix Warnings LastLogins ChkRootKit
除了修改电子邮件地址和以加粗显示的几项参数之外,配置清单中大多数默认参数都是不需要修改的。当然,假设用户的Linux服务器中没有提供FTP服务,那么删除配置清单的[FTPServer]这个模块即可。 -
2006-02-05
scp和rsync的使用
近段时间工作需要做了些scp和rsync的异地安全备份,整理了一下,希望多大家有用。
scp的备份指南:
需求:用scp自动完成异地文件的定时copy
难点:如何让异地主机建立安全的信任关系
1、在A机器上用root运行ssh-keygen,将生成/root/.ssh/identity和/root/.ssh/identity.pub两个文件;
2、在A机器上运行scp /root/.ssh/identity.pub test@192.168.1.10:/upload/.ssh/authorized_keys(假设B机器的IP地址为192.168.1.10,B机器上开了用户test,要上传到的目录是/upload,需输入密码)。目的是将本地的identity.pub放到远程机器上并改名为authorized_keys,这样就建立了新任主机,以后就不需要每次ssh都需要输入密码了;
3、通过crontab建立脚本,例:30 02 * * 1-5 scp /home/data/* test@192.168.1.10:/upload。
(每天2:30am自动将/home/data下面的所有文件以test用户名传到远程主机192.168.1.10的/upload目录中);
认证原理:
如果你希望从A作为用户user1 SSH 到B 作为用户user2, 若要用RSA键对法认证且不需要密码,则B上的ssh 后台程序拿出~user2/.ssh/authorized_keys中的与A有关的RSA公钥来对A上的以user1身份运行的ssh客户程序进行挑战,前面我们已经把A上的identity.pub拷贝到B上作为authorized_keys了。则A保持私钥identity,而B上的sshd又拿出A的公钥来挑战,因此成功,你可以加很多行到authorized_keys以允许其它服务器的公钥可以加进来。
scp特点:
使用ssl加密,安全性高。
rsync的备份指南:
需求:用rsync完成异地文件的同步
难点:如何建立异地信任关系
1、在A主机上(rsync服务器)上编译安装rsync,需要版本在2.4.3以上(http://rsync.samba.org),在/etc目录下建立rsyncd.conf文件,内容如下:
uid = nobody
gid = nobody
use chroot = no # 不使用chroot
max connections = 4 # 最大连接数为4
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock # 日志记录文件
[test] # 这里是认证的模块名,在客户端需要指定
path = /home/test # 需要同步的目录
comment = test folder
uid = root
ignore errors # 可以忽略一些无关的IO错误
read only = yes # 只读
list = no # 不允许列文件
auth users = rsynctest # 认证的用户名,如果没有这行,则表明是匿名
secrets file = /etc/test.scrt # 认证用户密码文件
2、在/etc下建立test.scrt文件,输入:
用户名:密码
例:rsynctest:testrsync
将文件属性修改为600(千万注意)
3、启动rsync服务:rsync --daemon (rsync运行在tcp 873端口,可以通过netstat -an|grep LISTEN察看)。
4、在B主机上(rsync客户机)上建立/etc/test文件,内容为A主机的密码,例:
testsync
5、用crontab建立脚本,例:0 21 * * 1-5 rsync -vzrtp --progress --delete --password-file=/etc/test rsynctest@192.168.1.10::test /home/rsynctest
rsync中的参数:v是verbose,z是压缩,r是recursive,tp都是保持文件原有属性如属主、时间
的参数。--progress是指显示出详细的进度情况,--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。--password-file=/etc/test来指定密码文件,这样就可以在脚本中使
用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读(600)。
rsynctest@192.168.1.10中,rsynctest是指定密码文件中的用户名,192.168.1.10是A主机的IP地址::test是指模块名[test],也就是在/etc/rsyncd.conf中自定义的名称。最后的/home/rsynctest是备份到本地的目录名。
(也可以用-e ssh的参数建立起加密的连接,然后和scp中信任主机的办法一样如法炮制)
(在上面实例中的rsynctest并不是真实的用户,可以根据自己需要文本定义,这也是使用rsync的一大好处)
rsync的特点:
特性如下:
1、可以镜像保存整个目录树和文件系统。
2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。
3、无须特殊权限即可安装。
4、优化的流程,文件传输效率高。
5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
6、支持匿名传输。
rsync的功能还很强大,深入的眼就可以到官方网站上了解。
-
2006-01-18
linux笔记
这些是我在学习linux时间里记在笔记本上的东西,希望对大家有用!
[b:935c86ad7b]1[/b:935c86ad7b].更改telnet登录慢的问题:
cd /etc
vi resolv.conf
将里面内容清空
[b:935c86ad7b]2[/b:935c86ad7b].更改root用户不能直接远程登录问题:
cd /etc
cd pam.d
vi login
注释掉这行
#auth required pam_securetty.so //该行注释掉
[b:935c86ad7b]3.[/b:935c86ad7b]挂接USB移动硬盘
将移动硬盘挂上.
#df 查看Linux下硬盘盘符
mount /dev/sda1 /mnt/usb (举例)
[b:935c86ad7b]4.[/b:935c86ad7b]Linux时区同步问题(安装ntp软件过程)
首先在http://www.meinberg.de/english/sw/index.htm
下载了一个windows的NTP服务程序:ntp4171.zip
windows 192.168.1.32
1.安装是提示设置服务器地址,我设置的本机widows机器的IP
2.ntpd的控制在:
控制面板->管理工具->组件服务-NetworkTimeProtocol
3.可以启动ntpd守护进程保持时间同步
4.在C:\WINNT目录下有个ntp的配置文件ntp.conf
设置为:
server 127.127.1.0 prefer
fudge 127.127.1.0 stratum 10
5.确定ntp是否工作: ntpq -p
linux和Windows同步,我用的是RedHat 9.0
执行命令:ntpdate 192.168.1.32
你就会发现你的时间变化了,和192.168.1.32的时间一样
如果执行命令出现一下错误
1.提示:7 Dec 19:24:55 ntpdate[2120]: the NTP socket is in use, exiting
这个是你linux机器上已经存在这个进程,输入:ps -ef | grep ntpd
Kill掉ntp的进程
2.提示:No Server suitable for synchronization found
这个是最容易出现的问题,比较常见的是配置好服务器并启动服务器进程后,马上
启动客户进程,那么客户进程就会报错。解决方法是,在大约3-5分钟以后启动进程就行
我想每10分钟就和Windows服务同步时间
1.创建自己的一个crontab文件,随便建立一个文件date.cron,首先可以使用任何文本
编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的时间。
vi date.cron加入下面要运行的命令和要定期执行的时间
*/10 * * * * /usr/sbin/ntpdate 192.168.1.32
然后存盘退出
2.使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入:
crontab date.cron
这个文件已经建立好了
3.使用命令:
crontab -l (查看安排的作业序列)可以看到刚才的作业
如:
[root@NXD-TEST root]# crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (date.cron installed on Tue Dec 7 18:22:42 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
*/10 * * * * /usr/sbin/ntpdate 192.168.1.32
现在就OK了,每10分钟Linux就和服务端同步一次。
[b:935c86ad7b]5.[/b:935c86ad7b]更改Linux启动时用图形界面还是字符界面
cd /etc
vi inittab
将id:5:initdefault: 其中5表示默认图形界面
改id:3: initdefault: 3表示字符界面
[b:935c86ad7b]6.[/b:935c86ad7b]重新启动xinetd)
/etc/init.d/xinetd restart
[b:935c86ad7b]7.[/b:935c86ad7b]重启smb服务
/etc/init.d/smb restart
[b:935c86ad7b]8.[/b:935c86ad7b]配置smb可以被哪些IP所用.
cd /etc/samba
Vi smb.conf
找到hosts allow = 192.168.1. 192.168.2. 127.
修改其为哪些机器所用,注意IP之间用逗号分开
举例:
hosts allow =192.168.1.110,192.168.1.120
[b:935c86ad7b]9.[/b:935c86ad7b]禁止在后台使用CTRL-ALT-DELETE重起机器
cd /etc/inittab
vi inittab 在文件找到下面一行
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now (注释掉这一行)
如: # Trap CTRL-ALT-DELETE
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
[b:935c86ad7b]10.[/b:935c86ad7b]修改主机名
vi /etc/sysconfig/network
修改HOSTNAME一行为HOSTNAME=主机名
[b:935c86ad7b]11[/b:935c86ad7b].重新启动FTP服务
/sbin/service vsftpd restart
[b:935c86ad7b]12.[/b:935c86ad7b]查看开机检测的硬件
dmesg | more
[b:935c86ad7b]13.[/b:935c86ad7b]查看硬盘使用情况
df –m
[b:935c86ad7b]14.[/b:935c86ad7b]查看目录的大小
du –sh dirname
[b:935c86ad7b]15.[/b:935c86ad7b]解压小全
tar xvfj lichuanhua.tar.bz2
tar xvfz lichuanhua.tar.gz
tar xvfz lichuanhua.tgz
tar xvf lichuanhua.tar
unzip lichuanhua.zip
.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
---------------------------------------------
.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
---------------------------------------------
.bz
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz
解压:tar jxvf FileName.tar.bz
压缩:未知
---------------------------------------------
.Z
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
---------------------------------------------
.tgz
解压:tar zxvf FileName.tgz
压缩:未知
.tar.tgz
解压:tar zxvf FileName.tar.tgz
压缩:tar zcvf FileName.tar.tgz FileName
---------------------------------------------
.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
---------------------------------------------
.rar
解压:rar a FileName.rar
压缩:rar e FileName.rar
rar请到:http://www.rarsoft.com/download.htm 下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar
---------------------------------------------
.lha
解压:lha -e FileName.lha
压缩:lha -a FileName.lha FileName
lha请到:http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下载!
解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp lha /usr/bin/
---------------------------------------------
.tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
解压:sEx x FileName.*
压缩:sEx a FileName.* FileName
[b:935c86ad7b]16.[/b:935c86ad7b]显示内存使用情况
free –m
[b]17.忘记了root密码
一. lilo
1. 在出现lilo菜单的时候按“ctrl+x”或者“Tab",然后输入:linux single
或者用光盘
在出现 lilo: 提示时键入 linux single
画面显示 lilo: linux single
2. 回车可直接进入linux命令行
3. #vi /etc/shadow
将第一行,即以root开头的一行中root:后和下一个:前的内容删除,
第一行将类似于
root::......
保存
4. #reboot重启,root密码为空
二.grub
1.出现grub画面时,用上下键选启动Linux的哪一项,按e键
2.上下键选择 kernel /boot/……… 然后按e键
3.修改现在见到的命令好,加入single 结果:
kernel /boot/vmlinuz-2.4.20-8 single ro root=LABEL=
4.回车返回,按b键启动,直接进入linux命令行
直接执行: passwd root
修改密码,你的密码就搞定
5.也可以修改/etc/shadow中
将第一行,即以root开头的一行中root:后和下一个:前的内容删除,
第一行将类似于
root::......
保存
reboot重启,root密码为空
18.显示系统运行了多长时间
uptime
19.重新启动网络
/etc/init.d/network restart
20.显示开机自检的内容命令
dmesg
21.查看端口
netstat –an
netstat -anp
22..端口的详细列表
/etc/services
23.查看物理信息
lspci
24.安装图形界面不能出现,使用解析进行安装
Linux lowres (使用的是640X480分辨率)
25.屏蔽主机的ping 命令,是被别人无法ping你的机器
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
26.彻底删除Oracle安装的程序,删除一下几个目录
/etc/oraInst.loc /tmp/<otherowerdFile
/etc/oratab $ORACLE_BASE/*
27.Linux启动到文字界面(不启动Xwindows界面)
vi /etc/inittab在下面一行
id:5:initdefault: 一行中的5改为3
启动Xwindows 是5
文字截面是 3
28.RPM包
1.卸载 RPM –e
2.查询 rpm –q
-a 查询所有已安装的软件包
-f 查询包含文件<file>的软件的包
-i 显示软件包信息
-l 显示软件包的文件列表
3.验证 rpm –v
rpm –Va 验证整个文件丢失了哪些文件
碰到不认识的文件使用
rpm –qf
4.一个rpm包安装到哪里去了(已经安装的包)
rpm –qi 包名(这里不包括.rpm后缀的软件名称,也就是说只能用mysql或者mysql-3.23.54a而不是mysql-3.23.54a.rpm)
5.一个rpm包中包含哪些文件
一个没有安装过的软件包:使用rpm –qip ***.rpm
一个已经安装过的软件包: 使用rpm –qi ***.rpm
29.看已经安装的字符集
locale –a
30.抓包命令tcpdump
例:抓获192.168.1.32 的主机收到和发出的所有的数据包
tcpdump host 192.168.1.32
截获特定的端口
tcpdump tcp port 21 host 192.168.1.32
31.文本截面的中文支持
RH 9.0自带安装包 zhcon_0.2.3_1.rh9.i386.rpm
安装完成后,执行: zhcon 就可以支持中文了
32.查看端口现在运行什么程序
lsof –i:8001
33.察看实时的日志
tail –f /var/log/messages
34.当mount出现死的现象
1.fuser –m /mnt/share 查出该程序的进程,然后Kill掉
2.再umount /mnt/share
35.linux 控制 windows
1.用RH9.0自己带rdesktop,版本是1.2.0
命令:rdesktop –u user –f 192.168.1.70 色默认的是8位
2要达到16色,就要下载新版本1.3.0
rdesktop –a 16 –u lichuanhua –g 800*600 192.168.1.70
36. Linux挂载Windows分区
mount ntfs分区
一.单机挂windows的NTFS分区
1. 上www.google.com搜索并下载 kernel-ntfs-2.4.18-14.i686.rpm
2. rpm -ivh kernel-ntfs-2.4.18-14.i686.rpm
3. mkdir /mnt/share
4. mount -t ntfs /dev/hda1 /mnt/share
要挂载Windows分区,首先新建一个目录/mnt/share,修改/etc/fstab,在最末尾添上(假设Windows安装在硬盘的第1个分区)
/dev/hda1 /mnt/share ntfs defaults 0 0
二.网络上一台windows和linux机器,linux机器挂载windows上的共享文件
windows IP:192.168.1.1
1.linux挂载192.168.1.1(windows)上共享文件dbf,挂在linux的/mnt/share目录下,在/mnt下建立share目录
mount -t smbfs -o username=massky,password=massky //192.168.
1.1/dbf /mnt/share
2.机器重启自动挂载,vi /etc/fstab最后加入:
//192.168.1.1/dbf /mnt/share smbfs defaults,auto,username=m
assky,password=massky 0 0
37.Oracle9i在Linux9.0上的安装
1.确保RPM开发包,使用下面命令查看是否已安装这些包
rpm -q gcc cpp compat-libstdc++ glibc-devel glibc-kernheaders binutils
2.进行解压
zcat Linux9i_Disk1.cpio.gz | cpio -idmv
zcat Linux9i_Disk2.cpio.gz | cpio -idmv
zcat Linux9i_Disk3.cpio.gz | cpio -idmv
3.设置内核参数
vi /etc/sysctl.conf,加入下面参数
kernel.shmmax=4294967295 内存512M
计算方法为:kernel:shmmax=1024*1024*RAM(M)/2
执行sysctl -p生效
4.建立数据目录和用户
groupadd dba
groupadd oinstall
useradd –g oinstall –G dba oracle
passwd oracle
mkdir /opt/oracle
mkdir /opt/oracle/product
mkdir /opt/oracle/product/9.2.0
chown –R oracle.oinstall /opt/oracle
mkdir /var/opt/oracle
chown oracle.dba /var/opt/oracle
chmod 755 /var/opt/oracle
5.vi .bash_profile 设置变量
export LD_ASSUME_KERNEL=2.4.1
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/9.2.0
export ORACLE_SID=ora9i
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
export PATH=$PATH:$ORACLE_HOME/bin
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH
38.网卡的激活与停止
超级用户;
ifconfig eth0 down 停止
ifconfig eth0 up 启动
40.Linux下cvs的安装配置
1.安装CVS软件包.
2.groupadd cvs
3.useradd -g cvs cvsroot
4.chmod 777 -R /home/cvsroot
5.cd /etc
6.vi profile
新增以下二行:
CVSROOT=/home/cvsroot export CVSROOT
CVSEDIT=vi export CVSEDIT
7.查看/etc/services文件中cvspserver 所在行的注释状态(有则把注释去掉)
8.进入 /etc /xinetd.d, vi cvspserver该文件不存在,内容如下:
service cvspserver
{
disable = no
socket_type =stream
wait =no
user =root
env =HOME=
server =/usr/bin/cvs
server_args =--allow-root=/home/cvsroot pserver
log_on_failure +=USERID
}
9.vi /etc/xinetd.conf 内容如下,每次开机自动启动服务:
service cvspserver
{
port = 2401
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/home/cvsroot pserver
bind = 168.168.1.110
}
重新登录 换cvsroot用户
10./etc/init.d/xinetd restart
11.cvs init(初始化:CVS版本库的初始化)
12.cvs -d :pserver:cvsroot@192.168.1.110:/home/cvsroot login(用户登录)没有任何提示信息就成功。
13.首先要导入库,假设项目名称为LinuxISQuote.
步骤:
1、进入LinuxISQuote.
2、一个项目的首次导入
cvs import LinuxISQuote lch V_0_0_1
此时到$CVSROOT目录下,可以看到多了一个LinuxISQuote的目录。
41.命令绝对路径
.如果不是绝对路径的话,你可以这样输入
(1)[root@RedHat linux]# whereis adduser
adduser: /usr/sbin/adduser /usr/share/man/man8/adduser.8.gz
你这样输入就可以了 /usr/sbin/adduser xxx
(2) 或者改vi /etc/profile,加入一句:PATH=$PATH:/usr/sbin:. export PATH,
就可以直接输入adduser
42.修改用户的权限
.改用户权限的话,你可以改vi /etc/passwd
如:我想lll变成和root用户一样,就改: lll:x:508:508::/home/lll:/bin/bash
改后面的 508 为和root后面的数据一样的就可以了!
改为:lll:x:508:0::/home/lll:/bin/bash
lll就拥有root的权限了。
43.修改grub启动时的背景图片
1 将一图片转化成640*480,14色的XPM文件:
#convert abc.jpg -colors 14 -geometry 640x480! abc.xpm
2 压缩生成的xpm文件,使用gzip
#gzip -9 abc.xpm
3 将abc.xpm.gz拷到/boot/grub下
4 修改/boot/grub/menu.lst
splashimage=(hd0,0)/boot/grub/abc.xpm.gz
44.VNC for Linux的安装
1.第一步在linux上安装VNCserver
tar zxvf vnc-X.tgz
cd X
cp *vnc* /usr/local/bin/
没有vnc 目录,就建vnc目录
mkdir /usr/local/vnc
cp -r classes/ /usr/local/vnc/
2.设置vnc server的访问密码
vncpasswd
3.linux版vnc server的改进.首先执行vncserver
修改/root/.vnc/xstartup里的 twm $ 为gnome-session &
4.启动vnc server
vncserver
注意New 'X' desktop is KILl:3 记住3是客户端要用到的端口
5.客户端启动vncviewer,输入:如192.168.1.110:3
OK,你就看到了。。哈。。
如果在Windows客户机中安装了IE或NETSCAPE,还可以启动IE或netscape
然后在地址栏输入(如果是1的话)
http://192.168.1.64:5801
45. 改变或关闭Oracle XDB的ftp和http端口
Oracle 9i开始,创建数据库时默认包含了XDB特性。一旦启动了数据库和Listener,Oracle XDB的http服务就占用8080端口,刚好和JBoss、Tomcat等默认端口冲突。因此,必须有一个做出更改。改Tomcat等容易,只是一时不知道怎么改XDB的配置。
在Google上搜索一下,找到了答案。原来Oracle XDB的端口设置不在配置文件中,而是在数据库里。修改XDB的http和ftp服务端口的方法有3种:
1。使用sys登录Oracle,利用dbms_xdb修改端口设置
SQL> -- Change the HTTP/WEBDAV port from 8080 to 8081
SQL> call dbms_xdb.cfg_update(updateXML(
2 dbms_xdb.cfg_get()
3 , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'
4 , 8081))
5 /
Call completed.
SQL> -- Change the FTP port from 2100 to 2111
SQL> call dbms_xdb.cfg_update(updateXML(
2 dbms_xdb.cfg_get()
3 , '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()'
4 , 2111))
5 /
Call completed.
SQL> COMMIT;
Commit complete.
SQL> EXEC dbms_xdb.cfg_refresh;
PL/SQL procedure successfully completed.
2。使用OEM console,选择数据库,XML Database,Configuration。更改XDB的有关设置。
3。去掉数据库的初始化参数: dispatchers='(PROTOCOL=TCP) (SERVICE=XDB)',将会禁止XDB的http和ftp服务。
46.XML for linux的安装
我下载了两个文件:libxml2-2.6.13.tar.gz和xml4c5_4_0-redhat_80-gcc_32.tar.gz
加入环境:
export XERCESCROOT=/home/lch/xml
export PATH=$PATH:/home/lch/xml/bin
export XERCESC_NLS_HOME=$XERCESCROOT/msg
export LD_LIBRARY_PATH=$XERCESCROOT/lib:$LD_LIBRARY_PATH (on Solaris, Linux)
进入xml4c5_4_0-redhat_80-gcc_32.tar.gz解压后的目录
runConfigure -plinux -cgcc -xg++ -rpthread
./configure
gmake
47.ace for linux的安装
由于安装说明文件“ACE-INSTALL.html”中提及的linux安装过程极少,其主要针对Unix、Windows,手动配置较多,加上本人安装后感觉“ACE-INSTALL.html”文件有些影响视听,因为主要的动作都可以由ACE包中的安装脚本ACE-install.sh自动完成,我们主要的工作就可以直接对这个安装脚本来处理即可。
1、安装环境:
lRedHat 9.0
ACE安装包ACE+TAO+CIAO.tar.gz,
http://deuce.doc.wustl.edu/Download.html , "Latest Beta Kit",beta版既是ACE的最新版。
2、安装过程:
第一步
先设置ACE_ROOT环境,命令:
“vi /etc/profile”
在其中加入4行
ACE_ROOT=/opt/ACE
export ACE_ROOT
LD_LIBRARY_PATH=$ACE_ROOT/ace:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
我是加在“export PATH USER….”后的。完成后将/etc/profile执行一次,命令:
“chmod 555 /etc/profile”
“/etc/profile”
这样我们的ACE_ROOT就设置好了,可以用如下命令查看ACE_ROOT是否设置好了:
“echo $ACE_ROOT”
这个时候最好reboot启动一次linux。
第二步
不要自己手工将ACE+TAO+CIAO.tar.gz包完全解开,特别强调不要完全解开,后面可以看到安装脚本会给我们解开它的;如果你手工解开全部,安装脚本将会将你的解压缩目录删除的!我们要做的事就只是将ACE+TAO+CIAO.tar.gz包中的ACE-install.sh安装脚本单独解出来,并对其修改。我们只要这一个文件就可以。
用mkdir建目录,如/home/my/ACE,然后将你的ACE+TAO+CIAO.tar.gz放在此目录下(用cp命令拷贝或mv命令移动到此目录)。注意这个目录将是你的一个存放ACE+TAO+CIAO.tar.gz的目录,安装脚本会来这个目录找这个文件的,这个目录和ACE_ROOT是不一样的,且ACE-install.sh也提示不要将这两个目录设置成同一个目录。ACE_ROOT将是我们的安装目标目录。
从ACE+TAO+CIAO.tar.gz解压出单个文件ACE-install.sh:
“tar –zxvf ACE+TAO+CIAO.tar.gz ACE_wrappers/ACE-install.sh”
解好后,会出来一个新的子目录“ACE_wrappers”。此时可以先将ACE-install.sh移到外面的目录来:
“mv /ACE_wrappers/ACE-install.sh .”
“.”代表当前目录。当然ACE-install.sh在什么路径下是没什么影响的,因为我们要对ACE-install.sh的内容进行修改的,里面有很多路径要修改。 好,现在在/home/my/ACE就有了ACE-install.sh,我们现在用vi对其进行修改,修改前自己可以先备份一个。命令:
“cp ACE-install.sh ACE-install.sh.bak”
“vi ACE-install.sh”
我们可以看到缺省的,这个文件是用来在UNIX下做安装的。所以我们要将其中的有关UNIX的部分换成linux即可。
先找到“MY_ACEDIR=${HOME}/aceconfig”,将其改成“MY_ACEDIR=/home/my/ACE”,就是改成我们自己建的、放有ACE+TAO+CIAO.tar.gz文件的目录,之后去掉前面的注释“#”号。
接着在下面一点,找到“MY_ACE_CONFIG=config-sunos5.4-sunc++-4.x.h”,将其修改成“MY_ACE_CONFIG=config-linux.h”,即改成linux下的配置文件。 继续改,找到“MY_ACE_GNU_MACROS=platform_sunos5_sunc++.GNU”,将其改成“MY_ACE_GNU_MACROS=platform_linux.GNU”。这个是各种操作系统平台下的GNU宏文件设置。
好了,文件修改完毕,保存退出“:wq”。
第三步
我们的重点到了,现在就可以安装ACE了。
此时应该是在/home/my/ACE目录下,我们执行:
./ACE-install.sh
48.删除了 /etc/inittab
修复办法如下!
1.首先进去linux的rescue的模式!
2.然后使用如下的命令:
rpm -qf --root /mnt/sysimage /etc/inittab
查出该文件属于哪个RPM包!
3.然后重新安装这个rpm包!
rpm -ivh --force --root /mnt/sysimage /mnt/source/Redhat/RPMS/packagename
4.sync (将cache中的内容写入磁盘)
5.exit
49开启后台talk会话功能
开启talk功能: chkconfig talk on
交谈 : talk massky(用户)
50.不让显示器休眠
setterm –blank 0
51.定制用户登录时显示的信息
编辑 /etc/motd 加入登录时要显示的信息
52.查看路由信息
netstat –rn
route –n
54.显示硬件信息
lsdev
55. 显示当前加载的核心模块
lsmod
56.列出系统内核所有可用的模块
modprobe –l
57.根据进程名显示进程号
pidof vsftpd
58. 将内容倒序读出
rev file.name
59.定制用户登录时显示的信息
编辑/etc/motd 加入登录时要显示的信息
60.查看密码过期信息
change –l longinname
61.显示最后一个登录到系统的用户
last
62.显示最后一个登录不成功的登录尝试(lastb命令)
如果在系统上不能工作,就需要你建立一个文件:touch /var/log/btmp,然后在执行 lastb命令就可以查看到最后一个不成功的登录尝试,
63.以3秒钟执行一个ls命令
watch –n 3 ls
64.命令显示当前系统中每个用户和他运行的进程信息
w
65.Oracle安装界面出现乱码情况
使用oracle用户登录,执行命令:
export LANG=en
66.非正常关机的自动磁盘修复
/etc/sysconfig里增加一个文件autofsck.加入内容:
AUTOFSCK_DEF_CHECK=yes
PROMPT=yes
67.Oracle9i在RedHat7.1/7.2上的安装配置
1创建Oracle用户帐号和安装目录
在shell下,作为root
groupadd dba
groupadd oinstall
useradd –g oinstall –G dba oracle
passwd oracle
mkdir /opt/oracle
mkdir /opt/oracle/product
mkdir /opt/oracle/product/9.2.0
chown –R oracle.oinstall /opt/oracle
mkdir /var/opt/oracle
chown oracle.dba /var/opt/oracle
chmod 755 /var/opt/oracle
2设置环境变量
编辑/home/oracle/.bash_profile文件,添加下列行
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=/opt/oracle/product/9.2.0
export ORACLE_SID=lichuanhua
export ORACLE_TERM=xterm
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_DATE_FORMAT=YYYY-MM-DD
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export LD_LIBRARY_PATH
export PATH=$PATH:$ORACLE_HOME/bin
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH
export DISPLAY=192.168.1.88:0.0
68.编译内核的步骤
1.源码 /usr/src/linux-2.4
2. make mrproper (清除从前编译内核时残留的.o 文件和不必要的关联)
3. make menuconfig (字符界面内核配置菜单中正确设置个内核选项)
make xconfig (图形界面内核配置菜单中正确设置个内核选项)
4. make dep (设置关联文件 )
5.make bzImage (对于大内核,如需要SCSI支持的编译)
make zImage (对于小内核的编译)
6.make modules (编译模块)
7. make modules_install (安装模块 )
8.make install ((针对grub启动,自动装载到grub.conf上,直接重新启动就OK)
69.VMWare上linux图形界面的安装
如果你是使用VMware,那么你可以这样
首先在vmWare的VM->Install VMware tools选择install
在执行
1.mount /dev/cdrom /mnt/cdrom
2.cd /mnt/cdrom 有一个文件vmware-linux*.tar.gz
3.cp vmware-linux*.tar.gz /tmp
4.cd /tmp
5.tar zxvf vmware-linux*.tar.gz
6.进入解压目录 cd vmware-tools-distrib
7.进入解压后的目录运行安装命令./vmware-install.pl 就ok了
8.等待Vmware-insall运行完成后,重启Linux,我们就可以看到漂亮的Linux图形界面了
70.Oracle 字符集的问题(ora9i)
sqlplus直接进去,输入命令:
select value$ from props$ where name=' NLS_CHARACTERSET';
显示不是ZHS16GBK,就更改,默认的是:WE8ISO8859p1
更改命令:
update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';
重启生效
71. 查询一个系统最近何时被引导过
who -b
72. 查系统硬件类型
uname -m
73. 查系统的CPU类型
uname -p
74. 查系统OS版本号
uname -r
75. Qt/e的安装
我是在rh9.0下面安装的
一.安装qt-x11-free-3.3.2.tar.gz
1. 我把qt-x11-free-3.3.2.tar.gz拷贝到/usr/local/qt目录下
cd /usr/local/qt
tar zxvf qt-x11-free-3.3.2.tar.gz
mv qt-x11-free-3.3.2 qt
2. vi /etc/profile ,添加环境
export QTDIR=/usr/local/qt
export PATH=$QTDIR/bin:$PATH
export MANPATH=$QTDIR/doc/man:$MANPATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
3.检查一下环境是否存在
#echo $QTDIR
应该返回 /usr/local/qt
4.#./configure
5.# make
6.qt的启动,/usr/local/qt/bin目录下面执行
#./designer
你就可以看到qt的界面了!
如果在make时候报错:
In file included from kernel/qtaddons_x11.cpp:25:
kernel/qt_x11_p.h:66:22: X11/Xlib.h: 没有那个文件或目录
kernel/qt_x11_p.h:71:23: X11 til.h: 没有那个文件或目录
kernel/qt_x11_p.h:72:21: X11/Xos.h: 没有那个文件或目录
kernel/qt_x11_p.h:73:23: X11/Xatom.h: 没有那个文件或目录
make[2]: *** [.obj/release-shared/qtaddons_x11.o] Error 1
make[2]: Leaving directory `/usr/local/qt/src'
make[1]: *** [sub-src] Error 2
make[1]: Leaving directory `/usr/local/qt'
make: *** [init] Error 2
这个问题我搞了半天,最后才知道
这个错是因为没有安装X11的开发包,在添加和删除里面添加上X11开发包
二.安装qt-embedded-free-3.3.2.tar.gz
1.解压qt-embedded-free-3.3.2.tar.gz
我放在/root/qt下面
#tar zxvf qt-embedded-free-3.3.2.tar.gz
#cd qt-embedded-free-3.3.2
#export QTDIR=/root/qt/qt-embedded-free-3.3.2
#export LD_LIBRARY_PATH=/root/qt/qt-embedded-free-3.3.2/lib:$LD_LIBRARY_PATH
#./configure
# make
然后就是一个漫长的过程
76. 修改ping 的TTL值(rh9)
修改文件 /proc/sys/net/ipv4/ip_default_ttl的值(默认为64)
如:我把ttl修改为128
# echo 128 > /proc/sys/net/ipv4/ip_default_ttl
77..使用多达23个的虚拟控制台
假设现在有6个,仿照/etc/inittab种的文件,加入
8:2345:respawn:/sbin/mingetty tty8
10:2345:respawn:/sbin/mingetty tty10
24:2345:respawn:/sbin/mingetty tty24
要跳过VT7,因为X使用这个终端。然后telinit q以重新加载配置文件。使用左Alt+Fn在1-6和8-12件切换,使用右Alt+Fn键在13-24之间切换
78.Xmanager2的配置
不使用图形界面也可以使用Xmanager2登陆进行图形控制
#vi /etc/X11/xdm/xdm-config
在最后一行: DisplayManager.requestPort: 0 前面加!号注释掉此行。
#vi /etc/X11/xdm/Xservers
在最后一行::0 local /usr/X11R6/bin/X 前面加#号注释掉这一行。
#vi /etc/X11/xdm/Xaccess
找到#* #any host can get a login window
把这一行前面的#号去掉,变成:
* #any host can get a login window
最后运行#xdm。这样使用xmanager等工具就可以连接Linux了!
如果使用ssh从windows远程登录到linux
的 ssh 必须开了 X forwarding 的选项。
1.vi /etc/ssh/sshd_config 里 X11Forwarding 要为 yes
2.vi /etc/ssh/ssh_config 也是的 ForwardX11 yes
79 更改控制台的分辨率(grub)
vi /boot/grub/grub.conf
在kernel /vmlinuz-2.4.20-8smp ro root=LABEL=/ 一行后面添加参数vga=792成为
kernel /vmlinuz-2.4.20-8smp ro root=LABEL=/ vga=792
最后的vga=792表示1024x768,16色
具体参数为:
depth 640x480 800x600 1024x768 1280x1024
8bit 769 771 773 775
15bit 784 787 790 793
16bit 785 788 791 794
24bit 786 789 792 795 -
2006-01-18
用OpenVPN构建安全VPN
一直想写一片关于VPN配置方面的文章,由于时间等等很多问题,一直没有落实,现在终于和大家见面了,由于本人知识有限也并非专业从事这方面工作的,难免有错误,望指正,共同提高。
自从认识VPN以来,一直在找寻一个容易配置、功能强大、支持多系统的VPN程序,由于一直没有找到合适的软件,Linux下的FreeSWAN、OpenBSD FreeBSD下的IPSec、Windows下的PPTP都试了试,始终不能满足自己的要求,直到OpenVPN的出现。
关于各种VPN软件或者硬件的优缺点,在这里我就不再叙述了,因为这个掺杂着很多人为的因素在里边(萝卜好吃还是青菜好吃?),一个软件:稳定、符合自己的要求、自己用的习惯就是一个好软件。
对于OpenVPN,在CU的VPN版面也有过很多的讨论,其中也不乏精华的文章,但是都是使用Static key验证的,从字面上就可以看出来Static key使用的就是预先生成的key对数据进行加密和解密,也就是常说的对称试加密,加密和解密双方必须预先知道加密的Key。本文讨论的是基于TLS加密方式,使用CA验证VPN Client的身份,OpenVPN使用TLS加密是通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Public key,另一个是Private key)对数据进行加密的,对于TLS传输的工作原理,大家可以去Google一下,资料一大堆。对于OpenVPN使用TLS mode,首先Server和Client要有相同CA签发的证书,双方通过交换证书验证双方的合法性以决定是否建立VPN连接,然后使用对方CA把自己目前使用的数据加密方法(类似于密钥)加密后发送给对方,由于使用对方CA加密的,所以只有对方CA对应的Private key才能解密该字串,保证了此密钥的安全性,并且此密钥定期改变,对于窃听者来说,可能还没有破解出密钥,通信双方已经更换密钥了。
我个人对OpenVPN的感觉(或者说是我使用OpenVPN的理由),NAT穿透力特强,支持HTTP代理,对动态地址支持很好,可配置性强,配置安全,开源便于二次开发...其他没有想好:)。
关于OpenVPN的相关内容可以在http://openvpn.net上找到。
下面开始正式讨论OpenVPN的安装和配置方法,本文是在Fedora Core 2环境下配置的,由于机器在网络中不是在网关的位置,所以使用NAT方式来访问内网,否则还涉及到配置网络设备的路由。假设我的VPN Server有2块网卡,eth0对外,IP:61.1.1.2 eth1对内,IP:192.168.1.2,内网地址:192.168.0.0/16
本文除配置文件中行首的"#"是注释外,其他行首的"#"都是提示符,如果在非配置文件一行中第二次出现"#"说明后面的是注释,书写命令时可以省略。
获取并安装Openvpn:
首先检查系统是否安装lzo实时压缩工具
$rpm -qa | grep lzo
如果没有安装可以在http://www.oberhumer.com/opensource/lzo/找到并安装,安装方法详见压缩包中的INSTALL文件,当然也可以用rpm包安装,记住一定要安装lzo-devel开头的那个包,因为OpenVPN需要使用lzo的头文件。
$wget http://mesh.dl.sourceforge.net/sourceforge/openvpn/openvpn-2.0_rc16.tar.gz
$tar -zxvf openvpn-2.0_rc16.tar.gz
$cd openvpn-2.0_rc16
$./configure
$make
$su
#make install
按照INSTALL文件中的说明,做如下操作:
#mknod /dev/net/tun c 10 200 #创建一个tun设备
#echo "alias char-major-10-200 tun" >;>; /etc/modprobe.conf
#echo 1 >; /proc/sys/net/ipv4/ip_forward #打开系统的转发功能
接下来就生成服务器客户端需要使用的keys了,为了方便,我们使用OpenVPN包自带的脚本生成。
#mkdir /etc/openvpn
#cp -r easy-rsa /etc/openvpn #切换到OpenVPN源代码目录执行
修改vars 文件
-------------CUT Here-------------
# easy-rsa parameter settings
# NOTE: If you installed from an RPM,
# don't edit this file in place in
# /usr/share/openvpn/easy-rsa --
# instead, you should copy the whole
# easy-rsa directory to another location
# (such as /etc/openvpn) so that your
# edits will not be wiped out by a future
# OpenVPN package upgrade.
# This variable should point to
# the top level of the easy-rsa
# tree.
export D=`pwd`
# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
export KEY_CONFIG=$D/openssl.cnf
# Edit this variable to point to
# your soon-to-be-created key
# directory.
#
# WARNING: clean-all will do
# a rm -rf on this directory
# so make sure you define
# it correctly!
export KEY_DIR=$D/keys
# Issue rm -rf warning
echo NOTE: when you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
# Increase this to 2048 if you
# are paranoid. This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=1024
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
# 定义你所在的国家,2个字符
export KEY_COUNTRY=CN
# 你所在的省份
export KEY_PROVINCE=Liaoning
# 你所在的城市
export KEY_CITY=Shenyang
# 你所在的组织
export KEY_ORG="ELM OpenVPN ORG"
# 你的单位
export KEY_OU="OpenVPN Service"
# 你的邮件地址
export KEY_EMAIL="elm@elm.freetcp.com"
-------------CUT Here-----------------
修改后保存,下面我们开始什成keys,以下为shell命令 "#" 为提示符
#. vars #使修改的变量生效
NOTE: when you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
#./clean-all #初始化keys目录,创建所需要的文件和目录
#./build-ca #什成Root CA证书,用于签发Server和Client证书,请保护好keys/ca.key文件。
Generating a 1024 bit RSA private key
........................++++++
.............++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]: #如果无需修改,直接回车
State or Province Name (full name) [Liaoning]:
Locality Name (eg, city) [Shenyang]:
Organization Name (eg, company) [ELM OpenVPN ORG]:
Organizational Unit Name (eg, section) [OpenVPN Service]:
Common Name (eg, your name or your server's hostname) []:OpenVPN Root CA
Email Address [elm@elm.freetcp.com]:
# ls keys
ca.crt ca.key index.txt serial
我们可以看到ca.crt ca.key文件已经什成了。
下面我们为服务器生成 Diffie-Hellman 文件
# ./build-dh #TLS server 需要使用的一个文件
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
..+..............................................................+....................................................................+....+........+.........+....................................................+.+..................................................................................................................................................................+.......................................+.................................+.............+.................................................................................+.......................................................+.............................++*++*++*
创建并签发VPN Server使用的CA
# ./build-key-server server # server 为创建后的文件名,分别为server.crt server.key
Generating a 1024 bit RSA private key
......................++++++
...............++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Liaoning]:
Locality Name (eg, city) [Shenyang]:
Organization Name (eg, company) [ELM OpenVPN ORG]:
Organizational Unit Name (eg, section) [OpenVPN Service]:
Common Name (eg, your name or your server's hostname) []:Server No.1
Email Address [elm@elm.freetcp.com]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName
RINTABLE:'CN'
stateOrProvinceName
RINTABLE:'Liaoning'
localityName
RINTABLE:'Shenyang'
organizationName
RINTABLE:'ELM OpenVPN ORG'
organizationalUnitName
RINTABLE:'OpenVPN Service'
commonName
RINTABLE:'Server No.1'
emailAddress :IA5STRING:'elm@elm.freetcp.com'
Certificate is to be certified until Feb 26 14:43:44 2015 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
接下来为VPN Client颁发CA证书,如果以后要为其他Client颁发证书,直接使用build-key命令签发新证书。
# ./build-key elm
Generating a 1024 bit RSA private key
........++++++
....................++++++
writing new private key to 'elm.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Liaoning]:
Locality Name (eg, city) [Shenyang]:
Organization Name (eg, company) [ELM OpenVPN ORG]:
Organizational Unit Name (eg, section) [OpenVPN Service]:
Common Name (eg, your name or your server's hostname) []:ELM #注意Common Name最好不要相同,如果相同[server要加duplicate-cn选项],那么Email地址也不能相同
Email Address [elm@elm.freetcp.com]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName
RINTABLE:'CN'
stateOrProvinceName
RINTABLE:'Liaoning'
localityName
RINTABLE:'Shenyang'
organizationName
RINTABLE:'ELM OpenVPN ORG'
organizationalUnitName:PRINTABLE:'OpenVPN Service'
commonName :PRINTABLE:'ELM'
emailAddress :IA5STRING:'elm@elm.freetcp.com'
Certificate is to be certified until Feb 26 14:45:36 2015 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
为防止恶意攻击(如DOS、UDP port flooding),我们生成一个"HMAC firewall"
#openvpn --genkey --secret keys/ta.key
生成证书吊销链文件,防止日后有人丢失证书,被非法用户接入VPN
#./make-crl vpncrl.pem
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
到现在为止,一切准备就绪,下面开始写配置文件,为了缩小篇幅,把原有注释都去掉了。
Server使用的配置文件server.conf
----------------CUT Here-------------
#申明本机使用的IP地址,也可以不说明
;local a.b.c.d
#申明使用的端口,默认1194
port 1194
#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议
;proto tcp
proto udp
#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。
#tun是ip层的点对点协议,限制稍微多一些,本人习惯使用TAP设备
dev tap
;dev tun
#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法
ca ca.crt
#Server使用的证书文件
cert server.crt
#Server使用的证书对应的key,注意文件的权限,防止被盗
key server.key # This file should be kept secret
#CRL文件的申明,被吊销的证书链,这些证书将无法登录
crl-verify vpncrl.pem
#上面提到的生成的Diffie-Hellman文件
dh dh1024.pem
#这是一条命令的合集,如果你是OpenVPN的老用户,就知道这条命令的来由
#这条命令等效于:
# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入
# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client
#
# if dev tun: #如果使用tun设备,等效于以下配置
# ifconfig 10.8.0.1 10.8.0.2 #设置本地tun设备的地址
# ifconfig-pool 10.8.0.4 10.8.0.251 #说明OpenVPN使用的地址池(用于分配给客户),分别是起始地址、结束地址
# route 10.8.0.0 255.255.255.0 #增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是: 10.8.0.2
# if client-to-client: #如果使用client-to-client这个选项
# push "route 10.8.0.0 255.255.255.0" #把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址: 10.8.0.1
# else
# push "route 10.8.0.1" #否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为: 255.255.255.255 10.8.0.1
#
# if dev tap: #如果使用tap设备,则等效于以下命令
# ifconfig 10.8.0.1 255.255.255.0 #配置tap设备的地址
# ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0 #客户端使用的地址池,分别是起始地址、结束地址、子网掩码
# push "route-gateway 10.8.0.1" #把环境变量route-gateway传递给客户机
#
server 10.8.0.0 255.255.255.0 #等效于以上命令
#用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,
#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址
ifconfig-pool-persist ipp.txt
#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除
;route 10.9.0.0 255.255.255.252
#Run script or shell command cmd to validate client
#virtual addresses or routes. 具体查看manual
;learn-address ./script
#其他的一些需要PUSH给Client的选项
#
#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走
;push "redirect-gateway"
#DHCP的一些选项,具体查看Manual
;push "dhcp-option DNS 10.8.0.1"
;push "dhcp-option WINS 10.8.0.1"
#如果可以让VPN Client之间相互访问直接通过openvpn程序转发,
#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率
client-to-client
#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA
#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN
;duplicate-cn
#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效,
#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,
#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,
#认为连接丢失,并重新启动VPN,重新连接
#(对于mode server模式下的openvpn不会重新连接)。
keepalive 10 120
#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,
#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1
tls-auth ta.key 0 # This file is secret
#对数据进行压缩,注意Server和Client一致
comp-lzo
#定义最大连接数
;max-clients 100
#定义运行openvpn的用户
user nobody
group nobody
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,
#否则网络连接会先linkdown然后linkup
persist-tun
#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
status openvpn-status.log
#记录日志,每次重新启动openvpn后删除原有的log信息
log /var/log/openvpn.log
#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后
;log-append openvpn.log
#相当于debug level,具体查看manual
verb 3
--------------Cut Here-----------------
把server.conf文件保存到/etc/opennvpn目录中,并把使用easy-rsa下的脚本什成的key都复制到/etc/openvpn目录下,命令如下:
#cd /etc/openvpn
#cp easy-rsa/keys/ca.crt .
#cp easy-rsa/keys/server.crt .
#cp easy-rsa/keys/server.key .
#cp easy-rsa/keys/dh1024.pem .
#cp easy-rsa/keys/ta.key .
#cp easy-rsa/keys/vpncrl.pem .
创建OpenVPN启动脚本,可以在源代码目录中找到,在sample-scripts目录下的openvpn.init文件,将其复制到/etc/init.d/目录中,改名为openvpn
然后运行:
#chkconfig --add openvpn
#chkconfig openvpn on
立即启动openenvpn
#/etc/init.d/openvpn start
接下来配置客户端的配置文件client.conf:
Linux或Unix下使用扩展名为.conf Windows下使用的是.ovpn,并把需要使用的keys复制到配置文件所在目录ca.crt elm.crt elm.key ta.key
-------------Cut Here---------------------
# 申明我们是一个client,配置从server端pull过来,如IP地址,路由信息之类“Server使用push指令push过来的”
client
#指定接口的类型,严格和Server端一致
dev tap
;dev tun
# Windows needs the TAP-Win32 adapter name
# from the Network Connections panel
# if you have more than one. On XP SP2,
# you may need to disable the firewall
# for the TAP adapter.
;dev-node MyTap
# 使用的协议,与Server严格一致
;proto tcp
proto udp
#设置Server的IP地址和端口,如果有多台机器做负载均衡,可以多次出现remote关键字
remote 61.1.1.2 1194
;remote my-server-2 1194
# 随机选择一个Server连接,否则按照顺序从上到下依次连接
;remote-random
# 始终重新解析Server的IP地址(如果remote后面跟的是域名),
# 保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址
# 这样无需人为重新启动,即可重新接入VPN
resolv-retry infinite
# 在本机不邦定任何端口监听incoming数据,Client无需此操作,除非一对一的VPN有必要
nobind
# 运行openvpn用户的身份,旧版本在win下需要把这两行注释掉,新版本无需此操作
user nobody
group nobody
#在Client端增加路由,使得所有访问内网的流量都经过VPN出去
#当然也可以在Server的配置文件里头设置,Server配置里头使用的命令是
# push "route 192.168.0.0 255.255.255.0"
route 192.168.0.0 255.255.0.0
# 和Server配置上的功能一样 如果使用了chroot或者su功能,最好打开下面2个选项,防止重新启动后找不到keys文件,或者nobody用户没有权限启动tun设备
persist-key
persist-tun
# 如果你使用HTTP代理连接VPN Server,把Proxy的IP地址和端口写到下面
# 如果代理需要验证,使用http-proxy server port [authfile] [auth-method]
# 其中authfile是一个2行的文本文件,用户名和密码各占一行,auth-method可以省略,详细信息查看Manual
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
# 对于无线设备使用VPN的配置,看看就明白了
# Wireless networks often produce a lot
# of duplicate packets. Set this flag
# to silence duplicate packet warnings.
;mute-replay-warnings
# Root CA 文件的文件名,用于验证Server CA证书合法性,通过easy-rsa/build-ca生成的ca.crt,和Server配置里的ca.crt是同一个文件
ca ca.crt
# easy-rsa/build-key生成的key pair文件,上面生成key部分中有提到,不同客户使用不同的keys修改以下两行配置并使用他们的keys即可。
cert elm.crt
key elm.key
# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项
# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server
# 因为他们的CA里没有这个扩展
ns-cert-type server
# 和Server配置里一致,ta.key也一致,注意最后参数使用的是1
tls-auth ta.key 1
# 压缩选项,和Server严格一致
comp-lzo
# Set log file verbosity.
verb 4
--------------Cut Here---------------------
Linux下Client的OpenVPN的安装方法一样,只是配置文件和keys上的不同,只要把client.conf ca.crt elm.crt elm.key ta.key复制到/etc/openvpn目录即可启动VPN。
Win下OpenVPN的安装,WIN下有图形界面的OpenVPN-GUI程序,下载地址http://openvpn.se
下载安装,默认下一步就OK了,安装完事后在托盘上出现一个新的图标,把client.ovpn ca.crt elm.crt elm.key ta.key文件拷贝到C:\Program Files\openvpn\config目录下,然后点右键connect就OK了。
对于LinuxServer使用NAT的一些说明:
首先要把系统的Forward打开,可以通过如下命令实现
echo 1 >; /proc/sys/net/ipv4/ip_forward
或者使用
sysctl -w net.ipv4.ip_forward=1
或者修改/etc/sysctl.conf文件,增加
net.ipv4.ip_forward = 1
设定SNAT的规则,使用iptables命令
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j SNAT --to-source 192.168.1.2
OK,OpenVPN Client可以访问内网了。
由于是第一次写这么详细的文档,有很多地方写的不详细,有很多东西可能我认为是很容易理解的,但是可能没有从一个初学者的角度去考虑问题,还希望大家多提意见,以便改进,由于本人不是专业从事VPN的研究,本文难免有错误之处,还往指正。
国外很多软件都有Howto,但是OpenVPN没有Howto,希望大家能在本文+其他static key的文章上,形成一个不是很全面的HOWTO。 -
2005-12-22
精通RPM之--制作篇
要想制作一个RPM格式的软件包,需要编写软件包描述文件。其标准命名格式为:软件名-版本号-释出号.spec,这个文件,详细描述了有关该软件包的诸多信息,如软件名,版本,类别,说明摘要,创建时要执行什么指令,安装时要执行什么操作,以及软件包所要包含的文件等等。有了这个文件,RPM就可以制作出相应的包裹文件来。 下面以我制作小赵编辑器LZE的软件包(lze-6.0-2.i386.rpm)为例,详细说明一下软件包描述文件的书写。其描述文件为lze-6.0-2.spec,该文件内容如下:(用nl -ba命令列出,每行开头的数字为所在行在文件中的行号) 1 # 文件名称: lze-6.0-2.spec 2 # 文件功能: lze软件包描述信息 3 # 文件作者: 纵横软件制作中心雨亦奇 国防大学研究生二队赵建利 4 # 修改时间: 2001.10.19 5 6 Name: lze 7 Version: 6.0 8 Release: 2 9 Summary: 小赵全屏幕中英文多窗口多功能编辑器(LINUX/UNIX系统适用) 10 Group: Applications/Editors 11 License: Share 12 Vendor: 纵横软件制作中心 13 Packager: 雨亦奇(zhsoft@371.net) 14 Source: http://zhsoft.myetang.com/lze-6.0-2.src.tgz 15 Prefix: /usr 16 Requires: /bin/sh 17 Provides: lze-edit 18 19 %description 20 小赵编辑器,是为使用SCO UNIX,LINUX多用户系统的广大用户专门设计的全屏幕多窗 21 口中英文多功能编辑器。 22 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十 23 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特 24 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎 25 添翼。10.即时翻译,按到即译。 26 总之,小赵编辑器会成为您在UNIX,LINUX系统上编制程序和书写一般性文稿的好帮手。 27 它将在工作中助您一臂之力,轻松上阵,游刃有余! 28 29 %prep 30 echo 预处理脚本程序(prep)开始执行 31 %setup 32 33 %build 34 echo 编译连接脚本程序(build)开始执行 35 make 36 37 %install 38 echo 安装脚本程序(install)开始执行 39 make install 40 41 %clean 42 echo 建包结束后清理脚本程序(clean)开始执行 43 44 %pre 45 echo 安装前执行脚本程序(pre)开始执行 46 47 %post 48 echo 安装后执行脚本程序(post)开始执行 49 50 %preun 51 echo 卸载前执行脚本程序(preun)开始执行 52 53 %postun 54 echo 卸载后执行脚本程序(postun)开始执行 55 56 %veryfiscript 57 echo 软件包校验脚本程序(verifyscript)开始执行 58 59 %triggerin -- xiuwu 60 echo 软件包安装时触发脚本程序(triggerin)开始执行 61 62 %triggerun -- yuntaishan < 2.0 63 echo 软件包卸载前触发脚本程序(triggerun)开始执行 64 65 %triggerpostun -- dapubu 66 echo 软件包卸载后触发脚本程序(triggerpostun)开始执行 67 68 %files 69 %defattr (-,root,root) 70 %config /etc/funkey.def 71 %config /etc/inputme.def 72 %doc /usr/doc/lze-6.0/README 73 %doc /usr/doc/lze-6.0/LICENSE 74 /usr/bin/lze 75 /usr/bin/lzeime.py 76 /usr/bin/lzeime.wb 77 /etc/wbzc.dat 78 79 %changelog 80 * Tue Aug 18 1998 雨亦奇 81 - 内置拼音,五笔输入法 82 * Fri May 01 1998 雨亦奇 83 - 增加多窗口操作 84 * Mon Mar 24 1997 雨亦奇 85 - 增加块操作命令 86 该描述文件包括以下几方面的内容: 一、注释行见第1-4行。它以#号开头,起注解作用,可帮助用户理解所写的内容,但对软件包的生成不起任何作用。此文件中,注释行集中在文件首部。实际上,它可位于描述文件的任何位置。 二、文件头见第6-17行。文件头描述软件包的基本信息,它包含若干个域,其中有必选的域,也有可选的域。一个域占用一行,其描述格式为: 域名 : 域值注意: 域名不分大小写,并且域值不能为空。文件头必选域有以下六个: 1. Name : 此域定义软件名。 2. Version : 此域定义版本号。仅当软件较以前有较大改变时才增加版本号。注: 版本号中不能含减号(-)字符。 3. Release : 此域定义释出号。若软件较以前改变较小,则仅增加释出号,不改变版本号。注: 释出号中亦不能含减号(-)字符。 RPM利用上述的Name(软件名),Version(版本号),Release(释出号)及体系号来命名软件包,如本例输出的包裹文件名为lze-6.0-2.i386.rpm。 4. Summary : 此域定义软件包简介,为一句话说明。 5. Group : 此域定义软件所属类别,详见<<精通RPM之五--查询篇>>,本例的Applications/Editors表示本软件属应用/编辑器类。 6. License : 此域定义软件适用的许可证或版权规则。该域也可用Copyright(版权)来定义,二者同意。许可证具体有: GPL(通用公共许可证,自由软件适用),BSD,MIT,Public Domain(公共域),Distributable(贡献),Commercial(商业),Share(共享)等。 文件头可选的域包括如下几类: 1. 基本信息 1.1 Vendor : 此域定义软件的供应商(销售商)。 1.2 Distribution : 此域定义软件所属的发行版,这是软件包制作者自己的分类。通常,一个发行版由若干个软件包构成。如我想做一个名为“熊猫'95”的发行版,则其中每个软件包(如竹叶95)的描述文件都应有这么一行: Distribution : 熊猫'95 1.3 Icon : 此域指定软件包所用的图标文件名。此文件为GIF或XPM格式,必须存放在RPM的%_sourcedir(源码目录)宏所指示目录下,默认为/usr/src/dist/SOURCES。RPM本身并不使用图标,但它将图标文件内容存贮到包裹文件中,安装时亦存贮到RPM数据库中。此图标可被图形界面的RPM包管理工具使用,用以改善界面效果,增加可视性。如下例指示软件包使用panda.xpm作为图标: Icon : panda.xpm 1.4 Packager : 此域定义打包者,亦即建立此软件包的人或公司。书写格式是: 打包者的名字 <电子信箱或相关网页> 请参考描述文件第13行。 1.5 Serial : 此域定义软件序列号,也可使用域名Epoch。软件序列号为一整数,由打包者指定,它应随着版本号的增加而不断增加,并且始终保持数值的唯一。软件序列号可被用来说明软件包之间的依赖关系。下例指定软件包序列号为4: Serial : 4 或用: Epoch : 4 1.6 URL : 此域定义包含打包软件有关信息的网页地址。如: URL : http://devplanet.fastethernet.net/gxedit.html 2. 依赖相关依赖是RPM用来描述软件包之间关系的。一个软件包依赖的东西RPM称作功能,它可以是真实存在的软件包,也可以是虚拟的软件包(虚包)。虚包没有版本号。依赖相关的域有: 2.1 Provides : 此域定义软件包提供的功能,可重复多行。其描述格式为: Provides : 功能1 [,功能2] ... 注: []所括为可选项,多个功能之间以逗号或空格分隔。软件包所提供的功能一般是以虚包形式存在的共享库。当有多个软件包均提供相同的服务时,常用虚包来表示其服务。如,一个邮件客户端软件允许用户使用不同的看信方式(文本形式,HTML形式等),可以要求任何一个看信程序必须提供mail-reader虚包。这样,看信程序的描述文件应有这么一行: Provides : mail-reader 如此它才能被邮件客户端使用。 2.2 Requires : 此域定义软件包所需的功能,可重复多行。其描述格式为: Requires : 功能1 [比较符1 [序列号1:]版本号1[-释出号1]] [,功能2 [比较符2 [序列号2:]版本号2[-释出号2]]] ... 其中: * []所括为可选项; * 比较符可使用<(小于),>(大于),=(等于),>=(大于等于)或<=(小于等于); * 序列号不选时,RPM默认为0; * 功能之间的逗号可选,也可使用空格进行分隔。例子:Requires: aaa, bbb >= 3.0, ccc < 2:5.0-1 注: 本例定义生成的包在安装时需要系统有如下功能: (1) aaa(系统中已安装aaa包,或者已安装软件包中有软件包提供aaa虚包); (2) bbb包已安装且版本要求大于等于3.0; (3) ccc包已安装且版本要求小于序列号为2,版本号为5.0且释出号为1。 RPM在进行版本比较时,执行比较的顺序是; 先版本号,再释出号,最后比较序列号。通过比较,确定哪个版本较新,哪个版本较老。 2.3 Conflicts : 此域定义有哪些功能与本软件包相冲突(不能共存)。此域亦可在描述文件中书写多次。其描述格式形同Requires域,为: Conflicts : 功能1 [比较符1 [序列号1:]版本号1[-释出号1]] [,功能2 [比较符2 [序列号2:]版本号2[-释出号2]]] ... 其中: * []所括为可选项; * 比较符可使用<(小于),>(大于),=(等于),>=(大于等于)或<=(小于等于); * 序列号不选时,RPM默认为0; * 功能之间的逗号可选,也可使用空格进行分隔。举个例子: Conflicts : xxx=1:2.0 yyy>=3.0 注: 本例阐明生成的包冲突的功能有: (1) 当系统中xxx包版本等于序列号为1且版本号为2.0时;(2) 当系统中yyy包版本大于等于3.0时。 *** 依赖关系的自动实现 *** 一般情况下,当RPM建立一个软件包时,它要执行/usr/lib/rpm目录下的两个小程序。一个是find-requires,用于查找软件包所需的共享库,这些库将以虚包的形式加入到该软件包所需的功能(Requires)之中。另一个是find-provides,它用于查找软件包所提供的共享库,这些库将以虚包的形式加入到该软件包所提供的功能(Provides)之中。这两个程序都是SHELL程序,代码量虽小,但确实帮了软件包制作者一个大忙--不必劳心费神地自己写这样的依赖关系了,因为程序均自动完成了。下面三个域用于指示RPM是否执行这两个程序。 2.4 Autoreq : 此域用于指示RPM是否自动查找软件所需的共享库。仅当域值为no或0时,RPM不执行find-requires程序,否则均执行该程序。 2.5 Autoprov : 此域用于指示RPM是否自动查找软件提供的共享库。仅当域值为no或0时,RPM不执行find-provides程序,否则均执行该程序。 2.6 Autoreqprov : 此域用于指示RPM是否自动查找软件所需的共享库与其提供的共享库。仅当域值为no 或0时,RPM不执行find-requires与find-provides两个程序。此域相当于同时设定Autoreq 与Autoprov域值为指定之值。 注: 上述三个域在描述文件中,它们之间因为顺序的不同而结果会有所不同,一般以最后一个为准。如: Autoreq : yes Autoreqprov : no Autoprov : yes 注: 本例虽然第一行允许执行find-requires,但第二行又不允许find-requires与find-provides两个程序运行,而第三行允许find-provides运行,所以依照执行顺序,结果为不允许执行find-requires,而允许执行find-provides。又如: Autoreq : no Autoreqprov : yes Autoprov : no 注: 本例的结果为允许执行find-requires,而不允许执行find-provides。 3. 系统相关 RPM制作软件包时,可以为其指定适用的CPU体系或操作系统,也可为其指定不适用的CPU体系或操作系统,这样,当RPM发现当前的CPU体系或操作系统与软件包要求的不兼容时,将中止软件包的制作。RPM默认的当前CPU体系由宏%_arch定义,一般为i386。RPM默认的当前操作系统由宏%_os定义,一般为linux。读者可以通过查看/usr/lib/rpm/macros宏定义文件得到。下面四个域说明软件包的适用范围: 3.1 Excludearch : 此域定义软件包不适用的体系。RPM可选的体系名请参见/usr/lib/rpm/rpmrc文件中的arch_canon项目。软件包不适用于某个体系,可能有两方面的原因。一是该软件还没有移植到所定义的体系上;二是该软件含有特定的机器码(汇编语言),它与别的体系不兼容。 此域描述格式为: Excludearch : 体系1 [体系2] ... 注: []所括为可选项,各体系之间以空格分隔。 如果当前体系在此域值之中,则RPM制作软件包时将报错退出,请看下面的例子。 在lze-6.0-2.spec文件头部分加入一行: Excludearch : i386 再运行建包命令rpm -bb(<<精通RPM之七--制作篇(下)>>将讲到): # rpm -bb lze-6.0-2.spec Architecture is excluded: i386 # 由上看出,RPM提示了“体系不适用: i386”的错误。 3.2 Exclusivearch : 此域定义软件包适用的体系。其描述格式与Excludearch类似: Exclusivearch : 体系1 [体系2] ... 注: []所括为可选项,各体系之间以空格分隔。 假如在lze-6.0-2.spec文件头加入一行: Exclusivearch : i386 sparc 再运行建包命令将会怎么样: # rpm -bb lze-6.0-2.spec Executing: %prep 预处理脚本程序(prep)开始执行 Executing: %build 编译连接脚本程序(build)开始执行 Executing: %install 安装脚本程序(install)开始执行 Processing files: lze Finding Provides: (using /usr/lib/rpm/find-provides)... Finding Requires: (using /usr/lib/rpm/find-requires)... Provides: lze-edit PreReq: /bin/sh Requires: /bin/sh ld-linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) Wrote: /usr/src/dist/RPMS/i386/lze-6.0-2.i386.rpm # 看,此次建包(lze-6.0-2.i386.rpm)成功了,因为当前的体系(i386)正好适用。 3.3 Excludeos : 此域定义软件包不适用的操作系统。RPM可选的操作系统请参考文件/usr/lib/rpm/rpmrc中的os_canon项目。其描述格式为: Excludeos : 操作系统1 [操作系统2] ... 注: []为可选项,操作系统之间以空格分隔。例如: Excludeos : irix aix solaris 注: 如将此行加入到lze的描述文件中,则它会指示RPM不在irix,aix,solaris这三个操作系统上建立lze软件包。如果当前操作系统是三者之一,则RPM会报错并中止软件包的制作。如: # rpm -bb lze-6.0-2.spec OS is excluded: Solaris # 3.4 Exclusiveos : 此域定义软件包适用的操作系统。其描述格式为: Exclusiveos : 操作系统1 [操作系统2] ... 注: []为可选项,操作系统之间以空格分隔。例如: Exclusiveos : linux solaris 4. 目录相关 4.1 Prefix : 此域定义可重定位的目录前缀,可在描述文件中书写多次。其描述格式为: Prefix : 目录前缀1 [目录前缀2] ... 注: []为可选项,各目录前缀之间均以空格分隔。例如: Prefix : /usr /etc 它也可写作: Prefix : /usr Prefix : /etc RPM利用可重定位的目录前缀,实现了软件包的重定位安装,使软件中的文件不必固定在某个绝对位置,这种做法很好。LZE软件包描术文件lze-6.0-2.spec中就定义了一个可重定位的前缀/usr(见第15行),这样,安装时就可将该包中在/usr目录下的文件重定位到用户指定的目录,如: # rpm -i --prefix /tmp lze-6.0-2.i386.rpm # 或者: # rpm -i --relocate /usr=/tmp lze-6.0-2.i386.rpm # 注: 此命令安装lze包,将其中含/usr重定位目录前缀的文件定位到/tmp目录。如包中的/usr/bin/lze文件安装后,因重定位而成了/tmp/bin/lze。(RPM安装命令使用方法请参考<<精通RPM之二--安装篇>>) 4.2 Buildroot : 此域定义的是软件包所包含的文件共有的根目录,此根目录仅供RPM建立软件包时使用。即当RPM建立软件包时,将设定此目录为根(调用chroot函数),提取所需文件,生成软件包。例如: 当Buildroot设定为/tmp时,对于LZE包描述文件中所包含的/usr/bin/lze文件,RPM实际打包的则是/tmp/usr/bin/lze,但对生成的包查询后可以发现:原文件名并未改变,还是/usr/bin/lze。如此说来,这就很有意思了。一般用户通过设定Buildroot,也可以象超级用户(root)那样自由地建立各种各样的软件包了,即使包中有那些唯有超级用户才可以操作的目录或文件。安装这样的包与安装由超级用户建立的包,是没有什么分别的。此域的描述格式很简单: Buildroot : 目录如,上例可定义为: Buildroot : /tmp 5. 源码相关下列四个域均是为制作源码包而设计的。源码包里有什么?用户可以通过查询包的文件列表得到,命令是“rpm -qpl 源码包文件”(请参阅<<精通RPM之五--查询篇>>有关内容)。一般情况下,源码包里有这么四类文件: 一是程序源码(SOURCE),二是源码补丁(PATCH),三是软件包描述文件,四是图标文件(ICON)。通过安装源码包,用户可以轻松地实现现场编译、连接和应用,同时更方便了软件开发者与软件包制作者:他们维护程序容易了,并且维护过后可以很快地生成执行代码包与源码包。这,也是所有人钟爱RPM的重要原因之一。 5.1 Source : 此域定义RPM打包时要包含的程序源码文件。这些文件一般先用tar命令打包,然后再用gzip压缩。一个描述文件中可包含多个Source域,当有多个这样的域时,需要进行编号:第1个编为Source0(也可直接用Source),第2个编为Source1,第3个编为Source2等等。此域的描述格式为: Source[编号] : 源码文件 注: []所括为可选项。具体用法如: Source0 : lze-6.0-2.tar.gz Source1 : lzeime-wb-6.0-2.tar.gz Source2 : lzeime-py-6.0-2.tar.gz Source3 : lze-lib-6.0-2.tar.gz 注: 此域域值可以采用URL(统一资源定位)的形式,如LZE描述文件第14行。采用这种形式,主要是给其它用户提供该源码的位置信息。在RPM制作源包时,它提取的是最后的文件名lze-6.0-2.tar.gz,而不是http://zhsoft.myetang.com/lze-6.0-2.tar.gz(URL前面的内容被RPM忽略了)。 5.2 NoSource : 在上例中,假如在打包时不想包含Source1与Source2定义的文件,那该怎么办? 办法之一是将其所在行删除掉; 办法之二是将其所在行注释掉(即所在行前面加#号); 办法之三就是定义Nosource域,此域可重复。其描述格式为: NoSource : 源码域编号 本例可写作: NoSource : 1 NoSource : 2 注: 其中的1与2为编号,表示Source1和Source2。注意: 如果软件包描述文件中没有NoSource域,则RPM生成的源码包名字格式为软件名-版本号-释出号.src.rpm。如果使用了NoSource域,则RPM生成的源码包名字格式为软件名-版本号-释出号.nosrc.rpm(单从名字就可看出源码包包含的文件不完整)。 5.3 Patch : Patch的本义是补丁,用在这里指的是源程序的补丁,它是用diff命令比较新老源程序所产生的输出(命令为“diff -Nur 旧文件 新文件 >补丁文件”),而系统中的patch命令又可利用此输出将老版本的源程序升级为新版本。此域定义RPM制作源码包时所要包含的补丁文件,该文件的命名建议用软件名-版本号.补丁功能.patch的格式。一个软件包描述文件中可有多个Patch域,当有多个这样的域时,也需要象Source域那样进行编号(注:第1个域编为Patch0,也可省略0,用Patch)。此域的描述格式为: Patch[编号] : 源码补丁文件 注: []所括为可选项。具体用法如: Patch0 : blather-4.5-bugfix.patch Patch1 : blather-4.5-config.patch Patch2 : blather-4.5-somethingelse.patch 注: 此域的域值也可以象Source域一样,采用URL的形式,RPM仅提取其中的文件名供其使用。 5.4 NoPatch : 此域的功能类似NoSource,其定义的编号对应的补丁文件RPM不作打包处理。此域在描述文件中可重复出现。如上例,若不想让源码包包含Patch0与Patch2域所指示的补丁文件,则可在描述文件写上这么两行: NoPatch : 0 NoPatch : 2 注意: 如果软件包描述文件中没有NoPatch域,则RPM生成的源码包名字格式为软件名-版本号-释出号.src.rpm。如果使用了NoPatch域,则RPM生成的源码包名字格式为软件名-版本号-释出号.nosrc.rpm(单从名字就可看出源码包包含的文件不完整)。 三、功能段见第19-86(即文件头以下的部分)。何谓功能段?可以这么说,功能段是描述软件包的重要数据和操作指令的段落,它包括段名与段内容两部分。没有功能段,RPM便制作不出任何包裹文件。功能段的段名都是以百分号(%)开始的,占用一行。功能段的段内容范围是这样界定的:它从该功能段段名下一行开始到下一个功能段段名的前一行或到描述文件结束。如LZE描述文件,%description段是从第19行到第28行(%prep段从第29行开始),第19行为段名,第20-28行为段内容。而%prep段是从第29行到第32行(第33行%build段开始),其段名在第29行,段内容在第30-32行。另外要注意的是,各个功能段的位置是自由的,可放在文件头以下的任何位置,不必拘泥某一固定位置。必选的功能段描述文件中,必选的功能段有: 1. %description 本段是描述段,段的内容是对软件包进行较为详细的介绍,不象文件头的Summary域仅用一句话说明。介绍的文本形式自由,可任意换行,不受限制。具体请参见LZE描述文件第20-27行。本段段名描述格式是: %description [子包选项] 其中,子包选项的格式为:[-n] 子包名注: []所括为可选项。 三种形式的描述段段名: (1) 段名格式为“%description”时: 本功能段描述的内容是关于父包的。父包也可叫作主软件包,它用软件名来命令,其名字格式是:软件名-版本号-释出号.体系.rpm。如:lze-6.0-2.i386.rpm。 (2) 段名格式为“%description 子包名”时: 本功能段描述的内容是关于子包的。子包选项中没有-n选项时,子包是用软件名加子包名的形式命名,格式为: 软件名-子包名-版本号-释出号.体系.rpm。如分成两个子包的LZE软件:lze-bin-6.0-2.i386.rpm(执行程序包),lze-config-6.0-2.i386.rpm(配置文件包)。 (3) 段名格式为“%description -n 子包名”时: 本功能段描述的内容也是关于子包的。当子包选项中有-n选项时,子包直接采用子包名的形式命名。它不包含软件名,命名格式为: 子包名-版本号-释出号.体系.rpm。如分成两个子包的LZE软件: bin-6.0-2.i386.rpm(执行程序包),config-6.0-2.i386.rpm(配置文件包)。注意:这种类型的子包内容通常是可被其它软件包共用的函数库,如果专用,则尽量不要采用这样形式来定义子包。 2. %files 本段是文件段,它定义的是软件包需要包含哪些文件。本段通常放在描述文件尾部,以便于添加文件名,便于编辑。本段段名描述格式为: %files [子包选项] [-f 文件名] 注: []所括为可选项。当没有任何选项时,本段内容定义的是父包要打包的文件列表; 当有子包选项时,本段内容定义的则是子包要打包的文件列表; 当选择-f选项时,RPM除了从文件段读取打包文件列表外,还将从指定的文件中读取要打包的文件列表。指定的文件中,一个文件名占用一行。此选项方便了软件包制作者,他们可以通过程序自动产生有关软件的文件列表,并将其写入到一个特定的文件中,这样制作软件包时,只需引用一下这个文件,RPM就会自动从这个文件中读取文件名并将其加入包中。如果没有此选项,软件包制作者只能在文件段里,将要打包的文件名一个一个写进去,有点麻烦。 文件段的内容格式为: [修饰符1 [修饰符2] ...] 文件名其中:修饰符是可选的,一个文件可以有多个修饰符,文件名必须以/开头(绝对路径形式)。修饰符有以下几类: (1) 文件相关 * %doc : 此修饰符设定文件类型为说明文档(参见LZE描述文件第72,73行); * %config : 此修饰符设定文件类型为配置文件(参见LZE描述文件第70,71行); * %config(missingok) : 此修饰符设定文件类型为配置文件,且此文件可丢失。即使丢失了,RPM在卸载软件包时并不认为这是个错误,并不报错。此修饰符通常用于那些软件包安装后建立的符号连接文件,如/etc/rc.d/rc2.d/S55named等。此类文件在软件包卸载后可能需要删除,所以丢失了也不要紧。 * %config(noreplace) : 此修饰符设定文件类型为配置文件,且如果安装时系统中有同名的文件,则软件包中的这个文件将换个名字安装,其文件名后缀加个.rpmnew。(如果不用此修饰符,则安装时RPM若发现有同名文件,则RPM会将系统中的这个文件换个名字,其后缀加上.rpmorig,而软件包中的文件则还用原来的名字。)在软件包卸载时,系统中的同名文件被RPM换个名字保存起来,其后缀加上了.rpmsave。如描述文件的文件段中定义了这么一行: %config(noreplace) /etc/hello 则制成的包在安装时,若系统中已有此文件/etc/hello,则RPM会提示: warning: /etc/hello created as /etc/hello.rpmnew 这表明包中的/etc/hello文件被创建为/etc/hello.rpmnew文件了。如果卸载这个软件包,则系统中的/etc/hello将会改名为/etc/hello.rpmsave。 * %ghost : 此修饰符所修饰的文件,其内容不被包含到软件包中。这样的文件一般是日志文件(log file)一类的文件,其文件属性(文件名,属主,属组等)很重要,但是文件内容并不重要。用此修饰符后,RPM仅将其文件属性加入包中。 * %attr : 此修饰符设定文件的属性信息,使用格式为: %attr(权限,属主,属组) 注: 权限常用数字形式(八进制),属主和属组可以是数字,也可以是字符串。如果文件的权限,属主和属组想使用系统默认值,则可用减号(-)表示它。如下例采用两个修饰符,定义/etc/funkey.def文件的权限为755,属主默认,属组为root,类型为配置文件: %attr(755,-,root) %config /etc/funkey.def * %verify : 此修饰符设定文件需要校验的那些属性。这些属性有:owner(属主),group(属组),mode(权限),md5(MD5检查和),size(大小),maj(主设备号),min(从设备号),symlink(符号连接),mtime(最后修改时间)。此修饰符使用格式为: %verify([not] owner group mode md5 size maj min symlink mtime) 注: not可选。当选用not时,表明需要校验除选定属性以外的那些属性。如下例指示RPM校验/dev/ttyS0文件时,要校验其权限,MD5检查和,大小,主设备号,从设备号,符号连接和最后修改时间共七项属性信息: %verify(mode md5 size maj min symlink mtime) /dev/ttyS0 这也可以采用not选项来实现,因为除去属主owner和属组group两项属性,剩下的就是需要校验的属性了: %verify(not owner group) /dev/ttyS0 (2) 目录相关 * %docdir : 此修饰符定义说明文档前缀,这样,后面所有含指定文件名作为前缀的文件,RPM打包时会将其类型统一设定为说明文档。例如某描述文件的文件段中有这么三行: /root/readme %docdir /root /root/mydoc.txt 此例指明/root为说明文档的前缀,因为/root/mydoc.txt在%docdir的下一行,所以RPM打包时会设定此文件的类型为说明文档。而/root/readme文件则不做此设定,因为它在%docdir定义之前。通过此修饰符,用户可以很方便地设定说明文档一类的文件,因为它们通常固定在某个目录下面,有着共同的前缀。 * %dir : RPM在制作软件包时,如果要打包的文件是个目录,那么RPM会将该目录下面的所有文件包含到软件包中。(注意:如果要打包的文件是个符号连接,此符号连接又指向一个目录,则RPM并不会将其视作目录,只会把它当为普通文件处理。)如果仅想将这个目录名包含到软件包中,制作者用此修饰符修饰一下这个目录名就行了。 如: /etc是个系统目录,其下有多个文件,如果想将其均加入包中,描述文件的文件段里可写上这么一行: /etc 如果仅想包含此目录,则可用: %dir /etc (3) 另类修饰符此类只有一个%defattr。说它是另类修饰符,是由于它设定的是默认的文件属性,而非特定的某个文件。它一般放在文件段内容的第一行。其使用格式为: %defattr(权限,属主,属组) 其中: 权限,属主和属组都可以使用减号(-)。使用减号的属性将由系统设定。例如: %defattr(022,zzz,zhsoft) 设定其后的所有文件权限为022,属主为zzz,属组为zhsoft;又如: %defattr(-,zzz,-) 则是设定其后的所有文件属主为zzz,权限与属组由系统设置。可选的功能段描述文件中,可选功能段的内容都是些脚本程序。(LZE描述文件中多个脚本程序中仅含一个echo命令) 可选的功能段的描述格式为: 功能段名 [子包选项] 注: 子包选项为[-n] 子包名。当无子包选项时,段内容描述的是父包的脚本程序。当有子包选项时,段内容则是描述子包的脚本程序。 可选的功能段可分为如下三类: 1. 建包用功能段: RPM通过源程序来建立一个软件包时,要执行预处理,编译,安装和清理四项操作,分别对应于%prep,%build,%install和%clean四个段。 下面按其执行顺序逐段进行说明: 1.1 %prep : 此为预处理段,其内容为预处理脚本程序。该程序完成以下任务: * 建立软件编译用目录; * 将源程序解压缩; * 通过打补丁,升级源程序; * 执行其它一些操作,使源程序随时可进行编译。在此脚本程序中,可使用如下两个宏命令: 1.1.1 %setup 这个宏利用系统中的gzip与tar等命令,来解压源程序包。RPM会自动探测源程序包是否压缩,如果压缩,它会用gzip将其解压缩,否则直接用tar命令展开包中文件。其使用格式为: %setup [-n name] [-c] [-D] [-T] [-b N] [-a N] 注: []所括为可选项。 (1) 当没有任何选项时: 这个宏用来解压默认的源程序包(由文件头Source或Source0域指定)。注意:源程序包中的文件应用软件名-版本号作为其上层目录,这样%setup宏就可以正常工作。如果不以软件名-版本号作为其上层目录,则%setup宏工作时有一个指令cd 软件名-版本号(转目录)会因为系统中没有此目录而出错退出(除非在此宏上面加上建立此目录的命令)。如LZE软件源程序所在的目录为lze-6.0,我需要用命令tar cvzf lze-6.0-2.src.tgz lze-6.0将源程序打包并压缩,这样的包就可以被%setup宏正确使用了。下面是%setup宏命令所执行的一系列命令: (指令前面为行号) 1 cd /usr/src/dist/BUILD 2 echo 预处理脚本程序(prep)开始执行 3 cd /usr/src/dist/BUILD 4 rm -rf lze-6.0 5 /bin/gzip -dc /usr/src/dist/SOURCES/lze-6.0-2.src.tgz | tar -xvvf - 6 STATUS=$? 7 if [ $STATUS -ne 0 ]; then 8exit $STATUS 9 fi 10 cd lze-6.0 11 [ `/usr/bin/id -u` = '0' ] && /bin/chown -Rhf root . 12 [ `/usr/bin/id -u` = '0' ] && /bin/chgrp -Rhf root . 13 /bin/chmod -Rf a+rX,g-w,o-w . 14 exit 1 看,第10行就有一个转到lze-6.0目录的命令,如果没有这个目录,程序就会出错退出了。也许你要问:这些指令你是怎么知道的?其实这很简单,只要在%setup宏下面加上一句exit 1命令,让预处理脚本程序非正常退出即可。这样RPM所执行的预处理脚本程序作为临时文件在其退出时并未删除,只要看一下这个文件(在/var/tmp目录下以rpm-tmp开头)就知道%setup宏命令做什么了。 (2) -n name : 上面已经谈到,源程序包中的文件应采用软件名-版本号作为上层目录。如果用了别的什么目录(如name),%setup宏无法正常工作,那该怎么办?没关系,可以用-n选项,引用一下这个目录(name)就行了。假如我的LZE源程序包中的文件是以lze为上层目录,那么我就可以用%setup -n lze宏命令来解压缩该包。 (3) -c : 此选项的作用是创建上层目录(软件名-版本号目录)并转到这个目录。对于LZE软件,其效果相当于在上例的第4行与第5行之间加上这么两行命令: mkdir -p lze-6.0 cd lze-6.0 它适用的情况是:有的源程序包是在源程序所在目录下打的包,所以其中的文件都没有上层目录。这样的话,要想正确解压,必须创建上层目录。 (4) -D : 本选项的作用是在解压源程序包之前不要删除软件的上层目录(软件名-版本号)。在上例中,其效果是不执行第4行的命令(rm -rf lze-6.0)。 (5) -T : 本选项的作用是不解压默认的源程序包(由文件头的Source或Source0域所定义)。在上例中,其效果是不执行第5-9行的命令:第5行是解压源程序包(用gzip -dc将包的内容解压缩到管道中,再由tar -xvvf -从管道中读取数据并展开),第6-9行是检查解压命令的返回值,非0时执行非正常退出。 (6) -b N : 本选项指示RPM在转到上层目录前解压第N个源程序包(由文件头SourceN域定义)。这适用于含上层目录的源程序包。注意:如果使用此选项时不同时使用-T选项,则RPM解压的是两个源程序包,一个是默认的包(由Source或Source0域定义),一个是-b选项指定的包(由SourceN域定义)。这样,当N等于0时,默认的源程序包将被解压两次。所以,如果想仅解压指定源程序包,请同时使用-T选项,以禁止解压默认的源程序包。下面的宏命令仅解压第1个源程序包,然后转到上层目录: %setup -b 1 -T (7) -a N :本选项指示RPM在转到上层目录后再解压第N个源程序包(由文件头SourceN域定义)。这适用于不含上层目录的源程序包。使用本选项时,一般加上-c选项,以创建上层目录并转到此目录。注意:如果使用此选项时不同时使用-T选项,则RPM解压的是两个源程序包,一个是默认的包(由Source或Source0域定义),一个是-a选项指定的包(由SourceN域定义)。这样,当N等于0时,默认的源程序包将被解压两次。所以,如果想仅解压指定源程序包,请同时使用-T选项,以禁止解压默认的源程序包。 下面的宏命令让RPM先转到上层目录,再仅解压第2个源程序包: %setup -T -a 2 1.1.2 %patch 此宏利用系统中的patch命令,来给指定的源程序包打补丁,从而将程序升级。其使用格式为: %patch [-P N] [-p N] [-b name] [-E] 注: []所括为可选项。为了说明下列选项的作用,我们为LZE软件包描述文件中定义三个补丁文件: Patch0 : lze-patch.zero Patch1 : lze-patch.one Patch2 : lze-patch.three (1) 当没有任何选项时: 没有任何选项时,该宏使用的是默认的补丁文件(第0个补丁文件),即由文件头Patch或Patch0域所定义的文件(LZE包使用lze-patch.zero)。该宏在执行时,扩展为以下指令: echo Patch #0: patch -p0 -s < /usr/src/dist/SOURCES/lze-patch.zero 注: 第一行指令是利用echo命令向屏幕输出字符串“Patch #0:”。第二行指令则是利用patch命令读取补丁文件lze-patch.zero升级源程序。 patch命令用了两个选项:(有关patch命令用法,详见其用户手册) * -p : 这个选项用于确定patch所要操作的文件。它针对补丁文件头部的文件名,删除名字中指定数目个斜杠(/)前面的所有字符,从而得到要操作的文件名。如补丁文件里有个文件名/usr/zzz/src/lze.c,则用-p0时patch操作的文件名不变,用-p1时则变为usr/zzz/src/lze.c,用-p2时则变为zzz/src/lze.c,如用-p4则操作的文件名变为lze.c。 * -s : 这个选项指示patch在打补丁过程中不输出任何信息,即使有错误发生。 (2) -P N : 使用此选项以指示RPM使用第N个补丁文件(由文件头PatchN域定义)。如想让RPM使用LZE的第2个补丁文件Patch2(lze-patch.three)时,可使用-P 2来指定。 (3) -p N : 此选项与其参数是由%patch宏直接传给patch命令的。请参见上面patch命令所用的-p选项的介绍。 (4) -b name : 当有多个patch命令操作同一个文件时,patch会将原文件换名保存(其后缀变作.orig),如lze.c会变作lze.orig。如果想用别的名字作后缀,则可用-b设置一下,这样原文件会换名为原文件名+后缀,如用-b ZZZ时,lze.c会换名保存为lze.cZZZ。此选项在执行时,实际上是给patch命令传递了一个选项及参数,即--suffix name。 (5) -E : 此选项直接传给patch命令,其作用是:如果一个文件打完补丁后内容为空(字节数为0),则删除这个文件。 1.2 %build : 此为编译段,其内容为编译脚本程序。该程序完成源程序的编译和连接。一个最简单的例子就是程序中仅有一个make命令。这适用于大部分情况,因为多数软件均有自己的makefile,这样通过make命令就可实现编译与连接。如果没有makefile的话,需要软件包制作者自己在编译段书写上一系列的编译连接命令。 1.3 %install : 此为安装段,其内容是安装脚本程序。该程序将已编译连接好的执行程序或其它文件存放到指定目录下,这些程序或文件供RPM打包时使用。一个最简单的例子就是程序中仅用一个make install命令,从而完成安装。这也需要相应的软件有makefile维护文件。没有的话,软件包制作者也得自己写指令。 1.4 %clean : 此为清理段,其内容是清理脚本程序。此程序在RPM制作好软件包后才执行,它通常是删除那些编译连接时产生的临时文件或目录,完成缮后工作。 2. 管理用功能段: 此类段用于软件包自身的管理(安装,卸载和校验),包括%pre,%post,%preun,%postun,和%verifyscript五个功能段。 2.1 %pre : 该段内容为安装前脚本程序。它在软件包安装之前执行,通常是检测操作环境,建立有关目录,清理多余文件等等,为软件包的顺利安装做准备。本段很少使用。其段名格式为: %pre [子包选项] 2.2 %post : 该段内容为安装后脚本程序。它在软件包安装完成之后执行,常用来建立符号连接,修改系统配置文件,运行ldconfig程序等,以利软件的正常运行。其段名格式为: %post [子包选项] 2.3 %preun : 该段内容为卸载前脚本程序。它在软件包卸载之前执行,主要为卸载做准备。具体如,要卸载的软件包中某个程序当前正在运行时,此脚本程序必须杀掉它,否则无法正确卸载。其段名格式为: %preun [子包选项] 2.4 %postun : 该段内容为卸载后脚本程序。它在软件包卸载后执行,完成卸载的缮后工作,如将系统配置文件inetd.conf改回原来的样子,重新运行一下ldconfig命令,将已卸载的共享库从缓冲文件ld.so.cache中删除等等。其段名格式为: %postun [子包选项] 2.5 %verifyscript : 该段内容为校验脚本程序。RPM校验软件包时,除了执行标准的校验外,如果软件包制作者设定有此校验脚本程序,还将执行之。 其段名格式为: %verifyscript [子包选项] 下面是XFree86-libs-3.3.6-6.i386.rpm软件包中的校验脚本程序,它校验的是动态链接库目录/usr/X11R6/lib。校验时,在/etc/ld.so.cache文件中查找/usr/X11R6/lib,如果找不到,则显示missing,找到则显示found。 # verifyscript echo -n Looking for /usr/X11R6/lib in /etc/ld.so.conf... if ! grep ^/usr/X11R6/lib$ /etc/ld.so.conf > /dev/null then echo missing echo /usr/X11R6/lib missing from /etc/ld.so.conf >&2 else echo found fi 3. 交互用功能段: 这类功能段有%triggerin,%triggerun,%triggerpostun,它们的内容都是RPM用于软件包之间交互控制的脚本程序。这些脚本程序都是在系统满足指定的条件下才触发执行的: 1) %triggerin : 段内为安装时触发脚本程序,当其所在软件包与指定软件包仅有一方已安装时,安装另一方将触发此程序执行; 2) %triggerun : 段内为卸载时触发脚本程序,当其所在软件包与指定软件包都已安装时,卸载二者中的任一个将触发此程序执行; 3) %triggerpostun : 段内为卸载后触发脚本程序,只有指定软件包卸载后才触发此程序执行。 3.1 段名格式 它们的段名描述格式均为: 交互段名 [子包选项] [-p 解释程序] -- 触发条件1 [,触发条件2] ... 注: []所括为可选项。子包选项见前面介绍,不赘述。 3.1.1 -p选项: 此选项用于指定一个解释程序,来解释执行交互功能段的脚本程序。默认情况下,RPM使用/bin/sh来执行脚本(此类脚本用SHELL语言编写,也叫SHELL程序)。有的RPM包则是使用/usr/bin/perl 来执行脚本(此类脚本是用PERL这种解释性语言写的),这就需要用-p选项来指定解释程序为 /usr/bin/perl,如: %triggerin -- sendmail ln -sf /usr/bin/sendmail /etc/mymailer/mailer %triggerin -- vmail ln -sf /usr/bin/vmail /etc/mymailer/mailer 注: 此例中定义package子软件包安装时触发脚本程序:当触发条件(fileutils>3.0,perl<1.2)满足时,用/usr/bin/perl执行脚本,即用print命令输出字符串I'm in my trigger!。 3.1.2 触发条件: 交互功能段的触发条件格式是: 功能名 [比较符 版本号] 其中:比较符与版本号可选。仅有一个功能名时,表明该功能存在时触发程序执行。比较符可用大于(>),等于(=),小于(<),大于等于(>=)和小于等于(<=)。如触发条件bash,又如触发条件fileutils>3.0,这种使用均合法。交互功能段最少有一个触发条件。当有多个触发条件时,这些条件间均以逗号(,)分隔,它们之间是或的关系,即只要其中有一个条件系统满足,RPM就将执行触发脚本程序。如上面介绍-p选项时举的例子:例子中有两个触发条件fileutils>3.0和perl<1.2,在安装软件包时,只要有一个条件满足,RPM就会执行触发脚本,即输出I'm in my trigger!。 3.2 交互用功能段的使用为什么要使用交互用功能段?下面的例子很能说明问题。假定mymailer软件包需要/etc/mymailer/mailer这个符号连接文件指向当前使用的邮件发送代理程序。如果sendmail包安装了,那么这个符号连接文件应指向/usr/bin/sendmail程序。如果vmail包安装了,那么它应当指向/usr/bin/vmail程序。如果这两个软件包都安装了(实际上,sendmail与vmail彼此是冲突的),那么我们也无需考虑符号连接指向哪个文件了。当然,如果这两个包都未安装,那么/etc/mymailer/mailer符号连接文件也没有理由存在了。 上述要求,我们通过为mymailer软件包编写触发脚本程序来实现,这些脚本程序在下列事件发生时,将改变/etc/mymailer/mailer符号连接的内容: 1) sendmail已安装; 2) vmail已安装; 3) sendmail卸载时; 4) vmail卸载时。 前两个事件触发的脚本程序可以这样写: %triggerin -- sendmail ln -sf /usr/bin/sendmail /etc/mymailer/mailer %triggerin -- vmail ln -sf /usr/bin/vmail /etc/mymailer/mailer 这是两个安装时被sendmail或vmail所触发脚本程序。它们将在下列情况下执行: 1) 在mymailer包已安装的情况下,安装或升级sendmail包; 2) 在mymailer包已安装的情况下,安装或升级vmail包; 3) 在sendmail包已安装的情况下,安装或升级mymailer包; 4) 在vmail包已安装的情况下,安装或升级mymailer包。后两个事件触发的脚本程序可以这么写: %triggerun -- sendmail [ = 0 ] || exit 0 if [ -f /usr/bin/vmail ] then ln -sf /usr/bin/vmail /etc/mymailer/mailer else rm -f /etc/mymailer/mailer fi %triggerun -- vmail [ = 0 ] || exit 0 if [ -f /usr/bin/sendmail ] then ln -sf /usr/bin/sendmail /etc/mymailer/mailer else rm -f /etc/mymailer/mailer fi 这两个脚本程序在下列情况下触发执行: 1) 在sendmail包已安装的情况下,卸载mymailer包; 2) 在vmail包已安装的情况下,卸载mymailer包; 3) 在mymailer包已安装的情况下,卸载sendmail包; 4) 在mymailer包已安装的情况下,卸载vmail包。为了确保在mymailer包卸载后符号连接文件/etc/mymailer/mailer也被删除,可以在 mymailer软件包描述文件的%postun功能段内,加上删除该文件的命令: %postun [ = 0 ] && rm -f /etc/mymailer/mailer 注: %postun段内为卸载后执行脚本程序,在mymailer包卸载后执行。由上看出,当一个软件包与另一个软件包存在密切关系时,我们可以通过交互用功能段实现某些文件的管理,这不仅扩展了RPM软件包管理的功能,又有助于软件包的正常运行。 4. 其它功能段其它功能段只有一个,即%changelog。这个段的内容是软件维护记录,它记录每次软件维护的时间,维护人及其EMAIL,维护的项目等。 %changelog段内容格式为: * 星期 月份 日子 年份 维护内容注: 每个维护记录均以*开头,星期,月份均须为英文缩写。维护内容多时可分行编写, 每行开头最好以减号(-)开头。可以采用类似LZE方式的维护记录写作格式:(见LZE描述文件第80-85行) 一个RPM的软件包描述文件,可以仅生成一个父包或一个子包,也可以生成一个父包和多个子包。通过设定子包选项,可以使生成的子包采用软件名-子包名的标准命名,也可使生成的子包采用自己的名字。一个子包,通常是按照其包含的文件的用途或类型来归并文件进而打成包裹的。象前面的LZE描述文件很简单,它将所有文件都包含进了父包中。我们也可以将文件分类作成子软件包,如可分成执行程序子包(lze-bin),配置文件子包(lze-config)和说明文档包(lze-doc)。我们还可以只分出一个配置文件子包(lze-config),其余文件均打入父包中(lze)。通过这样详细地分类,有助于用户管理软件包,避免安装多余的东西,同时也有助于升级。 要想创建子软件包,必须描述以下内容: 1. %package : 用此段创建一个子包。其名字由子包选项控制。子包选项为[-n] 子包名,不选-n时,生成的子包文件为软件名-子包名-版本号-释出号.体系.rpm;选-n时,生成的子包文件为子包名-版本号-释出号.体系.rpm。其应用格式为: %package 子包选项 2. Summary 此域必须在%package下面,它定义子包功能简介(一句话说明)。格式为: Summary : 子包简介 3. Group 此域必须在%package下面,其定义子包所属软件类别(软件类别请参见<<精通RPM之五--查询篇>>)。格式为: Group : 软件类别 4. %description : 此描述段的内容是较为详细的子包功能介绍,介绍为文本形式,格式不作要求,可任意换行或分段。格式为: %description 子包选项 ...介绍子包功能的内容... 5. %files : 此文件段的内容是子包所要包含的文件列表。文件列表中,一个文件占用一行,还可使用多种文件修饰符。(详见<<精通RPM之七--制作篇(上)>>) 段名应用格式为: %files 子包选项 [-f 文件名] 注意: 上述%description与%files段所用的子包选项形式,必须与%package所用的子包选项形式一致,否则的话,它们定义的不是同一个子包,RPM检查时将报错退出。如定义过%package name后,描述段名须用%description name,文件段名须用%files name方可。而用%description -n name则不行,%files -n name也不行。 子软件包也可使用%pre,%post,%preun,%postun,%triggerin,%triggerun和%triggerpostun等七个可选的功能段,因为它们都可使用子包选项。当使用子包选项时,它们的段内容就是用来管理子软件包的脚本程序。要注意的是,这些段使用的子包选项形式也必须与%package段使用的子包选项形式一致。 条件语句的使用 在软件包描述文件中,可以灵活地使用条件语句,位置不限制。这些语句,用于当前体系与操作系统的判断,当条件为真或为假时,RPM均会引用其相应的描述内容。 条件语句有两种格式: 1. 值1 [值2] ... 描述内容 %endif 注: {}所括内容必选其中之一,[]所括为可选项,各个值之间以空格分隔,%endif表示条件语句结束。 此语句的含义是: 1) 使用%ifarch时,表示如果当前体系为值1或值2...,则引用描述内容。 2) 使用%ifnarch时,表示如果当前体系不为值1或值2...,则引用描述内容。 3) 使用%ifos时,表示如果当前操作系统为值1或值2...,则引用描述内容。 4) 使用%ifnos时,表示如果当前操作系统不为值1或值2...,则引用描述内容。 如果想在LZE包描述文件的文件段增加只适用于sparc体系的文件/etc/sparc.lze和 /etc/sparc.ime,则可在文件段内加入如下语句: %ifarch sparc /etc/sparc.lze /etc/sparc.ime %endif 这样做以后,如果当前体系为sparc,则RPM在打包时会加入这两个文件。 2. 值1 [值2] ... 描述内容1 %else 描述内容2 %endif 注: {}所括内容必选其中之一,[]所括为可选项,各个值之间以空格分隔,%else表示另外一种情况,%endif表示条件语句结束。 此语句的含义是: 1) 使用%ifarch时,表示如果当前体系为值1或值2...,则引用描述内容1,否则引用描述 内容2。 2) 使用%ifnarch时,表示如果当前体系不为值1或值2...,则引用描述内容1,否则引用描述内容2。 3) 使用%ifos时,表示如果当前操作系统为值1或值2...,则引用描述内容1,否则引用描述内容2。 4) 使用%ifnos时,表示如果当前操作系统不为值1或值2...,则引用描述内容1,否则引用描述内容2。 如果想根据当前操作系统来确定LZE包的名字,则可在描述文件头使用如下语句定义Name域: %ifos linux Name : lzeforlinux %else %ifos aix Name : lzeforaix %else Name : lzeforothersys %endif %endif 本例中使用了嵌套的条件语句,它说明的情况是:如果操作系统为linux,则软件名定为lzeforlinux,如果操作系统为aix,则软件名定为lzeforaix,如果不是上述两个操作系统,则将软件名定为lzeforothersys。 如何在描述文件中使用宏(macros) 1. 宏是什么? 学过C语言的人都知道,宏是用来实现文本替换的,即定义了宏名与宏体后,文件中所有有宏名的地方在预处理时将被宏体替换掉。使用宏可以减少文字的录入量,方便了编程人员。在软件包描述文件中使用宏,也是基于这个目的,只不过这个宏与C语言的宏定义格式不同而已。 2. 宏的定义 描述文件中宏的定义格式为: %define [(opts)] 注: []所括为可选项。为宏名,宏名可用字母,数字和下划线(_),并且其长度最小为3。opts为一个或多个选项,各选项之间无分隔,选项采用getopt函数要求的形式,即选项为单个字符,如果某个选项需要参数,则需要在这个选项后加个冒号(:)。为宏体,它周围的空字符将被删掉。宏体的内容须在一行上。 如没有选项的宏定义: %define aaa This is my software 如仅有一个选项的宏定义: %define xxx(p:Z) echo %} % 3. 宏的使用 宏的使用格式为: % [opt1] [opt2]... [arg1] [arg2]... 或 %{} [opt1] [opt2]... [arg1] [arg2]... 注: []所括为可选项;为所应用的宏名,宏名可以用{}括住;opt1,opt2...为选项,均须以减号(-)开头,并且如果选项需要参数,则必须提供一个选项参数;arg1,arg2...则为宏的参数。 如上面定义的xxx宏,可这样使用: %xxx -p zhsoft hello world< br> 例子中,xxx宏使用一个选项-p,zhsoft为-p选项的参数,还有两个宏的参数hello和world。 注意: 宏使用时最好多换一行(即宏下面空一行),因为宏在扩展后并不换行,这样如果不多换行,则下面一行若有内容的话,宏扩展后的内容将和下面一行的内容合并在一起,极容易出现错误。这也是笔者发现RPM宏的问题之一。还有一个问题,如果注释行上存在宏,则这个宏也将扩展,错矣!因为注释本来就是要忽略掉的,有宏也不必再扩展了。这两个问题都需要引起RPM开发者的注意,并切实加以解决。 4. 宏体专用的宏宏体中可使用如下专用的宏:(类似SHELL形式的宏) 1) %0 : 表示所在宏的宏名; 2) %* : 表示宏的所有参数; 3) %# : 表示宏的参数个数; 4) % : 表示如果宏使用了-f选项,则它表示-f及其选项参数; 5) % : 表示如果宏使用了-f选项,则它表示-f所带的参数; 6) % : 表示如果宏使用了-f选项,则它表示X; 7) % : 表示如果宏没有使用-f选项,则它表示Y; 8) %1,%2,... : 表示宏的参数1,参数2... 如,上例中xxx宏执行时,若宏体中有上述专用的宏,则专用宏将会扩展为: 1) %0扩展为xxx; 2) %*扩展为hello world; 3) %#扩展为2; 4) %扩展为-p zhsoft; 5) %扩展为zhsoft; 6) %扩展为good; 7) %扩展为bad; (因为xxx宏未使用-Z选项) 8) %1为hello,%2为world,没有其它参数。 5. 系统内置的宏 系统内置的宏可分如下三类: 5.1 定义类 1) %define ... : 定义一个宏;(原来,%define也是一个宏啊) 2) %undefine ... : 取消一个宏;(宏取消后,此语句下面的描述文件就不能再使用这个宏了,即使使用,该宏也不会被扩展了) 5.2 调试类 1) %trace : 打印宏扩展前后的调试信息; 2) %dump : 打印活动的宏(宏名及宏体); 3) % : 打印...到标准错误设备; 4) % : 打印...到标准错误设备; 5) % : 打印...到标准错误设备,并且返回BADSPEC值; 5.3 特殊类这类宏的默认值通常放在/usr/lib/rpm/macros文件中,用户通过编辑自己主目录(HOME)下的.rpmmacros文件(~/.rpmmacros),可重定义这类宏,改变其默认值,以供RPM在软件包制作,安装及查询时使用自己的定义。 这类宏的定义格式为: % 注: 为宏名,为宏体。 1) %packager,%vendor,%distribution : 这三个宏用于定义描述文件中Packager,Vendor,Distribution三个可选域的默认的域值,即如果这三个域中有哪个未在描述文件中定义,且其相对应的宏有定义,则RPM会采用其对应的宏的宏体。 如我的~/.rpmmacros文件中有这样三行: %vendor 纵横软件制作中心 %packager 雨亦奇 %distribution 小赵'2001 这样,软件包描述文件中再也不用定义那三个域了,由此制作出来的软件包在查询时,其打包者(Packager),销售商(Vendor)及发行版(Distribution)均自动搞定了,一劳永逸。 2) %buildroot,%_provides : 这两个宏定义软件包建包时用的根目录及软件包所提供的功能。它们在打包时不会象 上面那三个宏一样主动被RPM采用,而是必须在描述文件中写那么几行。即: %vendor 纵横软件制作中心 %packager 雨亦奇 %distribution 小赵'2001 Buildroot : %buildroot Provides : %_provides 3) %_topdir,%_builddir,%_rpmdir,%_sourcedir,%_specdir,%_srcrpmdir : 这六个宏都是RPM制作软件包时要用的,它们在/usr/lib/rpm/macros文件中的默认值为: %_topdir %/dist %_builddir %/BUILD %_rpmdir %/RPMS %_sourcedir %/SOURCES %_specdir %/SPECS %_srcrpmdir %/SRPMS %_topdir宏定义的是RPM制作软件包时所用目录的顶层目录,一般为/usr/src/dist(% 宏的值为/usr/src)。在顶层目录下面,又有五个子目录: 编译连接源程序时用的目录,由%_builddir宏定义,常用BUILD; 生成的RPM执行程序包存放的目录,由%_rpmdir宏定义,常用RPMS; 软件源程序存放的目录,由%_sourcedir宏定义,常用SOURCES; 软件包描述文件存放的目录,由%_specdir宏定义,常用SPECS; 生成的RPM源程序包存放的目录,由%_srcrpmdir宏定义,常用SRPMS。 由于宏的递归特性,我们可以通过只定义%_topdir宏来达到改变%_builddir等五个宏的目的。(注意:%_builddir等五个宏的宏体如无特殊要求,尽量不要改变,它们是标准的定义,应该采用)这对于普通用户来说,意义非常重大。因为RPM默认的顶层目录/usr/src/dist并不是每个用户都可以随便使用的,普通用户更想在自己所有的目录下用RPM来制作些软件包。我也有这种想法,所以在~/.rpmmacros文件里加上这么一行: %_topdir /usr/zzz/rpm 同时,在此宏定义的目录下面建立了RPM所需的子目录,使用命令为: $ cd /usr/zzz $ mkdir -p rpm/ $ 命令中的i386是RPM默认的体系名,RPM生成的执行程序包是存放在“RPMS/体系名”目录下面的。这么做以后,我就可以在自己的目录下制作RPM软件包了,象超级用户一样自由。 4)%_excludedocs,%_ftpport,%_ftpproxy,%_httpport,%_httpproxy,%_netsharepath : 这六个宏对RPM软件包的安装和查询起作用。 %_excludedocs : 如果其值定义为1,则RPM安装软件包时,对说明文档的默认作法是不安装; %_ftpport : 此宏用于定义RPM默认的FTP端口; %_ftpproxy : 此宏用于定义RPM默认的FTP代理服务器; %_httpport : 此宏用于定义RPM默认的HTTP端口; %_httpproxy : 此宏用于定义RPM默认的HTTP代理服务器; %_netsharepath : 此宏用于定义RPM默认的网络共享目录,适用于网络文件系统(NFS)。 6. 一种特殊的宏这种宏的用法是: %(SHELL命令及其参数) 它的结果是取指定的SHELL命令的标准输出的结果作为描述文件内容的一部分。如软件包描述文件的某个部分需要加上当前日期,则可以用: %(date +%Y-%m-%d) 执行后,该宏将扩展为类似2001-10-31的日期数据。用户不妨在自己的描述文件的预处理段(%prep)内加上这么两行试试: %(date +%Y-%m-%d) exit 1 注: exit 1用于中止RPM的执行。 描述文件模板以下所有描述文件模板均以LZE软件包制作为例,以源程序现场编译后产生的文件为准生成软件包。描述文件中一般只描述必要的部分。另外,如果文件段的所有文件已存在于系统中,并且想直接利用打包,则可以去掉Source域,去掉RPM建包用功能段(%prep,%build,%install,%clean)。 1. 只有父包,没有任何子包: 此描述文件见<<精通RPM之七--制作篇(上)>>。此文件中还可以去掉几个可选的功能段, 如%pre,%post,%preun,%postun,%triggerin,%triggerun,%triggerpostun。这几个段在此文件中无实质用途,执行时仅显示RPM开始执行某个脚本程序的信息。此描述文件仅生成软件包lze-6.0-2.i386.rpm(父包)。 2. 有父包,也有子包: 描述文件如下: 1 # 文件名称: lze-6.0-2.spec1 2 # 文件功能: lze软件包描述信息 3 # 文件作者: 纵横软件制作中心雨亦奇 国防大学研究生二队赵建利 4 # 修改时间: 2001.10.31 5 6 Name: lze 7 Version: 6.0 8 Release: 2 9 Summary: 小赵全屏幕中英文多窗口多功能编辑器(LINUX/UNIX系统适用) 10 Group: Applications/Editors 11 License: Share 12 Source: http://zhsoft.myetang.com/lze-6.0-2.src.tgz 13 14 %description 15 小赵编辑器,是为使用SCO UNIX,LINUX多用户系统的广大用户专门设计的全屏幕多窗 16 口中英文多功能编辑器。 17 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十 18 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特 19 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎 20 添翼。10.即时翻译,按到即译。 21 总之,小赵编辑器会成为您在UNIX,LINUX系统上编制程序和书写一般性文稿的好帮手。 22 它将在工作中助您一臂之力,轻松上阵,游刃有余! 23 24 %prep 25 echo 预处理脚本程序(prep)开始执行 26 %setup 27 28 %build 29 echo 编译连接脚本程序(build)开始执行 30 make 31 32 %install 33 echo 安装脚本程序(install)开始执行 34 make install 35 36 # 配置文件子包 37 %package config 38 summary : 小赵编辑器LZE的配置文件 39 group : Applications/Editors 40 41 %description config 42 小赵编辑器用配置文件包括功能键定义文件与 43 输入法控制文件,用户可根据实际情况加以修改。 44 45 %files config 46 %config /etc/funkey.def 47 %config /etc/inputme.def 48 49 # 说明文档子包 50 %package doc 51 summary : 小赵编辑器LZE的说明文档 52 group : Applications/Editors 53 54 %description doc 55 小赵编辑器说明文档,详细介绍了该编辑器的 56 命令行用法及内置的各项菜单的功能与操作,对用 57 户熟悉小赵编辑器有很大作用。 58 59 %files doc 60 %doc /usr/doc/lze-6.0/README 61 %doc /usr/doc/lze-6.0/LICENSE 62 63 # 父包文件段 64 %files 65 %defattr (-,root,root) 66 /usr/bin/lze 67 /usr/bin/lzeime.py 68 /usr/bin/lzeime.wb 69 /etc/wbzc.dat 70 此描述文件生成软件包有:lze-6.0-2.i386.rpm(父包),lze-config-6.0-2.i386.rpm(配置文件子包)和lze-doc-6.0-2.i386.rpm(说明文档子包)。 3. 没有父包,只有子包: 没有父包,意味着描述文件中可以没有父包的文件段(%files),请看下面的描述文件: 1 # 文件名称: lze-6.0-2.spec2 2 # 文件功能: lze软件包描述信息 3 # 文件作者: 纵横软件制作中心雨亦奇 国防大学研究生二队赵建利 4 # 修改时间: 2001.10.31 5 6 Name: lze 7 Version: 6.0 8 Release: 2 9 Summary: 小赵全屏幕中英文多窗口多功能编辑器(LINUX/UNIX系统适用) 10 Group: Applications/Editors 11 License: Share 12 Source: http://zhsoft.myetang.com/lze-6.0-2.src.tgz 13 14 %description 15 小赵编辑器,是为使用SCO UNIX,LINUX多用户系统的广大用户专门设计的全屏幕多窗 16 口中英文多功能编辑器。 17 它主要有以下十大特点:1.全屏幕菜单操作。2.显示方式多样。3.块操作丰富。4.十 18 字制表功能强大。5.多窗口操作灵活自如。6.文件操作功能齐全。7.解释输出功能独具特 19 色。8.自带中文输入法(增强五笔和增强拼音),实用方便。9.十六进制编辑功能,如虎 20 添翼。10.即时翻译,按到即译。 21 总之,小赵编辑器会成为您在UNIX,LINUX系统上编制程序和书写一般性文稿的好帮手。 22 它将在工作中助您一臂之力,轻松上阵,游刃有余! 23 24 %prep 25 echo 预处理脚本程序(prep)开始执行 26 %setup 27 28 %build 29 echo 编译连接脚本程序(build)开始执行 30 make 31 32 %install 33 echo 安装脚本程序(install)开始执行 34 make install 35 36 # 配置文件子包 37 %package config 38 summary : 小赵编辑器LZE的配置文件 39 group : Applications/Editors 40 41 %description config 42 小赵编辑器用配置文件包括功能键定义文件与 43 输入法控制文件,用户可根据实际情况加以修改。 44 45 %files config 46 %config /etc/funkey.def 47 %config /etc/inputme.def 48 49 # 说明文档子包 50 %package doc 51 summary : 小赵编辑器LZE的说明文档 52 group : Applications/Editors 53 54 %description doc 55 小赵编辑器说明文档,详细介绍了该编辑器的 56 命令行用法及内置的各项菜单的功能与操作,对用 57 户熟悉小赵编辑器有很大作用。 58 59 %files doc 60 %doc /usr/doc/lze-6.0/README 61 %doc /usr/doc/lze-6.0/LICENSE 62 63 # 执行程序子包 64 %package bin 65 summary : 小赵编辑器LZE的执行程序 66 group : Applications/Editors 67 68 %description bin 69 小赵编辑器执行程序为lze,五笔输入法服务器执行程序 70 为lzeime.wb,拼音输入法服务器执行程序为lzeime.py。 71 72 %files bin 73 %defattr (-,root,root) 74 /usr/bin/lze 75 /usr/bin/lzeime.py 76 /usr/bin/lzeime.wb 77 /etc/wbzc.dat 78 此描述文件生成三个软件包:lze-config-6.0-2.i386.rpm(配置文件子包),lze-doc-6.0-2.i386.rpm(说明文档子包),lze-bin-6.0-2.i386.rpm(执行程序子包)。要想制作RPM格式的软件包,需使用如下命令格式: rpm-bX[制作选项1制作选项2...]描述文件1描述文件2... 注:-bX可用-tX替换,效果有所不同:使用-b时,需要在命令行上指定软件包描述文件;而使用-t时,在命令行上需要指定的不是软件包描述文件,而是含有此描述文件的TAR格式的包裹文件(必须用gzip压缩),RPM在准备制作软件包时,会自动从此包裹文件中提取描述文件,根据其中的建包指令,生成RPM格式的软件包。注意:此描述文件必须以.spec为后缀,其中必须有Source域,并且此域定义的源程序包必须存放在当前目录下,否则的话,RPM将报错退出。注意,-bX与-tX当中的X,取不同的值时,RPM将执行不同的操作:(下面各个例子均对LZE的描述文件lze-6.0-2.spec进行操作,有的则通过管道技术,用nl命令给输出加上行号,以便解释) 1)X=p时,指示RPM执行描述文件中的预处理段(%prep)的脚本程序。该脚本程序一般用来解压源程序包,并且为源程序打补丁,升级源程序。 #rpm-bplze-6.0-2.spec2>&1|nl 1Executing:%prep 2+umask022 3+cd/usr/src/dist/BUILD 4+echo'预处理脚本程序(prep)开始执行' 5预处理脚本程序(prep)开始执行 6+cd/usr/src/dist/BUILD 7+rm-rflze-6.0 8+/bin/gzip-dc/usr/src/dist/SOURCES/lze-6.0-2.src.tgz 9+tar-xvvf- 10drwxr-xr-xroot/root02001-11-0216:02lze-6.0/ 11-rw-------root/root2462262001-11-0216:00lze-6.0/lze.c 12-rw-------root/root982492001-11-0216:00lze-6.0/lzeime.wb.c 13-rw-------root/root3399022001-11-0216:00lze-6.0/lzeime.py.c 14-rw-r--r--root/root12832001-11-0216:00lze-6.0/funkey.def 15-rwxr--r--root/root2502001-11-0216:00lze-6.0/inputme.def 16-rw-r--r--root/root8132742001-11-0216:00lze-6.0/wbzc.dat 17-rw-------root/root4742001-11-0216:02lze-6.0/makefile 18+STATUS=0 19+'['0-ne0']' 20+cdlze-6.0 21++/usr/bin/id-u 22+'['0=0']' 23+/bin/chown-Rhfroot. 24++/usr/bin/id-u 25+'['0=0']' 26+/bin/chgrp-Rhfroot. 27+/bin/chmod-Rfa+rX,g-w,o-w. 28+exit0 # 注:本例中第1行显示的Executing:%prep表明RPM开始执行预处理段的脚本程序。例中行号后那些以加号(+)开始的行均为预处理段脚本程序的指令,其它内容则为指令执行所输出的结果。从预处理段脚本程序所执行的指令,我们就可以看出RPM正在做什么: 第2行:设置文件创建掩码; 第3行:转到RPM默认的编译目录; 第4行:回显字符串,这才是用户所写的预处理段脚本程序的开始,第2,3行均是RPM增加的指令; 第6-27行:为%setup所扩展出来的指令及其执行结果,其中可以看到RPM用gzip命令解压LZE的源程序包(第8行),而后用tar命令展开源程序包(第9行)。第28行:正常退出,返回值为0。 2)X=l
-
2005-12-22
Linux文件系统的反删除方法
Ext3文件系统结构的简单介绍 在Linux所用的Ext3文件系统中,文件是以块为单位存储的,默认情况下每个块的大小是1K,不同的块以块号区分。每个文件还有一个节点,节点中包含有文件所有者,读写权限,文件类型等信息。对于一个小于12个块的文件,在节点中直接存储文件数据块的块号。如果文件大于12个块,那么节点在12个块号之后存储一个间接块的块号,在这个间接块号所对应的块中,存储有256个文件数据块的块号(Ext2fs中每个块号占用4字节,这样一个块中所能存储的块号就是1024/4=256)。如果有更大的文件,那么还会在节点中出现二级间接块和三级间接块。 2。恢复被误删文件的方法 大多数Linux发行版都提供一个debugfs工具,可以用来对Ext3文件系统进行编辑操作。不过在使用这个工具之前,还有一些工作要做。 首先以只读方式重新挂载被误删的文件所在分区。使用如下命令:(假设文件在/usr分区) mount -r -n -o remount /usr -r表示只读方式挂载;-n表示不写入/etc/mtab,如果是恢复/etc上的文件,就加上这个参数。如果系统说xxx partion busy,可以用fuser命令查看一下是哪些进程使用这个分区上的文件: fuser -v -m /usr 如果没有什么重要的进程,用以下命令停掉它们: fuser -k -v -m /usr 然后就可以重新挂载这些文件系统了。 如果是把所有的文件统一安装在一个大的/分区当中,可以在boot提示符下用linux single进入单用户模式,尽量减少系统进程向硬盘写入数据的机会,要不干脆把硬盘挂在别的机器上。另外,恢复出来的数据不要写到/上面,避免破坏那些有用的数据。如果机器上有dos/windows,可以写到这些分区上面: mount -r -n /dev/hda1 /mnt/had 然后就可以执行debugfs:(假设Linux在 /dev/hda5) #debugfs /dev/hda5 就会出现debugfs提示符debugfs: 使用lsdel命令可以列出很多被删除的文件的信息: debugfs:lsdel debugfs: 2692 deleted inodes found. Inode Owner Mode Size Blocks Time deleted 164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001 ………………………………………………………………………………… 36137 0 100644 4 1/ 1 Tue Apr 24 10:11:15 2001 196829 0 100644 149500 38/ 38 Mon May 27 13:52:04 2001 debugfs: 列出的文件有很多(这里找到2692个),第一字段是文件节点号,第二字段是文件所有者,第三字段是读写权限,接下来是文件大小,占用块数,删除时间。然后就可以根据文件大小和删除日期判断那些是我们需要的。比如我们要恢复节点是196829的文件: 可以先看看文件数据状态: debugfs:stat Inode: 196829 Type: regular Mode: 0644 Flags: 0x0 Version: 1 User: 0 Group: 0 Size: 149500 File ACL: 0 Directory ACL: 0 Links: 0 Blockcount: 38 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x31a9a574 -- Mon May 27 13:52:04 2001 atime: 0x31a21dd1 -- Tue May 21 20:47:29 2001 mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 2001 dtime: 0x31a9a574 -- Mon May 27 13:52:04 2001 BLOCKS: 594810 594811 594814 594815 594816 594817 …………………………………. TOTAL: 38 然后就可以用dump指令恢复文件: debugfs:dump /mnt/hda/01.sav 这样就把文件恢复出来了。退出debugfs: debugfs:quit 另一种方法是手工编辑inode: debugfs:mi Mode [0100644] User ID [0] Group ID [0] Size [149500] Creation time [0x31a9a574] Modification time [0x31a9a574] Access time [0x31a21dd1] Deletion time [0x31a9a574] 0 Link count [0] 1 Block count [38] File flags [0x0] Reserved1 [0] File acl [0] Directory acl [0] Fragment address [0] Fragment number [0] Fragment size [0] Direct Block #0 [594810] ……………………………. Triple Indirect Block [0] 使用mi指令后每次显示一行信息以供编辑,其它行可以直接按回车表示确认,把deletion time改成0(未删除),Link count改成1。改好后退出debugfs: debugfs:quit 然后用fsck检查/dev/hda5 fsck /dev/hda5 程序会说找到丢失的数据块,放在lost+found里面。







