Silver之墨尔本
也许一个人的生活是孤独的,但同时也是值得品味的

My Links

Blog Stats
  • Posts - 138
  • Stories - 0
  • Comments - 293
  • Trackbacks - 0
News
  • Visit No.

     

    MCSE 2003
    Security Certificated

     

    CCNA Certificated

     

    Novell Administrator
    Certificated

     

    ITIL Foundation
    Certificated

    Google

存档

日记 分类

 
【Linux 学习笔记 8】Linux 启动器的结尾

“我是我的大名是”那声音迟疑了片刻,听起来有些困惑,咕喊道。“我昨天还知道的……”
——费资本
《龙枪》系列

坚持是最宝贵,也是最难的。通常我们以为我们只是”忘记“了学习, 其实,我们只是听不见在我们内心深处希望学习的呐喊而已。
-----Silver

2天前偶错了关于GRUB的实验。结果实验失败了。后来看了不少资料,再次做这个实验,竟然成功,而且理解了。
现在偶就对偶自己做的实验谈一下错误问题:
1)遭遇no corresponding BIOS DRIVE
IBM 笔记上说,使用grub-install /dev/fd0命令,偶就遇到了no corresponding BIOS DRIVE的错误。 其实,应该在执行这个命令前,应该修改/boot/grub/device.map。在里面添加一句(fd0) /dev/fd0 这样,GRUB才能认出/dev/fd0。因为GRUB是使用的自己的命令系统。

2) 遭遇drive busy错误
要记得用umount /dev/fd0 进行卸载。不然,Linux自己已经调用了,就无法让grub进行使用

3) 软盘在做了install后,还是空的
这个偶的结果不同。偶在执行完毕install后,grub自动在软盘根目录下生成了boot,然后自动把/boot/grub/下面的东西都复制到软盘/boot/下面。偶使用的是0.97版本。估计是因为版本关系吧。

4) 做这个实验会导致机器无法启动
在初期做这个实验的时候,使用完了grub-install命令。发现无法进入系统,系统就是显示grub ,然后就死机了。 这个是因为由于grub-install命令没有执行成功。 系统MBR指向错误。所以,就必须进入rescue方式,重新指向。

好,我们接下来继续来看....

系统更新

大部分的GRUB版本都提供了更新系统的工具。 这些工具通常会意识到引导器已经被使用,并且会自动更新你的配置文件。如果你自己定制了内核,或者希望用一个非标准的配置文件(非标准的名字和路径), 如果在这样的话,你可能就需要手动配置你的文件。

1.如果你使用LILO,你必须在你更新你的配置文件后,或者增加硬盘,删除分区后,运行lilo命令。
2. 如果你使用的是GRUB, 你可以编辑/boot/grub/grub.conf文件来实现你的改变。 GRUB的stage 2的读取器会在启动的时候读取你的配置文件。 一般来说,你不需要重新安装GRUB, 如果你只是更新一下内核。 记住Stage 1的读取器(MBR读取器)是非常小的,因此,它只有Stage 2的读取器所在的地址信息。 如果移动分区造成地址改变,Stage 1就可能无法找到Stage 2. 我们在以后讨论到GRUB Stage 1.5的时候会谈到。


系统恢复
我们现在来看一下你可能会遭遇到的错误,尤其当你安装多个操作系统的时候。
这里有三步曲和一些工具会让你知道,当一个人能够实际的面对电脑的时候,他到底可以做那些事情。 同样,任何一个有权限使用grub命令行的人一样可以访问你的系统你的系统,或者其他的机要区域。 必须要小心选择启动器。

重复安装会摧毁你的MBR
有 时候, 你会安装另外一个系统。并且不可避免的会覆盖MBR。 一些系统,比如DOS和windows,总是安装他们自己的MBR。通常,恢复正常状态并不难。如果你能够有习惯每次运行lilo或者重装GRUB的时 候,都创建一张软盘的话,你就可以解决问题。只要用软盘启动到你的Linux 系统然后运行lilo或者grub-install,就可以了。

如 果你没有一个启动软盘,但是你还有Linux的安装盘,一般来说,你可以说哦用recovery模式。 当你这么做的时候,你硬盘上的根目录文件系统会被挂载莫格陌生的回复点(/mnt/sysimage)里面,或者根本就不挂载。 你可能需要使用chroot命令来把这个奇怪的挂载点变成root(/)目录。 然后运行lilo或者运行grub-install来建立一个新的软盘,或者重新安装MBR。 我个人倾向建立一个新的软盘,然后用它来启动,保证一切都还在,然后重新写入MBR。
Listing 9. Using a rescue disk and chroot.
sh-3.00# chroot /mnt/sysimage
sh-2.05b# lilo
Added linux *
Added WIN-XP
sh-2.05b# grub-install '(fd0)'
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/hda
(hd1) /dev/hdc
(hd2) /dev/
一旦你有了可以启动的软盘,按ctrol-d来从chroot里面退出,并且重新启动你的系统。
如 果你希望知道如何用你的MBR启动WIN2K或者WINXP系统,并且安装lilo或者grub到一个分区引导表。 你可以用ntldr启动程序来chain load链入其他的引导扇区。 你需要把启动扇区复制到一个windows分区,并且修改隐藏的boot.ini文件。

如果你删除了一个分区
如果你删除了一个分 区,并且忘记设置启动,你可能会有一些临时的问题。 很典型的问题就是,LILO或者GRUB无法调取。 LILO会显示‘L’表示stage 1是读取并且暂停了。GRUB会给你一个错误的信息。那么stage 1到底发生了什么事情呢? Stage 1有一串扇区地址列表要读取,并进入Stage 2的读取器。而当问题发生后, 地址所指向的扇区里面已经没有了stage 2的特征了。 如果你按照上面的方法搭建启动磁盘,你必须记住LILO和GRUB只是在硬盘的启动扇区里面放了stage 2的数据。 如果出了问题,就需要使用rescue盘来进行修复MBR,重新安装引导器。

使用/boot 分区
另一个回复的方法,或者 说,来避免出错的方法,就是用一个单独的/boot分区。 这个分区不需要很大。一般大概100MB空间就可以了。把这个空间放到一个不太可能被移除的地方,而且它的分区号也不会因为添加新的硬盘而更改。 在一个混合了windows和Linux的环境, /dev/hda2是经常称为/boot的一个很好的选择。
另外一个需要/boot分区的原因是,当你用一个不被你启动器所支持的文件系统来启动,你也需要它。举例来说, 当根分区(/)是使用LVM的话,/boot分区经常是ext2或者ext3格式。

如 果你在系统里面有多个版本的软件,记得不要共享/boot分区。 要设置LILO或者GRUB来启动后来要成为/boot分区的那个分区。 记住要为那个通常更新LILO或者GRUB的系统更新程序。 另外的一个方法是让每个系统都安装启动引导到他们自己的分区引导纪录, 并且设置你的主系统进行chain load分区记录表, 这个给你2部的菜单进程。

