Linux程序包管理之yum仓库源码编译安装
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux程序包管理之yum仓库源码编译安装相关的知识,希望对你有一定的参考价值。
CentOS:yum,dnf
URL:ftp://172.16.0.1/pub
yum是C/S架构,是rpm的前端工具,依赖于rpm存在的;
1、本地要有yun程序;
2、本地要有配置文件(配置远程服务器yum仓库或本地服务器yum仓库);
3、要有存在的文件服务器(程序包仓库即yum仓库)、(也可以在本地配置服务器yum仓库);
yum支持的服务器有两种:一种是ftp服务器,第二种是http服务器;
yum工作简述:
yum是客户端,也认为是自我独立管理的组件,需要联系远程的仓库,从仓库中下载元数据文件在本地支持yum程序包管理的基本操作,需要用到某些程序包时,yum会启动文件服务器客户端,到远程服务器上去下载所需要的程序包文件;
yum仓库的(rpm包清单)元数据文件需要创建,redhat提供一个命令工具:createrepo命令分析仓库下的所有rpm包及相互的依赖关系,抽取并提供一个元数据文件,而且还能制作这个元数据文件的特征码;
yum仓库通过createrepo命令,通过分析每一个rpm包自带的元数据中抽取出来,然后罗列保存在元数据文件里这样实现的,比如,在制作rpm包时,每个包叫什么名子、依赖哪些包、提供哪些capability能力等,在制作rpm包时都已经提供了,每个rpm包都包含一个内部文件清单,每一个文件就是capability,如果这个程序包还能额外提供其它的capability,需要在制作rpm包的sbark文件中显示说明的;
createrepo命令创建高级仓库时比较困难,高级仓库中要对程序包分组,创建分组,组文件是xml格式的,因此要创建时要精通xml语法才能创建;
yum工作机制详述:
首先服务器是一个文件服务器,存储了很多rpm包,服务器里的整个rpm包目录,通过文件共享的服务功能输出给其它主机访问;
在Linux主机上会支持rpm包管理功能在此基础上,又支持yum工具的使用;
当用户要安装程序包时,就不用使用rpm命令来安装程序包了,而使用yum命令;
当yum接收到命令后,例如安装程序包,根据本地配置文件中所指向的URL服务器地址即yum仓库地址,(此yum在本地配置文件中要指明服务器的访问地址,例如:ftp://172.16.0.1/pub),会尝试连接到远程服务器;
这个yum服务器会提供每个rpm程序包的描述性信息即元数据信息文件(这文件信息包括程序包的名字、版本、依赖关系等等)包括rpm包对应的版本号,conf文件,binary信息,以及很关键的依赖信息。在yum服务器上提供了createrepo工具,用于把rpm包的基本概要信息做成一张"清单",这张"清单"(其实就是rpm程序包仓库的元数据文件)就是描述每个rpm包的spec文件中信息。
所以,yum客户端安装时会首先到远程仓库中请求下载这个rpm程序包仓库的元数据文件,下载存放在本地cache缓冲区中;
然后yum会在本地主机上分析这个文件是否存有要安装的程序包的包名,如果有就读取这个数据包,也会根据这个元数据文件尝试分析该包的依赖关系,因为yum仓库中的这个元数据就已经定义好了每一个程序包,以及依赖关系等等信息,yum客户端分析要安装的程序包要依赖哪些程序包,就在本地已安装的程序包中查询被依赖的包中哪些已安装,哪些没有安装;
分析完后,把尚未安装的包和要安装的包列出来,然后再到服务器上去下载所需的程序包文件,下载完成后先缓存在本地,在本地开始执行类似于rpm安装的操作;
而安装时会自动先安装被依赖的程序包,安装完成后返回告诉客户端安装完成并自动删除缓存区中的程序包以节省空间,但本地yum客户端不会删除服务器的程序包仓库的元数据文件;
因为,下一次再安装程序包时,直接分析这个存储在本地的程序包仓库的元数据文件即可(元数据可重复使用),即元数据缓存在本地,每次访问本地元数据文件,不用再访问远程服务器了,从而节省了时间;
当远程服务器里的程序包仓库有变化(如程序包的变化、依赖关系的变化等等),即元数据文件改变时,yum客户端每次启动yum命令时,都会先向远程服务器请求元数据,在服务器仓库上可能不止一个元数据文件还有一个特殊文件,这个特殊文件中记录了每一个元数据文件的校验码;
很显然,本地缓存的文件中也会有校验码,yum客户端每一次到服务器上请求元数据时(元数据文件不止一个),不是请求元数据而是请求元数据的校验码,把校验码拿到本地对比,判断是否发生改变(只要文件没变,文件的校验码就不变),如果没变则本地缓存继续有效,否则,重新下载元数据文件;通过这种方式从而大大节省网络带宽,同时也能随时保证本地文件是最新版本;
有特殊场景,当本地分析依赖关系时,使用yum来查询或卸载时,却发现本地缓存元数据文件分析完成后,但服务器连不上了,此时不能得知本地元数据是否为最新的,这时到底用不用,需要自己定义策略了;
yum应用场景来说,yum是个客户端,需要链接远程的yum仓库,到仓库中下载元数据文件,在本地支持yum程序包管理的基本操作,当需要用到某些程序包时,yum就启动文件服务器客户端,到yum仓库文件服务器下载所需的程序包文件,所以yum依赖的文件访问机制是C/S的架构。
互联网上同类的仓库有很多,发行版也会有镜像服务器,所以可用的yum仓库有很多,访问时,尽可能选择速度较快的;同一仓库指向一堆服务器叫镜像列表;yum支持很多插件,但依然无法摆脱被dnf取代的命运;
yum本身的问题:虽然解决了依赖关系,但在安装过程中,如果断电重启后,无法继续安装;而dnf解决了此问题;dnf使用类似yum命令。
使用yum:
首先要有yum工具;
第二,要有yum仓库的配置文件;
第三,yum仓库要存在,或自建yum仓库;
YUM:yellow dog,YellowdogUpdate Modifier
yum仓库称为yum repository:yum repo
存储了众多的rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata目录);
安装操作系统时也会分析依赖关系,操作系统安装程序anaconda也会用到yum工具,用到所指向的仓库,所以安装系统的镜像文件(光盘)就是仓库;
repodata目录所在的位置就应该是仓库应该指向的路径;
仓库是文件服务器:
ftp://
http://
nfs://
file:///
yum客户端:
配置文件:
/etc/yum.conf:
主配置文件,为所有仓库提供公共配置或不属于仓库的配置;
一个yum客户端可以指向一个或n个仓库(如一个仓库存储的是基本程序包,一个仓库存储的是扩展程序包,一个仓库存储是第三方程序包),当安装程序包时,yum同时分析多个仓库,从中找出版本最新的安装,同一类仓库可以使用多个镜像,不同类的仓库可以同时指向n个,yum同时指向多个,当多个仓库中都存在某个程序包且版本都一样,则要使用自定义的cost开销,从而优先使用自定义的仓库;
/etc/yum.repos.d/*.repo:
多个repo文件用来指向多仓库的配置文件,为仓库的指向提供配置信息;
一个repo文件也可以定义多个仓库,没必要切分成多个,只不过为了便于管理切割成了多个repo,只要文件不以.repo结尾,就不会被yum所使用;
主配置文件:
]# cat /etc/yum.conf
查看yum帮助:
]# rpm -qc yum
]# man yum.conf
yum仓库指向的定义.repo:
等号左右不能出现空格
[repositoryID]:设定仓库id;
name=Some name for this repository:设定仓库名;
baseurl=url://path/to/repository/:设定仓库访问路径;
baseurl=url://server1/path/to/repository/
url://server2/path/to/repository/
url://server3/path/to/repository/
mirrorlist(不能与baseurl同时使用):设定镜像服务器地址;
enabled={1|0}:设定是否启用仓库,默认启用;
gpgcheck={1|0}:设定是否在安装此仓库中的程序包时,检查完整性和来源合法性;
repo_gpgcheck={1|0}:设置是否检查仓库元数据签名信息;
gpgkey=URL:指向密钥文件的访问路径(仓库提供);
enablegroups={1|0}:设置是否在仓库上使用组批量管理程序包;
failovermethod={roundrobin|priority}:故障转移方法(轮询|优先级),默认为roundrobin实际为随机挑选,priority是根据优先级;
指在baseurl里指明的多个地址中如果第一个地址访问失败,而后转移列表其它地址访问的方法;
keepalive={1|0}:是否当远程服务器是HTTP/1.1时,保持连接功能;
user:指明要访问服务器的用户名;
password:指明要访问服务器用户名的密码;
cost=:访问仓库的开销,用数字表示;
默认为1000;
教室里的yum源:http://172.16.0.1/cobbler/
CentOS 7 x86_64epel:http://172.16.0.1/fedora-epel/7/x86_64/
yum命令的用法:
yum [options] [command] [package ...]
command is one of:
* install package1 [package2] [...]
* update [package1] [package2] [...]
* update-to [package1] [package2] [...]
* check-update
* upgrade [package1] [package2] [...]
* upgrade-to [package1] [package2] [...]
* distribution-synchronization [package1][package2] [...]
* remove | erase package1 [package2] [...]
* list [...]
* info [...]
* provides | whatprovides feature1[feature2] [...]
* clean [ packages | metadata |expire-cache | rpmdb | plugins | all ]
* makecache
* groupinstall group1 [group2] [...]
* groupupdate group1 [group2] [...]
* grouplist [hidden] [groupwildcard] [...]
* groupremove group1 [group2] [...]
* groupinfo group1 [...]
* search string1 [string2] [...]
* shell [filename]
* resolvedep dep1 [dep2] [...]
* localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - useinstall)
* localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - useupdate)
* reinstall package1 [package2] [...]
* downgrade package1 [package2] [...]
* deplist package1 [package2] [...]
* repolist [all|enabled|disabled]
* 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]
* check
* help [command]
* clean [ packages | metadata |expire-cache | rpmdb | plugins | all ]
* makecache
* groupinstall group1 [group2] [...]
* groupupdate group1 [group2] [...]
* grouplist [hidden] [groupwildcard] [...]
* groupremove group1 [group2] [...]
* groupinfo group1 [...]
* search string1 [string2] [...]
* shell [filename]
* resolvedep dep1 [dep2] [...]
* localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - useinstall)
* localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - useupdate)
* reinstall package1 [package2] [...]
* downgrade package1 [package2] [...]
* deplist package1 [package2] [...]
* repolist [all|enabled|disabled]
* 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]
* check
* help [command]
显示仓库列表:
yum repolist [all|enabled|disabled]
all:显示所有仓库;
enabled:仅显示启用的仓库;(默认)
disabled:仅显示禁用的仓库;
例如:
]# yum repolist
显示程序包:
list子命令选项
yum list [all | glob_exp1] [glob_exp2][...]
all:显示所有可用的和已安装的;
yum list {available|installed|updates}[glob_exp1] [...]
available:显示仓库中有但尚未安装的;
installed:显示已安装的包;
updates:显示仓库中可用的升级包;
extras:显示仓库中额外的;
obsoletes:显示废弃的程序包;
例如:
]# yum list
]# yum list php*:显示所有以php开头的程序包;
安装程序包:
yum install package1 [package2] [...]
例如:
]# yum install gcc:依赖关系的包自动安装,确认输入y,才安装,否则退出;
注意:yum安装时默认安装最新版本的程序包,也可手动安装指定程序包的版本;
重新安装程序包:不用卸载,覆盖安装;
yum reinstall package1 [package2] [...]:重新安装(基于覆盖方式安装),类似于rpm -ivh --replacepgks;
升级程序包:
yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...]
降级安装相当于rmp -Uvh --oldpackages;
检查可用的升级包:
yum check-update
卸载程序包:依赖于此程序包的每一个包也会被卸载;
yum remove | erase package1 [package2][...]
例如:
]# yum remove cpp:卸载gcc程序包,会显示同时卸载gcc,因为它依赖于cpp,确认输入y,直接敲回车表示n;
查看程序包的简要信息:
yum info [...]
例如:
]# yum info gcc:查看gcc程序包简要信息,相当于rpm-qi;
查看指定特性(可以是某文件)是由哪个程序包提供的:
yum provides | whatprovides feature1[feature2] [...]
类似rpm -qf;
例如:
]# yum provides gcc:查看gcc程序包是由哪个程序包提供的;
]# yum /bin/ls /bin/cat:查看ls,cat是由哪个程序包提供的;
清理本地缓存:
yum clean [ packages | metadata |expire-cache | rpmdb | plugins | all ]
构建(创建生成)缓存:yum下载程序时会自动从仓库中下载元数据缓存到本地的;
yum makecache
搜索:
以指定的关键字搜索程序包名及summary信息;
yum search string1 [string2] [...]
例如:
]# yum search bash:搜索包含bash的程序包包名和summary的信息,是模糊匹配;
查看指定包所依赖的capabilities关系:
yum deplist package1 [package2] [...]
例如:
]# yum deplist gcc:显示gcc依赖于哪些程序包且这些程序包是由谁提供的;
查看rmp包db版本信息:
yum version [ all | installed | available |group-* | nogroups* | grouplist | groupinfo ]
查看yum事务历史:
yum history[info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
事务就是执行yum命令,查询不算事务,一般包括安装、升级、卸载等,修改类的操作才算事务;
例如:
]# yum history:查看yum的历史事务信息;
]# yum history summary:查看yum历史事务的摘要信息;
]# yum history list:查看yum历史事务列表,默认操作;
stats:查看的是统计数据;
安装及升级本地程序包:
而不是仓库中的包,有rmp不具备的功能,能解决依赖关系,centos6以后直接使用yum install安装了;
yum localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - useinstall)
yum localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - useupdate)
包组管理的相关命令:
yum groupinstall group1 [group2] [...]:安装包组;
yum groupupdate group1 [group2] [...]:升级包组;
yum grouplist [hidden] [groupwildcard][...]:查看包组;
yum groupremove group1 [group2] [...]:移除包组;
yum groupinfo group1 [...]:查看包组相关信息,就是包组内有多少程序包等信息;
Mandatory Packages:必须安装的包;
Default Packages:默认安装的包;
Optional Packages:可选安装的包;
例如:
]# yum grouplist:显示包组;
]# yum groupinstall "DevelopmentTools":安装Deelopment Tools包组(并非安装包组内的所有包),并依赖关系,确认安装输入y;
]# yum groupinfo "DevelopmentTools":查看包组信息,包括必须安装的包、默认安装的包、可选包(如果被依赖也会安装);
注意:yum源仓库指向必须升级不能降级;
把本地iso镜像光盘制作成yum源仓库,编辑配置文件:
在/etc/yum.repos.d/目录下,编辑一个名为local.repo的文件,作为光盘的yum源仓库;local.repo文件内容如下:
[bash]
name=CentOS 7
baseurl=file:///media/
enabled=1
gpgcheck=0
保存退出;
]# yum repolist:查看yum仓库;
]# yum list all:查看仓库中所有的包;
]# yum grouplist:查看仓库中的包组;
]# yum groupinstall 开发工具:安装“开发工具”包组,输入y,确认安装;
注意:yum事务是顺序执行的,不能同时打开两个终端同时启动yum安装事务,否则需要手动清除一个yum事务;
如何使用光盘当作本地yum仓库:
(1)挂载光盘(发行版官方提供的光盘),至某目录;
]# mount -r -t iso9660 /dev/cdrom /media
(2)创建.repo配置文件
[CentOS7]
name=
baseurl=
enabled=
gpgcheck=
注意:命令行选项优先级是高于配置文件的;
yum的命令行选项:
--nogpgcheck:禁止进行gpg check;
-y:自动回答为yes,即自动执行安装程序包;
-q:静默模式;
--disablerepo=repoidglob:临时禁用此处指定的repo仓库;
--enabelerepo=repoidglog:临时启用指定的repo仓库;
--noplugins:禁用所有插件;
yum的repo仓库配置文件中可用的变量:
在yum仓库中,对于不同平台不同版本的仓库,会在不同的路径下存放,为了用户使用方便,能够根据本地系统的平台及版本自动的访问到yum仓库中相对应的路径下程序包,就使用变量;
例如:
http://mirrors.magedu.com/centos/6/i366/os
http://mirrors.magedu.com/centos/6/x86_64/os
http://mirrors.magedu.com/centos/7/x86_64/os
以上路径不同的地方就可使用yum的内置变量;即:
http://mirrors.magedu.com/centos/$releasever/$basearch/os
$releasever:当前OS的发行版的主版本号;
$arch:平台;
$basearch:基础平台;
$YUM0-9:自定义10个变量;
创建yum仓库:
createrepo命令:创建仓库元数据文件repodata;
createrepo - Create repomd(xml-rpm-metadata) repository
createrepo [options] <directory>
-u,--baseurl<url>:可选指明base URL本地的路径;
-o,--outputdir<url>:可选输出目录的路径;
-x,--excludes<package>:排除指定的程序包;
-i,--pkglist<filename>:包含对哪些包创建;
-g,--groupfile<groupfile>:指明包组文件;
--basedir:指明获取repodata的basedir路径,默认当前工作目录;
例如:
]# mkdir -p /root/yum/repo/:为repodata创建个目录;
]# cp /media/Packages/* /root/yum/repo/:把所有rpm程序包都复制到repo目录下;
]# createrepo /root/yum/repo/:为repo目录下的所rpm包创建repodata数据文件;
此时查看,会显示创建repodata目录,进入这个目录;
]# cd /root/yum/repo/repodata/:进入目录后,使用ls查看文件;
]# ls
显示内容:
11b3b31481f15ae5ebfb9950fef507a79c53003f4a5e90d35db23f312151be0d-primary.xml.gz
2c4df0aa3111dc53756940b97254f6d0634fe8f099d291175e6f9548802dac8d-primary.sqlite.bz2
2fc8df461147041b824b3b0d3fda163e4060fc061ca225bcb5aacc655af61477-other.sqlite.bz2
34f455f40c201b72f1e80a06e9b2a035607e45057981392169186494cb8e317b-filelists.xml.gz
518612f4f63ca2a2868d462f9bec059d9f1e7abe0c908291848f90788865be71-filelists.sqlite.bz2
ef930d26b47c1f24b4c752f8f4cc88356a03a258c212900e06855a401fc0de7c-other.xml.gz
repomd.xml
都是使用UUID格式命名的;
其中:
...primary:存储主matadata数据,包括所有包名,版本号,依赖关系等等;
...filelists:保存了每个程序包安装后会生成的文件;
repomd:存储了以上6个文件的指纹信息(校验码);即当yum从远程仓库下载程序包时,就先下载这个文件,比较与本地是否一致,如果一致,本地缓存继续有效,否则重新下载;
创建好后,就可以编辑在本地的yum仓库配置文件中,把刚创建的仓库信息加入其中,如:
[centos]
name=centos
baserul=file:///root/yum/repo/
gpgcheck=0
保存退出,即可;
]# yum repolist:查看查看列表,此时就能看的刚加的仓库ID为centos的仓库了;
程序包编译安装:
没有编译好的程序包,或者编译好的程序包里面没有需要的程序包时,就需要自己编译安装;
testapp-VERSION-release.src.rpm--> 此格式的程序包安装后,是无法使用的,需要使用rpmbuild命令,制作成二进制格式的rpm包,再安装才能使用;
src格式的文件可以提供用户编译成适合本地cpu使用的指令,c语言的源码要使用,必须经历要先预处理-->编译-->生成目标代码-->汇编(将目标代码转换成cpu可执行的二进制指令的过程)-->二进制格式rpm包;
源代码--> 预处理(预处理器) --> 编译(gcc) --> 汇编(汇编器) --> 链接(链接器)--> 执行
一个源文件程序包有N个原文件,每个文件可能代表一个功能;
源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系;
c、c++:项目管理器make(configure--> Makefile.in --> makefile);
java:项目管理器maven;
项目管理器会自动完成预处理、编译、汇编、链接处理等;
而make对于每个源代码都有个专用配置文件makefile,在make时依据这个配置文件,进行调用哪个预处理器如何处理、调用哪个编译器如何处理、编译文件的顺序等操作;
使用Makefile.in模板会生成makefile文件,而makefile.in模板是根据用户需要生成的,如在make命令之前,指明二进制文件、库文件装在哪,指明启用哪些功能等,当用户指明好后,就利用makefile.in模板去生成makefile文件;
configure脚本允许用户传递给这个脚本一些选项,用来指明程序包的编译参数、启用特性、安装路径等等,指明后回车确认,configure脚本会结合makefile.in模板来自动生成makefile文件;
编译安装C语言源代码三步骤:
./configure:
(1)通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成的makefile;
(2)检查各指定启用特性所依赖到的外部环境;如果检查到所依赖的程序包不存在立即报错,无法执行下一步;
make:
根据makefile文件,构建应用程序;
make install:
其实是一些脚本,实现把构建出的应用程序,分别分配到用户指定的目录中;如创建出的二进制文件放到指定的二进制目录、库文件放到指定的库目录等等,使用install拷贝命令也能实现;
configure、Makefile.in一般是项目管理器自动生成的,这依赖于两个开发工具:
开发工具:
autoconf:生成configure脚本文件;
autoconf也需要结合一个配置文件来和其它命令生成configure脚本;这个配置文件告诉autoconf当前代码有哪些特性、指定哪些安装路径等,而后才能生成configure脚本;
automake:生成Makefile.in模板文件;
automake也要结合一个文件,这个指明有多少程序文件、它们的依赖关系是什么、以及使用哪一种版本的编译器等,而后才能生成Makefile.in;
不同程序包安装步骤不一样,有的程序包不需要configure,直接make后执行make install;而有的程序包不需要执行make install,只有一个二进制文件直接复制即可完成;
建议:安装前一定看INSTALL文档,如果没有再看README文档;
编译安装完成后,还有很多需要手动执行的配置操作;
开源程序源代码的获取:
官方自建站点:
apache.cor(ASF)
mariadb.org
...
代码托管:
SourceForge
Github.com
code.google.com
c/c++语言:使用gcc(GNU CComplier)编译器;
融合了很多其它语言源代码的编译器,如cpp(C预处理器)、gcc-java等;
如何编译C源代码:
前提:提供开发工具及开发环境;
开发工具:make,gcc等;
开发环境:开发库,头文件;
glibc:C标准库(GNU的C标准库);
通过“包组”提供开发组件;
CentOS 6:"DevelopmentTools","Server Platform Development"
CentOS 7:开发工具
]# yum grouplist:查看包组;
]# gcc --version:查看gcc编译器的版本;不同程序包所依赖的编译器可能不同(在编译时需要注意);
第一步:configure脚本
选项:用于指定安装位置、指定启用的特性;
--help:获取支持使用的选项;
选项分类:
安装路径设定:
--prefix=/PATH/TO/SOMEWHERE:指定默认安装位置;默认为/usr/local/
如果很多路径没指明,则会在默认安装位置下分别创建子目录来安装;如没指明配置文件安装路径,就会在默认安装路径下创建etc目录来装配置文件、创建lib目录来装库文件、创建bin目录存放二进制文件等;
--sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;
System type:编译可交叉编译,所以要指明目标系统平台类型;
Optional Feature:可选特性;
--disable-FEATURE:默认启用时,不想启用要使用disable;
--enable-FEATURE[=ARG]:默认没启用时,想启用要使用enable;
Optional Packages:可选程序包(依赖到的程序包)
--with-PACKAGE[=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
可以导出一个目录为所有文件链接,也可以为每一个头文件导出一个链接;
(4)导出帮助手册
编辑/etc/man.config文件
添加一个MANPATH参数即可;
MANPATH /usr/local/appache2/man
使用自定义的安装路径后,所有的程序启动命令都无法找到,所以需要很多后续安装配置;如果想要省事,也可把--prefix=/或/usr,等于根时就把二进制程序存储到bin目录下,库文件存储到lib文件下;只不过以后卸载时比较困难;等于/usr时就会把二进制程序存放在/usr/bin或/usr/sbin目录下,库文件放在/usr/lib;还可以使用等于/usr/local,则就会默认存放到/usr/local/bin,/usr/local/lib目录下的;
例如:
]# yum grouplist:查看包组;
]# yum groupinstall "Server PlatformDevelopment":安装包组;
]# yum groupinstall "DevelopmentTools":安装包组;
下载一个源码包httpd-2.2.29.tar.bz2;解压后,进入源码包httpd-2.2.29目录;
]# ./configure --prefix=/usr/local/apach2--sysconfdir=/etc/httpd2:执行第一步;
指明安装路径和配置文件路径;因为自己源码编译安装的程序包,不在rpm包的管理器中,所以以后要删除程序包,直接删除这个指定的目录即可;
]# make:执行第二步;
]# make install:执行第三步;
]# cd /usr/local/apach2:进入到指定程序安装目录;
]# ls:查看安装后生成的文件;会看到bin目录;
]# cd bin:进入后会看到apachectl,这是个脚本能控制httpd启动服务;
]# bin/apachectl start:启动httpd服务;
]# netstat -tan:看到80端口处于监听状态即可启动;
要改PATH环境变量用来识别命令,lib库文件路径要改、man路径帮助手册要改、头文件等等;
以上是关于Linux程序包管理之yum仓库源码编译安装的主要内容,如果未能解决你的问题,请参考以下文章