我經(jīng)常用虛擬機(jī)裝各種版本的Linux系統(tǒng)來跑程序,一般硬盤分得比較小。比如CentOS 6就只分了16G,跑的是服務(wù)端的程序,不用安裝界面,整個(gè)系統(tǒng)也就占3G不到,一般也夠用。直到某一天,我需要把一個(gè)20G的sql腳本導(dǎo)入到數(shù)據(jù)庫里。這才發(fā)覺自己從來沒做過Linux的硬盤擴(kuò)容,一番鼓搗之后,做個(gè)筆記本留檔。
現(xiàn)在主流的Linux,基本都使用LVM分區(qū)。哪啥是LVM?這得先來了解一下基礎(chǔ)概念。Logical Volume Manager中文名叫邏輯卷管理器,簡(jiǎn)稱LVM,它是Linux下對(duì)邏輯卷進(jìn)行管理的一套程序,LVM分區(qū),就是LVM管理下的一個(gè)邏輯卷。LVM通常涉及下面幾個(gè)術(shù)語:
-
PP(physical Partition)
物理分區(qū),通常指硬盤中的主分區(qū),邏輯分區(qū)。嚴(yán)格來講整個(gè)硬盤或者其他能存東西的物理介質(zhì)包括網(wǎng)絡(luò)存儲(chǔ)也能作為一個(gè)物理分區(qū),但一定是有實(shí)物的 -
PV(Physical Volume)
物理卷,就是在PP(物理分區(qū))的基礎(chǔ)上,使用pvcreate指令寫入一些數(shù)據(jù),轉(zhuǎn)換為可供LVM識(shí)別后的物理介質(zhì)。 -
VG(Volumes Group)
卷組,由一個(gè)或多個(gè)PV組成的一個(gè)分組,形成一大塊存儲(chǔ)空間 -
LV(Logical Volume)
邏輯卷,也就是LVM分區(qū),在VG上劃分一塊空間稱為邏輯卷,一個(gè)VG上只要還有空間就可以建立多個(gè)LV。在邏輯卷之上可以建立文件系統(tǒng)(ext3、ext4等),然后即可把數(shù)據(jù)存到分區(qū)里 -
PE(Physical Extent)
具有唯一編號(hào)的PE是可以被LVM尋址的最小單元,其大小是在創(chuàng)建VG時(shí)確定的,默認(rèn)為4MB(可通過vgcreate -s指定)。一個(gè)VG包含N個(gè)PE,從VG上劃分一塊空間作為L(zhǎng)V時(shí)就是把其中一部分?jǐn)?shù)量的PE標(biāo)記為該LV。
它們之間的關(guān)系,可以簡(jiǎn)單地概括為:一塊硬盤,被分成了幾個(gè)分區(qū)(PP),然后把PP轉(zhuǎn)換為PV,多個(gè)PV可以組成一個(gè)VG。組成VG后,就得到了一塊很大的空間,它的大小是以PE的來衡量的。現(xiàn)在從VG上劃分一塊空間形成一個(gè)LV,然后就可以在LV上創(chuàng)建文件系統(tǒng),進(jìn)行讀寫數(shù)據(jù)。

