介紹如何有效使用tar、cpio和rpm工具,對文件進行存檔和恢復

對於本文,您在 Linux 中最有可能使用的三個存檔工具是 GNU tar、GNU cpio 和 rpm(Red Hat Packet Manager)。"Tar" 是 't'ape 'ar'chiver(磁帶存檔程序)的縮寫;它最初用於進行磁帶備份。Cpio 得名於 "copy input and output"(拷貝輸入和輸出) ,與 tar 相類似。rpm 最初由 Red Hat 開發,並向開放源代碼團體發佈,它是專用的 存檔工具,用於打包應用程序軟件。

  爲便於介紹這些工具,本文重點討論在單用戶系統中存檔文件。這就意味着備份您的 /home 目錄,也可能要備份 /etc 目錄中的某些配置文件,這些目錄定期更改,如果遇 到問題,它們最難替換。

   雖然可以利用 tar 等工具來運行系統備份或數據文件備份,但 在這裏不會討論這些過程,只是如果您使用 Oracle 集羣文件系統 (OCFS) 進行備份, 則需要到 oss.oracle.com 下載最新的工具,以便能夠使用 tar 備份您的 Oracle 數據庫文件。如果您使用第三方工具進行數據庫備份,可能仍然需要這樣做,因爲某些第三 方數據庫備份程序使用 tar。

   使用 tar 存檔實用程序(如 tar 和 cpio)以其能夠保持關聯文件信息而爲衆人所知:目錄結構、文件內容、所有權和模式(權限)設置。(參見我以前的文章“Linux 文件命令精通指南”,獲得關於文件訪問權限的解釋。)這樣允許您存儲一個文件系統,並按照您對 其進行存檔時的情況確切地重建該文件系統。

  對於用戶控制的備份或單用戶系統,tar 應該是最佳的備份工具。其基本的命令語法是 :

  tar mandatory_operation [options] nameoftarfile.tar file(s)_to_archive mandatory_operation

  是在 tar 手冊頁上列出的八項“功能字母”之一。當您調用 tar 時,首先必須確切唯一指定這些“操作”中的一個。這些操作中最常見的是

