二進位制RPM包中檔案的提取

2021-10-06 21:47:57 字數 3923 閱讀 7648

在工作中我們可能會遇到這種情況:以apache的配置檔案/etc/httpd/conf/httpd.conf為例,我們在配置的時候可能修改後改不回來了;那麼我們通過前面講解的覆蓋強制安裝的方式是不能將原始檔恢復的,強制安裝後開啟配置檔案還是之前修改過的,當然也可以在強制安裝前先將配置檔案刪除,然後在強制安裝;那麼這裡我們可以使用另一種方式進行原始檔的提取。

在講rpm包檔案提取之前,先介紹一下cpio命令。cpio命令可以把檔案或目錄從檔案庫中提取出來,也可以把檔案或目錄複製到檔案庫中,可以把cpio命令看成備份或還原命令,它既可以把資料備份成cpio檔案庫,也可以把cpio檔案庫中的資料還原出來。不過,cpio命令最大的問題是不能自己指定備份或還原的檔案是什麼,而必須由其他命令告訴cpio命令要備份和還原哪個檔案,這必須依賴資料流重定向的命令。

cpio命令主要有是那種基本模式:

命令格式如下:

[root@localhost ~]

# cpio -o[vcb] > [檔案|裝置]

#備份

選項

說明-o

copy-out模式,備份;

-v顯示還原過程;

-c使用較新的portable format儲存方式;

-b設定輸入/輸出塊為5120bytes,而不是模式的512bytes;

[root@localhost ~]

# cpio -i[vcdu] < [檔案|裝置]

#還原

選項

說明-o

copy-out模式,備份;

-icopy-in模式,還原;

-v顯示還原過程;

-c使用較新的portable format儲存方式;

-d還原時自動新建目錄;

-u自動使用較新的檔案覆蓋較舊的檔案;

[root@localhost ~]

# cpio -p 目標目錄

#複製

先來看一下使用cpio備份資料的方法,命令如下:

[root@localhost ~]

# find /etc -print | cpio -ocvb > /root/etc.cpio

#利用find命令指定要備份/etc/目錄,使用》匯出到ete.cpio 檔案

[root@localhost ~]

# 11 -h etc.cpio

---.1 root root 21m6月 5

12:29 etc.cpio

#fetc.cpio檔案生成

再來看如何恢復opio 的備份資料,命令如下:

[root@localhost ~]

# cpio -idveu < /root/etc.cpio

#還原etc的備份,如果大家檢視一下/root/,就會發現沒有生成/etc/目錄。

#這是因為備份時/etc/目錄使用的是絕對路勁,所以資料直接恢復到/etc/系統目錄中,而沒有生成在/root/etc/目錄中

在centos 5.x中可以利用上面的命令備份與恢復指定的檔案,但是在centos 6.x中需要更加嚴謹。如果備份時使用絕對路徑,則會恢復到絕對路徑指定的路徑中;如果需要把資料恢復到當前目錄中,則需要使用相對路勁,例如:

備份:

[root@localhost ~]

# cd /etc/

#進入/etc/目錄

[root@localhost etc]

# find ./ -print | cpio -ocvb > /root/etc.cpio

#利用find命令指定要備份/etc/目錄,使用》匯出到etc.cpio檔案

恢復:

[root@localhost ~]

# cd /root/

#回到/root/目錄中

[root@localhost ~]

# mkdir etc_test

#建立恢復測試目錄

[root@localhost ~]

# cd etc_test/

#進入測試目錄,資料恢復到此

[root@localhost etc_test]

# cpio -idvcu < /root/etc.cpio

#還原/etc/目錄中的資料,如果備份時使用的是相對路勁,則會還原到/root/etc_test/目錄下

最後來演示一下 cpio 命令的「-p」複製模式,命令如下:

[root@localhost ~]

# cd /tmp/

#進入/tmp 目錄

[root@localhost tmp]

# rm -rf *

#刪除/tmp 目錄中所有資料

[root@localhost tmp]

# mkdir test

#建立備份目錄

[root@localhost tmp]

# find /boot/ -print | cpio -p /tmp/test

#備份/boot/目錄到/tmp/test/目錄中

[root@localhost tmp]

# ls test/

boot

#在/tmp/test/目錄中備份出了 boot 目錄

接下來介紹如何在rpm包中提取某個特定的檔案。假設在伺服器使用過程中,我們發現某個系統檔案被人動了手腳,或者不小心刪除了某個系統重要檔案,那麼我們可以在rpm包中把這個系統檔案提取出來修復有問題的原始檔嗎?當然可以。rpm包中的檔案雖然眾多,但也是可以逐個提取的。命令格式如下:

[root@localhost ~]

# rpm2cpio 包全名 | cpio -idv .檔案絕對路徑

#rpm2cpio將 rpm 包轉換為 cpio 格式的命令;

#cpio是乙個標準工具,它用於建立軟體檔案檔案和從檔案檔案中提取檔案;

「.」 代表的是當前目錄下,意思就是將提取的檔案提取到當前目錄,因為rpm包裡面的配置檔案路勁是/etc/httpd/conf/httpd.conf,如果不加「.」,那麼提取的檔案會直接覆蓋當前的配置檔案。

舉個例子,假設把系統中的/bin/ls 命令不小心誤刪除了,可以修復回來嗎?這時有兩 種方法修復:一種方法是使用—force 選項覆蓋安裝一遍 coreutils-8.4-19.el6.i686 包;另一種方法是先使用 cpio 命令提取出/bin/ls 命令檔案,再把它拷貝到對應位置。

那麼我們在講 rpm 包中檔案提取,所以我們使用第二種方法,cpio 命令提取出 ls 命令檔案,然後拷貝到對應位置,命令如下:

[root@localhost ~]

# mv /bin/ls /tmp/

#把/bin/ls命令移動到/tmp目錄下,造成誤刪除的假象

[root@localhost ~]

# ls

-bash: ls: command not found

#這時執行ls命令,系統會報「命令沒有找到的」錯誤

[root@localhost ~]

# rpm2cpio /mnt/cdrom/packages/coreutils-8.4-43.el6.x86_64.rpm | cpio -idv ./bin/ls

./bin/ls

25240 blocks

#提取ls命令檔案到當前目錄下

[root@localhost ~]

# cp /root/bin/ls /bin/

#把提取出來的命令檔案複製到/bin/目錄下

[root@localhost ~]

# ls

anaconda-ks.cfg bin etc.cpio etc_test install.log install.log.syslog

#ls命令又可以正常使用了

RPM二進位製包

linux 軟體包管理大致可分為二進位製包 原始碼包,使用的工具也各不相同。linux 常見軟體包分為兩種,分別是源 包 source code 二進位製包 binary code 源 包是沒有經過編譯的包,需要經過 gcc c 編譯器環境編譯或解壓才能執行,二進位製包無需編譯,可以直接安裝使用。通...

製作二進位制rpm包

directory under rpmbuild build buildroot rpms sources specs srpms abc localhost rpmbuild tree build pythontest 1.1.1 100.x86 64 doc readme test1.py py...

Centos rpm二進位製包安裝 rpm

rpm 軟體包管理器 rpm包命名規範 mysql community server 5.7.21 1.el7.x86 64.rpm 軟體名稱mysql community server 軟體版本5.7.21 更新發行次數1 適合系統版本el7 cpu和系統架構x86 64 副檔名rpm rpm包安...