一软件的安装 原代码与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根据软件中的依赖属性的列表 对比主机系统中已经安装的软件相比较 如果没有就安装