• 2009-01-18

    Linux备份策略 - [Linux service]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://junger.blogbus.com/logs/34057364.html

    • 例題:系統備份範例

    系統上有非常多的重要目錄需要進行備份,而且其實我們也不建議你將備份資料放置到 /root 目錄下! 假設目前你已經知道重要的目錄有底下這幾個:

    • /etc/ (設定檔)
    • /home/ (使用者的家目錄)
    • /var/spool/mail/ (系統中,所有帳號的郵件信箱)
    • /var/spool/cron/ (所有帳號的工作排成設定檔)
    • /root (系統管理員的家目錄)

    /home/loop* 不需要備份,而且 /root 底下的壓縮檔也不需要備份,另外假設你要將備份的資料放置到 /backups ,並且該目錄僅有 root 有權限進入! 此外,每次備份的檔名都希望不相同,例如使用:backup-system-20091130.tar.bz2 之類的檔名來處理。 那你該如何處理這個備份資料呢?(請先動手作看看,再來察看一下底下的參考解答!)

    # 1. 先處理要放置備份資料的目錄與權限:
    [root@www ~]# mkdir /backups
    [root@www ~]# chmod 700 /backups
    [root@www ~]# ll -d /backups
    drwx------ 2 root root 4096 Nov 30 16:35 /backups

    # 2. 假設今天是 2008/11/30 ,則建立備份的方式如下:
    [root@www ~]# tar -jcv -f /backups/backup-system-20081130.tar.bz2 \
    > --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* \
    > /etc /home /var/spool/mail /var/spool/cron /root
    ....(過程省略)....

    [root@www ~]# ll -h /backups/
    -rw-r--r-- 1 root root 8.4M Nov 30 16:43 backup-system-20081130.tar.bz2

    • 僅備份比某個時刻還要新的檔案

    某些情況下你會想要備份新的檔案而已,並不想要備份舊檔案!此時 --newer-mtime 這個選項就粉重要啦! 其實有兩個選項啦,一個是『 --newer 』另一個就是『 --newer-mtime 』,這兩個選項有何不同呢? 我們在 第七章的 touch 介紹中談到過三種不同的時間參數, 當使用 --newer 時,表示後續的日期包含『 mtime 與 ctime 』,而 --newer-mtime 則僅是 mtime 而已! 這樣知道了吧! ^_^ 。那就讓我們來嘗試處理一下囉!

    # 1. 先由 find 找出比 /etc/passwd 還要新的檔案 [root@www ~]# find /etc -newer /etc/passwd ....(過程省略).... # 此時會顯示出比 /etc/passwd 這個檔案的 mtime 還要新的檔名, # 這個結果在每部主機都不相同!您先自行查閱自己的主機即可,不會跟鳥哥一樣! [root@www ~]# ll /etc/passwd -rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd # 2. 好了,那麼使用 tar 來進行打包吧!日期為上面看到的 2008/09/29 [root@www ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 \ > --newer-mtime="2008/09/29" /etc/* ....(中間省略).... /etc/smartd.conf <==真的有備份的檔案 ....(中間省略).... /etc/yum.repos.d/ <==目錄都會被記錄下來! tar: /etc/yum.repos.d/CentOS-Base.repo: file is unchanged; not dumped # 最後行顯示的是『沒有被備份的』,亦即 not dumped 的意思! # 3. 顯示出檔案即可 [root@www ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | \ > grep -v '/$' # 透過這個指令可以呼叫出 tar.bz2 內的結尾非 / 的檔名!就是我們要的啦!

    • 打包某目錄,但不含該目錄下的某些檔案之作法

    假設我們想要打包 /etc/ /root 這幾個重要的目錄,但卻不想要打包 /root/etc* 開頭的檔案, 因為該檔案都是剛剛我們才建立的備份檔嘛!而且假設這個新的打包檔案要放置成為 /root/system.tar.bz2 , 當然這個檔案自己不要打包自己 (因為這個檔案放置在 /root 底下啊!),此時我們可以透過 --exclude 的幫忙! 那個 exclude 就是不包含的意思!所以你可以這樣做:

    [root@www ~]# tar -jcv  -f /root/system.tar.bz2 --exclude=/root/etc* \
    > --exclude=/root/system.tar.bz2 /etc /root

    上面的指令是一整列的~其實你可以打成:『tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root』,如果想要兩行輸入時,最後面加上反斜線 (\) 並立刻按下 [enter] , 就能夠到第二行繼續輸入了。這個指令下達的方式我們會在第三章再仔細說明。 透過這個 --exclude="file" 的動作,我們可以將幾個特殊的檔案或目錄移除在打包之列, 讓打包的動作變的更簡便喔!^_^

    另外,在新版的 tar 指令中,鳥哥發現原本的『 --exclude file 』似乎無法實際運作了!使用 man tar 明明有看到這個選項的說, 但使用 info tar 才發現,選項功能已經變成了『 --exclude=file 』的模式!這個地方得要特別留意呢!

    • 僅解開單一檔案的方法

    剛剛上頭我們解壓縮都是將整個打包檔案的內容全部解開!想像一個情況,如果我只想要解開打包檔案內的其中一個檔案而已, 那該如何做呢?很簡單的,你只要使用 -jtv 找到你要的檔名,然後將該檔名解開即可。 我們用底下的例子來說明一下:

    # 1. 先找到我們要的檔名,假設解開 shadow 檔案好了:
    [root@www ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
    -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 <==這是我們要的!
    # 先搜尋重要的檔名!其中那個 grep 是『擷取』關鍵字的功能!我們會在第三篇說明!
    # 這裡您先有個概念即可!那個管線 | 配合 grep 可以擷取關鍵字的意思!


    # 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 內的檔名之故!

    ……

     



    收藏到:Del.icio.us