Linux(3)压缩指令的应用

一.压缩

压缩就是尽可能降低文件在磁盘里占用的空间,比如:电脑中一般使用bytes来作为单位的。假设要存储1这个数字,那么就会存储为0000 0001 这样就会有7个0,某些电脑工程师就用某些复杂的算法,使得只用存一位1就行。又比如,111111这里有1000个1,那么在存储的时候就会用到很多空间,如果只存1000和1这两个数字来表示这一千个1,就会省下很多空间。

這個『壓縮』與『解壓縮』的動作有什麼好處呢?最大的好處就是壓縮過的檔案容量變小了, 所以你的硬碟容量無形之中就可以容納更多的資料。此外,在一些網路資料的傳輸中,也會由於資料量的降低, 好讓網路頻寬可以用來作更多的工作!而不是老是卡在一些大型的檔案傳輸上面呢!目前很多的 WWW 網站也是利用檔案壓縮的技術來進行資料的傳送,好讓網站頻寬的可利用率上升喔!

二.Linux中常见的压缩指令

在Linux的環境中,壓縮檔案的副檔名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2, *.xz』,為什麼會有這樣的副檔名呢?不是說 Linux 的副檔名沒有什麼作用嗎?

這是因為 Linux 支援的壓縮指令非常多,且不同的指令所用的壓縮技術並不相同,當然彼此之間可能就無法互通壓縮/解壓縮檔案囉。 所以,當你下載到某個壓縮檔時,自然就需要知道該檔案是由哪種壓縮指令所製作出來的,好用來對照著解壓縮啊! 也就是說,雖然 Linux 檔案的屬性基本上是與檔名沒有絕對關係的, 但是為了幫助我們人類小小的腦袋瓜子,所以適當的副檔名還是必要的! 底下我們就列出幾個常見的壓縮檔案副檔名吧:

①gzip指令  zcat/zmore/zless/zgrep

當你使用 gzip 進行壓縮時,在預設的狀態下原本的檔案會被壓縮成為 .gz 的檔名,原始檔案就不再存在了。 這點與一般習慣使用 windows 做壓縮的朋友所熟悉的情況不同喔!要注意!要注意!

测试:

zcat命令 用于不真正解压缩文件,就能显示压缩包中文件的内容的场合。

②bzip2   bzcat/bzmore/bzless/bzgrep

若說 gzip 是為了取代 compress 並提供更好的壓縮比而成立的,那麼 bzip2 則是為了取代 gzip 並提供更佳的壓縮比而來的。 bzip2 真是很不錯用的東西~這玩意的壓縮比竟然比 gzip 還要好~至於 bzip2 的用法幾乎與 gzip 相同!看看底下的用法吧!

③xz   xzcat/xzmore/xzless/xzgrep

雖然 bzip2 已經具有很棒的壓縮比,不過顯然某些自由軟體開發者還不滿足,因此後來還推出了 xz 這個壓縮比更高的軟體!這個軟體的用法也跟 gzip/bzip2 幾乎一模一樣! 那我們就來瞧一瞧!

④十分重要的tar指令

Ⅰ打包

前一小節談到的指令大多僅能針對單一檔案來進行壓縮,雖然 gzip, bzip2, xz 也能夠針對目錄來進行壓縮,不過, 這兩個指令對目錄的壓縮指的是『將目錄內的所有檔案 "分別" 進行壓縮』的動作!而不像在 Windows 的系統,可以使用類似 WinRAR 這一類的壓縮軟體來將好多資料『包成一個檔案』的樣式。

