Linux磁盤管理之LVM與快照解讀
引言
邏輯卷管理LVM是硬盤的?個系統(tǒng)?具。?論在Linux或者其他類似的系統(tǒng),都是?常的好?。傳統(tǒng)分區(qū)使?固定??分區(qū),重新調(diào)整???分麻煩。但是,LVM可以創(chuàng)建和管理“邏輯”卷,?不是直接使?物理硬盤。可以讓管理員彈性的管理邏輯卷的擴(kuò)?縮?,操作簡單,?不損壞已存儲的數(shù)據(jù)。可以隨意將新的硬盤添加到LVM,以直接擴(kuò)展已經(jīng)存在的邏輯卷。LVM并不需要重啟就可以讓內(nèi)核知道分區(qū)的存在。
當(dāng)剛開始安裝Linux系統(tǒng)時,往往不能確定每個分區(qū)使用的空間大小,只能憑經(jīng)驗分配不科學(xué)。
- 如果分區(qū)設(shè)置的過大,就浪費了磁盤空間,
- 如果分區(qū)設(shè)置的過小,就會導(dǎo)致空間不夠
- 如何希望分配的空間過大或過小,都能動態(tài)調(diào)整,則需要使用到 LVM 邏輯卷
一、邏輯卷
1.LVM優(yōu)缺點
LVM 是 Logical Volume Manager 邏輯卷管理的簡寫,它是對磁盤分區(qū)管理的一種機(jī)制
優(yōu)點:
- LVM 可以創(chuàng)建和管理邏輯卷,而不是直接使用物理硬盤
- LVM 可以彈性的管理邏輯卷的擴(kuò)大縮小,操作簡單,而不損壞已存儲的數(shù)據(jù)
- LVM 可以隨意將新的硬盤添加到LVM,以直接擴(kuò)展已經(jīng)存在的邏輯卷
- 可以在系統(tǒng)運?的狀態(tài)下動態(tài)的擴(kuò)展?件系統(tǒng)的??
- ?件系統(tǒng)可以跨多個磁盤,因此?件系統(tǒng)??不會受物理磁盤的限制
- 可以以鏡像的?式冗余重要的數(shù)據(jù)到多個物理磁盤
- 可以?便的導(dǎo)出整個卷組到另外?臺機(jī)器
缺點:
- LVM 如果有一個磁盤損壞,整個 LVM 都壞了,LVM 只有動態(tài)擴(kuò)展作用
- 因為加?了額外的操作,存取性能受到影響
解決辦法:底層用 RAID + 上層用LVM = 既有冗余又有動態(tài)擴(kuò)展;
2. 基本概念
- 物理卷(PV):(physical volume),把常規(guī)的磁盤設(shè)備通過pvcreate命令對其進(jìn)?初始化,形成了物理卷。其實就是硬盤或分區(qū)。(?粉)
- 卷組(VG):(volume group),把多個物理卷組成?個邏輯的整體,這樣卷組的??就是多個硬盤之和?;蛘呃斫饩褪怯?個或多個PV組成的整體。(?團(tuán))
- 邏輯卷(LV):(logical volume),從卷組中劃分需要的空間??出來。?戶僅需對其格式化然后即可掛載使?。從VG中切割出的空間?于創(chuàng)建?件系統(tǒng)。(切成饅頭)
- 基本單元(PE):(physical extend),分配的邏輯大小的最小單元,默認(rèn)為4MB的基本塊。(假設(shè)分配100MB邏輯空間,則需要創(chuàng)建25個PE)

