寫在前面:
博客書寫牢記5W1H法則:What,Why,When,Where,Who,How。
本篇主要內容:
● LVM基本介紹
● LVM結構
● LVM命令工具
pv ...
vg ...
lv ...
LVM基本介紹
Logical Volume Manager (version2)
LVM功能是由內核模塊dm(device mapper)提供的,該模塊能夠將一個或多個底層設備組織成一個邏輯設備。設備具體目錄在/dev/dm-#。
LVM設備路徑:
/dev/mapper/VG_NAME-LV_NAME 爲鏈接文件,指向dm模塊生成的設備。
/dev/VG_NAME/LV_NAME 爲鏈接文件,指向dm模塊生成的設備。
特點;
(1)可屏蔽底層磁盤佈局,便於動態調整磁盤容量。
(2)可將多個磁盤或分區組合成一個大的“虛擬磁盤”,整合零散空間。並可在將來進行磁盤或分區的新增與移除。
(3)通過快照,可以實現COW(Copy On Write)。以方便在掛載的情況下完成備份等操作。
(4)/boot分區不能放置在LVM。
LVM結構:
LVM是由3層結構組成的。
PV(Physical Volume):將獨立的磁盤或分區標記爲物理卷,以備上層使用。
VG(Volume Group):將PV進行整合,形成一個大的“虛擬磁盤”。隱藏物理差別,格式化最小單位爲PE(Physical Expend),默認PE大小爲4MB。
LV(Logical Volume):類似於分區之於磁盤,LV也相當於VG的分區,創建LV之後就可以格式化使用了。
命令工具:
PV:
pvcreate
pvcreate /dev/DEVICE 創建PV
pvs
簡要顯示pv列表及使用情況
pvdisplay
顯示pv詳細信息
pvmove
pvmove FROM_PV TO_PV 移動PV上的數據到另一個PV上
pvremove
pvremove /dev/DEVICE 刪除PV設備
VG:
vgcreate
vgcreate VG_NAME [-s #[KMGT]] /dev/DEVICE 創建vg,-s指定PE大小
vgs
vgdisplay
vgremove
vgextend
vgextend VG_NAME /dev/DEVICE 擴展vg容量,添加PV
vgreduce
vgreduce VG-NAME /dev/DEVICE 縮減vg容量,移除PV
LV:
lvcreate
lvcreate -L SIZE -n LV_NAME VG_NAME
lvcreate -L SIZE -p r -s -n LV_NAME VG_NAME 創建快照LV卷,權限爲只讀。
lvs
lvdisplay
lvremove
lvextend
lvextend -L [+]SIZE /dev/VG_NAME/LV_NAME
lvreduce
lvreduce -L [-]SIZE /dev/VG_NAME/LV_NAME
備份介紹:
冷備份:卸載文件系統,不能讀寫。
溫備份:不卸載文件系統,可讀,不可寫。
熱備份:不卸載文件系統,可讀寫。
LV的擴展:
擴展應該由底層到高層,從PV --> VG --> LV --> 文件系統層層操作。可以在掛載的同時操作。
LV的縮減:
縮減操作應該先卸載文件系統,由高層到底層,從文件系統 --> LV --> VG --> PV層層操作,直到最後移除硬盤。
LV的快照:
LV快照支持掛載文件系統的情況下進行操作,保證業務不中斷。但對於頻繁寫入的文件系統,應先停止所有寫操作(如數據庫進行鎖操作),而後快速執行快照,再恢復業務。快照期間,頻繁的寫入可能會影響寫入速度,完成備份等操作後,應及時刪除快照卷。
創建LVM並掛載使用
#fdisk工具創建2個分區,分區大小分別爲15G和5G,並指定標識符爲8e(Linux LVM) [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT fd0 2:0 1 4K 0 disk sda 8:0 0 120G 0 disk ├─sda1 8:1 0 500M 0 part /boot ├─sda2 8:2 0 40G 0 part / ├─sda3 8:3 0 20G 0 part /usr ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 15G 0 part └─sda6 8:6 0 5G 0 part sr0 11:0 1 1024M 0 rom #使用分區創建pv [root@localhost ~]# pvcreate /dev/sda5 Physical volume "/dev/sda5" successfully created [root@localhost ~]# pvcreate /dev/sda6 Physical volume "/dev/sda6" successfully created #使用已劃分爲pv的分區創建vg [root@localhost ~]# vgcreate TESTVG -s 16M /dev/sda{5,6} Volume group "TESTVG" successfully created #在剛創建的vg上創建lv,大小爲5G root@localhost ~]# lvcreate -L 5G -n TESTLV TESTVG WARNING: swap signature detected on /dev/TESTVG/TESTLV at offset 4086. Wipe it? [y/n]: y Wiping swap signature on /dev/TESTVG/TESTLV. Logical volume "TESTLV" created. #格式化LV爲ext4文件類型,塊大小爲4K,卷標爲TESTLV [root@localhost ~]# mke2fs -L TESTLV -b 4096 -t ext4 /dev/TESTVG/TESTLV ...省略輸出... #掛載並設置開機掛載到/users目錄 [root@localhost ~]# mkdir /users [root@localhost ~]# mount /dev/TESTVG/TESTLV /users [root@localhost ~]# blkid /dev/TESTVG/TESTLV /dev/TESTVG/TESTLV: LABEL="TESTLV" UUID="a23cfb47-1e13-44d8-80ac-6081b7371abd" TYPE="ext4" [root@localhost ~]# vim /etc/fstab #添加以下內容: UUID=a23cfb47-1e13-44d8-80ac-6081b7371abd /users ext4 defaults 0 0 #一定使用mount -a檢查下/etc/fstab文件是否正確。如果正確,會掛載文件中設置的所有條目,否則,會提示錯誤。 [root@localhost ~]# mount -a [root@localhost ~]# mount | grep /users /dev/mapper/TESTVG-TESTLV on /users type ext4 (rw,relatime,seclabel,data=ordered) #嘗試寫入數據,我們這裏新建用戶archlinux並讓/users/archlinux作爲其家目錄 [root@localhost ~]# useradd archlinux -d /users/archlinux [root@localhost ~]# su - archlinux [archlinux@localhost ~]$ cp /etc/pam.d/* /users/archlinux/
#擴展TESTLV至7G
[root@localhost ~]# lvextend -L 7G /dev/TESTVG/TESTLV Size of logical volume TESTVG/TESTLV changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents). Logical volume TESTLV successfully resized. #擴展ext4文件系統與LV一致 [root@localhost ~]# resize2fs /dev/TESTVG/TESTLV resize2fs 1.42.9 (28-Dec-2013) Filesystem at /dev/TESTVG/TESTLV is mounted on /users; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 1 The filesystem on /dev/TESTVG/TESTLV is now 1835008 blocks long. #查看塊設備已擴展到7G,掛載目錄的數據未丟失 [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT fd0 2:0 1 4K 0 disk sda 8:0 0 120G 0 disk ├─sda1 8:1 0 500M 0 part /boot ├─sda2 8:2 0 40G 0 part / ├─sda3 8:3 0 20G 0 part /usr ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 15G 0 part │ └─TESTVG-TESTLV 253:0 0 7G 0 lvm /users └─sda6 8:6 0 5G 0 part sr0 11:0 1 1024M 0 rom [root@localhost ~]# ls /users/archlinux/ atd gdm-launch-environment password-auth setup system-auth chfn gdm-password password-auth-ac smartcard-auth system-auth-ac chsh gdm-pin polkit-1 smartcard-auth-ac systemd-user config-util gdm-smartcard postlogin smtp vlock crond kcheckpass postlogin-ac smtp.postfix vmtoolsd cups kscreensaver ppp sshd xserver fingerprint-auth liveinst remote su fingerprint-auth-ac login runuser sudo gdm-autologin other runuser-l sudo-i gdm-fingerprint passwd screen su-l
#縮減TESTLV的大小至3G。縮減前請一定確定已使用空間要小於縮減後的空間。
[root@localhost ~]# umount /dev/TESTVG/TESTLV #在調整文件系統大小前,需要先檢查設備是否有文件系統錯誤 [root@localhost ~]# e2fsck -f /dev/TESTVG/TESTLV e2fsck 1.42.9 (28-Dec-2013) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information TESTLV: 70/458752 files (0.0% non-contiguous), 67386/1835008 blocks #調整文件系統大小 [root@localhost ~]# resize2fs /dev/TESTVG/TESTLV 3G resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/TESTVG/TESTLV to 786432 (4k) blocks. The filesystem on /dev/TESTVG/TESTLV is now 786432 blocks long. #調整LV大小,會有安全風險,重要數據需備份 [root@localhost ~]# lvreduce -L 3G /dev/TESTVG/TESTLV WARNING: Reducing active logical volume to 3.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce TESTLV? [y/n]: y Size of logical volume TESTVG/TESTLV changed from 7.00 GiB (448 extents) to 3.00 GiB (192 extents). Logical volume TESTLV successfully resized. #重新掛載,慶幸的是文件都還在 [root@localhost ~]# mount -a [root@localhost ~]# ls /users/archlinux/ atd gdm-launch-environment password-auth setup system-auth chfn gdm-password password-auth-ac smartcard-auth system-auth-ac chsh gdm-pin polkit-1 smartcard-auth-ac systemd-user config-util gdm-smartcard postlogin smtp vlock crond kcheckpass postlogin-ac smtp.postfix vmtoolsd cups kscreensaver ppp sshd xserver fingerprint-auth liveinst remote su fingerprint-auth-ac login runuser sudo gdm-autologin other runuser-l sudo-i gdm-fingerprint passwd screen su-l
#釋放設備/分區
#分配了20G的VG,只使用了不到1G,我們來把15G的/dev/sda5釋放出來。 [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT fd0 2:0 1 4K 0 disk sda 8:0 0 120G 0 disk ├─sda1 8:1 0 500M 0 part /boot ├─sda2 8:2 0 40G 0 part / ├─sda3 8:3 0 20G 0 part /usr ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 15G 0 part │ └─TESTVG-TESTLV 253:0 0 3G 0 lvm /users └─sda6 8:6 0 5G 0 part sr0 11:0 1 1024M 0 rom #由於LV只有3G,而我們將要剩餘的/dev/sda6有5G空間,所以,文件系統我們無需再縮減;但我們看到TESTLV的數據都在/dev/sda5上面,直接從VG移除/dev/sda5必然會損失數據,所以,我們先將/dev/sda5上的數據移動到/dev/sda6上面。 [root@localhost ~]# pvmove /dev/sda5 /dev/sda6 /dev/sda5: Moved: 0.0% /dev/sda5: Moved: 12.0% /dev/sda5: Moved: 25.0% /dev/sda5: Moved: 37.5% /dev/sda5: Moved: 46.4% /dev/sda5: Moved: 57.8% /dev/sda5: Moved: 72.9% /dev/sda5: Moved: 100.0% [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT fd0 2:0 1 4K 0 disk sda 8:0 0 120G 0 disk ├─sda1 8:1 0 500M 0 part /boot ├─sda2 8:2 0 40G 0 part / ├─sda3 8:3 0 20G 0 part /usr ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 15G 0 part └─sda6 8:6 0 5G 0 part └─TESTVG-TESTLV 253:0 0 3G 0 lvm /users sr0 11:0 1 1024M 0 rom #OK,把/dev/sda6從TESTVG移除,移除此PV [root@localhost ~]# vgreduce TESTVG /dev/sda5 Removed "/dev/sda5" from volume group "TESTVG" [root@localhost ~]# pvremove /dev/sda5 Labels on physical volume "/dev/sda5" successfully wiped [root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda6 TESTVG lvm2 a-- 4.98g 1.98g
#爲LV創建快照。
#注意養成好習慣,在快照創建時,就應該設置爲只讀!快照建立前,首先要確保並沒有程序正在寫入操作。避免數據不完整
[root@localhost ~]# lvcreate -L 1G -s -p r -n TESTLV_SNAPSHOT /dev/TESTVG/TESTLV Logical volume "TESTLV_SNAPSHOT" created. #掛載LV快照快照,驗證在原LV新建數據,快照LV仍爲快照時刻的數據 [root@localhost ~]# mount /dev/TESTVG/TESTLV_SNAPSHOT /backup mount: /dev/mapper/TESTVG-TESTLV_SNAPSHOT is write-protected, mounting read-only [root@localhost ~]# echo "new file" > /users/archlinux/newfile [root@localhost ~]# ls /users/archlinux/newfile /users/archlinux/newfile [root@localhost ~]# ls /backup/archlinux/newfile ls: cannot access /backup/archlinux/newfile: No such file or directory #數據備份完成後,卸載LV快照 [root@localhost ~]# umount /dev/TESTVG/TESTLV_SNAPSHOT [root@localhost ~]# lvremove /dev/TESTVG/TESTLV_SNAPSHOT Do you really want to remove active logical volume TESTLV_SNAPSHOT? [y/n]: y Logical volume "TESTLV_SNAPSHOT" successfully removed