1. 程式人生 > >rpm yum 源代碼編譯

rpm yum 源代碼編譯

query round node x86 php 版本 預編譯 .rpm etc

程序包的編譯與安裝

程序源代碼-->預編譯-->編譯-->匯編-->鏈接-->運行

鏈接時關聯到相關的數據庫

編譯又分
靜態編譯:程序文件自帶庫
動態編譯:.so程序文件不自帶庫,而是共享操作系統的庫來編譯

API:應用程序接口

編譯和開發源程序的接口
    如果一個程序包在兩個平臺都支持posix標準 即在windows上開發的程序也可以在linux上編譯,反之亦然
    pos:可移植操作系統 後改名成posix

    posix標準即是該程序包在兩個平臺的api接口相同,意味著有關庫的接口相同(庫的功能相同又互相兼容)

    即編譯時要移植api要相同

ABI:應用二進制接口

如果一個編譯完的程序如果想要在另一個平臺上運行 要保證abi要相同

例如:在linux上編譯完的程序移到windows上運行 即使api相同  也不能運行 因為不同操作系統的鏈接庫的格式有可能不同如windows的動態庫為.dll結尾linux 的時.so而且不同操作系統的二進制格式可能不同如windows的可執行二進制格式為exe,linux的為elf

查看二進制程序所依賴的庫文件
ldd /path/to/file

管理查看本機的庫文件
ldconfig 系統重新生成緩存
-p 顯示本機一斤緩存的所有可用的庫文件即其路徑映射關系
-v 顯示詳細信息

    配置文件
            /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
    緩存文件
            /etc/ld.so.cache

二進制應用程序的組成部分

    二進制文件  庫文件  幫助文件  配置文件
    ------------------  ------------------ 
    是源代碼的組成部分   通常放在源代碼目錄中,不能編譯

程序包管理

debian :deb ,dpt
redhat :rpm ,rpm

源代碼的命名方式

name-version.tar.gz 

rpm包的命名方式

name-version-release.arch.rpm

version:majoy,minor.release
release:release.os

常見的arch

X86:i386,i486,i586,i686
X86_64: x64 x86_64 amd64
powerpc:ppc

程序包管理工具

yum: rpm包管理器的前端管理工具
dnf: Fredora 22+ rpm包管理工具 用法與yum相同
apt-get: deb包前端管理工具
zyypper:suse全段管理工具

rpm 程序包管理
功能:將編譯好的應用程序的各組組成各組文件打包成一個或幾個程序包文件,從而方便快捷的實現程序包的安裝,卸載,查詢,升級,和校驗等管理操作

1.程序的組成清單(每個包獨有)
文件清單
安裝或卸載時運行的腳本(如安裝nginx程序包運行時需要使用nginx用戶運行,如果系統中沒有nginx用戶在安裝程序包的時候會幫你創建)
2.數據庫(公共)
程序包名及其版本
依賴關系
功能說明
安裝生成各文件的文件路徑機器校驗碼信息

程序包搜索引擎
http://pkgs.org
http://rpmfind.net
http://prpm.bphone.net

升級操作時註意事項
1.不要對內核執行升級操作,linux支持多內核版本的並存,因此直接安裝新版本內容
2.如果原程序包的配置,在安裝之後被修改,升級時,新版本提供的同一個配置文件不會直接覆蓋原程序配置文件,而是把新版本的配置文件重命名(filename.rpmnew)後保存,但如果配置文件相同則不會新建配置文件

rpm相關命令
rpm{i|install}
-v:顯示詳細安裝信息
-vv:顯示更詳細的安裝信息
-h:顯示安裝包時的安裝進度
rpm -ivh package

--test:測試安裝但不真正執行安裝操作
--nodeps:忽略依賴關系
--replacepkgs:重新安裝
--nosignature:不檢查來源合法性
--nodigest:不檢查包的完整性
--noscript:不執行包的腳本片段
    pre 安裝前執行
    post 安裝後執行
    perun 卸載前執行
    postun 卸載後執行