這種將多個檔案或目錄包成一個大檔案的指令功能,我們可以稱呼他是一種『打包指令』啦! 那 Linux 有沒有這種打包指令呢?是有的!那就是鼎鼎大名的 tar 這個玩意兒了! tar 可以將多個目錄或檔案打包成一個大檔案,同時還可以透過 gzip/bzip2/xz 的支援,將該檔案同時進行壓縮! 更有趣的是,由於 tar 的使用太廣泛了,目前 Windows 的 WinRAR 也支援 .tar.gz 檔名的解壓縮呢! 很不錯吧!所以底下我們就來玩一玩這個咚咚!

  • 壓 縮:tar -jcv -f filename.tar.bz2 要被壓縮的檔案或目錄名稱
  • 查 詢:tar -jtv -f filename.tar.bz2
  • 解壓縮:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄

那個 filename.tar.bz2 是我們自己取的檔名,tar 並不會主動的產生建立的檔名喔!我們要自訂啦! 所以副檔名就顯的很重要了!如果不加 [-z|-j|-J] 的話,檔名最好取為 *.tar 即可。如果是 -j 選項,代表有 bzip2 的支援,因此檔名最好就取為 *.tar.bz2 ,因為 bzip2 會產生 .bz2 的副檔名之故! 至於如果是加上了 -z 的 gzip 的支援,那檔名最好取為 *.tar.gz 喔!瞭解乎?

举例:将Ziptest文件打包

目前是在hggggc文件中。

查看:

解包:

举例:将etc备份:

至於加上『 -p 』這個選項的原因是為了保存原本檔案的權限與屬性!我們曾在第六章的 cp 指令介紹時談到權限與檔案類型(例如連結檔)對複製的不同影響。 同樣的,在備份重要的系統資料時,這些原本檔案的權限需要做完整的備份比較好。此時 -p 這個選項就派的上用場了。

查閱 tar 檔案的資料內容 (可察看檔名),與備份檔名有否根目錄的意義:

如果加上 -v 這個選項時,詳細的檔案權限/屬性都會被列出來!如果只是想要知道檔名而已, 那麼就將 -v 拿掉即可。從上面的資料我們可以發現一件很有趣的事情,那就是每個檔名都沒了根目錄了!這也是上一個練習中出現的那個警告訊息『tar: Removing leading `/' from member names(移除了檔名開頭的 `/' )』所告知的情況!

那為什麼要拿掉根目錄呢?主要是為了安全!我們使用 tar 備份的資料可能會需要解壓縮回來使用, 在 tar 所記錄的檔名 (就是我們剛剛使用 tar -jtvf 所察看到的檔名) 那就是解壓縮後的實際檔名。 如果拿掉了根目錄,假設你將備份資料在 /tmp 解開,那麼解壓縮的檔名就會變成『/tmp/etc/xxx』。 但『如果沒有拿掉根目錄,解壓縮後的檔名就會是絕對路徑, 亦即解壓縮後的資料一定會被放置到 /etc/xxx 去!』如此一來,你的原本的 /etc/ 底下的資料, 就會被備份資料所覆蓋過去了!

如果你確定你就是需要備份根目錄到 tar 的檔案中,那可以使用 -P (大寫) 這個選項

有發現不同點了吧?如果加上 -P 選項,那麼檔名內的根目錄就會存在喔!不過,鳥哥個人建議,還是不要加上 -P 這個選項來備份! 畢竟很多時候,我們備份是為了要未來追蹤問題用的,倒不一定需要還原回原本的系統中! 所以拿掉根目錄後,備份資料的應用會比較有彈性!也比較安全呢!

Ⅱ 解打包:

此時該打包檔案會在『本目錄下進行解壓縮』的動作! 所以,你等一下就會在家目錄底下發現一個名為 etc 的目錄囉!所以囉,如果你想要將該檔案在 /tmp 底下解開, 可以 cd /tmp 後,再下達上述的指令即可。不過,這樣好像很麻煩呢~有沒有更簡單的方法可以『指定欲解開的目錄』呢? 有的,可以使用 -C 這個選項喔!舉例來說:

Ⅲ 解开单一包

接上面的例子

Ⅳ 打包某目录但剔除一些档案

