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.参考数据与延伸阅读
  • 相关阅读:
    Blank page instead of the SharePoint Central Administration site
    BizTalk 2010 BAM Configure
    Use ODBA with Visio 2007
    Handling SOAP Exceptions in BizTalk Orchestrations
    BizTalk与WebMethods之间的EDI交换
    Append messages in BizTalk
    FTP protocol commands
    Using Dynamic Maps in BizTalk(From CodeProject)
    Synchronous To Asynchronous Flows Without An Orchestration的简单实现
    WSE3 and "Action for ultimate recipient is required but not present in the message."
  • 原文地址:https://www.cnblogs.com/eli01/p/3559685.html
Copyright © 2011-2022 走看看