Rpm打包原理详解

Rpm打包原理详解
Rpm打包原理详解

Rpm打包原理详解

为什么要打包?

制作rpm 不仅仅是打包,更可以解决菜单创建、打补丁、完成大量预配置、与其他软件包互动等操作。使用源代码安装要求用户了解基本的编译过程、能够应付各种不能编译的意外、必须自己完成抽象的配置、甚至懂得软件开发,能够自己打补丁,……对非计算机专业的用户而言简直就是天方夜谭。这是把软件开发的最后一步抛给了用户,作为发行版,这是极不负责任的!也是不现实的,除非用lfs,但那是一本菜谱,不是真正的发行版。

软件作者发布源代码是正确的,负责的作者一般都同时提供rpm 和deb 包以及它们的源代码包。除非他们不会制作。愿意使用什么,那是个人的自由,但对外就不能只想到自己。GNU 精神是一种公益精神,没有奉献精神,在自由软件领域是要遭唾弃的!

直接使用其他发行版的rpm 常常是不行的。不知道大家看没看“恼人的依赖关系”这个帖子。可以在技术支持区搜索一下。任何两个发行版本在二进制上都是不能兼容的!他们实际是不同的操作系统。不仅使用的库文件不同,配置也迥异。特别是同一个发行版的不同版本更不兼容。任何包都必须在本地重新编译,而且不一定通得过,因为还有spec 宏的兼容问题!如果要在别的发行版上使用,必须用源码编译,这是常识。考虑文件布局和配置问题,有时直接编译也是不够的,必须修改spec,甚至自己打补丁。

如何创建rpm 包?

rpm 建包原理其实不复杂。写spec 相当于一种脚本编程,主要是在spec 里提供一些软件相关信息,以及安装、卸载前后要执行的脚本,然后展开压缩的源代码包,打上补丁,执行编译,然后利用make install 可以重新指定安装目的地的特性,把编译好的文件安装到指定的虚拟根目录下的指定位置里,一般是虚拟的/usr 里,然后把这些目录、信息和脚本打成一个压缩包,即rpm 包。同时可选地生成源码包src.rpm。当然有很多具体细节问题。您应该首先阅读软件的readme 和INSTALL 文件。

打包原则

1. 任何人都应该在系统现有src.rpm 的spec 基础上修改更新,除非没有这样的包。这可以省去很多麻烦,少走弯路。

2. 任何人都无权删除别人的changelog 和原始打包者的信息,这是对别人的不尊重。但你可以追加自己的信息。

3. 尽可能在spec 里使用系统的标准宏定义,而不要用非标准写法。

4. 任何人都不应该直接提供修改后的源代码,而应该以补丁形式发布你的修改,在spec 里完成打补丁操作。务必做到一个补丁只解决一个问题,这样才能确保补丁的可重用性,否则

版本升级后补丁很容易失效。如果你确信自己的补丁是清洁补丁,尽可能发给上游开发者,这样才能一劳永逸。你所打的任何补丁,其授权方式必须和被修改源代码保持一致。

预备知识:

首先我们观察一下rpm 文件名的特点。一个rpm 包文件名通常由 5 段组成:

%{name}-%{version}-%{release}.ix86.rpm

cutedict-1.1-1mgc.i686.rpm

这里%{name}=cutedict,%{version}=1.1,%{release}=1mgc,ix86=i686,如果是为athlon 芯片家族编译的包,这里就是athlon,依此类推。

注意:

下面是一个spec 模板。

1. 凡是行首加上# 的都被注释掉了,实际运行时不起作用,如要使其生效,请去掉注释符#。

2. 凡是以%{***} 和%*** 形式出现的符号都是“宏”,很多宏都是系统预定义的[注2],也可以是自己定义的。

3. 下面的黑体字是spec 文件的关键字,不能写错。

4. 有不明白的地方可以参见跟帖里的参考文献。

5. 如果软件没有使用GNU autotool 创建,而是自己写的Makefile,这就导致不能按照常规方法打包,非常麻烦。

6. 服务器软件通常都需要大量预配置工作,spec 打包绝非一两天能解决,需要深入研究很多东西和反复实践,建议初学者不要尝试。

7. 其他发行版的spec 与src.rpm 是很好的教材,建议打包前先找找Fedora 或SuSE 的文件学习,能借鉴最好,但不应该不修改照搬过来或使用Mandrake 的文件,因为它使用的大量宏定义和我们不兼容,甚至src.rpm 直接编译都通不过。

------------------------------------------------------------------

[spec 文件头部]

# Initial spec file created by autospec #这里是一些注释

%define _noautoreq perl(Plot) perl(WidgetDemo) #这里用%define 自定义一个系统里没有的叫做_noautoreq 的宏,后面可以用%{_noautoreq} 引用。

Name: software #这是软件包名称,后面可以用%{name} 引用

Summary: a software #这是软件包的内容提要

#Summary(zh_CN): #这里写入中文内容提要(如果有必要。不建议使用,因为如果系统里的默认编码与此处不符,会导致显示乱码。例如:我们使用GBK,如果这里的中文是UTF-8 编码,在kpackage 里就会显示乱码,但是synaptic 可能能够正确显示,但需要把zh_CN 改为zh_CN.UTF-8 )

Version: number #这是软件的实际版本号,例如2.1.6、2.2final 等,后面可以用%{version} 引用

Release: number #发布序列号,我们用1mgc、2mgc 等等,标明这是第几次打包。如果软件本身是预览版,比如pre6 版,则写成pre6_1mgc、pre6_2mgc,后面可以用%{release} 引用

Group: Applications/Multimedia #这是软件分组,建议使用标准分组,参见下面:[注1]

#Group(zh_CN): #中文软件分组(如果有必要)

License: GPL #这是软件版权证书,通常是GPL

Source: %{name}-%{version}.tar.gz #这是源代码(通常是压缩包),可以带有完整的网址,可以用正整数标识多个源Source0 Source4 Source5 Source100,数字不必连续排列,后面可以用%{SOURCE0}、%{SOURCE4}、%{SOURCE5}、%{SOURCE100} 引用。例如https://www.360docs.net/doc/3415810485.html,/src/%{name}-%{version}.tar.gz

BuildRoo t: %{_tmppath}/%{name}-%{version}-%{release}-buildroot #这是make install 时使用的“虚拟”根目录也称为“构建根”目录,通常是/var/tmp/软件名称-版本号-发布序列号-buildroot,make install 时一般会将软件安装在/var/tmp/软件名称-版本号-发布序列号-buildroot/usr/ 下的bin/ 下(可执行文件)、share/ 下(数据、资源文件)、lib/ 下(共享库文件)等等,例如/var/tmp/cce-0.51-1mgc-buildroot/usr/bin/cce。不过实际不一定都是这样,具体情况具体对待

# 下面是可选的字段

URL: https://www.360docs.net/doc/3415810485.html,/ #这是软件主页地址

#Vendor: Red Hat Co.,ltd. #这是发行商或者打包组织的信息,我们统一写成MGC Group,不过这一行可以省略,把它写入/usr/lib/rpm/macros 标准宏定义文件里,该文件的Vendor 这行定义是空的,而且通常前面用# 注释掉了

#Distribution: Red Hat Linux #这是软件针对的发行版标识,我们是Magic Linux

Patch: src-%{version}.patch #这是补丁源代码(可以是压缩包),可以用正整数标识多个源Patch1 Patch4 Patch6,数字不必连续排列。

Prefix: %{_prefix} #指定make install 时在虚拟根目录里的安装位置,通常用标准的%{_prefix} 宏,它代表/usr。这里指定后,用户可以在rpm 安装阶段重新指定安装到其他位置,如/opt,否则就不能改变安装位置。

Prefix: %{_sysconfdir} #如果软件有些文件并非都安装到%{_prefix},那么你需要指明其他位置。例如你需要把一个配置文件放到/etc 下面,这显然不在/usr 下面,此时你需要前方这种写法。%{_sysconfdir} 宏代表/etc。这里指定后,用户可以在rpm 安装阶段重新指定这些文件安装到其他位置,如/opt/etc,否则就不能改变安装位置。[注3]

#BuildArch: noarch#编译目标处理器架构,就是今后软件运行时的CPU 类型。noarch 是不指定架构,通常标准默认是i386,定义在了系统的标准宏定义文件/usr/lib/rpm/macros 里[注2]。实际编译时可以在rpmbuild 命令行用--target=i686 参数,spec 里通常不写这行。#Requires: XFree86>=4.3 zlib libpng #这里罗列所有安装本包时需要先行安装的包(依赖包),通常软件会依赖这些包里的一部分文件。可以分成多行来写。如果这里不写明依赖包,打包时系统会自动把具体依赖的.so 文件写进rpm 包,而不会注明这些文件属于哪些软件包,这会对用户造成困惑,因为他们很难知道这些文件属于哪些软件包

#Obsoletes: #这里列出的软件包都是“陈旧”的,当安装本包的时候,这里列出的包都会被自动卸载!

NoAutoReq: %{_noautoreq} #这里的意思是禁止自动查找对spec 文件头部预定义的_noautoreq 宏里定义的两个软件包[perl(Plot) 和perl(WidgetDemo)]的依赖关系,通常对于

prel 模块需要这样处理。因为即便你在Requires 字段指明了本包所依赖的包含这两个模块的那些软件包,安装本包的时候系统仍然会直接查找是否安装有这些perl 模块,而不会查找那些包含这两个模块的软件包是否已经安装。

#PreReq: loop #如果在%post 字段执行的脚本需要使用一些特殊命令,例如loop,你需要在此标明

#Requires(post): loop #这是上面一行的另一种写法

#Autoreq: 0 #这里使用0 关闭了自动标注本软件包需要的依赖关系的功能,使用1 或者不写此行(默认)就是开启自动标注依赖关系的功能。自动依赖校验只会通过pkgconfig 找出依赖的.so 文件,而绝对不是软件包!可以通过命令反查生成的rpm 包所依赖的这些.so 文件属于哪个包,再把这些依赖的包的名称写进spec,最后重新编译就行了。

#Autoprov: 0 #这里使用0 关闭了自动标注本软件包提供的依赖关系的功能,使用1 或者不写此行(默认)就是开启自动标注依赖关系的功能

#Autoreqprov: 0 此关键字兼具上述两条的功能

#BuildRequires: XFree86-devel>=4.3 #这是编译时依赖的包

#Provides: lda #这里标注本软件包提供的某些特定功能。例如sendmail 在没有本地递送代理[local delivery agent (lda)] 时不能工作,而你的软件包恰好提供了这一功能,你需要在此标明。而在sendmail 的spec 里你需要写明:Requires: lda

Packager: Tony Black #这是打包者的信息

%description软件的详细说明

This is the description...

#%description -l zh_CN 中文软件说明(如果有必要。不建议使用,因为如果系统里的默认编码与此处不符,会导致显示乱码。例如:我们使用GBK,如果这里的中文是UTF-8 编码,在kpackage 里就会显示乱码,但是synaptic 可能能够正确显示,但需要把zh_CN 改为zh_CN.UTF-8 )

[spec 文件体部]

%prep #下面开始预处理

%setup -n %{name}-%{version} #到这里,系统把源码包从/usr/src/mBuild/SOURCES 解压缩到/usr/src/mBuild/BUILD/%{name}-%{version} ,并转到那里展开的压缩包目录(%{name}-%{version} )里,以便完成打补丁等准备工作,最后还要退回到/usr/src/mBuild/BUILD 目录下。-n 后面指定的参数代表tar 包展开后生成的目录名,一般-n %{name}-%{version} 是不需要的,除非tar 包名称和展开后生成的目录名不符,或者你要处理多个tar 包。如果打包时报告找不到./configure 说明-n 参数指定的目录不对,或者软件源代码目录里没有configure 脚本(比如你的代码是从cvs 里commit out 出来的,你需要进行一些准备工作,比如通过运行autogen.sh 脚本来自动创建configure 脚本。这具体看是哪个软件,不同软件有不同的方法)。如果有多个源代码包要编译,用“-n 名称”指定多个setup 字段。

%patch #这里开始打补丁。例如%patch0 -p1,%Patch2 -p1 -b .xxx.patch 这里%patch0 是对

第一个补丁的引用,%Patch2 -p1 -b .xxx.patch 表明第二个补丁是压缩包,要先解压缩,再打补丁。-p1 是patch 命令的常用参数,代表忽略patch 时的第一(顶)层目录。(为什么?因为创建补丁时两个比照的目录或者文件名肯定是不同的。参见[注5])

%configure #系统重新进入/usr/src/mBuild/BUILD/%{name}-%{version} 执行configure 脚本进行配置,然后返回/usr/src/mBuild/BUILD 目录下。%configure 是rpm 定义的标准配置宏,含义很复杂,但绝对标准。具体含义参见[注2]。非标准写法:

CFLAGS="$RPM_OPT_FLAGS" \

CXXFLAGS="$RPM_OPT_FLAGS" \

./configure --prefix=%{_prefix}

或者:

CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}

%build #开始构建包。系统重新进入/usr/src/mBuild/BUILD/%{name}-%{version} 执行make,然后返回/usr/src/mBuild/BUILD 目录下。

make #这是make 命令

%install #下面开始将编译好的软件安装到虚拟的根目录。系统重新进入/usr/src/mBuild/BUILD/%{name}-%{version} 执行make install,然后返回/usr/src/mBuild/BUILD 目录下。

rm -rf $RPM_BUILD_ROOT #先清理安装目的地——虚拟根目录

%makeinstall #这是rpm 定义的标准的安装宏,含义很复杂,但绝对标准。具体含义参见[注2]。

非标准写法:make DESTDIR=$RPM_BUILD_ROOT install 或者make prefix=$RPM_BUILD_ROOT install (这行原先写错了,非常抱歉)

%clean #清扫战场,打包完成后删掉编译过程产生的中间文件、目录

[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT" #如果虚拟根目录不是真正的/ 目录,就删除掉。这里将软件打包时安装到的虚拟根目录删掉。通常直接用rm -rf $RPM_BUILD_ROOT 就很安全。

rm -rf $RPM_BUILD_DIR/%{name}-%{version} #将/usr/src/mBuild/BUILD/软件名称-版本号目录删掉。这里是编译过程生成的中间文件。

按照我们在/usr/lib/rpm/macros 里的定义,通常

%clean

rm -rf $RPM_BUILD_ROOT

rm -rf $RPM_BUILD_DIR/%{name}-%{version}

也可以写成

%clean

%{__rm} -rf %{buildroot}

%{__rm} -rf %{_builddir}/%{name}-%{version}

%post #rpm 包安装后执行的脚本。

/sbin/ldconfig #这里举例,ldconfig 用于安装库文件后进行“注册”,这么说不准确,但好理解。这里可以是任何sh 脚本。

%postun #rpm 包卸载后执行的脚本。

/sbin/ldconfig #这里举例,ldconfig 用于卸载库文件后更新“注册”

%files #本节定义哪些文件、目录将被打进rpm 包里。如果你认为哪些文件不必打进rpm 包里(一般是debug、src 和devel 文件、目录),你就不要列在这里,或者使用%exclude 关键字指明哪些文件不打进rpm 包里。你甚至可以在spec 文件的其他字段安装或者删除一些特定的文件,这就是比较复杂的技术了。但是如何才能知道到底软件向系统内安装了哪些目录和文件呢?这个问题有点复杂。参见[注4]。注意:此处系统的当前路径指的就是虚拟的根目录。所以虚拟的根目录路径(例如/var/tmp/cce-0.51-1mgc-root/)不要写在这里。应该直接用类似%{_bindir} 的宏(表示/usr/bin ) 来指定包含的目录,也可以单独指定一个或一组文件。

%defattr(-,root,root) 指定包装文件的属性,代表(mode, owner, group) 即文件属性、文件属主、用户群组,- 代表属性为默认值,对文本文件是八进制数0644,可执行文件是0755。下面指定具体哪些目录或文件将被打进包里,很多宏的定义要看你的具体系统[注2]

#下面具体指定打进rpm 包的文件、目录,例如:

%dir %{_datadir}/tst/

%dir %{_datadir}/tst/plugin/

%{_bindir}/tst

%{_datadir}/tst/plugin/libtest.so

"/usr/share/tst/plugin/*.png"

%{_datadir}/tst/plugin/test.plugin

%config %{_datadir}/tst/tst.conf

%exclude /usr/src #如果上面列出的目录里包含一些你不想要的东西,比如源代码(src),你可以在此将他们“抠”出去。这里指定具体哪些目录或文件将被排除在包外,即不打进包,一般是debug、src 和devel 文件、目录。

%files devel #这里分出devel 包,主要包含与软件开发相关的头文件与库文件包。

%defattr(-,root,root)

%{_includedir}

[spec 文件尾部]

%changelog #下面是标准变更日志,日期一定不能写错,只能是英文格式。

* Sun Oct 31 2004 Tony Black

- modify the spec file and rebuild

* Sun Oct 03 2004 Lover

- initial spec file created by autospec ver. 0.8 with rpm 3 compatibility

-----------------------------------------------------------------------

把源代码压缩包、补丁等等放到/usr/src/mBuild/SOURCES 目录里,把spec 文件放到/usr/src/mBuild/SPECS 目录里,在SPECS 目录里以root 身份执行:

rpmbuild -ba --target=i686 xxx.spec

即可在/usr/src/mBuild/RPMS/i686 里生成rpm 包,一般还会有debug info 包,对普通用户基本没什么用。在/usr/src/mBuild/SRPMS 里则生成src.rpm 包。

如果只想生成二进制包,使用下面命令:

rpmbuild -bb --target=i686 xxx.spec

如果只想生成源代码包,使用下面命令:

rpmbuild -bs --target=i686 xxx.spec

注1:

rpm 软件包系统标准分组在这里:

/usr/share/doc/rpm-4.3.2/GROUPS

大致内容如下:

Amusements/Games

Applications/Archiving

Applications/Communications

Applications/Databases

Applications/Editors

Applications/Emulators

Applications/Engineering

Applications/File

Applications/Graphics

Applications/Internet

Applications/Multimedia

Applications/Productivity

Applications/Publishing

Applications/System

Applications/Text

Development/Debuggers

Development/Languages

Development/Libraries

Development/System

Development/Tools

Documentation

System Environment/Base

System Environment/Daemons

System Environment/Kernel

System Environment/Libraries

System Environment/Shells

User Interface/Desktops

User Interface/X

User Interface/X Hardware Support

注2:

各种宏定义在系统这里:

/usr/lib/rpm/macros

通常我们要对其适当优化一下,修改如下:

%vendor MGC Group

%optflags -O2 -g -pipe

%_arch i686 这里相当于rpmbuild 的参数--target=i686 指将来运行软件包时的环境

%_build_arch i686 这里相当于rpmbuild 的参数--build=i686 指建包时的环境(你的机器),这可以比默认的i386 快一些。

常见宏定义(左侧是宏名,右侧是相应的定义):

%_prefix /usr

%_exec_prefix %{_prefix} #展开后是/usr

%_bindir %{_exec_prefix}/bin #展开后是/usr/bin

%_sbindir %{_exec_prefix}/sbin #展开后是/usr/sbin

%_libexecdir %{_exec_prefix}/libexec #展开后是/usr/libexec

%_datadir %{_prefix}/share #展开后是/usr/share

%_sysconfdir %{_prefix}/etc #展开后是/usr/etc 但是在magic linux 里%_sysconfdir 代表的是/etc,这是由另一个被发行版特殊定制的文件决定的!

%_sharedstatedir %{_prefix}/com #展开后是/usr/com

%_localstatedir %{_prefix}/var #展开后是/usr/var

%_libdir %{_exec_prefix}/lib #展开后是/usr/lib

%_includedir %{_prefix}/include #展开后是/usr/include

%_infodir %{_prefix}/info #展开后是/usr/info

%_mandir %{_prefix}/man #展开后是/usr/man 在magic linux 里%_mandir 代表的是/usr/share/man

***注意***

仅当你使用标准配置宏%configure 的时候,文件才会被指定到上述标准位置上。否则,如果你在%file 字段使用这些标准宏就可能出错,系统可能报告找不到这些文件,因为它们可能默认安装到了别处。

*********

已安装的RPM 包数据库在这里:

/var/lib/rpm/

注3:

软件包安装时用参数--prefix

重新指定安装位置。例如:

软件包默认安装到/usr 下,你希望安装到/usr/opt 下,则使用命令:

rpm -ivh --prefix /usr/opt xxx.rpm

如果你还有一些文件默认安装到/etc 下,你需要安装到/usr/etc 下,则要改用命令:

rpm xxx.rpm --relocate /usr=/usr/opt --relocate /etc=/usr/etc

如何知道rpm 软件包到底向系统什么位置安装了什么文件呢?,你可以使用下面的命令查询:

rpm -qpl xxx.rpm

注4:

任何没有被列在%files 字段的目录或文件都不会被自动打进rpm 包里。反之如果你在任何%files 字段指定了虚拟根目录里并不存在的东西,系统就会报错,包括用%exclude 排除的东西也是这样。通常我们只需要在%files 字段指定所有顶层目录就可以了。若要了解软件到底向系统内安装了哪些目录和文件,你可以采取下列办法:

1. 在%files 字段内只写进%{_prefix}:

%files

%defattr(-,root,root)

%{_prefix}

这样所有东西都将被打进rpm 包。打好包之后,用如下命令查询生成的rpm 包的目录结构:

rpm -qpl xxx.rpm

2. 打包前手工执行配置、安装,当./configure 执行后,重定向安装到一个虚拟根目录里。例如(注意大小写):

./configure

make (这步可以省略,不信就试试)

make DESTDIR=/var/tmp/xxx install 或者make prefix=/var/tmp/xxx install

然后进入/var/tmp/xxx 目录查看里面的目录结构:

cd /var/tmp/xxx

tree

3. 打包前手工执行配置、安装,当 ./configure 执行后,查看生成的Makefile 的install 字段。注意:如果软件不符合GNU 规范,可能并没有提供configure 脚本,而是直接提供了Makefile。这些通常都是游戏软件。这比较复杂,如果你不懂编程,可能看不懂Makefile。

注5:

补丁通常是这样创建的:

diff -Nur directory.old directory.new > xxx.patch

directory.old 代表旧源代码目录,directory.new 代表修改过的新源代码目录。

--------------------------------------------------------------------------------

这里有一个由压缩包直接创建rpm/srpm 包的工具,但是它无法知道那些文件、目录应该被打进包里,你需要指定:

https://www.360docs.net/doc/3415810485.html,/project/showfiles.php?group_id=6319&package_id=6381&release_id=7939

下面是一个实际例子,更多范例可以浏览这里:

https://www.360docs.net/doc/3415810485.html,/people/kde/magic/specs/

--------------------------------------------------------------------

Summary: KDE graphics package

Name: kdegraphics

Version: 3.3.0

Release: 2mgc

Copyright: GPL

URL: https://www.360docs.net/doc/3415810485.html,

Group: desktop/kde

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

Source: %{name}-%{version}.tar.bz2

Prefix: %{_prefix}

Requires: qt, arts, kdelibs, kdebase, liblcms, fribidi

Packager: kanker <这里填写kanker 的实际邮件地址,为防垃圾邮件,我把它去掉了>

%description

Graphic applications for the K Desktop Environment. provide some useful tools like ksnapshot,kpaint and so on.

%package devel

Summary: Development files for kdegraphics

Requires: %{name}

Group: Development/Libraries

Provides: kviewshell-devel

Provides: libkscan-devel

%description devel

Graphic applications for the K Desktop Environment. This package contains header files for developing applications using kdegraphics.

%prep

%setup -q -n %{name}-%{version}

%Build

rm -rf kcoloredit

rm -rf kpdf

rm -rf kruler

rm -rf kgamma

rm -rf kuickshow

rm -rf kview

make -f admin/https://www.360docs.net/doc/3415810485.html,mon cvs

./configure --prefix=%{_prefix} --enable-final --disable-debug \

--with-extra-includes=%{_includedir}/freetype2 --includedir=%{_includedir}

make

%install

rm -fr $RPM_BUILD_ROOT

make DESTDIR=$RPM_BUILD_ROOT install

cp -r $RPM_BUILD_ROOT%{_datadir}/apps/kolourpaint/icons/hicolor/* $RPM_BUILD_ROOT%{_datadir}/icons/crystalsvg/

%clean

rm -rf $RPM_BUILD_ROOT

rm -rf $RPM_BUILD_DIR/%{name}-%{version}

%files

%defattr(-,root,root)

%{_bindir}

%{_libdir}

%{_datadir}

%exclude %{_libdir}/debug

%files devel

%defattr(-,root,root)

%{_includedir}

%changelog

* Sun Oct 3 2004 kde <这里填写实际邮件地址>

- fix the spec file and rebuild

* Sat Oct 2 2004 kanker <这里填写实际邮件地址>

- initialize the first spec file

软件安装之--RPM命令大全!

RPM 大全 RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证。下面我们就来逐一的讲解吧。 一、安装RPM包 RPM 软件包通常具有类似foo-1.0-1.i386.rpm 的文件名。其中包括软件包的名称(foo),版本号(1.0), 发行号(1),和硬件平台(i386)。安装一个软件包只需简单的键入以下命令: $ rpm -ivh foo-1.0-1.i386.rpm foo #################################### RPM安装完毕后会打印出软件包的名字(并不一定与文件名相同),而后打印一连串的#号以表示安装 进度。虽然软件包的安装被设计的尽量简单易行,但还是可能会发生如下的错误: 1、软件包已被安装 如果您的软件包已被安装, 将会出现以下信息: $ rpm -ivh foo-1.0-1.i386.rpm foo package foo-1.0-1 is already installed error: foo-1.0-1.i386.rpm cannot be installed 如果您仍旧要安装该软件包,可以在命令行上使用--replacepkgs 选项,RPM将忽略该错误信息强行安装。 2、文件冲突 如果您要安装的软件包中有一个文件已在安装其它软件包时安装,会出现以下错误信息:# rpm -ivh foo-1.0-1.i386.rpm

foo /usr/bin/foo conflicts with file from bar-1.0-1 error: foo-1.0-1.i386.rpm cannot be installed 要想让RPM 忽略该错误信息,请使用--replacefiles 命令行选项。 3、未解决依赖关系 RPM软件包可能依赖于其它软件包,也就是说要求在安装了特定的软件包之后才能安装该软件包。 如果在您安装某个软件包时存在这种未解决的依赖关系。会产生以下信息: $ rpm -ivh bar-1.0-1.i386.rpm failed dependencies: foo is needed by bar-1.0-1 您必须安装完所依赖的软件包,才能解决这个问题。如果您想强制安装(这是个坏主意,因为安装后的软 件包未必能正常运行),请使用--nodeps 命令行选项。 二、卸载RPM包 卸载软件包就象安装软件包时一样简单: $ rpm -e foo 注意这里使用软件包的名字name ``foo,而不是软件包文件的名字file ``foo-1.0-1.i386.rpm。如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。如: $ rpm -e foo removing these packages would break dependencies:foo is needed by bar-1.0-1 若让RPM忽略这个错误继续卸载(这可不是一个好主意,因为依赖于该软件包的程序可能无法运行), 请使用--nodeps 命令行选项。

PCB数控钻孔机及锣机CNC刀具指令大全(全面)

数控钻孔机及锣机CNC刀具指令大全 EXCELLON是最早使用电脑化钻机及锣机,它开发了一套电脑控制机器的指令,被称为EXCELLON Computer Numeric Control,其中一些已成为工业标准. EXCELLON 最早开发的是钻机,这时候的格式被称为Format One ,随后又开发了用于锣机的语言,被称为Format Two,1979 年EXCELLON更新了Format Two 语言,将钻机和锣机指令集合到一套通用的语言系统. 因此,早于1979年前的被称为Generation One的机型只能行Format One ,而1979后的被称为Generation Two 的机型则可以使用Format One 或Format Two 语言系统. 机器运行有两种程序来驱动: 1)系统软件程序由机器的供应商编写,用于机器本身驱动; 2)程序体由线路板制造商使用CNC的编程语言,根据客户提供的相关资料编写,用于制造线路板 目前,用EXCELLON格式的语言编写的程序可以在不同制造商的机器上使用. 程序体组成 1)程序头用于描述关于工作的一般信息,通常位于程序主体的开头,是可选的,所有的命令可以在程序运行前,由操作员在控制台上输入机器.包括: a) 钻嘴或锣刀的尺寸. b) 使用的测量系统. c) 工作中X,Y轴的方向. 2)程序主体而程序的主体则包含一系列的坐标及指令,通常这些指令会从头到尾的去执行. 刀具指令 以下一些指令用于选择或控制刀具,其中一些可以单独使用,而另一些可以联合形成一条指令,而当在程序头中使用这些指令时,它们是用于将数据调入CNC-6中的,当这些指令用于程序体时,它们是用来控制刀具的改变或机器的移动。刀具指令后面的数字用来表明数量,距离,速度等参数,可以从1位到6位,取决于指令的类型. T# T#(#) F# S# C# H# Z+/-# T# 刀具选择 这个指令可以在手动或自动设置状态下使用,它可以用于程序头或程序主体。 在自动换刀具设置状态下:主轴夹头将自动将正在使用的刀具放进T座, 而抓取#所对应的刀具,并自动移动到程序主体下一个坐标。 在手动换刀具设置状态下:机器工作台将停下,这时,在屏幕会出现换刀具提示信息。 T#(#) 选择刀具并指定补偿序号 该指令用于选择指定的刀具并为该刀具设置补偿序号。该指令后面有4位数字,前两位表示所选择刀具的编号,后两位表示补偿序号,如果,后两位被省略或为零,则表明补偿序号

NFS参数配置详细说明

NFS参数配置详细说明 1、NFS概述 NFS:Network file system,网络文件系统; 由sun公司1984年推出,用来在网络中的多台计算机间实现资源共享(包括象文件或cd-rom); 设计的目的是:实现在不同系统间交互使用,所以它的通信协议采用与主机和操作系统无关的技术; NFS Server可以看作是File Server,它可以让你的PC通过网络将远端得NFS SERVER共享出来的档案MOUNT到自己的系统中,在CLIENT看来使用NFS的远端文件就象是在使用本地文件一样; NFS协议从诞生到现在有多个版本:NFS V2(rfc1094),NFS V3(rfc1813)(最新的版本是V4(rfc3010); 如何查看nfs当前的版本: rpm -qi portmap rpm -qi nfs-utils NFS服务器的安装: 可以由多种安装方法: ----在安装linux系统时选择安装nfs服务对应的组件;(多数linux发行版本默认安装) ----安装nfs的rpm套件包(手动安装) rpm -ivh rpm包 需要5个RPM包。 setup-*:共享NFS目录在/etc/exports中定义(linux默认都安装) initscripts-*:包括引导过程中装载网络目录的基本脚本(linux默认都安装) nfs-utils-*:包括基本的NFS命令与监控程序 portmap-*:支持安全NFS RPC服务的连接 quota-*:网络上共享的目录配额,包括rpc.rquotad (这个包不是必须的) ----也可以去下载nfs的源代码包,进行编译安装; RPC(Remote Procedure call) NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER.所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。 nfs在系统中的后台守护进程: nfs nfs服务需要启动的其他进程: rpc.nfsd:接收从远程系统发来的NFS请求,并将这些请求转化为本地文件系统请求;rpc.mountd:执行被请求的文件系统的挂接和卸载操作; rpc.portmapper:将远程请求映射到正确的NFS守护程序; rpc.statd:在远程主机重启时,提供加锁服务; rpc.quotaed:提供硬盘容量的管理能力,磁盘限额; rpcinfo -p 可以查看所要的守护进程时候正常运行; ps -ef | grep nfsd

Linux实验指导书

Linux操作系统 (适用于计算机专业专科学生) 实 验 指 导 书 信息科学与技术学院二0一0年八月制

目录 实验一 Red Hat Linux 9.0系统的安装 (3) 实验二常用命令的使用(一) (15) 实验三常用命令的使用(二) (21) 实验四 Vi编辑器的使用 (27) 实验五 Linux系统管理与配置 (29) 实验六 shell编程(一) (32) 实验七 shell编程(二) (37) 实验八 shell编程及图形环境的使用 (39)

实验一 Red Hat Linux 9.0系统的安装 一、实验目的 1.掌握安装Linux系统时收集计算机硬件信息的方法 2.掌握Linux硬盘的分区方法和硬盘分区的大小 3.掌握Linux系统安装的过程和在安装过程中各选项的设置 二、实验环境 微型计算机一台,Red Hat Linux9.0系统盘一套 VMware Workstation v5.5.16325 sn:8UX0R-686FT-Z054V-4PDQPORLCT4T-24GFE-A816V-4MTQQ 三、实验内容及步骤 1.安装前的准备工作 步骤一:关闭BIOS中的病毒报警功能,如果硬盘大于8G设置硬盘为LBA模式。 步骤二:备份硬盘上的所有重要数据! 步骤三:为Linux系统准备足够的硬盘空间。 2.安装Red Hat Linux 9.0 将Red Hat Linux 9.0安装光盘插入光驱,然后启动计算机,即可从CD-ROM启动Linux 安装程序。 步骤1:boot:提示。 机器启动之后,显示boot: 提示屏幕,其中包括了几个不同的引导选项,每个引导选项还有一个或多个与之关联的帮助屏幕。要访问帮助屏幕,可按在屏幕底部列出的恰当的功能键。 为以图形方式从光盘中安装Red Hat Linux,单击回车键。 步骤2:安装程序检测用户系统并试图识别光驱。如果找到了,会进入安装进程的下一阶段。 这时若要中止安装进程,应取出引导磁盘或光盘,重新引导机器。在“即将安装”屏幕(步骤19) 之前的任何时候,都可以安全地中止安装。 步骤3:欢迎使用Red Hat Linux。 “欢迎”屏幕并不提示做任何输入。可阅读左侧面板内的帮助文字来获得附加的说明,以及关于如何注册Red Hat Linux产品的信息。

详细rpm用法

详细rpm用法 一、安装.src.rpm软件包 (1) 方法一: (1) 方法二: (2) 二、rpmbuild命令使用 (2) *使用命令:rpmbuild .[OPTION] (2) *从文件建立 (2) *从包建立 (3) *从包建立 (3) *rpmbuild的其他使用项 (3) *所有rpm都可使用的选项 (4) *附加选项 (5) *帮助选项 (5) 三、在Linux系统中RPM 命令参数使用详解 (5) 1、安装 (5) 2、删除卸载 (7) 3、升级 (8) 4、查询 (9) 5、校验已安装的软件包 (11) 6、校验软件包中的文件 (12) 7、其它RPM选项 (13) 一、安装.src.rpm软件包 有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法: 方法一: 1.执行rpm -i your-package.src.rpm 2.cd /usr/src/redhat/SPECS 3.rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件 4.cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录 5../configure 这一步和编译普通的源码软件一样,可以加上参数 6.make 7.make install

方法二: 1.执行rpm -i you-package.src.rpm 2.cd /usr/src/redhat/SPECS (前两步和方法一相同) 3.rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件 这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等) 在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。执行: rpm -i new-package.rpm即可安装完成。 二、rpmbuild命令使用 Usage: rpmbuild [OPTION...] *使用命令:rpmbuild ·[OPTION] Build options with [ | | ]: *建立包的选项有:[ 从文件建立|从包建立|从包建立] *从文件建立 -bp build through %prep (unpack sources and apply patches) from * -bp 从文件的%prep段开始建立(解开源码包并打补丁) -bc build through %build (%prep, then compile) from *-bc 从文件的%build -bi build through %install (%prep, %build, then install) from -bl verify %files section from *检查文件的%files段 -ba build source and binary packages from *建立源码和二进制包 -bb build binary package only from *只建立二进制包 -bs build source package only from *只建立源码包

Linux RPM 命令参数使用详解

Linux RPM命令参数使用详解[介绍和应用] RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装。源代码包经常以src.rpm作为后缀名。 常用命令组合: -ivh:安装显示安装进度--install--verbose--hash -Uvh:升级软件包--Update; -qpl:列出RPM软件包内的文件信息[Query Package list]; -qpi:列出RPM软件包的描述信息[Query Package install package(s)]; -qf:查找指定文件属于哪个RPM软件包[Query File]; -Va:校验所有的RPM软件包,查找丢失的文件[View Lost]; -e:删除包 rpm -q samba //查询程序是否安装 rpm -ivh /media/cdrom/RedHat/RPMS/samba-3.0.10-1.4E.i386.rpm //按路径安装并显示进度 rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm //指定安装目录 rpm -ivh --test gaim-1.3.0-1.fc4.i386.rpm//用来检查依赖关系;并不是真正的安装; rpm -Uvh --oldpackage gaim-1.3.0-1.fc4.i386.rpm //新版本降级为旧版本 rpm -qa | grep httpd#[搜索指定rpm包是否安装]--all搜索*httpd* rpm -ql httpd#[搜索rpm包]--list所有文件安装目录 rpm -qpi Linux-1.4-6.i368.rpm#[查看rpm包]--query--package--install package信息 rpm -qpf Linux-1.4-6.i368.rpm#[查看rpm包]--file rpm -qpR file.rpm#[查看包]依赖关系 rpm2cpio file.rpm |cpio -div #[抽出文件] rpm -ivh file.rpm #[安装新的rpm]--install--verbose--hash rpm -ivh https://www.360docs.net/doc/3415810485.html,/fedora/core/4/i386/os/Fedora/RPMS/gaim-1.3.0-1.fc4.i386.rpm rpm -Uvh file.rpm #[升级一个rpm]--upgrade rpm -e file.rpm #[删除一个rpm包]--erase 常用参数: Install/Upgrade/Erase options: -i, --install install package(s) -v, --verbose provide more detailed output -h, --hash print hash marks as package installs (good with -v) -e, --erase erase (uninstall) package -U, --upgrade=+ upgrade package(s) --replacepkge 无论软件包是否已被安装,都强行安装软件包 --test 安装测试,并不实际安装 --nodeps 忽略软件包的依赖关系强行安装 --force 忽略软件包及文件的冲突 Query options (with -q or --query): -a, --all query/verify all packages -p, --package query/verify a package file

Linux下解压命令大全解压缩rbzziprg精选z

L i n u x下解压命令大全解压缩r b z z i p r g精选z 公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

分方法我没有用到,也就不全,希望大家帮我补充,我将随时修改完善,谢谢!.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压1:gunzip FileName.gz 解压2:gzip -d FileName.gz 压缩:gzip FileName .tar.gz 和 .tgz ———————————————

.bz2 解压1:bzip2 -d FileName.bz2 解压2:bunzip2 FileName.bz2 压缩: bzip2 -z FileName .tar.bz2 ———————————————.bz 解压1:bzip2 -d FileName.bz 解压2:bunzip2 FileName.bz 压缩:未知 .tar.bz 压缩:未知

——————————————— .Z 解压:uncompress FileName.Z 压缩:compress FileName .tar.Z 解压:tar Zxvf FileName.tar.Z 压缩:tar Zcvf FileName.tar.Z DirName ——————————————— .zip 解压:unzip FileName.zip 压缩:zip FileName.zip DirName ——————————————— .rar 解压:rar x FileName.rar 压缩:rar a FileName.rar DirName

redhat命令大全

显示字符串或者变量内容 设置/显示Shell变量 显示环境变量 设置环境变量 设置临时环境变量 释放环境变量 设置环境变量 释放环境变量 执行文件当中的命令 查询命令手册 查询超文本命令手册 显示命令简介 通过关键字查询手册 三. 用户管理相关命令 切换到其他用户 追加用户 追加用户 删除用户 修改用户设置 修改用户私人信息 追加组 删除组 修改组设置 更改密码 显示用户名 显示登录用户帐号 显示所有登录用户信息 查询登录用户信息 查询登录用户信息 显示指定用户的ID信息 显示指定用户的所属组 显示指定用户的个人信息 开关与他人收发消息 给其他用户发消息 给所有用户发消息 和其他用户聊天 四. 系统消息相关命令

显示/设置当前时间 显示系统运行时间 显示机器的核心构架(如i386) 显示操作系统信息 显示终端名 显示登录/登出在履历 显示非法登录信息 显示当前键盘配置 变更键盘配置 查询磁盘使用信息 查询磁盘使用信息 显示系统启动消息