--create(-c)、--list (-t) 和 --extract (-x)。

  兩個常用“選項”是 --verbose (-v) — 在 tar 處理文件時,它打印這些文件的列 表,以及 --file (-f) — 它指定存檔文件的名稱。雖然這些選項不是必需的,但它 們對於消除混亂而言極爲重要。

  tar 選項和操作可接受三種格式:短格式、助記格式和舊格式。短格式使用單個字母,

  如下所示:

  $ tar -cvf document.tar document

  document/

  document/zz/

  document/zz/new_file.out

  document/samplesql/

  document/samplesql/mksample8.sql

  document/samplesql/oe8_cre.sql

  document/samplesql/oe8_drop.sql

  document/samplesql/hr8_cre.sql

  助記格式使用長的名稱,如

  $ tar --create --verbose --file document.tar document

  來完成同樣的工作。舊格式類似於短格式,但不使用前導破折號:

  $ tar cvf document.tar document

  上述命令均執行相同的兩個任務:

  它們爲目錄 document 創建一個 tar 文件,該目錄包含兩個子目錄 在將文件添加到存檔 document.tar 時,這些命令打印每個文件的名稱 一個重要卻經常混淆的概念是,如果沒有使用 -C --directory=DIR 選項進行指定,tar

  存檔將在調用 tar 的目錄(即工作目錄)中創建的,而不是被存檔的文件所在的目錄。

  格式可以混合,例如

  $ tar cv --file document.tar document

  在 tar 命令中的選項順序對於清晰性而言很重要。以下命令將創建一個名爲“v”的存 檔。

  $ tar -cfv archive.tar document

  使用助記格式可以減輕這種混淆。

 存檔的命名沒有要求,但是按照慣例,命名 tar 文件要帶有 *.tar 擴展名。後面討論 的 gzip 存檔通常命名爲 *.tar.gz 或 *.tgz。

  存檔內部一瞥

  那麼,現在事情變得很有趣。在您創建一個 tar 文件之後,您就可以使用 -t,--list

  選項瞭解其內部情況:

  $ tar -tf document.tar

  此命令將輸出一個列表,它與您運行 tar -cv 時所輸出的列表類似。在解壓縮下載的 tar 文件之前,最好先獲取其列表,以確保文件不會以“/”開始,而表示絕對的路徑名 。

  您可以使用 tar -t 來查找單獨的文件。

  $ tar -tf document.tar document/samplesql/mk*.sql

  IXDBA.NET社區論壇

  document/samplesql/mksample8.sql

  這個方法也適用於目錄。

  $ tar -tf document.tar document/samplesql

  document/samplesql/

  document/samplesql/mksample8.sql

  document/samplesql/oe8_cre.sql

  document/samplesql/oe8_drop.sql

  .

  結合使用 -v 選項與 --list,可以生成您的 tar 組件的長文件列表。

  $tar -tvf document.tar document/samplesql

  列出 tar 內容便於你查找您要解壓縮的單個文件的確切名稱。您還可以看到 tar 自動 保留了更改日期和其他文件信息。

  要找出文件系統與現有 tar 文件之間的區別,請調用 tar是使用 -d, --diff 選項。

  $ tar -dvf document.tar

  document/samplesql/

  document/samplesql/mksample8.sql

  tar:document/samplesql/oe8_views.sql:Warning:Cannot stat:No such file or

  directory

  document/samplesql/hr8_analz.sql:Mod time differs

   document/samplesql/hr8_analz.sql:Size differs

  document/samplesql/getdate.sql

  tar:document/samplesql/getdate.sql:Warning:Cannot stat:No such file or

  directory

  .

  在這個示例中,tar 報告在存檔中有一個文件 hr8_analz.sql 與文件系統版本不同,有兩個文件 oe8_views.sql 和 getdate.sql 存在於 tar 存檔中,但不存在於文件系統中 。

  Tar 將忽略目錄中上次創建存檔以後所創建的文件。但是,更新存檔的方法很簡單,您 將在下一章節中瞭解這種方法。

  向存檔添加文件

  您可以利用 -r, --append 選項將新文件添加到現有存檔。

  $ tar -rvf document.tar document/samplesql

  此命令將把整個目錄添加到存檔中。可以使用以下命令將單個文件添加到存檔中:

  $ tar -rvf document.tar document/samplesql/getdate.sql

  document/samplesql/getdate.sql

  由於 tar 最初是磁帶存檔工具,利用 --append 或 --update 來更新存檔只是將被更改的文件添加到現有存檔,而不會刪除舊的文件。-N, --newer 選項可用於創建新文件和被更改文件的增量存檔。基本上,在規則基礎上重新創建存檔可能是維護最新存檔的最 簡易方法。

  備份大量數據

  對於大量數據,您可以使用 -M (--multivolume) 選項將 tar 輸出發送到其他介質,如磁帶、CD-ROM 或軟盤,或者使用 tar 所提供的壓縮工具進行壓縮。但是,您不能兩種 方法一起使用;這樣做會使您的存檔毫無用處。

  tar 的傳統 UNIX 版本不支持 zip 壓縮,儘管所存檔的文件可以(並且現在仍然可以) 利用管道傳輸到壓縮工具。利用 GNU tar,在調用 tar 時加上選項可以指定壓縮方法。

  Tar 支持三種可選的壓縮方法:

  compress/uncompress (-Z, --compress/--uncompress)

  gzip/gunzip (-z, --gzip/--gunzip)

  bzip2/bunzip2 (-j, --bzip2/--bunzip2).

 根據 GNU 項目,compress 是在商業 UNIX 發佈版本中一種較老的專用壓縮實用工具, 是出於兼容的目的而在 Linux 中提供的。Gzip 從 1997 年初開始在 tar 的 GNU 版本 中提供;它可以解壓縮那些使用 compress 壓縮的文件,並且被認爲一種較好的選擇,

  原因如下:

  它結合了 UNIX tar 和 compress 命令

  使用它不會侵犯可能的專利權

  它比 compress/uncompress 更高效。

  Bzip2/bunzip2 是另一個可選實用工具,它提供比 gzip 更高效(雖然較慢)的壓縮。

  一旦利用壓縮過濾器創建了一個存檔:

  $ tar -czvf document.tar.gz

  以後對該存檔操作時,都必須通過該過濾器。要列出存檔的內容,需執行:

  $ tar -tzvf document.tar.gz

  要在存檔上獲取 --diff,需執行

  $ tar -dzvf document.tar.gz

  或者,要對存檔進行 --extract 操作,我們將在稍後討論。

  解壓縮 tar 存檔

  通過運行帶有 --extract (-x) 操作的 tar,您可以解壓縮整個目錄或單個的文件。

  $ tar -xvf Samplesql.tar getdate.sql

  或

  $ tar -xvf document.tar document/samplesql

  這些解壓縮操作在工作目錄中創建文件。如果您正在處理 gzip 存檔,切記在運行解壓縮操作時指定 z。

  $ tar -xzvf articles.tar.gz

  $ tar -xzvf articles.tar.gz *.doc

  警告:當您執行 extract 時要驗證您正處在哪個目錄中。您需要轉至目標目錄 (cd) 或 利用 -C 選項來指定它。

