[Linux] learning note 檔案與檔案系統的壓縮與打包

常見的壓縮檔案副檔名

  • *.Z          compress 程式壓縮的檔案
  • *.gz         gzip 程式壓縮的檔案
  • *.bz2       bzip2 程式壓縮的檔案
  • *.tar         tar 程式打包的資料,並沒有壓縮過
  • *.tar.gz     tar 程式打包的檔案,其中並且經過 gzip 的壓縮
  • *.tar.bz2   tar 程式打包的檔案,其中並且經過 bzip2 的壓縮

compress

  • sudo apt-get install ncompress
  • usage 1 : compress [-rcv] 檔案或目錄
  • usage 2 : uncompress 檔案.Z  
  • option
    • -r  :連同目錄下的檔案也同時給予壓縮
    • -c  :將壓縮資料輸出成為 standard output (輸出到螢幕)
    • -v  :可以秀出壓縮後的檔案資訊以及壓縮過程中的一些檔名變化
  • ex
    • 範例一:將 /etc/man.config 複製到 /tmp ,並加以壓縮
    • [root@www ~]# cd /tmp
      [root@www tmp]# cp /etc/man.config .
      [root@www tmp]# compress -v man.config
      man.config: -- replaced with man.config.Z Compression: 41.86%
      [root@www tmp]# ls -l /etc/man.config /tmp/man*
      -rw-r--r-- 1 root root 4617 Jan 6 2007 /etc/man.config
      -rw-r--r-- 1 root root 2684 Nov 10 17:14 /tmp/man.config.Z
    • 範例二:將剛剛的壓縮檔解開
    • [root@www tmp]# uncompress man.config.Z
      [root@www tmp]# ll man*
      -rw-r--r-- 1 root root 4617 Nov 10 17:14 man.config
    • 範例三:將 man.config 壓縮成另外一個檔案來備份
    • [root@www tmp]# compress -c man.config > man.config.back.Z
      [root@www tmp]# ll man*
      -rw-r--r-- 1 root root 4617 Nov 10 17:14 man.config
      -rw-r--r-- 1 root root 2684 Nov 10 17:24 man.config.back.Z

