1. 程式人生 > 其它 >linux lvm snapshot lvm 快照 邏輯卷 快照

linux lvm snapshot lvm 快照 邏輯卷 快照

https://www.codenong.com/cs106136616/

lvm快照有多種實現方法,其中一種是COW(Copy-On-Write),不用停止服務或將邏輯卷設為只讀就可以進行備份,當一個 snapshot建立的時候只是拷貝原始卷裡的元資料,而不是物理上的資料,所以snapshot的建立特別快。原始卷寫入資料snapshot記錄哪些資料發生變化,並備份舊資料,當恢復的時候就可以把舊資料恢復到對應位置。

介紹下LVM管理的相關命令

  • pvcreate ,pvmove ,pvremove ,pvscan ,pvdisplay
  • vgcreate ,vgremove ,vgscan ,vgdisplay ,vgreduce ,vgextend
  • lvcreate ,lvmove ,lvremove ,lvscan ,lvdisplay ,lvreduce ,lvextend ,lvresize ,lvchk

LVM備份恢復示例:

現有一個Disk /dev/sdb: 17.2 GB,先將它劃分為兩個分割槽,一個作為源分割槽做成lvm,一個作為備份資料儲存點

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 17.2 GB, 17179869184 bytes, 33554432 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xcaf172f9

Device Boot Start End Blocks Id System
/dev/sdb1 2048 16779263 8388608 83 Linux
/dev/sdb2 16779264 33554431 8387584 83 Linux

1、建立lvm

1
2
3
4
5
6
[root@localhost ~]# pvcreate /dev/sdb1 整個磁碟17G
[root@localhost ~]# vgcreate vgtest /dev/sdb1
[root@localhost ~]# lvcreate -L 7G -n srcdata vgtest
[root@localhost ~]# vgextend vgtest /dev/sdb2 把另一個分割槽也劃入vgtest卷組
[root@localhost ~]# mkfs -t ext3 /dev/vgtest/srcdata
[root@localhost ~]# mount /dev/vgtest/srcdata /mymnt/mnt

2、模擬初始資料

1
2
[root@localhost ~]# tar zcf /mymnt/mnt/backup.gz /etc/*
[root@localhost ~]# echo 'hello world'> test.txt

當前lvm下已經有兩個檔案了,模擬磁碟備份前狀態

3、建立快照

使用一個10G的大小對7G的lv建立快照有如下提示

1
2
3
[root@localhost ~]# lvcreate -L +10G -n snapsrc -s /dev/vgtest/srcdata (-s表示建立快照)
Reducing COW size 10.00 GiB down to maximum usable size 7.03 GiB.
Logical volume "snapsrc" created

檢視,發現快照卷已經創建出來了,大小是7G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# lvdisplay

--- Logical volume ---
LV Path /dev/vgtest/snapsrc
LV Name snapsrc
VG Name vgtest
LV UUID ZIx3hb-80iW-R2Nf-XET6-9wfA-MG8K-6A3bRe
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2016-04-20 10:37:14 +0800
LV snapshot status active destination for srcdata
LV Status available
# open 0
LV Size 7.00 GiB
Current LE 1792
COW-table size 7.03 GiB
COW-table LE 1800
Allocated to snapshot 0.00% 這個是快照lv特有的,顯示用了多少空間
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3

隨著原始卷寫入資料,快照卷的使用率也會增加。測試下往原始卷寫入30M資料,使用率變成0.42%

1
2
3
4
5
6
7
[root@localhost ~]# cd /mymnt/mnt/
[root@localhost mnt]# dd if=/dev/zero of=./addfile bs=1M count=30
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.0974659 s, 323 MB/s
[root@localhost mnt]# lvdisplay | grep %
Allocated to snapshot 0.42%

再新增一個檔案[root@localhost mnt]# ls -lr /etc/* >b.txt,此時在執行快照之後原始卷新增了兩個檔案。此時如果想恢復之前的狀態,要先解除安裝原始卷,再使用--merge(合併)恢復。

1
2
3
4
5
6
7
[root@localhost mymnt]# umount mnt
[root@localhost mymnt]# lvconvert --merge /dev/vgtest/snmpsrc
Merging of volume snmpsrc started.
srcdata: Merged: 100.0%
Merge of snapshot into logical volume srcdata has finished.
Logical volume "snmpsrc" successfully removed
[root@localhost mymnt]# mount /dev/vgtest/srcdata mnt

至此原始卷就恢復到備份前的狀態了。


1、快照還有一種恢復方法就是,建立快照後直接掛載,把其中資料複製備份

1
2
3
[root@localhost mnt]# lvcreate -L +7G -n backuplv -s /dev/vgtest/srcdata
[root@localhost mnt]# mount /dev/vgtest/backuplv /mymnt/dstmnt/
[root@localhost mymnt]# tar -zcf dstmnt/dstmnt.tar.gz /mymnt/dstmnt/* 掛載後使用tar打包備份

備份好之後解除安裝快照卷,並lvremove 移除快照卷,以節省空間。

2、另外使用dump也可以實現備份恢復資料

1
2
3
4
[root@localhost ~]# dump -0u /tmp/data.bak.dump /snap
[root@localhost ~]# mkdir /data
[root@localhost ~]# cd /data/
[root@localhost ata]# restore -rf /tmp/data.bak.dump

3、 也可以使用dd將快照卷備份,然後直接替換還原

1
2
dd if=/dev/vgtest/srcdata of=/backupsrcdata.dd 備份
dd if=/backupbackupsrcdata.dd of=/dev/vgtest/srcdata 還原