在我们的运维工作,总是避免不了安装某些软件,或者编译安装某些软件,我们知道操作系统当中的程序都是有程序员通过开发工具开发的来,程序员直接编写的纯文本的文档我们称之为源代码,但我们的计算机只能识别二进制程序,那么必须要将源代码变成计算机能识别的二进制程序,这里需要通过编译器来进行编译,将源码转换成二进制程序,再通过安装即可。
创新互联公司坚信:善待客户,将会成为终身客户。我们能坚持多年,是因为我们一直可值得信赖。我们从不忽悠初访客户,我们用心做好本职工作,不忘初心,方得始终。10余年网站建设经验创新互联公司是成都老牌网站营销服务商,为您提供做网站、成都做网站、网站设计、HTML5、网站制作、成都品牌网站建设、小程序定制开发服务,给众多知名企业提供过好品质的建站服务。
还有一类程序就是二进制程序,系统是由某些厂商来做的,在厂商的系统上编译出来的程序,自然就在系统上运行了,这里是由厂商直接编译好程序然后释放出来给用户,如此一来,由于我们本来就使用厂商的发行版,系统是一样的,那么使用厂商的提供编译过的程序就没问题。首先来介绍下软件运行的环境
※软件运行环境
API:Application Programming Interface
POSIX: Portable OS
程序源代码—à预处理—à编译—-à汇编—-à链接
静态编译:编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。
共享编译:将库提取出来,与可执行文件链接到一起,实现共享编译
ABI:Application Binary Interface
Windows与linux不兼容
ELF(Executable and Linkable Format)
PE
库级别的虚拟化
linux:WINE
windows:Cywin
※包管理器
二进制应用程序的组成部分:
二进制文件、库文件、配置文件、帮助文件、头文件
程序包管理器
将编译好的应用程序组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等操作目前在Linux系统之上软件的安装方式最常见的有一下两种方式:
dpkg
这个机制最早是有Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时还能提供安装后的软件资讯,实在非常不错。基于Debian衍生版系统,如B2D,Ubantu等都是用dpkg来管理软件的。
RPM
这个机制最早是由redhat公司开发出来,后来大家觉得这个管理器非常好用,因此很多发行版就使用这个机器来作为软件包的管理器如SuSe,Fedora,CentOS。
但是如上的两种包管理器的机制或多或少都会有软件属性的相依的问题,其实在安装时,每个文件文件都提供依赖性的检查,那么如果我们将依赖性的数据做成列表、等到安装时,如果有依赖关系,通过依赖性的数据列表,管理机制就会同时安装被依赖的软件。
※软件包命令规则
源代码:
name-version.tar.gz|bz2|xz
version:major(主版本号).minor(次版本号).release(释放号)
比如:httpd-2.4.6.tar.bz2包的名字叫httpd主版本号是2次版本号是4释放号是6(也是修改过6次的意思)后面是以打包压缩的方式存储
rpm包命名方式
name-version-release.arch.rpm
例如:bash-4.2.46-19.el7.x86_64.rpm
包名称叫做bash主版本号是4,次版本号是2,修整号是46,适合的硬件平台是el7.x86
主版本号:当新功能推出时,更新主版本号,或者某些功能有较大的变化时,就需要更新了
次版本号:与主版本号相同,次版本号更新只是局部的,但仍然有较为重要的改进和增强,这是需要变动版本号了
修订号:局部的变量,一般只是修复bug,或者简单的功能扩展
因此,主版本号最为稳定,变化的周期长,修改号更新快,变化周期短
常见的arch
x86:i386,i486,i586,i686
x86_64:x64,x86_64,amd64
powerpc:ppc
跟平台无关:noarch
包分类和拆包
Application-version-arch.rpm:主包
Application-devel-version-arch.rpm开发子包
Application-utils-version-arch.rpm其他子包
Application-libs-version-arch.rpm其他子包
解决依赖包管理工具
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zipper:suse上的rpm前端管理工具
dnf:Fedora 18版本以上的rpm包管理器前端工具
库文件:
查看二进制程序所依赖的库文件
ldd /path/to/binary_file
比如:ldd /bin/ls
管理及查看本机装载的库文件
ldconfig
/sbin/ldconfig –p:显示本机已经缓存的所有可用库文件名及文件路径映射关系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d*.conf
缓存文件:/etc/ld.so.cache
程序包来源
系统光盘
项目官方站点
第三方组织如Fedora EPEL(Extra Packages for Enterprise Linux)
自己制作
※RPM
优点
rpm内含已经编译过的程序与配置文件等数据,可以让使用者免除重新编译的困扰。
rpm在被安装之前,会检查系统的硬盘容量、操作系统版本、可避免文件被错误安装
rpm文件本身提供软件版本咨询,依赖性软件名称,软件用途说明、软件含义便于了解软件
rpm的管理分为安装、卸载、升级、查询、检验、数据库维护
安装:
rpm {i|install} [install-option] PACKAGES_FILE…
-h:hash,以#表示安装进度,每个#表示%2
-v|–verbose:显示详细过程
-vv:显示更详细的过程
[install-option]
rpm –ivh –test:测试安装;但不真正执行安装;在dry run模式下进行
rpm –ivh – –nodeps:忽略依赖关系
rpm –ivh – –replacepkgs:重新安装,替换原有安装
rpm –ivh – –nosignature:不检查来源合法性
rpm –ivh – –nodigest:不检查包完整性
rpm –ivh – –force:强行安装,可以实行重装或降级
rpm –ivh – –scripts:不执行程序包脚本片段
查询:
rpm {q|–query} [select-options] [query-options]
rpm -q packages_name: 查询指定的包是否已安装
rpm -qa:查询所有已安装的包
rpm -qi packages_name:查询指定包的说明信息
rpm -ql packages_name:查询指定安装包生成的文件
rpm –qc packages_name:查询指定安装包生成的配置文件
rpm –qd packages_name:查询指定安装包生成的帮助文件
rpm –qf files_name:查询指定的文件是由那个包安装生成的
rpm –qp files_name:查询指定未安装的程序包文件做查询操作
–whatprovides capability:查询指定的capability被那个包所提供
–whatrequires capability:查询指定的capability被那个包所依赖
rpm –q –scripts packages_name:查看指定的包中包含的脚本
rpm –q –changelog packages_name:查询rpm包改变日志
rpm –R packages_name:查询指定的程序包所以来的capabilty
rpm2cpio 包文件|cpio –itv 预览包里的文件
rpm2cpio 包文件|cpio –id “*.conf”释放包内文件
升级:
rpm {-U|–upgrade}[install-options] PACKAGES_FILE…:如果有老版本的,则升级,否则,则安装
rpm {-F|–freshen}[install-options] PACKAGES_FILE…:如果有老版本的,则升级,否则,则退出安装
–oldpackages:降级
注意:
不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核
如果源程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件并不会覆盖老版本的配置文件,而把新版的文件命令为以.rpmnew的文件保留
卸载:
rpm {-e|–erase} [–allmatches] [–nodeps][–test] PACKAGES_NAME
简单用法:rpm –e packages_name
–nodeps:忽略依赖关系
–test:测试卸载;dry-run模式
–allmatches:如果一个程序包同时安装多个版本时,则此选项一次全部卸载,但程序包配置文件安装后曾被修改,卸载时,此文 件通常不会被删除,而是被重名为以.rpmsave的文件保留
校验:
查询包安装之后生成的文件是否发生了改变
rpm {-V|–verify} [select-options][verify-options]
常用用法:rpm –V packages_name
当没有输出结果时表示软件包完整ok,当有相应的结果输出表明对应的内容有修改,具体如下:
S file Size differs 文件的容量大小发生改变
5(MD5 sum differs)MD5这一种指纹码的内容发生改变
M Mode 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 能力发生改变
注意:在安装软件之前最好对即将安装的软件进行合法性验证,这样可以检查出软件是否来源合法、内容合法,在一定程度上避免一些由不安全因素导致不安全的事情发生
来源合法指的是由我们信任的制作者提供;依赖于制作的亲笔签名,签名是作者使用自己的私钥加密程序包的特性码
内容合法是指包未被二次修改;完整性校验成功,依赖于制作者提供的程序特征码
验证方式:安装用同样的特征码提取算法提取程序包的特征码,并与原作者提供的相比较
导入密钥
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
验证 rpm –K packages_name
重建数据库
当我们把数据库的文件删除之后,我们查询软件包的信息都是查询不到的,因为rpm –q是依据数据库里的数据来进行查询,这时就需要重建数据库了
数据库位置
/var/lib/rpm
rpm {–initdb|–rebuilddb}
rpm –initab:初始化,如果事先不存在数据库,则新建,否则,不执行任何操作
rebuilddb:重建,无论事先是否存在,直接重新创建数据库
※yum
yum:Yellowdag Update Modifier,yum是通过分析rpm的标头文件数据后,根据各软件的依赖关系制作出有依赖关系时的解决方案,然后可以自动处理软件的依赖性问题,以解决软件安装或移除与升级的问题。因此我们想使用yum 必须先要找到适合的yum server才行,而每个yum server可能都会提供许多不同的软件功能,yum server会根据功能进行分类,这里的分类就是所谓的仓库,yum repository 存储了众多rpm包,以及报相关的元数据文件放置在特定目录repodate下
yum仓库中的元数据文件
primary.xml.gz:所有的rpm包的列表,依赖关系,以及每个rpm安装生成的文件列表
filelists.xml.gz:当前仓库中所有rpm包的所有文件列表
other.xml.gz:额外信息,rpm包的修改日志
repomd.xml:记录的事上面三个文件的时间戳和检验和
coms*.xml.:rpm分组信息
yum客户端配置文件
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
仓库的定义:
[reposirtoryID]次repository用来表示此repository执行,并且唯一
name= description对仓库的描述信息
baseurl=url://path/to/repository 指定仓库的访问路径,通常为一个文件服务器上输出的repository,要跟repodata这个目录在同一个目录下的路径
http://10.1.0.1/cobbler/ks_mirror/7/
ftp://10.1.0.1/iso/7
file:///mnt/
enabled={1|0}是否启用仓库1表示启动,0表示禁用
gpgcheck={1|0}是否对程序包做校验,1表示校验,0表示不校验
gpgkey=file://etc/pki/rpm-gpg/RPM-GPG-CentOS-6指明gpgkey文件路径
cost=# #表示数字,指明当前仓库的访问开销,默认为1000,数值越小优先级越高
yum-config-manager
yun-config-manager –disable “repository_name” 禁用此仓库
yun-config-manager –enable “repository_name” 启用此仓库
yum命令介绍
显示仓库列表
yum repolist [all|enabled|disabled]
all:列出已经配置的所有的可用仓库
disable:列出禁用的仓库
enabled:列出启动的仓库
显示程序包
yum list[all|glob_expr1][glob_expr2 ] 列出所有包
yum reinstall [packeages] 重新安装指定包
yum grouplist group1 group2 […] 查看指定包组,不指定组查看所有组
安装程序包
yum install packages [packages2][…] 安装某程序包
yum groupinstall packages [packages2][…] 安装包组
在安装某些软件时,有时需要依赖某些安装包,这时yum会自动解决依赖关系
升级程序包
yum update [packages1] [packages2][…] 升级
yum downgrade packages1 [packages2][…] 降级
检查可用性
yum check-update
卸载程序包
yum remove|erase packages1[packages2][…] 删除包
yum groupremove|erase packages1[packages2][…] 删除包组
查看程序包信息
yum info 显示所有包的信息 此功能跟rpm –qi类似
yum info packages 显示指定包的信息
yum groupinfo gropu1 显示指定包组的信息
清理本地缓存
yum clean 清理缓存
yum clean [packages]metadata|expire-cache|rpmdb|pkugins|all]
构建缓存
yum makecache
查看yum事物历史
yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo]
yum history:显示所有历史事物
yum history info 6 显示指定历史事物信息
yum history undo 6:如果第六步是安装这里则是卸载,反之则是安装
如何创建本地yum仓库
1、挂载本地光盘,如/mnt
#mount /dev/cdrom /mnt/
2、创建仓库
vim /etc/yum.repos.d/base.repo
[cdrom]
name=123
baseurl=file:///mnt
enabled=1
gpgcheck=0
到这里本地yum仓库就配置好了
yum的命令行选项
–nogpgcheck:禁止进行gpg check
-y:自动回答为yes
-q:静默模式
–disablerepo=repoidglob:临时禁用此处指定的repo
–enabledrepo=repoidglob:临时启动此处指定repo
–noplugins:禁用所有插件
编译安装
1、c代码编译安装三步骤
通过选项传递参数,指定启用特性,安装路径,执行时会参考用户的指定以及makefile.in文件生成的makefile,检查一来到的外部环境
2、make:根据makefile文件,构建应用程序
3、makeinstall 复制文件到相应路径
开发工具:
autoconf:生成configure脚本
automake:生成makefile.in文件
编译Cyuandaima
前提:提供开发工具及开发环境
开发工具:make,gcc等
开发环境:开发库,头文件,glibc标准库
通过安装包组提供开发珠江
yum groupinstall “Development Tools”
yum groupinstall “Server Platform Development
编译安装
第一步:configure脚本
选项:指定安装位置,指定启用的特性
–help:获取其支持使用的选项
安装路径设定
–prefix=/Path:指定默认安装位置,默认为/usr/loca
–sysconfdir=/path:配置文件安装位置
optional Features:可选特性
–disable-feature
–enable-feature
optional packages:可选包
–with-packages[=arg]依赖包
–without-package禁用依赖关系
第二步:make
第三步:make install
安装后的配置:
(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
导入帮助手册
编辑/etc/man.config|man_db.conf文件
添加一个MANPATH
1、 yum的配置和使用;包括yum repository的创建
我将一些rpm包下载至/root/repo目录下,此时目录下没有repodate的数据目录,构建仓库就会报错,这时就需要createrepo,系统中默认createrepo这个命令是没有安装的,所以需要安装
createrepo [options]
create /root/repo
创建了repo数据文件之后,这时候就需要配置yum仓库了,在/etc/repos.d/目录下创建一个以repo结尾的文件即可,内容如下
[xen] #仓库名称
name=1 #仓库描述
baseurl=file:///root/repo #仓库的路径
enabled=1 #是否启用仓库1表示启用,0表示禁用
gpgcheck=0 #是否检查来源合法性
cost=100 #仓库优先级默认值为1000,值越小,优先级越高
2、编译安装apache 2.2,并启动此服务
第一步:下载源码包wget: ftp://10.1.0.1/pub/Sources/sources/httpd/ httpd-2.2.29.tar.bz2
下载完成之后就需要解压缩,随后进入到该目录,里面有个configure的脚本
./configure –prefix=/usr/local/apache –sysconfdir=/etc/httpd2 (prefix指定安装路径,sysconfdir指定配置文件路径)
第二步: make 生成文件
第三步: make install 将make生成的文件拷贝至指定安装目录下
第四步:导出头文件、库文件、帮助文档、二进制程序
1、 ln -sv /usr/local/apache/include /usr/include/httpd 导出头文件
2、 导出帮助文件
vim /etc/man.config
MANPATH=/usr/loca/apache/man centos6
vim /etc/man_db.conf
MANDATORY_MANPATH /usr/loca/apache/man centos7
3、 导出库文件
vim /etc/ld.so.conf.d/httpd2.conf
/usr/local/apache/lib 在文件中加入此行即可
4、 二进制程序
vim /etc/profile.d/httpd.conf
export PATH=$PATH:/usr/local/apache/bin
5、 服务脚本
cp /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd24
chmod +x /etc/rc.d/init.d/httpd
加入以下几行:
apachectl=/usr/local/apache/bin/apachectl
httpd=/usr/local/apache/bin/httpd
prog=httpd
pidfile=${PIDFILE=/var/run/httpd24.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
vim /etc/httpd24/httpd.conf
增加一行
PidFile=/var/run/httpd24.pid
service httpd24 start 启动服务即可
ss -tan 查看有没有80端口监听
使用crul httpdserver测试页面是否正常显示,如果端口起来了,还是看不到内容可能是防火墙开了,这是需要iptables –F临时的清理以下防火墙的策略