zoukankan      html  css  js  c++  java
  • linux 软件的安装与Tarball

    1. Linux 系统上真正认识的可执行文件其实是二进制文件 ( binary program )
    2. shell scripts 只是利用 shell (例如 bash) 这支程序的功能进行一些判断式,而最终执行的除了 bash提供的功能外,它是呼叫一些已经编译好的二进制程序来执行的
    3. 小结:
      • 开放源码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行
      • 编译程序:将程序代码转译成为机器看的懂得语言,就类似翻译者的角色
      • 可执行文件:经过编译程序变成二进制程序后,机器看的懂所以可以执行的档案。
      • 函式库:就类似子程序的角色,可以被呼叫来执行的一段功能函数。
    4. 什么是 make 与 configure
      • make 是一支程序,会去找 Makefile,Makefile 的规则档案由侦测程序主动建立,通常这支侦测程序的文件名为 configure 或者是 config 。
      • 侦测程序会侦测的数据大约有底下这些:
        • 是否有适合的编译程序可以编译本软件的程序代码;
        • 是否已经存在本软件所需要的函式库,或其他需要的相依软件;
        • 操作系统平台是否适合本软件,包括 Linux 的核心版本;
        • 核心的表头定义档 (header include) 是否存在 (驱动程序必须要的侦测)。
    5. 什么是 Tarball 的软件
      • Tarball 档案,其实就是将软件的所有原始码档案先以 tar 打包,然后再以压缩技术来压缩。
      • Tarball 是一个软件包, 你将他解压缩之后,里面的档案通常就会有:
        • 源代码档案;
        • 侦测程序档案 (可能是 configure 或 config 等档名);
        • 本软件的简易说明与安装说明 (INSTALL 或 README)
    6. 更新的方法可以分为两大类,分别是:
      • 直接以原始码透过编译来安装与升级;
      • 直接以编译好的 binary program 来安装与升级。例如yum、APT等。
    7. Tarball 是如何安装的:
      1. 将 Tarball 由厂商的网页下载下来;
      2. 将 Tarball 解开,产生很多的原始码档案;
      3. 开始以 gcc 进行原始码的编译 (会产生目标文件 object files);
      4. 然后以 gcc 进行函式库、主、子程序的链接,以形成主要的 binary file;
      5. 将上述的 binary file 以及相关的配置文件安装至自己的主机上面。
        • 3, 4 步骤当中,我们可以透过 make 这个指令的功能来简化他,
        • 由于我们的原始码档案有时并非仅只有一个档案,所以我们无法直接进行编译。 这个时候就需要先产生目标文件,然后再以连结制作成为 binary 可执行文件。
    8. gcc 的简易用法 (编译、参数与链结)
      • 仅将原始码编译成为目标文件,并不制作链接等功能:
        • [root@www ~]# gcc -c hello.c.
      • 在编译的时候,依据作业环境给予优化执行速度
        • [root@www ~]# gcc -O hello.c -c
      • 在进行 binary file 制作时,将连结的函式库与相关的路径填入
        • [root@www ~]# gcc sin.c -lm -L/usr/lib -I/usr/include
          • -lm 指的是 libm.so 或 libm.a 这个函式库档案;
            • -l :是『加入某个函式库(library)』的意
            • m :则是 libm.so 这个函式库,其中, lib 与扩展名(.a 或 .so)不需要写
          • -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
          • -I 后面接的是原始码内的 include 档案之所在目录。
      • 将编译的结果输出成某个特定档名
        • [root@www ~]# gcc -o hello hello.c
      • 在编译的时候,输出较多的讯息说明
        • [root@www ~]# gcc -o hello hello.c -Wall
    9. 用 make 进行宏编译
      1. 例: 先创建makefile规则文件
        • vim makefile
        • main: main.o haha.o sin_value.o cos_value.o
          • gcc -o main main.o haha.o sin_value.o cos_value.o -lm
        • 执行make程序 make
      2. make 有这些好处:
        • 简化编译时所需要下达的指令;
        • 若在编译完成之后,修改了某个原始码档案,则 make 仅会针对被修改了的档案进行编译,其他的 object file 不会被更动;
        • 最后可以依照相依性来更新 (update) 执行档。
      3. 基本的 makefile 规则是这样的:
        • 标的(target): 目标文件1 目标文件2
        • <tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2
          • 『命令行必须要以 tab 按键作为开头』才行
        • 例:1. 先编辑 makefile 来建立新的规则,此规则的标的名称为 clean :
          • [root@www ~]# vi makefile
          • main: main.o haha.o sin_value.o cos_value.o
            • gcc -o main main.o haha.o sin_value.o cos_value.o -lm
          • clean:
            • rm -f main main.o haha.o sin_value.o cos_value.o
        •      2. 以新的标的 (clean) 测试看看执行 make 的结果:
          • [root@www ~]# make clean <==就是这里!透过 make 以 clean 为标的
          • rm -rf main main.o haha.o sin_value.o cos_value.o
        •  makefile 里面就具有至少两个标的,分别是 main 与 clean
        • 例: 利用shell script简化makefile
          • [root@www ~]# vi makefile
          • LIBS = -lm
          • OBJS = main.o haha.o sin_value.o cos_value.o
          • main: ${OBJS}
            • gcc -o main ${OBJS} ${LIBS}
          • clean:
            • rm -f main ${OBJS}
          • 变量的基本语法为:
            • 变量与变量内容以『=』隔开,同时两边可以具有空格;
            • 变量左边不可以有 <tab> ,例如上面范例的第一行 LIBS 左边不可以是 <tab>;
            • 变量与变量内容在『=』两边不能具有『:』
            • 在习惯上,变数最好是以『大写字母』为主;
            • 运用变量时,以 ${变量} 或 $(变量) 使用;
            • 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变数!
            • 在指令列模式也可以给予变量
            • make 指令列后面加上的环境变量为优先;
            • makefile 里面指定的环境变量第二;
            • shell 原本具有的环境变量第三。
            • $@:代表目前的标的(target)
    10. Tarball 安装的基本步骤
      1. 取得原始档:将 tarball 档案在 /usr/local/src 目录下解压缩;
      2. 取得步骤流程:进入新建立的目录底下,去查阅 INSTALL 与 README 等相关档案内容 (很重要的步骤!);
      3. 相依属性软件安装:根据 INSTALL/README 的内容察看并安装好一些相依的软件 (非必要);
      4. 建立 makefile:以自动侦测程序 (configure 或 config) 侦测作业环境,并建立 Makefile 这个档案;
      5. 编译:以 make 这个程序并使用该目录下的 Makefile 做为他的参数配置文件,来进行 make (编译或其他) 的动作;
      6. 安装:以 make 这个程序,并以 Makefile 这个参数配置文件,依据 install 这个标的 (target) 的指定来安装到正确的路径!
        • 大部分的 tarball 软件之安装的指令下达方式:
          • ./configure
          • make clean
          • make
          • make install ,将上一个步骤所编译完成的数据给他安装到预定的目录中
          • make distclean  ,类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile
    11. 安装的软件放置
      • 建议大家将自己安装的软件放置在 /usr/local 下,至于原始码 (Tarball)则建议放置在 /usr/local/src (src 为 source 的缩写)底下啊。
      • Linux distribution 默认的安装软件的路径
        • /etc/httpd  配置文件
        • /usr/lib  函式库
        • /usr/bin  执行档
        • /usr/share/man 联机帮助档
      • 以 tarball 来安装时:
        • /usr/local/etc
        • /usr/local/bin
        • /usr/local/lib
        • /usr/local/man
      • 如果你在安装的时候选择的是单独的目录:---------方便删除,但指令的路径要加到PATH当中
        • /usr/local/apache/etc
        • /usr/local/apache/bin
        • /usr/local/apache/lib
        • /usr/local/apache/man
    12. 为了方便 Tarball 的管理,通常鸟哥会这样建议使用者:
      1. 最好将 tarball 的原始数据解压缩到 /usr/local/src 当中;
      2. 安装时,最好安装到 /usr/local 这个默认路径下;
      3. 考虑未来的反安装步骤,最好可以将每个软件单独的安装在 /usr/local 底下;
      4. 为安装到单独目录的软件之 man page 加入 man path 搜寻:
        • 如果你安装的软件放置到 /usr/local/software/ ,那么 man page 搜寻的设定中,可能就得要在/etc/man.config 内的 40~50 行左右处,写入如下的一行:MANPATH /usr/local/software/man
    13. 动态与静态函式库
      1. 静态函式库的特色:
        • 扩展名:(扩展名为 .a),这类的函式库通常扩展名为 libxxx.a 的类型;
        • 编译行为:这类函式库在编译的时候会直接整合到执行程序当中,所以利用静态函式库编译成的档案会比较大一些喔;
        • 独立执行的状态:这类函式库最大的优点,就是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函式库的内容 (请参照动态函式库的说明)
        • 升级难易度:在升级方面,只要函式库升级了,所有将此函式库纳入的程序都需要重新编译!
      2. 动态函式库的特色:
        • 扩展名:(扩展名为 .so),这类函式库通常扩展名为 libxxx.so 的类型;
        • 编译行为:动态函式库在编译的时候,在程序里面只有一个『指向 (Pointer)』的位置而已
        • 独立执行的状态:函式库档案『必须要存在』才行,而且,函式库的『所在目录也不能改变』。
        • 升级难易度:当函式库升级后,执行档根本不需要进行重新编译的行为,档名相同即可。
      3. 绝大多数的函式库都放置在:/usr/lib, /lib 目录下!kernel 的函式库放在/lib/modules 里面
    14. ldconfig 与 /etc/ld.so.conf
      • 将常用到的动态函式库先加载内存当中 (快取, cache),增进动态函式库的读取速度!
      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 :那个 conf 指的是某个文件名,也就是说,使用 conf 作为 libarary 函式库的取得路径,而不以 /etc/ld.so.conf 为默认值
          • -C cache:那个 cache 指的是某个文件名,也就是说,使用 cache 作为快取暂存 的函式库资料, 而不以 /etc/ld.so.cache 为默认值
          • -p :列出目前有的所有函式库资料内容 (在 /etc/ld.so.cache 内的资料
    15. 程序的动态函式库解析: ldd  -----------------判断某个可执行的 binary 档案含有什么动态函式库
      1. ldd [-vdr] [filename]
        • -v :列出所有内容信息;
        • -d :重新将资料有遗失的 link 点秀出来!
        • -r :将 ELF 有关的错诨内容秀出来!
      2. 例:范例一:找出 /usr/bin/passwd 这个档案的函式库数据
        • [root@www ~]# ldd /usr/bin/passwd
      3. 范例二:找出 /lib/libc.so.6 这个函式的相关其他函式库!
        • [root@www ~]# ldd -v /lib/libc.so.6
    16. 检验软件正确性
      1. md5sum/sha1sum [-bct] filename
      2. md5sum/sha1sum [--status|--warn] --check filename
        • -b :使用 binary 的读档方式,默认为 Windows/DOS 档案型态的读取方式;
        • -c :检验档案指纹;
        • -t :以文字型态来读取档案指纹。
      3. Linux 系统上为你的这些重要的档案进行指纹数据库的建立
        • /etc/passwd
        • /etc/shadow( 假如你不讥用户改密码了 )
        • /etc/group
        • /usr/bin/passwd
        • /sbin/portmap
        • /bin/login ( 这个也很容易被骇! )
        • /bin/ls
        • /bin/ps
        • /usr/bin/top
    编译安装报错尝试解决办法:
    如果你已经知道你要找什么,你可以让strace只跟踪一些类型的系统调用。例如,你需要看看在configure脚本里面执行的程序,你需要监视的系统调 用就是execve。让strace只记录execve的调用用这个命令:
    
    strace -f -o configure-strace.txt -e execve ./configure
  • 相关阅读:
    SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......
    SmartSql For Asp.Net Core 最佳实践
    如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性
    Netty入门搭建
    IO同步阻塞与同步非阻塞
    NIO的缓冲区、通道、选择器关系理解
    SpringBoot整合ActiveMQ
    ActiveMQ的介绍及使用
    nginx入门(一)
    垃圾回收器及tomcat调优
  • 原文地址:https://www.cnblogs.com/guojintao/p/5749723.html
Copyright © 2011-2022 走看看