程序包管理 1、软件包的组成部分 1、二进制程序 /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/sbin 2、库文件(二进制) /lib、/lib64、/usr/lib、/usr/lib64、/usr/local/lib、/usr/local/lib64 为程序调用库文件设置路径:系统开机时,会读取/etc/ld.so.conf及/etc/ld.so.con.d/目录下的配置文件 1、/etc/ld.so.conf 2、/etc/ld.so.conf.d/软件名.conf 3、头文件(文本) /usr/include 4、配置文件 /etc 5、帮助文件 man文件:查找与命令名同名通常以.gz结尾的压缩文件名。/usr/share/man/目录下 info文件、README、INSTALL、Changelog 注意:有的帮助文档是在程序内部,例如:ls --help 6、查看某程序所依赖的共享库:ldd 例如:ldd /bin/ls ldd `which cat` 查看加载到内存中的已经缓存的所有库文件名称及路径 lddconfig -p 重新生成缓存 lddconfig 缓存保存路径 /etc/ld.so.cache 2、程序包管理器 rpm(RetHat Package Manager >> RPM is Package Manager) # rpm包组成 1、提供一个数据库 软件包名称 版本 安装生成的各文件路径 校验码 依赖关系 提供功能性说明 2、提供程序组成格式 文件清单 安装卸载时运行的脚本 3、rpm包命名格式 name-version-release.arch.rpm 例如:httpd-2.2.15-59.el6.centos.x86_64.rpm version 源代码程序包版本号 release 通常包含rpm的制作发行号,还包含适用的OS arch: el6:redhat enterprice linux 6 el5 Centos5 Centos6 arch: x86_64 i386,i586,i686 ppc:power pc架构 noarch 分包:一个源码,把个别功能分发出来。 主包 子包 4、包管理器(rpm)基本功能 将编译好的应用程序的所有组成文件打包成一个rpm包,从而实现管理功能。 打包 安装 查询 升级 卸载 校验 数据库管理 5、依赖关系 循环依赖 版本依赖:依赖于特定的版本 7、man程序的配置文件 /etc/man.config NANOATH #指定man查找的路径 8、前端管理器 自动解决依赖关系 apt-get yum 9、应用安装方式 1、使用包管理器 2、源代码编译 3、简单打包的二进制格式:展开至特定路径下就可以运行 4、前端管理器 10、rpm包管理 1、安装 格式:rpm -i /path/to/rpm_package …… -i # 表示安装 -v # 显示信息 -h # 以#号个数显示安装进度 --test # 仅测试,不安装 --nodeps # 忽略依赖关系 --replacepkgs # 重新安装。注:一般原配置文件会以.rpmnew为后缀的文件存在 --nodigest # 不检查包完整性 --nosignature # 不检查来源合法性 --noscripts # 不执行程序包中的脚本片段 --root=/path/to/file # 指定安装后的文件存放路径的根目录 %pre: 安装前脚本; --nopre %post: 安装后脚本 --nopost %preun: 卸载前脚本 --nopreun %postun: 卸载后脚本 --nopostun 2、卸载 格式:rpm -e pack_name -e # 表示卸载 --nodeps # 忽略依赖关系 3、查询 -q # 查询rpm包 -a # 查询所有rpm包 直接过滤 #例如:rpm -qa httpd* -qi package_name # 查询包的信息 -ql package_name # 查询包安装之后在当前系统生成的文件 -qf /path/to/file # 查询某文件是有那个rpm包安装生成的 -qc package_name # 查询包安装后生成的配置文件 -qd package_name # 查询包安装后的帮助文档 -q --scripts package_name #查询包相关脚本 -q --whatprovides # 查询某文件(功能)由那个包提供 -q --whatrequires # 查询某文件(功能)被那个包依赖 -q --changelog # 查看制作rpm包的修改日志 4、查询未安装rpm包 -qpl /path/to/package_name # 查询安装会生成的文件列表 -qpi /path/to/package_name # 查询其简单描述信息 -qpc # 查询配置文件 -qpd # 查询帮助文档 5、升级-{-Uvh|-Fvh} -U|--upgrade # 有旧版本程序包,则升级程序包;如果没有旧版本程序包,则进行安装操作 -F|--freshen # 只进行升级操作 --force # 强制安装 --oldpackage # 降低版本 注:不对内核执行升级操作,多版本内核可以并存。建议执行安装操作,安装操作会保留两个版本的内核 6、数据库重建 数据库:/var/lib/rpm/ # 初始化 rpm --initdb # 事先不存在数据库,则新建,直接重建,会覆盖原有库 # 重建 rpm --rebuilddb 11、rpm包校验 检查安装后生成的文件是否被修改过:rpm -V package_name 变化标记: 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 diffe 导入制作者或者发行版的公钥文件:rpm --import RPM-GPG-KEY-CentOS-7 (公钥在光盘里) 检查来源完整性:rpm -K /path/to/package_name 包完整性:通过单项加密机制(md5|sha1) 包来源合法性:通过公钥加密机制(RSA) 命令:gpg,pgp 12、包查询 # 预览包内文件 rpm2cpio file.rpm | cpio –itv # 释放包内文件 rpm2cpio file.rpm | cpio –id "*.conf" yum是rpm包管理器的前端管理工具 Yellowdog Update Modifier 类似的前端工具有:yum、apt-get、zypper、dnf 1、yum原理理解 1、相关组成 文件服务器:存储rpm包及包的依赖信息。 服务器端:repository:仓库 1、各rpm包 2、依赖关系、程序包安装后能生成文件的列表等元数据文件 yum客户端: 1、配置文件:指定个可用yum仓库 2、缓存元数据;yum客户端会到可用yum仓库获取元数据,并缓存到本地 3、分析元数据:根据具体操作请求完成元数据分析,包括依赖关系、文件列表信息等 元数据包括名称、版本、依赖性、描述 4、执行具体操作 yum客户端配置文件指定对应服务器访问方式: ftp ftp://server/path/repo http http://server/path/repo nfs nfs://server/path/repo file file:///path/to/repository 本地主机通过配置文件,指明yum下载rpm包服务器地址,也就是yum源。客户端通过配置信息,找到远程服务器主机。 远程服务器上存储着包与包之间的依赖关系信息文件,客户端请求下载程序包后,先将元数据信息文件缓存到本地, 保存在本地/var/lib/rpm/*.db,将安装包下载到本地,然后进行安装,安装完成后,yum会自动将安装包删除。 2、yum配置文件 1、/etc/yum.conf /etc/yum.repos.d/*.repo 2、配置文件格式:由两断组成 [main]:主配置段(配置yum仓库的公共定义)/etc/yum.conf cachedir 缓存路径 logfile 日志文件保存目录 keepcache 下载后的rpm包安装后时候留存 exactarch 所下载的rpm包是否当前系统架构平台做严格匹配 gpgcheck 是否检查来源合法性及包完整性 plugins 是否支持插件模式 installonly_limit 支持并行安装多少个程序包 retries=6 网络连接发生错误后的重试次数,如果设为0,则会无限重试。默认值为6 exclude=selinux* 排除某些软件在升级名单之外,可以用通配符,列表中各个项目要用空格隔开,这个对于安装了诸如 美化包,中文补丁的朋友特别有用 [repo]:仓库配置段(可以在一个文件中配置多个yum源)/etc/yum.repo.d/*.repo [repo_ID] name=string baseurl=仓库的访问路径。可以指明多个仓库。repodata所在的路径就是仓库的路径 enabled=是否启用此仓库,默认是启用 gpgcheck=是否检查包来源合法性和完整性 gpgkey=公钥文件(可以是本地,也可以是服务器路径) cost=定义仓库开销,默认1000,越小优先使用 mirrorlist= 镜像服务器的地址列表 示例: [base] name= baseurl= enabled= gpgcheck= gpgkey= 3、yum使用 基本格式:yum [option] COMMAND 1、安装、升级 yum install package_name # 安装包,可指明版本进行安装 yum reinstall package_name # 重新安装 yum check-update # 检查可升级包 yum update package_name # 升级指定的包 注意:可以升级到指定版本: yum update X-1.2.2 yum dowmgrade package_name # 降级 yum groupinstall|groupupdata “group_name” # 安装指定包组 yum groupremove “group_name” # 卸载指定包组、 yum deplist # 显示程序包的依赖包 yum localinstall package_name # 从本地的rpm安装,如果有依赖关系,也会从仓库下载 2、查看、清理 yum repolist [all enabled | disabled ] # 查看当前可使用yum源 yum clean [all | packages | metadata | expire-cache | rpmdb | plugins] # 清理yum缓存 yum makecache # 手动构建缓存 yum search COMMAND # 搜索包含工具的包名 3、包信息、包组信息 yum list [all | installed | available] # 列出yum源所有包列表,man yum查看更多选项发。可以使用通配符进行匹配查找 yum info package_name # 查看包信息 yum grouplist # 列出yum源所有包组信息 三个常用发的开发包组: Desktop Platform Development Serever Platform Development Development Tools yum groupinfo “package_group_name” # 查看包组信息 yum whatprovides | provides /path/to/somefile # 查询某文件是由那个包安装生成 yum history # 查看yum的操作历史 yum history info ID # 查看某一步安装的所有依赖包 yum history undo 1 # 撤销第几步 yum history redo 1 # 重做第几步 4、卸载 yum remove package_name # 卸载包 5、yum仓库管理 yum --enablerepo=repoidglob # 指定从某个仓库安装程序 6、注意 1.显示@符号的表示已经安装好的 2.显示anaconda的表示系统安装时安装的软件列表 * install package1 [package2] [...] * update [package1] [package2] [...] * update-to [package1] [package2] [...] * update-minimal [package1] [package2] [...] * check-update * upgrade [package1] [package2] [...] * upgrade-to [package1] [package2] [...] * distribution-synchronization [package1] [package2] [...] * remove | erase package1 [package2] [...] * autoremove [package1] [...] * list [...] * info [...] * provides | whatprovides feature1 [feature2] [...] * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] * makecache [fast] * groups [...] * search string1 [string2] [...] * shell [filename] * resolvedep dep1 [dep2] [...] (maintained for legacy reasons only - use repoquery or yum provides) * localinstall rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use install) * localupdate rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use update) * reinstall package1 [package2] [...] * downgrade package1 [package2] [...] * deplist package1 [package2] [...] * repolist [all|enabled|disabled] * repoinfo [all|enabled|disabled] * repository-packages [package2] [...] * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ] * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats] * load-transaction [txfile] * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel] * fssnapshot [summary | list | have-space | create | delete] * fs [filters | refilter | refilter-cleanup | du] * check * help [command] 6、yum安装本地包 yum install /path/to/package_file 但yum配置文件默认会检查包的完整性和来源合法性 yum install /path/to/package_file --nogpgcheck #忽略检查 7、yum配置文件种可用的四个宏(增强了配置文件的通用性) $releaserver: # 指当前操作系统的发行版的主版本号 $arch: # 系统CPU架构 $basearch # 系统基础架构 $YUM[0-9] # 系统中定义的,用户可以在yum中使用 获取当前系统相应宏替换的结果的办法: >>> import yum,pprint >>> yb = yum.YumBase() >>> pprint.pprint(yb.conf.yumvar,width=1) Loaded plugins: fastestmirror {'arch': 'ia32e', 'basearch': 'x86_64', 'releasever': '6', 'uuid': 'f70c88bd-5d78-4ebd-9db3-99c771273199'} 8、yum repository:文件服务器 repodata/:可自动生成 repomd.xml 保存了此目录下所有元数据文件的校验码 9、创建yum仓库 1、安装创建命令:createrepo 2、createrepo /path/to/filerpm.dir # 直接指定存放rpm包的目录即可制作 3、启动httpd服务:service httpd start 4、一个示例 # 1. 创建 yum 仓库目录,rpm 包都上至此目录 mkdir -p /application/yum/centos6/x86_64/ # 2. 安装 createrepo 软件 yum -y install createrepo # 3. 初始化 repodata 索引文件 createrepo -pdo /application/yum/centos6/x86_64/ /application/yum/centos6/x86_64/ # 4. 进入需要提供仓库的目录 cd /application/yum/centos6/x86_64/ # 6. 每加入一个 rpm 包就要更新一下 createrepo -–update /application/yum/centos6/x86_64/ 5、createrepo命令使用 选项: --update /path/to/repo/ # 指定更新那个目录下的仓库 --basedir /path/to/repodate # 指定repodate目录的路径 -p|--pretty # 输出xml格式的文件 10、yum-config-manager管理工具 # 添加yum源 yum-config-manager --add-repo=file///mnt/cdrom # 禁用启用某个yum源 yum-config-manager --disable REPO_NAME yum-config-manager --enable REPO_NAME 程序包的编译安装 1、编译场景 当需求的程序还灭有rpm包或者编译好的二进制分发包,以及需要定制程序某些特殊功能时,需要自己 编译安装根据需求定制功能。 有些程序的安装包可能是未经编译的源码包,考虑到程序可能运行在不同的硬件架构平台上,为了程序 更好的通用性,需要自己进行编译。.....src.rpm格式的包。 2、源代码组织形式 源代码文件之间可能存在跨文件的依赖关系,如果用户自己进行编译,在解决依赖关系这个层面,无疑是 不友好的。所以每个项目都有项目管理器帮助我们进行编译源代码,例如make工具根据makefile进行组织 编译源代码。 3、configure脚本 检查编译环境是否符合编译需求,也就是程序包依赖的外部环境。并通过传递参数,定义当前程序编译时启 动那些特性功能,以及安装路径等会根据Makefile.in模板文件生成makefile文件。 使用autoconf开发工具可以生成configure文件; 使用automake开发工具可以生成makefile.in文件; 4、编译安装步骤 1、获得源代码,并解压:tar xf package-version.tar.{gz|bz2|xz} 2、安装前查看相关说明帮助文档 3、执行脚本:./configure 4、编译:make 5、安装:make install 5、开源代码获取途径 1、项目官方站点 2、第三方代码托管站点 sourceForge.net github.com code.google.com 6、编译详解 configure脚本通用功能:(不同程序,其configure功能不同获取帮助:./configure --help) 1、需要定义的配置 1、指定安装路径 --prefix=/usr/local/package_name --sysconfdir=/etc/package_name # 指定配置文件路径 2、指定启用特性 --enable-功能 # 指定启用的功能例如:--enable-fpm --disable-功能 # 禁用某功能例如:--disable-scoket 3、指定所依赖的功能、程序或文件 --with-function # 启用某功能(默认不编译的功能,将此功能编译) --without-function # 禁用某功能(默认编译到的功能,将此功能去除) 4、编译其他模块功能 --with-FUNCTION=PATH # 指明其他模块功能的源码路径 2、注意事项: 1、执行./configure脚本时可能会报错的原因是依赖与某个程序的库文件,利用yum对这个程序进行安装即可 2、如果依赖的这个程序没有rpm包,则获取这个程序的源码进行编译安装 7、二进制文件输出 vim /etc/profile.d/apache.sh PATH=/usr/local/apache/bin:/usr/local/apache/sbin:$PATH export PATH 8、头文件输出 1、ln -sv /usr/local/apache/include/* /usr/include/ 2、ln -sv /usr/local/apache/include /usr/include/http 9、库文件输出 新建文件:vim /etc/ld.so.conf.d/httpd.conf 写入:/usr/local/apache/lib #可以写多个 系统开机时会将库文件读取到/etc/ld.so.cache文件中作为缓存。所以新设置的并不会生效 让系统重新加载库文件:ldconfig -v | grep "^[^[:space:]]" 10、man文档输出 vim /etc/man.config 然后添加路径 11、添加服务控制脚本 12、编译过程 源代码---预处理---编译---汇编---链接---执行