650 likes | 926 Views
Linux 基礎學習. Chapter 9 檔案與檔案系統的壓縮與打包. 內容. 壓縮檔案的用途與技術 Linux 系統常見的壓縮指令 打包指令: tar 完整備份工具: dump 光碟寫入工具 其他常見的壓縮與備份工具. 9.1 壓縮檔案的用途與技術. 你是否有過文件檔案太大,導致無法以一片軟碟將它複製完成的困擾?又,你是否有過,發現一個軟體裡面有好多檔案,這些檔案要將它複製與攜帶都很不方便的問題?還有,你是否有過要備份某些重要資料,偏偏這些資料量太大了,耗掉了你很多的磁碟空間呢?這個時候,那個好用的『檔案壓縮』技術可就派的上用場了!
E N D
Linux 基礎學習 Chapter 9 檔案與檔案系統的壓縮與打包
內容 • 壓縮檔案的用途與技術 • Linux 系統常見的壓縮指令 • 打包指令: tar • 完整備份工具:dump • 光碟寫入工具 • 其他常見的壓縮與備份工具 Linux基礎--檔案與檔案系統的壓縮與打包
9.1 壓縮檔案的用途與技術 你是否有過文件檔案太大,導致無法以一片軟碟將它複製完成的困擾?又,你是否有過,發現一個軟體裡面有好多檔案,這些檔案要將它複製與攜帶都很不方便的問題?還有,你是否有過要備份某些重要資料,偏偏這些資料量太大了,耗掉了你很多的磁碟空間呢?這個時候,那個好用的『檔案壓縮』技術可就派的上用場了! 因為這些比較大型的檔案透過所謂的檔案壓縮技術之後,可以將它的磁碟使用量降低,可以達到減低檔案容量的效果,此外,有的壓縮程式還可以進行容量限制,使一個大型檔案可以分割成為數個小型檔案,以方便軟碟片攜帶呢! 那麼什麼是『檔案壓縮』呢?我們來稍微談一談它的原理好了。目前我們使用的電腦系統中都是使用所謂的 bytes 單位來計量的!不過,事實上,電腦最小的計量單位應該是 bits 才對啊,此外,我們也知道 1 byte = 8 bits 。但是如果今天我們只是記憶一個數字,亦即是 1 這個數字呢?它會如何記錄?假設一個 byte 可以看成底下的模樣: □□□□□□□□
不要學compress,因為gzip就可解.Z檔 • 9.2.1compress
gzip & bzip2 只能對單一檔案做壓縮當target為 dir時,仍是對dir中所有單一檔案做壓縮
gzip • echo "aa" > a; cp a b; cp a c • gzip a; ll (不加參數就是壓縮) • gzip -d a.gz; ll (-d 就是 解壓縮) • gzip *;ll • gzip -d *.gz; ll • gzip a -c > a.gz (保留原檔) • mkdir dir; mv a b c • gzip dir 不行哦 • gzip: dir is a directory -- ignored • gzip dir/*; ll dir 也是個別檔案壓 • gzip -v a 壓縮比 • gzip -1~9 改變壓縮比,default=6
gzip • 無參數即為壓縮 • gzip x (刪x,產生.gz) • zcat x.gz(text file) • gzip -d x.gz (刪.gz,回原檔) • gzip -9 -c x > x.gz (保留原檔)-1最快,-9壓最密(壓縮比最好) • -t,vi x.gz加些東西,-t就會test出不是.gz file
bzip2 • echo "aa" > a; cp a b; cp a c • bzip2 a; ll (不加參數,就是-z,就是壓縮) • bzip2 -d a.gz; ll (-d 就是 解壓縮) • bzip2 *;ll • bzip2 -d *.gz; ll • bzip2 -v a -c > a.gz (保留原檔, 並顯示壓縮內容,壓縮比) • mkdir dir; mv a b c • bzip2 dir 不行哦 • bzip2: Input file dir is a directory. • bzip2 dir/*; ll dir 也是個別檔案壓 • bzip2 -v a 壓縮比 • bzip2 -1~9 改變壓縮比,default=6
dd 一個大一點的 檔案 a: 證明 bzip2 比 gzip 強多了! dd if=/dev/zero of=./a bs=1M count=10 產生一個 10Mb檔案 a gzip -c -v a > a.gz a: 99.9%(saved) bzip2 -c -v a > a.bz2 a: 213995.102:1, 0.000 bits/byte, 100.00% saved, 10485760 in, 49 out. ll 10485760 2013-09-07 01:49 a 49 2013-09-07 01:51 a.bz2 小很多 10210 2013-09-07 01:50 a.gz /// mkdir dir 在dir中新增5 files gzip dir >> 不行 bzip2 dir >> 不行 gzip or bzip2 dir/* >> 對個別files 壓縮 結論: gzip or bzip2 不能對dir壓縮 所以才會有tar
tar • 請記得加 -f 參數,而且最好獨立出來 • 壓縮(-c) to dir.tar • 解壓縮(-x) from dir.tar • 其實,記-c -x -f 就好了 • 啊不然 -z & -j 也記一下好了 • -大C 可指定 解壓path (-C只用在解壓) • t查看壓縮檔內容 • 解壓時若是 .tar.gz or .tar.bz2,其實-z or -j參數都不用加,只要-x即可. • mkdir dir; cd dir; touch a b c d e • 壓縮: tar -c dir -f dir.tar; ll • rm -rf abc; ll • 解壓縮: tar -xf dir.tar ( or tar -x -fdir.tar)解壓時-f可與其它option寫在一起,壓時不可,最好都獨之出來
tar /root/tmp/qq/建幾個files; cd /root/tmp 1.) tar -cv qq -f qq.tar 2.) 但若是壓自己的 .,必須--exclude=x.tar如: tar -cv . -f qq.tar --exclude=qq.tar3.) -f 在壓縮時,即可指定其它路徑 tar -cv qq -f /tmp/qq.tar 4.) 解壓時用 -C(大C)來指定解壓路徑 tar -xv -f qq.tar -C /tmp 5.) -z .tar.gz -j .tar.bz2
tar 再比一次 gzip & bzip2 • cd dir; dd if=/dev/zero of=a bs=1M count=10再做同樣動作產生b & c file (共30MBMB) • 只打包為tar • tar -cv dir -f dir.tar(-f可以放前面,我習慣放後面,比較直覺) • 打包,並以gzip壓 • tar -cvz dir -f dir.tar.gz • 打包,並以bzip2壓 • tar -cvj dir -f dir.tar.gz • lldrwxr-xr-x 2 root root 4096 2013-08-21 02:45 dir-rw-r--r-- 1 root root 31467520 2013-08-21 02:50 dir.tar-rw-r--r-- 1 root root 187 2013-08-21 03:31 dir.tar.bz2-rw-r--r-- 1 root root 30801 2013-08-21 02:50 dir.tar.gz看看 bzip2 & gzip的壓縮比率差多少!!
tar • 解.tar • tar -xv -f dir.tar • 解.tar.gz • tar -xvz -f dir.tar.gz • 解.tar.bz2 • tar -xvj -f dir.tar.bz2 • 檢視(查詢-tv)壓縮檔內容 • tar -tv -f dir.tar (其實檢視全部都用 -tv即可,不需下一行) • tar -tv(加z or j較清楚,但其實不用加) -f dir.tar.gz (or dir.tar.bz2) • 我習慣以-cv or -xv開頭,把 z or j放後面,bird 跟我相反,請習慣把 -f 獨立出來
tar -cvj /home -f /tmp/home.tar.bz2tar: 從成員名稱中移除前端的「/」 • -p(小寫) :保留備份資料的原本權限與屬性,常用於備份(-c)重要的設定檔 tar 指令預設就有 -p • tar -cvj /home -f /tmp/home.tar.bz2 • tar -xvj -f /tmp/home.tar.bz2 -C /tmp/kk • ll /tmp/kk/home/jj 可知預設權限與屬性均有保留 • 也就是-p本來就有加 • -P(大寫) :保留絕對路徑,亦即允許備份資料中含有根目錄存在之意; • --exclude=FILE:在壓縮的過程中,不要將 FILE 打包!
tar • -tv詳細的檔案權限/屬性都會被列出來如果只是想要知道檔名,將 -v 拿掉 • 備份/以下dir時預設會把"/"拿掉,以免不小心回寫時覆蓋掉 • tar -cvjp /etc -f /root/etc.tar.bz2(過程即會提示已把"/"拿掉) • tar -tvj -f /root/etc.tar.bz2 沒有"/" • 若確定要備份有"/"的壓縮檔:tar -cvjpP /etc -f /root/etc.tar.bz2 • tar -tvj -f /root/etc.tar.bz2 有"/“
tar 僅解開單一檔案的方法 • # 1. 先找到我們要的檔名,假設解開 shadow 檔案好了: tar -jtv -f /root/etc.tar.bz2 | grep 'shadow' … -r-------- root/root 1257 2008-09-29 02:21:25 etc/shadow <==這是我們要的! • # 2. 將該檔案解開!語法與實際作法如下: tar -jxv -f 打包檔.tar.bz2 待解開檔名 tar -jxv -f /root/etc.tar.bz2 etc/shadow 不可以寫成 /etc/shadow (輸出)etc/shadow ll etc -r-------- 1 root root 1257 Sep 29 02:21 shadow <==呦喝!只有一個檔案啦! • # 很有趣!此時只會解開一個檔案而已!不過,重點是那個檔名!你要找到正確的檔名。 • # 在本例中,你不能寫成 /etc/shadow !因為記錄在 etc.tar.bz2 內的檔名之故
tar打包某(個或些)目錄,但不含該目錄下的某些檔案之作法tar打包某(個或些)目錄,但不含該目錄下的某些檔案之作法 • 假設我們想要打包 /etc /root 這兩個目錄,新的打包檔案要放置成為 /root/system.tar.bz2, 但卻不想要打包 • 1.) /root/etc* 開頭的檔案,因為該檔案都是剛剛我們才建立的備份檔嘛! • 2.) 當然這個檔案不要打包自己 (因為這個檔案放置在 /root 底下啊!) • --exclude 就是不包含的意思: • tar -cvj /etc /root -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 • (bird把-cvj 要打包的資料夾/etc /root放最後面,跟本人習慣不符,我覺得把要打包的資料夾,緊接著放在-cvj後面較直覺) • 舊版tar 的--exclude與要排除的file or dir可空一格,現在一律要用=
tar:利用管線命令與資料流(請務必要會) • 特殊應用:利用管線命令與資料流 • # 1. 將 /etc 整個目錄一邊打包一邊在 /tmp 解開 • [root@www ~]# cd /tmp • [root@www tmp]# tar -cvj dir -f - | tar -xvj -f - -C /tmp/ • # 這個動作就像是 cp -r /root/tmp/qq /tmp 啦 • 不過過程先打包甚至壓縮對跨server可以大大減少流量
tar:利用管線命令與資料流(請務必要會) 先練習,Server A執行: 1.) 把Server B(root password: 123)的 /home壓縮到 /tmp/home.tar.bz2 ssh root@ServerB_ip tar -cvj /home -f /tmp/home.tar.bz2 (事先以 nautilus 叫出 /tmp, 洗清空/tmp) 2.) 把Server B/tmp/home.tar.bz2 解壓縮到/root/tmp ssh root@ServerB_ip tar -xvj -f /tmp/home.tar.bz2 -C /root/tmp ssh root@10.10.88.158 tar -xvj -f /tmp/home.tar.bz2 -C /root/tmp(事先以 nautilus 叫出 /root/tmp,洗清空/root/tmp) 3.) 在 Server B的 terminal 的 /root/tmp檢查 /root/tmp/home/jj所有 file & dir的 owner, group, permission 完全保留
tar:利用管線命令與資料流(請務必要會) • 過程先打包甚至壓縮(-j) 對跨server傳輸,可以大大減少流量 • (以下: 請務必要會)請開兩台電腦,把Server_A的/root/tmp/dir 打包為.tar後傳到Server_B並解壓縮在/tmp下: • 先把server_b root password 設為 123 • cd /root/tmp; 建 dir,裡面放幾個files • Server_A: tar -cvj dir -f - | ssh root@Server_B_IP tar -xvj -f - -C /tmp
tar --exclude • cd /root/tmp • tar -cv . -f abc.tar • >> ./abc.tar:檔案是保存檔;未傾印 (因為沒有設 --exclude=abc.tar,意思就是abc.tar本身不打包) • 正確應為 tar -cv . -f abc.tar --exclude=abc.tar Linux基礎--磁碟檔案系統
tar -t 只看檔案 | grep -v '/$' • tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$‘ grep -v 指的是後面字串以外的, '/$'指的是: "最後是/的",所以:grep -v '/$‘指的是 "最後不是/的" 只看檔案 Linux基礎--磁碟檔案系統
tar • cd /root/tmp • tar -cv . -f abc.tar • >> ./abc.tar:檔案是保存檔;未傾印 (因為沒有設 --exclude=abc.tar,意思就是abc.tar本身不打包) • 正確應為 tar -cv . -f abc.tar --exclude=abc.tar Linux基礎--磁碟檔案系統
9.3 打包指令: tar • 9.3.1tar • 其實最簡單的使用tar 就只要記憶底下的方式即可: • 壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的檔案或目錄名稱 • 查 詢:tar -jtv -f filename.tar.bz2 • 解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄
9.3 打包指令: tar • 使用 tar 加入 -j 或 -z 的參數備份 /etc/ 目錄
9.3 打包指令: tar • 查閱 tar 檔案的資料內容(可察看檔名),與備份檔名有否根目錄的意義
9.3 打包指令: tar • 如果你確定你就是需要備份根目錄到 tar 的檔案中,那可以使用 -P (大寫) 這個選項,請看底下的例子分析
9.3 打包指令: tar • 將備份的資料解壓縮,並考慮特定目錄的解壓縮動作 (-C 選項的應用)
9.3 打包指令: tar • 僅解開單一檔案的方法
9.3 打包指令: tar • 打包某目錄,但不含該目錄下的某些檔案之作法 Linux基礎--檔案與檔案系統的壓縮與打包
9.3 打包指令: tar • 僅備份比某個時刻還要新的檔案
9.3 打包指令: tar • 特殊應用:利用管線命令與資料流
完整備份工具:dump主要做filesystem備份,dir請用taryum -y install dump會同時安裝dump & restore 備份的資料為-單一檔案系統:1.) 可以使用完整的 dump 功能,包括利用 0~9 的數個 level 來備份 2.) 可以使用掛載點或者是裝置檔名進行備份! 備份的資料-目錄(該目錄並非獨立的檔案系統時),限制:1.) 所有的備份資料都必須要在該目錄 (本例為:/home/someone/) 底下 2.) 僅能使用 level 0 ,亦即僅支援完整備份而已 3.) 不支援 -u 選項,亦即無法建立 /etc/dumpdates 這個各別 level 備份的時間記錄檔 dump -W (列出在 /etc/fstab 裡面的具有 dump 設定的 partition 是否有備份過?) Last dump(s) done (Dump '>' file systems): > /dev/sda2 ( /) Last dump: never > /dev/sda1 ( /boot) Last dump: never > /dev/sda3 ( /home) Last dump: never
dump -大W (列出在 /etc/fstab 裡面的具有 dump 設定的 partition,倒數第2個colume, 是否有備份過?) • dump -W • Last dump(s) done (Dump '>' file systems): • > /dev/sda2 ( /) Last dump: never • > /dev/sda1 ( /boot) Last dump: never • > /dev/sda3 ( /home) Last dump: never • value=1 應該每天要做,因為 backup policy 沒有做啦,ch25 • 可以手動做 • dump -0u /home -f /tmp/home.dump.0(備 /home 或 備 /dev/sda3 都一樣) • vim /etc/dumpdates • dump -W • /dev/sda3 ( /home) Last dump: Level 0, Date .... • dump -w (小w需要dump的) (-大W,/etc/fstab 所有 dump state)
dump -大S (bytes,僅列出後面的待備份資料需要多少磁碟空間才能夠備份完畢) • df -h /boot, /dev/sda1 最小 • dump -S /dev/sda1 • 25715712(bytes) • dump -0u /boot -f /root/boot.dump (-u 會把時間記錄到 /etc/dumpdates ) • ll /etc/dumpdates; cat /etc/dumpdates (filesystem level-0 date) • dump -W • dump -1u /boot -f /root/boot.dump.1 • ll /root/boot.* • dump -W • // • dump dir (與 tar差不多,只能做 level 0)
dump 選項與參數: • -S :僅列出後面的待備份資料需要多少磁碟空間才能夠備份完畢; • -W :列出在 /etc/fstab 裡面的具有 dump 設定的 partition 是否有備份過? • -j :加入 bzip2 的支援!將資料進行壓縮,預設 bzip2 壓縮等級為 2 • -u :將這次 dump 的時間記錄到 /etc/dumpdates 檔案中; • -v :將 dump 的檔案過程顯示出來; • -f :有點類似 tar 啦!後面接產生的檔案,亦可接例如 /dev/st0 裝置檔名等 • -level:就是我們談到的等級,從 -0 ~ -9 共十個等級;
resotre -t: 察看 dump 備份檔中資料 mimia練習 resotre -r: 這才是真正的還原 • restore -t -f /root/boot.dump • restore -t -f /root/boot.dump.1 空的 • useradd u1 u2 u3 • dump -0u /home -f /root/home.dump; jj login, touch a b c; su - • dump -1u /home -f /root/home.dump.1 • fdisk 一個新的 partition reboot, format, mount restore • ...; cd /mnt/part6; restore -r -f /root/home.dump • 先ls看一下; • 再 restore, restore -r -f /root/home.dump.1 • 再進 jj, ls 證實level 1的 files也回來了,而且 permission都正確
-大S • [root@www ~]# dump [-Suvj] [-level] [-f 備份檔] 待備份資料 • [root@www ~]# dump -W • 選項與參數: • -S :僅列出後面的待備份資料需要多少磁碟空間才能夠備份完畢; • -u :將這次 dump 的時間記錄到 /etc/dumpdates 檔案中; • -v :將 dump 的檔案過程顯示出來; • -j :加入 bzip2 的支援!將資料進行壓縮,預設 bzip2 壓縮等級為 2 • -level:就是我們談到的等級,從 -0 ~ -9 共十個等級; • -f :有點類似 tar 啦!後面接產生的檔案,亦可接例如 /dev/st0 裝置檔名等 • -W :列出在 /etc/fstab 裡面的具有 dump 設定的 partition 是否有備份過?
restore -r -f home.dump.0 • dump的還原 restore -r • 原mount point dir會消失哦!! • 比如 home, etc, boot 資料夾會不見 • owner, group, & permission都會完全一樣 Linux基礎--磁碟檔案系統
dump -W • dump -0u /dev/sda3 -f /tmp/home.dump.0 • restore -t -f /tmp/home.dump.0 • cat /etc/dumpdates • su - jj; touch after0 after00 after000; exit • dump -1u /dev/sda3 -f /tmp/home.dump.1 • restore -t -f /tmp/home.dump.1 • su - jj; touch after1 after11 after111; exit • mkdir /root/tmp; cd /root/tmp • restore -t -f /tmp/home.dump.0; ... .1; ..... .2 • restore -r -f /tmp/home.dump.0;ll; ll jj owner, group, permission都正確, 裡面沒有 after0 ... • restore -r -f /tmp/home.dump.1; ll; ll jj jj裡面有 after0 ... • restore -r -f /tmp/home.dump.2; ll; ll jj jj裡面有 after1 ...
重點:上述的 restore指令在 原硬碟毀損後,裝上新硬碟並 mount /home後, cd /home; restore -r -f ... • 或是,不正常關機後,導到部份檔案己有毀損,可以用 restore -r -i -f /tmp/home.dump.2 -i 會逐檔詢問是否要還原!!
完整備份工具:dump主要做filesystem備份,dir請用tar完整備份工具:dump主要做filesystem備份,dir請用tar • 9.4.1dump 第一次備份 level 0 ,也是完整的備份 dump 運作的等級 (level)
9.4 完整備份工具:dump • 用 dump 備份完整的檔案系統
9.4 完整備份工具:dump 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 的時間 ]
9.4 完整備份工具:dump • 用 dump 備份非檔案系統,亦即單一目錄的方法
9.4 完整備份工具:dump • 9.4.2restore
mkisofs 建立iso檔(cd or dvd建立iso檔請用 windows ultraiso) • mkisofs • -o :後面接你想要產生的那個映像檔檔名 • -v :顯示建置 ISO 檔案的過程 • 建立 /root, /home, /etc system.iso • mkisofs -r -v -o /tmp/system.iso /root /home /etc -o參數必須緊跟著 output iso file