阡陌 发表于 2023-12-26 00:08:55

逻辑卷管理 LVM



当你发现某个文件夹满到放不下新文件时,又不能放到其他文件夹和分区,应该会想到加块儿硬盘吧。可以如何将新硬盘合并到即将满了的分区呢?LVM,逻辑卷管理(Logical Volume Manager),它是 Linux 环境下对磁盘分区进行管理的一种机制,可以提高磁盘分区的灵活性。很牛的一点是,LVM 允许在不停机的情况下伸缩文件系统的大小,这在服务器上十分重要。

<!--more-->



## LVM 的几个概念

- 物理存储介质(PhysicalStorageMedia)
指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。
- 物理卷(Physical Volume,PV)
指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如 RAID),是 LVM 的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与 LVM 相关的管理参数。
- 卷组(Volume Group,VG)
类似于非 LVM 系统中的物理磁盘,其由一个或多个物理卷 PV 组成。可以在卷组上创建一个或多个 LV(逻辑卷)。
- 逻辑卷(Logical Volume,LV)
类似于非 LVM 系统中的磁盘分区,逻辑卷建立在卷组 VG 之上。在逻辑卷 LV 之上可以建立文件系统(比如 /home 或者 /usr 等)。
- 物理块(Physical Extent,PE)
PE 是物理卷 PV 的基本划分单元,具有唯一编号的 PE 是可以被 LVM 寻址的最小单元。PE 的大小是可配置的,默认为 4 MB。所以物理卷(PV)由大小等同的基本单元 PE 组成。
- 逻辑块(Logical Extent,LE)
逻辑卷 LV 也被划分为可被寻址的基本单位,称为 LE。在同一个卷组中,LE 的大小和 PE 是相同的,并且一一对应。