(圖片來源于網(wǎng)絡(luò))
這么做的目的,就是把物理存儲(chǔ)介質(zhì)和具體使用的空間解耦,例如/home這個(gè)文件夾,可能一部分在硬盤A,另一部分在硬盤B。這就是為什么被稱為邏輯卷,因?yàn)檫@個(gè)卷是通過邏輯虛擬出來的,物理上不存在這個(gè)卷。解耦之后整個(gè)系統(tǒng)的空間就可以方便的擴(kuò)容、更換物理介質(zhì),這對(duì)長(zhǎng)期運(yùn)行,不停服更換硬件的服務(wù)器很重要。
我的CentOS 6是在VritualBox中以一個(gè)硬盤以默認(rèn)方式安裝的,它的分區(qū)如下:
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
14G 2.1G 11G 16% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 477M 34M 418M 8% /boot
可以看到,默認(rèn)情況下只有一個(gè)根分區(qū),從參數(shù)/dev/mapper/VolGroup-lv_root可以看出來它是一個(gè)LVM分區(qū)。所有數(shù)據(jù)都存在這個(gè)唯一的分區(qū)里,所以這次就是要對(duì)這個(gè)分區(qū)進(jìn)行擴(kuò)容。
使用lsblk則可以更清析地看到硬盤的分區(qū)結(jié)構(gòu)
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 58.2M 0 rom
sda 8:0 0 16G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 15.5G 0 part
├─VolGroup-lv_root (dm-0) 253:0 0 13.9G 0 lvm /
└─VolGroup-lv_swap (dm-1) 253:1 0 1.6G 0 lvm [SWAP]
可以看到系統(tǒng)中有一個(gè)光驅(qū)sr0;一個(gè)硬盤sda。硬盤被分為兩個(gè)區(qū)(sda1、sda2),而sda2被劃分為兩個(gè)LVM分區(qū)(VolGroup-lv_root、VolGroup-lv_swap)。假如需要看到硬盤的一些更詳細(xì)的信息,可以使用parted:
[root@localhost ~]# parted /dev/sda
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print all
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 17.2GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 525MB 524MB primary ext4 boot
2 525MB 17.2GB 16.7GB primary lvm
可以看到當(dāng)前這個(gè)硬盤大小為17.2GB,有兩個(gè)主分區(qū),一個(gè)為ext4,另一個(gè)被標(biāo)記為lvm。對(duì)于這個(gè)lvm管理的分區(qū),它有PV、VG、LV等參數(shù),可通過pvdisplay、vgdisplay、lvdisyplay打印出來:
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name VolGroup
PV Size 15.51 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 3970
Free PE 0
Allocated PE 3970
PV UUID XydIzE-RJIT-Hcfc-5vCw-NnKE-goPE-VFwhn3
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name VolGroup
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 15.51 GiB
PE Size 4.00 MiB
Total PE 3970
Alloc PE / Size 3970 / 15.51 GiB
Free PE / Size 0 / 0
VG UUID 43d3d6-xFIm-s2vF-Z1jY-pKBc-sniG-wT0VTL
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/VolGroup/lv_root
LV Name lv_root
VG Name VolGroup
LV UUID 2OJpKu-4KI9-DpUX-ZiVl-wanM-gdlY-yMbCau
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2022-03-14 17:48:16 +0800
LV Status available
# open 1
LV Size 13.91 GiB
Current LE 3561
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Logical volume ---
LV Path /dev/VolGroup/lv_swap
LV Name lv_swap
VG Name VolGroup
LV UUID jWqLXl-yzPu-xzJ9-ao4a-9JB5-KYXu-X2niXP
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2022-03-14 17:48:18 +0800
LV Status available
# open 1
LV Size 1.60 GiB
Current LE 409
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
通過上面的信息,可以看到整個(gè)系統(tǒng)中有一個(gè)PV(物理卷,也就是sda2這個(gè)分區(qū));有一個(gè)VG名字叫VolGroup,一共有3970個(gè)PE,每個(gè)PE大小為4MB,所以整個(gè)VG大小為15.51GB,空閑的PE(Free PE)為0,說明空間都被用光了;有兩個(gè)LV,都是從VolGroup這個(gè)VG上劃分出來的,一個(gè)13.91GB,一個(gè)1.6GB。
了解當(dāng)前系統(tǒng)的信息后,開始對(duì)硬盤進(jìn)行擴(kuò)容。由于是虛擬機(jī),就不用去買新硬盤了,可以直接在虛擬機(jī)上調(diào)整硬盤大小。VirtualBox的操作方式為:
關(guān)閉虛擬機(jī),在菜單“管理/虛擬介質(zhì)管理”中找到對(duì)應(yīng)虛擬機(jī)的硬盤,設(shè)置新的大小即可。

