linux 基础 软件的安装 *****

一软件的安装   原代码与tarball

源代码----》编译------》可执行文件
查看文件类型   file命令    是否是二进制文件
注意如果文件的可执行权限
.c结尾的源文件------------》gcc 如果存在调用外部函数库  则链接外部函数库----------》gcc程序编译   -c 生成目标文件   以.o结尾---------》gcc程序    -o      链接所有的目标文件    生成最终的二进制可执行文件
大部分的库文件在/usr/include    /lib     /usr/lib里面
 
 
make 命令与configure  运作流程
make找makefile      maefile文件由软件开发商写的侦测程序来检测用户的运行环境    看此环境是否有此软件运行所需要的功能     此侦测程序名称为configure     或者config        该程序会主动建立makefile文件
configure侦测程序需要做的步骤
1.是否有合适的编译程序     linux中一般就是gcc
2.是否存在该程序需要的函数库 或者其他需要的相依软件
3.linux的核心版本是否适合该软件
4.核心的表头   header include  是否存在
TARBALL    根本目的就是  节省空间   将多个源文件先以tar打包   然后再压缩  以前为*.tgz    当前为.bzip2
所以文件名一般为*.tar.bz2结尾     
所以将tar文件解压之后   通常会有下面这些文件
源代码文件
侦测程序文件    configure   或者config
软件的简易说明与安装说明 install或者readme
      更新软件的方法
直接以源代码通过编译来安装与升级
直接以编译好的二进制文件来安装与升级   适用于厂商用的系统与自己用的系统发行版相同 
安装tarball的流程
1下载
2解压tarball  产生源代码文件
3以gcc进行源代码的编译   会产生object 目标文件
4gcc进行函数库   主   子程序的链接   形成二进制可执行文件
5将二进制文件及相关的配置  安装到主机上面
其中3和4步骤可以通过make指令来简化
例子
vim hello.c 编写源代码
gcc hello.c 编译源代码  生成可执行文件   默认为a.out
也可以 gcc -c hello.c 编译源代码   生成目标文件     以.o结尾
gcc -o hello hello.o  编译源代码   将目标文件生成可执行文件      
./hello 执行二进制文件
主子程序的链接:子程序的编译
其中p1需要调用p2
gcc -c p1.c p2.c
gcc -o p p1.o p2.o
./p
gcc -O   此参数为优化
-Wall   产生更加详细的编译过程信息  包括警告信息
编译时加入外部函数库的方式
gcc sin.c -lm -L/lib -L/usr/lib
其中-l是加入某个函数库的意思
m代表libm.so这个函数库
-L后面代表函数库要搜索的路径
 
gcc sin.c -lm -I/usr/inclue
-I /path后面的路径代表搜索头文件包含的include的库的搜索路径
make进行宏编译
举例  三个文件
a.c   b.c  d.c
生成目标文件
gcc -c a.c
 
gcc -c b.c
gcc -c d.c
链接成执行文件
gcc -o main a.o b.o d.o -lm -L/usr/lib -L/lib
执行
./main
步骤较多
如果利用make程序会简化很多
创建makefile文件
vim makefile
main:a.o b.o d.o
gcc -o main a.o b.o c.o -lm
用makefile的规则进行编译
make
make的语法
标签:目标文件1   目标文件2
<tab>gcc -o 最终的二进制文件名    目标文件1   目标文件2
一个makefile文件中可以存在多个标签  即可以有多个动作
main:a.o b.o d.o
gcc -o main a.o b.o d.o -lm
clean:
rm -f main a.o b.o d.o
运行时   可以只运行make clean  也可以先后运行  make clean main
简化makefile文件
变量代替重复的字符串    $@代表 当前环境中的标签
例如
LIBS = -lm
OBJS = a.o b.o d.o
makefile
main:${OBJS}
clean:
rm -f main ${OBJS}

环境变量优先级 

make指令后面跟的参数》makefile文件中指定的参数》shell环境中指定的参数
安装tarball的软件    需要三个方面的准备
c编译器   gcc或cc compiler
make和autoconfig   简化编译流程的软件
kernel提供的函数库的include文件
 
安装以上的开发工具
yum -y gourpinstall "development tools"   可以安装gcc等软件的开发工具
yum groupinstall "x software development"    安装图形接口的支持

安装tarball的基本流程
1获取源代码
2解压tarball压缩包
3进入压缩后的包目录   查看install、readme等的相关文件内容
4建立makefile    以自动侦测程序configure来建立此文件
5编译   以make这个程序   根据makefile文件来进行编译的过程
6安装   以make程序      根据makefile文件中的install标签来进行安装    即make install   命令
 
