13.(22章)软件安装原始码与tarball


一些重要的文档




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)
         do 
            md5sum $filename >> finger1.file        ----将加密的字串放在finger1.file
        done
fi
if [ ! -f finger1.file ]         ----如果不存在这个文件
    echo "file:finger1.file NOT exit"
    exit 1
fi
[ -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.参考数据与延伸阅读
原文地址:https://www.cnblogs.com/eli01/p/3559685.html