升級
    -U 升級操作,如果安裝有舊版本的程序包,則執行升級操作,否則就下載新版程序包
    -F 升級操作,如果沒有安裝舊版的程序包,則不執行升級操作,也不下載

    --oldpackage 降級操作
    --force 強制

查詢rpm包

    rpm {-q|--query}[selection-options][query-options]

        [selection-options]
            -a:查詢已安裝的所有包
            -f:查看指定的文件由哪個程序包安裝完成
            -p:/path/to/packfile 查詢未安裝的程序包文件

        --whatprovides capability 查詢指定的能力由那個程序包所提供
                    如   /bin/ls
        --whatrequires capability 查詢指定的能力被哪些包所依賴
                    如  /etc/cat 

        [query-options]

            --changelog:查詢已安裝rpm包的changelog(改變日誌)
            -d:查看指定rpm包的幫助文件
            -c:查看指定rpm包的配置文件
            -i:查看指定rpm包的信息
            -l:查看指定程序包安裝後生成的所有文件
            --script:查看指定rpm的腳本片段
            -R:查詢指定程序包所依賴的capability
            --provides 查詢指定程序包所提供的capability
                例如 rpm -qR php-common
                     rpm --provides php-common

卸載
    rpm {-e|--erase}

        --scripts
            per
            post
            perun
            postun
        --test
        --nodeps

檢驗 rpm包是否發生了更改

    rpm -V (zsh) 跟程序名

        S M 5 D L U G T D 
        S 文件大小發生了改變
        M 文件的模式(包括許可和文件類型)發生了改變
        5 MD5校驗碼不一樣
        D 設備主從設備號發成了改變
        L 符合連接發生了改變
        U 文件的屬主發生了改變
        G 文件的屬組發生了改變
        T 文件的修改時間發生了改變
        P 功能發生改變

數據庫的重建(數據庫損壞或文件損壞)/var/lib/rpm
    rpm {--initdb|--rebuilddb}

            --initdb 初始化
                如果實現不存在數據庫則創建否則不執行任何操作
            --rebuilddb
                無論當前有無數據庫,直接創建數據庫
    其是通過讀取每個文件的元數據進行構建

導入GPG密鑰 --import,-K

        rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY

yum源

yum的安裝rpm包過程

    yum在安裝rpm時,根據配置文件指定的url路徑去尋找指定的地址,此時相關的文件服務器需要開啟文件共享接口,在下載文件之前,先下載一份文件服務器上倉庫的元數據文件

    (repodata目錄下的一些元數據文件到客戶端文件的cache(/var/cache/yum)中)

    之後yum在分析這些元數據文件 有無我們需要的rpm包及其相關依賴的包,如果相關依賴的包中有部分依賴的包我們已經下載,則不會重復下載因為在下載前yum會檢查本地
    是否有那些依賴包。安裝完成後卸載裝好的程序包緩存,但是一般都不去刪除元數據文件。

    不刪除元數據文件 這樣會導致一個問題如果倉庫現在又更新除了新的文件,或者除了新版本的文件,或出現新的依賴關系,那我們客戶端如果想要下載新版本的文件但是無法下載這顯然時不可以的
    所以我們每次去請求下載程序包的時候都會請求元數據信息如果我們每次都請求那我們不刪除元數據信息又有什麽意義呢 在服務器倉庫中會提供一個文件 他將文件中的每個元數據文件的特征碼記錄下來
    如果這些文件中的內容發生了變化,那其中的特征碼坑定發生了改變,所以我們請求的元數據信息其實不是元數據文件而是請求一個校驗碼,將其與緩存中的元數據文件進行對比,如果兩個文件的特征碼相同,則不下載元數據文件,否則則下載。

    如 /var/cache/yum/X86_64/7/base 中repomd.xml記錄的就是特征碼 primary的記錄的就是文件相關的元信息

在rpm或者使用yum工具安裝的過程中如果有對安裝修改文件卸載等操作都會建立一個事務,linux中只支持一個這樣的事務運作,也就是說在下載的時候不能再打開一個終端進行更新卸載下載