tarball软件的安装指令
1./configure  需要参考install和readme       用来创建makefile
2make clean     读取makefile   清理原来旧的目标文件
3make会依据makefile当中的预设工作进行编译的行为    
4make install  根据makefile里面的install的项目    执行数据安装到预定的目录中
一般tarball软件安装的建议   删除和升级
发行版自带的软件大多在/usr里面    用户自定义安装软件则建议安装到/usr/local的里面,因为预设情况下man会搜索/usr/local/man里面的说明文件    所以  如果我们将软件安装在/usr/local下面    该软件的说明文件就可以被找到了。
原始代码tarball建议放在/usr/local/src  的下面
举例
apache是www的服务器软件    如果是发行版自带    则安装路径如下
/etc/httpd
/usr/lib
/usr/bin
/usr/share/man 
其中etc     lib    bin     man分别代表配置文件   函数库   执行文件    联机帮助文件
如果是用户自行以tarball来安装     则会放在预设的/usr/local里面     
/usr/local/etc
/usr/local/lib
/usr/local/bin
/usr/local/man 
但是所有的软件默认都会安装到上面提到的local的总目录中的四个文件夹中    这样想删除软件的时候,很难追查档案的来源    而如果安装时选择的是单独的目录    则会容易得多 
例如将apache软件安装到/usr/local/apache/下面
/usr/local/apache/etc
/usr/local/apache/bin
/usr/local/apache/lib
/usr/local/apache/man 
此时如果想删除软件就会很简单   将该目录删除即可   即使用rm -rf /usr/local/apache
此种方式在执行某些指令的时候    需要参考PATH环境变量所记录的路径    但是/usr/local/apache/bin   肯定不在PATH这个环境变量里   所以在执行apache的指令就需要用到绝对路径    或者将上面的绝对路径加入到PATH环境变量里面
还包括man的绝对路径
tarball在升级上可能会有麻烦 特别是在多个软件互相有关联的情况下 tarball卸载上面具有比较高的难度
所以建议如下
1将tarball的原始数据解压到/usr/loacl/src当中
2安装到/usr/local这个默认的路径下
3考虑到卸载 最好将每个软件单独的安装到/usr/local的下面
4为安装到单独的目录的软件 加入man page到path变量中
例如 /etc/man.config 中的40-50行处加入
MANPATH /usr/local/software/man
 
实例1
a 安装ntp软件   假设tarball文件位于root目录中
进入目录 cd /usr/local/src     
解压tarball      tar -zxvf /root/ntp-...tar.gz
cd ./ntp -../    进入解压后的目录
查看install文件和readme     vim  INSTALL    和vim  README
b 检查configure支持参数    并实际建立makefile规则文件
./configure --help | more   查询可用的参数
--prefix=PREFIX 后面接的路径就是安装目录    未指定则
--enable-all-clocks
--enable-parse-clocks
./configure --prefix=/usr/local/ntp --enable-all-clocks  --enable-parse-clocks    开始建立makefile
在此过程中会显示gcc的检查  需要留意      config.status:creating Makefile   创建makefile文件
c 执行编译与安装
make clean;make
 
利用patch更新源代码     更新的方式  有全部更新和部分更新   patch就是后者     不用将所有的tarball全部下载再编译导致费时费力    只更新软件所有源代码中的一小部分    节省资源   
patch语法如下    
patch -p 数字   <   patch_file  此命令仅仅更新原始代码文件
假如patch_file中的第一行是/home/guest/example/expatch.old    如果patch -p1 < patch_file    则更新的文件为home/guest/example/expatch.old     如果patch -p4 < patch_file   则更新的是expatch.old    数字代表去掉几个斜线
如果patch文件有错误   更新完毕之后   也可以进行回滚  即恢复到上一个版本  
patch  -R < patch_file
打完补丁之后  需要重新编译  并且安装
make clean main
make install
 
