[Linux] learning note 檔案與檔案系統的壓縮與打包
常見的壓縮檔案副檔名
compress
gzip
tar - 打包指令
dump
- *.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]# uncompress man.config.Z
- 範例三:將 man.config 壓縮成另外一個檔案來備份 [root@www tmp]# compress -c man.config > man.config.back.Z
[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]# ll man*
-rw-r--r-- 1 root root 4617 Nov 10 17:14 man.config
[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]# gzip -d man.config.gz
[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佳
與 gzip 相反, gzip -d 會將原本的 .gz 刪除,產生原本的 man.config 檔案。
- usage : bzip2 [-cdkzv#] 檔名
- option
- -c :將壓縮的過程產生的資料輸出到螢幕上
- -d :解壓縮的參數
- -k :保留原始檔案,而不會刪除原始的檔案
- -z :壓縮的參數
- -v :可以顯示出原檔案/壓縮檔案的壓縮比等資訊
- -# :壓縮等級,(最快,效果最差)-1 ~ -9 (最慢,效果最好),建議-6
- ex
- 範例一:將 /tmp/man.config 以 bzip2 壓縮 [root@www tmp]# bzip2 -z man.config
- 範例三:將範例一的檔案解壓縮 [root@www tmp]# bzip2 -d man.config.bz2
- 範例四:將範例三解開的 man.config 用最佳的壓縮比壓縮,並保留原本的檔案 [root@www tmp]# bzip2 -9 -c man.config > man.config.bz2
# 此時 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 <==注意這個警告訊息
- 解壓縮預設在當前的目錄下解壓縮,但如果假設要在/tmp解壓縮,則可用-C選項 [root@www ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
- 僅解開單一檔案
- # 1. 先找到我們要的檔名,假設解開 shadow 檔案好了: [root@www ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
/etc/
....中間省略....
/etc/esd.conf
/etc/crontab
# 由於加上 -v 這個選項,因此正在作用中的檔名就會顯示在螢幕上。
# 如果你可以翻到第一頁,會發現出現上面的錯誤訊息!底下會講解。
# 至於 -p 的選項,重點在於『保留原本檔案的權限與屬性』之意。
[root@www ~]# tar -jpcv -f /root/etc.tar.bz2 /etc
# 顯示的訊息會跟上面一模一樣囉!
[root@www ~]# ll /tmp
....(前面省略)....
drwxr-xr-x 105 root root 12288 Nov 11 04:02 etc
....(後面省略)....
-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] <==還原整個檔案系統
留言
張貼留言