1. 程式人生 > >Linux系統檔案壓縮與備份(5)

Linux系統檔案壓縮與備份(5)

Linux 是一套免費使用和自由傳播的類Unix作業系統,是一個基於POSIX和UNIX的多使用者、多工、支援多執行緒和多CPU的作業系統.它能執行主要的UNIX工具軟體、應用程式和網路協議.它支援32位和64位硬體.Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多使用者網路作業系統.

在 Linux 系統選有相當多的壓縮命令可以使用,這些壓縮指令可以讓我們更方便的從網上下載大型檔案,本章第一節內容我們就來談談這個 Linux 系統下常用的幾種壓縮格式吧.

談完了壓縮後,我們接著來說一下文件的備份,備份可以說是 Linux 系統管理者的看家本領了,萬一不幸你的 Linux 被駭客入侵了、或是你的 Linux 系統由於硬體關係而掛掉了,這個時候備份就能發揮極大的作用,本章的第二小結我們將重點來回顧一下這些常用備份命令吧.



Linux 檔案壓縮

你是否有過檔案檔案太大,導致無法以U盤將他複製完成的困擾,還有你是否有過要備份某些重要資料,偏偏這些資料量太大了,耗掉了你很多的磁碟空間呢,這個時候,那個『檔案壓縮』技術可就派的上用場了.

由於我們記錄數字是 1 考慮計算機所謂的二進位如此一來 1 會在最右邊佔據 1 個bit,而其他的 7 個bits將會自動的被填上 0 所以說,剩下的那 7 位空間則是空值,而壓縮就是將這些空值暫時的填充滿,使其能夠節約空間,當我們使用的時候,再將這些空值展開,這就是最常用的壓縮技術.

另外一種壓縮技術也很有趣,他是將重複的資料進行統計記錄的,舉例來說,如果你的資料為『111....』共有100個1時,那麼壓縮技術會記錄為『100個1』而不是真的有100個1的位存在,這樣也能夠精簡檔案記錄的容量呢.

在這裡有個小知識點,有些組合語言演算法,可以將一部電影壓縮到幾KB的大小,而且還可以有聲音,是不是很神奇,這也是組合語言的強大之處.

這是因為 Linux 支援的壓縮命令非常多,且不同的命令所用的壓縮技術並不相同,當然彼此之間可能就無法互通壓縮/解壓縮檔案,所以當你下載到某個壓縮包時,自然就需要知道該檔案是由哪種壓縮命令所製作出來的,好用來對照著解壓縮啊,也就是說,雖然 Linux 檔案的屬性基本上是與檔案沒有絕對關係的,但是為了好區分這些檔案使用的是那種壓縮技術,從而出現了拓展名,下面是 Linux 系統下常用的一些壓縮格式.

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

Linux上常見的壓縮命令就是 gzip 與 bzip2 ,至於 compress 已經推出江湖了,gzip 是由 GNU 計劃所開發出來的壓縮命令,該命令已經取代了 compress 後來 GNU 又開發出 bzip2 這個壓縮比更好的壓縮命令.

◆compress 壓縮◆

compress命令使用 Lempress-Ziv 編碼壓縮資料檔案,compress是個歷史悠久的壓縮程式,檔案經它壓縮後,其名稱後面會多出 ".Z" 的副檔名,當要解壓縮時,可執行uncompress指令,事實上uncompress是指向compress的符號連線,因此不論是壓縮或解壓縮,都可通過compress指令單獨完成,但是需要注意的是,這個命令只有在老式的Unix主機上還在使用,一般已經棄用了.

在使用這個命令之前,我們必須要先來安裝一下它,因為這個命令已經不常用了,所以並沒有整合安裝.

[[email protected] ~]# yum install -y ncompress
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package ncompress-4.2.4.4-3.el7.x86_64 already installed and latest version
Nothing to do

[[email protected] ~]# rpm -qi ncompress
Name        : ncompress
Version     : 4.2.4.4
Release     : 3.el7
Architecture: x86_64
Install Date: Fri 16 Nov 2018 06:30:17 AM EST
Group       : Applications/File
Size        : 36101
License     : Public Domain
Signature   : RSA/SHA256, Wed 02 Apr 2014 12:23:03 PM EDT, Key ID 199e2f91fd431d51
Source RPM  : ncompress-4.2.4.4-3.el7.src.rpm
Build Date  : Sun 26 Jan 2014 12:52:02 PM EST
Build Host  : x86-020.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Vendor      : Red Hat, Inc.
URL         : http://ncompress.sourceforge.net/
Summary     : Fast compression and decompression utilities
Description :

接下來,我們來看一下它的命令引數說明吧.

[[email protected] ~]# compress --help

命令語法:[ compress [選項] 檔案或目錄 ]

        -f              #強制覆蓋掉目標檔案
        -c              #將結果送到標準輸出,無檔案被改變
        -r              #遞迴的操作方式
        -b 數字         #壓縮效率是一個介於9~16
        -d              #對檔案進行解壓縮而非壓縮
        -v              #顯示指令執行過程

壓縮例項:通過使用compress -c命令壓縮一個檔案.

[[email protected] ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash

[[email protected] ~]# compress -c bash > bash.Z

[[email protected] ~]# ls -lh
total 1.6M
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
-rw-r--r--. 1 root root 596K Nov 16 06:38 bash.Z

解壓例項:通過使用compress -d命令解壓一個檔案.

[[email protected] ~]# ls -lh
total 596K
-rw-r--r--. 1 root root 596K Nov 16 06:38 bash.Z

[[email protected] ~]# compress -d bash.Z

[[email protected] ~]# ls -lh
total 944K
-rw-r--r--. 1 root root 942K Nov 16 06:38 bash

◆zip,unzip 壓縮◆

zip命令可以用來解壓縮檔案,或者對檔案進行打包操作,zip是個使用廣泛的壓縮程式,檔案經它壓縮後會另外產生具有 ".zip" 副檔名的壓縮檔案,由於各種系統都支援zip的壓縮格式,所以在一定程度上,是可以通用的.

在使用這個命令之前,我們必須要先來安裝一下它,因為這個命令並沒有整合安裝.

[[email protected] ~]# yum install -y zip unzip
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package zip-3.0-11.el7.x86_64 already installed and latest version
Package unzip-6.0-19.el7.x86_64 already installed and latest version
Nothing to do

接下來,我們來看一下它的命令引數說明吧.

[[email protected] ~]# zip --help

命令語法:[ zip/unzip [選項] 檔案或目錄 ]

        -r              #遞迴壓縮,連同子目錄一同壓縮
        -S              #包含系統和隱藏檔案
        -v              #顯示指令執行過程
        -q              #不顯示指令執行過程

壓縮例項:通過使用zip -r -v命令將/etc/目錄全部內容壓縮.

[[email protected] ~]# zip -r -v lyshark.zip /etc/

[[email protected] ~]# ls -lh
total 12M
-rw-r--r--. 1 root root 12M Nov 16 09:46 lyshark.zip

查詢例項:通過使用unzip -l命令查詢一個壓縮包中的檔案.

[[email protected] ~]# unzip -l lyshark.zip

解壓例項:通過使用unzip -d命令將檔案解壓到指定目錄.

[[email protected] ~]# unzip lyshark.zip -d /tmp/

[[email protected] ~]# ls -lh /tmp/
total 12K
drwxr-xr-x. 84 root root 8.0K Nov  6 11:02 etc

◆gzip,zcat 壓縮◆

gzip是在Linux系統中經常使用的一個對檔案進行壓縮和解壓縮的命令,既方便又好用,其拓展名為.gz,gzip不僅可以用來壓縮大的、較少使用的檔案以節省磁碟空間,還可以和tar命令一起構成Linux作業系統中比較流行的壓縮檔案格式,據統計gzip命令對文字檔案有60%~70%的壓縮率,減少檔案大小有兩個明顯的好處,一是可以減少儲存空間,二是通過網路傳輸檔案時,可以減少傳輸的時間.

由於這個命令很常用,我們無需來安裝它,他是系統內建的,下面來看一下它的常用引數吧.

[[email protected] ~]# gzip --help

命令語法:[ gzip/zcat [選項] 檔案或目錄 ]

        -a              #使用ASCII文字模式
        -d              #解開壓縮檔案
        -f              #強行壓縮檔案
        -l              #列出壓縮檔案的相關資訊
        -n              #壓縮時,不儲存原來的檔名稱及時間戳
        -N              #壓縮時,儲存原來的檔名稱及時間戳
        -q              #不顯示警告資訊
        -r              #遞迴處理
        -v              #顯示指令執行過程

壓縮例項:通過使用gzip -rv命令壓縮一個檔案.

[[email protected] ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash

[[email protected] ~]# gzip -rv bash
bash:    51.2% -- replaced with bash.gz

[[email protected] ~]# ls -lh
total 460K
-rwxr-xr-x. 1 root root 460K Sep 26  2017 bash.gz

查詢例項:通過使用gzip -l/zcat -l命令查詢一個檔案.

[[email protected] ~]# gzip -l bash.gz

         compressed        uncompressed  ratio uncompressed_name
             470300              964544  51.2% bash

[[email protected] ~]# zcat -l bash.gz
         compressed        uncompressed  ratio uncompressed_name
             470300              964544  51.2% bash

解壓例項:通過使用gzip -dv / zcat命令解壓一個檔案.

[[email protected] ~]# ls -lh
total 460K
-rwxr-xr-x. 1 root root 460K Sep 26  2017 bash.gz

[[email protected] ~]# gzip -dv bash.gz
bash.gz:         51.2% -- replaced with bash

[[email protected] ~]# zcat -d bash.gz >bash_zcat
[[email protected] ~]# ls -lh
total 2.1M
-rw-r--r--. 1 root root 942K Nov 16 06:56 bash
-rw-r--r--. 1 root root 942K Nov 16 06:56 bash.zcat
-rwxr-xr-x. 1 root root 460K Sep 26  2017 bash.gz

◆bzip2,bzcat 壓縮◆

bzip2命令用於建立和管理,包括解壓縮,.bz2格式的壓縮包,我們遇見Linux壓縮打包方法有很多種,以下講解了Linux壓縮打包方法中的Linux bzip2命令的多種範例供大家檢視,相信大家看完後會有很多收穫.

在使用這個命令之前,我們必須要先來安裝一下它,因為這個命令並沒有整合安裝.

[[email protected] ~]# yum install -y bzip2
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package bzip2-1.0.6-13.el7.x86_64 already installed and latest version
Nothing to do

緊接著,下面來看一下它的常用引數吧.

[[email protected] ~]# bzip2 --hlep

命令語法:[ bzip2/bzcat [選項] 檔案或目錄 ]

        -c              #輸出壓縮解壓過程
        -d              #執行解壓縮
        -k              #解壓後保留原始檔案
        -v              #壓縮或解壓時詳細輸出
        -z              #強制執行壓縮

壓縮例項:通過使用bzip2 -kzv命令將bash檔案壓縮.

[[email protected] ~]# ls -lh
total 944K
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash

[[email protected] ~]# bzip2 -kzv bash
  bash:     2.164:1,  3.697 bits/byte, 53.79% saved, 964544 in, 445742 out.

[[email protected] ~]# ls -lh
total 1.4M
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
-rwxr-xr-x. 1 root root 436K Sep 26  2017 bash.bz2

解壓例項:通過使用bzip2 -kdv命令解壓縮bash.bz2檔案.

[[email protected] ~]# ls -lh
total 436K
-rwxr-xr-x. 1 root root 436K Sep 26  2017 bash.bz2

[[email protected] ~]# bzip2 -kdv bash.bz2
  bash.bz2: done

[[email protected] ~]# ls -lh
total 1.4M
-rwxr-xr-x. 1 root root 942K Sep 26  2017 bash
-rwxr-xr-x. 1 root root 436K Sep 26  2017 bash.bz2

◆tar 歸檔並壓縮◆

tar命令可以為linux的檔案和目錄建立壓縮包,利用tar可以為某一特定檔案建立備份,也可以在壓縮包中改變檔案,或者向壓縮包中加入新的檔案,tar最初被用來在磁帶上建立備份,現在,使用者可以在任何裝置上建立壓縮檔案啦,利用tar命令可以把一大堆的檔案和目錄全部打包成一個檔案,這對於備份檔案或將幾個檔案組合成為一個檔案以便於網路傳輸是非常有用的.

這裡要弄清兩個概念:打包和壓縮,打包是指將一大堆檔案或目錄變成一個總的檔案,壓縮則是將一個大的檔案通過一些壓縮演算法變成一個小檔案.

為什麼要區分這兩個概念呢? 這源於Linux中很多壓縮程式只能針對一個檔案進行壓縮,這樣當你想要壓縮一大堆檔案時,你得先將這一大堆檔案先打成一個包(tar命令),然後再用壓縮程式進行壓縮(gzip bzip2).

首先老樣子,我們先來看一下tar命令所支援的引數吧,在這裡我們列出最常用的引數.

[[email protected] ~]# tar --hlep

命令語法:[ tar [選項] 檔案或目錄 ]

        -c              #新建打包
        -t              #檢視打包檔案
        -x              #解壓打包檔案
        -j              #通過bz2進行壓縮與解壓
        -z              #通過gz進行壓縮與解壓
        -J              #通過xz進行壓縮與解壓
        -v              #顯示壓縮與解壓過程
        -C              #指定解壓到哪裡

壓縮與解壓tar.gz:通過使用tar -czvf xzvf tvf命令壓縮解壓與查詢.

[[email protected] ~]# tar -czvf lyshark.tar.gz /etc/*        #將/etc/*目錄下的內容壓縮成lyshark.tar.gz
[[email protected] ~]# tar -tvf lyshark.tar.gz                #查詢包中的內容
[[email protected] ~]# tar -xzvf lyshark.tar.gz -C /etc/      #將壓縮包,解壓到/etc/目錄下

壓縮與解壓tar.bz2:通過使用tar -cjvf xjvf tvf命令壓縮解壓與查詢.

[[email protected] ~]# tar -cjvf lyshark.tar.bz2 /etc/*        #將/etc/*目錄下的內容壓縮成lyshark.tar.bz2
[[email protected] ~]# tar -tvf lyshark.tar.bz2                #查詢包中的內容
[[email protected] ~]# tar -xjvf lyshark.tar.bz2 -C /etc/      #將壓縮包,解壓到/etc/目錄下

壓縮與解壓tar.xz:通過使用tar -cJvf xJvf tvf命令壓縮解壓與查詢.

[[email protected] ~]# tar -cJvf lyshark.tar.xz /etc/*         #將/etc/*目錄下的內容壓縮成lyshark.tar.xz
[[email protected] ~]# tar -tvf lyshark.tar.xz                 #查詢包中的內容
[[email protected] ~]# tar -xJvf lyshark.tar.xz -C /etc/       #將壓縮包,解壓到/etc/目錄下


Linux 檔案備份

老實說,備份是系統損毀時等待救援的救星,因為你需要重新安裝系統時,備份的好壞會影響到你係統復原的進度,不過我們想先知道的是,系統為什麼會損壞啊?是人為的還是怎樣產生的啊? 事實上,系統有可能由於不預期的傷害而導致系統發生錯誤,什麼是不預期的傷害呢?這是由於系統可能因為不預期的硬體損壞,例如硬碟壞掉等等,或者是軟體問題導致系統出錯,包括人為的操作不當或是其他不明因素等等所致,下面我們就來談談系統損壞的情況與如何備份吧.

◆cpio 塊級備份◆

cpio命令主要是用來建立或者還原備份的工具程式,cpio命令可以複製檔案到歸檔包中,或者從歸檔包中複製檔案,這個命令挺有趣的,因為 cpio 可以備份任何東西,包括裝置裝置檔案,不過 cpio 有個大問題,那就是 cpio 不會主動的去找檔案來備份,一般來說 cpio 得要配合類似 find 等可以找到檔案的命令來告知 cpio 該被備份的資料在哪裡,好了廢話不多說,先看語法吧.

[[email protected] ~]# cpio --help

備份語法:[ cpio –cvBo > [檔案|裝置] ]

        -c              #使用portable format儲存方式
        -v              #顯示過程
        -B              #設定輸入輸出塊為512bytes
        -o              #進入copy-out模式(壓縮)

檢視語法:[ cpio –ivct < [cpio檔案] ]

        -i              #將資料從檔案複製到系統中

        -c              #使用portable format儲存方式
        -t              #檢視CPIO壓縮包內容

還原語法:[ cpio –idvcu < [cpio檔案] ]

        -i              #進入copy-in模式(解壓)
        -d              #恢復到指定位置(視壓縮方式恢復)
        -v              #顯示過程
        -c              #使用portable format儲存方式
        -u              #替換所有檔案,無提示

例項1:使用cpio -cvBo命令,來備份/etc/目錄

[[email protected] ~]# find /etc/ -print | cpio -cvBo > /root/etc.cpio

[[email protected] ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio

例項2:使用cpio -cvBo命令,將/etc/目錄下的內容備份到/sdb磁碟

[[email protected] ~]# find /etc/ -print | cpio -cvBo > /dev/vdb

例項3:使用cpio -ivct命令查詢,壓縮包內容

[[email protected] ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio

[[email protected] ~]# cpio -ivct < etc.cpio

例項4:使用cpio -idvcu還原檔案到/etc/目錄

[[email protected] ~]# ls -lh
total 109M
-rw-r--r--. 1 root root 109M Nov 16 10:50 etc.cpio

[[email protected] ~]# cpio -idvcu < /root/etc.cpio

◆dd 測速與拷貝◆

dd命令用於複製檔案並對原檔案的內容進行轉換和格式化處理,dd命令功能很強大的,對於一些比較底層的問題,使用dd命令往往可以得到出人意料的效果,用的比較多的還是用dd來備份裸裝置,但是不推薦,如果需要備份oracle裸裝置,可以使用rman備份,或使用第三方軟體備份,使用dd的話,管理起來不太方便,建議在有需要的時候使用dd對物理磁碟操作,如果是檔案系統的話還是使用tar backup cpio等其他命令更加方便,另外,使用dd對磁碟操作時,最好使用塊裝置檔案.

[[email protected] ~]# dd --help

備份語法:[ dd [if=原始檔] [of=輸出] [count=計數] ]

        if=檔名        #輸入檔名
        of=檔名        #輸出檔名
        bs=bytes        #讀入計數
        count=blocks    #僅拷貝blocks個塊
        /dev/zero       #是字元裝置會不斷返回0值位元組
        /dev/null       #空裝置,相當於一個垃圾桶
#將本地的 /dev/sda 整盤備份到 /dev/hdd
[[email protected] ~]# dd if=/dev/sda /of=/dev/hdd

#將 /dev/sda 全盤資料備份成指定路徑的image檔案
[[email protected] ~]# dd if=/dev/sda of=/tmp/image

#將image備份檔案恢復到指定盤/dev/sdb
[[email protected] ~]# dd if=/tmp/image of=/dev/sdb

#備份 /dev/sda 全盤資料,並利用gzip工具進行壓縮,儲存到指定路徑 /tmp/image.gz
[[email protected] ~]# dd if=/dev/sda | gzip > /tmp/image.gz

#恢復,將壓縮的備份檔案 /tmp/image.gz ,恢復到制定盤 /dev/sdb
[[email protected] ~]# gizp -dc /tmp/image.gz | dd of=/dev/sdb

#備份MBR,備份磁碟 /dev/sda 開始的512個位元組大小的MBR資訊到指定檔案 /tmp/mbr512
[[email protected] ~]# dd if=/dev/sda of=/tmp/mbr512 count=1 bs=512
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00015245 s, 3.4 MB/s

其中:count=1 指僅拷貝一個塊;bs=512 指塊大小為512個位元組

#恢復MBR,將備份 /tmp/mbr512 的MBR資訊寫到磁碟開始部分 /dev/sda
[[email protected] ~]# dd if=/tmp/mbr512 of=/dev/sda
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000201242 s, 2.5 MB/s

#拷貝記憶體內容到磁碟
[[email protected] ~]# dd if=/dev/mem of=/tmp/mem_image bs=1024(指定塊大小為1k)
dd: error reading ‘/dev/mem’: Bad address
632+0 records in
632+0 records out
647168 bytes (647 kB) copied, 0.001591 s, 407 MB/s

#拷貝光碟內容到指定資料夾,並儲存為/tmp/LyShark.iso檔案
[[email protected] ~]# dd if=/dev/sr0 of=/tmp/LyShark.iso
1249+0 records in
1248+0 records out
638976 bytes (639 kB) copied, 0.368021 s, 1.7 MB/s

#利用隨機數填充磁碟,徹底銷燬磁碟 /dev/sdb 資料
[[email protected] ~]# dd if=/dev/urandom of=/dev/sdb

#測試磁碟讀寫速度(可分別測試1024,2048,4096,8192)
[[email protected] ~]# dd if=/dev/zero of=/dev/null bs=1024 count=10000
10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.00852247 s, 1.2 GB/s

◆mkisofs 製作映象◆

mkisofs命令用來將指定的目錄與檔案做成ISO 9660格式的映像檔案,以供燒錄光碟,其實 mkisofs 有非常多好用的選項可以選擇,不過如果我們只是想要製作資料光碟時,下面介紹的的選項也就夠用了,光碟的格式一般稱為 iso9660 這種格式一般僅支援舊版的 DOS 檔名,亦即檔名只能以 8.3 (檔名8個位元組,副檔名3個位元組) 的方式存在,如果加上 -r 的選項之後,那麼檔案資訊能夠被記錄的比較完整,可包括UID/GID與許可權等.

下面我們來看一下它的基本引數吧.

[[email protected] ~]# mkisofs --help

命令語法:[ mkisofs [選項] 檔案或目錄 ]

        -o              #後面接映象名
        -r              #連同檔案屬性一起記錄
        -v              #顯示構建過程
        -m              #排除指定檔案
        -V              #新建volume

製作一個映象:通過mkisofs製作一個映象將/etc目錄製作成lyshark.iso.

[[email protected] ~]# mkisofs -r -v -o /root/lyshark.iso /etc/

[[email protected] ~]# ls -lh
total 123M
-rw-r--r--. 1 root root 123M Nov 16 11:14 lyshark.iso