最后,我们来看一下一个完整的启动
还是 把注意力放在GRUB,如果制作一个单独启动盘,无论发生什么,都回给你GRUB提示。 必须要注意柱面的问题。在许多UNIX和LINUX系统里面,文件的布局是存储在一个叫做superblock里面。 这个superblock通常是放在文件系统里面的第一个存储单位。 对于像ext2或者ext3的文件系统,有着超级庞大的硬盘, 这个硬盘会被分割成几个区域, superblock会被复制到到每个区域的开始。这样,即使有人用类似于fdisk混乱了分区边界,系统也能够恢复。


另外一个关于柱面的用法是在磁盘MBR的后面。 GRUB利用这个空间放入了stage 1.5的读取器,或者就是占用这个空间,以备以后使用。 这个stage 1.5读取器知道stage 2分区里面的文件系统, 所以, 如果GRUB程序被移除,它依旧会提供更多的保护。

那么以上这些和启动软盘又有什么关系呢?软盘是没有如此多的空间或者那么多的柱 面,因此,如果你想从软盘启动grub 的stage 1和stage 2, 你需要安装stage 1并且复制stage 2的内容到紧接着的扇区。 记得使用空白磁盘。 你应当从grub的安装包里面复制文件,而不是从/boot/grub子目录,因为那些文件已经根据你的硬盘做过修改。 你可以在/usr/share/grub里面找到原始的文件。 在我们的例子里面, 它在/usr/share/grub/i386-redhat里面
Listing 10. Creating a GRUB boot floppy.
[root@lyrebird root]# ls /usr/share/grub
i386-redhat
[root@lyrebird root]# cd /usr/share/grub/i386-redhat
[root@lyrebird i386-redhat]# ls -l st*
-rw-r--r-- 1 root root 512 Aug 3 2004 stage1
-rw-r--r-- 1 root root 104092 Aug 3 2004 stage2
[root@lyrebird i386-redhat]# dd if=stage1 of=/dev/fd0 bs=512 count=1
1+0 records in
1+0 records out
[root@lyrebird i386-redhat]# dd if=stage2 of=/dev/fd0 bs=512 seek=1
203+1 records in
203+1 records out

确保磁盘是空, 然后装载软盘。 挂载命令会给你报错。 因为把stage 2的文件复制到启动扇区后面(seek=1)会摧毁你磁盘上的文件系统。

如果你现在用这个磁盘齐达内噢乖,你会注意到当读取stage 2的时候会有一个延迟。 你可以用这这个软盘在任何一台机器启动,你会得到一个GRUB 启动器的提示。 TAB键调出可以使用的菜单。

grub> help rootnoverify
rootnoverify: rootnoverify [DEVICE [HDBIAS]]
Similar to `root', but don't attempt to mount the partition. This
is useful for when an OS is outside of the area of the disk that
GRUB can read, but setting the correct root device is still
desired. Note that the items mentioned in `root' which derived
from attempting the mount will NOT work correctly.
grub> find /boot/grub/grub.conf
(hd0,2)
(hd0,6)
(hd0,7)
(hd0,10)
(hd1,7)
grub>

在这个例子里面,我发现在4个不同的分区上(第一硬盘)和第二硬盘上面的一个分区有GRUB配置文件。 我们会用其中一个配置文件来调用菜单。
比如说: configfile(hd0,2) /boot/grub/grub.conf

如果你想配置一个完整的软盘来启动,你可以这么做:
1)使用mkdosfs命令来创建一个DOS FAT文件系统,并用-R来保留足够的扇区为了以后的stage 2的文件
2) 挂上磁盘
3)建立一个/boot/grub目录
4)复制GRUB Stage 1, Stage 2和grub.conf的文件到软盘的boot/grub目录里面。 复制splashimage文件到相同的目录
5)编辑grub.conf文件,让splash文件指向软盘
6)umount软盘
7)使用grub命令来配置GRUB,使用root和setup命令
Listing 12. Installing GRUB on diskette with a filesystem.
[root@lyrebird root]# mkdosfs -R 210 /dev/fd0
mkdosfs 2.8 (28 Feb 2001)
[root@lyrebird root]# mount /dev/fd0 /mnt/floppy
[root@lyrebird root]# mkdir /mnt/floppy/boot
[root@lyrebird root]# mkdir /mnt/floppy/boot/grub
[root@lyrebird root]# cp /boot/grub/stage1 /mnt/floppy/boot/grub
[root@lyrebird root]# cp /boot/grub/stage2 /mnt/floppy/boot/grub
[root@lyrebird root]# cp /boot/grub/splash* /mnt/floppy/boot/grub
[root@lyrebird root]# cp /boot/grub/grub.conf /mnt/floppy/boot/grub
[root@lyrebird root]# umount /dev/fd0
[root@lyrebird root]# grub
Probing devices to guess BIOS drives. This may take a long time.
GRUB version 0.93 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]
grub> root (fd0)
Filesystem type is fat, using whole disk
grub> setup (fd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/fat_stage1_5" exists... no
Running "install /boot/grub/stage1 (fd0) /boot/grub/stage2 p /boot/grub/grub.c
onf "... succeeded
Done.

终于,GRUB结束了。搞了偶N天(自己偷懒了N天,-_-b)

Section 4:制作与安装程序

在这个章节,偶们会学习如何从源里面构建并且安装一个可执行程序。 你会学习到如何解压缩一个典型的源安装包和自定义文件。
首先,为什么我们需要从源里面安装文件?
1)你需要一个不在你Linux安装包里面的程序。
2)你需要一个源程序
3) 你需要一个只是通过源程序重新编译才能用的程序
4)你希望呀知道程序如何工作的

下载和解压缩

不管你重新编译的原因是什么,你需要在编译之前得到源文件。 你可能在一些网站上找到源文件,比如Open Source Technology Groups SourceForge.net或者其他网站。

在 这个章节,我们会看包文件的发布版本,也叫做tarballs。 这个tar(就是Tape Archine)命令是用来从一个目录里面来创建和操作的。 不管名字是什么,这些文件可以被存储在任何介质上。 实际上, 允许他们放在磁盘上,才可以对他们进行曹祖。 比如删除文档的一部分, 在Tape上原来是不可能实现的。 tar命令本身是不会压缩文件的, 它仅仅只是用来存储原来文件的文件,权限,目录结构等。 一般来说,gzip和bzip2来建一个压缩文档。 这样一个被压缩的文件,就是称为tarball。

除了简单的tarballs, 一个特殊程序的源文件可能是放在源文件包里面。 ,比如一个源文件RPM(或者叫做SRPM)。 我们会讨论到这个方面。 现在,就只是记住要检查针对你目前的版本,的源包裹文件是否存在,因为这个是一个最简单的方法来编译一个程序。 因为它已经为了你的文件系统的布局而进行了调整。

在你下载之前, 尝试学习尽可能多的包裹。 如果有一个新的安装或者编译文档存在,你必须检查你是否需要其他文件才能对当前文件进行编译。通常的是,你也需要安装几个库文件或者开发工具在你成功的编译你的程序之前。 尤其是当你的程序需要图像界面支持的话。

