第五部分系统管理 源代码与软件包
开放源代码的软件安装与升级
源代码 +编译器+目标文件+函数库=可执行文件 =二进制文件
编译器 gcc cc
编译工具 make 根据makefile文件 此文件有厂商提供的configure或config软件来检测并生成
![](https://images2017.cnblogs.com/blog/1282980/201712/1282980-20171210161428630-2010254388.png)
注意看readme 和install 由厂商提供的说明文件(如果安装不成功)
configure 程序检测1、合适的编译器
2、所需要的函数库和依赖的软件
3、操作系统平台即linux的核心版本是否适合本软件
4、核心的表头定义文件header include是否存在 驱动程序要检测
建立makefile命令./configure
--prefix=PREFIX
指定软件安装的目录 未指定 默认为/usr/local
--enable-all-clocks
--enable-parse-clocks
函数库:/usr/include /usr/lib /usr/lib64 不同的操作系统 版本 发行版 会有不同
将源代码的纯文字文件打包压缩减小容量利于在网络上传输 先以tar打包 然后在意压缩技术来压缩 通常会是gzip和bzip2的压缩格式 后者压缩率更高 。
tarball是一个软件包 解压后会有源代码的文件、检测程序文件 congfiure等 本软件的安装说明INSTALL或者README
升级安装软件:
原因 :需要新的功能
旧版的安全问题
旧版的执行效率问题
更新的方法:
直接源代码进行编译
直接以编译好的二进制程序来安装 (需要厂商提供)
其中rpm中的yum和dpkg软件管理的apt线上更新模式都是预先编译安装的
tarball安装流程
1.下载tarball包
2.解压缩产生源代码
3.gcc进行源代码编译 产生object files目标文件
4.gcc进行函数库 主 副程序的连接 形成主要的二进制文件
5.将二进制文件以及相关的配置文件安装到自己的主机上面
传统程序语言c 进行编译的范例
1.编辑源代码
vim hello.c
#include <stdio.h>
int main(void)
{
printf("hello world
");
}
2.编译
gcc hello.c
./a.out 默认产生的可执行文件
方法二
gcc -c hello.c 编译hello.c源代码文件 生成hello.o目标文件
ll hello* 查看
gcc -o hello hello.o 将.o文件生成可执行文件 指定生成hello名称的二进制文件
./hello 执行生成的名称为hello文件
3.主程序 子程序的链接
vim thank.c
#include <stdio.h>
int main(void)
{
printf("hello world
")
thank_2();
}
vim thank_2.c
#include <stdio.h>
void thank_2(void)
{
printf("thank you!
");
}
4.程序的编译和链接 link
gcc -c thanks.c thanks_2.c
gcc -o thanks thanks.o thanks_2.o
./thanks
或者加入优化的参数选项
gcc -O -c thanks.c thanks_2.c
gcc -Wall -c thanks.c thanks_2.c
5.呼叫外部函数库:加入链接的函数库
vim sin.c
#include <stdio.h>
#include <math.h>
int main(void)
{
float value;
vlaue=sin(3.14/2);
printf("%f
",value);
}
数学函数库使用的libm.so这个函数库 最好在编译的时候将这个库文件加入进去 libm.so在编译的写法上使用的-lim
编译时加入额外的函数库链接的方式
gcc sin.c -lm -L/lib -L/lib64
./a.out
-lm拆开
l 小写的L 是加入某个函数库的意思
m则是libm.so这个函数库 .a或者.so不需要写
L的意思是我要的函数库libm.so需要到/lib或者/lib64里面去搜索,后面的lib和lib64不需要写 因为linux默认将库放在这两个位置 如果自己定义的库文件放在其他的目录 则需要在这里指定
include 默认放在usr/include/下面 如果文件并非放在这里 就需要利用大i即I 来指定include文件放置的目录
例子:gcc sin.c -lm -I/path
make进行宏编译
源代码文件互相调用过多时 gcc用起来会比较麻烦
此时利用make会简化操作流程
简化编译时所需要下达的指令
在编译完成之后 及修改某个源代码文件 make仅仅会针对被修改了的文件进行编译 其他的目标文件不会变更
最后依照相依性来更新执行文件
1.makefile文件的规则
语法:
target:目标文件1 目标文件2 ( 标签 建立 调用参数)
<tab> gcc -o 将要建立的执行文件 目标文件1 目标文件2 (具体的命令)
例子:
clean:
rm -f main main.o hello.o sin_value.o
执行make clean 就会执行makefile文件中clean标签中的命令
如果想要先清除目标文件 再进行编译的可以执行:make clean main
利用shell脚本 变量替换
简化makefile
vi makefile
LIBS=-lm
OBJS=main.o hello.o sin_value.o
main:${OBJS}
gcc -o ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
也可以在命令行中指定环境变量
例如:CFLAGS="-Wall" make clean main
环境变量优先级规则
make指令列后面加上的环境变量为先
makefile里面指定的环境变量为次
shell原来具有的环境变量为最次
特殊的环境变量
$@代表当前的标签
例如:
main:${OBJS}
gcc -o $@ ${OBJS} ${LIBS} 其中$@就代表main
tarball管理建议
1.源码所需要的基础软件
gcc或者cc等 编译器
make及autoconfig等软件
需要kernel提供的library以及相关的include文件
gcc等工具
yum groupinstall "Development Tools"
图形界面
yum groupinstall "X Sostware Development"
如果软件较旧
yum groupinstall "Legacy Software Development"
2.源代码安装步骤
解压---阅读install或readme----建立makefile(configure)----》make编译等----》make install执行install标签的命令
3.指令下达方式
./configure 创建makefile文件
make clean 清除遗留的目标文件
make 编译 建立可执行文件
make install 执行安装 主要的作用就是将编译完成的文件放到文件系统中
如果安装所有文件到一个独立的目录中 比如/usr/local/packages这个目录 那么必须手动的将这个软件的man手册写入/etc/man_db.conf中去
前面的每个步骤都是后面的必要条件
4.tarball安装的建议
/usr/local/src 里面解压缩源代码文件放置的位置
/usr 系统发行版本身的软件安装位置
/usr/local 用户自行安装的软件位置 建议
/usr/local/man man命令默认搜索说明文件位置
举例: apache这个软件说明的服务器安装位置
/etc/httpd 配置文件
/usr/lib 库文件
/usr/bin 执行文件
/usr/share/man 说明文件
如果以tarball来安装 默认就会变为
/usr/local/etc
/usr/local/bin
/usr/local/lib
/usr/local/man
其他的软件安装时也会安装到上面的几个目录中 当移除文件时 会很难追查文件的来源,所以建议将软件安装到单独的目录当中 例如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
man page也要加入环境当中 /usr/local/apache/man 加入到/etc/man_db.conf内的40-50行左右处
写下:MANPATH_MAP /usr/local/apache/bin /usr/local/apache/man
5.简单的范例
cd /usr/local/src
tar -zxvf /root/ntp-4.2...tar.gz
cd net-4.2..
cat INSTALL或者README
./configure --prefix/usr/local/ntp --enable-all-clocls --enable-parse-clocks
make clean;make
make check
make install
利用patch更新原始代码
函数库的管理
函数库又分为静态和动态两种
静态函数库 :
名称: 扩展名为.a 例如:libxxx.a
编译行为: 在编译的时候回直接整合到执行程序当中 利用静态函数库编译成的文件会比较大
独立执行: 可以独立执行 不以来外部的函数库
升级难度: 难 需要重新编译全部源代码
动态函数库
名称 扩展名为.so
编译行为 编译的过程中程序源代码中有一个指针指向动态的函数库 只有当需要函数库的时候 程序才会去读取函 数库。
独立执行的状态:不能够独立执行 必须携带必要的函数库 并且函数库的绝对路径不能改变
升级难度: 当函数库升级后 执行文件不需要进行重新编译 前提条件 新旧函数库的名称和路径不能改变
大部分的函数库都放置在/lib64 /lib目录下 kernel的函数库放在/lib/modules里面
ldconfig与/etc/ld.so.conf
增加函数库的读取效能,将常用到的动态函数库加载到内存当中 提高读取速度
方法:
1.在/etc/ld.so.conf里面写入动态函数库所在的目录 注意不是文件 而是目录
2.利用ldconfig这个执行文件将/etc/ld.so.conf的资料读入内存中
3.同时将资料备份一份在/etc/ld.so.cache这个文件中
语法
ldconfig [-f conf] [-C cache]
ldconfig [-p]
-f conf 某个文件名称 使用此文件作为函数库的取得路径 而不是/etc/ld.so.conf为默认
-C cache 暂存函数库资料 而不是以/etc/ld.so.cache作为默认值
-p 列出目前所有函数库资料内容 在/etc/ld.so.cache内的资料
举例
mariadb 库函数在/usr/lib64/mysql当中 如何读进cache
vim /etc/ld.so.conf.d/vbird.conf
/usr/lib64/mysql 新增此行
ldconfig 执行
ldconfig -p 查看加载结果
动态函数库解析 ldd
判断某个可执行的文件内含有什么样的动态函数库 利用ldd
语法 ldd [-vdr] [filename]
v verbose
d 重新将资料有丢失的link点显示取来
r 将ELF有关的错误显示
举例:ldd /usr/bin/passwd 找出此程序的函数库资料
ldd -v /lib64/libc.so.6 找出榆次函数库相关的其他函数库
当安装rpm软件包 以非yum方式(自动解决依赖关系)安装的时候 解决相依赖的关系 需要先ldd查看相依赖函数库之间的相关性
检验软件的正确性
md5sum sha1sum sha256sum
为防止被恶意篡改需要验一下文件
/etc/passwd
/etc/shadow
/etc/group
/usr/bin/passwd
/sbin/rpcbind
/bin/login
/bin/ls
/bin/ps
/bin/top
以上文件需要建立shell script的方式来自动检查指纹 即哈希值
md5sum/sha1sum/sha256sum [-bct] filename
md5sum/sha1sum/sha256sum [--status|--warn] --check filename