使用 Cpio

 在 UNIX 世界中,Cpio 在 tar 前出現。與 tar 相似,它將文件存檔到硬盤、軟盤、 CD-ROM 或磁帶中。在所處理的文件類型方面,它比 tar 更全面。cpio 的 GNU 版本將 文件拷貝到 cpio 或 tar 存檔中,或將文件從中拷貝出來。它識別和處理特殊的格式, 如 HPUX 二進制、舊的 ACSII、新的 ASCII 以及一些其他的格式。它還可用於移動整個 目錄樹。爲了與較老的 cpio 程序兼容,cpio 以二進制格式存儲其存檔文件。

  該命令的一般格式爲:

  cpio -mode[other_options] [redirection_symbol] filename

  它接受來自標準輸入的顯式文件列表,因此通常用在以 ls 或 find 開始的管道末端。

  您可以三種基本模式使用 cpio:

  拷貝輸出模式,使用 -o 選項,將文件拷貝到存檔

  拷貝輸入模式,使用 -i 選項,從存檔中解壓縮文件

  拷貝傳遞模式,使用 -p 選項,將文件從一個目錄樹拷貝傳遞到另一個目錄樹。

  根據您所運行的模式,可以使用不同的 cpio 選項。每種模式所允許使用的選項的完整列表可參考 cpio 手冊頁的“綱要”部分。

  拷貝輸出模式

  與 tar 不同,cpio 需要顯式的指令:哪些文件要利用標準輸出進行存檔,將存檔重定 向到哪裏,是否應該保留關聯文件信息等等。拷貝輸出模式可以利用以下命令來存檔一 個目錄的內容

  $ ls | cpio -ov > samplesql.cpio

  其中 ls 爲 cpio 生成標準輸出,用於拷貝輸出到存檔。-o, --create 選項指示 cpio

  將輸出進行存檔,而 -v, --verbose 選項提供一個與 tar 相類似的列表。

  您還可以使用 find 命令將文件送到 cpio。

  $ find .-print -depth | cpio -ov > document.cpio

爲了儘量減少目錄權限問題,可使用 find 的 -depth 選項。該選項在目錄本身處理內 容之前先處理該目錄的內容,允許在恢復目錄權限之前,在沒有所有者寫權限的情況下 恢復目錄的內容。

  -t, --list 工具也可用於 cpio,甚至可以在 tar 存檔上運行。

  $ cpio -tv < Samplesql.tar

  拷貝輸入模式

  使用拷貝輸入模式來解壓縮存檔的內容。在本模式中,cpio 自動識別它正在讀取哪種存檔。這意味着它能夠讀取在具有不同字節順序的機器上所創建的存檔。

  $ cpio -idv < /samplesql.cpio

  此外,cpio 與 tar 的不同之處在於,它將不恢復文件的最初更改時間,除非您指定 -m, --preserve-modification-time 選項:

  $ cpio -idvm < samplesql.cpio

  我們已經提到過,cpio 也可以從 tar 存檔進行解壓縮。

  $ cpio -idv < Samplesql.tar

  雖然 cpio 不能處理 zip 壓縮文件,但您可以在通過管道將文件送到 cpio 之前完成 zip 文件的解壓縮。

  拷貝傳遞模式

  本模式是拷貝輸出與拷貝輸入模式的組合。主要的不同之處是它繞過了存檔。它可以將 整個目錄從一個位置移動到另一個位置,用法如下:

  $ find .-depth -print0 | cpio --null -pvda testdir

 注意 find 使用了 -print0 選項而不是在拷貝輸出模式中使用 -print。GNU cpio 的拷 貝傳遞模式需要以 null 結束的文件,這是由 -print0 選項提供的服務。這種方法允許 cpio 處理那些包含換行符的文件名,並且在上面的 cpio 命令中加入 --null 選項。

  -d, --make-directories 選項指示 cpio 創建目錄 testdir。

  Tar 可以完成相同的工作。但是,在本示例中,必須首先創建目錄 testdir。

  $ tar -cvf - samplesql | (cd testdir; tar -xf -)

  在這裏,tar 將存檔送到標準輸出,由第一個 tar 命令中的“-”指示。第二個 tar 命 令從標準輸入中獲取存檔,以第二個 tar 命令中的“-”表示。在傳遞文件時,它們被 拷貝到 testdir,保留用戶、權限和日期信息。

  Rpm

  Red Hat 和 SuSE Linux 分發版本都使用 rpm 來安裝 Linux 操作系統和應用軟件。它 可用於:

  利用一個命令安裝所有應用程序文件

  管理已安裝的程序包

  更新程序包

  利用一個命令卸載程序包

  將軟件程序包從源代碼形式轉換爲源和二進制形式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章