一、程序开发与编译涉及问题
api: posix 可移植操作系统规范 api同则可跨平台编译
abi: application binary interface 系统应用二进制接口
linux windows abi不同 即api相同时 linux编译后无法在windows运行。
二、软件包管理
1.基本概念
debian: dpt
redhat: rpm, redhat package manager
软件包的组成部分: 二进制程序:/bin, /sbin |系统自身所需|, /usr/bin, /usr/sbin |用户基本管理|, /usr/local/bin, /usr/local/sbin|第三方程序| glibc: 系统核心库 openssl: 软件自身有的库 静态库.a结尾 动态库so结尾 库文件:/lib, /usr/lib, /usr/local/lib 库文件本身也是可执行程序但无法自我执行需被其他程序调用。因此,库文件通常被称为函数。 配置文件:/etc xml格式配置较复杂 帮助文件:手册, readme, install (/usr/share/doc/)
2.rpm rpm is package manager
rpm: 打包、安装、查询、升级、校验、卸载
apt-get 解决依赖关系的前端工具
3. yum rpm的前端工具
yellowdog: yum rpm –> yum
三、程序安装
编译安装:源代码 此方式安装程序管理复杂 编译器:gcc, g++ 提供编译环境:开发环境 二进制: 库:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf 帮助手册:/etc/man.config, man -m 头文件:/usr/include include stdio.h 安装程序的方式: 通用二进制格式 软件包管理器 软件包管理器的前端工具 源代码编译
四、rpm详解
1.源程序:name-version.tar.{gz|bz2|xz} 版本号:major.minor.release 主版本、次版本、发行号/修正号 bash-4.3.1.tar.xz 2.rpm包:name-version-release.arch.rpm 发行号:用于标识rpm包本身的发行号非程序的发行号且此号通常包含所适用的操作系统 el6: rhel6 centos6: el5 suse11 arch: 主机平台 i686(奔腾2/amdk7之后的32位cpu)、x86_64、amd64、ppc、noarch(无硬件限制) bash-4.3.2-5.el6.x86_64.rpm rpm分包: 主包:核心包 分包:支包 bind 核心功能 bind-chroot 分支功能/可选功能 3.安装程序源 fedora-epel http://mirrors.sohu.com http://rpmfind.net rpm包专用站 http://rpm.pbone.net/ 同上 首选安装光盘其次epel包以保证安全 4.rpm包有验正机制:来源的合法性、软件包的完整性 gpg 是 pgp技术规范的一种开源实现 非对称加密:p公, s私 此种加密方式主要用于数字签名 加密 验证速度慢 rpm包 使用单向加密算法计算出特征码 如md5 再由rpm制作者私钥加密此特征码并附加在rpm包后/包内,即如能用公钥解密得到特征码,再使用同样的算法加密此软件包得到特征码,如两特征码同则可视为原版包。 redhat系列官方公钥: /etc/pki/rpm-gpg/ rpm-gpg-key-centos-6 rpm --import /etc/pki/rpm-gpg/rpm-gpg-key-centos-6 导入公钥 -k --checksig 均可检测包 5.安装:rpm -i /path/to/rpm_file -i|--install -v, -vv, -vvv -h: 以#显示安装进度,一个#表示2%的进度; -ivh 忽略依赖关系: 不建议此项 --nodeps 测试安装: --test 重新安装: --replacepkgs warning: /etc/sysconfig/named created as /etc/sysconfig/named.rpmnew 6.卸载:rpm -e 包名 --nodeps --test warning: /etc/sysconfig/named saved as /etc/sysconfig/named.rpmsave 7.查询:rpm -q|--query 包名 查询所有已经安装包: 查询时不支持通配符 如有*则作为包名的一部分 rpm -qa rpm -qa | grep 'pattern' 查询包的摘要信息: rpm -qi 包名 # rpm -qi zsh-4.3.10-5.el6.x86_64.rpm package zsh-4.3.10-5.el6.x86_64.rpm is not installed 查询时tab补全后反而显示包未安装 仅输入包名可查询信息 查询包安装生成的文件清单: rpm -ql 包名 同上 仅包名 查询某文件是由哪个rpm安装生成的: rpm -qf /path/to/some_file 查询包安装生成的配置文件: rpm -qc 仅包名 查询包安装生成的帮助文档: rpm -qd 仅包名 查询包相关的脚本: rpm -q --scripts 仅包名 preinstall: 安装前脚本 postinstall: 安装后脚本 preuninstall: 卸载前脚本 postuninstall: 卸载后脚本 查询尚未安装的包的相关信息: rpm -qpi /path/to/rpm_file -i -l -d -c --scripts 除-a外均可使用 8.升级: -u: 升级+安装 如未安装则安装 -f:仅升级 --force --nodeps 升级可能会带来依赖关系问题 注意:内核不应该升级,应该尽可能安装,它允许多版本并存; 9.校验:rpm -v 包名 检测程序文件是否被修改 显示信息…..为未修改的位,提示信息详解如下: 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 10.rpm包的数据库: /var/lib/rpm 大部分的数据库文件(非库文件)在/var/lib下 数据库重建: --initdb: 新建 初始化 不会覆盖已存在的 --rebuilddb: 重建( 数据库损坏时)常用
五、yum
1.yum仓库位置 repodata目录所在位置就是我们作为yum仓库的位置 rhel5 yum仓库分成4个目录 rhel6 yum整合在一个目录 /etc/yum.conf 主配置文件 以中括号为分割的分段文件 /etc/yum.repos.d/*.repo 主配置文件的组成部分 分段格式如下: section: [main]默认配置、全局配置 具体如下 [main] cachedir=/var/cache/yum/$basearch/$releasever 缓存目录 keepcache=0 下载的rpm包(非源数据)是否永久保存 debuglevel=2 调试错误信息显示等级 级别越高越详细 logfile=/var/log/yum.log 日志文件 exactarch=1 下载rpm包时是否与本地平台完全精确匹配 1 yes 0 no obsoletes=1 gpgcheck=1 下载的rpm包是否自动检测来源合法性 1yes 0 no plugins=1 installonly_limit=5 bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum distroverpkg=centos-release repo文件格式 [repository_id] 仓库名 name= 描述信息 baseurl= yum仓库地址 enabled={1|0} 是否启用 gpgcheck={1|0} 是否自动验证签名合法性 gpgkey= 如检查则设置key 手动指定key文件路径 系统默认仅centos-base.repo有效 [base] name=centos 6.4 x86_64 baseurl=http://172.16.0.1/cobbler/ks_mirror/centos-6.4-x86_64/ enabled=1 gpgcheck=0 cost=2000 默认2000 越小越优先使用 此项用于同文件中两段配置优先级设置 2.yum命令常用项 yum subcommand: list {all|installed|available|recent|obsoletes 废弃的} 此命令可用通配符查看特定包 all选项的结果中 带@号installed 均已安装@后为安装通过的库 不带@如仅base则未安装即在base库 updates 有可用更新的包 extras 不属于任何仓库的不便归类的包 repolist [all|enabled|disabled] 查看当前可用yum库 info package_name 显示包相关信息无论是否是已安装的包 grouplist 包组 groupinfo "group_name" 包组名中含有空格的必须加双引号 clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] 清理本地缓存的包、源数据等信息 一般仅清理源数据metadata makecache 创建缓存 install package_name ... 安装包自动检测依赖关系并下载相关包 yum -y : 自动回答为yes; reinstall package_name ... check-update update package_name ... update-to 指定升级到的版本 y-0.2.1, y-0.2.2, y-0.3.0 remove|erase package_name ... 卸载会同时卸载依赖此包的包 provides | whatprovides 查找文件由哪个包生成/将会生成 search 模糊匹配查找 不常用 groupinstall 通常需要安装的如下 开发组: rhel6,centos6: "development tools"、"server platform development" "desktop platform development" rhel5, centos5: "development tools"、"development libraries" groupupdate groupremove localinstall 红帽5本地安装 localupdate history: 查看此前安装卸载等操作历史; --nogpgcheck 避免本地安装时检验来源
六、yum仓库的创建:
sohu源站仅在最新目录下有packets lftp: 可直接连sohu等源站文件均下载到登录前所在目录 可用!pwd查看之前目录 get, 单个软件 mget 多个 mirror 复制目录
bye 退出 cd pwd baseurl=http://mirrors.sohu.com/centos/6.4/os/x86_64/ 实际使用yum内置变量表示此路径 baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ $releasever this is replaced with the package's version, as listed in distroverpkg. this defaults to the version of the redhat-release package. $arch this is replaced with your system's architecture, as listed by os.uname() in python. $basearch this is replaced with your base architecture. for example, if $arch=i686 then $basearch=i386. 软件仓库制作
createrepo 路径 即可创建 repodata/下文件详解: cd repodata/ ls 08faa81a545bb1157be476ada0524206d137084f50d285b9f7f875b3b02839df-other.sqlite.bz2 6ce81da964e0028da004fd4deb817a89d4db450a3d0af4a826d7c6abad0168a9-other.xml.gz d221c3d1c22cc4e4c4dafc40aa2bf3d353d67882a0d98f7f88ad8215f2d48818-filelists.sqlite.bz2 df5b1510036696c30d69d32d0609c5bfb6f121083ff97bf98a7540c644f6e4ac-primary.sqlite.bz2 f050fc8b41b566153c15bb1d287e6c5a016809415bfce9ddc3540176ce8afdaf-filelists.xml.gz f6f4019e1d7ff186c247c58d394a5faaab51e9ca1fb9c174c94a204588536d14-primary.xml.gz repomd.xml repomd.xml 包含以上文件的时间戳供yum连接源站时对比时间戳以确定是否需要更新源文件 filelists 即sqlite(小型嵌入式数据库引擎)、xml 两种格式的所有rpm包文件列表(rpm安装生成文件) primary 即 主配置文件 当然仓库内所有rpm包以及各rpm包之间的依赖关系 other 即其他信息如 rpm 升级日志
七、源程序编译安装
登录站点下载源程序包 如httpd-2.2.26.tar.bz2
为确保与服务器时间同步可用ntpdate 202.120.2.101(上海交大ntp授时)与授时服务器同步时间,再lftp至站点获取源程序。
make <—makefile 根据此文件make autoconf --> configure脚本 + makefile.in = makefile automake --> makefile.in make install 自动调用gcc等 编译安装步骤: # cd source_code 切换到源代码目录 # ./configure 检查编译环境 让用用户定制编译配置(通过脚本选项) --help --prefix=/usr/local/apache 指定默认安装路径 --sysconfdir= 配置文件存放位置 --enable-so 启用动态模块支持 --enable-rewrite 支持重写 无报错则进行下一步 # make 完成显示类似make[1]: leaving directory `/root/httpd-2.2.26' # make install 需要修改path环境变量 添加二进制文件存放位置 /usr/local/apache/bin /usr/local/apache/sbin ldd /bin/ls ldd查看一个程序所依赖的库文件 # ldconfig -v: 重新搜索当前系统上所有库文件搜索路径下的库文件,并生成缓存 添加新的库文件路径后需运行此命令重新生成缓存 /etc/ld.so.cache; 库文件搜索路径:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf 添加路径 vim /etc/ld.so.conf.d/apache.conf 内容为软件库文件安装路径如 /usr/local/apache/lib /usr/local/apache/conf 不用添加路径 系统自动寻找 man命令需手动添加新软件路径 /etc/man.config, manpath= 添加 在文件其他manpath前 /usr/local/apache/man 头文件:include/文件夹下 ln -sv /usr/local/apache/include /usr/include/httpd 链接即可 apachectl start 启动服务 netstat –tnlp 查看80是否启动 hash命令查看启动的apachectl 是否是新安装的 往往不是 则需修改以上提到的path 等等 等等
八、src-rpm包安装流程
1.安装src包 建立mockbuild用户 用于大部分的src包安装,之后安装下载的src包 2.以非管理员账户进入之前安装生成的rpmbuild/specs/目录 执行rpmbuild –ba ba选项生成二进制包和源码包 bb仅二进制包 rpmbuild -ba nginx.spec 如有报错类似如下 error: failed build dependencies: geoip-devel is needed by nginx-1.0.15-5.el6.x86_64 gd-devel is needed by nginx-1.0.15-5.el6.x86_64 libxslt-devel is needed by nginx-1.0.15-5.el6.x86_64 pcre-devel is needed by nginx-1.0.15-5.el6.x86_64 perl(extutils::embed) is needed by nginx-1.0.15-5.el6.x86_64 缺少perl-extutils-embed包
yum安装缺失的包
yum install geoip-devel gd-devel libxslt-devel pcre-devel perl
成功rpmbuild后得到rpms目录下的rpm包安装即可如果是 -ba选项同时会得到srpms目录中有src-rpm包
此例成功安装nginx后运行service nginx start
显示nginx默认页面