一些重要的文档
1. 开放源码的软件安装与升级简介
1.1 什么是开放源码、编译程序与可执行文件【1-1】
# file /bin/bash ----查看一下这个系统文件的属性信息,如果是可执行的二进制文件,会显示执行文件类别(ELF 32-bit LSB executable)
# file /etc/init.d/syslog ----如果是单纯的脚本文件,会显示text executables之类的内容(脚本中含有#!/bin/bash字样的话,会显示ASICLL文本文件的信息)
【1-0 gcc编译程序流程示意图】
1.2什么是函式库
/usr/lib,/lib,/usr/incllude ----linux核心提供的很多核心相关函数库
1.3什么是make与configure【1-2,3】
注意:
1.一款软件在linux不同的内核版本上跑时需要重复编译(因为呼叫的目标链接库的位置可能不同)
2.make程序依赖的makefile文件是由软件提供的侦测程序政策用户的作业环境后主动建立的
1.4什么是Tarball的软件【1-4】
1.5 如何安装与升级软件
1.5.1升级
方式一:直接透过原始码 和编译工具进行安装与升级
方式二:直接用编译好的binary program来安装与升级
1.5.2安装
方式一:redhat系列(RPM软件包管理机制、yum在线更新模式);debin系列(dpkg软件包管理机制、APT在线更新模式)
方式二:下载tarball手动编译安装【1-5】
2. 使用传统程序语言进行编译的简单范式
# yum groupinstall "Development Tools" ----预安装开发软件
2.1单一程序:印出Hello World
1编辑程序代码(原始码)
# vim hello.c ---- 用c语言写的程序扩展名建议用.c#include<stdio.h>int main(void){printf("Hello World! ");}
2.开始编译与测试执行
# gcc hello.c
# ll hello.c a.out ----此时会产生a.out(如果没有加上任何参数,则执行档被自动设定为a.out)这个文件
# ./a.out ----执行
# gcc -c hello.c ----目标文件以源码文件名命名
# ll hello* ----查看编译执行情况
# gcc -o hello hello.o ----将目标文件进一步包装成为可执行文件,命名为hello
# ./hello
2.2主、子程序的编译
注意:如果更新了某个部分主需要再单独重新编译,然后重新包装成可执行文件
范例一:
1.编写主子程序
# vim thanks.c
# include<stdio.h>
int main(void)
{
printf(Hello world
");
thanks_20(); ----呼叫子程序
}
# vim thanks_2.c
# include <stdio.h>
void thanks_2(void)
{
printf("Thank you
");
}
2.将原始码便已成为可执行文件
# gcc -c thanks.c thanks_2.c
# ll thanks* ----查看编译结果
# gcc -o thanks thanks.o thanks_2.o ----封装成可执行文件
# ll thanks* ----最终产生thanks这个可执行文件
3.执行这个可执行文件
# ./thanks
案例二:gcc更丰富的功能
# gcc -O -c thanks.c thanks_2.c -----O为产生优化的参数
# gcc -Wall -c thanks.c thanks_2.c ---- -Wall会产生更详细的的编译过程信息
2.3呼叫外部函式库:加入连结的函式库
案例三:计算出sin(3.14),计算机使用弧度而不是角度
# vim sin.c
# include<stdio.h> ----/usr/include/,include默认去寻找的位置,可以编译时指定
int main(void)
{
float value;
value=sin(3.14/2);
printf("%f
",value);
}
# gcc sin.c ----由于没有加入libm.so这个函式库,编译失败
# gcc sin.c -lm -L/lib -L/usr/bin ----编译时加入额外函式库连接的方式(在/lib和/usr/bin下寻找libm.so这个函式库)
#./a.out ----尝试执行新档案
案例四:自定义include的档案的位置
# gcc sin.c -lm -I/usr/include
2.4gcc的简易用法(编译、参数与链接)
# gcc -c hello.c ----会产生hello.o这个档案,但是并不会产生binary执行档
# gcc -O hello.c -c ----会自动产生hello.o这个档案,并根据作业环境给予优化执行速度
# gcc sin.c -lm -L/usr/lib -I/usr/include ---在binary file制作时,将连结的函式库和相关的路径填入
# gcc -o hello hello.c -Wall ----将编译的结果输出成某个档名,加入-Wall后编译会变得比较严谨
3. 用make进行宏编译【1-8】
3.1为什么要用make
案例一:展示不用make解决一个相对复杂的编辑过程【1-7】
1.先进性目标文件的编译,最终会有4个*.o的档名出现
# gcc -c main.c
# gcc -c haha.c
# gcc -c sin_value.c
# gcc -c cos_value.c
2.在进行连接成为执行档,并加入libm的数学函数,以产生main执行档
# gcc -o main main.o haha.o sin_value.o cos_value.o -lm -L/usr/lib -L/lib
3.本程序的输出结果,必需输入姓名、360度角的角度值来计算
# ./main
案例二:用make完成案例一
1.先编辑makefile这个规则文件
# vim makefile
main:main.o haha.o sin_value.o cos_value.o ----仅给出目标文件,make会自动寻找原始码文件进行编译
gcc -o main.o haha.o sin_value.o cos_value.o -lm ----进行连结这一行最前面是一个【tab】
2.尝试使用makefile指定的规则完成编译
# rm -f main *.o ----将案例一编译完成的各种文件删除
# make ---- 根据当前目录下的makefile编译成相关的档案
# make ----在不删除任何档案的情况下重新执行一次make,发现会对档案进行更新(主动判断哪一个原始码相对目标文件更新过并进行更新)
3.2makefile的基本语法变量【1-9】
target:目标文件1 目标文件2
【tab】gcc -o 欲建立的执行文件 目标文件1 目标文件2
案例一:在makefile中执行两个以上动作
1.在makefile中建立新的规则,此规则的标的(target)名称为clean
# vim makefile
main:main.o haha.o sin_value.o cos_value.o ----仅给出目标文件,make会自动寻找原始码文件进行编译
gcc -o main.o haha.o sin_value.o cos_value.o -lm ----进行连结这一行最前面是一个【tab】
clean:
rm -f main main.o haha.o sin_value.o cos_value.o -lm
or(简化)【1-10,14】
LIBS=-lm
OBJS=main.o haha.o sin_value.o cos_value.o
CFLAGS=-Wall
main:${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f ${OBJS}
2.测试clean这个标的
# make clean
3.先清除目标再编译
# make clean main ----先清除之前的所有编译好的东西,然后重新编译成可执行文件
4. Tarball的管理与建议
注意:原始码的好处在于实现理论上的跨平台
4.1使用原始码管理软件所需要的基础软件【1-11】
gcc或cc:编译器
make和autoconfig:简化编译的程序和辅助侦测建立makefie的软件
kernel提供的library及相关的include档案:kernel-source或kernel-header
一些然间集群:kernel source development或development too;s
# yum groupinstall "Development Tools" ----安装gcc等软件开发工具
# yum groupinstall "x Software Development"
# yum groupinstall "Legacy Software Development" ----如果软件较旧安装这个
4.2Tarball安装的基本步骤【1-12】
1.解压缩到/usr/local/src ----释出的软件会被安装在/usr下,用户自行安装的软件建议安装在/usr/local,原始码在/usr/local/src下,man page在/usr/local/man
2.安装
# ./configure ----检查系统、相关软件属性,产生安装信息,建立makefile
# make clean ----将可能存在的目标文件(*.o)清除掉,确保目标文件是在自己的系统上编译的
# make ----依据makefile的预设工作将原始码进行编译,并进一步连接成为可执行文件,这个可执行文件会被放置在当前目录下,尚未被安装到预定目录中
# make install ----将编译完成的东西安装到正确的路径
3.手动将这个软件的man page写入到/etc/man.config
# vim /etc/man.config
MANPATH /usr/local/software/man ----在40-50行左右
4.3一般Tarball软件安装的基本事项(移除升级)
4.3.1安装目录
1.系统默认(以apache为例)
/etc/httpd ----配置文件
/usr/lib ----函式库
/usr/bin ----执行档
/usr/share/bin ----联机帮助档
2.预设用tarball安装到/usr/local(难以管理)
/usr/local/etc ----配置文件
/usr/local/lib ----函式库
/usr/local/bin ----执行档
/usr/local/man ----联机帮助档
3.规定一个特定的目录(以apache为例)
/usr/local/apache/etc ----配置文件
/usr/local/apache/lib ----函式库
/usr/local/apache/bin ----执行档
/usr/local/apache/man ----联机帮助档
注:卸载时只需要# rm -rf /usr/local/apache(参照makefile里面的install信息了解安装位置)
4.3.2安装规范(安装指导)【1-13】
4.4一个简单的范例、利用ntp来示范
注意:下载压缩包到/root,原始码解压到/usr/local/src,安装到/usr/local/ntp
1.下载到/root,并参阅README/INSTALL
2.解压缩下载的tarball,并参阅README/INSTALL档案
# cd /usr/local/src ----切换到这个目录
# tar -zxvf /root/ntp-4.2.4p7.tar.gz ----解压缩到当前目录(会建立/usr/local/ntp-4.2.4p7)
# cd ntp-4.2.4p7
# vim INSTALL ----特别是安装简介的部分,README也要看一看
3.检查configure支持参数,并实际建置makefile规则文件
# ./config --help | more ----查看可用的参数有哪些
# ./config --prefix=/usr/local/ntp --enable-all-clocks --enable-parse-clocks ----指定安装路径,开始建置makefile
4.开始编译与安装
# make clean ;make
# make check
# make install
4.5利用patch更新原始码
注:
1.如果patch失败可以还原;
2.只有确实有对应新旧版本的patch file的情况下才可以用patch来进行更新,如果版本相差很多可以下载连续释出的patch fil依序更新
# patch -R < ../main_0.1_to_0.2.patch
案例:测试旧版的功能,然后将旧版升级为新版
1.测试旧版的功能
# tar -zxvf main-0.1.tgz ----解压缩旧版的原始码和编译好的目标文件以及可执行文件
# cd main-0.1 ----该目录下还有之前做好的makefile
# make clean main ----清除目标文件,并执行可执行文件(0.1版本的)
2.下载patch file并测试其内容
# vim ~/main_0.1_to_0.2.patch ----查看用来升级的patch文件
diff -Naur main-0.1/cos_value.c main-0.2/cos_value.c
...
3.更新原始码,并且重新编译程序
# patch -p1 < ../main_0.1_to_0.2.patch ---- 进行原始码更新的动作,main_0.1_to_0.2.patch中第一行中最后一个字串指定的路径: main-0.2/cos_value.c,-p1将其变为cos_value.c,因为我们要在当前目录(main-0.1)下进行更新,当前目录下就有cos_value.c
# make clean main ----删除目标文件和可执行文件并执行main这个target(利用原来的makefile重新编译成为执行程序)
# ./main ----执行下看看已经升级的程序
4.重新安装(/usr/local/bin)
# make install ----安装到/usr/local/bin,这个路径在PATH中
# make uninstall ----移除这个软件
5.函式库管理
5.1动态与静态函式库
1.静态函式库
扩展名:libxxx.a
编译行为:整合到执行程序当中(造成程序偏大)
独立执行的状态:独立
升级难易度:难(函式库升级的话,程序需要重新编译)
2.动态函式库(目前主流)
扩展名:libxxx.so
编译行为:编译时不整合到程序中,运行时动态读取函式库
独立执行状态:不独立
升级难易程度:易
5.2idconfig与/etc/ld.so.conf
ldconfig 将常用的动态函数库加载到内存的指令(还可以用来判断动态链接库的连接信息)【1-15】
/etc/ld.so.conf 默认记录想要读入内存的动态函式库所在的目录
/etc/ld.so.cache 默认缓存成这个文件
案例一:载入mysql的动态函式库(/usr/lib/mysql文件夹中)
# vim /etc/ld.so.conf ---- 设置想要缓存的都动态链接库
include ld.so.conf.d/*.conf
/usr/lib/mysql ----新增这一行
# ldconfig ----加入到内存
# ldconfig -p ----查看/etc/ld.so.cache缓存文件中的动态链接库(函式库名称=》该函式库实际路径)
5.3程序的动态函式库解析:ldd
ldd 查看某个可执行文件的动态链接库【1-16】
案例一:找出/usr/bin/passwd这个档案的动态链接库
# ldd /usr/bin/passwd ----其中有libpam.so,这就是提供pam验证的动态链接库
案例二:找出/lib/libc.so.6这个函式的其它 相关函式库
# ldd -v /lib/libc.so.6 ---- -v可以让我们获得额外的信息,比如这个函式库来自哪一个软件
6. 检验软件的正确性
6.1md5sum/sha1ssum【1-117,1-17】
7.重点回顾【1-18】
8.课后练习
情景模拟:对重要档案建立指纹码,并每日对比此重要工作
1.将/etc{passwd,shadow,group}以及系统上面所有的SUID/SGID档案建立档案列表
# ll /etc/{passwd.shadow,group} > miportant.file
# find /bin /sbin /usr/bin -perm +6000 >> important.file
2.建立md5.checkfile.sh这个脚本来产生指纹码到finger1.file,并设定
# vim md5.checkfile.sh
#!/bin/bash
for filename in $(cat important.file)
do
md5sum $filename >> finger1.file ----将加密的字串放在finger1.file
done
# sh md5.checkfile.sh ----执行这个进行md5加密的脚本
# chattr +i finger1.file
3.执行完上面的脚本后继续完善脚本,除了能够建立finger1.file还可以通过一样的机制建立finger_ner.file,然后比较这两个档案,如果有变化发邮件警告root
# vim md5.checkfile.sh
#!/bin/bash
#1.$1(执行脚本时后面第一个指令参数)如果是new
if [ "$1" == "new" ];then
for filename in $(cat important.file)domd5sum $filename >> finger1.file ----将加密的字串放在finger1.filedonefiif [ ! -f finger1.file ] ----如果不存在这个文件echo "file:finger1.file NOT exit"exit 1fi[ -f finger_new.file ] && rm finger_new.file ----如果已经存在finger_new.file这个文件就删除它for filename in $(cat important.file)
do
md5sum $filename >> finger1.file ----将加密的字串放在finger1.file
done
testing=$(diff finger1.file finger_new.file) ----获得两个文件的比较信息
if [ "$testing" != "" ];then
diff finger1.file finger_new.file | mail -s "finger trouble.." root ----如果比较信息不为空就发邮件给root
fi
4.加入排程
# vim /etc/crontab
30 2 * * * root cd /root; sh md5.checkfile.sh ----每天晚上2:30执行这个脚本
9.参考数据与延伸阅读