函数库的管理
函数库根据是否被编译到程序内部而分为动态与静态        即static与dynamic两类
静态库:
一般扩展名为.a      通常扩展名为libxxx.a
编译时将库编译进二进制文件中     所以执行文件会比较大
优点就是可以独立的执行      如果需要升级  则所有文件都需要重新编译
动态库:
一般扩展名为.so    libxxx.so
在主程序中只有一个指针指向动态的共享库 当使用该动态的函数库的时候 程序会主动去某个路径下读取 所以动态函数库不能随意删除或者移动 因为会影响很多相依赖的程序软件。
升级 执行文件无法独立运行 当函数库升级之后 执行文件不需要进行重新编译 前提条件是函数库前后的版本文件名必须相同 否则主程序会找不到目标库文件
绝大部分的函数库放在/usr/lib /lib的目录下 另外linux系统里的很多函数是kernel提供的 所以kernel的函数库放在
/lib/modules的里面 不同版本的内核中的函数库很多事不同的 所以换过内核后 很多原来的软件无法运行。
将常用函数库调用到内存中 可以加快软件的运行速度
在/etc/ld.so.conf 文件中写下想要加载到内存中的目录 注意是目录
然后利用ldconfig软件 将/etc/ld.so.conf中写入的资料加载到内存当中
同时将数据记录一份在/etc/ld.so.cache 这个文件当中
ldconfig也可以判断动态函数库的链接信息
ldd 程序的动态函数库解析  
判断某个可执行文件包含什么动态的函数库
ldd [-vdr] [filename]
v vendor
d 将丢失的link显示出来
r 将ELF有关的错误内容显示出来
例子 找出/usr/bin/passwd这个文件的函数库数据
ldd /usr/bin/passwd
 
libaudit.so.0=>/lib/libaudit.so.0
libselinux.so.1=>/lib/libselinux.so.1
libc.so.6=>/lib/libc.so.6
libpam.so.0=>/lib/libpam.so.0   这里是pam模块
例子2
找出/lib/libc.so.6  这个函数的相关函数库
ldd -v /lib/libc.so.6
/lib/ld-linux.so.2
linux-gate.so.1=>
 
/lib/libc.so.6:
ld-linux.so.2=>/lib/ld-linux.so.2
ld-linux.so.2=>/lib/ld-linux.so.2
ld-linux.so.2=>/lib/ld-linux.so.2
 
检验软件的正确性
md5sum
sha1sum
安全性考虑  需要验证的文件  包括
/etc/passwd
/etc/shadow
/etc/group
/usr/bin/passwd
/sbin/portmap
/bin/login
/bin/ls
/bin/ps
/usr/bin/top
 
 
 
 
RPM   SRPM   和YUM   软件的安装方式二
常见的软件管理分别是RPM和dpkg   前者是redhat系    后者是debian
自动解决软件的想依赖    redhat为yum     suse为you    mandriva为urpmi软件等等   
而dpkg包管理方式主要是apt的在线升级机制
概念
RPM    全名为redhat package manager    
特点为将要安装的软件先编译过   并且打包成rpm机制的包装文件  文件里面的数据库记录着此软件安装时的必备条件。安装软件之前会先检查linux主机的环境是否支持   如果不支持则不安装
优点:编译完成   打包完毕   不需要重新编译       依赖信息已经记录到linux主机的数据库上  方便查询升级和卸载
缺点:二进制文件    要求安装的环境与打包时的环境必须一致或者相当  即发行版本必须一致    并且要求软件的相依属性要满足     卸载时尤其需要注意   最底层的软件不能够先卸载  否则会造成整个系统的问题
SRPM source RPM的意思     也即包含原始代码      扩展名为***.src.rpm  与tarball的不同是包含软件所需要的相依性的软件说明 以及所有rpm文件所提供的数据   同时与rpm不同的是   也提供了参数配置文件  configure与makefile   
下载SRPM文件    
先将软件以RPM管理的方式编译   此时SRPM会被编译成为RPM文件     
将编译完成的RPM文件安装到linux系统之中
SRPM因为有源代码  所以比RPM更加灵活   RPM不能修改参数并编译        但是SRPM可以修改参数编译  并且安装。
 
 
 
RPM在打包软件的时候   同时加入一些信息    包括软件的版本   软件作者  相依属性的其他软件  本软件的功能说明  本软件的所有文件的记录等等    然后再linux上面建立一个rpm数据库   当要安装某个以rpm的软件时   rpm会检验该数据库里是否已经存在相关的软件了  如果数据库显示不存在那么这个rpm软件就不能安装
 
因为以上的原因   就出现了YUM 在线升级的方式
xx.rpm   为一般软件      devel.xx.rpm为开发版本     普通用户一般会安装前者
YUM根据软件中的依赖属性的列表  对比主机系统中已经安装的软件相比较    如果没有就安装
原文地址:https://www.cnblogs.com/dongguolei/p/7896366.html