我這里直接把它調(diào)整到128GB,現(xiàn)在重新啟動(dòng)虛擬機(jī),df -h可以看到各個(gè)分區(qū)大小沒變,而parted使用print free可以看到硬盤大小變了,后面多出120G空間。這是因?yàn)橄到y(tǒng)是根據(jù)分區(qū)表來確定分區(qū)大小的,新加的空間沒法直接使用。
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
14G 2.1G 11G 16% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 477M 34M 418M 8% /boot
[root@localhost ~]# parted /dev/sda
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 137GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
32.3kB 1049kB 1016kB Free Space
1 1049kB 525MB 524MB primary ext4 boot
2 525MB 17.2GB 16.7GB primary lvm
17.2GB 137GB 120GB Free Space
(parted)
如果是新增一個(gè)硬盤,可以直接整個(gè)硬盤作為一個(gè)PP轉(zhuǎn)換為PV(當(dāng)然把整個(gè)硬盤格式化成一個(gè)分區(qū)來操作也是可以的)
pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created
但現(xiàn)在是在原有硬盤上擴(kuò)展空間,因此只能分區(qū)。分區(qū)使用fdisk或者parted都可以,這里用更廣泛一些的fdisk
[root@localhost ~]# fdisk /dev/sda
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (2089-16709, default 2089):
Using default value 2089
Last cylinder, +cylinders or +size{K,M,G} (2089-16709, default 16709):
Using default value 16709
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sda: 137.4 GB, 137438953472 bytes
255 heads, 63 sectors/track, 16709 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000a342
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 2089 16264192 8e Linux LVM
/dev/sda3 2089 16709 117437826+ 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
Command (m for help): n使用n指令創(chuàng)建分區(qū),選p創(chuàng)建主分區(qū)(由上面的信息可知,默認(rèn)情況下系統(tǒng)分了sda1 sda2兩個(gè)主分區(qū),那我干脆也分一個(gè)主分區(qū)3)
Partition number (1-4): 3設(shè)置主分區(qū)id為3,即sda3
First cylinder (2089-16709, default 2089):輸入分區(qū)開始的第一個(gè)扇區(qū),默認(rèn)為空閑空間的第一個(gè)扇區(qū)2089,所以我這里直接回車
Last cylinder, +cylinders or +size{K,M,G} (2089-16709, default 16709): 輸入分區(qū)結(jié)束的最后一個(gè)扇區(qū),默認(rèn)為空閑空間的最后一個(gè)扇區(qū)16709,所以我這里直接回車
Command (m for help): t使用t指令修改分區(qū)的類型
Partition number (1-4): 3選擇要修改的分區(qū)id
Hex code (type L to list codes): 8e選擇分區(qū)的類型(8e就表示lvm),輸入l可列出所有支持的類型
Command (m for help): p現(xiàn)在打印一下當(dāng)前分區(qū)表,確認(rèn)是不是自己想要的
Command (m for help): w確認(rèn)分區(qū)表正確后,用w寫入硬盤。我這里出現(xiàn)了一個(gè)警告,按提示是要重啟一下
現(xiàn)在把新建的分區(qū)sda3轉(zhuǎn)換為PV。由于我忽略了上面的警告,結(jié)果找不到sda3,這可能和VirtualBox的硬盤模擬有關(guān),其他機(jī)子不一定會(huì)出現(xiàn):
[root@localhost ~]# pvcreate sda3
Device sda3 not found (or ignored by filtering).
重啟后再執(zhí)行即可
[root@localhost ~]# pvcreate /dev/sda3
Physical volume "/dev/sda3" successfully created
由之前vgdisplay查看的數(shù)據(jù)可知道,當(dāng)前系統(tǒng)有一個(gè)名字為VolGroup的VG,現(xiàn)在要把剛轉(zhuǎn)換好的PV添加到這個(gè)VG里
[root@localhost ~]# vgextend VolGroup /dev/sda3
Volume group "VolGroup" successfully extended
再次用vgdisplay,可以看到VG已經(jīng)被擴(kuò)大,現(xiàn)在有很多空閑的PE了
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name VolGroup
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 127.50 GiB
PE Size 4.00 MiB
Total PE 32641
Alloc PE / Size 3970 / 15.51 GiB
Free PE / Size 28671 / 112.00 GiB
VG UUID 43d3d6-xFIm-s2vF-Z1jY-pKBc-sniG-wT0VTL
由之前lvdisplay查看的數(shù)據(jù)可知道,當(dāng)前有兩個(gè)LV,一個(gè)lv_swap路徑為/dev/VolGroup/lv_swap,一個(gè)lv_root路徑為/dev/VolGroup/lv_root。記住路徑,下面的擴(kuò)容操作是使用路徑來操作。現(xiàn)在需要對(duì)lv_root進(jìn)行擴(kuò)容
[root@localhost ~]# lvextend -l +100%FREE /dev/VolGroup/lv_root
Size of logical volume VolGroup/lv_root changed from 13.91 GiB (3561 extents) to 125.91 GiB (32232 extents).
Logical volume lv_root successfully resized.
上面是使用百分比來擴(kuò)容,通過lvextend --help可以知道,還有很多種方式指定擴(kuò)容的單位,比如
# 使用M、G等常用單位擴(kuò)容,支持的單位為[bBsSkKmMgGtTpPeE]
lvextend -L +10G /dev/VolGroup/lv_root
# 使用PE數(shù)量擴(kuò)容,通用一個(gè)PE為4M。空閑PE的數(shù)量和單個(gè)PE的大小可通過`vgdisplay`查看
lvextend -l +2560 /dev/VolGroup/lv_root
lvm分區(qū)的大小擴(kuò)展了,但是通過df -h來查看,可以看到空間還是不變的。因?yàn)樵趌vm分區(qū)之上,linux還有一層文件系統(tǒng)(ext3、ext4等等),需要對(duì)文件系統(tǒng)擴(kuò)展才行。ext3 和 ext4文件系統(tǒng)使用resize2fs,其他系統(tǒng)查下資料才知道
[root@localhost ~]# resize2fs /dev/VolGroup/lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 8
Performing an on-line resize of /dev/VolGroup/lv_root to 33005568 (4k) blocks.
The filesystem on /dev/VolGroup/lv_root is now 33005568 blocks long.
現(xiàn)在使用df -h可以看到空間已經(jīng)擴(kuò)展了。
相比之下,Window的區(qū)分則顯得更加簡(jiǎn)單、直觀。Windows的分區(qū)直接就是采用“物理卷”,即分區(qū)怎么分,在物理上就是怎么劃分的,使用DiskGenius或者傲梅分區(qū)助手等流行的工具可以直觀地調(diào)整分區(qū)的大小


不過這種簡(jiǎn)單也是有限制的,那就是需要進(jìn)入PE系統(tǒng)來操作,沒辦法不停機(jī)操作(也許有,但我不會(huì)),當(dāng)然這對(duì)于個(gè)人電腦來說并不是一個(gè)重要的指標(biāo)。
浙公網(wǎng)安備 33010602011771號(hào)