前言
LVM 邏輯卷管理,是對磁盤分區(qū)進行管理的一種機制,建立在硬盤和分區(qū)之上咙俩,文件系統(tǒng)之下的一個邏輯層,可以提高磁盤分區(qū)管理的靈活性湿故,基于lvm可以實現(xiàn)分區(qū)的擴容
許多Linux使用者安裝操作系統(tǒng)時都會遇到這樣的困境:如何精確評估和分配各個硬盤分區(qū)的容量阿趁,如果當初評估不準確,一旦系統(tǒng)分區(qū)不夠用時可能不得不備份坛猪、刪除相關(guān)數(shù)據(jù)脖阵,甚至被迫重新規(guī)劃分區(qū)并重裝操作系統(tǒng),以滿足應(yīng)用系統(tǒng)的需要墅茉。
LVM是Linux環(huán)境中對磁盤分區(qū)進行管理的一種機制命黔,是建立在硬盤和分區(qū)之上、文件系統(tǒng)之下的一個邏輯層躁锁,可提高磁盤分區(qū)管理的靈活性纷铣。centos7默認安裝的分區(qū)格式就是LVM邏輯卷的格式。
下面就lvm的原理和使用做詳細的記錄介紹
正文
平時战转,如果是機房中的線下服務(wù)器搜立,都推薦使用lvm進行磁盤管理,可以更加靈活槐秧,當然一般大的公司可能會有更好的存儲設(shè)備啄踊,進行統(tǒng)一儲存忧设,但這也不影響,推薦是能用lvm就用lvm颠通。另外如果是像阿里云這種云平臺址晕,ECS服務(wù)器的磁盤默認都是直接掛載的,并沒有使用lvm顿锰,因為這些磁盤都是可以在阿里云上直接在線擴容或者新增磁盤谨垃,以此解決磁盤的靈活問題。
在使用操作lvm之前硼控,我們首先要理解lvm的原理刘陶。
1. lvm原理
lvm是一個基于磁盤和分區(qū)之上,文件系統(tǒng)之下的中間邏輯層牢撼,lvm的層級結(jié)構(gòu)如下圖:
如圖匙隔,首先是最下層的物理分區(qū): 物理分區(qū)就是通過 fdisk -l 命令查看到的就是物理磁盤和物理分區(qū),是實際的物理設(shè)備熏版,lvm則是基于此之上纷责,在物理磁盤上可以劃分分區(qū),為物理分區(qū)撼短,物理分區(qū)必須設(shè)置為lvm分區(qū)格式再膳,才可以將這些物理分區(qū),提取出來創(chuàng)建成物理卷阔加。
物理卷: 也就是圖中第二層饵史,是通過物理分區(qū)創(chuàng)建而來满钟,與物理分區(qū)一一對應(yīng)胜榔。創(chuàng)建為物理卷后,則可以將物理卷合并為一個大的卷組湃番。通過命令pvdisplay 查看物理卷
卷組: 也就是圖中第三層夭织,卷組是不同的物理卷合并而成,可以將所有物理卷的大小整合成一個大的卷組吠撮,相當于一個大的整合的邏輯磁盤尊惰,然后在卷組中就可以根據(jù)需求劃分邏輯卷。通過命令vgdisplay 查看卷組泥兰。
邏輯卷: 也就是圖中最頂層弄屡,邏輯卷是從卷組中劃分出來的,相當于邏輯分區(qū)鞋诗,此邏輯卷就可以直接格式化掛載到目錄膀捷,就可以直接使用了。通過命令lvdisplay 查看邏輯卷削彬。
你可能會問全庸,為什么要這么做秀仲,有幾點:
因為一般的物理磁盤你進行的物理分區(qū),一旦確定壶笼,就不能修改大小神僵,不靈活。
因為一般的物理磁盤大小有限覆劈,而物理分區(qū)只能是小于等于物理磁盤的大小保礼,而通過lvm則可以將多個磁盤組合成一個大的卷組,相當于一個大的磁盤责语,就可以增大單個文件系統(tǒng)的容量大小氓英。
管理方便,底層的磁盤管理由lvm幫你做了鹦筹,你只需要將物理分區(qū)創(chuàng)建出物理卷加入到卷組铝阐,所有的管理都直接對卷組操作即可,簡單方便铐拐。
通過lvm管理磁盤徘键,非常的方便,當然也有不好的地方遍蟋,那就是物理磁盤通過lvm聯(lián)系在了一起吹害,如果需要退出物理磁盤則不能直接暴力的拔出磁盤,而需要在lvm中退出后虚青,才能拔出磁盤它呀,不然會導(dǎo)致lvm故障,這方便可能會比直接掛載更加復(fù)雜一點棒厘,但為了靈活方便纵穿,這點代價還是能接受的。
2. 通過lvm新增創(chuàng)建分區(qū)
上面說了lvm的結(jié)構(gòu)原理奢人,下面就記錄介紹如何使用lvm創(chuàng)建物理卷谓媒,卷組,邏輯卷等來使用何乎。下面假設(shè)你新增了一塊磁盤句惯,詳細說明如果將此磁盤進行納入到lvm管理下。
創(chuàng)建物理分區(qū)
首先支救,需要將磁盤進行物理分區(qū):
# 查看物理磁盤和分區(qū)情況
$ fdisk -l
Disk /dev/sdb: 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: 0xdb5c4c82
? Device Boot? ? ? Start? ? ? ? End? ? ? Blocks? Id? System
# 可以看到有一塊/dev/sdb的磁盤抢野,大小21.5G,還沒有服務(wù)分區(qū)
# 操作此磁盤各墨,創(chuàng)建物理分區(qū)
$ fdisk /dev/sdb
Command (m for help): n? ? # n創(chuàng)建物理分區(qū)
Partition type:
? p? primary (0 primary, 0 extended, 4 free)
? e? extended
Select (default p): p? ? # p指定創(chuàng)建主分區(qū), e為擴展分區(qū)
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048? ? # 默認起始位
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):
Using default value 41943039? ? # 默認結(jié)束位為最后一位
Partition 1 of type Linux and of size 20 GiB is set
Command (m for help): w? ? # 保存操作結(jié)果
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
PS: 這里說明一下指孤,sector為磁盤扇區(qū),通過指定扇區(qū)區(qū)間來確定分區(qū)區(qū)域和大小欲主。
創(chuàng)建物理卷
# 指定物理分區(qū)邓厕,創(chuàng)建為物理卷
$ pvcreate /dev/sdb1
# 查看物理卷
$ pvdisplay
# 簡單查看
$? pvs
創(chuàng)建卷組
# 若沒有卷組逝嚎,則指定物理卷,創(chuàng)建卷組详恼,卷組名為:centos
# 格式為:vgcreate 卷組名稱 物理卷名稱
$ vgcreate centos /dev/sdb1
# 若已有卷組补君,可將物理卷,加入到卷組昧互,卷組名為:centos
$ 格式為: vgextend 卷組名稱 物理卷名稱
$ vgextend centos /dev/sdb1
# 查看卷組
$ vgdisplay
# 簡單查看卷組
$ vgs
創(chuàng)建邏輯卷
# 指定卷組挽铁,創(chuàng)建邏輯卷,名稱為:test-lv
$ 命令格式為: lvcreate -L 邏輯卷大小 -n 邏輯卷名稱 卷組名稱
$ lvcreate -L 5G -n test-lv centos
# 查看邏輯卷敞掘,注意:邏輯卷的LV Path會被用于格式化和掛載
$ lvdisplay
--- Logical volume ---
? LV Path? ? ? ? ? ? ? ? /dev/centos/test-lv
? LV Name? ? ? ? ? ? ? ? test-lv
? VG Name? ? ? ? ? ? ? ? centos
? LV UUID? ? ? ? ? ? ? ? sbGZQI-xVKe-QFJF-MV3Y-WpoW-Hucl-pqwQEg
? LV Write Access? ? ? ? read/write
? LV Creation host, time localhost.localdomain, 2019-08-07 23:05:44 -0700
? LV Status? ? ? ? ? ? ? available
? # open? ? ? ? ? ? ? ? 0
? LV Size? ? ? ? ? ? ? ? 5.00 GiB
? Current LE? ? ? ? ? ? 1280
? Segments? ? ? ? ? ? ? 1
? Allocation? ? ? ? ? ? inherit
? Read ahead sectors? ? auto
? - currently set to? ? 8192
? Block device? ? ? ? ? 253:0
# 簡單查看邏輯卷
$ lvs
格式化并掛載
# 格式化邏輯卷叽掘,格式化為centos7默認的xfs格式,通過邏輯卷的LV Path指定邏輯卷
# centos7 的文件系統(tǒng)格式默認為xfs玖雁,centos6為ext4更扁。
$ mkfs.xfs /dev/centos/test-lv
# 掛載到本地目錄前,需要本地目錄先存在赫冬,所以我們先創(chuàng)建目錄浓镜,如/data
$ mkdir /data
# 掛載,使用邏輯卷的LV Path
$ mount /dev/centos/test-lv /data
# 掛載完成后劲厌,通過df -h 就能看到相應(yīng)的文件系統(tǒng)
# 然后將掛載信息寫入到/etc/fstab中膛薛,使其開機掛載
$ echo "/dev/centos/test-lv? /data? xfs? defaults? 0? 0" >> /etc/fstab
ok,到此就完成了將通過磁盤創(chuàng)建物理卷补鼻,創(chuàng)建卷組哄啄,加入卷組,創(chuàng)建邏輯卷并格式化掛載使用风范。
3. 調(diào)整邏輯分區(qū)大小
上面我們講了如何通過lvm創(chuàng)建邏輯分區(qū)并使用咨跌,學(xué)會了使用lvm的開始,然后當我們使用了一段時間后乌企,邏輯分區(qū)已經(jīng)差不多占滿時挨决,就需要進行邏輯分區(qū)的擴容虹菲,或者一些不用的邏輯分區(qū)進行縮容。
特別注意的是:
resize2fs命令 ? ? ? ? ???針對的是ext2姜盈、ext3哭当、ext4文件系統(tǒng)
xfs_growfs命令 ? ? ? ??針對的是xfs文件系統(tǒng)
# 首先通過df -hT 查看文件系統(tǒng)類型
$ df -hT
Filesystem? ? ? ? ? ? ? ? ? Type? ? ? Size? Used Avail Use% Mounted on
/dev/sda3? ? ? ? ? ? ? ? ? xfs? ? ? ? 18G? 4.7G? 14G? 27% /
devtmpfs? ? ? ? ? ? ? ? ? ? devtmpfs? 475M? ? 0? 475M? 0% /dev
tmpfs? ? ? ? ? ? ? ? ? ? ? tmpfs? ? 489M? 144K? 489M? 1% /dev/shm
tmpfs? ? ? ? ? ? ? ? ? ? ? tmpfs? ? 489M? 14M? 476M? 3% /run
tmpfs? ? ? ? ? ? ? ? ? ? ? tmpfs? ? 489M? ? 0? 489M? 0% /sys/fs/cgroup
/dev/sda1? ? ? ? ? ? ? ? ? xfs? ? ? 297M? 144M? 154M? 49% /boot
tmpfs? ? ? ? ? ? ? ? ? ? ? tmpfs? ? ? 98M? 20K? 98M? 1% /run/user/0
/dev/mapper/centos-test--lv xfs? ? ? 5.0G? 33M? 5.0G? 1% /data
# 先看看卷組猪腕,還有多少剩余空間,調(diào)整大小時钦勘,原本邏輯分區(qū)是從哪個卷組中劃分的陋葡,那么調(diào)整大小默認也會使用此卷組中的空間。
$ vgdisplay
# 或者
$ vgs
PS:通過df -hT查出的文件系統(tǒng)路徑跟邏輯分區(qū)路徑不同彻采,擴容時使用此文件系統(tǒng)路徑腐缤,或者邏輯分區(qū)路徑捌归,都可以,一樣的岭粤。
不同文件系統(tǒng)類型所對應(yīng)的創(chuàng)建惜索、檢查、調(diào)整命令不同剃浇,下面就針對xfs和ext2/3/4文件系統(tǒng)的lvm分區(qū)空間的擴容和縮容的操作做詳細記錄:
1)ext2/ext3/ext4文件系統(tǒng)的調(diào)整命令是resize2fs(增大和減小都支持)
# 調(diào)整邏輯分區(qū)大小
# 增大至20G
$ lvextend -L 20G /dev/mapper/centos-test--lv
# 增加5G
$ lvextend -L +5G /dev/mapper/centos-test--lv
# 減小至10G
$ lvreduce -L 10G /dev/mapper/centos-test--lv
# 減小3G
$ lvreduce -L -3G /dev/mapper/centos-test--lv
# 執(zhí)行調(diào)整
$ resize2fs /dev/mapper/centos-test--lv
2)xfs文件系統(tǒng)的調(diào)整命令是xfs_growfs(只支持增大)
# 調(diào)整邏輯分區(qū)大小
# 增大至20G
$ lvextend -L 20G /dev/mapper/centos-test--lv
# 增加5G
$ lvextend -L +5G /dev/mapper/centos-test--lv
# 執(zhí)行調(diào)整
$ xfs_growfs /dev/mapper/centos-test--lv
這里我上面格式化的文件系統(tǒng)類型為xfs巾兆,所以我增大邏輯分區(qū)5G,執(zhí)行上面命令虎囚,完整調(diào)整后角塑,再次通過df -hT命令查看就會發(fā)現(xiàn)已經(jīng)擴容到了10G。
此種方法進行的擴縮容淘讥,是不會影響到原有數(shù)據(jù)的圃伶,非常的方便好用。
PS:不管什么文件系統(tǒng)類型蒲列,在進行縮容前留攒,都需要先卸載掛載,然后再縮容嫉嘀,再重新掛載炼邀。
特別注意:xfs格式不是不支持縮容,而是xfs格式縮容后需要重新格式化才能繼續(xù)掛載使用剪侮,且縮容前需要先卸載掛載拭宁,然后在縮容,然后格式化瓣俯,然后再掛載杰标。這會導(dǎo)致原本的數(shù)據(jù)丟失,如果是在要縮容彩匕,可以提前將數(shù)據(jù)轉(zhuǎn)移備份好腔剂,縮容后再將數(shù)據(jù)遷移回來。
具體的操作驼仪,這里就不演示了掸犬,大致用到的命令如下:
# 卸載掛載
$ umount /dev/mapper/centos-test--lv
# 縮容
$ lvreduce -L -5G /dev/mapper/centos-test--lv
# 重新格式化,添加-f參數(shù)绪爸,強制重寫湾碎。
$ mkfs.xfs /dev/mapper/centos-test--lv -f
# 重新掛載
# mount /dev/mapper/centos-test--lv /data
4. 安全退出磁盤
在日常使用中,磁盤老舊奠货,故障介褥,需要更換等問題也經(jīng)常有,那么使用lvm做磁盤管理后,如何將磁盤安全退出柔滔,取出正在使用中的磁盤呢溢陪。
首先,磁盤中的數(shù)據(jù)睛廊,如何需要轉(zhuǎn)移到新的磁盤中嬉愧,那么首先,先插入新的磁盤喉前,然后創(chuàng)建物理卷没酣,將物理卷加入到相同的卷組,然后移動邏輯分區(qū)和數(shù)據(jù)到新的磁盤卵迂,然后將就舊的磁盤的物理卷移除出卷組裕便,刪除物理卷,就可以移除此磁盤了见咒。
# 查看系統(tǒng)磁盤掛載情況
$ lsblk
NAME? ? ? ? ? ? ? ? MAJ:MIN RM? SIZE RO TYPE MOUNTPOINT
sda? ? ? ? ? ? ? ? ? 8:0? ? 0? 20G? 0 disk
├─sda1? ? ? ? ? ? ? ? 8:1? ? 0? 300M? 0 part /boot
├─sda2? ? ? ? ? ? ? ? 8:2? ? 0? ? 2G? 0 part [SWAP]
└─sda3? ? ? ? ? ? ? ? 8:3? ? 0 17.7G? 0 part /
sdb? ? ? ? ? ? ? ? ? 8:16? 0? 20G? 0 disk
└─sdb1? ? ? ? ? ? ? ? 8:17? 0? 20G? 0 part
? └─centos-test--lv 253:0? ? 0? ? 7G? 0 lvm?
sdc? ? ? ? ? ? ? ? ? 8:32? 0? 20G? 0 disk
sr0? ? ? ? ? ? ? ? ? 11:0? ? 1 1024M? 0 rom
# 如上可以看到在sdb磁盤中有一個sdb1的分區(qū)偿衰,下面有一個lvm的邏輯分區(qū)。
# 若要安全的退出磁盤改览,就需要將此磁盤中的所有數(shù)據(jù)遷移到新的磁盤中下翎,當然如果你不要數(shù)據(jù)了,那可以不遷移宝当,直接刪除邏輯分區(qū)视事,從卷組中刪除物理卷即可。
# sdc磁盤為剛添加的新磁盤庆揩,我們要做的就是將sdb的數(shù)據(jù)導(dǎo)入到sdc中俐东,然后退出sdb磁盤
# 首先,創(chuàng)建sdc磁盤的物理分區(qū)和物理卷
# 操作過程不贅述了订晌,查看最開頭第一步新增創(chuàng)建分區(qū)的內(nèi)容虏辫。
# 創(chuàng)建完成后,查看物理卷
$ pvs
? PV? ? ? ? VG? ? Fmt? Attr PSize? PFree
? /dev/sdb1? centos lvm2 a--? 20.00g 13.00g
? /dev/sdc1? ? ? ? lvm2 ---? 20.00g 20.00g
# 可以看到新的物理卷還沒有加入卷組锈拨,空間為全剩余
# 將新磁盤的物理卷加入到相同的卷組
$ vgextend centos /dev/sdc1
# 再查看物理卷砌庄,如下
$ pvs
? PV? ? ? ? VG? ? Fmt? Attr PSize? PFree
? /dev/sdb1? centos lvm2 a--? 20.00g 13.00g
? /dev/sdc1? centos lvm2 a--? 20.00g 20.00g
# 下面將/dev/sdb1中的數(shù)據(jù)移動到卷組中的/dev/sdc1上
$ pvmove /dev/sdb1 /dev/sdc1
# 等待一段時間即可,如果數(shù)據(jù)量過大奕枢,可以用下面命令娄昆,放到后臺執(zhí)行。
$ pvmove /dev/sdb1 /dev/sdc1 2>error.log >normal.log &
# 完成后验辞,查看物理卷信息稿黄,會發(fā)現(xiàn)sdb1上的數(shù)據(jù)都遷移到了sdc1上。
$ pvs
? PV? ? ? ? VG? ? Fmt? Attr PSize? PFree
? /dev/sdb1? centos lvm2 a--? 20.00g 20.00g
? /dev/sdc1? centos lvm2 a--? 20.00g 13.00g
# 然后將/dev/sdb1的物理卷從卷組中刪除
$ vgreduce centos /dev/sdb1
# 刪除后跌造,再看pvs,會發(fā)現(xiàn)此物理卷已經(jīng)沒有所屬卷組了
$ pvs
? PV? ? ? ? VG? ? Fmt? Attr PSize? PFree
? /dev/sdb1? ? ? ? lvm2 ---? 20.00g 20.00g
? /dev/sdc1? centos lvm2 a--? 20.00g 13.00g
# 然后刪除物理卷
$ pvremove /dev/sdb1
ok,重復(fù)上面的步驟壳贪,將磁盤中所有涉及到lvm的物理分區(qū)都遷移數(shù)據(jù)并移除陵珍,然后磁盤的物理分區(qū)已經(jīng)不再跟lvm有任何關(guān)聯(lián)了,就可以直接安全的退出磁盤了违施。