gzip

  • gzip 所建立的壓縮檔為 *.gz 的檔名
  • usage : gzip [-cdtv#] 檔名
  • option
    • -c  :將壓縮的資料輸出到螢幕上,可透過資料流重導向來處理
    • -d  :解壓縮的參數
    • -t  :可以用來檢驗一個壓縮檔的一致性~看看檔案有無錯誤
    • -v  :可以顯示出原檔案/壓縮檔案的壓縮比等資訊
    • -#  :壓縮等級,(最快,效果最差)-1 ~ -9 (最慢,效果最好),建議-6
  • ex
    • 範例一:將 /etc/man.config 複製到 /tmp ,並且以 gzip 壓縮
    • [root@www ~]# cd /tmp
      [root@www tmp]# cp /etc/man.config
      [root@www tmp]# gzip -v man.config
      man.config: 56.1% -- replaced with man.config.gz
      [root@www tmp]# ll /etc/man.config /tmp/man*
      -rw-r--r-- 1 root root 4617 Jan 6 2007 /etc/man.config
      -rw-r--r-- 1 root root 2684 Nov 10 17:24 /tmp/man.config.back.Z
      -rw-r--r-- 1 root root 2057 Nov 10 17:14 /tmp/man.config.gz <==gzip壓縮比compress佳
    • 範例三:將範例一的檔案解壓縮
    • [root@www tmp]# gzip -d man.config.gz
      與 gzip 相反, gzip -d 會將原本的 .gz 刪除,產生原本的 man.config 檔案。
bzip2
  • usage : bzip2 [-cdkzv#] 檔名
  • option
    • -c  :將壓縮的過程產生的資料輸出到螢幕上
    • -d  :解壓縮的參數
    • -k  :保留原始檔案,而不會刪除原始的檔案
    • -z  :壓縮的參數
    • -v  :可以顯示出原檔案/壓縮檔案的壓縮比等資訊
    • -#  :壓縮等級,(最快,效果最差)-1 ~ -9 (最慢,效果最好),建議-6
  • ex
    • 範例一:將 /tmp/man.config 以 bzip2 壓縮
    • [root@www tmp]# bzip2 -z man.config
      # 此時 man.config 會變成 man.config.bz2
    • 範例三:將範例一的檔案解壓縮
    • [root@www tmp]# bzip2 -d man.config.bz2
    • 範例四:將範例三解開的 man.config 用最佳的壓縮比壓縮,並保留原本的檔案
    • [root@www tmp]# bzip2 -9 -c man.config > man.config.bz2

tar - 打包指令

  • tar xzvf foo.tar.gz = tar fxvz foo.tar.gz
  • tar -zxvf foo.tar.gz != tar -fxvz foo.tar.gz
  • 不帶-的是舊的風格,帶-的是較新的風格,命令的參數確實有posix、bsd 和gnu,為了兼容不同習慣的用戶。具體來說,還有更多的不同。舊風格中,其中 f 放在任何位置都是一樣的,比如tar xzvf foo.tar.gz和tar fxvz foo.tar.gz是一個意思,foo.tar.gz總是被解析為f選項的參數。但是在新風格中,比如tar -zxvf foo.tar.gz和tar -fxvz foo.tar.gz就完全不同,前者表示展開一個名為foo.tar.gz經過gzip壓縮的歸檔,並且輸出詳細的訊息。後者則表示處理歸檔xvz中的foo.tar.gz文件,而且由於沒有必須的操作選項,會錯誤提示:“tar:您必須從"-Acdtrux"或是"--test-label"選項中指定一個” 因為-zxvf相當於-z -x -v -f ,並且zxv三個選項後面不需要帶參數,而-f選項後面必要有參數。所以當寫成-fxvz的時候,xvz被認為是-f選項的參數。tar的info中專門有一節講述了選項的風格問題。
  • -x  :解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開
    •       特別留意的是, -c, -t, -x 不可同時出現在一串指令列中。
  • option
    • -j  :透過 bzip2 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.bz2
    • -z  :透過 gzip  的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.gz
    • -v  :在壓縮/解壓縮的過程中,將正在處理的檔名顯示出來!
    • -f filename:-f 後面要立刻接要被處理的檔名!建議 -f 單獨寫一個選項囉! 
    • -c  :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename)
    • -t  :察看打包檔案的內容含有哪些檔名,重點在查看『檔名』就是了;
    • -C 目錄    :這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。
    • -p(小寫) :保留備份資料的原本權限與屬性,常用於備份(-c)重要的設定檔
    • -P(大寫) :保留絕對路徑,亦即允許備份資料中含有根目錄存在之意;
    • --exclude=FILE:在壓縮的過程中,不要將 FILE 打包!
    • -x  :解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開
      •       特別留意的是, -c, -t, -x 不可同時出現在一串指令列中
  • 最簡單的記憶方式
    • 壓 縮:tar -zcv -f filename.tar.gz 要被壓縮的檔案或目錄名稱
    • 查 詢:tar -ztv -f filename.tar.gz
    • 解壓縮:tar -zxv -f filename.tar.gz -C 欲解壓縮的目錄
      • -z : gz
      • -j : bz2
      • filename.tar.bz2 是我們自己取的檔名,tar 並不會主動的產生建立的檔名
      •  由於『 -f filename 』是緊接在一起的,過去很多文章常會寫成『-jcvf filename』,這樣是對的, 但由於選項的順序理論上是可以變換的,所以很多讀者會誤認為『-jvfc filename』也可以,事實上這樣會導致產生的檔名變成 c 
  • ex
    • [root@www ~]# tar -zpcv -f /root/etc.tar.gz /etc
    • tar: Removing leading `/' from member names <==注意這個警告訊息
      /etc/
      ....中間省略....
      /etc/esd.conf
      /etc/crontab
      # 由於加上 -v 這個選項,因此正在作用中的檔名就會顯示在螢幕上。
      # 如果你可以翻到第一頁,會發現出現上面的錯誤訊息!底下會講解。
      # 至於 -p 的選項,重點在於『保留原本檔案的權限與屬性』之意。

      [root@www ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
      # 顯示的訊息會跟上面一模一樣囉!
    • 解壓縮預設在當前的目錄下解壓縮,但如果假設要在/tmp解壓縮,則可用-C選項
    • [root@www ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
      [root@www ~]# ll /tmp
      ....(前面省略)....
      drwxr-xr-x 105 root root 12288 Nov 11 04:02 etc
      ....(後面省略)....
    • 僅解開單一檔案
    • # 1. 先找到我們要的檔名,假設解開 shadow 檔案好了:
    • [root@www ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
      -r-------- root/root 1230 2008-09-29 02:21:20 etc/shadow-
      -r-------- root/root 622 2008-09-29 02:21:20 etc/gshadow-
      -r-------- root/root 636 2008-09-29 02:21:25 etc/gshadow
      -r-------- root/root 1257 2008-09-29 02:21:25 etc/shadow <==這是我們要的!


      # 2. 將該檔案解開!語法與實際作法如下:
      [root@www ~]# tar -jxv -f 打包檔.tar.bz2 待解開檔名
      [root@www ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
      etc/shadow
      [root@www ~]# ll etc
      total 8
      -r-------- 1 root root 1257 Sep 29 02:21 shadow
      # 在本例中,你不能寫成 /etc/shadow !因為記錄在 etc.tar.bz2 內的檔名之故!

dump

  • 除了可以備份整個檔案系統之外,還可以制定等級!假設你的 /home 是獨立的一個檔案系統,那你第一次進行過 dump 後,再進行第二次 dump 時,你可以指定不同的備份等級,假如指定等級為 1 時,此時新備份的資料只會記錄與第一次備份所有差異的檔案而已
  • 如上圖所示,上方的『即時檔案系統』是一直隨著時間而變化的資料,例如在 /home 裡面的檔案資料會一直變化一樣。 而底下的方塊則是 dump 備份起來的資料,第一次備份時使用的是 level 0 ,這個等級也是完整的備份啦! 等到第二次備份時,即時檔案系統內的資料已經與 level 0 不一樣了,而 level 1 僅只是比較目前的檔案系統與 level 0 之間的差異後,備份有變化過的檔案而已。至於 level 2 則是與 level 1 進行比較
  • 當待備份的資料為單一檔案系統
    • 如果是單一檔案系統 (filesystem) ,那麼該檔案系統可以使用完整的 dump 功能,包括利用 0~9 的數個 level 來備份, 同時,備份時可以使用掛載點或者是裝置檔名 (例如 /dev/sda5 之類的裝置檔名) 來進行備份!
  • 待備份的資料只是目錄,並非單一檔案系統:
    • 例如你僅想要備份 /home/someone/ ,但是該目錄並非獨立的檔案系統時。此時備份就有限制啦!包括:

      • 所有的備份資料都必須要在該目錄 (本例為:/home/someone/) 底下;
      • 且僅能使用 level 0 ,亦即僅支援完整備份而已;
      • 不支援 -u 選項,亦即無法建立 /etc/dumpdates 這個各別 level 備份的時間記錄檔;
  • usage : dump [-Suvj] [-level] [-f 備份檔] 待備份資料
    • dump -W
  • option
    • -S    :僅列出後面的待備份資料需要多少磁碟空間才能夠備份完畢
    • -u    :將這次 dump 的時間記錄到 /etc/dumpdates 檔案中
    • -v    :將 dump 的檔案過程顯示出來
    • -j    :加入 bzip2 的支援!將資料進行壓縮,預設 bzip2 壓縮等級為 2
    • -level:就是我們談到的等級,從 -0 ~ -9 共十個等級;
    • -f    :有點類似 tar !後面接產生的檔案,亦可接例如 /dev/st0 裝置檔名等
    • -W    :列出在 /etc/fstab 裡面的具有 dump 設定的 partition 是否有備份過?
  • 備份完整的檔案系統
    • # 1. 先找出系統中最小的那個檔案系統,如下所示:
    • [root@www ~]# df -h
    • Filesystem            Size  Used Avail Use% Mounted on
    • /dev/hdc2             9.5G  3.7G  5.3G  42% /
    • /dev/hdc3             4.8G  651M  3.9G  15% /home
    • /dev/hdc1              99M   11M   83M  12% /boot  <==看起來最小的就是他!
    • tmpfs                 363M     0  363M   0% /dev/shm

    • # 2. 先測試一下,如果要備份此檔案系統,需多少容量?
    • [root@www ~]# dump -S /dev/hdc1
    • 5630976     <==注意一下,這個單位是 bytes ,所以差不多是 5.6MBytes。

    • # 3. 將完整備份的檔名記錄成為 /root/boot.dump ,同時更新記錄檔:
    • [root@www ~]# dump -0u -f /root/boot.dump /boot
    •   DUMP: Date of this level 0 dump: Tue Dec  2 02:53:45 2008 <==記錄等級與備份時間
    •   DUMP: Dumping /dev/hdc1 (/boot) to /root/boot.dump        <==dump的來源與目標
    •   DUMP: Label: /boot                                        <==檔案系統的 label
    •   DUMP: Writing 10 Kilobyte records
    •   DUMP: mapping (Pass I) [regular files]                    <==開始進行檔案對應
    •   DUMP: mapping (Pass II) [directories]
    •   DUMP: estimated 5499 blocks.                              <==評估整體block數量
    •   DUMP: Volume 1 started with block 1 at: Tue Dec  2 02:53:46 2008
    •   DUMP: dumping (Pass III) [directories]                    <==開始 dump 工作
    •   DUMP: dumping (Pass IV) [regular files]
    •   DUMP: Closing /root/boot.dump                             <==結束寫入備份檔
    •   DUMP: Volume 1 completed at: Tue Dec  2 02:53:47 2008
    •   DUMP: Volume 1 5550 blocks (5.42MB)                       <==最終備份資料容量
    •   DUMP: Volume 1 took 0:00:01
    •   DUMP: Volume 1 transfer rate: 5550 kB/s
    •   DUMP: 5550 blocks (5.42MB) on 1 volume(s)
    •   DUMP: finished in 1 seconds, throughput 5550 kBytes/sec
    •   DUMP: Date of this level 0 dump: Tue Dec  2 02:53:45 2008
    •   DUMP: Date this dump completed:  Tue Dec  2 02:53:47 2008
    •   DUMP: Average transfer rate: 5550 kB/s
    •   DUMP: DUMP IS DONE
    • # 在指令的下達方面,dump 後面接 /boot 或 /dev/hdc1 都可以的!
    • # 而執行 dump 的過程中會出現如上的一些訊息,您可以自行仔細的觀察!

    • [root@www ~]# ll /root/boot.dump /etc/dumpdates
    • -rw-rw-r-- 1 root disk      43 Dec  2 02:53 /etc/dumpdates
    • -rw-r--r-- 1 root root 5683200 Dec  2 02:53 /root/boot.dump
    • # 由於加上 -u 的選項,因此 /etc/dumpdates 該檔案的內容會被更新!注意,
    • # 這個檔案僅有在 dump 完整的檔案系統時才有支援主動更新的功能。

    • # 4. 觀察一下系統主動建立的記錄檔:
    • [root@www ~]# cat /etc/dumpdates
    • /dev/hdc1     0   Tue Dec  2 02:53:47 2008 +0800
    • [檔案系統] [等級] [       ctime 的時間         ]
  • 備份單一目錄
    • 因為 /etc 並非單一檔案系統,他只是個目錄而已。 所以依據限制的說明, -u, level 1~9 都是不適用的。我們只能夠使用 level 0 的完整備份將 /etc 給他 dump 下來
    • # 讓我們將 /etc 整個目錄透過 dump 進行備份,且含壓縮功能
    • [root@www ~]# dump -0j -f /root/etc.dump.bz2 /etc
    •   DUMP: Date of this level 0 dump: Tue Dec  2 12:08:22 2008
    •   DUMP: Dumping /dev/hdc2 (/ (dir etc)) to /root/etc.dump.bz2
    •   DUMP: Label: /1
    •   DUMP: Writing 10 Kilobyte records
    •   DUMP: Compressing output at compression level 2 (bzlib)
    •   DUMP: mapping (Pass I) [regular files]
    •   DUMP: mapping (Pass II) [directories]
    •   DUMP: estimated 115343 blocks.
    •   DUMP: Volume 1 started with block 1 at: Tue Dec  2 12:08:23 2008
    •   DUMP: dumping (Pass III) [directories]
    •   DUMP: dumping (Pass IV) [regular files]
    •   DUMP: Closing /root/etc.dump.bz2
    •   DUMP: Volume 1 completed at: Tue Dec  2 12:09:49 2008
    •   DUMP: Volume 1 took 0:01:26
    •   DUMP: Volume 1 transfer rate: 218 kB/s
    •   DUMP: Volume 1 124680kB uncompressed, 18752kB compressed, 6.649:1
    •   DUMP: 124680 blocks (121.76MB) on 1 volume(s)
    •   DUMP: finished in 86 seconds, throughput 1449 kBytes/sec
    •   DUMP: Date of this level 0 dump: Tue Dec  2 12:08:22 2008
    •   DUMP: Date this dump completed:  Tue Dec  2 12:09:49 2008
    •   DUMP: Average transfer rate: 218 kB/s
    •   DUMP: Wrote 124680kB uncompressed, 18752kB compressed, 6.649:1
    •   DUMP: DUMP IS DONE
    • # 上面特殊字體的部分顯示:原本有 124680kb  的容量,被壓縮成為 18752kb,
    • # 整個壓縮比為 6.649:1 ,還可以的壓縮情況!

restore - 有備份當然有復原
  • restore -t [-f dumpfile] [-h]                 <==用來查看 dump 檔
  • restore -C [-f dumpfile] [-D 掛載點] <==比較dump與實際檔案
  • restore -i [-f dumpfile]                        <==進入互動模式
  • restore -r [-f dumpfile]                        <==還原整個檔案系統


留言

這個網誌中的熱門文章

[MySQL] schema 與資料類型優化

[翻譯] 介紹現代網路負載平衡與代理伺服器