![](https://file.mculoop.com/images/2022/03/df5fb268a0f157bb.jpg)



## 准备物理卷(PV)

### 创建物理卷

提示:直接操作磁盘有风险,请根据实际情况来!

```
pvcreate /dev/sda
```



### 查看物理卷

```
pvdisplay

"/dev/sda" is a new physical volume of "<2.73 TiB"
--- NEW Physical volume ---
PV Name               /dev/sda
VG Name               
PV Size               <2.73 TiB
Allocatable         NO
PE Size               0   
Total PE            0
Free PE               0
Allocated PE          0
PV UUID               IXSvwr-TOUv-4GJ9-Pzzi-mB0P-VM3h-Zl5eHu
```



### 删除物理卷

```
pvremove /dev/sda
```



## 准备卷组(VG)

### 创建卷组

```
vgcreate vg1 /dev/sda /dev/sdb1 /dev/sdb2
```



### 查看卷组

```
vgdisplay

--- Volume group ---
VG Name               vg1
System ID            
Format                lvm2
Metadata Areas      2
Metadata Sequence No1
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                0
Open LV               0
Max PV                0
Cur PV                2
Act PV                2
VG Size               <5.46 TiB
PE Size               4.00 MiB
Total PE            1430792
Alloc PE / Size       0 / 0   
FreePE / Size       1430792 / <5.46 TiB
VG UUID               GPQkyt-yEGc-wpKr-ks28-mkJO-b9MF-sA7JHu
```



### 缩容卷组

```
vgreduce vg1 /dev/sdc
```

通过删除 LVM 卷组中的物理卷来减少卷组容量,但不能删除 LVM 卷组中剩余的最后一个物理卷。

先使用 `pvs` 命令检查是否使用了:

```
pvs -o +pv_used
PV         VGFmtAttr PSizePFreeUsed
/dev/sda   vg1 lvm2 a--<2.73t <2.73t   0
/dev/sdc   vg1 lvm2 a--<2.73t <2.73t   0
```

如果物理卷已经被使用了,则必须使用 `pvmove` 命令将数据传输到另一个物理卷,然后将其从卷组中删除。



### 扩容卷组

```
vgextend vg1 /dev/sdc
```



### 删除卷组

```
vgremove vg1
```



## 准备逻辑卷(LV)

### 创建逻辑卷

```
lvcreate -L 100M -n lv1 vg1 # 创建 100 M 大小名为 lv1 的逻辑卷
lvcreate -l 100%VG -n lv1 vg1 # 创建占全部卷组大小的逻辑卷
lvcreate -l 100%FREE -n lv1 vg1 # 创建 100% 剩余空间大小的逻辑卷
```



### 查看逻辑卷

```
lvdisplay
                                                                              --- Logical volume ---
LV Path                /dev/vg1/lv1
LV Name                lv1
VG Name                vg1
LV UUID                3f8r8Z-Ybw8-nIyQ-fAnA-cRIy-RXcU-J9935d
LV Write Access      read/write
LV Creation host, time ubuntu, 2022-03-22 11:24:18 +0000
LV Status            available
# open               0
LV Size                <5.46 TiB
Current LE             1430792
Segments               2
Allocation             inherit
Read ahead sectors   auto
- currently set to   256
Block device         253:0
```

`/dev/vg1` 这个文件夹是创建 LV 后才被创建的。除了 `/dev/vg1/lv1` 还会创建一个 `/dev/mapper/vg1-lv1` 他们都是软链接,链接到了 `/dev/dm0`。



此时查看使用情况:

```
pvs -o +pv_used                                                                           PV         VGFmtAttr PSizePFree Used
/dev/sda   vg1 lvm2 a--<2.73t    0<2.73t
/dev/sdc   vg1 lvm2 a--<2.73t    0<2.73t
```

可见,创建完 LV 后两块儿磁盘就 100% 被使用了。



像使用物理卷那样使用逻辑卷 `/dev/vg1/lv1` 就可以了:

```
mkfs.ext4 /dev/vg1/lv1 # 格式化
mkdir /data && chattr +i /data # 创建挂载点
mount /dev/vg1/lv1 /data
```



### 缩容逻辑卷

缩容是个细致活,不能大意了,否则数据可能丢失。主要有 5 步:

1. 卸载要操作的文件系统

   ```
   umount /dev/vg1/lv1
   ```

   

2. 检查修复文件系统错误

   ```
   e2fsck -f /dev/vg1/lv1
   
   e2fsck 1.45.5 (07-Jan-2020)
   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/vg1/lv1: 12/183144448 files (0.0% non-contiguous), 11836033/1465131008 blocks
   ```

   这个命令要根据文件系统的类型来选择了,本文用的是 ext4 文件系统。

   

3. 缩小文件系统

   ```
   resize2fs /dev/vg1/lv1 4T # 将文件系统缩小为 4 TB
   
   resize2fs 1.45.5 (07-Jan-2020)
   Resizing the filesystem on /dev/vg1/lv1 to 1073741824 (4k) blocks.
   The filesystem on /dev/vg1/lv1 is now 1073741824 (4k) blocks long.
   ```

   如果要查看调整后的大小,可以使用 `dumpe2fs -h /dev/vg1/lv1` 命令,不过要计算一下才能得到结果:Block count * Block size (bytes)

   ```
   echo "1073741824 * 4096 / 1024 / 1024 / 1024" | bc
   4096 # 这是我调整后的结果,4T
   ```

   

4. 缩小逻辑卷大小

   ```
   lvreduce -L 4T /dev/vg1/lv1 # 将逻辑卷缩小为 4 TB
   
   lvdisplay # 查看调整后的大小
   
   --- Logical volume ---
   LV Path                /dev/vg1/lv1
   LV Name                lv1
   VG Name                vg1
   LV UUID                3f8r8Z-Ybw8-nIyQ-fAnA-cRIy-RXcU-J9935d
   LV Write Access      read/write
   LV Creation host, time ubuntu, 2022-03-22 11:24:18 +0000
   LV Status            available
   # open               0
   LV Size                4.00 TiB
   Current LE             1048576
   Segments               2
   Allocation             inherit
   Read ahead sectors   auto
   - currently set to   256
   Block device         253:0
   ```

   也可以使用 `lvresize -L 4T /dev/vg1/lv1` 命令来调整大小。



5. 挂载文件系统并使用

   ```
   mount /dev/vg1/lv1 /data
   ```

   

### 扩容逻辑卷

扩容相对来说更容易一些,不需要 umount 文件系统。

查看卷组 VG 空闲空间状态:

```
vgdisplay

--- Volume group ---
VG Name               vg1
System ID            
Format                lvm2
Metadata Areas      2
Metadata Sequence No7
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                1
Open LV               1
Max PV                0
Cur PV                2
Act PV                2
VG Size               <5.46 TiB
PE Size               4.00 MiB
Total PE            1430792
Alloc PE / Size       1048576 / 4.00 TiB
FreePE / Size       382216 / <1.46 TiB
VG UUID               GPQkyt-yEGc-wpKr-ks28-mkJO-b9MF-sA7JHu
```

可以看到空闲的 PE 数量是 382216。



扩展卷大小,使用全部的空闲空间:

```
lvextend -l +382216 /dev/vg1/lv1
```

这里使用了加号来增加空间。扩展卷同样也可以使用 `lvresize` 命令。



扩展文件系统,使用全部的卷空间:

```
df -h
/dev/mapper/vg1-lv14.0T   89M3.8T   1% /data
resize2fs /dev/vg1/lv1
df -h
/dev/mapper/vg1-lv15.5T   72M5.2T   1% /data
```

可以看到扩展前后文件系统的大小发生了预期的变化。



### 删除逻辑卷

```
lvremove /dev/vg1/lv1
```


页: [1]
查看完整版本: 逻辑卷管理 LVM