
建立快照和建立其他邏輯卷的指令是一樣的,都是用lvcreate 其中-s就是指定建立的邏輯卷為快照 -p 指定其快照屬性 r 表示隻讀屬性 最後要跟上對那個邏輯卷做快照,當然我們指定被做快照的邏輯對應裝置的路徑,系統就能夠分辨出快照該建立到那個VG上,是以我們這裡是可不指定VG的名稱的
一、快照的工作原理
所謂快照就是将當時的系統資料記錄下來,在未來若有資料變動,則會将變更前的資料放入快照區進行儲存。我們可了解為快照就是給系統拍了一張照片,記錄當時系統在拍快照的狀态。隻不過現實生活中的照片是沒有辦法将現在的生活還原到照片的時候,而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寫入,可能影響伺服器的性能。建議把快照裡的資料拷完就删除快照。
作者:Linux-1874
出處:https://www.cnblogs.com/qiuhom-1874/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.