假設我們想要打包 /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 打包出來的檔案有沒有進行壓縮所得到檔案稱呼不同喔! 如果僅是打包而已,就是『 tar -cv -f file.tar 』而已,這個檔案我們稱呼為 tarfile 。 如果還有進行壓縮的支援,例如『 tar -jcv -f file.tar.bz2 』時,我們就稱呼為 tarball (tar 球?)!這只是一個基本的稱謂而已,不過很多書籍與網路都會使用到這個 tarball 的名稱!所以得要跟您介紹介紹。

三.XFS 檔案系統的備份與還原

使用 tar 通常是針對目錄樹系統來進行備份的工作,那麼如果想要針對整個檔案系統來進行備份與還原呢?由於 CentOS 7 已經使用 XFS 檔案系統作為預設值,所以那個好用的 xfsdump 與 xfsrestore 兩個工具對 CentOS 7 來說,就是挺重要的工具軟體了。

①XFS 檔案系統備份 xfsdump

其實 xfsdump 的功能頗強!他除了可以進行檔案系統的完整備份 (full backup) 之外,還可以進行累積備份 (Incremental backup) 喔! 啥是累積備份呢?這麼說好了,假設你的 /home 是獨立的一個檔案系統,那你在第一次使用 xfsdump 進行完整備份後,等過一段時間的檔案系統自然運作後, 你再進行第二次 xfsdump 時,就可以選擇累積備份了!此時新備份的資料只會記錄與第一次完整備份所有差異的檔案而已。

如上圖所示,上方的『即時檔案系統』是一直隨著時間而變化的資料,例如在 /home 裡面的檔案資料會一直變化一樣。 而底下的方塊則是 xfsdump 備份起來的資料,第一次備份一定是完整備份,完整備份在 xfsdump 當中被定義為 level 0 喔!等到第二次備份時,/home 檔案系統內的資料已經與 level 0 不一樣了,而 level 1 僅只是比較目前的檔案系統與 level 0 之間的差異後,備份有變化過的檔案而已。至於 level 2 則是與 level 1 進行比較啦!這樣瞭解呼?至於各個 level 的紀錄檔則放置於 /var/lib/xfsdump/inventory 中。

  • xfsdump 不支援沒有掛載的檔案系統備份!所以只能備份已掛載的!
  • xfsdump 必須使用 root 的權限才能操作 (涉及檔案系統的關係)
  • xfsdump 只能備份 XFS 檔案系統啊!
  • xfsdump 備份下來的資料 (檔案或儲存媒體) 只能讓 xfsrestore 解析
  • xfsdump 是透過檔案系統的 UUID 來分辨各個備份檔的,因此不能備份兩個具有相同 UUID 的檔案系統喔!

累积备份说明

在boot下建立一个10m的文件

再次备份:

②xfs系统的还原

根据上一小节的内容可知,已经在boot里面建立了一个10m的文件。现在恢复备份后,那个我那件应该不存在。

恢复:

查看boot文件:他还是存在:

因為原本 /boot 裡面的東西我們沒有刪除,直接復原的結果就是:『同名的檔案會被覆蓋,其他系統內新的檔案會被保留』喔!所以, 那個 /boot/testing.img 就會一直在裡頭~如果備份的目的地是新的位置,當然就只有原本備份的資料而已啊!那個 diff -r 可以比較兩個目錄內的檔案差異! 透過該指令我們可以找到兩個目錄的差異處!

所在把备份搞到一个新的档案里面去,这个档案里面应该就没有img文件了:

仅仅还原部分备份的xfsrestore模式

剛剛的 -s 可以接部份資料來還原,但是...如果我就根本不知道備份檔裡面有啥檔案,那該如何選擇啊?用猜的喔? 又如果要復原的檔案數量太多時,用 -s 似乎也是笨笨的~那怎辦?有沒有比較好的方式呢?有的,就透過 -i 這個互動界面吧! 舉例來說,我們想要知道 level 0 的備份資料裡面有哪些東西,然後再少量的還原回來的話!

四.制作光碟

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值