zoukankan      html  css  js  c++  java
  • 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.参考数据与延伸阅读
  • 相关阅读:
    paddlepaddle训练网络的基本流程二(进阶Paddle-detection框架)
    paddlepaddle训练网络的基本流程一(入门示例)
    redis常用操作命令
    mysql基础命令
    使用Gunicorn和nginx进行Flask服务部署
    如何测试(八)抖音 如何测试?
    全(十九)Jmeter 请求 之 遇到 cookie、token 处理方式(使用 正则表达式提取器 获取 然后在引用)
    全(十八)Jmeter 请求元件 之 JSON PATH 提取 响应结果
    全(十七)Jmeter 请求元件 之 正则表达式提取器 提取 响应结果、foreach循环控制器
    全(十六)Jmeter 请求 之 正则表达式
  • 原文地址:https://www.cnblogs.com/eli01/p/3559685.html
Copyright © 2011-2022 走看看