你可能需要用你的浏览器下载程序。 你的下载包可能有下列名字。 tar, tar.gz, tar.Z, tgz,或者tar.bz2。 有时候,你会下载一个包用CVS(concurrent version System). 有时候,你也可能发现一个zip包。

已经被压缩的tar文件

已 经被压缩的tar文件或者称为tarballs是最为常见的源文件发布版本的形式。 大多数类似于RED HAT'S RPM和Debian's的文件包都是属于这种无需包文件管理的形式。 这些是用"tar"命令来把一个目录下的文件放入一个文件。 通常,会用compress,gzip或者bzip2来进行压缩。 因为压缩,归档是非常常用的操作,GNU tar命令可以在大多数linux系统里面负责压缩和而用gzip,bzip2来进行解压缩。如果你的tr的版本无法进行解压缩某些特定的类型, unix和linux系统都非常善于是使用管道技术来允许组合几个命令, 所以,一个2布的操作可以变成一步。

举例说明, 假定我们下载了Dr.Geo交互几何项目。 我们下载了drgeo-1.1.0.tar.gz。 这个gz扩展名高所我们这个文件是用gzip来进行压缩的。我们会先解压缩,然后从tar里面释放文件。 然后我们能教你如何把这两步变成一步。

Listing 13. Decompressing the Dr Geo source package.
[ian@localhost ~]$ ls drgeo*
drgeo-1.1.0.tar.gz
[ian@localhost ~]$ gunzip drgeo-1.1.0.tar.gz
[ian@localhost ~]$ ls drgeo*
drgeo-1.1.0.tar

注意的是,我们使用gunzipg命令来解压缩。现在gz文件被tar替换。如果是其他的压缩文件名,请参照下面。
uncompress drgeo-1.1.0.tar.Z
gunzip drgeo-1.1.0.tar.Z
gunzip drgeo-1.1.0.tar.gz
gunzip drgeo-1.1.0.tgz
bunzip2 drgeo-1.1.0.tar.bz2
你会注意到,gunzip负责.Z,tar.gz.tgz. 如果要从tar释放归档,你需要使用tar命令。 一般形式是 tar -xvf filename.tar, 你可以用管道命令来暂停。
[ian@localhost ~]$ tar -xvf drgeo-1.1.0.tar |more
drgeo-1.1.0/
drgeo-1.1.0/po/
drgeo-1.1.0/po/ChangeLog
drgeo-1.1.0/po/Makefile.in.in
drgeo-1.1.0/po/POTFILES.in
drgeo-1.1.0/po/drgeo.pot
drgeo-1.1.0/po/az.po
drgeo-1.1.0/po/ca.po
drgeo-1.1.0/po/cs.po

-x是释放文件。 -v是告诉tar显示结果。 -f, 告诉tar那个文件要释放。
做的好的包文件会建立一个目录来放置文件。 在我们的例子里面就是如此。
有时候一个包文件可能没有建立子目录,所以你就必须在释放前来检查。
用-t命令来显示内容,加上-v就可以仔细看了。
现在我们就来把二布何在一起。
tar -zxvf drgeo-1.1.0.tgz
tar -zxvf drgeo-1.1.0.tar.Z
对于bzip2,我们要用-j参数。
tar -jxvf drgeo-1.1.0.tar.bz2

你可以用-c命令直接把压缩的tar变成实际文件,但是注意原始压缩包会存在。
bunzip2 -c drgeo-1.1.0.tar.bz2 | tar -xvf -
uncompress -c drgeo-1.1.0.tar.Z | tar -xvf -
gunzip -c drgeo-1.1.0.tar.Z | tar -xvf -
gunzip -c drgeo-1.1.0.tar.gz | tar -xvf -
gunzip -c drgeo-1.1.0.tgz | tar -xvf -

另外一个我们可以使用的是CVS树
有时候,你所需要的代码并不是用tarball来打包的,而是通过CVS(Concurrent Version System)

Listing 15. Downloading GRUB2 with CVS.
[ian@attic4 ~]$ export CVS_RSH="ssh"
[ian@attic4 ~]$ cvs -z3 -d:ext:anoncvs@savannah.gnu.org:/cvsroot/grub co grub2
cvs server: Updating grub2
U grub2/.cvsignore
U grub2/AUTHORS
U grub2/COPYING
U grub2/ChangeLog
U grub2/DISTLIST
U grub2/INSTALL
U grub2/Makefile.in
U grub2/NEWS
.....

这个Export命令告诉CVS如何连接远程服务器(使用ssh在这个例子里面)。 这个CVs命令检查(co 参数)这个grub2的项目。 你会在grub2目录里面找到所有cvs命令为你创建的文件。

Zip 文件
你通常会发现源文件被用一个zip打包。 一般来说,这个文件可以同时在windows和Linux上使用。 原始的PKZIP是在DOS上开发的。 现在是支持跨平台使用。 许多LInux系统包括了zip

Listing 16. Unzipping the sphere eversion source.
[ian@attic4 ~]$ unzip sphereEversion-0.4-src.zip
Archive: sphereEversion-0.4-src.zip
creating: sphereEversion-0.4-src/
inflating: sphereEversion-0.4-src/Camera.h
inflating: sphereEversion-0.4-src/drawutil2D.h
inflating: sphereEversion-0.4-src/drawutil.h
inflating: sphereEversion-0.4-src/fontdata.h
inflating: sphereEversion-0.4-src/fontDefinition.h
inflating: sphereEversion-0.4-src/generateGeometry.h

编译程序
现在你已经有了原始的代码,让我们来看一下如何编译。

检查代码
在你开始编译之前,你应当先看一下释放的文件。 尤其是要查看一下安装文档。 一般来说,都是称为README或者一个INSTALL文件,放在项目的根目录里面。 如果这个项目是多平台的,你要到该平台下面去找。

配置
在源文件的主目录里面,你经常可以发现一个配置文件。这个脚本是用来配置将来的执行文件,让它适合你的系统。 一般来说,它都是开发者使用GNU自动配置程序。 这个配额脚本会探测你的系统来决定它的能力。 它会根据实际情况来制定程序。

一个复杂的配置脚本可能探测到你系统的许多方面。 包括CPU类型,是否支持32bit或者64bit系统等等。 一个简单系统可能就只是创建可执行文件。

如果你没有一个叫做配置的文件,检查你的文档,看看是否能够找到另外一个解决方案。 如果你有配置文件,尝试进入到项目的主目录,运行
./configure --help
这个应当给你一些提示。 许多类似于--的后缀,会出现在大部分的配置脚本里面。 有一些会对莫格特定程序。 注意那些你需要改变的配置文件。
注意: 如果你的目标没有包含一个配置文件,那有可能它已经有了一个执行文件并在大多数平台上运行。或者一些其他形式的安装。 举例来说, 一个用Python脚本的包,,可能就无需编译。 它只需要一个可以运行的脚本即可。

