1.5.6.rpm命令介绍rpm(redhatpackagemanager)是由RedHat公司开发的软件包安装和管理程序,同Windows平台上的Uninstaller比较相似。使用RPM,用户可以自行安装和管理Linux上的应用程序和系统工具。rpm可以让用户直接以二进制方式安装软件包,并且可替用户查询是否已经安装了有关的库文件;在用删除程序时,它又会询问用户是否要删除有关的程序。如果使用rpm来升级软件,rpm会保留原先的配置文件,这样用户就不用重新配置新的软件了。rpm保留一个数据库,这个数据库中包含了所有的软件包的资料,通过这个数据库,用户可以进行软件包的查询。rpm虽然是为Linux设计的,但是它已经移植到SunOS、Solaris、AIX、Irix等其他UNIX系统上了。rpm遵循GPL版权协议,用户可以在符合GPL协议的条件下自由使用及传播rpm1)安装rpm包rpm软件包通常具有类似foo-1.0-386-rpm的文件名。其中包括软件包的名称(foo)、版本号(1.0)、发行号(1)和硬件平台(i386)。安装一个软件包只需简单地键入以下命令:$rpm -ivhfoo-1.0-i386.rpmfo0####################################rpm安装完毕后会打印出软件包的名字(并不一定与文件名相同),而后打印一连串的#号以表示安装进度。2)卸载rpm包卸载软件包就像安装软件包时一样简单,键入命令如下:Srpm-e foo注意:这里使用软件包的名字foo,而不是软件包文件的名字foo-1.0-1-i386.rpm。3)升级rpm包Srpm -ivh foo-2. 0-1.i386.rpmfo0####################################rpm将自动卸载已安装的老版本的foo软件包,用户不会看到有关信息。因为rpm执行智能化的软件包升级,会自动处理配置文件,可能会显示如下信息:Saving/etc/foo.conf as/etc/foo.conf.rpmsave4)查询已安装的软件包使用命令rpm-q来查询已安装软件包的数据库。简单地使用命令rpm-qfoo会打印出.foo软件包的包名、版本号和发行号:Srpm -q foofoo-2.0-1除了指定软件包名以外,还可以使用另外的选项来指明要查询哪些软件包的信息。这些选项被称之为“软件包指定选项”,具体选项内容可以用man命令获得帮助,即使用命令:man rpm.5)验证软件包验证软件包是通过比较已安装的文件和软件包中的原始文件信息来进行的。验证主要是比较文件的尺寸、MD5校验码、文件权限、类型、属主和用户组等。rpm-V命令用来验证一个软件包。可以使用任何软件包作为选项来查询你要验证的软件包。如,命令rpm-Vfoo将用来验证foo软件包。24
24 1.5.6. rpm 命令介绍 rpm(redhat package manager)是由 RedHat 公司开发的软件包安装和管理程序,同 Windows 平台上的 Uninstaller 比较相似。使用 RPM,用户可以自行安装和管理 Linux 上的 应用程序和系统工具。 rpm 可以让用户直接以二进制方式安装软件包,并且可替用户查询是否已经安装了有 关的库文件;在用删除程序时,它又会询问用户是否要删除有关的程序。如果使用 rpm 来 升级软件,rpm 会保留原先的配置文件,这样用户就不用重新配置新的软件了。 rpm 保留 一个数据库,这个数据库中包含了所有的软件包的资料,通过这个数据库,用户可以进行 软件包的查询。rpm 虽然是为 Linux 设计的,但是它已经移植到 SunOS、Solaris、AIX、Irix 等其他 UNIX 系统上了。rpm 遵循 GPL 版权协议,用户可以在符合 GPL 协议的条件下自 由使用及传播 rpm。 1)安装 rpm 包 rpm 软件包通常具有类似 foo-1.0-386-rpm 的文件名。其中包括软件包的名称(foo)、 版本号(1.0)、发行号(1)和硬件平台(i386)。安装一个软件包只需简单地键入以下命令: $rpm -ivh foo -1.0-i386.rpm foo #################################### rpm 安装完毕后会打印出软件包的名字(并不一定与文件名相同), 而后打印一连串 的#号以表示安装进度。 2)卸载 rpm 包 卸载软件包就像安装软件包时一样简单,键入命令如下: $rpm -e foo 注意:这里使用软件包的名字 foo,而不是软件包文件的名字 foo-1.0-1-i386.rpm。 3)升级 rpm 包 $rpm -ivh foo-2.0-1.i386.rpm foo #################################### rpm 将自动卸载已安装的老版本的 foo 软件包,用户不会看到有关信息。因为 rpm 执 行智能化的软件包升级,会自动处理配置文件,可能会显示如下信息: Saving /etc/foo.conf as /etc/foo.conf.rpmsave 4)查询已安装的软件包 使用命令rpm-q来查询已安装软件包的数据库。简单地使用命令rpm-qfoo会打印出.foo 软件包的包名、版本号和发行号: $rpm -q foo foo-2.0-1 除了指定软件包名以外,还可以使用另外的选项来指明要查询哪些软件包的信息。这 些选项被称之为“软件包指定选项”,具体选项内容可以用 man 命令获得帮助,即使用命 令: man rpm. 5)验证软件包 验证软件包是通过比较已安装的文件和软件包中的原始文件信息来进行的。验证主要 是比较文件的尺寸、MD5 校验码、文件权限、类型、属主和用户组等。 rpm -V 命令用来验证一个软件包。可以使用任何软件包作为选项来查询你要验证的软 件包。如,命令 rpm -V foo 将用来验证 foo 软件包。
又如,验证包含特定文件的软件包:rpm-vf/bin/vi验证所有已安装的软件包:rpm-Va根据一个rpm包来验证:rpm-Vp foo-1.0-1.i386.rpm1.6.Linux目录结构Linux文件系统是树状的结构,系统中每个分区都是一个文件系统,都有自己的目录层次。Linux会将这些分属不同分区的、单独的文件系统按树状的方式形成一个系统的总目录层次结构。目录提供了一个管理文件方便而有效的途径,最上层是根目录,其他的所有目录都是从根目录出发而生成的,如图1-3所示。微软的DOS和Windows也是采用树状结构,但是在DOS和Windows中这样的树状结构的根是磁盘分区的盘符,有几个分区就有几个树状结构,它们之间的关系是并列的。但在Linux中,无论操作系统管理几个磁盘分区,这样的目录树都只有一个。/root工111/bin/homeIdevletcAib/sbin/ump/usr/var111/bin/X11R6/srcibAocal /man图1-3Linux的目录结构Linux使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录结构,并指定了每个目录的作用和其中的文件类型。1.目录功能简介1). /bin存放常用的二进制可执行命令,如1s,mv,rm,mkdir,rmdir,gzip,tar,elnet及ftp等。通常它与/usr/bin的内容是一样的。2). /dev存放与设备有关的特殊文件。基本上UNIX或Linux系统都将设备当成文件,如/dev/fdo代表软盘,/dev/cdrom则表示光盘。3)./etc存放系统管理和配置文件,如LILO的参数、用户的账号和密码,以及系统的主要设置。4)./home为用户设置的目录,比如用户user的主目录就是/home/user,可以用~user表示。5). /lib标准程序设计库,又叫动态链接共享库,在Linux执行或编译内核时,均会用到。6)../sbin系统管理命令,存放的是系统管理员使用的管理程序,如fdisk,mke2fs,fsck,mkswap25
25 又如,验证包含特定文件的软件包: rpm -vf/bin/vi 验证所有已安装的软件包: rpm -Va 根据一个 rpm 包来验证: rpm -Vp foo-1.0-1.i386.rpm 1.6.Linux 目录结构 Linux 文件系统是树状的结构,系统中每个分区都是一个文件系统,都有自己的目录 层次。Linux 会将这些分属不同分区的、单独的文件系统按树状的方式形成一个系统的总 目录层次结构。目录提供了一个管理文件方便而有效的途径,最上层是根目录,其他的所 有目录都是从根目录出发而生成的,如图1-3 所示。微软的 DOS 和 Windows 也是采用树 状结构,但是在 DOS 和 Windows 中这样的树状结构的根是磁盘分区的盘符,有几个分区 就有几个树状结构,它们之间的关系是并列的。但在 Linux 中,无论操作系统管理几个磁 盘分区,这样的目录树都只有一个。 图1-3 Linux 的目录结构 Linux 使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统 和完整而固定的目录结构,并指定了每个目录的作用和其中的文件类型。 1.目录功能简介 1)./bin 存放常用的二进制可执行命令,如 1s,mv,rm,mkdir,rmdir,gzip,tar,elnet 及 ftp 等。通常它与/usr/bin 的内容是一样的。 2)./dev 存放与设备有关的特殊文件。基本上 UNIX 或 Linux 系统都将设备当成文件,如/dev/fd0 代表软盘,/dev/cdrom 则表示光盘。 3)./etc 存放系统管理和配置文件,如 LILO 的参数、用户的账号和密码,以及系统的主要设 置。 4)./home 为用户设置的目录,比如用户 user 的主目录就是/home/user,可以用~user 表示。 5)./lib 标准程序设计库,又叫动态链接共享库,在 Linux 执行或编译内核时,均会用到。 6). /sbin 系统管理命令,存放的是系统管理员使用的管理程序,如 fdisk,mke2fs,fsck,mkswap
mount等等。7)./boot放置Linux核心与启动和关闭系统有关的文档,一个在后面的实验中会使用的非常重要的目录。8). /temp公用的临时文件存储点。9). /root系统管理员的主目录。10)./mm系统提供这个目录是让用户临时装载其他的文件系统,如装载软盘的文件系统。11). /lost+found这个目录平时是空的,系统非正常关机时而留下的文件会放在这里。类似于Windows下的.chk文件。12). /proc虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。13). /var这是系统在工作时预先设置的工作目录,如各种服务的日志文件和收发的邮件等。14). /usr最庞大和最重要的目录之一,要用到的应用程序和文件几乎都在这个目录下。其中包含:./usr/X11R6存放Xwindow的目录。./usr/bin众多的应用程序。./usr/sbin超级用户的一些管理程序。./usr/docLinux系统的说明文档(RedHat7.0以后改放在/usr/share/doc下)。./usr/includeLinux下开发和编译应用程序所需要的头文件。/usr/lib存放常用的动态链接库和软件包的配置文件。?/usr/man存放帮助文档(RedHat7.0以后放在/usr/share/man下)。./usr/srcLinux内核的源代码就放在这里,编译内核时必须用到。?/usr/local/bin本地增加的命令,通常用于软件的升级。O/usr/local/lib本地增加的库。1.7.开发环境1.6.1.如何编译简单的程序C语言是Linux下的最常用的程序设计语言,Linux上的很多应用程序就是用C语言编写的。实验中的编程都是使用C来实现的。Linux系统上运行的GNUC编译器(GCC)是一个全功能的ANSIC兼容编译器。虽然GCC没有集成的开发环境,但堪称是目前效率很高的C/C++编译器。GCC安装后的目录结构为:/usr/lib/gcc-lib/target/version/编译器就在这个目录(及子目录)下。/usr/birdgcc可以从命令行执行的二进制程序在这个目录下。/usr/target/(binlUblinclude)/库和头文件在这个目录下。26
26 mount 等等。 7)./boot , 放置 Linux 核心与启动和关闭系统有关的文档,一个在后面的实验中会使用的非常重 要的目录。 8)./temp 公用的临时文件存储点。 9)./root 系统管理员的主目录。 10)./mm 系统提供这个目录是让用户临时装载其他的文件系统,如装载软盘的文件系统。 11)./lost+found 这个目录平时是空的,系统非正常关机时而留下的文件会放在这里。类似于 Windows 下的.chk 文件。 12)./proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。 13)./var 这是系统在工作时预先设置的工作目录,如各种服务的日志文件和收发的邮件等。 14)./usr 最庞大和最重要的目录之一,要用到的应用程序和文件几乎都在这个目录下。其中包 含: ● /usr/X11R6 存放 Xwindow 的目录。 ● /usr/bin 众多的应用程序。 ● /usr/sbin 超级用户的一些管理程序。 ● /usr/doc Linux 系统的说明文档(RedHat7.0 以后改放在/usr/share/doc 下)。 ● /usr/include Linux 下开发和编译应用程序所需要的头文件。 ● /usr/lib 存放常用的动态链接库和软件包的配置文件。 ● /usr/man 存放帮助文档(RedHat7.0 以后放在/usr/share/man 下)。 ● /usr/src Linux 内核的源代码就放在这里,编译内核时必须用到。 ● /usr/local/bin 本地增加的命令,通常用于软件的升级。 ● /usr/local/lib 本地增加的库。 1.7.开发环境 1.6.1.如何编译简单的程序 C 语言是 Linux 下的最常用的程序设计语言,Linux 上的很多应用程序就是用 C 语言 编写的。实验中的编程都是使用 C 来实现的。Linux 系统上运行的 GNUC 编译器 (GCC) 是一个全功能的 ANSIC 兼容编译器。虽然 GCC 没有集成的开发环境,但堪称是目前效率 很高的 C/C++编译器。 GCC 安装后的目录结构为: /usr/lib/gcc-lib/target/version/编译器就在这个目录(及子目录)下。 /usr/birdgcc 可以从命令行执行的二进制程序在这个目录下。 /usr/target/(binIUblinclude)/库和头文件在这个目录下
/lib/、/usr/lib和其他目录系统的库在这些目录下。命令格式gcc [选项】源文件[目标文件]选项含义-oFILE指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,默认文件名是a.out-cGCC仅把源代码编译为目标代码。默认时GCC建立的目标代码文件有一个.o的扩展名。-static链接静态库,即执行静态链接。-OGCC对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。-On指定代码优化的级别为n,n为0≤n≤3的正整数。-O2选项告诉GCC产生尽可能小和尽可能快的代码。-02选项使编译的速度比使用-0时慢,但通常产生的代码执行速度会更快。-g在可执行程序中包含标准调试信息。GCC产生能被GNU调试器使用的调试信息,以便调试你的程序。GCC提供了一个很多其他C编译器没有的特性,在GCC里可以把-g和-O(产生优化代码)联用。-pedantic,允许发出ANSI/ISOC标准所列出的所有警告。-pedantic-errors允许发出ANSI/ISOC标准所列出的所有错误。-W关闭所有警告,建议不要使用此项。-Wall允许发出GCC能提供的所有有用的警告,也可以用-W(warning)来标识指定的警告。-MM输出一个make兼容的相关列表。-V显示在编译过程中的每一步用到的命令。例编译hello.c源文件:$ gcc hello.c -o hello将hello.cpp编译为目标代码$gcc-chello.cpp-ohello.c链接指定的函数库的目标代码和包含头文件,编译程序:Sgcc myapp.c -L/home/xuhong/lib-I /home/xuhong/include -lnew-0 myapp1.6.2.大型程序的编译当用户编写大型程序时,按照1.6.1节的方法写进行编译的话,重新编译一次其工作量相当巨大。而Make命令是可自动决定一个大程序中哪些文件需要重新编译,并发布重新编译它们的命令。在Linux下得到广泛的应用。如果要使用Make,必须先写一个称为Makefile的文件,该文件描述程序中各个文件之间的相互关系,并且提供每一个文件的更新命令。在一个程序中,可执行程序文件的更新依靠OBJ文件,而OBJ文件是由源文件编译得来的。一旦合适的Makefile文件存在,每次更改一些源文件,在shell命令下简单的键入:make就能执行所有的必要的重新编译任务。Make程序根据Makefile文件中的数据和每个文件更改的时间戳决定哪些文件需要更新。对于这些需要更新的文件,Make基于Makefile文件发布命令进行更新,进行更新的方式由提供的命令行参数控制。这些对于维护规模大27
27 /lib/、/usr/lib 和其他目录系统的库在这些目录下。 命令格式 gcc [选项] 源文件 [目标文件] 选项含义 -o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE 没 有指定,默认文件名是 a.out. -c GCC 仅把源代码编译为目标代码。默认时 GCC 建立的目标代码文件有一个.o 的 扩展名。 -static 链接静态库,即执行静态链接。 -O GCC 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。 -On 指定代码优化的级别为 n,n 为 0≤n≤3 的正整数。-O2 选项告诉 GCC 产生尽可 能小和尽可能快的代码。-O2 选项使编译的速度比使用-O 时慢,但通常产生的代码执行速 度会更快。 -g 在可执行程序中包含标准调试信息。GCC 产生能被 GNU 调试器使用的调试信息, 以便调试你的程序。GCC 提供了一个很多其他 C 编译器没有的特性,在 GCC 里可以把-g 和-O(产生优化代码)联用。 -pedantic,允许发出 ANSI/ISOC 标准所列出的所有警告。 -pedantic-errors 允许发出 ANSI/ISOC 标准所列出的所有错误。 -w 关闭所有警告,建议不要使用此项。 -Wall 允许发出 GCC 能提供的所有有用的警告,也可以用-W(warning)来标识指定的 警告。 -MM 输出一个 make 兼容的相关列表。 -v 显示在编译过程中的每一步用到的命令。 例 编译 hello.c 源文件: $ gcc hello.c –o hello 将 hello.cpp 编译为目标代码 $gcc –c hello.cpp –o hello.o 链接指定的函数库的目标代码和包含头文件,编译程序: $gcc myapp.c –L/home/xuhong/lib –I /home/xuhong/include –lnew –o myapp 1.6.2.大型程序的编译 当用户编写大型程序时,按照 1.6.1 节的方法写进行编译的话,重新编译一次其工作量 相当巨大。而 Make 命令是可自动决定一个大程序中哪些文件需要重新编译,并发布重新 编译它们的命令。在 Linux 下得到广泛的应用。如果要使用 Make,必须先写一个称为 Makefile 的文件,该文件描述程序中各个文件之间的相互关系,并且提供每一个文件的更 新命令。在一个程序中,可执行程序文件的更新依靠 OBJ 文件,而 OBJ 文件是由源文件 编译得来的。一旦合适的 Makefile 文件存在,每次更改一些源文件,在 shell 命令下简单的 键入: make 就能执行所有的必要的重新编译任务。Make 程序根据 Makefile 文件中的数据和每个 文件更改的时间戳决定哪些文件需要更新。对于这些需要更新的文件,Make 基于 Makefile 文件发布命令进行更新,进行更新的方式由提供的命令行参数控制。这些对于维护规模大
的程序来说是相当有用的。Make程序需要一个所谓的Makefile文件来告诉它干什么。在大多数情况下,Makefile文件告诉Make怎样编译和连接成一个程序。我们将先给出Makefile的规则的格式,然后讨论一个简单的Makefile文件,该文件描述怎样将8个C源程序文件和3个头文件编译和连接成为一个文本编辑器。1规则的格式一个简单的Makefile文件包含一系列的“规则”,其样式如下:目标(target):依赖(prerequiries)..<tab>命令(command)++..目标(target)通常是要产生的文件的名称,目标的例子是可执行文件或OBJ文件。目标也可是一个执行的动作名称,诸如‘clean(详细内容请参阅假想目标一节)。依赖是用来输入从而产生目标的文件,一个目标经常有几个依赖。命令是Make执行的动作,一个规则可以含有几个命令,每个命令占一行。注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab。这是不小心容易出错的地方。通常,如果一个依赖发生变化,则需要规则调用命令对相应依赖和服务进行处理从而更新或创建目标。但是,指定命令更新目标的规则并不都需要依赖,例如,包含和目标clern相联系的删除命令的规则就没有依赖。规则一般是用于解释怎样和何时重建特定文件的,这些特定文件是这个详尽规则的目标。Make需首先调用命令对依赖进行处理,进而才能创建或更新目标。当然,一个规则也可以是用于解释怎样和何时执行一个动作。一个Makefile文件可以包含规则以外的其它文本,但一个简单的Makefile文件仅仅需要包含规则。虽然真正的规则比这里展示的例子复杂,但格式却是完全一样。2一个简单的Makefile文件一个简单的Makefile文件,该文件描述了一个称为文本编辑器(edit)的可执行文件生成方法,该文件依靠8个OBJ文件(.0文件),它们又依靠8个C源程序文件和3个头文件。在这个例子中,所有的C语言源文件都包含“defs.h’头文件,但仅仅定义编辑命令的源文件包含‘command.h”头文件,仅仅改变编辑器缓冲区的低层文件包含“buffer.h”头文件。edit :main.okbd.ocommand.odisplay.olinsert.o search.o files.o utils.occ-o edit main.okbd.o command.o display.olinsert.osearch.ofiles.outils.omain.o : main.c defs.hcc-cmain.ckbd.o: kbd.c defs.h command.hcc -ckbd.c28
28 的程序来说是相当有用的。Make 程序需要一个所谓的 Makefile 文件来告诉它干什么。在 大多数情况下,Makefile 文件告诉 Make 怎样编译和连接成一个程序。 我们将先给出 Makefile 的规则的格式,然后讨论一个简单的 Makefile 文件,该文件描 述怎样将 8 个 C 源程序文件和 3 个头文件编译和连接成为一个文本编辑器。 1 规则的格式 一个简单的 Makefile 文件包含一系列的“规则”,其样式如下: 目标(target)„: 依赖(prerequiries)„ <tab>命令(command) . . 目标(target)通常是要产生的文件的名称,目标的例子是可执行文件或 OBJ 文件。目标 也可是一个执行的动作名称,诸如‘clean’(详细内容请参阅假想目标一节)。 依赖是用来输入从而产生目标的文件,一个目标经常有几个依赖。 命令是 Make 执行的动作,一个规则可以含有几个命令,每个命令占一行。注意:每 个命令行前面必须是一个 Tab 字符,即命令行第一个字符是 Tab。这是不小心容易出错的 地方。 通常,如果一个依赖发生变化,则需要规则调用命令对相应依赖和服务进行处理从而 更新或创建目标。但是,指定命令更新目标的规则并不都需要依赖,例如,包含和目标‘clern’ 相联系的删除命令的规则就没有依赖。 规则一般是用于解释怎样和何时重建特定文件的,这些特定文件是这个详尽规则的目 标。Make 需首先调用命令对依赖进行处理,进而才能创建或更新目标。当然,一个规则 也可以是用于解释怎样和何时执行一个动作。 一个 Makefile 文件可以包含规则以外的其它文本,但一个简单的 Makefile 文件仅仅需 要包含规则。虽然真正的规则比这里展示的例子复杂,但格式却是完全一样。 2 一个简单的 Makefile 文件 一个简单的 Makefile 文件,该文件描述了一个称为文本编辑器(edit)的可执行文件 生成方法,该文件依靠 8 个 OBJ 文件(.o 文件),它们又依靠 8 个 C 源程序文件和 3 个头 文件。 在这个例子中,所有的 C 语言源文件都包含‘defs.h’ 头文件,但仅仅定义编辑命令 的源文件包含‘command.h’头文件,仅仅改变编辑器缓冲区的低层文件包含‘buffer.h’ 头文件。 edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c