本次內容
1、什么是LVM
2、為什么使用LVM
3、LVM的操作命令
4、LVM的具體操作實現
5、操作中遇到的問題
6、LVM快照
一、什么是LVM
LVM:Logical Volume Manager,即邏輯卷管理,它是Linux環境下的一種磁盤管理方式,其功能在于能彈性調整文件系統的容量。LVM中有幾個專業名詞,重點來說以下一個
PV:物理卷
LVM的基本存儲邏輯塊,但和基本的物理存儲介質(如分區、磁盤等)比較,卻包含有與LVM相關的管理參數。
VG:卷組
由一個或多個PV構成,為上層的邏輯卷提供空間
LV:邏輯卷
類似于磁盤的分區,建立在VG之上,可以再其上面創建文件系統
PE:PV的基本存儲單元,通常大小為4MB
關系如下圖所示:
可以理解為將PV打碎成一個個的PE,然后將這所有的PE組合成一個VG,此時VG就由所有的PE構成,創建LV時,就是將PE分配給LV,在LV上面我們可以創建文件系統并掛載使用了。
二、為什么使用LVM
想象一下,如果當初裝機時候你給其中一個分區20G,并且將它掛載在/home目錄上,如果有一天,其中的數據太多,20G已經不夠用了,這么搞呢,可能也
就是新增加一塊硬盤,重新分區并且格式化,然后將/home下的數據完整的復制過來,然后卸載原來的分區,掛載新的分區。好一個繁瑣的過程,而且如果下次
空間又滿了,還得重新重復以上的步驟。
此時,LVM的光輝就顯現出來了,最大的作用就是在于可以彈性的更改LV的的容量。那么問題來了,它是怎樣彈性更改LV的容量,如下圖所示
如果LV的空間不足時,分三種情況:
1、當VG還有空間時,直接將VG中的PE分配給LV,擴大其容量
2、如果VG空間分配完畢,應該向VG中增加PV,從而擴展VG的容量,然后步驟同1
3、如果現有PV使用完,可以將新的分區或者硬盤創建為PV,然后步驟同2
三、LVM的操作命令
1、PV管理工具
創建pv
pvcreate /dev/DEVICE
顯示pv信息
pvs:簡要pv信息顯示
pvdisplay
2、vg管理工具
顯示卷組
vgs
vgdisplay
創建卷組
vgcreate [-s #[kKmMgGtTpPeE]] VGNAME PVPATH
管理卷組
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath…]
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath…]
刪除卷組
先做pvmove,再做vgremove
3、lv管理工具
顯示邏輯卷
lvs
Lvdisplay
創建邏輯卷
lvcreate-L #[mMgGtT] -n NAME VolumeGroup
刪除邏輯卷
lvremove/dev/VG_NAME/LV_NAME
重設文件系統大小
fsadm[options] resize device [new_size[BKMGTEP]]
resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
4、擴展和縮減邏輯卷
擴展邏輯卷:
# lvextend-L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
# resize2fs /dev/VG_NAME/LV_NAME
縮減邏輯卷:
# umount/dev/VG_NAME/LV_NAME
# e2fsck -f /dev/VG_NAME/LV_NAME
# resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
# lvreduce-L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
# mount
四、LVM具體是如何實現的
如何在自己的虛擬機上實現LVM邏輯卷管理?步驟如下;
1)創建分區并且將分區類型更改為8e
[root@localhost ~]# fdisk /dev/sdb //對/dev/sdb硬盤進行分區 Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sdb: 85.9 GB, 85899345920 bytes, 167772160 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x0009c3cd Device Boot Start End Blocks Id System Command (m for help): n //創建一個新的分區 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-167772159, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-167772159, default 167772159): +100M Partition 1 of type Linux and of size 100 MiB is set Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 8e //更改分區類型為8e Changed type of partition 'Linux' to 'Linux LVM' //顯示更改為Linux LVM Command (m for help): p //查看一下剛才創建的分區,system類型顯示為Linux LVM Disk /dev/sdb: 85.9 GB, 85899345920 bytes, 167772160 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x0009c3cd Device Boot Start End Blocks Id System /dev/sdb1 2048 206847 102400 8e Linux LVM Command (m for help): w //存盤退出 The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@localhost ~]# partprobe //更新內存信息
重復上面步驟創建/dev/sdb2,/dev/sdb3
[root@localhost ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p //顯示分區信息 Disk /dev/sdb: 85.9 GB, 85899345920 bytes, 167772160 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x0009c3cd Device Boot Start End Blocks Id System /dev/sdb1 2048 206847 102400 8e Linux LVM //現在共有三個LVM類型的分區 /dev/sdb2 206848 411647 102400 8e Linux LVM /dev/sdb3 411648 616447 102400 8e Linux LVM
2)創建PV
[root@localhost ~]# pvcreate /dev/sdb{1,2,3} //將/dev/sdb{1,2,3}創建為PV Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdb2" successfully created Physical volume "/dev/sdb3" successfully created
3)創建VG
[root@localhost ~]# vgcreate myvg /dev/sdb{1,2} //將/dev/sdb{1,2}創建為卷組,卷組名為myvg Volume group "myvg" successfully created
4)創建LV
[root@localhost ~]# lvcreate -n mylv -L 100M myvg //創建大小為100M,名字為mylv的LV Logical volume "mylv" created. [root@localhost ~]# lvdisplay //查看系統上LV的信息,這里僅僅有且只有一個,即剛剛創建的 --- Logical volume --- LV Path /dev/myvg/mylv //路徑為/dev/myvg/mylv LV Name mylv //名稱為mylv VG Name myvg //卷組名為myvg LV UUID OkCyEj-sTkC-6Kch-svPr-UAgv-mQuf-uRofNj LV Write Access read/write LV Creation host, time localhost.localdomain, 2016-08-30 14:46:48 +0800 LV Status available # open 0 LV Size 100.00 MiB //大小為100MB Current LE 25 //LE數量,其實就是PE,因為被分配到了LV里面,所以改叫LE Segments 2 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0
5)格式化并掛載使用
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv //將mylv格式化ext4的文件系統 [root@localhost ~]# mount /dev/myvg/mylv /testdir/ //掛載到/testdir目錄下 [root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 41922560 931284 40991276 3% / devtmpfs 486140 0 486140 0% /dev tmpfs 500664 0 500664 0% /dev/shm tmpfs 500664 6936 493728 2% /run tmpfs 500664 0 500664 0% /sys/fs/cgroup /dev/sda3 20961280 3149160 17812120 16% /usr /dev/sda1 496300 140512 355788 29% /boot tmpfs 100136 0 100136 0% /run/user/0 /dev/mapper/myvg-mylv 95054 1550 86336 2% /testdir //掛載成功!
6)進入掛載目錄并且正常使用
[root@localhost ~]# cd /testdir/ //進入掛載的目錄 [root@localhost testdir]# ls lost+found [root@localhost testdir]# touch f1 //創建文件 [root@localhost testdir]# ls //創建成功! f1 lost+found [root@localhost testdir]# pwd /testdir
如果此分區的空間即將被填滿,如何擴展LV的容量?步驟如下
1)如果VG還有空間
[root@localhost testdir]# lvextend -L +50M /dev/myvg/mylv //增加50M Rounding size to boundary between physical extents: 52.00 MiB Size of logical volume myvg/mylv changed from 100.00 MiB (25 extents) to 152.00 MiB (38 extents). Logical volume mylv successfully resized. [root@localhost testdir]# lvs //簡略顯示LV的信息 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv myvg -wi-ao---- 152.00m //增加了52M,以為PE是最小存儲單元,所以必須是PE的整數倍
雖然LV顯示已經增加,但是已經掛載的目錄好像有些問題
[root@localhost testdir]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 40G 910M 40G 3% / devtmpfs 475M 0 475M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 483M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda3 20G 3.1G 17G 16% /usr /dev/sda1 485M 138M 348M 29% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/myvg-mylv 93M 1.6M 85M 2% /testdir //容量并沒有增加
此時需要從新設置文件系統的容量
[root@localhost testdir]# resize2fs /dev/myvg/mylv //重新設置LV的容量 resize2fs 1.42.9 (28-Dec-2013) Filesystem at /dev/myvg/mylv is mounted on /testdir; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 2 The filesystem on /dev/myvg/mylv is now 155648 blocks long. [root@localhost testdir]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 40G 910M 40G 3% / devtmpfs 475M 0 475M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 483M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda3 20G 3.1G 17G 16% /usr /dev/sda1 485M 138M 348M 29% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/myvg-mylv 144M 1.6M 133M 2% /testdir //容量成功增加
2)如果VG空間分配完畢,此時需要向VG中添加PV
[root@localhost testdir]# vgextend myvg /dev/sdb3 //將之前創建的PV/dev/sdb3添加至卷組myvg Volume group "myvg" successfully extended [root@localhost testdir]# vgdisplay //查看VG的詳細信息 --- Volume group --- VG Name myvg System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 6 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 288.00 MiB //增加了/dev/sdb3的容量,現在為288MB的空間。增加成功! PE Size 4.00 MiB Total PE 72 Alloc PE / Size 38 / 152.00 MiB //已經分配的PE/空間大小 Free PE / Size 34 / 136.00 MiB //空閑的的PE/空間大小 VG UUID ObuSOV-RmEg-m2Ec-GIe1-JzhC-E3kd-1XgOP
VG空間成功增加,以下步驟同上1
3)如果PV使用完畢,那就創建分區,并且更改分區類型為8e,然后pvcreate。(創建PV時候也可以直接使用磁盤)
[root@localhost testdir]# fdisk /dev/sdc Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xd7e4d605 Device Boot Start End Blocks Id System /dev/sdc1 2048 206847 102400 8e Linux LVM //LVM類型的分區 [root@localhost testdir]# pvcreate /dev/sdc1 //創建/dev/sdc1為PV Physical volume "/dev/sdc1" successfully created [root@localhost ~]# pvcreate /dev/sd{d,e} //將/dev/sd{d,e}創建為PV Physical volume "/dev/sdd" successfully created Physical volume "/dev/sde" successfully created
如果你覺得邏輯卷分配的空間太多了,也可以縮減邏輯卷
1、卸載LV
[root@localhost ~]# df -h //查看磁盤掛載信息 Filesystem Size Used Avail Use% Mounted on /dev/sda2 40G 910M 40G 3% / devtmpfs 475M 0 475M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.9M 483M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda3 20G 3.1G 17G 16% /usr /dev/sda1 485M 138M 348M 29% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/myvg-mylv 144M 1.6M 132M 2% /testdir //已使用1.6M,剩余132M可用 [root@localhost ~]# umount /dev/myvg/mylv //注意:縮減邏輯卷時候必須先卸載
2、檢測文件系統 (如果不執行這一步,直接執行第三步時候會報錯)
[root@localhost ~]# e2fsck -f /dev/myvg/mylv 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 /dev/myvg/mylv: 12/37544 files (8.3% non-contiguous), 10390/155648 blocks
3、重設文件系統的大小
[root@localhost ~]# resize2fs /dev/myvg/mylv 100M resize2fs 1.42.9 (28-Dec-2013) Resizing the filesystem on /dev/myvg/mylv to 102400 (1k) blocks. The filesystem on /dev/myvg/mylv is now 102400 blocks long.
4、縮減LV的容量
[root@localhost ~]# lvreduce -L 100M /dev/myvg/mylv //將LV縮減到100M WARNING: Reducing active logical volume to 100.00 MiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce mylv? [y/n]: yes Size of logical volume myvg/mylv changed from 152.00 MiB (38 extents) to 100.00 MiB (25 extents). Logical volume mylv successfully resized. [root@localhost ~]# lvs //查看LV的大小 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv myvg -wi-a----- 100.00m //顯示100M,縮減成功
5、重新掛載并查看
[root@localhost ~]# mount /dev/myvg/mylv /testdir/ [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 40G 910M 40G 3% / devtmpfs 475M 0 475M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 483M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda3 20G 3.1G 17G 16% /usr /dev/sda1 485M 138M 348M 29% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/myvg-mylv 93M 1.6M 85M 2% /testdir //縮減成功!
注意縮減時候,計算好要縮減的空間大小,縮減的空間大小如果比已經使用的空間還要小,那就會出問題了。而且,為避免文件損壞,縮減時候一定要首先卸載邏輯卷,然后再檢查一次文件系統。所以,縮減前最好對原始數據做好備份。
五、操作中遇到的問題
1、之前創建過RAID或者其他類型的分區時,會出現下圖提醒,此時會提示是否輸入Y來抹去它,輸入Y即創建成功
2、如果邏輯卷格式化的為ext系列的文件系統,改變文件類型大小的時候,使用resize2fs命令,如果格式化為xfs的文件系統需要使用xfs_growfs。
六、LVM快照
LVM快照就是先將當時的信息記錄下來,這時候并沒有發生數據的復制,僅僅是創建了一個快照邏輯卷,當被快照的LV里的數據發生改動時,則原始數據會移動到快照區域,沒有改動的數據區域則由快照區和原本的LV共享。
注意:由于快照區與原本的LV共用很多PE的區塊,因此快照去與被快照的LV必須要要在同一個VG上!系統恢復的時候的文件數量不能高于快照區的實際容量。
快照只有在它們和原來的邏輯卷不同時才會消耗空間。
1、在生成快照時會分配給它一定的空間,但只有在原來的邏輯卷或者快照有所改變才會使用這些空間
2、當原來的邏輯卷中有所改變時,會將舊的數據復制到快照中。
3、快照中只含有原來的邏輯卷中更改的數據或者自生成快照后的快照中更改的數據
4、建立快照的卷大小只需要原始邏輯卷的15%~20%就夠了。也可以使用lvextend放大快照。
LVM快照的使用:
1、在原始LV中創建文件
[root@localhost ~]# lvs //查看當前lv LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv myvg -wi-a----- 10.00g [root@localhost ~]# vgs //查看當前vg VG #PV #LV #SN Attr VSize VFree myvg 1 1 0 wz--n- 20.00g 10.00g [root@localhost testdir]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 41922560 754800 41167760 2% / devtmpfs 486140 0 486140 0% /dev tmpfs 500664 0 500664 0% /dev/shm tmpfs 500664 6896 493768 2% /run tmpfs 500664 0 500664 0% /sys/fs/cgroup /dev/sda3 20961280 3149280 17812000 16% /usr /dev/sda1 496300 140512 355788 29% /boot tmpfs 100136 0 100136 0% /run/user/0 /dev/mapper/myvg-mylv 10190100 36892 9612536 1% /testdir //原始LV掛載目錄 [root@localhost testdir]# touch f1 f2 f3 //創建3個空文件 [root@localhost testdir]# ls f1 f2 f3 lost+found
2、對原始LV進行快照
[root@localhost testdir]# lvcreate -n mylv-snap -s -p r -L 5G /dev/myvg/mylv //-n表示快照LV的名稱 -s 表示創建快照LV,-L代表快照LV的大小、 -p r表示未只讀, Logical volume "mylv-snap" created. [root@localhost testdir]# mount /dev/myvg/mylv-snap /mnt/snap //將快照掛載至/mnt/snap mount: /dev/mapper/myvg-mylv--snap is write-protected, mounting read-only [root@localhost testdir]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 41922560 754816 41167744 2% / devtmpfs 486140 0 486140 0% /dev tmpfs 500664 0 500664 0% /dev/shm tmpfs 500664 6896 493768 2% /run tmpfs 500664 0 500664 0% /sys/fs/cgroup /dev/sda3 20961280 3149280 17812000 16% /usr /dev/sda1 496300 140512 355788 29% /boot tmpfs 100136 0 100136 0% /run/user/0 /dev/mapper/myvg-mylv 10190100 36888 9612540 1% /testdir /dev/mapper/myvg-mylv--snap 10190100 36888 9612540 1% /mnt/snap [root@localhost testdir]# cd /mnt/snap //cd至此目錄 [root@localhost snap]# ls //查看已有原始LV的f1,f2,f3文件 f1 f2 f3 lost+found
3、測試快照
[root@localhost snap]# echo f1 > /testdir/f1 //向原始LV中添加f1至f1文件中 [root@localhost snap]# cat /testdir/f1 //查看原始LV的f1文件 f1 [root@localhost snap]# cat f1 //查看快照f1,依然是空文件,快照成功 [root@localhost snap]#
4、刪除快照
[root@localhost ~]# umount /mnt/snap //首先卸載快照LV [root@localhost ~]# lvremove /dev/myvg/mylv-snap //移除快照LV Do you really want to remove active logical volume mylv-snap? [y/n]: y Logical volume "mylv-snap" successfully removed
謝謝瀏覽…
原創文章,作者:我的滑板鞋,如若轉載,請注明出處:http://www.www58058.com/42631