在 上面的讲解,我们关注了关于FHS(文件系统的层次标准)。 现在,我们关注 本地程序应当有一个可以执行的地点在/usr/local树下,在/usr/local/bin和/usr/local/man。 配置脚本就会有一个--后缀来制定安装路径。如果这个程序不是FHS兼容,你可能需要在运行脚本的时候,制定莫格参数。 如果你编一个产品来替换另外一个差评,你可能需要用/opt或者/opt或者/usr来做后缀。

除了可能制定的一个后缀意外,你可能会发现其他参数和特定文件的位置也有关系。 比如--mandir或者--infodir来制定man和info页面的位置。

一旦你查看了可能的参数并且找到你所需要的参数,运行脚本文件,把你的参数都加入进去。 记住加上./,因为你的项目文件目录可能不再你的路径表里面。 举例来说:
./configure
or
./configure --prefix /usr/local

当你运行配置文件的时候, 你一般会看到什么杨的操作系统你正在运行, 需要的工具。 如果一切顺利,你应当在最后一步配置文件后,应当有一个可执行文件。

config.cache
当配置脚本完毕后, 它会把信息存储在配置文件, config.cache, 就是和配置脚本的相同子目录里面。
如果你需要再次运行./configure , 你必须先删除config.cache(使用rm命令), 否则的话,系统会直接读取config.cache文件,而不会扫描你的系统。

制作和文件制作
一旦配置这一步完成了, 你就会有一个文件叫做"Makefile"在你的项目目录里面。 这个之所以被称为make file是因为有一个被叫做make的程序是被用来处理它的,并编译你的程序。你可能在子目录里面有好几个Makefiles。
一 个make file包含了许多条规则。 这些规则指导了make文件如何来编译东东。 这个文件也包括了targets, 这个告诉make程序要编译什么。 这个make程序扫描makefile并确定那些需要被编译。 举例来说,如果一个可执行文件从3个目标文件里面被编译出来,这些目标文件必须先要被编译完成在它们链接到源文件之前。 一个make file可以执行安装任也可以编译你的程序。 Make files里面的targets通常会有几个用途:
make
    没有任何参数,会直接编译程序。 从技术角度来说,它会编译一个默认的target,一般就是直接从源文件里面编译程序。

make install
    会安装你编译的程序。 你可能需要根目录的访问权如果你安装文件到/usr/local目录

make clean
    会删除由make步骤所安装的程序

make all
    有时候被用来用一个单独的target来执行一整块make files的程序

经常查看你的项目文档看看是否需要额外的东西

现在你的主要makefile已经被建立。 使用make命令,通常没有参数,就会编一个可执行文件, man页面和程序的其他部分。 依据你系统的速度和编译步骤的复杂成都, make可能花费几分钟或者更多。

有时候你的编译结果可能不会工作。 一般的原因如下:
.缺少预先需要的程序包
.预订需要的程序包的等级错误
. 配置文件或者make的编译参数错误
. 编译器丢失
. 在配置文件里面的bug或者已经生成的makefile里面有错误
. 一些源代码的错误

在我们的Dr Geo的例子里面,在配置步骤里面就有一个错误。

安装
如果你编译的程序都完成了, 你可能需要安装。 编译步骤会编译所有你需要的文件,但是它们的位置可能不对。 比如说, 二进制文件可能需要复制到/usr/local/bin里面, man的页面需要复制到/usr/local/man里面等等。

除 非你制定一个--的后缀参数,大部分的文件和目录会复制到/usr/local目录。 你可能需要根目录权限来写入这些文件。 如果你没有用root来登录, 用su命令来获得根目录权限。 你会被要求输入root密码。然后用 make install来安装你最新编译的程序。 依据程序的尺寸,安装可能会花费点时间。
[ian@attic4 drgeo-1.1.0]$ su
Password:
[root@attic4 drgeo-1.1.0]# make install
Making install in po
make[1]: Entering directory `/home/ian/drgeo-1.1.0/po'
if test -n ""; then \
/usr/local/share; \
else \
/bin/sh ../mkinstalldirs /usr/local/share; \
fi
installing az.gmo as /usr/local/share/locale/az/LC_MESSAGES/drgeo.mo
installing ca.gmo as /usr/local/share/locale/ca/LC_MESSAGES/drgeo.mo
installing cs.gmo as /usr/local/share/locale/cs/LC_MESSAGES/drgeo.mo
installing da.gmo as /usr/local/share/locale/da/LC_MESSAGES/drgeo.mo
installing de.gmo as /usr/local/share/locale/de/LC_MESSAGES/drgeo.mo
installing el.gmo as /usr/local/share/locale/el/LC_MESSAGES/drgeo.mo
installing en_CA.gmo as /usr/local/share/locale/en_CA/LC_MESSAGES/drgeo.mo
installing en_GB.gmo as /usr/local/share/locale/en_GB/LC_MESSAGES/drgeo.mo
...
/usr/bin/install -c drgeo /usr/local/bin/drgeo
/bin/sh ./mkinstalldirs /usr/local/share/applications
/usr/bin/install -c -m 644 drgeo.desktop /usr/local/share/applications/drgeo.desktop
make[2]: Leaving directory `/home/ian/drgeo-1.1.0'
make[1]: Leaving directory `/home/ian/drgeo-1.1.0'
[root@attic4 drgeo-1.1.0]# exit
exit
[ian@attic4 drgeo-1.1.0]$

运行程序
如果你的程序已经准备运行,你可能需要输入程序名,比如dr geo在我们的例子里面。
在运行文件之前,其他可能要做的事情:
.读取man页面,或者尝试 man xxxxx
. 自定义配置文件,可能在/etc里面
. 配置一个程序,比如一个服务器的后台程序来自动执行

第五部分, 管理共享文件库
你会在这个章节李么学习到,程序需要那些共享链接库。 你会知道系统把库文件都放在哪里。 我们会覆盖安装包,包括共享文件库。

静态和动态执行文件
Linux系统有两种执行程序
1. 静态链接可执行文件包含了所有它们需要的库文件。 所有的库文件都是连接到了可执行文件里面。 它们是完整的程序不需要依赖于外部链接库来运行。 一个很好的优点是,它们不需要安装就可以直接执行。
2. 动态连接的可执行文件要小很多。 也是不完整的文件。 她们需要外部的共享链接库来运行。 除了更小意外,动态链接允许一个包来制定预订文件而不需要把文件包括在包里面。 同样,动态连接允许许多程序共享一个版本的库文件而不是在内存里面用相同的代码占用了无数的空间。 因此,许多文件使用动态链接。

一 个典型的动态系统就是ln命令(/bin/ln),这个命令建立文件之间的链接,要么是硬链接或者是软链接(符号链接)。 共享库文件经常有符号链接参与, 在一个通用文件名和一个库文件的特殊层次,因此如果一个链接不工作, ln命令可能执行了不对。 为了防止这个可能性出现,Linux系统包含了一个ln的静态链接库的版本称为sln程序(/sbin/sln)。 下面显示了这两个的不同。
Listing 19. Sizes of sln and ln.
[ian@lyrebird ian]$ ls -l /sbin/sln; ls -l /bin/ln
-rwxr-xr-x 1 root root 457165 Feb 23 2005 /sbin/sln
-rwxr-xr-x 1 root root 22204 Aug 12 2003 /bin/ln

Idd命令

除了知道静态文件的尺寸比较大以外,我们如何来区别一个程序是静态链接的? 如果这个是动态链接的,我们如何知道这个程序需要那个库文件呢? 这个问题就用ldd命令来解决。

Listing 20. Output of ldd for sln and ln.
[ian@lyrebird ian]$ ldd /sbin/sln /bin/ln
/sbin/sln:
not a dynamic executable
/bin/ln:
libc.so.6 => /lib/tls/libc.so.6 (0x00ebd000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00194000)
上面的例子告诉我们ln需要的文件的名字和位置。

我们用ls -l来显示字符链接的情况
Listing 21. Library symbolic links.
[ian@lyrebird ian]$ ls -l /lib/tls/libc.so.6; ls -l /lib/ld-linux.so.2
lrwxrwxrwx 1 root root 13 May 18 16:24 /lib/tls/libc.so.6 -> libc-2.3.2.so
lrwxrwxrwx 1 root root 11 May 18 16:24 /lib/ld-linux.so.2 -> ld-2.3.2.so


 动态读取
从我们前面的介绍,我们学习到了ld-linux.so文件。这个文件看 上去像是一个共享的库文件。 但是实际上,在它内部,它是一个可执行文件。 当会读取执行文件的头文件的信息(这个信息是ELF格式)。 从这个信息里面,它会决定那个库文件是需要的,那个应当被读取。 这个时候, 它会在可执行文件里面来完成地址指针的指向,读取库文件以便程序运行。
你不会找到关于ld-linux.so的man文件, 但是你会发现在ld.so的man注释。 man ld.so。 用--list的参数可以显示相同的信息。

Listing 22. Using ld-linux.so to display library requirements.
[ian@lyrebird ian]$ /lib/ld-linux.so.2 --list /bin/ln
libc.so.6 => /lib/tls/libc.so.6 (0x00a83000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00f2c000)
注意的是,地址已经改变。

动态库的配置
那 么动态读取器是如何知道哪里去找执行文件的呢? 这个和许多在Linux上的事情一样, 这里有一个配置文件在/etc下面。 实际上, 这里有两个配置文件,/etc/ld/so/conf和/etc/ld.so.cache。 下面的表显示了/etc/ld/so.conf的在两个不同系统上的内容。 注意的是, attic4系统(运行F4), /etc/ld.so.conf指定了ld.so.conf.d下面的.conf文件需要被包含。 /etc/ld.so.conf在你的系统上也可能不同。
Listing 23. Content of /etc/ld.so.conf.
[ian@lyrebird ian]$ cat /etc/ld.so.conf
/usr/kerberos/lib
/usr/X11R6/lib
/usr/lib/qt-3.1/lib
[ian@attic4 ~]$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
读 取程序的速度必须很快, 因此,ld.so.conf 文件就可以被ldconfig文件来处理所有的从ld.so.conf.d里面所包含的库文件,同时也是/lib和/usr/lib里面的文件。 动态读取器使用ld.conf.cache文件来找到动态读取所需要的文件位置。如果你你改变了ld.co.conf 或者增加新的文件到ld.so.conf.d里面,你就必须运行ldconfig命令(作为root用户)来重新编译你的ld.conf.cache文 件。
一般来说,你使用ldconfig命令(没有参数)来进行编译ld.so.cache。 当然,有几个参数你也可以使用。 通常,你使用man ldconfig来得到更多的信息。我们现在来表述使用-p参数看到的结果。

Listing 24. Using ldconfig to display ld.so.cache.
[ian@lyrebird ian]$ /sbin/ldconfig -p | more
768 libs found in cache `/etc/ld.so.cache'
libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2
libz.so.1 (libc6) => /usr/lib/libz.so.1
libz.so (libc6) => /usr/lib/libz.so
libx11globalcomm.so.1 (libc6) => /usr/lib/libx11globalcomm.so.1
libxsltbreakpoint.so.1 (libc6) => /usr/lib/libxsltbreakpoint.so.1
libxslt.so.1 (libc6) => /usr/lib/libxslt.so.1
libxmms.so.1 (libc6) => /usr/lib/libxmms.so.1
libxml2.so.2 (libc6) => /usr/lib/libxml2.so.2
libxml2.so (libc6) => /usr/lib/libxml2.so
libxmltok.so.0 (libc6) => /usr/lib/libxmltok.so.0
libxmlparse.so.0 (libc6) => /usr/lib/libxmlparse.so.0
libxml.so.1 (libc6) => /usr/lib/libxml.so.1
libxerces-c.so.24 (libc6) => /usr/lib/libxerces-c.so.24
...
lib-gnu-activation-20030319.so (libc6) => /usr/lib/lib-gnu-activation-20030319.so
ld-linux.so.2 (ELF) => /lib/ld-linux.so.2

如果你运行一个老的程序,那个程序需要一个特定的老版本的共享文件库,或者你开发一个新的共享库或者一个新的共享库文件的版本,你肯恩更要覆盖掉原始默认的搜索路径。 这个同样也可能使用安装在/opt书目录里面的特定库文件时所需要。

就像你可以为了执行文件设定指定的搜索路径一样,你可以设置LD_LIBRARY_PATH的变量来来指定搜索路径,只有在使用ld.so.cache文件之前。

举例:

export
LD_LIBRARY_PATH=/usr/lib/oldstuff:/opt/IBM/AgentController/lib

章节6. Debian Package management
在早期的学习中,我们学习到了从源文件安装程序的方法。在这个章节,我们会学习到另外一个方法。 有一些程序已经编译完毕,并准备安装。

包管理综观

在Dr Geo的这个例子里面,我们在初始化的时候失败了,因为我们没有特定的需要的程序。 包管理工具把所有需要的程序和标准文件都格式化好,同时也提供了一个跟踪机制来帮助你决定那些包安装了。 这个是一个容易安装,维护,删除的包管理。

对于一个用户的观察角度来说,基本的包管理功能就是提供了命令。作为一个Linux的开发者,他们不断的尝试让Linux容易使用, 基本工具是被其他工具锁支持的,包括那些把基础工具的复制给覆盖的GUI工具。

安装Debian 包
现 在让我们回复前面所讨论的Dr Geo的程序。 在FC4里面,这个程序是用RPM安装包的。 我们在Debian-based Ubuntu系统上安装,却发现缺乏一些文件。 这里有两种方法。一种是Advanced Packaging Tool(APT) Red Hat Package Manager(RPM).
Listing 25. Missing guile function.
ian@attic4:~$ cd drgeo-1.1.0
ian@attic4:~/drgeo-1.1.0$ ./configure
checking for perl... /usr/bin/perl
checking for XML::Parser... ok
checking for iconv... /usr/bin/iconv
checking for msgfmt... /usr/bin/msgfmt
...
checking for guile... no
configure: error: guile required but not found
我们缺乏的是guile包。我们可以使用apt-get 命令来安装, 注意sudo命令是让你活得根目录权限。

