1. 程式人生 > >第九章、文件與文件系統的壓縮與打包

第九章、文件與文件系統的壓縮與打包

一個 and cpio ora 自己 align node filename ace

第九章、文件與文件系統的壓縮與打包 1. 壓縮文件的用途與技術 2. Linux 系統常見的壓縮命令   2.1 compress   2.2 gzip, zcat   2.3 bzip2, bzcat 3. 打包命令: tar 4. 完整備份工具:dump, restore 5. 光盤寫入工具   5.1 mkisofs:創建映像檔   5.2 cdrecord:光盤燒錄工具 6. 其他常見的壓縮與備份工具   6.1 dd   6.2 cpio 7. 重點回顧

1. 壓縮文件的用途與技術
2. Linux 系統常見的壓縮命令 壓縮文件的擴展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2』   當你下載到某個壓縮檔時,自然就需要知道該文件是由哪種壓縮命令所制作出來的,好用來對照著解壓縮啊! 底下我們就列出幾個常見的壓縮文件擴展名吧: 技術分享
Linux上常見的壓縮命令就是 gzip 與 bzip2 ,至於 compress 已經退流行了 這個 tar 可以將很多文件『打包』成為一個文件!甚至是目錄也可以這麽玩。不過,單純的 tar 功能僅是『打包』而已,亦即是將很多文件集結成為一個文件, 事實上,他並沒有提供壓縮的功能,後來,GNU 計畫中,將整個 tar 與壓縮的功能結合在一起,如此一來提供使用者更方便並且更強大的壓縮與打包功能! 2.1 compress 過期。。   2.2 gzip, zcat gzip 可以說是應用度最廣的壓縮命令了!目前 gzip 可以解開 compress, zip 與 gzip 等軟件所壓縮的文件。 至於 gzip 所創建的壓縮檔為 *.gz 的檔名喔!讓我們來看看這個命令的語法吧:   技術分享
與 compress 類似的,當你使用 gzip 進行壓縮時,在默認的狀態下原本的文件會被壓縮成為 .gz 的檔名, 原始文件就不再存在了。您也可以發現,由於 gzip 的壓縮比要比 compress 好的多,所以當然建議使用 gzip 啦! 此外,使用 gzip 壓縮的文件在 Windows 系統中,竟然可以被 WinRAR 這個軟件解壓縮呢!很好用吧!至於其他的用法如下: cat 可以讀取純文字檔,那個 zcat 則可以讀取純文字檔被壓縮後的壓縮檔! 由於 gzip 這個壓縮命令主要想要用來取代 compress 的,所以不但 compress 的壓縮文件可以使用 gzip 來解開,同時 zcat 這個命令可以同時讀取 compress 與 gzip 的壓縮檔呦! 技術分享
2.3 bzip2, bzcat 若說 gzip 是為了取代 compress 並提供更好的壓縮比而成立的,那麽 bzip2 則是為了取代 gzip 並提供更佳的壓縮比而來的。 bzip2 真是很不錯用的東西~這玩意的壓縮比竟然比 gzip 還要好~至於 bzip2 的用法幾乎與 gzip 相同! 看看底下的用法吧! 技術分享 使用 gzip 擴展名自動創建為 .gz 。這裏的 bzip2 則是自動的將擴展名建置為 .bz2 羅!所以當我們使用具有壓縮功能的 bzip2 -z 時,那麽剛剛的 man.config 就會自動的變成了 man.config.bz2 這個檔名羅! 好了,那麽如果我想要讀取這個文件的內容呢? 是否一定要解開?當然不需要羅!可以使用簡便的 bzcat 這個命令來讀取內容即可!例如上面的例子中, 我們可以使用 bzcat man.config.bz2 來讀取數據而不需要解開!此外,當你要解開一個壓縮檔時, 這個文件的名稱為 .bz, .bz2, .tbz, .tbz2 等等,那麽就可以嘗試使用 bzip2 來解看看啦!當然羅,也可以使用 bunzip2 這個命令來取代 bzip2 -d 羅。
3. 打包命令: tar 前一小節談到的命令大多僅能針對單一文件來進行壓縮,雖然 gzip 與 bzip2 也能夠針對目錄來進行壓縮, 不過,這兩個命令對目錄的壓縮指的是『將目錄內的所有文件 "分別" 進行壓縮』的動作! 而不像在 Windows 的系統,可以使用類似 WinRAR 這一類的壓縮軟件來將好多數據『包成一個文件』的樣式。 這種將多個文件或目錄包成一個大文件的命令功能,我們可以稱呼他是一種『打包命令』啦! 那 Linux 有沒有這種打包命令呢?是有的!那就是鼎鼎大名的 tar 這個玩意兒了! tar 可以將多個目錄或文件打包成一個大文件,同時還可以透過 gzip/bzip2 的支持,將該文件同時進行壓縮! 由於 tar 的使用太廣泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 檔名的解壓縮呢! 1.tar tar 的選項與參數非常的多!我們只講幾個常用的選項,更多選項您可以自行 man tar 查詢羅! 技術分享 其實最簡單的使用 tar 就只要記憶底下的方式即可:
  • 壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的文件或目錄名稱
  • 查 詢:tar -jtv -f filename.tar.bz2
  • 解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄
如果解壓的是gzip文件,則tar -zxv。。。。 1.那個 filename.tar.bz2 是我們自己取的檔名,tar 並不會主動的產生創建的檔名喔!我們要自訂啦! 所以擴展名就顯的很重要了! 2.如果不加 [-j|-z] 的話,檔名最好取為 *.tar 即可。如果是 -j 選項,代表有 bzip2 的支持,因此檔名最好就取為 *.tar.bz2 ,因為 bzip2 會產生 .bz2 的擴展名之故! 3.至於如果是加上了 -z 的 gzip 的支持,那檔名最好取為 *.tar.gz 喔!了解乎? 另外,由於『 -f filename 』是緊接在一起的,過去很多文章常會寫成『-jcvf filename』,這樣是對的, 但由於選項的順序理論上是可以變換的,所以很多讀者會誤認為『-jvfc filename』也可以~事實上這樣會導致產生的檔名變成 c ! 因為 -fc 嘛!所以羅,建議您在學習 tar 時,將『 -f filename 』與其他選項獨立出來,會比較不容易發生問題。 例子 1.使用 tar 加入 -j 或 -z 的參數備份 /etc/ 目錄 有事沒事備份一下 /etc 這個目錄是件好事 技術分享 由上述的練習,我們知道使用 bzip2 亦即 -j 這個選項來制作備份時,能夠得到比較好的壓縮比! 如上表所示,由原本的 /etc/ (118MBytes) 下降到 8.7Mbytes 左右!至於加上『 -p 』這個選項的原因是為了保存原本文件的權限與屬性! 2.查閱 tar 文件的數據內容(可察看檔名),與備份檔名有否根目錄的意義 技術分享 如果加上 -v 這個選項時,詳細的文件權限/屬性都會被列出來!如果只是想要知道檔名而已, 那麽就將 -v 拿掉即可。從上面的數據我們可以發現一件很有趣的事情,那就是每個檔名都沒了根目錄了!這也是上一個練習中出現的那個警告信息『tar: Removing leading `/‘ from member names(移除了檔名開頭的 `/‘ )』所告知的情況! 那為什麽要拿掉根目錄呢?主要是為了安全!我們使用 tar 備份的數據可能會需要解壓縮回來使用, 在 tar 所記錄的檔名 (就是我們剛剛使用 tar -jtvf 所察看到的檔名) 那就是解壓縮後的實際檔名。 如果拿掉了根目錄,假設你將備份數據在 /tmp 解開,那麽解壓縮的檔名就會變成『/tmp/etc/xxx』。 但『如果沒有拿掉根目錄,解壓縮後的檔名就會是絕對路徑, 亦即解壓縮後的數據一定會被放置到 /etc/xxx 去!』如此一來,你的原本的 /etc/ 底下的數據, 就會被備份數據所覆蓋過去了! 如果你確定你就是需要備份根目錄到 tar 的文件中,那可以使用 -P (大寫) 這個選項 技術分享 如果加上 -P 選項,那麽檔名內的根目錄就會存在喔!不過,鳥哥個人建議,還是不要加上 -P 這個選項來備份! 3.將備份的數據解壓縮,並考慮特定目錄的解壓縮動作 (-C 選項的應用) 那如果想要解打包呢?很簡單的動作就是直接進行解打包嘛! 技術分享 此時該打包文件會在『本目錄下進行解壓縮』的動作! 技術分享 『指定欲解開的目錄』呢? 有的,可以使用 -C 這個選項喔! 4.僅解開單一文件的方法 你只要使用 -jtv 找到你要的檔名,然後將該檔名解開即可 技術分享 5.打包某目錄,但不含該目錄下的某些文件之作法 假設我們想要打包 /etc/ /root 這幾個重要的目錄,但卻不想要打包 /root/etc* 開頭的文件, 因為該文件都是剛剛我們才創建的備份檔嘛!而且假設這個新的打包文件要放置成為 /root/system.tar.bz2 , 當然這個文件自己不要打包自己 (因為這個文件放置在 /root 底下啊!),此時我們可以透過 --exclude 的幫忙! 那個 exclude 就是不包含的意思!所以你可以這樣做: 技術分享 上面的命令是一整列的~其實你可以打成:『tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,如果想要兩行輸入時,最後面加上反斜線 (\) 並立刻按下 [enter] , 就能夠到第二行繼續輸入了。這個命令下達的方式我們會在第三章再仔細說明。 透過這個 --exclude="file" 的動作,我們可以將幾個特殊的文件或目錄移除在打包之列 在新版的 tar 命令中,鳥哥發現原本的『 --exclude file 』似乎無法實際運行了!使用 man tar 明明有看到這個選項的說, 但使用 info tar 才發現,選項功能已經變成了『 --exclude=file 』的模式!這個地方得要特別留意呢! 6.僅備份比某個時刻還要新的文件 --newer-mtime 這個選項就粉重要啦 技術分享 7.基本名稱: tarfile, tarball ? 另外值得一提的是,tar 打包出來的文件有沒有進行壓縮所得到文件稱呼不同喔! 如果僅是打包而已,就是『 tar -cv -f file.tar 』而已,這個文件我們稱呼為 tarfile 。 如果還有進行壓縮的支持,例如『 tar -jcv -f file.tar.bz2 』時,我們就稱呼為 tarball (tar 球?)! 這只是一個基本的稱謂而已,不過很多書籍與網絡都會使用到這個 tarball 的名稱! 所以得要跟您介紹介紹 8.特殊應用:利用管線命令與數據流 在 tar 的使用中,有一種方式最特殊,那就是透過標準輸入輸出的數據流重導向(standard input/standard output), 以及管線命令 (pipe) 的方式,將待處理的文件一邊打包一邊解壓縮到目標目錄去。 關於數據流重導向與管線命令更詳細的數據我們會在第十一章 bash 再跟大家介紹, 底下先來看一個例子吧! 技術分享
4. 完整備份工具:dump, restore 4.1完整備份工具:dump 某些時刻你想要針對文件系統進行備份或者是儲存的功能時,不能不談到這個 dump 命令! 這玩意兒我們曾在前一章的 /etc/fstab 裏面稍微談過。 其實這個命令除了能夠針對整個 filesystem 備份之外,也能夠僅針對目錄來備份喔! 底下就讓我們來談一談這個命令的用法吧! 1.dump 其實 dump 的功能頗強,他除了可以備份整個文件系統之外,還可以制定等級喔!什麽意思啊! 假設你的 /home 是獨立的一個文件系統,那你第一次進行過 dump 後,再進行第二次 dump 時, 你可以指定不同的備份等級,假如指定等級為 1 時,此時新備份的數據只會記錄與第一次備份所有差異的文件而已 技術分享 雖然 dump 支持整個文件系統或者是單一各別目錄,但是對於目錄的支持是比較不足的,這也是 dump 的限制所在。 簡單的說,如果想要備份的數據如下時,則有不同的限制情況:
  • 當待備份的數據為單一文件系統:
如果是單一文件系統 (filesystem) ,那麽該文件系統可以使用完整的 dump 功能,包括利用 0~9 的數個 level 來備份, 同時,備份時可以使用掛載點或者是裝置檔名 (例如 /dev/sda5 之類的裝置檔名) 來進行備份!
  • 待備份的數據只是目錄,並非單一文件系統:
例如你僅想要備份 /home/someone/ ,但是該目錄並非獨立的文件系統時。此時備份就有限制啦!包括:
    • 所有的備份數據都必須要在該目錄 (本例為:/home/someone/) 底下;
    • 且僅能使用 level 0 ,亦即僅支持完整備份而已;
    • 不支持 -u 選項,亦即無法創建 /etc/dumpdates 這個各別 level 備份的時間記錄檔;
dump 的選項雖然非常的繁復,不過如果只是想要簡單的操作時,您只要記得底下的幾個選項就很夠用了! 技術分享 1.用 dump 備份完整的文件系統 技術分享 技術分享 這樣很簡單的就創建起來 /root/boot.dump 文件,該文件將整個 /boot/ 文件系統都備份下來了! 並且將備份的時間寫入 /etc/dumpdates 文件中,準備讓下次備份時可以作為一個參考依據。 現在讓我們來進行一個測試,檢查看看能否真的創建 level 1 的備份呢? 技術分享 透過這個簡單的方式,我們就能夠僅備份差異文件的部分羅!底下再來看看針對單一目錄的 dump 用途! 2.用 dump 備份非文件系統,亦即單一目錄的方法 現在讓我們來處理一下 /etc 的 dump 備份吧!因為 /etc 並非單一文件系統,他只是個目錄而已。 所以依據限制的說明, -u, level 1~9 都是不適用的。我們只能夠使用 level 0 的完整備份將 /etc 給他 dump 下來。因此作法就變的很簡單了 技術分享 2.restore dump 的復原使用的是 restore 這個命令! 技術分享 1.用 restore 觀察 dump 後的備份數據內容 技術分享 這個查閱的數據其實顯示出的是檔名與原始文件的 inode 狀態,所以我們可以說, dump 會參考 inode 的記錄哩! 2.比較差異並且還原整個文件系統 為什麽 dump 可以進行累積備份呢?就是因為他具有可以查詢文件系統與備份文件之間的差異, 並且將分析到的差異數據進行備份的緣故。所以我們先來看看,如何查詢有變動過的資訊呢? 技術分享 如同上面的動作,透過曾經備份過的資訊,也可以找到與目前實際文件系統中有差異的數據呢! 如果你不想要進行累積備份,但也能透過這個動作找出最近這一陣子有變動過的文件說!了解乎? 那如何還原呢?由於 dump 是記錄整個文件系統的,因此還原時你也應該要給予一個全新的文件系統才行。 因此底下我們先創建一個文件系統,然後再來還原吧! 技術分享 由於我們是備份整個文件系統,因此你也可以建置一個全新的文件系統 (partition) 來進行還原的動作! 整個還原的動作也不難,如上表最後一個命令,就是將備份文件中的數據還原到本目錄下。 你必須要變更目錄到掛載點所在的那個目錄才行啊!這樣還原的文件才不會跑錯地方!如果你還想要將 level 1 的 /root/boot.dump.1 那個文件的內容也還原的話,那就繼續使用『restore -r -f /root/boot.dump.1』去還原吧! 3.僅還原部分文件的 restore 互動模式 某些時候你只是要將備份檔的某個內容捉出來而已,並不想要全部解開,那該如何是好?此時你可以進入 restore 的互動模式 (interactive mode)。在底下我們使用 etc.dump 來進行範例說明。假如你要將 etc.dump 內的 passwd 與 shadow 捉出來而已,該如何進行呢? 技術分享 技術分享 透過互動式的 restore 功能,可以讓你將備份的數據取出一部份,而不必全部都得解壓縮才能夠取得你想要的文件數據。 而 restore 內的 add 除了可以添加文件外,也能夠添加整個備份的『目錄』喔!還不錯玩吧! 趕緊測試看看先! ^_^
5. 光盤寫入工具    5.1 mkisofs:創建映像檔    5.2 cdrecord:光盤燒錄工具
6. 其他常見的壓縮與備份工具    6.1 dd    6.2 cpio
7. 重點回顧

第九章、文件與文件系統的壓縮與打包