天天看點

[其他] linux環境下rpm安裝包管理 (rpm、rpmbuild),如何從iso檔案中提取rpm包

案例(以pam包為例)

制作patch(1~5)

    --1  準備需要的rpm源碼包,最終會獲得一個src.rpm包

        yumdownload --source pam

或者            wget http://xxxx.xxxx.com/pam-1.1.5-0.17.2.src.rpm

    --2  解壓,并把已經有的更新檔打到源碼中(可見,rpm包的構成就是 基線代碼+針對基線代碼各版本的patch)

                rpm -ivh pam-1.1.5-0.17.2.src.rpm           (生成~/rpmbuild目錄)

        rpmbuild -bp ~/rpmbuild/SPECS/anaconda.spec (在rpmbuild中生成BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS)

    --3  備份BUILD中的源碼

                cp -R ~/rpmbuild/Linux-PAM-1.1.5 ~/rpmbuild/Linux-PAM-1.1.5.bak

    --4  在~/rpmbuild/Linux-PAM-1.1.5中進行想做的修改

    --5  制作patch

                diff -Nur ~/rpmbuild/BUILD/Linux-PAM-1.1.5.bak  ~/rpmbuild/BUILD/Linux-PAM-1.1.5  >  new.patch

把patch打入生成新的rpm包(6~7)

    --6  重構項目

                mv new.patch ~/rpmbuild/SOURCES

        vim ~/rpmbuild/SPECS/pam.spec        【修改版本号,patch資訊,changelog等】

        rpmbuild -ba ~/rpmbuild/SPECS/pam.spec        (把目前的所有patch打到基線上)

    --7  擷取所有輸出

                重構後,會生成如下rpm包(這裡把新版本定為0.17.99)

                /var/tmp/build-root/standard-x86_64/usr/src/packages/SRPMS/pam-1.1.5-0.17.99.src.rpm

                /var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-devel-1.1.5-0.17.99.x86_64.rpm

                /var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-doc-1.1.5-0.17.99.x86_64.rpm

                /var/tmp/build-root/standard-x86_64/usr/src/packages/RPMS/x86_64/pam-1.1.5-0.17.99.x86_64.rpm

使用新的rpm包(8)

    --8  更新pam(更新動作不要解析依賴關系,是以隻要基線版本OK,即使目标環境上什麼都沒有,也能更新!)

                rpm -Uvh pam-1.1.5-0.17.99.x86_64.rpm

rpm的使用

1)yum search xxx

    使用此指令羅列成出來的所有軟體中,字尾表示适用于不同的架構。

    而其中以noarch結尾的表示,軟體和架構無關,一般情況下,這樣的包都是“腳本”。

2)xxx.rpm      ---    編譯好的軟體包

    xxx.src.rpm  ---    未編譯的軟體包(源碼包)

3)xxx-1.1.1-n.i386.rpm

    軟體名-版本号-第n此對外釋出.架構.rpm包類型

4) rpm的優點:

        1)rpm包裡面有編譯好的程式和配置檔案,不需要重新編譯;

        2)rpm包解壓的時候會檢查系統硬碟容量、作業系統版本等,確定可用性;

        3)rpm包裡面有相關文檔

5)rpm包中有記錄依賴關系的檔案,包在解壓的時候會去驗證以來關系,并在本機上查找相應的依賴是否安裝,如果沒有則報錯!等待解決依賴關系

        (這就是rpm讓人诟病的“軟體的屬性依賴”)

6)如何解決rpm的屬性依賴問題  ----->  yum

    為了友善軟體的重複利用,很多軟體都是以動态庫的方式對外提供,比如pam

    這也是為什麼很多時候能看到xxx.rpm和xxx-devel.rpm兩個包,帶devel的是給開發者使用的,裡面有“靜态庫”或者“動态庫”

    同屬于某個軟體,rpm是可直接使用的編譯好的軟體,devel.rpm是開發使用的相關庫

7)yum的工作流程

    yum會先下載下傳目标rpm包;然後解析rpm包中的依賴關系檔案,再把依賴關系發送到yum源(伺服器)上;伺服器端會根據依賴關系檔案下發所有相關的

    依賴包;最後把所有的依賴rpm包按照順序安裝好。

8)/var/lib/rpm:rpm的資料庫就在這個目錄下

    1)軟體更新時,各個版本之間的比較,在這裡找;

    2)系統已經安裝了哪些軟體,在這裡找;

    3)軟體的數字簽名,也在這裡找;

        其實就相當于rpm的私有資料庫

9)rpm下載下傳軟體的相關内容都放在什麼地方:

    /etc        :   配置檔案存放的地方

    /usr/bin    :   可執行檔案

    /usr/lib    :   動态庫

    /usr/share/doc  :   基本的軟體使用手冊和說明檔案

    /usr/share/man  :   man page檔案

        (注:可見,rpm是按照linux的套路來配置設定一個軟體的相關檔案的)

10)rpm的基本指令

-i    --      (install)安裝rpm包
      -v    --      (verbose)安裝細節
      -h    --      友善可視化
      -qa               --      列出已安裝的所有軟體
      -qf filename      --      檢視某個檔案由那個軟體産生(一般用來操作配置檔案,以确定配置檔案屬于那個軟體包)
      -q  xxx           --  檢視是否安裝了xxx
      -ql xxx           --  檢視xxx軟體檔案的目錄(比如執行程式在哪,配置檔案在哪,說明書在哪)
      -qc xxx           --  xxx軟體的所有配置檔案清單
      -qd xxx           --  xxx軟體的說明書清單
      -qR xxx           --  xxx軟體依賴的檔案在哪
      
      安裝本地包:    rpm -ivh xxx.rpm
      安裝多個包:    rpm -ivh xxx.rpm yyy.rpm *.rpm
      安裝網絡上的包: rpm -ivh http://xxx.com/dir/xxx.rpm      

11) rpm的其他指令(放在最後)

--nodeps        依賴關系解決不了,但還是一定要安裝(可能會出現依賴包缺失,軟體用不起來)

--replacefiles  強制替換現有的軟體殘留檔案,比如已經解除安裝xxx軟體了,但是解除安裝時候還有一些殘留的配置 
                檔案,此時安裝就會提示“由于某個軟體已經在本機上存在,是以安裝失敗”,這個時候就可以 
                直接替換掉(替換動作不可逆)

--replacepkgs   強制安裝軟體,比如某個軟體已經安裝了,這時候可以直接替換掉原有的軟體

--force         --replacefiles   +    --replacepkgs  , 簡單粗暴,強制安裝

--test          測試是否能夠安裝,如果不可,羅列原因(隻測試,不安裝)

--justdb        更新軟體在資料庫中的資料

--nosignature   跳過數字簽名檢查

--prefix <dir>  重定向軟體安裝目錄,比如預設是以根目錄作為軟體的安裝根目錄,這裡可以重定向/home目 
                錄作為軟體安裝的根目錄,伴随效應就是會在/home目錄下單獨建立一套目錄

--noscripts     不執行rpm自帶的一些安裝腳本,僅安裝軟體(可能會造成目前軟體不在資料庫裡)      

12)從CD光牒安裝某個軟體的流程

        挂載CD光牒,使用: mount /dev/cdrom /media

        找出檔案的實際路徑:find /media -name 'pam-devel*'

        測試此軟體是否具有相依性: rpm -ivh pam-devel... --test

        直接安裝: rpm -ivh pam-devel...

        卸除CD光牒: umount /dev/cdrom

13)使用rpm更新軟體(而不是yum,一般還是使用yum)

        -Uvh 如果未安裝,則安裝,并更新;如果已安裝,則更新

        -Fvh 如果未安裝,不安裝,

            一般是先下載下傳最新版本的rpm包,然後使用上面的指令執行最新版本的包

14)數字簽名

[root@www ~]# rpm -Va

[root@www ~]# rpm -V 已安裝的軟體名稱

[root@www ~]# rpm -Vp 某個 RPM 檔案的檔名

[root@www ~]# rpm -Vf 在系統上面的某個檔案

        選項不參數:

-V :後面加的是軟體名稱,若該軟體所噸的檔案被更劢過,才會列出來;

-Va :列出目前系統上面所有可能被更劢過的檔案;

-Vp :後面加的是檔案名,列出該軟體内可能被更劢過的檔案;

-Vf :列出某個檔案是否被更劢過~

範例一:列出你的 Linux 内的 logrotate 這個軟體是否被更劢過?

[root@www ~]# rpm -V logrotate

# 如果沒有出現仸何訊息,恭喜你,該軟體所提供的檔案沒有被更劢過。

# 如果有出現仸何訊息,才是有出現狀況啊!

範例二:查詢一下,你的 /etc/crontab 是否有被更劢過?

[root@www ~]# rpm -Vf /etc/crontab

S.5....T c /etc/crontab

# 瞧!因為有被更劢過,是以會列出被更劢過的資訊類型!

15) 使用rpm解除安裝軟體

        rpm -e 

        如果要解除安裝的軟體被其他軟體使用,那麼會報錯,當然,可以使用--nodeps來強制解除安裝,但是别的軟體可能就用不了了

        使用rpm更新資料庫

        rpm --rebuilddb

rpmbuild(使用 軟體源碼建構rpm包)

1) rpm指令處理rpm包,rpmbuild處理srpm包

2) rpmbuild --rebuild xxx.src.rpm      ----------   把src.rpm整體編譯并打包成rpm包,不安裝!

       rpmbuild --recomplie xxx.src.rpm    ----------   把src.rpm整體編譯并打包成rpm包,并且安裝!

yumdownloader下載下傳之後

#rm -rf /root/rpmbuild

#rpm -i ***.src.rpm

#cd /root/rpmbuild

#rpmbuild -bp SPECS/**.spec

修改部分rpm包,并重新釋出iso

1)下載下傳目的ISO,裝機

2)找到對應的rpm包

3)修改

        3.1   解壓

                rpm -ivh config-os-cloudedge-1.0-2.src.rpm

        3.2    修改

                (可選)查詢filename屬于哪個rpm包:rpm -qf filename                    

                (可選)安裝所有依賴:yum-builddep -y config-os-cloudedge.spec

                (可選)展開源碼:rpmbuild -bp config-os-cloudedge-1.0-2.src.rpm

                (可選)vim /SPEC/

        3.3 制作新rpm包

                rpmbuild -ba config-os-cloudedge.spec

                新的包出現在RPMS目錄中,這裡為config-os-cloudedge-1.0-2.h1.x86_64.rpm

繼續閱讀