關於yum的配置文件註意
在一個倉庫中如果有多個url如 [base]中有多個下載路徑,系統默認是隨機選擇一條路徑進行下載,但也可以按順序指定,域名、相關命令中會講到

倉庫的定義

[repositoryID]
name=some name for this repository
baseurl=url
enabled={0|1} 默認為1 可不寫enabled
gpgcheck={0|1} 指定是否檢測文件的來源合法性文件的完整性,此項為一時,如果沒有指定gpgkey則無法安裝成功
gpgkey=url
failovermethod={roundrobin|priority} 默認為隨機(roundrobin) url使用priority按指定的url順序查找

yum的repo中可用變量

    $releasever
    $arch
    $basharch

如 http://mirror.122.com/centos/$releasever/$basharch/os

    靈活根據發行版下載程序包

yum的相關命令

安裝 :yum install package1 [package2] [..]
重裝 :    reinstall package1 [package2] [..] 
升級 :    update [package1] [package2] [..]
降級 :       downgrade package1 [package2]
卸載 :    remove package1 ..

檢查升級
check-update
查看程序包信息(包括沒裝的)
info[..]
清理本地緩存
clean[packages|metadata|all|..]
構建緩存
makecache
搜索
search string1 以指定的關鍵字
查看指定包所依賴的capability
deplist package1
查看yum事務歷史
history [info|list|package=list|stats(統計)]
包組管理的相關命令
groupinstall group1 [group2]
groupupdate ~
grouplist ~
groupremove ~
groupinfo ~

若顯示的是中文 可以使用中文安裝

如 groupinstall "開發工具"

yum命令行選項
--nogpgcheck 禁止進行gpgcheck
-y 自動回答為yes
-q 靜默模式
--disablerepo=repoidglob 臨時禁用指定的repo
--enablerepo=repoidglob 臨時啟用指定的repo
--noplugins 禁用所有插件

源代碼編譯

安裝包 gcc  gcc-c++ glibc devel 

源代碼的組成格式
    多文件:文件中的代碼中,很可能出現跨文件依賴關系
        可以通過make來解決
    c,c++:make(configure --> makefile.in --> makefile)
    java:maven

編譯安裝三步驟

    一 
        ./configure

                1.通過選項傳遞參數,指定啟用的特性,安裝路徑等,執行時會參考用戶的指定以及makefile.in文件生成makefile
                2.檢測依賴的外部環境
    二
        make
                根據生成的makefile文件構建應用程序
    三
        make install

開發工具

    autoconf:生成 configuer   
    automake:生成 makefile.in 

安裝先看install或者readme

編譯c源代碼
前提:提供開發工具,及開發環境、
開發工具:make gcc等
開發環境:開發庫,頭文件
glibc:標準庫

    通過包組提供開發組件
        centos6 "Development Tools" "Server Platform Development"

第一步

    一. configure腳本
        選項: 指定安裝位置,指定啟用特性
            安裝路經指定
                --perfix==/path/to/somewhere 指定默認安裝路徑 否則默認安裝路徑為/usr/local
                --sysconfdir=/path/to/somewhere 指定配置文件安裝位置

                optional feature :可選特性

                optional package :可選包
                        --with-package
                        --without-package       指定安不安裝相關依賴包

    二. make

    三. make install

安裝後的配置
因為是源碼包 所以安裝路徑都是我們指定的 所以我們要指明相關配置

    1.導出二進制程序至PATH環境變量中
        編譯/etc/profile.d/name.sh
            export PATH=/path/to/bin:$path
            因為執行程序在bin中 所以路徑上有bin

    2.導出庫文件路徑
        編譯/etc/ld.so.conf.d/name.conf
            添加新的庫文件所在目錄至此文件中
                    例如 在配置文件中添加 /usr/local/apache/lib/

    3.導出頭文件 一般都在(/usr/include)
        基於鏈接的方式實現
            ln -s /usr/local/apache/include /usr/include/apache

    4.導出幫助文件
        centos6 /etc/man.config
            添加一行MANPATH /usr/local/apache/man
        centos7 /etc/man_db.conf
            添加一行MANDATORY_MANPATH /usr/local/apache/man

rpm yum 源代碼編譯