注意:制作pv,可以對分區(qū)做、也可以對整塊盤做
二、LVM配置實操
環(huán)境與步驟
- 這里準(zhǔn)備兩塊物理磁盤(當(dāng)然也可以準(zhǔn)備多塊),一塊上已經(jīng)分區(qū)。建議在虛擬機(jī)關(guān)閉狀態(tài)添加,以便更好的實驗
- .創(chuàng)建物理卷,將普通磁盤轉(zhuǎn)換為物理卷
- 創(chuàng)建卷組, 將物理卷加入到卷組中
- 在卷組中劃分邏輯卷,然后掛載使用
1、下載安裝包
yum install -y lvm2
查看磁盤狀態(tài)
[root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 49G 0 part ├─centos-root 253:0 0 47G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk ├─sdb1 8:17 0 10G 0 part └─sdb2 8:18 0 10G 0 part sdc 8:32 0 100G 0 disk sr0 11:0 1 4.4G 0 rom [root@localhost ~]#
我們用/dev/sdb1分區(qū) 和 /dev/sdc整個磁盤做pv
1.制作pv
pvcreate 設(shè)備名
root@localhost ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created. [root@localhost ~]# pvcreate /dev/sdc Physical volume "/dev/sdc" successfully created.
2.查看pv
pvs
[root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <49.00g 4.00m # 系統(tǒng)自己創(chuàng)建的 /dev/sdb1 lvm2 --- 10.00g 10.00g # 我們創(chuàng)建的 /dev/sdc lvm2 --- 100.00g 100.00g # 我們創(chuàng)建的 [root@localhost ~]#
3.制作卷組vg
vgcreate 卷組名 pv名
[root@localhost ~]# vgcreate test_vg /dev/sdb1 /dev/sdc Volume group "test_vg" successfully created
4.查看vg
vgs
[root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree centos 1 2 0 wz--n- <49.00g 4.00m # 系統(tǒng)默認(rèn)創(chuàng)建的 test_vg 2 0 0 wz--n- 109.99g 109.99g # 我們自己創(chuàng)建的 [root@localhost ~]#
5.創(chuàng)建邏輯卷lvm(也可以創(chuàng)建多個邏輯卷)
lvcreate 選項
選項 -L #邏輯卷?? -n #邏輯卷名字
分配50g大小給lv1_from_test_vg
[root@localhost ~]# lvcreate -L 50G -n lv1_from_test_vg test_vg Logical volume "lv1_from_test_vg" created.
6.查看vg
lvslvscan
[root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root centos -wi-ao---- 46.99g swap centos -wi-ao---- 2.00g lv1_from_test_vg test_vg -wi-a----- 50.00g 或者 [root@localhost ~]# lvscan ACTIVE '/dev/test_vg/lv1_from_test_vg' [50.00 GiB] inherit # 自己創(chuàng)建的 ACTIVE '/dev/centos/swap' [2.00 GiB] inherit # 系統(tǒng)默認(rèn) ACTIVE '/dev/centos/root' [46.99 GiB] inherit # 系統(tǒng)默認(rèn)
7.創(chuàng)建文件系統(tǒng)
mkfs.xfs 邏輯卷名
[root@localhost ~]# mkfs.xfs /dev/test_vg/lv1_from_test_vg
8.創(chuàng)建目錄掛載使用
[root@localhost ~]# mkdir /lv1 [root@localhost ~]# mount -t xfs /dev/test_vg/lv1_from_test_vg /lv1
9.查看掛載情況
[root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 47G 1.3G 46G 3% / /dev/sda1 1014M 138M 877M 14% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/test_vg-lv1_from_test_vg 50G 33M 50G 1% /lv1 [root@localhost ~]#
不要縮容!??!并且xfs?脆不?持縮容
不要縮容!??!并且xfs?脆不?持縮容
不要縮容?。?!并且xfs?脆不?持縮容
所以下面的縮容純屬了解
二、卷組的在線擴(kuò)展與縮容
1. vg擴(kuò)容
1.準(zhǔn)備新的硬盤加入到pv,檢查pv大小。
這里我們還有/dev/sdb2,可以將其加入卷組,方法都一樣,為了簡化就不插入新硬盤了。
[root@localhost ~]# pvcreate /dev/sdb2 Physical volume "/dev/sdb2" successfully created. [root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <49.00g 4.00m /dev/sdb1 test_vg lvm2 a-- <10.00g <10.00g /dev/sdb2 lvm2 --- <10.00g <10.00g /dev/sdc test_vg lvm2 a-- <100.00g <50.00g [root@localhost ~]#
使用vgextend 擴(kuò)展卷組 在已經(jīng)存在的卷組test_vg(上面我們自己創(chuàng)建的)上擴(kuò)展卷組
vgextend 原卷組名 創(chuàng)建的新pv
[root@localhost ~]# vgextend test_vg /dev/sdb2 Volume group "test_vg" successfully extended
再次檢查卷組,發(fā)現(xiàn)已經(jīng)變大了(之前總大小是110G),說明擴(kuò)容成功
現(xiàn)在總大小是120G,正好是/dev/sdb 和/dev/sdc大小之和。
[root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree centos 1 2 0 wz--n- <49.00g 4.00m test_vg 3 1 0 wz--n- <119.99g <69.99g
2. vg縮容
假設(shè)想移除 /dev/sdb(/dev/sdb1) 磁盤,建議先將 sdb 磁盤數(shù)據(jù)先遷移到 sdc 磁盤,然后在移除
注意:同一卷組的磁盤才可以進(jìn)行在線遷移
1.檢查當(dāng)前邏輯卷 VG 中 PV 使用情況
[root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <49.00g 4.00m /dev/sdb1 test_vg lvm2 a-- <10.00g <10.00g /dev/sdb2 test_vg lvm2 a-- <10.00g <10.00g /dev/sdc test_vg lvm2 a-- <100.00g <50.00g
2.pvmove 在線數(shù)據(jù)遷移,將 sdb1 的數(shù)據(jù)遷移至 其他盤(可以是sdb2也可以是sdc,隨機(jī)的)
# 因為我們現(xiàn)在所有的磁盤都是空的,模擬寫入點數(shù)據(jù)方便遷移
否則會報錯No data to move for test_vg
[root@localhost ~]# touch /lv1/{a..z}.txt
[root@localhost ~]# pvmove /dev/sdb1 # 實際業(yè)務(wù)中如果這個磁盤有數(shù)據(jù),那它就會執(zhí)行成功
3.檢查是否將 sdb1 數(shù)據(jù)遷移至 其他盤
[root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <49.00g 4.00m /dev/sdb1 test_vg lvm2 a-- <10.00g <10.00g /dev/sdb2 test_vg lvm2 a-- <10.00g <10.00g /dev/sdc test_vg lvm2 a-- <100.00g <50.00g [root@localhost ~]#
4.從卷組中移除 sdb 磁盤
vgreduce vg名 設(shè)備名
[root@localhost ~]# vgreduce test_vg /dev/sdb1 Removed "/dev/sdb1" from volume group "test_vg"
5.查看
root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <49.00g 4.00m /dev/sdb1 lvm2 --- 10.00g 10.00g /dev/sdb2 test_vg lvm2 a-- <10.00g <10.00g /dev/sdc test_vg lvm2 a-- <100.00g <50.00g [root@localhost ~]#
三、邏輯卷的在線擴(kuò)容與縮容
1. lv擴(kuò)容
擴(kuò)展邏輯卷:取決于 vg 卷中是否還有剩余的容量
注意擴(kuò)展邏輯卷不能超過卷組 VG 的總大小
[root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree centos 1 2 0 wz--n- <49.00g 4.00m test_vg 2 1 0 wz--n- 109.99g 59.99g [root@localhost ~]#
可以看到vg還有60G剩余
再看看lv
[root@localhost ~]# lvscan ACTIVE '/dev/test_vg/lv1_from_test_vg' [50.00 GiB] inherit ACTIVE '/dev/centos/swap' [2.00 GiB] inherit ACTIVE '/dev/centos/root' [46.99 GiB] inherit [root@localhost ~]#
給lv1_from_test_vg邏輯卷擴(kuò)容+10G
[root@localhost ~]# lvextend -L +10G /dev/test_vg/lv1_from_test_vg Size of logical volume test_vg/lv1_from_test_vg changed from 50.00 GiB (12800 extents) to 60.00 GiB (15360 extents). Logical volume test_vg/lv1_from_test_vg successfully resized. [root@localhost ~]# #也可以選擇分配卷組中多少百分比給邏輯卷 [root@localhost ~]# lvextend -l +50%FREE /dev/test_vg/lv1_from_test_vg
查看擴(kuò)展后lv
[root@localhost ~]# lvscan ACTIVE '/dev/test_vg/lv1_from_test_vg' [60.00 GiB] inherit ACTIVE '/dev/centos/swap' [2.00 GiB] inherit ACTIVE '/dev/centos/root' [46.99 GiB] inherit [root@localhost ~]#
可以看到,/dev/test_vg/lv1_from_test_vg 確實增大了10G
擴(kuò)展邏輯卷后需要更新fs文件系統(tǒng)
xfs_growfs 具體的lv名稱# xfs文件格式擴(kuò)容resize2fs 具體的lv名稱# ext文件格式擴(kuò)容
[root@localhost ~]# xfs_growfs /dev/test_vg/lv1_from_test_vg
2. 刪除lv
1.先卸載掛載點,然后在移除邏輯卷
[root@localhost ~]# umount /dev/test_vg/lv1_from_test_vg
2.刪除lv
lvremove
[root@localhost ~]# lvremove /dev/test_vg/lv1_from_test_vg Do you really want to remove active logical volume test_vg/lv1_from_test_vg? [y/n]: y Logical volume "lv1_from_test_vg" successfully removed [root@localhost ~]#
3.刪除 vg
vgremove vg名稱
[root@localhost ~]# vgremove test_vg Volume group "test_vg" successfully removed [root@localhost ~]#
4.刪除pv
pvremove
[root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <49.00g 4.00m /dev/sdb1 lvm2 --- 10.00g 10.00g /dev/sdb2 lvm2 --- <10.00g <10.00g /dev/sdc lvm2 --- 100.00g 100.00g [root@localhost ~]# pvremove /dev/sdb1 Labels on physical volume "/dev/sdb1" successfully wiped. [root@localhost ~]# pvremove /dev/sdb2 Labels on physical volume "/dev/sdb2" successfully wiped. [root@localhost ~]# pvremove /dev/sdc Labels on physical volume "/dev/sdc" successfully wiped. [root@localhost ~]#
四、快照
LVM 機(jī)制還提供了對 LV 做快照的功能,也就是說可以給?件系統(tǒng)做?個備份,這也是設(shè)計 LVM 快照的主要?的。LVM 的快照功能采?寫時復(fù)制技術(shù)(Copy-On-Write,COW),這?傳統(tǒng)的備份技術(shù)的效率要?很多。創(chuàng)建快照時不?停?服務(wù),就可以對數(shù)據(jù)進(jìn)?備份。說明:LVM 還?持 thin 類型的快照,但是本?中的快照都是指 COW 類型的快照。
LVM 采?的寫時復(fù)制,是指當(dāng) LVM 快照創(chuàng)建的時候,僅創(chuàng)建到實際數(shù)據(jù)的 inode 的硬鏈接(hark-link)?已。只要實際的數(shù)據(jù)沒有改變,快照就只包含指向數(shù)據(jù)的 inode 的指針,??數(shù)據(jù)本身??煺諘櫾季碇袎K的改變,?旦你更改了快照對應(yīng)的?件或?錄,這個時候原始卷上將要改變的數(shù)據(jù)會在改變之前拷?到快照預(yù)留的空間
lvm快照的原理:

創(chuàng)建快照實際上也是創(chuàng)建了?個邏輯卷,只不過該卷的屬性與普通邏輯卷的屬性有些不?樣。我們可以通過上圖來理解快照數(shù)據(jù)卷(圖中的實線框表示快照區(qū)域,虛線框表示?件系統(tǒng)):
#左圖為最初創(chuàng)建的快照數(shù)據(jù)卷狀況,LVM 會預(yù)留?個區(qū)域 (?如左圖的左側(cè)三個 PE 區(qū)塊) 作為數(shù)據(jù)存放處。
此時快照數(shù)據(jù)卷內(nèi)并沒有任何數(shù)據(jù),?快照數(shù)據(jù)卷與源數(shù)據(jù)卷共享所有的 PE 數(shù)據(jù), 因此你會看到快照數(shù)據(jù)卷的內(nèi)容與源數(shù)據(jù)卷中的內(nèi)容是?模?樣的。
等到系統(tǒng)運??陣?后,假設(shè) A 區(qū)域的數(shù)據(jù)被更新了(上?右圖所示),則更新前系統(tǒng)會將該區(qū)域的數(shù)據(jù)移動到快照數(shù)據(jù)卷中,所以在右圖的快照數(shù)據(jù)卷中被占?了?塊 PE 成為 A,?其他 B 到 I 的區(qū)塊則還是與源數(shù)據(jù)卷共享!
由于快照區(qū)與原本的 LV 共享很多 PE 區(qū)塊,因此快照區(qū)與被快照的 LV 必須要在同?個 VG 上頭,
下?兩點?常重要:
- 1、VG中需要預(yù)留存放快照本身的空間,不能全部被占滿。
- 2、快照所在的 VG 必須與被備份的 LV 相同,否則創(chuàng)建快照會失敗。
總結(jié)
快照的本質(zhì)就是?個特殊的lv,創(chuàng)建快照后,如果源數(shù)據(jù)卷中的?件被更新了,會將?數(shù)據(jù)賦給快照的
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Centos7 firewall和docker沖突問題及解決過程
本文描述了一個在CentOS 7上使用firewalld和Docker容器的問題,當(dāng)firewalld啟動或重啟時,會從iptables中移除Docker的規(guī)則,導(dǎo)致Docker容器中的服務(wù)無法訪問,最終,作者通過先啟動或重啟防火墻,然后重啟Docker服務(wù),并刪除有問題的容器,重新創(chuàng)建容器來解決了問題2025-12-12
解決nginx/apache靜態(tài)資源跨域訪問問題詳解
有時為了優(yōu)化網(wǎng)站訪問速度,會給一些靜態(tài)資源配置cdn加速,但是有時候會出現(xiàn)跨域訪問的問題,在nginx和apache服務(wù)中可進(jìn)行如下配置2018-10-10