Listing 26. Installing guile using apt-get.
ian@attic4:~$ sudo apt-get install guile
Reading package lists... Done
Building dependency tree... Done
Note, selecting guile-1.6 instead of guile
Suggested packages:
guile-1.6-doc
The following NEW packages will be installed:
guile-1.6
0 upgraded, 1 newly installed, 0 to remove and 24 not upgraded.
Need to get 31.5kB of archives.
After unpacking 209kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com hoary/main guile-1.6 1.6.7-1ubuntu1 [31.5kB]
Fetched 31.5kB in 0s (37.4kB/s)
Preconfiguring packages ...
Selecting previously deselected package guile-1.6.
(Reading database ... 84435 files and directories currently installed.)
Unpacking guile-1.6 (from .../guile-1.6_1.6.7-1ubuntu1_i386.deb) ...
Setting up guile-1.6 (1.6.7-1ubuntu1) ...

从 上面的输出我们可以看到, apt-get读取了一个列表,编译了一个依靠树目录, 决定了guile-doc是建议安装的文件, 并从Internet上下载,安装。 guile package已经从下载并安装。 注意, Debian Package的扩展名是.deb.

如果你的apt-get提示你,你所需要的包文件实在其他包里面,它会自动抓取并安装。 在我们的例子里,只有guile被安装了。 如果我们 要找到是否guile-doc是依靠于其他包。我们可以用apt-get的-s参数(simulate)。 看以下的模拟例子:
Listing 27. Simulated or dry-run install of ssl-cert.
ian@attic4:~$ sudo apt-get -s install ssl-cert
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
openssl
Suggested packages:
ca-certificates
The following NEW packages will be installed:
openssl ssl-cert
0 upgraded, 2 newly installed, 0 to remove and 24 not upgraded.
Inst openssl (0.9.7e-3 Ubuntu:5.04/hoary)
Inst ssl-cert (1.0-11 Ubuntu:5.04/hoary)
Conf openssl (0.9.7e-3 Ubuntu:5.04/hoary)
Conf ssl-cert (1.0-11 Ubuntu:5.04/hoary)

包资源列表: apt-setup
我 们提到前面apt-get是读取一个列表,那么这该列表就是/etc/apt/sources.lst.  这个列表你可以自己编辑, 但是你可能还是希望用apt-setup命令。 这个apt-setup命令是一个交互的工具,是放在APT主要目录里面。 你可以访问CD-ROM上面的自由,你本地我呢见系统,或者覆盖http或者ftp。

如果你的Linux安装程序安装了/etc/apt/sources.list文件, 它可能就不会使用CD-ROM作为一个源文件。 因此,你可以使用apt-cdrom add作为提示使用CD-ROM来作为包资源的列表。

APT-GET和其他我们要学习的命令,使用一个本地的数据库来判断包是否被安装。 他们可以检查当前安装的登记。 为了检查这个等级,它就必须读取/etc/apt/sources.list。 apt-get update是命令。
在你安装新的包之前,你总是要执行这一步。

如果你想移除某个程序,你可以使用remove参数。
Listing 28. Removing the guile package.
ian@attic4:~$ sudo apt-get remove guile
Reading package lists... Done
Building dependency tree... Done
Note, selecting guile-1.6 instead of guile
The following packages will be REMOVED:
guile-1.6
0 upgraded, 0 newly installed, 1 to remove and 24 not upgraded.
Need to get 0B of archives.
After unpacking 209kB disk space will be freed.
Do you want to continue [Y/n]? Y
(Reading database ... 84455 files and directories currently installed.)
Removing guile-1.6 ...

还有一个我们要提到的操作就是Upgrade参数。 这个upgrades参数把所有在你系统上安装的程序都进行升级。 而update命令只是仅仅刷新关于可用包的信息。

apt.conf文件
如果你检查man apt-get,你就会发现许多选项。

Debian 包信息
包状态与dpkg
另 外一个在APT系统里面的工具就是dpkg工具。 这个是一个中等层次的管理工具。它可以用来安装,删除包文件,也可以用来显示包信息。 配置文件在/etc/dpkg/dpkg.cfg下面。 个人用户也可能有.dpkg.cfg文件按在他们的子目录里面。如果你找不到配置文件,你可以检查 /usr/share/doc/dpkg/dpkg.cfg来看看。

dpkg工具使用许多在/var/lib/dpkg书下面的许多文件。 特殊情况下, dpkg 使用参数ls来显示guile的信息,在我们安装后。

Listing 29. Guile package status.
ian@attic4:~$ dpkg -s guile
Package `guile' is not installed and no info is available.
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
ian@attic4:~$ dpkg -s guile-1.6
Package: guile-1.6
Status: install ok installed
Priority: optional
Section: interpreters
Installed-Size: 204
Maintainer: Rob Browning <rlb@defaultvalue.org>
Architecture: i386
Version: 1.6.7-1ubuntu1
Provides: guile
Depends: guile-1.6-libs, libc6 (>= 2.3.2.ds1-4), libguile-ltdl-1
Suggests: guile-1.6-doc
Conflicts: libguile-dev (<= 1:1.4-24)
Description: The GNU extension language and Scheme interpreter
Guile is a Scheme implementation designed for real world programming,
providing a rich Unix interface, a module system, an interpreter, and
many extension languages. Guile can be used as a standard #! style
interpreter, via #!/usr/bin/guile, or as an extension language for
other applications via libguile.

包和包里面的文件
你经常会想知道包里面是什么文件,以及那些
文件那里来的。 这里有两种对于dpkg处理的人物。 下面是 用了参数-L来距离文件。
Listing 30. What is in the guile package?
root@attic4:~# dpkg -L guile-1.6
/.
/usr
/usr/bin
/usr/bin/guile-1.6-snarf
/usr/bin/guile-1.6-tools
/usr/bin/guile-1.6
/usr/bin/guile-1.6-config。。。

你可以使用-S参数来看是否有特定的文件
Listing 31. What package contains a file?
ian@attic4:~$ dpkg -S /usr/share/guile/1.6/scripts/lint
guile-1.6: /usr/share/guile/1.6/scripts/lint

在List 30里面,没有/usr/bin/guile,我们可以使用which guile来查看如果你输入guile,那个程序会运行。 你要做一些额外的工作来找出那个文件的位置。 在最新的版本里,你可以使用update-alternatives命令。 然后再用dpkg -S命令来确认位置
Listing 32. A more complex use of dpkg -S
ian@attic4:~$ ls -l $(which guile)
lrwxrwxrwx 1 root root 23 2005-09-06 23:38 /usr/bin/guile -> /etc/alternatives/guile
ian@attic4:~$ update-alternatives --display guile
guile - status is auto.
link currently points to /usr/bin/guile-1.6
/usr/bin/guile-1.6 - priority 160
slave guile-config: /usr/bin/guile-1.6-config
slave guile-snarf: /usr/bin/guile-1.6-snarf
slave guile-tools: /usr/bin/guile-1.6-tools
Current `best' version is /usr/bin/guile-1.6.
ian@attic4:~$ dpkg -S /usr/bin/guile-1.6
guile-1.6: /usr/bin/guile-1.6

再次配置Debian包
APT   包含了一个叫做debconf的文件,它能够在安装完毕后,再次进行配置。 最简单的方法是使用dpkg-reconfigure命令。 举例来说, adduser命令会创建用户目录,其他用户也能够访问。但是你不想这么做。 下图描述了配置adduser包。 运行dpkg-reconfigure adduser(作为根目录用户) 来阐释这个屏幕


使用dselect
更早的时候,我们说到过,包的状态是保存在/var/lib/dpkg/status里面。我们同样提到,dpkg能够做更多,而不只是显示包里面的内容。我们现在简单看一下dselect命令

章节7. Red Hat 包管理
RPM 和APT很类似。同样能够安装删除文件包。 这两个都在安装后保存数据库。 他们都有丰富的命令行,也有友善的界面。 两个都可以从Internet上面下载文件。 不同的事是, APT包更多一点,虽然RPM命令更为丰富。 另外一个不同的事情是RPM不会检查包里面的最新文件(和Internet做比较)。

RH在1995年引入了RPM。 RPM的命令可以分为3种。 检查并校验包裹。 安装,升级,删除包。 执行各种附加功能。
我们现在着重前两个。

安装和删除RPM包
开始使用RPM
rpm命令能够从本地的文件系统或者Internet上安装文件(http或者ftp). List 35显示了安装guile-devel 包使用rpm -ivh 命令和一个网络资源。
Listing 35. Installing guile-devel with rpm

[root@attic4 ~]# rpm -ivh http://download.fedora.redhat.com/pub/fedora\
> /linux/core/4/i386/os/Fedora/RPMS/guile-devel-1.6.7-2.i386.rpm
Retrieving http://download.fedora.redhat.com/pub/fedora/linux/core/4/i386/os/Fedora/
RPMS/guile-devel-1.6.7-2.i386.rpm
Preparing... ########################################### [100%]
1:guile-devel ########################################### [100%]

注意: -v参数是显示详细输出,-h参数显示#记号来表示进程。 如果你想在安装前检查包,你可能要先下载到本地,然后安装。 我们先来看一下wget命令来接受并且从本地安装文件,不使用-vh参数。

Listing 36. Installing guile-devel from a file
[root@attic4 ~]# wget http://download.fedora.redhat.com/pub/fedora/\
> linux/core/4/i386/os/Fedora/RPMS/guile-devel-1.6.7-2.i386.rpm
--22:29:58-- http://download.fedora.redhat.com/pub/fedora/linux/core/4/i386/os/Fedora/
RPMS/guile-devel-1.6.7-2.i386.rpm
=> `guile-devel-1.6.7-2.i386.rpm'
Resolving download.fedora.redhat.com... 209.132.176.221
Connecting to download.fedora.redhat.com[209.132.176.221]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 481,631 [application/x-rpm]
100%[====================================>] 481,631 147.12K/s ETA 00:00
22:30:02 (140.22 KB/s) - `guile-devel-1.6.7-2.i386.rpm' saved [481,631/481,631]
[root@attic4 ~]# ls guil*
guile-devel-1.6.7-2.i386.rpm
[root@attic4 ~]# rpm -i guile-devel-1.6.7-2.i386.rpm

重新安装一个rpm
如果你重新安装一个程序,你就会看到一个出错信息,因为该程序已经安装了。 你要用-e参数来(remove或者erase) 原始rpm,然后重新安装。
Listing 37. Removing guile-devel
[root@attic4 ~]# rpm -e guile-devel

强制安装rpm
有丝毫后,无法删除一个rpm。 很可能是因为其他程序需要它。 举例来说,你要删除guile程序而不是guile-devle包, 你可能会看到一下出错,因为是相互有关系的。
Listing 38. Attempting to remove guile.
[root@attic4 ~]# rpm -q -R guile-devel
/bin/sh
/usr/bin/guile
guile = 5:1.6.7
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
[root@attic4 ~]# rpm -e guile
error: Failed dependencies:
libguile-ltdl.so.1 is needed by (installed) g-wrap-1.3.4-8.i386
libguile-ltdl.so.1 is needed by (installed) gnucash-1.8.11-3.i386
libguile.so.12 is needed by (installed) g-wrap-1.3.4-8.i386

不用说, 在这种情况下是不太可能删除所有的包。 所以,我们就使用强制选项。
Listing 39. Installing guile-devel with --force option.
[root@attic4 ~]# rpm -ivh --force guile-devel-1.6.7-2.i386.rpm
Preparing... ########################################### [100%]
1:guile-devel ########################################### [100%]


强制删除rpm

还有一个可能性来强制删除,就是你可以用--nodeps选项来关闭关系链接。 你要小心尝试。 有时候你需要早期的版本, 你想确保最新的版本已经可以被删除干净,你可以考虑使用这个方法。
rpm -e --nodeps guile

升级一个rpm包

现在,让我们看一下如何升级一个rpm包到新的登记。 这个和安装很类似, 除了我们使用-U或者-F选项,而不是-i选项。 -U选项会升级已存在的包或者安装一个包如果该包没有被安装。 -F选项只是升级或者刷新一个已经安装的包。 -U用了更多。

Listing 40. Upgrading guile-devel.
[root@attic4 ~]# rpm -Uvh guile-devel-1.6.7-2.i386.rpm
Preparing... ########################################### [100%]
package guile-devel-1.6.7-2 is already installed
[root@attic4 ~]# rpm -e guile-devel
[root@attic4 ~]# rpm -Uvh guile-devel-1.6.7-2.i386.rpm
Preparing... ########################################### [100%]
1:guile-devel ########################################### [100%]

查询rpm包
你可能注意到在很多例子里面,安装一个rpm需要包的全名或者路径。 而删除的时候,只需要包的名字。 我们现在要用-q选项来查询。

简单的查询是查一个包是否被安装。 加上那个-i选项你就可以知道关于该包的情况。 注意,你需要根目录全乡来安装,升级,删除,但是,普通用户就可以查找包的俄信息。

Listing 41. Displaying information about guile-devel.
[ian@attic4 ~]$ rpm -q guile-devel
guile-devel-1.6.7-2
[ian@attic4 ~]$ rpm -qi guile-devel
Name : guile-devel Relocations: (not relocatable)
Version : 1.6.7 Vendor: Red Hat, Inc.
Release : 2 Build Date: Wed 02 Mar 2005 11:04:14 AM EST
Install Date: Thu 08 Sep 2005 08:35:45 AM EDT Build Host: porky.build.redhat.com
Group : Development/Libraries Source RPM: guile-1.6.7-2.src.rpm
Size : 1635366 License: GPL
Signature : DSA/SHA1, Fri 20 May 2005 01:25:07 PM EDT, Key ID b44269d04f2a6fd2
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Summary : Libraries and header files for the GUILE extensibility library.
Description :
The guile-devel package includes the libraries, header files, etc.,
that you will need to develop applications that are linked with the
GUILE extensibility library.
You need to install the guile-devel package if you want to develop
applications that will be linked to GUILE. You also need to install
the guile package.

