Linux磁盤管理之LVM邏輯卷快照


  一、快照的工作原理

  所謂快照就是將當時的系統數據記錄下來,在未來若有數據變動,則會將變更前的數據放入快照區進行保存。我們可理解為快照就是給系統拍了一張照片,記錄當時系統在拍快照的狀態。只不過現實生活中的照片是沒有辦法將現在的生活還原到照片的時候,而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寫入,可能影響服務器的性能。建議把快照里的數據拷完就刪除快照。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM