(一)Linux備份策略(完全備份、增量備份和差異備份)詳解
常用的備份策略有完全備份和增量備份,而增量備份有可細(xì)分為累計(jì)增量備份和差異增量備份。下面來分別講述不同備份策略以及之間的區(qū)別。
完全備份
完全備份是指把所有需要備份的數(shù)據(jù)全部備份。當(dāng)然,完全備份可以備份整塊硬盤、整個(gè)分區(qū)或某個(gè)具體的目錄。對(duì)于?Linux?操作系統(tǒng)來說,完全備份指的就是將根目錄下的所有文件進(jìn)行備份。
完全備份的好處是,所有數(shù)據(jù)都進(jìn)行了備份,系統(tǒng)中任何數(shù)據(jù)丟失都能恢復(fù),且恢復(fù)效率較高。如果完全備份備份的是整塊硬盤,那么甚至不需要數(shù)據(jù)恢復(fù),只要把備份硬盤安裝上,服務(wù)器就會(huì)恢復(fù)正常。
完全備份的缺點(diǎn)也很明顯,那就是需要備份的數(shù)據(jù)量較大,備份時(shí)間較長(zhǎng),備份了很多無用數(shù)據(jù),占用的空間較大,所以完全備份不可能每天執(zhí)行。
我們一般會(huì)對(duì)關(guān)鍵服務(wù)器進(jìn)行整盤完全備份,如果出現(xiàn)問題,則可以很快地使用備份硬盤進(jìn)行替換,從而減少損失。我們甚至?xí)?duì)關(guān)鍵服務(wù)器搭設(shè)一臺(tái)一模一樣的服務(wù)器,這樣只要遠(yuǎn)程幾個(gè)命令(或使用?Shell 腳本自動(dòng)檢測(cè),自動(dòng)進(jìn)行服務(wù)器替換),備份服務(wù)器就會(huì)接替原本的服務(wù)器,使故障響應(yīng)時(shí)間大大縮短。
累計(jì)增量備份
在一個(gè)數(shù)據(jù)量很大的業(yè)務(wù)應(yīng)用中,每天對(duì) Linux 系統(tǒng)進(jìn)行完全備份是不現(xiàn)實(shí)的,這就需要用到增量備份策略。
累計(jì)增量備份是指先進(jìn)行一次完全備份,服務(wù)器運(yùn)行一段時(shí)間之后,比較當(dāng)前系統(tǒng)和完全備份的備份數(shù)據(jù)之間的差異,只備份有差異的數(shù)據(jù)。服務(wù)器繼續(xù)運(yùn)行,再經(jīng)過一段時(shí)間,進(jìn)行第二次增量備份。在進(jìn)行第二次增量備份時(shí),當(dāng)前系統(tǒng)和第一次增量備份的數(shù)據(jù)進(jìn)行比較,也是只備份有差異的數(shù)據(jù)。第三次增量備份是和第二次增量備份的數(shù)據(jù)進(jìn)行比較,以此類推。
因此,累計(jì)增量備份就是只備份每天增加或者變化的數(shù)據(jù),而不備份系統(tǒng)中沒有變動(dòng)的數(shù)據(jù)。我們畫一張示意圖,如圖 1 所示。

假設(shè)我們?cè)诘谝惶爝M(jìn)行一次完全備份。第二天增量備份時(shí),只會(huì)備份第二天和第一天之間的差異數(shù)據(jù),但是第二天的總備份數(shù)據(jù)是完全備份加第一次增量備份的數(shù)據(jù)。第三天增量備份時(shí),只會(huì)備份第三天和第二天之間的差異數(shù)據(jù),但是第三天的總備份數(shù)據(jù)是完全備份加第一次增量備份的數(shù)據(jù),再加第二次增量備份的數(shù)據(jù)。當(dāng)然,第四天增量備份時(shí),只會(huì)備份第四天和第三天的差異數(shù)據(jù),但是第四天的總備份數(shù)據(jù)是完全備份加第一次增量備份的數(shù)據(jù),加第二次增量備份的數(shù)據(jù),再加第三次增量備份的數(shù)據(jù)。
采用累計(jì)增量備份的好處是,每次備份需要備份的數(shù)據(jù)較少,耗時(shí)較短,占用的空間較小;壞處是數(shù)據(jù)恢復(fù)比較麻煩,如果是圖 1 的例子,那么當(dāng)進(jìn)行數(shù)據(jù)恢復(fù)時(shí),就要先恢復(fù)完全備份的數(shù)據(jù),再依次恢復(fù)第一次增量備份的數(shù)據(jù)、第二次增量備份的數(shù)據(jù)和第三次增量備份的數(shù)據(jù),最終才能恢復(fù)所有的數(shù)據(jù)。
差異增量備份
差異增量備份(后續(xù)簡(jiǎn)稱差異備份)也要先進(jìn)行一次完全備份,但是和累計(jì)增量備份不同的是,每次差異備份都備份和原始的完全備份不同的數(shù)據(jù)。也就是說,差異備份每次備份的參照物都是原始的完全備份,而不是上一次的差異備份。我們也畫一張示意圖,如圖 2 所示。