rpm包和它里面的文件
你会经常想知道一个包里面有什么,和它们从那里来。 你可以用-ql选项来显示信息。

Listing 42. Displaying information about guile-devel.
[ian@attic4 ~]$ rpm -ql guile-devel
/usr/bin/guile-config
/usr/bin/guile-snarf
/usr/include/guile
/usr/include/guile/gh.h
/usr/include/guile/srfi
/usr/include/guile/srfi/srfi-13.h
/usr/include/guile/srfi/srfi-14.h
/usr/include/guile/srfi/srfi-4.h
/usr/include/libguile
/usr/include/libguile.h
...
你可以用-c显示配置文件,-d显示文档文件。

查询包文件
以上查询是查询已经安装后的rpm的数据库。 如故哦你只是下载了一个文件,并想知道里面的信息,你可以使用-p选项(for package file)。

Listing 42. Displaying guile-devel package file information.
[ian@attic4 ~]$ rpm -qp guile-devel-1.6.7-2.i386.rpm
guile-devel-1.6.7-2
[ian@attic4 ~]$ rpm -qpi guile-devel-1.6.7-2.i386.rpm
Name : guile-devel Relocations: (not relocatable)
Version : 1.6.7 Vendor: Red Hat, Inc.
Release : 2 Build Date: Wed 02 Mar 2005 11:04:14 AM EST
Install Date: (not installed) Build Host: porky.build.redhat.com
Group : Development/Libraries Source RPM: guile-1.6.7-2.src.rpm
Size : 1635366 License: GPL
Signature : DSA/SHA1, Fri 20 May 2005 01:25:07 PM EDT, Key ID b44269d04f2a6fd2
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Summary : Libraries and header files for the GUILE extensibility library.
Description :
The guile-devel package includes the libraries, header files, etc.,
that you will need to develop applications that are linked with the
GUILE extensibility library.
You need to install the guile-devel package if you want to develop
applications that will be linked to GUILE. You also need to install
the guile package.

查询所有安装的包
你可以用-a选项来查询所有的安装包。 你一般要用过滤才行。 比如sort命令,more,less等。 wc来活得包或者文件的数目, grep来活得关键字。
1. 所有系统里面已经安装的包的排列
[ian@attic4 ~]$ rpm -qa | sort | more
4Suite-1.0-8.b1
a2ps-4.13b-46
acl-2.2.23-8
acpid-1.0.4-1
alchemist-1.0.36-1
alsa-lib-1.0.9rf-2.FC4
alsa-utils-1.0.9rf-2.FC4
...
所有安装rpm的数目
[ian@attic4 ~]$ rpm -qa | wc -l
874
系统包里面的文件数目
[ian@attic4 ~]$ rpm -qal | wc -l
195681
rpm文档的数目
[ian@attic4 ~]$ rpm -qald | wc -l
31881
指定的文件
[ian@attic4 ~]$ rpm -qa | grep -i "guile"
guile-devel-1.6.7-2
guile-1.6.7-2

找到文件的拥有者
你现在要找到一个文件属于那些包,你可以用-f选项。
也可以用which命令来得到某个文件的路径,你可以使用rpm -qf命令。

[ian@attic4 ~]$ which guile-config
/usr/bin/guile-config
[ian@attic4 ~]$ rpm -qf `which guile-config`
guile-devel-1.6.7-2
[ian@attic4 ~]$ rpm -qf $(which guile-config)
guile-devel-1.6.7-2

RPM的关系
如果你需要同时安装几个包互相之间有关联,你可以使用rpm -Uvh命令。 它会扫描之间的关系,然后用正确的次序进行安装。 你也可以使用--requires选项(可能可以简略为-R).

Listing 45. What does guile-config require.
[ian@attic4 ~]$ rpm -qR guile-devel
/bin/sh
/usr/bin/guile
guile = 5:1.6.7
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
除此之外,你也可以到过来进行寻找。 你可以扎到一个包文件锁需要的文件。 你可以使用--whatrequires参数。
Listing 46. What needs /usr/bin/guile and guile.
[ian@attic4 ~]$ rpm -q --whatrequires /usr/bin/guile guile
guile-devel-1.6.7-2
g-wrap-1.3.4-8
guile-devel-1.6.7-2
[ian@attic4 ~]$ rpm -q --whatrequires /usr/bin/guile guile | sort|uniq
guile-devel-1.6.7-2
g-wrap-1.3.4-8

RPM包的整合
为了保持rpm包的完整性,他们一般会包括MD5或者SHA1,并签名。 如果要检查一个rpm包的完整度,你可以使用--checksig(简写到-K)。 你一般也会用到-v选项。
Listing 47. Checking the integrity of the guile-devel package file.
[ian@attic4 ~]$ rpm --checksig guile-devel-1.6.7-2.i386.rpm
guile-devel-1.6.7-2.i386.rpm: (sha1) dsa sha1 md5 gpg OK
[ian@attic4 ~]$ rpm -Kv guile-devel-1.6.7-2.i386.rpm
guile-devel-1.6.7-2.i386.rpm:
Header V3 DSA signature: OK, key ID 4f2a6fd2
Header SHA1 digest: OK (b2c61217cef4a72a8d2eddb8db3e140e4e7607a1)
MD5 digest: OK (cf47354f2513ba0c2d513329c52bf72a)
V3 DSA signature: OK, key ID 4f2a6fd2

如果你得到以下结果:
V3 DSA signature: NOKEY, key ID 16a61572

这个表示你有一个签名了的包,但是你没有公钥来验证。
如果你要下载钥匙,你需要在导入前,检查它的指纹。 使用rpm --import命令。

检查一个已经安装的包
你可以使用rpm -V来检查。
Listing 48. Verifying the installed guile-devel package.
[ian@attic4 ~]$ rpm -V guile-devel

现在我们变成根用户,删除/usr/bin/guile-config,然后做一个复制/usr/bin/guile-snarf。 然后在看结果。


Listing 48. Tampering with the guile-devel package.
[root@attic4 ~]# rm /usr/bin/guile-config
rm: remove regular file `/usr/bin/guile-config'? y
[root@attic4 ~]# cp /bin/bash /usr/bin/guile-snarf
cp: overwrite `/usr/bin/guile-snarf'? y
[root@attic4 ~]# rpm -V guile-devel
missing /usr/bin/guile-config
S.5....T /usr/bin/guile-snarf


配置rpm
rpm很少需要配置。如果是一个老的版本,你可以在/etc/rpmrc里面来改变。 在最近的版本,你ikeyi在/usr/lib/rpm/rpmrc里面修改。 这里的文件会自动升级。 如果你要查看rpm的命令选项。 使用rpm rpm --showrc

其他的工具
其他的一些工具:
YaST (SUSE)
• up2date (Red Hat)
• yum - Yellow Dog Updater Modified (Fedora and others)
• Mandrake Software Management (Mandriva)



posted on Wednesday, September 26, 2007 2:44 PM #Notes
Comments
No comments posted yet.
Title  
Name  
Url
Comments   
Protected by Clearscreen.SharpHIPEnter the code you see: