社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
C
C++
java
Python
php
perl
ruby
二进制文件、库文件、配置文件、帮助文件
文件清单
安装或卸载时运行的脚本
程序包名称及版本;
依赖关系;
功能说明;
安装生成的各文件的文件路径及校验码信息;
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作;
debian:deb, dpt
redhat: rpm, rpm
Gentoo
Archlinux
yum:rpm包管理器的前端工具;
apt-get:deb包管理器前端工具;
zypper: suse上的rpm前端管理工具;
dnf: Fedora 22+ rpm包管理器前端管理工具;
源代码:name-VERSION.tar.gz
VERSION: major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
VERSION: major.minor.release
release.arch:
release:release.OS
例如:zlib-1.2.7-13.el7.i686.rpm
常见的arch(平台):
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关:noarch
CentOS镜像:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
Fedora-EPEL
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
建议:检查其合法性
来源合法性;
程序包的完整性;
CentOS系统上rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
rpm {-i|–install} [install-options] PACKAGE_FILE …
-v: verbose
-vv:
-h: 以#显示程序包管理执行进度;每个#表示2%的进度
rpm -ivh PACKAGE_FILE …
[install-options]
–test: 测试安装,但不真正执行安装过程;dry run模式;
–nodeps:忽略依赖关系;
–replacepkgs: 重新安装;
–nosignature: 不检查来源合法性;
–nodigest:不检查包完整性;
–noscipts:不执行程序包脚本片断;
%pre: 安装前脚本; --nopre
%post: 安装后脚本; --nopost
%preun: 卸载前脚本; --nopreun
%postun: 卸载后脚本; --nopostun
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作;
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
–oldpackage:降级;
–force: 强行升级;
注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
rpm {-q|–query} [select-options] [query-options]
[select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
-p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作;
–whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
–whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
[query-options]
–changelog:查询rpm包的changlog
-c: 查询程序的配置文件
-d: 查询程序的文档
-i: information
-l: 查看指定的程序包安装后生成的所有文件;
–scripts:程序包自带的脚本片断
-R: 查询指定的程序包所依赖的CAPABILITY;
–provides: 列出指定程序包所提供的CAPABILITY;
用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, …
-qa
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts]
[–notriggers] [–test] PACKAGE_NAME …
rpm {-V|–verify} [select-options] [verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P caPabilities differ
包来源合法性验正及完整性验正:
完整性验正:SHA256
来源合法性验正:RSA
导入所需要公钥:
rpm --import /PATH/FROM/GPG-PUBKEY-FILE
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
rpm {–initdb|–rebuilddb}
initdb: 初始化
如果事先不存在数据库,则新建之;否则,不执行任何操作;
rebuilddb:重建
无论当前存在与否,直接重新创建数据库;
YUM: yellow dog, Yellowdog Update Modifier
yum repository: yum repo
存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata);
yum客户端:
配置文件:
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
默认为:roundrobin,意为随机挑选;
cost=
默认为1000
yum [options] [command] [package …]
yum的options选项:
–nogpgcheck:禁止进行gpg check;
-y: 自动回答为“yes”;
-q:静默模式;
–disablerepo=repoidglob:临时禁用此处指定的repo;
–enablerepo=repoidglob:临时启用此处指定的repo;
–noplugins:禁用所有插件;
yum的命令行选项:
command is one of:
repolist [all|enabled|disabled]
list
~]# yum list [all | glob_exp1] [glob_exp2] […]
~]# yum list {available|installed|updates} [glob_exp1] […]
install package1 [package2] […]
reinstall package1 [package2] […] (重新安装)
update [package1] [package2] […]
downgrade package1 [package2] […] (降级)
check-update
remove | erase package1 [package2] […]
info […]
provides | whatprovides feature1 [feature2] […]
clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
makecache
search string1 [string2] […]#以指定的关键字搜索程序包名及summary信息;
deplist package1 [package2] […]
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
localinstall rpmfile1 [rpmfile2] […]
(maintained for legacy reasons only - use install)
localupdate rpmfile1 [rpmfile2] […]
(maintained for legacy reasons only - use update)
(1) 挂载光盘至某目录,例如/media/cdrom
# mount -r -t iso9660 /dev/cdrom /media/cdrom
(2) 创建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=
yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号;
$arch: 平台;
$basearch:基础平台;
Y
U
M
0
−
YUM0-
YUM0−YUM9
http://mirrors.magedu.com/centos/ r e l e a s e v e r / releasever/ releasever/basearch/os
(3)创建yum仓库:
createrepo [options]
程序包编译安装:
testapp-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装;
官方自建站点:
apache.org (ASF)
mariadb.org
…
代码托管:
SourceForge
Github.com
code.google.com
c/c++: gcc (GNU C Complier)
开发工具:就好像我们做馒头需要有刀,砧板,屉笼等工具make、gcc。
开发环境:好像我们得有原材料啊,馒头需要面、水、酵母等开发库和头文件。
glibc:标准库
通过“包组”提供开发组件
CentOS 6: “Development Tools”, “Server Platform Development”,
源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行
C、C++: make (configure --> Makefile.in --> makefile)
C代码编译安装三步骤:
./configure:
(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;
(2) 检查依赖到的外部环境;
make:
根据makefile文件,构建应用程序;
make install
开发工具:
autoconf: 生成configure脚本
automake:生成Makefile.in
建议:安装前查看INSTALL,README
选项:指定安装位置、指定启用的特性
–help: 获取其支持使用的选项
选项分类:
安装路径设定:
–prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/
–sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;
System types:
Optional Features: 可选特性
–disable-FEATURE
–enable-FEATURE[=ARG]
Optional Packages: 可选包
–with-PACKAGE[=ARG]
–without-PACKAGE
因为一般安装涉及到二进制代码、配置文件、帮助文档、库文件四大项,一部分是给人看的(帮助文档、配置文件),一部分是给计算机看的(二进制文件、库文件),而安装c或c++时要多一项也就是头文件,而我们自主选择编译安装到其他文件夹后,往往不太利于管理,因为我们的命令不在PATH变量中,使用man也不能直接找到程序的帮助文档,库文件所在的地方程序也找不到,所以make编译安装之后还需要解决二进制代码、头文件、帮助文档、库文件四个方面的后续问题,所以需要将安装后的配置:
(1) 导出二进制程序目录至PATH环境变量中;
编辑文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH
(2) 导出库文件路径
编辑/etc/ld.so.conf.d/NAME.conf
添加新的库文件所在目录至此文件中;
让系统重新生成缓存:
ldconfig [-v]
(3) 导出头文件
基于链接的方式实现:
ln -sv
(4) 导出帮助手册
编辑/etc/man.config文件
添加一个MANPATH
不同的语言运行效率不同,c和c++相对效率较高,但是编写较难,而Python和Java相对简单一些,但是中间需要一个虚拟层来再将Python编译后的二进制文件再翻译成操作系统能运行的代码。
当一个应用程序需要很多不同的模块组成时,我们得到这些模块的源代码,而这些源代码先编译哪些?后编译哪些有顺序要求,我们一般很难理解这些顺序和很难记住这些顺序,因此怎么处理呢?此时有项目构建工具:make和maven等工具。
现实社会总会存在主要矛盾和次要矛盾,哪怕家族里面也会存在嫡系和旁系的形式,在程序包中也会出现主包和支包。在舞台上上或者电视剧里总会存在一个主角,其他人都围着他来转的。
因为linux很多工具的功能很单一,仅能解决单一的功能,相当于我们为了完成一顿美味的午餐,我们用的锅是一个工具,那么我们炒菜之前肯定需要用刀这个工具切好菜,或者炒菜需要用天然气,炒菜的时候需要用铲子翻炒菜。或者公司打印报告的依赖与审计报告的,审计报告的依赖项目组提交的报告,而整个报告需要主机、网络、应用等都准备好。
下载的软件包括二进制代码、配置文件、库文件、帮助文件四项,每项都应该放到他们应该在的文件夹内,假如有好多程序包,我们要一个一个的放到相应的文件夹内,卸载时需要一个一个的从相应的文件夹中删除这个工作量很大很麻烦,那么有没有一个工具可以帮我们?rpm程序包管理工具可以帮助我们。另外每个软件包安装前可能需要安装其他软件包,我们不太知道需要的那个软件包是什么,那么有没有工具可以帮助我们辨别和下载安装呢?嘿嘿,yum帮我们解决依赖关系。
rpm工具可以增删查改功能,也就是可以安装、卸载、查询、升级等功能,
一个程序一般提供四项东西,人打交道更多的是文本文档,所以我们一般看到的是配置文件和帮助文件,也就是configure和doc
另外假如我们还没安装程序时,我们可不可以提前咨询一下这个程序的所有信息?可以的rpm -qpl 需要加packages代表的是原材料哦
可以用rpm -V 程序检查。
一些东西是否是合法的,我们是否对他们信任?这些需要他们在我们信任的机关单位(公安或者国家工商局或者银行等)注册,而他们向我们展示的时候我们得能验证他们是否可信,可以通过数字签名。非对称加密算法,加密的对象是经过单向加密得到的特征值。
我们能知道哪些包解压的四个项目各放在那里了,将来卸载的话将去哪里找他们,这样需要有一个数据库来记载这些信息,而这个数据库可以重建和初始化。
重建数据库有initdb和rebuilddb两个命令,initdb就是你没有数据库(房子)的话他帮你建一个,假如有的话就是算了,rebuilddb就是你房子不好了他替你翻新一下。
yum相当于我们安装了一个客户端,当我们需要安装一些软件时,这个客户端可以连接到设置的仓库,去仓库里找这些软件包,根据这些软件的依赖关系将这个软件包需要的软件也装上。就好像我们需要安装一台电脑,销售去仓库取电脑,但是发现需要先买电脑椅或者先安装网线才能买电脑,销售会直接将网线和电脑椅先买好再买电脑回来给我们用。
为了加快运行效率,往往用缓存这个东西来实现。但是缓存往往会有滞后性(因为缓存的东西可能过时了)。是否需要更新缓存可以将本地缓存和网络缓存进行对比,假如将所有缓存里的东西都和网络仓库一一对比的话很消耗时间,效率较低,那么我们可以用检验码这个技术来实现,比较本地缓存和网络缓存的校验码是否一样来确定是否需要更新本地缓存。
当出现多个可选择的对象时,我们选哪个呢?可以轮训(roundrobin)公平分配或者按优先级(priority)分配资源。
依赖关系可以想象成金字塔的上面依赖下面,当然了如果卸载下面的应用时,上面的应用没有了基础当然应该也卸载了啊。
金字塔下面的承载上面几层,上面依赖下面几层。
我们安装的软件都是人家编译好的,我们只需要将下载的四项各自放在自己的文件夹下就可以,但是当我们需要的功能没有相应的编译好的软件时怎么办?此时我们就需要自己编译安装。
很多源代码的功能是分开的,我们不太清楚某部分的代码先编译,另一个功能后编译,除非我们是项目经理,对各功能知道的比较详细,为了让源码使用的人更容易的编译使用这些源代码,相当于yum一样我们有一个项目打包构建管理器make或者maven。
源代码中有哪些功能程序员给了我们一个清单makefile.in而我们可以根据这个清单选择我们需要哪些功能,不需要哪些功能,也就是根据我们的需要选择不同的模块,或者编译后我们将程序放在那里?而我们是用configure这个脚本进行选择的,选择后这个脚本会根据清单生成一个编译计划书–makefile;make项目管理器根据这个计划书进行编译,编译后再用make install将程序、库、配置文件、帮助文档复制到我们定义的文件夹中。
个人理解:可以将makefile.in想象成餐馆给我们提供的所有的菜单,而configure就是我们点菜的时候的点单器,点单器点完菜之后会打印出来一个我们需要的菜单makefile,而make就相当于厨师根据根据makefile去做菜。make install相当于传菜员将做好的菜给我们传过来。
点单器可以用autoconf厂家生产,而automake:可以将这家餐馆的所有的菜单列出来也就是makefile.in。
感想:适可而止非常好,但是很多时候我们也要前进一步。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!