假設(shè)我們?cè)诘谝惶煲策M(jìn)行一次完全備份。第二天差異備份時(shí),會(huì)備份第二天和第一天之間的差異數(shù)據(jù),而第二天的備份數(shù)據(jù)是完全備份加第一次差異備份的數(shù)據(jù)。第三天進(jìn)行差異備份時(shí),仍和第一天的原始數(shù)據(jù)進(jìn)行對(duì)比,把第二天和第三天所有的數(shù)據(jù)都備份在第二次差異備份中,第三天的備份數(shù)據(jù)是完全備份加第二次差異備份的數(shù)據(jù)。第四天進(jìn)行差異備份時(shí),仍和第一天的原始數(shù)據(jù)進(jìn)行對(duì)比,把第二天、第三天和第四天所有的不同數(shù)據(jù)都備份到第三次差異備份中,第四天的備份數(shù)據(jù)是完全備份加第三次差異備份的數(shù)據(jù)。
相比較而言,差異備份既不像完全備份一樣把所有數(shù)據(jù)都進(jìn)行備份,也不像增量備份在進(jìn)行數(shù)據(jù)恢復(fù)時(shí)那么麻煩,只要先恢復(fù)完全備份的數(shù)據(jù),再恢復(fù)差異備份的數(shù)據(jù)即可。不過,隨著時(shí)間的增加,和完全備份相比,變動(dòng)的數(shù)據(jù)越來越多,那么差異備份也可能會(huì)變得數(shù)據(jù)量龐大、備份速度緩慢、占用空間較大。
一個(gè)比較的備份策略是,對(duì)于數(shù)據(jù)量不大,并且每天數(shù)據(jù)量增加不多的系統(tǒng),優(yōu)先選擇完全備份;對(duì)于數(shù)據(jù)量巨大,每天新增數(shù)據(jù)也很多的系統(tǒng),視情況選擇差異備份或者增量備份。
(二)Linux tar命令備份數(shù)據(jù)
作為Linux系統(tǒng)管理員,最經(jīng)常使用的備份工具就是 tar 和 cpio 命令。前面在介紹備份介質(zhì)時(shí),已經(jīng)使用了 tar 命令,此命令其實(shí)是一個(gè)文件打包命令,經(jīng)常在備份文件的場(chǎng)合中使用。
使用 cpio 命令進(jìn)行數(shù)據(jù)備份,請(qǐng)閱讀Linux提取RPM包文件(cpio命令)
有關(guān) tar 命令的基本用法,請(qǐng)閱讀Linux tar壓縮命令一節(jié),這里不再過多贅述。下面通過 tar 命令做的一個(gè) Web 服務(wù)器的備份腳本,詳細(xì)了解 tar 命令作為備份工具時(shí)的具體用法。
以下是一個(gè)有關(guān) Web 服務(wù)器的備份腳本:
#!/bin/sh
BAKDATE='date +%y%m%d'
DATA3='date -d "3 days ago" +%y%m%d'
osdata=/disk1
userdata=/disk2
echo "backup OS data starting"
tar -zcvf /$osdata/etc.data/etc_$BAKDATE.tar.gz /etc
tar -zcvf /$osdata/boot.data/boot_$BAKDATE.tar.gz /boot
tar -zcvf /$osdata/home.data/home_$BAKDATE.tar.gz /home
tar -zcvf /$osdata/root.data/root_$BAKDATE.tar.gz /root
tar -zcvf /$userdata/usr_data/usrlocal_$BAKDATE.tar.gz /usr/local
tar -zcvf /$userdata/var_www/www_$BAKDATE.tar.gz /var/www
cp -r /$osdata/* /$userdata
cp -r /$userdata/* /$osdata
echo "Backup OS data complete!"
echo "delete OS data 3 days ago"
rm -rf /$osdata/etc.data/etc_$DATA3.tar.gz
rm -rf /$osdata/boot.data/boot_$DATA3.tar.gz
rm -rf /$osdata/home.data/home_$DATA3.tar.gz
rm -rf /$osdata/root.data/root_$DATA3.tar.gz
rm -rf /$osdata/usr_data/usrlocal_$DATA3.tar.gz
rm -rf /$osdata/var_www/www_$DATA3.tar.gz
rm -rf /$userdata/etc.data/etc_$DATA3.tar.gz
rm -rf /$userdata/boot.data/boot_$DATA3.tar.gz
rm -rf /$userdata/home.data/home_$DATA3.tar.gz
rm -rf /$userdata/root.data/root_$DATA3.tar.gz
rm -rf /$userdata/usr_data/usrlocal_$DATA3.tar.gz
rm -rf /$userdata/var_www/www_$DATA3.tar.gz
echo "delete cws ok!"
上面這段腳本完成的工作是,將系統(tǒng)和用戶的備份數(shù)據(jù)分別保存在兩個(gè)不同的本地磁盤 disk1 和 disk2 中,并且保留最近 3 天的數(shù)據(jù),3 天前的數(shù)據(jù)自動(dòng)刪除。主要備份的數(shù)據(jù)有 /etc 目錄、/boot 目錄、/home 目錄、/root 目錄、/usr/local 目錄和 /var/www 目錄。當(dāng)然這里只是舉個(gè)例子,凡是存放數(shù)據(jù)的重要目錄,都需要進(jìn)行備份。
將此腳本放到系統(tǒng)守護(hù)進(jìn)程(類似于 Windows 下的計(jì)劃任務(wù))crontab 下,設(shè)定備份時(shí)間,即可實(shí)現(xiàn)定時(shí)數(shù)據(jù)備份。有關(guān) crontab 的詳細(xì)介紹,請(qǐng)閱讀《Linux crontab命令》。
(三)Linux dump命令用法詳解:備份分區(qū)、文件或目錄
在系統(tǒng)學(xué)習(xí) dump 命令之前,由于 CentOS 6.x 系統(tǒng)默認(rèn)是沒有安裝此命令的,因此需要我們手動(dòng)安裝 dump 命令,安裝命令如下:
[root@localhost ~]# yum -y install dump
dump 命令使用“備份級(jí)別”來實(shí)現(xiàn)增量備份,它支持 0~9 共 10 個(gè)備份級(jí)別。其中,0 級(jí)別指的就是完全備份,1~9 級(jí)別都是增量備份級(jí)別。
舉個(gè)列子,當(dāng)我們備份一份數(shù)據(jù)時(shí),第一次備份應(yīng)該使用 0 級(jí)別,會(huì)把所有數(shù)據(jù)完全備份一次;第二次備份就可以使用 1 級(jí)別了,它會(huì)和 0 級(jí)別進(jìn)行比較,把 0 級(jí)別備份之后變化的數(shù)據(jù)進(jìn)行備份;第三次備份使用? 2 級(jí)別,2 級(jí)別會(huì)和 1 級(jí)別進(jìn)行比較,把 1 級(jí)別備份之后變化的數(shù)據(jù)進(jìn)行備份,以此類推。
需要注意的是,只有在備份整個(gè)分區(qū)或整塊硬盤時(shí),才能支持 1~9 的增量備份級(jí)別;如果只是備份某個(gè)文件或不是分區(qū)的目錄,則只能使用 0 級(jí)別進(jìn)行完全備份。
dump 命令的基本格式如下:
[root@localhost ~]# dump [選項(xiàng)] 備份之后的文件名 原文件或目錄
選項(xiàng):
-level:就是我們說的 0~9 共 10 個(gè)備份級(jí)別;
-f? 文件名:指定備份之后的文件名;
-u:備份成功之后,把備份時(shí)間、備份級(jí)別以及實(shí)施備份的文件系統(tǒng)等信息,都記錄在 /etc/dumpdates 文件中;
-v:顯示備份過程中更多的輸出信息;
-j:調(diào)用 bzlib 庫(kù)壓縮備份文件,其實(shí)就是把備份文件壓縮為 .bz2 格式,默認(rèn)壓縮等級(jí)是 2;
-W:顯示允許被 dump 的分區(qū)的備份等級(jí)及備份時(shí)間;
dump 命令是一個(gè)較為復(fù)雜的命令,如果我們只是想要實(shí)現(xiàn)數(shù)據(jù)的備份與恢復(fù),那么掌握以上幾個(gè)選項(xiàng)就足夠了。
備份分區(qū)
我們先來看看如何使用 0 級(jí)別備份分區(qū)。命令如下:
[root@localhost ~]# df -h
文件系統(tǒng)? 容量 已用 可用 已用% 掛載點(diǎn)
/dev/sda3?? 20G 3.0G 16G 17% /
tmpfs?? 30 6M 0 30 6M 0% /dev/shm
/dev/sda1?? 194M 26M 158M 15% /boot
/dev/sr0?? 3.5G 3.5G 0 100% /mnt/cdrom
#系統(tǒng)中我們就分了/分區(qū)和/boot分區(qū)。根分區(qū)太大,備份速度太慢,我們還是備份/boot分區(qū)吧
[rootSlocalhost ~]# dump -0uj -f /root/boot.bak.bz2 /boot/
#備份命令。先執(zhí)行一次完全備份,并壓縮和更新備份時(shí)間
DUMP: Date of this level 0 dump: Wed Jun 5 03:08:22 2013
#備份的級(jí)別和時(shí)間
DUMP: Dumping /dev/sdal (/boot) to /root/boot.bak.bz2
#備份源和目標(biāo)
DUMP: Label: none
#分區(qū)沒有卷標(biāo)
DUMP: Writing 10 Kilobyte records
DUMP: Compressing output at compression level 2 (bzlib)
#備份時(shí)壓縮
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 21846 blocks.
DUMP: Volume 1 started with block 1 at: Wed Jun 5 03:08:22 2013
DUMP: dumping (Pass III) [directories]
#開始dump 備份
DUMP: dumping (Pass XV) [regular files]
DUMP: Closing /root/boot.bak.bz2
#備份結(jié)朿,生成備份文件
DUMP: Volume 1 completed at: Wed Jun 5 03:08:30 2013
DUMP: Volume 1 took 0:00:08
DUMP: Volume 1 transfer rate: 2370 kB/s
DUMP: Volume 1 21930kB uncompressed, 18962kB compressed, 1.157:1
#數(shù)據(jù)容量
DUMP: 2X930 blocks (21.42MB) on 1 volume(s)
DUMP: finished in 7 seconds, throughput 3132 kBytes/sec
DUMP: Date of this level 0 dump: Wed Jun 5 03:08:22 2013
DUMP: Date this dump completed: Wed Jun 5 03:08:30 2013
DUMP: Average transfer rate: 2370 kB/s
DUMP: Wrote 21930kB uncompressed, 18962kB compressed, 1.157:1
[root@localhost ~]# cat /etc/dumpdates
#查看備份時(shí)間文件
/dev/sdal 0 Wed Jun 5 03:08:22 2013 +0800
#備份的分區(qū) 備份級(jí)別 備份曰期
[root@localhost @]# 11 -h /root/boot.bak.bz2
-rw-r--r--. 1 root root 19M 6 月 5 03:08 /root/boot.bak.bz2
#備份文件生成了
如果 /boot 分區(qū)的內(nèi)容發(fā)生了變化,則可以使用 1 級(jí)別進(jìn)行增量備份。當(dāng)然,如果數(shù)據(jù)會(huì)繼續(xù)發(fā)生變化,則可以繼續(xù)使用 2~9 級(jí)別增量備份。命令如下:
[root@localhost ~]# ll -h /root/install.log
-rw-r--r--.1 root root 25K 4月 10 21:49 /root/install.log
#查看安裝軟件包日志的大小為25KB
[root@localhost ~]# cp install.log /boot/
#復(fù)制日志文件到/boot分區(qū)
[root@localhost ~]# dump -1uj -f /root/boot.bak1.bz2 /boot/
#增量備份/boot分區(qū),并壓縮
[root@localhost ~]# ll -h boot.bak*
-rw-r--r--.1 root root 18K 6月 5 03:16 boot.bak1.bz2
-rw-r--r--.1 root root 19M 6月 5 03:08 boot.bak.bz2
#boot.bak1.bz2壓縮文件只有18KB,證明增量備份只備份了0級(jí)別以后變化的數(shù)據(jù)
#boot.bak1.bz2壓縮文件只有18KB,證明增量備份只備份了0級(jí)別以后變化的數(shù)據(jù)
如果備份的是整個(gè)分區(qū),那么是可以使用“dump -W”命令來查詢分區(qū)的備份時(shí)間及備份級(jí)別的。不過要注意,如果備份時(shí)沒有使用“-u”選項(xiàng),那么“dump -W”命令是不會(huì)記錄備份的時(shí)間和級(jí)別的。命令如下:
[root@localhost ~]# dump -W
Last dump(s) done (Dump '>' file systems):
/dev/sda3 ( /) Last dump:Level 1, Date Wed Jun 5 02:31:50 2013
/dev/sda1 ( /boot) Last dump:Level 1, Date Wed Jun 5 03:16:27 2013
#我的/分區(qū)和/boot分區(qū)都進(jìn)行過dump備份,/boot分區(qū)的最新備份級(jí)別是1
dump命令可以非常方便地實(shí)現(xiàn)增量備份,但是如何實(shí)現(xiàn)差異備份呢?其實(shí)也很簡(jiǎn)單,先使用 0 級(jí)別完全備份一次,以后的每次備份都使用 1 級(jí)別進(jìn)行備份。
備份文件或目錄
dump 命令也可以文件或目錄,不過,只要不是備份分區(qū),就只能使用 0 級(jí)別進(jìn)行完全備份,而不再支持增量備份。同時(shí),不能使用“-u”選項(xiàng)更新分區(qū)的備份時(shí)間,當(dāng)然也不能使用“dump -W”命令查詢到文件或目錄的備份。
我們說 /etc/ 目錄是重要的配置文件目錄,那么我們就備份這個(gè)目錄來看看吧。命令如下:
[root@localhost ~]# dump -0j -f /root/etc.dump.bz2 /etc/
#完全備份/etc/目錄
[root@localhost ~]# ll -h /root/etc.dump.bz2
-rw-r--r--.1 root root 8.6M 6月 5 03:26 /root/etc.dump.bz2
#查看備份文件
不過,如果使用增量備份會(huì)怎么樣呢?命令如下:
[root@localhost ~]# dump -1j -f /root/etc.dump1.bz2 /etc/
DUMP:Only level 0 dumps are allowed on a subdirectory
DUMP:The ENTIRE dump is aborted.
#備份失敗了,目錄備份只能使用0級(jí)別
(四)Linux restore命令:還原dump操作備份下的文件、目錄或分區(qū)
restore 命令是 dump 命令的配套命令,dump 命令是用來備份分區(qū)和數(shù)據(jù)的,而 restore 命令是用來恢復(fù)數(shù)據(jù)的。
restore 命令的基本格式如下:
[root@localhost ~]# restore [模式選項(xiàng)] [-f]
此命令中,-f 選項(xiàng)用于指定備份文件的文件名;restore 命令常用的模式有以下 4 種,這 4 種模式不能混用:
-C:比較備份數(shù)據(jù)和實(shí)際數(shù)據(jù)的變化。如果實(shí)際數(shù)據(jù)中的現(xiàn)有數(shù)據(jù)發(fā)生了變化,那么這個(gè)選項(xiàng)能夠檢測(cè)到這個(gè)變化。但是如果實(shí)際數(shù)據(jù)中新增了數(shù)據(jù),那么這個(gè)選項(xiàng)是不能檢測(cè)到變化的。舉個(gè)例子:別人給我了 100 萬元投資(實(shí)際數(shù)據(jù)),但是他有一個(gè)投資的賬本(備份數(shù)據(jù)),他要時(shí)不時(shí)地比對(duì)賬本和實(shí)際的 100 萬元投資,如果 100 萬元減少則馬上就能發(fā)現(xiàn)改變;但是如果投資增加,則不會(huì)報(bào)警;
-i:進(jìn)入交互模式,手工選擇需要恢復(fù)的文件;
-t:查看模式,用于查看備份文件中擁有哪些數(shù)據(jù);
-r:還原模式,用于數(shù)據(jù)還原;
【例 1】比較備份數(shù)據(jù)和實(shí)際數(shù)據(jù)的變化。
這里大家需要注意,數(shù)據(jù)比較只有在原有數(shù)據(jù)減少或發(fā)生變化時(shí)才能檢測(cè)到變化,而新增的數(shù)據(jù)是不會(huì)被檢測(cè)到的。命令如下:
[root@localhost ~]# touch /boot/abc
#在/boot/目錄中新建abc文件
[root@localhost ~]# restore -C -f /root/boot.bak.bz2
Dump tape is compressed.
Dump date:Wed Jun 5 08:20:02 2013
Dumped from:the epoch
Level 0 dump of /boot on localhost:/dev/sda1
Label:none
filesys = /boot
#restore檢測(cè),沒有發(fā)現(xiàn)任何變化(當(dāng)然,因?yàn)閭浞輸?shù)據(jù)在備份時(shí)沒有abc文件,所以restore命令是不能識(shí)別新建文件的)
[root@localhost ~]# mv /boot/vmlinuz-2.6.32-279.el6.i686 /boot/vmlinuz-2.6.32-279.el6.i686.bak
#把/boot/目錄中的內(nèi)核鏡像文件改一個(gè)名字
[root@localhost ~]# restore -C -f /root/boot.bak.bz2
Dump tape is compressed.
Dump date:Wed Jun 5 08:20:02 2013
Dumped from:the epoch
Level 0 dump of /boot on localhost:/dev/sda1
Label:none
filesys = /boot
restore:unable to stat ./vmlinuz-2.6.32-279.el6.i686:No such file or directory Some files were modified! 1 compare errors
#restore發(fā)現(xiàn)內(nèi)核鏡像文件丟失
這個(gè)實(shí)驗(yàn)比較危險(xiǎn),一定要記得把內(nèi)核鏡像文件的名字改回來,否則一旦重啟,系統(tǒng)就會(huì)無法正常啟動(dòng)。
[root@localhost ~]# mv /boot/vmlinuz-2.6.32-279.el6.i686.bak /boot/vmlinuz2.6.32-279.el6.i686
【例 2】查看模式。
這種模式比較簡(jiǎn)單,就是查看備份文件中到底包含什么內(nèi)容。命令如下:
[root@localhost ~]# restore -t -f boot.bak.bz2
Dump tape is compressed.
#備份數(shù)據(jù)是壓縮的
Dump date:Wed Jun 5 08:20:02 2013
#數(shù)據(jù)備份時(shí)間
Dumped from:the epoch
Level 0 dump of /boot on localhost:/dev/sda1
#備份等級(jí)
Label:none
#分區(qū)的卷標(biāo),沒有設(shè)定卷標(biāo)
2.
11 ./lost+found
12 ./grub
24 ./grub/grub.conf
13 ./grub/splash.xpm.gz
…省略部分輸出…
【例 3】還原模式
restore 命令的還原模式既可以用于還原整個(gè)分區(qū),也可以用于還原文件或目錄。命令格式是一樣的,不過要注意,如果要還原增量備份的數(shù)據(jù),則一定要先還原完全備份的數(shù)據(jù)。命令如下:
#還原boot.bak.bz2分區(qū)備份
#先還原完全備份的數(shù)據(jù)
[root@localhost ~]# mkdir boot.test
#建立準(zhǔn)備解壓縮的目錄。當(dāng)然,如果這個(gè)目錄是我新建的分區(qū),就可以直接把數(shù)據(jù)恢復(fù)到分區(qū)中
[root@localhost ~]# cd boot.test/
#進(jìn)入解壓縮目錄
[root@localhost boot.test]# restore -r -f /root/boot.bak.bz2
Dump tape is compressed.
#備份數(shù)據(jù)是壓縮數(shù)據(jù)
#解壓縮
[root@localhost boot.test]#ll
#查看一下解壓縮的文件
總用量21300
-rw-r--r--. 1 root root 106611 6月 22 2012 config-2.6.32-279.el6.i686 drwxr-xr-x. 3 root root 4096 4 月 10 21:47 efi drwxr-xr-x. 2 root root 4096 4 月 10 21:49 grub
-rw-r--r--. 1 root root 14708399 4 月 10 21:49 initrara£s-2.6.32-279.el6.i686.img
drwx------. 2 root root 4096 4 月 10 21:44 lost+found
-rw-------. 1 root root 47504 6 月 5 09:44 restoresymtable
-rw-r--r--. 1 root root 175903 6 月 22 2012 symvers-2.6.32-279.el6.i686.gz
-rw-r--r--. 1 root root 1846041 6 月 22 2012 System.map-2.6.32-279.el6.i686
-rw-r--r--. 1 root root 1048576 6 月 5 02:38 test
-rwxr-xr-x. 1 root root 3856608 6 月 22 2012 vmlinuz-2.6.32-279.el6.i686
#再還原增量備份的數(shù)據(jù)
[root@localhost boot.test]# restore -r -f /root/boot.bakl.bz2
Dump tape is compressed.
#恢復(fù)增量備份的數(shù)據(jù)
[root@localhost boot.test]# ll
總用量21328
-rw-r--r--. 1 root root 106611 6 月 22 2012 config-2.6.32-279.el6.i686
drwxr-xr-x. 3 root root 4096 4 月 10 21:47 efi
drwxr-xr-x. 2 root root 4096 4 月 10 21:49 grub
-rw-r--r--. 1 root root 14708399 4 月 10 21:49 initramfs-2.6.32-279.eX6.i686.img
-rw-r--r--. 1 root root 24772 6 月 5 08:20 install. log
#增量備份的install.log文件被恢復(fù)了
drwx------. 2 root root 4096 4 月 10 21:44 lost+found
-rw-------. 1 root root 47552 6 月 5 09:57 restoresymtable
-rw-r--r--. 1 root root 175903 6 月 22 2012 symvers-2.6.32-279.el6.i686.gz
-rw-r--r--. 1 root root 1846041 6 月 22 2012 System.map-2.6.32-279.el6.i686
-rw-r--r--. 1 root root 1048576 6 月 5 02:38 test
-rwxr-xr-x. 1 root root 3856608 6月? 22 2012 vmlinuz-2.6.32-279.el6.i686
我們?cè)賮磉€原/etc/目錄的備份etc.dump.bz2,其實(shí)還原的方法是完全一樣的。命令如下:
[root@localhost ~]# restore -r -f etc.dump.bz2
Dump tape is compressed.
#還原etc.dump.bz2備份
[root@localhost ~]# ll -d /root/etc
drwxr-xr-x.103 root root 12288 6月 5 07:45 /root/etc
#在root下生成了etc目錄,里面的數(shù)據(jù)和/etc/目錄中的數(shù)據(jù)完全一致
(五)Linux dd命令詳解:數(shù)據(jù)備份,并在備份過程中進(jìn)行格式轉(zhuǎn)換
dd 命令主要用來進(jìn)行數(shù)據(jù)備份,并且可以在備份的過程中進(jìn)行格式轉(zhuǎn)換。其實(shí) dd 命令可以把源數(shù)據(jù)復(fù)制成目標(biāo)數(shù)據(jù),而且不管源數(shù)據(jù)是文件、分區(qū)、磁盤還是光盤,都可以進(jìn)行數(shù)據(jù)備份。
dd 命令的基本格式如下:
[root@localhost ~]# dd if="輸入文件" of="輸出文件" bs="數(shù)據(jù)塊" count="數(shù)量"
參數(shù):
if:定義輸入數(shù)據(jù)的文件,也可以是輸入設(shè)備;
of:定義輸出數(shù)據(jù)的文件,也可以是輸出設(shè)備;
bs:指定數(shù)據(jù)塊的大小,也就是定義一次性讀取或?qū)懭攵嗌僮止?jié)。模式數(shù)據(jù)塊大小是 512 字節(jié);
count:指定 bs 的數(shù)量;
conv=標(biāo)志:依據(jù)標(biāo)志轉(zhuǎn)換文件。標(biāo)志有以下這些:
ascii:由 EBCDIC 碼轉(zhuǎn)換至?ASCII?碼;
ebcdic:由 ASCII 碼轉(zhuǎn)換至 EBCDIC 碼;
ibm:由 ASCII 碼轉(zhuǎn)換至替換的 EBCDIC 碼;
block:將結(jié)束字符塊里的換行替換成等長(zhǎng)的空格;
unblock:將 cbs 大小的塊中尾部的空格替換為一個(gè)換行符;
lcase:將大寫字符轉(zhuǎn)換為小寫;
notrunc:不截?cái)噍敵鑫募?/p>
ucase:將小寫字符轉(zhuǎn)換為大寫;
swab:交換每一對(duì)輸入數(shù)據(jù)字節(jié);
noerror:讀取數(shù)據(jù)發(fā)生錯(cuò)誤后仍然繼續(xù);
sync:將每個(gè)輸入數(shù)據(jù)塊以 NUL 字符填滿至 ibs 的大小;當(dāng)配合 block 或 unblock 時(shí),會(huì)以空格代替 NUL 字符填充;
【例 1】備份文件
[root@localhost ~]# dd if=/etc/httpd/conf/httpd.conf of=/tmp/httpd.bak
記錄了67+1 的讀入
#數(shù)據(jù)占了寫滿的67個(gè)數(shù)據(jù)塊,以及1個(gè)沒有寫滿的數(shù)據(jù)塊
記錄了67+1 的寫出
#默認(rèn)數(shù)據(jù)塊大小是512字節(jié)
34439字節(jié)(34 kB)已復(fù)制,0.0524897 秒,656 kB/秒
#如果要備份文件,那么dd命令和cp命令非常類似
[root@localhost ~]# ll -h /tmp/httpd.bak
-rw-r--r--.1 root root 34K 6月 5 18:04 /tmp/httpd.bak
#查看一下生成的備份文件的大小
【例 2】備份分區(qū)為一個(gè)備份文件
[root@localhost ~]# df -h
文件系統(tǒng) 容量 已用 可用 已用%% 掛載點(diǎn)
/dev/sda3 20G 2.0G 17G 11% /
tmpfs 306M 0 306M 0% /dev/shm
/dev/sda1 194M 27M 157M 15% /boot
/dev/sr0 3.5G 3.5G 0 100% /mnt/cdrom
#查看一下分區(qū)容量,我們備份/boot分區(qū)
[root@localhost ~]# dd if=/dev/sda1 of=/tmp/boot.bak
#備份完成
[root@localhost ~]# ll -h /tmp/boot.bak
-rw-r--r--.1 root root 200M 6月 5 18:14 /tmp/boot.bak
#查看生成的備份文件
#如果需要恢復(fù),則執(zhí)行以下命令
[root@localhost ~]# dd if=/tmp/boot.bak of=/dev/sda1
如果想要把分區(qū)直接備份成另一個(gè)分區(qū),就需要生成一個(gè)新的分區(qū),這個(gè)分區(qū)的大小不能比源分區(qū)小,只能和源分區(qū)大小一致或比它大。命令如下:
[root@localhost ~]# dd if=/dev/sda1 of=/dev/sdb1
#如果需要恢復(fù),則只需把輸入項(xiàng)和輸出項(xiàng)反過來即可,命令如下
[root@localhost ~]# dd if=/dev/sdb1 of=/dev/sda1
【例 3】整盤備份
[root@localhost ~]# dd if=/dev/sda of=/dev/sdb
#把磁盤a備份到磁盤b
[root@localhost ~]# dd if=/dev/sda of=/tmp/disk.bak
#把磁盤a備份成文件disk.bak
#備份恢復(fù)
#如果要備份到另一塊硬盤上,那么,當(dāng)源硬盤數(shù)據(jù)損壞時(shí),只需用備份硬盤替換源硬盤即可
#如果要備份成文件,那么在恢復(fù)時(shí)需要把備份數(shù)據(jù)復(fù)制到其他Linux中,然后把新硬盤安裝到這臺(tái)Linux
#服務(wù)器上,再把磁盤備份數(shù)據(jù)復(fù)制到新硬盤中。命令如下
[root@localhost ~]# dd if=/tmp/disk.bak of=/dev/sdb
【例 4】復(fù)制軟盤
[root@localhost ~]# dd if=/dev/fd0 of=/tmp/fd.bak
#在Linux中軟盤的設(shè)備文件名是/dev/fd0
#這條命令先把軟盤中的數(shù)據(jù)保存為臨時(shí)數(shù)據(jù)文件
[root@localhost ~]# dd if=/tmp/fd.bak of=/dev/fd0
#然后更換新的軟盤,把數(shù)據(jù)備份復(fù)制到新軟盤中,就實(shí)現(xiàn)了軟盤的復(fù)制
如果需要備份的是光盤,那么在 Linux 中就是使用 dd 命令制作光盤的 ISO 鏡像的。命令如下:
#制作光盤ISO鏡像
[root@localhost ~]# dd if=/dev/cdrom of-/tmp/cd.iso #把光盤中所有的數(shù)據(jù)制作成ISO鏡像
[root@localhost ~J # mkdir /mnt/cd
#建立一個(gè)新的掛載點(diǎn)
[root@localhost ~]# mount -o loop /tmp/cd.iso /mnt/cd #掛栽ISO文件到掛載點(diǎn)
[root@localhost ~]# cd /mnt/cd
#進(jìn)入掛栽點(diǎn)
[root@localhost cd]# ls
CentOS_BuildTag images RELEASE-NOTES-en-tJS.html RPM-GPG-KEY-CentOS-Debug-6 TRANS.TBL
EULA??? isolinux repodata?? RPM-GPG-KEY-CentOS-Security-6
GPL Packages RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Testing-6
#數(shù)據(jù)是光盤當(dāng)中的數(shù)據(jù),這個(gè)ISO鏡像是可以被當(dāng)作真正的光盤使用的
我們有時(shí)需要制作指定大小的文件,比如,在增加 swap 分區(qū)時(shí),就需要建立指定大小的文件,這時(shí)也使用 dd 命令。命令如下:
[root@localhost ~]# dd if=/dev/zero of=/tmp/testfile bs=1M count=10
#數(shù)據(jù)輸入項(xiàng)是/dev/zero會(huì)向目標(biāo)文件中不停地寫入二進(jìn)制的0
#指定數(shù)據(jù)塊大小是1MB
#指定生成10個(gè)數(shù)據(jù)塊。也就是定義輸出的文件大小為10MB
記錄了10+0 的讀入
#顯示數(shù)據(jù)占滿了10個(gè)數(shù)據(jù)塊
記錄了10+0 的寫出
#不過這里數(shù)據(jù)塊的大小已經(jīng)是1MB了
10485760字節(jié)(10 MB)已復(fù)制,0.00709902 秒,1.5 GB/秒
[root@localhost ~]# ll -h /tmp/testfile
-rw-r--r--.1 root root 10M 6月 5 18:46 /tmp/testfile
#生成的testfile文件的大小剛好是10MB
dd 命令在進(jìn)行整盤復(fù)制時(shí),類似于 GHOST 工具的功能,不過通過 dd 命令復(fù)制出來的硬盤數(shù)據(jù)要比 GHOST 復(fù)制出來的硬盤數(shù)據(jù)穩(wěn)定得多。雖然 dd 命令功能強(qiáng)大,不過也有一個(gè)明顯的缺點(diǎn),就是復(fù)制的時(shí)間較長(zhǎng),復(fù)制 100GB 的數(shù)據(jù)需要 15~25 分鐘(根據(jù)服務(wù)器的性能不同而不同)。
實(shí)現(xiàn)數(shù)據(jù)備份還有非常多的方法和工具,比如 tar 和 cpio 命令。至于網(wǎng)絡(luò)復(fù)制工具,如 rsync 和 scp 等,需要較完善的網(wǎng)絡(luò)知識(shí)才能夠?qū)W習(xí),這里不再介紹。
(六)Linux rsync命令用法詳解:支持本地備份和遠(yuǎn)程備份
在?Linux?系統(tǒng)下,數(shù)據(jù)備份的工具很多,除了前面介紹了 tar、cpio、dd 命令之外,本節(jié)再介紹一個(gè)用來備份數(shù)據(jù)的命令,就是?rsync。
從字面意思上,rsync 可以理解為 remote sync(遠(yuǎn)程同步),但它不僅可以遠(yuǎn)程同步數(shù)據(jù)(類似于 scp 命令),還可以本地同步數(shù)據(jù)(類似于 cp 命令)。不同于 cp 或 scp 的一點(diǎn)是,使用 rsync 命令備份數(shù)據(jù)時(shí),不會(huì)直接覆蓋以前的數(shù)據(jù)(如果數(shù)據(jù)已經(jīng)存在),而是先判斷已經(jīng)存在的數(shù)據(jù)和新數(shù)據(jù)的差異,只有數(shù)據(jù)不同時(shí)才會(huì)把不相同的部分覆蓋。
在系統(tǒng)學(xué)習(xí) rsync 命令之前,請(qǐng)確認(rèn)你的 Linux 系統(tǒng)中已經(jīng)安裝有此命令,如果沒有,可以直接使用 yum install -y rsync 命令安裝。
講解 rsync 用法之前,為了讓大家對(duì)此命令有一個(gè)整體的認(rèn)識(shí),這里先舉個(gè)例子:
[root@localhost ~]# rsync -av /etc/passwd /tmp/1.txt
sending incremental file list
sent 34 bytes? received 15 bytes? 98.00 bytes/sec
total size is 1432? speedup is 29.22
此例中,通過執(zhí)行 rsync 命令,實(shí)現(xiàn)了將 /etc/passwd 文件本地同步到 /tmp/ 目錄下,并改名為 1.txt。
除此之外,rsync 命令還支持遠(yuǎn)程同步數(shù)據(jù),也就是將本地的數(shù)據(jù)備份到遠(yuǎn)程機(jī)器上。比如說,我們知道遠(yuǎn)程機(jī)器的 IP 地址為 192.168.188.128,則使用 rsync 命令備份 passwd 文件的執(zhí)行命令為:
[root@localhost ~]# rsync -av /etc/passwd 192.168.188.128:/tmp/1.txt
The authenticity of host '192.168.188.128 (192.168.188.128)' can't be established.
ECDSA key fingerprint is 26:e3:97:e7:bb:ae:17:33:ea:aa:Oc:5f:37:Oe:9e:fa.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.l68.l88.l28' (ECDSA) to the list of known hosts.
root@192.168.188.128's password: <-- 輸入密碼
sending incremental file list
sent 31 bytes received 12 bytes 7.82 bytes/sec
total size is 1432 speedup is 54.91
注意,首次遠(yuǎn)程連接時(shí),會(huì)提示是否要繼續(xù)連接,輸入 yes 即可。另外,當(dāng)成功建立連接后,需要輸入目標(biāo)系統(tǒng)的 root 密碼。
通過以上 2 個(gè)實(shí)例,讀者應(yīng)該能對(duì)“rsync既支持本地備份數(shù)據(jù),還支持遠(yuǎn)程備份數(shù)據(jù)”有了直觀的認(rèn)識(shí)。那么,rsync 命令要怎樣使用呢?
rsync 命令的基本格式有多種,分別是:
[root@localhost ~]# rsync [OPTION] SRC DEST
[root@localhost ~]# rsync [OPTION] SRC [USER@]HOST:DEST
[root@localhost ~]# rsync [OPTION] [USER@]HOST:SRC DEST
[root@localhost ~]# rsync [OPTION] [USER@]HOST::SRC DEST
[root@localhost ~]# rsync [OPTION] SRC [USER@]HOST::DEST
針對(duì)以上 5 種命令格式,rsync 有 5 種不同的工作模式:
第一種用于僅在本地備份數(shù)據(jù);
第二種用于將本地?cái)?shù)據(jù)備份到遠(yuǎn)程機(jī)器上;
第三種用于將遠(yuǎn)程機(jī)器上的數(shù)據(jù)備份到本地機(jī)器上;
第四種和第三種是相對(duì)的,同樣第五種和第二種是相對(duì)的,它們各自之間的區(qū)別在于登陸認(rèn)證時(shí)使用的驗(yàn)證方式不同。
要知道,使用 rsync 在遠(yuǎn)程傳輸數(shù)據(jù)(備份數(shù)據(jù))前,是需要進(jìn)行登陸認(rèn)證的,這個(gè)過程需要借助 ssh 協(xié)議或者 rsync 協(xié)議才能完成。在 rsync 命令中,如果使用單個(gè)冒號(hào)(:),則默認(rèn)使用 ssh 協(xié)議;反之,如果使用兩個(gè)冒號(hào)(::),則使用 rsync 協(xié)議。
ssh 協(xié)議和 rsync 協(xié)議的區(qū)別在于,rsync 協(xié)議在使用時(shí)需要額外配置,增加了工作量,但優(yōu)勢(shì)是更加安全;反之,ssh 協(xié)議使用方便,無需進(jìn)行配置,但有泄漏服務(wù)器密碼的風(fēng)險(xiǎn)。
另外,以上幾種格式中各個(gè)參數(shù)的含義如下:
SRC:用來表示要備份的目標(biāo)數(shù)據(jù)所在的位置(路徑);
DEST:用于表示將數(shù)據(jù)備份到什么位置;
USER@:當(dāng)做遠(yuǎn)程同步操作時(shí),需指明系統(tǒng)登錄的用戶名,如果不顯示指定,默認(rèn)為以 root 身份登錄系統(tǒng)并完成同步操作。
rsync 命令提供使用的 OPTION 及功能如表 1 所示。
表 1 rsync 選項(xiàng)及功能
OPTION選項(xiàng)功能
-a這是歸檔模式,表示以遞歸方式傳輸文件,并保持所有屬性,它等同于-r、-l、-p、-t、-g、-o、-D 選項(xiàng)。-a 選項(xiàng)后面可以跟一個(gè) --no-OPTION,表示關(guān)閉 -r、-l、-p、-t、-g、-o、-D 中的某一個(gè),比如-a --no-l 等同于 -r、-p、-t、-g、-o、-D 選項(xiàng)。
-r表示以遞歸模式處理子目錄,它主要是針對(duì)目錄來說的,如果單獨(dú)傳一個(gè)文件不需要加 -r 選項(xiàng),但是傳輸目錄時(shí)必須加。
-v表示打印一些信息,比如文件列表、文件數(shù)量等。
-l表示保留軟連接。
-L表示像對(duì)待常規(guī)文件一樣處理軟連接。如果是 SRC 中有軟連接文件,則加上該選項(xiàng)后,將會(huì)把軟連接指向的目標(biāo)文件復(fù)制到 DEST。
-p表示保持文件權(quán)限。
-o表示保持文件屬主信息。
-g表示保持文件屬組信息。
-D表示保持設(shè)備文件信息。
-t表示保持文件時(shí)間信息。
--delete表示刪除 DEST 中 SRC 沒有的文件。
--exclude=PATTERN表示指定排除不需要傳輸?shù)奈募?,等?hào)后面跟文件名,可以是通配符模式(如 *.txt)。
--progress表示在同步的過程中可以看到同步的過程狀態(tài),比如統(tǒng)計(jì)要同步的文件數(shù)量、 同步的文件傳輸速度等。
-u表示把 DEST 中比 SRC 還新的文件排除掉,不會(huì)覆蓋。
-z加上該選項(xiàng),將會(huì)在傳輸過程中壓縮。
以上也僅是列出了 async 命令常用的一些選項(xiàng),對(duì)于初學(xué)者來說,記住最常用的幾個(gè)即可,比如 -a、-v、-z、--delete 和 --exclude。
如果想查看 async 提供的所有選項(xiàng),可直接執(zhí)行 async 命令。
為了更好的演示各個(gè)選項(xiàng)的功能,需要做一些準(zhǔn)備工作,執(zhí)行如下命令:
#新建rsync目錄
[root@localhost ~]# mkdir rsync
[root@localhost ~]# cd rsync
#在rsync目錄中,創(chuàng)建test1目錄
[root@localhost rsync]# mkdir test1
[root@localhost rsync]# cd test1
#在test1目錄中,分別創(chuàng)建名為 1、2、3、/root.123.txt 文件
[root@localhost test1]# touch 1 2 3 /root/123.txt
[root@localhost test1]# ln -s /root/123.txt ./123.txt
[root@localhost test1]# ls -l
total 0
-rw-r--r--. 1 root root 0 0ct 23 07:34 1
lrwxrwxrwx. 1 root root 13 0ct 23 08:34 123.txt -> /root/123.txt
-rw-r--r--. 1 root root 0 0ct 23 07:34 2
-rw-r--r--. 1 root root 0 0ct 23 07:34 3
[root@localhost test1]# cd ..
#回到rsync目錄
[root@localhost rsync]#
在此基礎(chǔ)上,下面挑選了幾個(gè)常用的 OPTION 選項(xiàng),給大家舉例說明它們的用法。
rsync -a 選項(xiàng)
首先來看看 -a 選項(xiàng)的用法,如下所示:
[root@localhost rsync]# rsync -a test1 test2
[root@localhost rsync]# ls test2
test1
[root@localhost rsync]# ls test2/test1/
1? 123.txt? 2? 3
這里有一個(gè)問題,我們本來是想把 test1 目錄中的內(nèi)容直接放到 test2 目錄中,可結(jié)果 rsync 命令卻新建了 test2 目錄,然后把 test1 放到 test2 中。
如果想要實(shí)現(xiàn)將 test1 目錄中的內(nèi)容直接備份到 test2 目錄中,需修改上面的命令為:
[root@localhost rsync]#rm -rf test2
[root@localhost rsync]# rsync -a test1/ test2/
[root@localhost rsync]# ls test2/
1? 123.txt? 2? 3
可以看到,只需給 test1 和 test2 目錄后添加 / 斜杠即可。
前面講過,使用 -a 選項(xiàng),等同于同時(shí)使用 -r、-l、-p、-t、-g、-o、-D 選項(xiàng),且 -a 還可以和 --no-OPTION 一并使用。下面再來看看 -l 選項(xiàng)的作用:
[root@localhost rsync]# rm -rf test2
[root@localhost rsync]# rsync -av test1/ test2/
sending incremental file list
created directory test2
./
1
skipping non-regular file "123.txt"
2
3
sent 200 bytes received 72 bytes 544.00 bytes/sec
total size is 13? speedup is 0.05
這里使用 -v 選項(xiàng),可以看到,拷貝過程中跳過了非普通文件 123.txt,其實(shí) 123.txt 是一個(gè)軟鏈接文件,如果不使用 -l 選項(xiàng),系統(tǒng)將不理會(huì)軟鏈接文件。
rsync --delete選項(xiàng)
通過表 1 可以看到,--delete 選項(xiàng)用來--delete 刪除 DEST 中 SRC 沒有的文件。例如:
#拷貝 test1 目錄下的數(shù)據(jù)
[root@localhost rsync]# rsync -a test1/ test2
#刪除 test1/123.txt 文件
[root@localhost rsync]# rm -f test1/123.txt
[root@localhost rsync]# ls test1/
1 2 3
[root@localhost rsync]# rsync -av test1/ test2/
sending incremental file list
./
sent 55 bytes? received 15 bytes 140.00 bytes/sec
total size is 0? speedup is 0.00
[root@localhost rsync]# ls test2/
1 123.txt 2 3
可以看到,當(dāng)對(duì) test1 目錄刪除了 123.txt 文件之后,再次備份并沒有對(duì) test2 目錄中的 123.txt 文件產(chǎn)生任何影響。
下面使用 --delete 選項(xiàng),再次執(zhí)行拷貝命令,如下所示:
[root@localhost rsync]# rsync -av --delete test1/ test2/
sending incremental file list
deleting 123.txt
sent 52 bytes? received 12 bytes 128.00 bytes/sec
total size is 0? speedup is 0.00
[root@localhost rsync]# ls test2/
1 2 3
可以看到,使用 --delete 選項(xiàng)進(jìn)行備份數(shù)據(jù)時(shí),test1 目錄一旦做了改變,那么 test2 也會(huì)做相應(yīng)改變。
不僅如此,如果在 DEST 中增加文件,而 SRC 中不包含這些文件,那么在使用 --delete 選項(xiàng)做同步備份操作時(shí),DEST 新增的這些文件會(huì)被刪除。例如:
[root@localhost rsync]# touch test2/4
[root@localhost rsync]# ls test1/
1 2 3
[root@localhost rsync]# ls test2/
1 2 3 4
[root@localhost rsync]# rsync -a --delete test1/ test2/
[root@localhost rsync]# ls test2/
1 2 3
受到篇幅的限制,有關(guān) rsync 命令其他選項(xiàng)的用法,本節(jié)不再給出具體實(shí)例,有興趣的讀者可自行編寫代碼進(jìn)行測(cè)試。
原文參考:http://c.biancheng.net/linux_tutorial/