linux backup
from http://linux.vbird.org/linux_basic/0580backup.php#backup_hint
推薦需要備份的目錄:
完整備份之累積備份 (Incremental backup)
遠端備援的 script
災難復原的考量
from http://www.atmarkit.co.jp/ait/articles/0302/08/news002.html
from http://chengkinhung.blogspot.tw/2012/09/linuxlvmsnapshot.html
Linux命令:LVM快照Snapshot备份
九月 07, 2012
常用Linux命令使用技巧:LVM快照Snapshot备份
快照(snapshot)是LVM所提供的一个非常有用的特性。它的原理是复制 Origin 原始卷的
元数据(metadata)来创建一个逻辑卷,并没有复制物理卷上的任何数据, 因此它的创建
过程是实时瞬间完成的。快照是特殊类型的逻辑卷,它含有创建时刻所指定的原始逻辑卷
的完整数据,您可以操作快照而无需担心数据的变更令备份失效.
LVM 快照利用一种称为“写时复制(COW - Copy-On-Write)”的技术来跟踪和维持其数据
的一致性。它的原理比较简单,就是跟踪原始卷上块的改变, 在这些数据被改变之前将
其复制到快照自己的预留空间里(顾名思义称为写时复制)。 当对快照进行读取的时候,
被修改的数据从快照的预留空间中读取,未修改的数据则重定向到原始卷上去读取,因此
在快照的文件系统与设备之间多了一层COW设备。
利用快照您可以冻结一个正在使用中的逻辑卷,然后制作一份冻结时刻的备份,由于这个
备份是具有一致性的,因此非常的适合于用来备份实时系统。例如,您的运行中的数据库
可能即使在备份时刻也是不允许暂停服务的,那么就可以考虑使用LVM的快照模式,然后
再针对此快照来进行文件系统级别或者块设备级别的数据备份。
# lsmod | grep dm; #使用snapshot需要內核模塊dm-snapshot;
# modprobe dm-snapshot; #如有需要,必須先加載此模塊;
# lvs; # 先查看一下目前LV的大小;
------------------------------------------------------------------------------
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 6.88G
LogVol01 VolGroup00 -wi-ao 1.00G
LogVol02 VolGroup00 -wi-ao 4.00G
LogVol03 VolGroup00 -wi-ao 5.00G
------------------------------------------------------------------------------
说明:此实验目标是备份逻辑卷LogVol02,逻辑卷LogVol03挂载于/backup用来存储备份文件;
理论上,您所建立的快照卷的大小应该是原始卷的1.1倍大小,但鉴于创建快照的目的多是
为临时备份数据,因此实际使用时可视您的备份速度和数据变更的频繁程度来决定快照卷
的大小。例如,您预计完成一个完整备份大概需要1个小时,而在这个时间之内数据变更的
大小不会超过100M,那么您就可以安全地创建100M大小的快照卷。
# vgs; # 看看卷组VG够不够空间创建快照;
------------------------------------------------------------------------------
VG #PV #LV #SN Attr VSize VFree
VolGroup00 3 4 0 wz--n- 23.81G 7.94G
------------------------------------------------------------------------------
如上所示,目前卷组VolGroup00还有大概8G的空间,足以建立快照;
开始建立邏輯卷VolGroup00/LogVol02的快照(注意这里取1.1倍大小空间):
# lvcreate -L4.4G -s -n LogVol02s VolGroup00/LogVol02;
------------------------------------------------------------------------------
Rounding up size to full physical extent 4.41 GB
Logical volume "LogVol02s" created
------------------------------------------------------------------------------
# lvs; # 看看剛创建的快照;
------------------------------------------------------------------------------
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 6.88G
LogVol01 VolGroup00 -wi-ao 1.00G
LogVol02 VolGroup00 owi-ao 4.00G
LogVol02s VolGroup00 swi-a- 4.41G LogVol02 0.02
LogVol03 VolGroup00 -wi-ao 5.00G
------------------------------------------------------------------------------
# lvscan; # 看看剛创建的快照;
------------------------------------------------------------------------------
ACTIVE '/dev/VolGroup00/LogVol00' [6.88 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [1.00 GB] inherit
ACTIVE Original '/dev/VolGroup00/LogVol02' [4.00 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol03' [5.00 GB] inherit
ACTIVE Snapshot '/dev/VolGroup00/LogVol02s' [4.41 GB] inherit
------------------------------------------------------------------------------
# /bin/ls -1 -d /dev/mapper/VolGroup00-LogVol02s*
------------------------------------------------------------------------------
/dev/mapper/VolGroup00-LogVol02s
/dev/mapper/VolGroup00-LogVol02s-cow
------------------------------------------------------------------------------
快照卷無需做格式化等步驟,可以直接对快照卷进行掛載,卸載等操作,而且操作完成之後,
就应该立即刪除快照,以减轻系统的I/O负担。 快照不會自動更新,長久保留是沒有意義的。
针对快照进行块设备的备份:
# dd if=/dev/VolGroup00/LogVol02s of=/backup/LogVol02.dd; # 用dd命令进行块备份;
针对快照进行文件系统的备份:
# mkdir /mnt/LogVol02s;
# mount /dev/VolGroup00/LogVol02s /mnt/LogVol02s; # 快照可直接挂载;
# tar -zcvpf /tmp/backup.tar.gz /mnt/LogVol02s/*; # 用tar命令进行文件备份;
# lvremove /dev/VolGroup00/LogVol02s; # 备份完成后刪除快照;
通常创建快照卷的主要目的是做备份用途, 可以写一个简单的备份脚本来自动创建快照,
然后挂载进行备份, 备份完成后又自动卸载和删除. 因为快照的创建速度非常快, 所以
使用快照来操作备份作业不仅可以解决一致性问题, 而且可以减少备份时间.
請參考如下代碼:
# vi snapshot_backup.sh; #建立備份腳本;
------------------------------------------------------------------------------
#!/bin/bash
today=`date "+%Y%m%d"`;
lvcreate -L1G -s -n LogVol02s /dev/VolGroup00/LogVol02;
mount /dev/VolGroup00/LogVol02s /disk/VolGroup00/LogVol02s;
tar -zcvf /tmp/snapshot_backup_$today.tar.gz /disk/VolGroup00/LogVol02s/*;
umount /dev/VolGroup00/LogVol02s;
lvremove -f /dev/VolGroup00/LogVol02s;
------------------------------------------------------------------------------
chmod 755 snapshot_backup.sh; #設置運行權限;
可以將此備份腳本設置成每天定時運行,就可當成是一個完整備份的方案.
顺便提一些,如要从dd的备份中恢复,反过来操作即可。
例如,先用dd命令摧毁逻辑卷LogVol02中的数据,以便进行恢复测试:
# dd if=/dev/zero of=/dev/VolGroup00/LogVol02 bs=512 count=1024;
这时尝试挂载逻辑卷LogVol02将会失败:
# mount /dev/mapper/VolGroup00-LogVol02 /opt;
如下命令将 dd 备份文件直接写入LogVol02逻辑卷,即可恢复数据:
# dd if=/backup/LogVol02.dd of=/dev/VolGroup00/LogVol02;
再尝试挂载所恢复的逻辑卷LogVol02,成功挂载后再检查数据:
# mount /dev/mapper/VolGroup00-LogVol02 /opt;
from https://mini.nidbox.com/diary/read/8640448
用 dd 備份/還原 整個硬碟或分割區 ( Llinux / Mac OS X )
dd 指令參考
將某個硬碟分割區 備份成 images 檔案:
本例: 將 sda1 整個備份成一個檔 sda1_bak.img
也可以壓縮備份
將 /dev/sda1 整個複製到 /dev/sdb1
整顆硬碟複製 ==> sd1 複製到 sdb
還原:
例如 raspberry image 檔案的還原到 sd card:
5785600+0 records in
5785600+0 records out
2962227200 bytes (3.0 GB) copied, 2078.95 s, 1.4 MB/s
(M 是大寫,加上 bs=4M 快非常多!)
706+1 records in
706+1 records out
2962227200 bytes (3.0 GB) copied, 516.177 s, 5.7 MB/s
real 8m36.206s
user 0m0.039s
sys 1m29.598s
- 作業系統本身需要備份的檔案:
這方面的檔案主要跟『帳號與系統設定檔』有關係! 主要有哪些帳號的檔案需要備份呢?就是/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /home 底下的使用者家目錄等等, 而由於 Linux 預設的重要參數檔都在 /etc/ 底下,所以只要將這個目錄備份下來的話, 那麼幾乎所有的設定檔都可以被保存的!
至於 /home 目錄是一般用戶的家目錄,自然也需要來備份一番!再來,由於使用者會有郵件吧!所以呢,這個 /var/spool/mail/ 內容也需要備份呦!另外,由於如果你曾經自行更動過核心,那麼 /boot 裡頭的資訊也就很重要囉!所以囉,這方面的資料你必須要備份的檔案為:
- /etc/ 整個目錄
- /home 整個目錄
- /var/spool/mail
- /boot
- /root
- 如果你自行安裝過其他的套件,那麼 /usr/local/ 或 /opt 也最好備份一下!
- 軟體本身的設定檔案,例如:/etc/ 整個目錄,/usr/local/ 整個目錄
- 軟體服務提供的資料,以 WWW 及 MySQL 為例:
WWW 資料:/var/www 整個目錄或 /srv/www 整個目錄,及系統的使用者家目錄
MySQL : /var/lib/mysql 整個目錄 - 其他在 Linux 主機上面提供的服務之資料庫檔案!
推薦需要備份的目錄:
由上面的介紹來看的話,如果你的硬體或者是由於經費的關係而無法全部的資料都予以備份時, 鳥哥建議你至少需要備份這些目錄呦!
- /boot
- /etc
- /home
- /root
- /usr/local(或者是 /opt 及 /srv 等)
- /var(註:這個目錄當中有些暫存目錄則可以不備份!)
- 不需要備份的目錄:
有些資料是不需要備份的啦!例如我們在第六章檔案權限與目錄配置裡頭提到的 /proc 這個目錄是在記錄目前系統上面正在跑的程序,這個資料根本就不需要備份的呢!此外,外掛的機器,例如 /mnt 或 /media 裡面都是掛載了其他的硬碟裝置、光碟機、軟碟機等等,這些也不需要備份吧? 所以囉!底下有些目錄可以不需要備份啦!
- /dev :這個隨便你要不要備份
- /proc:這個真的不需要備份啦!
- /mnt 與 /media:如果你沒有在這個目錄內放置你自己系統的東西,也不需要備份
- /tmp :幹嘛存暫存檔!不需要備份!
一些常見的裝置代號!
- 光碟機: /dev/cdrom (其實應該是 /dev/sdX 或 /dev/hdX)
- 磁帶機: /dev/st0 (SCSI 介面), /dev/ht0 (IDE 介面)
- 軟碟機: /dev/fd0, /dev/fd1
- 硬碟機: /dev/hd[a-d][1-63] (IDE), /dev/sd[a-p][1-16] (SCSI/SATA)
- 外接式 USB 硬碟機: /dev/sd[a-p][1-16] (與 SCSI 相同)
- 印表機: /dev/lp[0-2]
完整備份之累積備份 (Incremental backup)
備份不就是將重要資料複製出來即可嗎?幹嘛需要完整備份 (Full backup) 呢?如果你的主機是負責相當重要的服務, 因此如果有不明原因的當機事件造成系統損毀時,你希望在最短的時間內復原系統。此時,如果僅備份關鍵資料時, 那麼你得要在系統出錯後,再去找新的 Linux distribution 來安裝,安裝完畢後還得要考慮到資料新舊版本的差異問題, 還得要進行資料的移植與系統服務的重新建立等等,等到建立妥當後,還得要進行相關測試! 這種種的工作可至少得要花上一個星期以上的工作天才能夠處理妥當!所以,僅有關鍵資料是不夠的!
那你知道完整備份的定義了吧?沒錯!完整備份就是將根目錄 (/) 整個系統通通備份下來的意思! 不過,在某些場合底下,完整備份也可以是備份一個檔案系統 (filesystem)!例如 /dev/sda1 或 /dev/md0 或 /dev/myvg/mylv 之類的檔案系統就是了。
所謂的累積備份,指的是在系統在進行完第一次完整備份後,經過一段時間的運作, 比較系統與備份檔之間的差異,僅備份有差異的檔案而已。而第二次累積備份則與第一次累積備份的資料比較, 也是僅備份有差異的資料而已。如此一來,由於僅備份有差異的資料,因此備份的資料量小且快速!備份也很有效率。 我們可以從下圖來說明:

圖 2.1.1、 累積備份 (incremental backup) 操作示意圖
假如我在星期一作好完整備份,則星期二的累積備份是系統與完整備份間的差異資料;星期三的備份是系統與星期二的差異資料, 星期四的備份則是系統與星期三的差異資料。那你得要注意的是,星期二的資料是完整備份加第一次累積備份, 星期三的資料是完整備份加第一次累積與第二次累積備份,星期四的資料則是星期一的完整備份加第一次加第二次加第三次累積備份。 由於每次都僅與前一次的備份資料比較而已,因此備份的資料量就會少很多!
那如何還原?經過上面的分析,我們也會知道累積備份的還原方面比較麻煩! 假設你的系統在星期五的時候掛點了!那你要如何還原?首先,你必須要還原星期一的完整備份,然後還原星期二的累積備份, 再依序還原星期三、星期四的累積備份才算完全復原!那如果你是經過了九次的累積備份,就得要還原到第九次的階段, 才是最完整的還原程序!
- 還原的考量
那你知道完整備份的定義了吧?沒錯!完整備份就是將根目錄 (/) 整個系統通通備份下來的意思! 不過,在某些場合底下,完整備份也可以是備份一個檔案系統 (filesystem)!例如 /dev/sda1 或 /dev/md0 或 /dev/myvg/mylv 之類的檔案系統就是了。
- 累積備份的原則
所謂的累積備份,指的是在系統在進行完第一次完整備份後,經過一段時間的運作, 比較系統與備份檔之間的差異,僅備份有差異的檔案而已。而第二次累積備份則與第一次累積備份的資料比較, 也是僅備份有差異的資料而已。如此一來,由於僅備份有差異的資料,因此備份的資料量小且快速!備份也很有效率。 我們可以從下圖來說明:

圖 2.1.1、 累積備份 (incremental backup) 操作示意圖
那如何還原?經過上面的分析,我們也會知道累積備份的還原方面比較麻煩! 假設你的系統在星期五的時候掛點了!那你要如何還原?首先,你必須要還原星期一的完整備份,然後還原星期二的累積備份, 再依序還原星期三、星期四的累積備份才算完全復原!那如果你是經過了九次的累積備份,就得要還原到第九次的階段, 才是最完整的還原程序!
針對鳥哥的『鳥站』來說,我的備份策略是這樣的:
- 主機硬體:使用一個獨立的 filesystem 來儲存備份資料,此 filesystem 掛載到 /backup 當中;
- 每日進行:目前僅備份 MySQL 資料庫;
- 每週進行:包括 /home, /var, /etc, /boot, /usr/local 等目錄與特殊服務的目錄;
- 自動處理:這方面利用 /etc/crontab 來自動提供備份的進行;
- 異地備援:每月定期的將資料分別 (a)燒錄到光碟上面 (b)使用網路傳輸到另一部機器上面
遠端備援的 script
如果你有控管兩部以上的 Linux 主機時,那麼互相將對方的重要資料保存一份在自己的系統中也是個不錯的想法! 那怎麼保存啊?使用 USB 複製來去嗎?當然不是啦!你可以透過網路來處置啦!我們假設你已經有一部主機, 這部主機的 IP 是 192.168.1.100 ,而且這部主機已經提供了 FTP 與 sshd 這兩個網路服務, 同時你已經做好了 FTP 的帳號,sshd 帳號的免密碼登入功能等 (這部分請參考伺服器篇的介紹),接下來你可以這樣做:
災難復原的考量
之所以要備份當然就是預防系統掛點啦!如果系統真的掛點的話,那麼你該如何還原系統呢?
- 硬體損毀,且具有完整備份的資料時
from http://www.atmarkit.co.jp/ait/articles/0302/08/news002.html
多くのケースで適切だと思われるのは、週に1度フルバックアップを取り、残りの日は増分バックアップにすることでしょう。例えば、dumpを利用するなら日曜日にダンプレベル0でバックアップし、ほかの曜日はダンプレベル1にします。cronに登録して自動実行させる場合、ダンプレベル0用とダンプレベル1用のスクリプトを用意し、以下のように設定すれば実現できます。
# crontab -e |
00 00 * * 0 ダンプレベル0を実行するスクリプト |
●バックアップの自動化とルーチンワークの策定
バックアップ計画を決定したら、次はバックアップが確実に実行されるように、できるだけ処理を自動化できるようにしましょう。
例えば、複数の処理をまとめたスクリプトを作ることによって、バックアップ手順の操作ミスを防ぐことが可能になります。cronを利用して、そのスクリプトを定期的に実行すれば、作業漏れが防げます。また、管理コストも軽減できます。
バックアップのような、ミスや抜けの許されない作業を行う場合は、手順書などのドキュメント整備なども必要です。手順書は、バックアップを取る場合よりも、リストアの手順に重点を置きましょう。迅速にリストアが完了できるように、システムの運用前に何度も検証してリストアの手順を確立すべきです。
また、バックアップメディアの管理方法もあらかじめ定めておき、作業が決まった流れでできるようにしておきましょう。
といったことを決定します。
必要に応じて管理方法は柔軟に変更していく必要もありますが、変更が多過ぎると作業漏れが発生する可能性も高くなります。
また、システム構築の案件がある場合、ここで挙げたようなバックアップの観点から、システムをもう一度確認することをお勧めします。システムが現在どのような状態なのか、どのようなデータがどこに保存されるのか。これらを正確に把握したうえでディスク構成などを決定しないと、後で困ったことになる場合があるからです。
LVMによるスナップショットバックアップ
安全にバックアップを取るにはどうすればよいでしょうか? 非常に頻繁にデータの更新が行われるようなシステムの場合、システムの稼働中にバックアップを取ろうとすると、バックアップの最中にデータが変更されてしまう可能性があります。その場合、不正確な情報がバックアップされたり、バックアップデータが壊れてしまう可能性もあります。
これは、大規模なデータベースシステムを運用しているような場合は特に注意する必要があります。複数のファイル同士に関連性が存在し、あるファイルが更新されたら別のファイルも更新されないとデータの整合性が取れなくなるような場合には、特にこの問題が顕著です。例えば、ファイルAとファイルBが関連するものとして、1:00にファイルAのバックアップが取られた後、1:30にファイルAが更新されたとします。その後、2:00にファイルBをバックアップしたとしても、データベースとしての整合性は保てなくなり、バックアップされたデータはまったく無意味なものになります。
データベースのようなアプリケーションを運用しているシステムで、専用のバックアップユーティリティを利用せず、dumpやtarなどの汎用ツールを利用するなら、必ずデータベースをシャットダウンしてからバックアップを実行する必要があります。バックアップ時は、システムをシングルユーザーモードに落とし、ファイルシステムを読み取り専用で再マウントした状態で行うのが理想的です。しかし、システム全体のバックアップを取るには非常に長い時間が必要になります。これは特に、24時間365日のサービス提供を求められるインターネットサーバにおいては大きな問題です。
スナップショットによるバックアップ
システムを構築する際は、スナップショットを作成しておきたい領域をLVM領域として作成します。ただし、スナップショットのための専用領域を確保しておく必要があります。できればバックアップ予定のデータ領域と同サイズ、少なくとも元データ領域の10?20%ほどの領域を確保しておきます。
スナップショットを利用するには、ファイルシステムの構築後、lvcreateコマンドを--snapshotオプション付きで実行します。例えば、/dev/volgrp0/lv0(ボリュームグループvolgrp0、論理ボリュームlv0)という領域のための、1Gbytesのスナップショットを作成する場合は、以下のように実行します。
# lvcreate --snapshot --size=1G --name snap0 /dev/volgrp0/lv0 |
作成したスナップショットは通常のデバイスと同様に扱えるので、dumpでテープにバックアップを取る場合は、以下のように実行します。
# dump 0uf /dev/st0 /dev/volgrp0/snap0 |
計画例とバックアップの設定手順
ここでは小規模なシステム環境を想定し、これまでに説明してきた要素を取り入れたバックアップシステム構築の例を紹介します。
システムはWebサーバとして稼働し、そのバックアップを担当するNFSサーバが存在するという想定です。テープ装置は高価であるため、各サーバのバックアップデータを集めるNFSサーバのみに装備し、必要に応じてデータ保存を行うこととします。
環境の分析と方針決定
このWebサーバはユーザーの追加などの作業は発生せず、コンテンツのみが随時追加・変更されるシステムです。これを大まかに分析すると、システム上にあるデータは以下のように分類できます。
| パーティション分割 | 主なデータ | 更新頻度 | 重要度 |
|---|---|---|---|
| /usr/local | Webサイト用データ | 常時 | 最重要 |
| /var | ログファイル | 常時 | 中位 |
| / | システムデータ | ほとんどなし | 低い |
今回は/usr/local/に対してLVMを使用し、スナップショットを利用してバックアップを取ります。また、バックアップはcronによって定期的に実行されるようにします。以上をまとめると以下のようになります。
バックアップサーバ側の準備
ネットワーク経由でバックアップを取る場合、最も手軽なのがNFSの利用です。ここでは、NFSへの最低限のアクセス制御を考慮した設定を紹介します。
バックアップサーバ側には、/backupというディレクトリに各サーバ用のディレクトリを作成します。このディレクトリには書き込みを認めなければならないので、NFS専用のユーザーnfsbackupを作成し、それぞれのディレクトリの所有者とします。
# mkdir -p /backup/www |
次に、各サーバからNFSマウントできるように設定します。ただし、各サーバから別のサーバのデータを編集できないように、ここでは個別に公開するディレクトリを設定しています。
/backup/www www.example.com(rw,anonuid=1001,anongid=1001,all_squash) |
| /etc/exports |
その後、portmapとrpc.mountd、rpc.nfsdを起動させれば、NFSサーバとして機能するようになります。
# portmap |
また、必要に応じてrpc.statdやrpc.lockd、rpc.rquotadなどのデーモンを動作させておきます。
バックアップクライアント側の準備
クライアント側は、スナップショットを利用してバックアップを取るようにします。ここでは、バックアップサーバが公開しているディレクトリを/mnt/backupというディレクトリにマウントして利用することとします。
後は、バックアップを自動実行できるようなスクリプトを作成して、cronで自動実行するようにしておけばよいでしょう。以下にスクリプト例を挙げておきますが、これは最小限の機能しか持っていません。ほかにもNFSサーバ側でのデータ量監視機能、7世代を超えた場合はアーカイブデータを消去する機能、作成したアーカイブをテープに書き出すための機能などを持たせる必要があると思います。
#!/bin/sh |
上記のスクリプトを/root/bin/lvmbackup(例)として保存したら、cronに登録します。
# crontab -e |
例として、毎日00:00に上記スクリプトが実行されるようにしています。
00 00 * * * /root/bin/lvmbackup |
アーカイブをテープにバックアップする場合は、NFSサーバ側で以下のようにddコマンドを利用します。
# dd if=/backup/www.example.com/backup-lv0-0-20030129 of=/dev/st0 bs=512 |
バックアップは要件とコストのバランスで
2回にわたってバックアップに関する情報を紹介していきました。最後に紹介した方法は、これまでに紹介したツールをどの場所で利用するのかを分かりやすくするために想定した環境を前提としています。しかし、バックアップをどのように実現するかは、求められる要件によって異なります。コスト(費用、管理の手間)とのバランスを考えながら、適切な方法を選択してください。
バックアップシステムが大規模になればなるほど、データを失った場合の損害は大きくなり、管理コストも膨れ上がることになります。その場合は、管理コストの低減が見込める商用バックアップツール使用の検討をお勧めします。
from http://chengkinhung.blogspot.tw/2012/09/linuxlvmsnapshot.html
Linux命令:LVM快照Snapshot备份
九月 07, 2012
常用Linux命令使用技巧:LVM快照Snapshot备份
快照(snapshot)是LVM所提供的一个非常有用的特性。它的原理是复制 Origin 原始卷的
元数据(metadata)来创建一个逻辑卷,并没有复制物理卷上的任何数据, 因此它的创建
过程是实时瞬间完成的。快照是特殊类型的逻辑卷,它含有创建时刻所指定的原始逻辑卷
的完整数据,您可以操作快照而无需担心数据的变更令备份失效.
LVM 快照利用一种称为“写时复制(COW - Copy-On-Write)”的技术来跟踪和维持其数据
的一致性。它的原理比较简单,就是跟踪原始卷上块的改变, 在这些数据被改变之前将
其复制到快照自己的预留空间里(顾名思义称为写时复制)。 当对快照进行读取的时候,
被修改的数据从快照的预留空间中读取,未修改的数据则重定向到原始卷上去读取,因此
在快照的文件系统与设备之间多了一层COW设备。
利用快照您可以冻结一个正在使用中的逻辑卷,然后制作一份冻结时刻的备份,由于这个
备份是具有一致性的,因此非常的适合于用来备份实时系统。例如,您的运行中的数据库
可能即使在备份时刻也是不允许暂停服务的,那么就可以考虑使用LVM的快照模式,然后
再针对此快照来进行文件系统级别或者块设备级别的数据备份。
# lsmod | grep dm; #使用snapshot需要內核模塊dm-snapshot;
# modprobe dm-snapshot; #如有需要,必須先加載此模塊;
# lvs; # 先查看一下目前LV的大小;
------------------------------------------------------------------------------
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 6.88G
LogVol01 VolGroup00 -wi-ao 1.00G
LogVol02 VolGroup00 -wi-ao 4.00G
LogVol03 VolGroup00 -wi-ao 5.00G
------------------------------------------------------------------------------
说明:此实验目标是备份逻辑卷LogVol02,逻辑卷LogVol03挂载于/backup用来存储备份文件;
理论上,您所建立的快照卷的大小应该是原始卷的1.1倍大小,但鉴于创建快照的目的多是
为临时备份数据,因此实际使用时可视您的备份速度和数据变更的频繁程度来决定快照卷
的大小。例如,您预计完成一个完整备份大概需要1个小时,而在这个时间之内数据变更的
大小不会超过100M,那么您就可以安全地创建100M大小的快照卷。
# vgs; # 看看卷组VG够不够空间创建快照;
------------------------------------------------------------------------------
VG #PV #LV #SN Attr VSize VFree
VolGroup00 3 4 0 wz--n- 23.81G 7.94G
------------------------------------------------------------------------------
如上所示,目前卷组VolGroup00还有大概8G的空间,足以建立快照;
开始建立邏輯卷VolGroup00/LogVol02的快照(注意这里取1.1倍大小空间):
# lvcreate -L4.4G -s -n LogVol02s VolGroup00/LogVol02;
------------------------------------------------------------------------------
Rounding up size to full physical extent 4.41 GB
Logical volume "LogVol02s" created
------------------------------------------------------------------------------
# lvs; # 看看剛创建的快照;
------------------------------------------------------------------------------
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
LogVol00 VolGroup00 -wi-ao 6.88G
LogVol01 VolGroup00 -wi-ao 1.00G
LogVol02 VolGroup00 owi-ao 4.00G
LogVol02s VolGroup00 swi-a- 4.41G LogVol02 0.02
LogVol03 VolGroup00 -wi-ao 5.00G
------------------------------------------------------------------------------
# lvscan; # 看看剛创建的快照;
------------------------------------------------------------------------------
ACTIVE '/dev/VolGroup00/LogVol00' [6.88 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [1.00 GB] inherit
ACTIVE Original '/dev/VolGroup00/LogVol02' [4.00 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol03' [5.00 GB] inherit
ACTIVE Snapshot '/dev/VolGroup00/LogVol02s' [4.41 GB] inherit
------------------------------------------------------------------------------
# /bin/ls -1 -d /dev/mapper/VolGroup00-LogVol02s*
------------------------------------------------------------------------------
/dev/mapper/VolGroup00-LogVol02s
/dev/mapper/VolGroup00-LogVol02s-cow
------------------------------------------------------------------------------
快照卷無需做格式化等步驟,可以直接对快照卷进行掛載,卸載等操作,而且操作完成之後,
就应该立即刪除快照,以减轻系统的I/O负担。 快照不會自動更新,長久保留是沒有意義的。
针对快照进行块设备的备份:
# dd if=/dev/VolGroup00/LogVol02s of=/backup/LogVol02.dd; # 用dd命令进行块备份;
针对快照进行文件系统的备份:
# mkdir /mnt/LogVol02s;
# mount /dev/VolGroup00/LogVol02s /mnt/LogVol02s; # 快照可直接挂载;
# tar -zcvpf /tmp/backup.tar.gz /mnt/LogVol02s/*; # 用tar命令进行文件备份;
# lvremove /dev/VolGroup00/LogVol02s; # 备份完成后刪除快照;
通常创建快照卷的主要目的是做备份用途, 可以写一个简单的备份脚本来自动创建快照,
然后挂载进行备份, 备份完成后又自动卸载和删除. 因为快照的创建速度非常快, 所以
使用快照来操作备份作业不仅可以解决一致性问题, 而且可以减少备份时间.
請參考如下代碼:
# vi snapshot_backup.sh; #建立備份腳本;
------------------------------------------------------------------------------
#!/bin/bash
today=`date "+%Y%m%d"`;
lvcreate -L1G -s -n LogVol02s /dev/VolGroup00/LogVol02;
mount /dev/VolGroup00/LogVol02s /disk/VolGroup00/LogVol02s;
tar -zcvf /tmp/snapshot_backup_$today.tar.gz /disk/VolGroup00/LogVol02s/*;
umount /dev/VolGroup00/LogVol02s;
lvremove -f /dev/VolGroup00/LogVol02s;
------------------------------------------------------------------------------
chmod 755 snapshot_backup.sh; #設置運行權限;
可以將此備份腳本設置成每天定時運行,就可當成是一個完整備份的方案.
顺便提一些,如要从dd的备份中恢复,反过来操作即可。
例如,先用dd命令摧毁逻辑卷LogVol02中的数据,以便进行恢复测试:
# dd if=/dev/zero of=/dev/VolGroup00/LogVol02 bs=512 count=1024;
这时尝试挂载逻辑卷LogVol02将会失败:
# mount /dev/mapper/VolGroup00-LogVol02 /opt;
如下命令将 dd 备份文件直接写入LogVol02逻辑卷,即可恢复数据:
# dd if=/backup/LogVol02.dd of=/dev/VolGroup00/LogVol02;
再尝试挂载所恢复的逻辑卷LogVol02,成功挂载后再检查数据:
# mount /dev/mapper/VolGroup00-LogVol02 /opt;
from https://mini.nidbox.com/diary/read/8640448
用 dd 備份/還原 整個硬碟或分割區 ( Llinux / Mac OS X )
Linux
dd 指令參考
將某個硬碟分割區 備份成 images 檔案:
本例: 將 sda1 整個備份成一個檔 sda1_bak.img
$ dd if=/dev/sda1 of=/xxx/path/sda1_bak.img也可以壓縮備份
$ dd if=/dev/sda1 | gzip > /xxx/path/sda1_bak.img.gz將 /dev/sda1 整個複製到 /dev/sdb1
$ dd if=/dev/sda1 of=/dev/sdb1整顆硬碟複製 ==> sd1 複製到 sdb
$ dd if=/dev/sda of=/dev/sdb還原:
$dd if=/mnt/sdb1/sda1_bak.img of=/dev/sda1 例如 raspberry image 檔案的還原到 sd card:
$ dd if=/tmp/2014-01-07-wheezy-raspbian.img of=/dev/mmcblk05785600+0 records in
5785600+0 records out
2962227200 bytes (3.0 GB) copied, 2078.95 s, 1.4 MB/s
$ dd if=/tmp/2014-01-07-wheezy-raspbian.img of=/dev/mmcblk0 bs=4M (M 是大寫,加上 bs=4M 快非常多!)
706+1 records in
706+1 records out
2962227200 bytes (3.0 GB) copied, 516.177 s, 5.7 MB/s
real 8m36.206s
user 0m0.039s
sys 1m29.598s
留言
張貼留言