一、快照的工作原理
所謂快照就是將當時的系統數據記錄下來,在未來若有數據變動,則會將變更前的數據放入快照區進行保存。我們可理解為快照就是給系統拍了一張照片,記錄當時系統在拍快照的狀態。只不過現實生活中的照片是沒有辦法將現在的生活還原到照片的時候,而Linux系統里LVM快照是可以的。從上面的闡述可以了解到,被做快照的邏輯卷是分成了兩個部分,一部分是數據沒有改動前的和數據變更后的。它是怎么工作的呢?在我們給系統做快照的前提是,系統上基於LVM管理的,且快照和邏輯卷必須是在同一卷組上;在我們給LVM管理的系統上做快照卷的時候,快照不可以給多個邏輯卷一起做,它是一個邏輯卷對應一個快照卷,不可以多個邏輯卷對應一個快照卷。快照是一次性使用,還原了快照,隨之快照就失效,消失。接下來說說原理吧。快照是特殊的邏輯卷,它之所以要和被做快照的邏輯卷一個卷組是因為它在生成快照時,它是和LV共享很多PE的區塊,因此快照必須同LV同一個卷組中。之所以叫快照,就是因為它快嘛,它為什么快,這就要和它的工作原理有密切的關系了,快照生成時,實際上它不是去拷貝原LV里的數據,它只是分配我們指定大小的空間,在原LV上的數據發生變化時,這個時候快照會把發生改變的數據先拷貝到快照區,這樣一來快照就只是存放着被修改之前的數據。這樣就起到了備份修改數據的作用,修改后的數據就存放在原LV上。如果有一天我們需要還原快照,這個時候快照就會和先有的LV做合並,快照里面存放修改之前的數據,快照和現有LV做合並時,快照上的數據會覆蓋現有LV上數據,這樣一來就實現了把數據還原到拍快照當時的狀態。這里需要注意一點的是快照只是覆蓋改變后的數據,沒有做改變的數據它是不會去覆蓋的。所以快照使用過后它就沒有任何意義,它不可以再次記錄恢復后數據的變化前的數據。在做快照的時候我們還需要注意其快照的大小,快照指定的空間大小不要太小,太小可能裝不小變化前的數據,導致快照失效,當然空間也不宜太大,太大浪費空間沒有意義,空間超過原LV大小,其實也是沒有意義的,它最大空間就是和原LV大小相等,所以在做快照時,我們需要評估大概有多少的數據在發生變化,避免空間過小導致快照失效。
二、快照的實現
1)查看現有邏輯卷所在卷組空間是否足夠創建快照
[root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert xxx test -wi-a----- 12.00g [root@test-centos7-node1 ~]# vgdisplay test --- Volume group --- VG Name test System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 51 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size <29.98 GiB PE Size 8.00 MiB Total PE 3837 Alloc PE / Size 1536 / 12.00 GiB Free PE / Size 2301 / <17.98 GiB VG UUID 31vxAP-L5jb-8Yxm-25m2-LdD0-ee8R-sdTjum [root@test-centos7-node1 ~]#
說明:這是已經創建好邏輯卷的系統上查看的,有關邏輯卷的管理請參考https://www.cnblogs.com/qiuhom-1874/p/12156146.html,可以看到還有17個G處於空閑狀態
2)針對現有邏輯卷創建快照
[root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618304 46591620 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8792 1923860 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt [root@test-centos7-node1 ~]# ls hellodb_innodb.sql test [root@test-centos7-node1 ~]# [root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618304 46591620 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8792 1923860 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt [root@test-centos7-node1 ~]# ls /mnt fstab inittab lost+found [root@test-centos7-node1 ~]# vgdisplay --- Volume group --- VG Name test System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 51 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 3 Act PV 3 VG Size <29.98 GiB PE Size 8.00 MiB Total PE 3837 Alloc PE / Size 1536 / 12.00 GiB Free PE / Size 2301 / <17.98 GiB VG UUID 31vxAP-L5jb-8Yxm-25m2-LdD0-ee8R-sdTjum [root@test-centos7-node1 ~]# lvcreate -L 1G -n lv_xxx_snap -p r -s /dev/test/xxx Logical volume "lv_xxx_snap" created. [root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_xxx_snap test sri-a-s--- 1.00g xxx 0.01 xxx test owi-aos--- 12.00g [root@test-centos7-node1 ~]#
說明:創建快照和創建其他邏輯卷的命令是一樣的,都是用lvcreate 其中-s就是指定創建的邏輯卷為快照 -p 指定其快照屬性 r 表示只讀屬性 最后要跟上對那個邏輯卷做快照,當然我們指定被做快照的邏輯對應設備的路徑,系統就能夠分辨出快照該創建到那個VG上,所以我們這里是可不指定VG的名稱的
[root@test-centos7-node1 ~]# lvdisplay /dev/test/lv_xxx_snap --- Logical volume --- LV Path /dev/test/lv_xxx_snap LV Name lv_xxx_snap VG Name test LV UUID ZjBpYF-2fg6-n6Wz-ehJd-Zagv-lg3y-HFmHjz LV Write Access read only LV Creation host, time test-centos7-node1, 2020-01-11 03:18:29 -0500 LV snapshot status active destination for xxx LV Status available # open 0 LV Size 12.00 GiB Current LE 1536 COW-table size 1.00 GiB COW-table LE 128 Allocated to snapshot 0.01% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3 [root@test-centos7-node1 ~]#
說明:我們創建好快照,可用lvdisplay 指定快照對應設備路徑來查看快照的詳情,這個同查看邏輯卷的詳情用法一致。可以看到該快照是用於xxx 邏輯卷的快照
3)創建掛載目錄掛載快照
[root@test-centos7-node1 ~]# mkdir /snap [root@test-centos7-node1 ~]# mount /dev/test/lv_xxx_snap /snap mount: /dev/mapper/test-lv_xxx_snap is write-protected, mounting read-only [root@test-centos7-node1 ~]# ls /snap/ fstab inittab lost+found [root@test-centos7-node1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 46G 1.6G 45G 4% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.7M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 2.0G 135M 1.9G 7% /boot tmpfs 378M 0 378M 0% /run/user/0 /dev/mapper/test-xxx 9.8G 37M 9.2G 1% /mnt /dev/mapper/test-lv_xxx_snap 9.8G 37M 9.2G 1% /snap [root@test-centos7-node1 ~]#
說明:掛載上快照,我們發現快照的大小和被做快照的大小是一致的,使用量什么的都是一致的,上面不是說快照里面存放的是被修改前的數據嗎,怎么有數據了呢,這是因為我們看到快照里面的數據不是快照本身的數據,是共享其原LV里的數據,所以我們是可以看到的,之所以能看到是系統把原有的LV數據鏡像到快照里,讓我們感覺里面是有東西的,就是告訴我們快照做好了,別擔心。這里需要注意一點,如果原LV的文件系統上xfs文件系統,掛載的時候可能出現掛載不上的情況,原因是快照的UUID和原LV的UUID相同,xfs的文件系統默認掛載選項會檢查UUID,如果沖突它會不讓你掛載的,這個時候我們掛載需要指定其選項不檢查UUID ,用 mount -o 來指定其掛載選項 nouuid 表示掛載不檢查uuid;本人是把LV的文件系統格式化成ext4,所以掛載的時候沒有加選項是可以掛載上去的;如果創建快照時沒有指定為只讀屬性,那么掛載的時候建議大家加上掛載選項為只讀,這樣掛載上的快照才能不被修改的可能。
4)修改原LV里的文件,看看快照卷里的文件是否有更改
[root@test-centos7-node1 ~]# cat /mnt/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]# cat /snap/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]# echo "this is test file " > /mnt/fstab [root@test-centos7-node1 ~]# cat /mnt/fstab this is test file [root@test-centos7-node1 ~]# cat /snap/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]#
說明:發現沒有我們修改原LV里的數據后,快照里邊的對應的文件內容沒有發生變化,所以快照里邊永遠保存的是做快照那一刻的數據狀態情況,中間怎么修改它都只保存最老的版本,LV里面保存最新版本的狀態,這里需要提醒的是快照雖然有備份的效果,但是它不能代替備份,如果vg懷了,那么邏輯卷和快照都將失效。
三、快照還原
1) 取消邏輯卷和快照的掛載
[root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618368 46591556 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8776 1923876 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 /dev/mapper/test-xxx 10190100 36896 9612536 1% /mnt /dev/mapper/test-lv_xxx_snap 10190100 36896 9612536 1% /snap [root@test-centos7-node1 ~]# umount /mnt [root@test-centos7-node1 ~]# umount /snap/ [root@test-centos7-node1 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 48209924 1618368 46591556 4% / devtmpfs 1922828 0 1922828 0% /dev tmpfs 1932652 0 1932652 0% /dev/shm tmpfs 1932652 8776 1923876 1% /run tmpfs 1932652 0 1932652 0% /sys/fs/cgroup /dev/sda1 2086912 137672 1949240 7% /boot tmpfs 386532 0 386532 0% /run/user/0 [root@test-centos7-node1 ~]#
說明:還原就是把快照和原LV合並,所以兩者都必須是處於非掛載的狀態
2)合並邏輯卷和快照,進行數據還原
[root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_xxx_snap test sri-a-s--- 1.00g xxx 0.01 xxx test owi-a-s--- 12.00g [root@test-centos7-node1 ~]# lvconvert --merge /dev/test/lv_xxx_snap Merging of volume test/lv_xxx_snap started. test/xxx: Merged: 100.00% [root@test-centos7-node1 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert xxx test -wi-a----- 12.00g [root@test-centos7-node1 ~]#
說明:合並快照和邏輯卷后,快照的的使命就完成了,當然快照也就沒有存在的意義,系統會把快照給刪除掉,在centos6上做合並是可看到刪除快照成功的提示。我們指定合並的快照就可以了,因為快照里記錄了原LV是哪一個,所以合並時不用在指定其原LV
3)掛載LV 查看數據
[root@test-centos7-node1 ~]# mount /dev/test/xxx /mnt [root@test-centos7-node1 ~]# ls /mnt fstab inittab lost+found [root@test-centos7-node1 ~]# cat /mnt/fstab # # /etc/fstab # Created by anaconda on Wed Jan 1 07:19:49 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=fea42698-b2ff-41fb-b517-a1caa0b962d7 / xfs defaults 0 0 UUID=512dff54-789c-41e8-8765-9542215f2a01 /boot xfs defaults 0 0 UUID=e2582696-1cab-4c28-9793-108602f39f24 swap swap defaults 0 0 [root@test-centos7-node1 ~]#
說明:可以看到fstab文件已經還原到被修改前的狀態。這種方式是利用快照,還原到原有LV里,如果需要還原到其他LV里 這個時候就需先要把快照里的東西給備份出來,然后再復制給到其他LV里即可,當然這種方式就不是利用快照來還原,它的本質就是文件復制到另外的地方,和快照沒有關系。快照只是記錄快照生成時的數據狀態,生產中建議利用快照來記錄快照生成當時的數據狀態,然后在把快照掛載到系統上,然后慢慢拷貝數據進行備份,拷貝完后刪除快照。一般情況快照不易在系統上生存太長時間,時間越長,影響磁盤的I/O寫入,可能影響服務器的性能。建議把快照里的數據拷完就刪除快照。