关于飞牛在虚拟化下的存储硬盘扩容
1.背景
由于没有多余的硬件或不想购买多余的硬件组NAS,使用PVE和EXSi或其他虚拟化方式的创建并使用NAS系统;在不考虑直通的情况下,使用虚拟化硬盘存在可能存储不足的情况,这时可通过宿主机控制台对系统进行磁盘扩容(磁盘扩容后需要进行相对于的操作,详见下文);注意:这里由于飞牛OS使用的逻辑卷技术,只推荐进行扩容,不建议缩容。
啰嗦下,飞牛OS创建存储空间中的两种模式分别是:Basic和Linear,其中 Basic 只适合单个硬盘使用,即没有阵列; Linear 可单盘也适合两个硬盘以上,既可以组成阵列也可以将两块硬盘融合成一块硬盘使用(无阵列)。
环境如下:
操作系统 |
版本 |
说明 |
Proxmox |
8.0.2 |
虚拟化平台 |
飞牛OS |
0.34 |
基于Debian12 |
- |
- |
N块硬盘 |
3.实现操作
3.1 RAID0
重点:由于RAID0本身不支持直接扩容,因为它没有冗余机制,且数据是分散存储在各个磁盘上,当需要扩容时,需要对数据进行备份!备份!备份!如需扩容,需重新组阵列会导致数据丢失
容量计算公式:N块硬盘容量之和;例如:4块1TB容量,即是4TB容量
通过WEB界面先进行关机,对硬盘容量进行调整并正常开机启动。下图是在PVE中进行扩容:


重启后,会发现在web中“系统设置”里面“硬盘信息”中发现硬盘容量已经改变。

由于RAID0不支持直接扩容,故需要在WEB界面下先将原有的RAID0进行删除(提前备份好数据),然后再WEB界面下重新新建 RAID即可。
重审一遍:需提前备份
3.2 RAID1
容量计算公式:*可用容量 = 最小磁盘容量 1,例如有三块磁盘,容量分别为 500GB、1TB 和 1TB,那么 RAID 1 的可用容量为 500GB**。
如下图,已经组成 RAID1且已创建存储空间有数据,对其进行扩容。

通过WEB界面先进行关机,对硬盘容量进行调整并正常开机启动。下图是扩容的后结果:

在 WEB界面上看存储空间容量未发生变化,这会需要进去系统进行更改,首先在“系统设置”里面找到“SSH”并开启“SSH功能”

使用远程工具(Xshell)连接后查看确认已增加的硬盘容量,使用 sudo -i
切换到超级用户下面进行操作:
# lsblk |grep -A 3 -E "sde |sdc"
sdc 8:32 0 30G 0 disk
**─sdc1 8:33 0 26G 0 part
**─md127 9:127 0 26G 0 raid1
**─trim_8a8c99a2_9f84_4dad_bdc8_96826af2414e-0 253:1 0 26G 0 lvm /vol1
sdd 8:48 0 40G 0 disk
--
sde 8:64 0 50G 0 disk
**─sde1 8:65 0 45G 0 part
**─md127 9:127 0 26G 0 raid1
**─trim_8a8c99a2_9f84_4dad_bdc8_96826af2414e-0 253:1 0 26G 0 lvm /vol1
先通过 fdisk
对硬盘(sdc,sde)进行重新分区打标签
# fdisk /dev/sdc
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p # 打印当前分区
# 已增加到30G
Disk /dev/sdc: 30 GiB, 32212254720 bytes, 62914560 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 4ADAA90E-5FFA-43F2-8DE3-D3E9E93B6FB3
# 26G 实际分区
Device Start End Sectors Size Type
/dev/sdc1 2048 54523903 54521856 26G Linux RAID
Command (m for help): d # 删除当前分区
Selected partition 1
Partition 1 has been deleted.
Command (m for help): n # 创建新分区
Partition number (1-128, default 1):
First sector (34-62914526, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914526, default 62912511):
Created a new partition 1 of type 'Linux filesystem' and of size 30 GiB.
Partition #1 contains a linux_raid_member signature.
Do you want to remove the signature? [Y]es/[N]o: N # 保留当前签名,这里必须选择N
Command (m for help): t # 修改磁盘类型
Selected partition 1
Partition type or alias (type L to list all): 42 # 42为软RAID
Changed type of partition 'Linux filesystem' to 'Linux RAID'.
Command (m for help): w # 写入磁盘
The partition table has been altered.
Syncing disks.
Command (m for help): p # 再次检查已分区磁盘
Disk /dev/sdc: 30 GiB, 32212254720 bytes, 62914560 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 4ADAA90E-5FFA-43F2-8DE3-D3E9E93B6FB3
Device Start End Sectors Size Type
/dev/sdc1 2048 62912511 62910464 30G Linux RAID
Command (m for help): q # 退出磁盘管理
将两块原硬盘扩容进行同样操作
下一步则对 RAID1
进行扩容扩容;pvresize
对阵列进行更新大小;lvresize
将剩余空间分配给实际使用的卷,其中卷位置可通过 lvdisplay
进行查找;
# mdadm --grow /dev/md127 --size=max
# pvresize /dev/md127
# lvresize -l +100%FREE /dev/trim_8a8c99a2_9f84_4dad_bdc8_96826af2414e/0
由于飞牛OS使用的 brtfs
文件系统,故还需对挂载磁盘进行分配,其中 vol1
通过 df -h
和 lsblk
进行确认
# btrfs filesystem resize max /vol1/
扩容后通过web访问发现存储空间已经更改
3.2 RAID5
容量计算公式 = (磁盘数量 - 1) × 最小磁盘容量
- 磁盘数量:5 块
- 每块磁盘容量:2TB
- 可用容量 = (5 - 1) × 2TB = 8TB
环境如下图:

对磁盘进行扩容,如下:

对磁盘进行扩容,与 RAID1
同样的操作,
# lsblk |grep -A 3 -E "sda |sdd|sdb"
sda 8:0 0 30G 0 disk
**─sda1 8:1 0 10G 0 part
**─md127 9:127 0 20G 0 raid5
**─trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d-0 253:0 0 20G 0 lvm /vol2
sdb 8:16 0 15G 0 disk
**─sdb1 8:17 0 15G 0 part
**─md127 9:127 0 20G 0 raid5
**─trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d-0 253:0 0 20G 0 lvm /vol2
sdd 8:48 0 30G 0 disk
**─sdd1 8:49 0 10G 0 part
**─md127 9:127 0 20G 0 raid5
**─trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d-0 253:0 0 20G 0 lvm /vol2
检查阵列是否正常,State: clean
表示RAID阵列处于正常状态,没有正在进行的重建或校验操作,active sync
表示正常工作并且数据是同步。
# mdadm --grow /dev/md127 --size=max
# mdadm --detail /dev/md127
/dev/md127:
Version : 1.2
Creation Time : Thu Jan 23 15:23:38 2025
Raid Level : raid5
Array Size : 31434752 (29.98 GiB 32.19 GB)
Used Dev Size : 15717376 (14.99 GiB 16.09 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Thu Jan 23 15:40:39 2025
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : bitmap
Name : testPC:0 (local to host testPC)
UUID : b1566e98:0ef12406:910fba5c:fdfcd3e0
Events : 12
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 49 2 active sync /dev/sdd1
更新pv组,后更新逻辑卷(lv)
# pvresize /dev/md127
Physical volume "/dev/md127" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
# pvdisplay
--- Physical volume ---
PV Name /dev/md127
VG Name trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d
PV Size <29.98 GiB / not usable 0
Allocatable yes
PE Size 4.00 MiB
Total PE 7674
Free PE 2560
Allocated PE 5114
PV UUID 0MeA2Y-U4zs-VRUN-pRAA-siiS-NQmx-5xisAW
# lvdisplay
--- Logical volume ---
LV Path /dev/trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d/0
......
LV Size <19.98 GiB
.....
root@testPC:~# lvresize -l +100%FREE /dev/trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d/0
Size of logical volume trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d/0 changed from <19.98 GiB (5114 extents) to <29.98 GiB (7674 extents).
Logical volume trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d/0 successfully resized.
# lvdisplay
--- Logical volume ---
LV Path /dev/trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d/0
....
LV Size <29.98 GiB
....
由于飞牛OS使用的 brtfs
文件系统,故还需对挂载磁盘进行分配,其中 vol1
通过 df -h
和 lsblk
进行确认
# df -h|grep vol2
/dev/mapper/trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d-0 20G 478M 20G 3% /vol2
# btrfs filesystem resize max /vol2/
Resize device id 1 (/dev/mapper/trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d-0) from 19.98GiB to max
# df -h|grep vol2
/dev/mapper/trim_b1e2b528_6bd2_4f52_b2d8_0ace300c075d-0 30G 478M 30G 2% /vol2
扩容后通过web访问发现存储空间已经更改

3.3 RAID6
容量计算公式:(磁盘数量 - 2) × 单个磁盘容量
- 磁盘数量:8 块
- 每块磁盘容量:3TB
- 可用容量 = (8 - 2) × 3TB = 18TB
3.4 RAID10
容量计算公式:(磁盘数量 / 2) × 最小磁盘容量
- 磁盘数量:6 块
- 每块磁盘容量:2TB
- 可用容量 = (6 / 2) × 2TB = 6TB

对磁盘进行扩容,如下:

对磁盘进行扩容,与 RAID1
同样的操作,
# lsblk
....
sdb 8:16 0 20G 0 disk
**─sdb1 8:17 0 10G 0 part
**─md127 9:127 0 25G 0 raid10
**─trim_4e5ad6ca_4091_4e19_ad28_e616a8dcd350-0 253:0 0 24.9G 0 lvm /vol1
....
# 重新分配后
# lsblk
....
sdb 8:16 0 20G 0 disk
**─sdb1 8:17 0 20G 0 part
**─md127 9:127 0 25G 0 raid10
**─trim_4e5ad6ca_4091_4e19_ad28_e616a8dcd350-0 253:0 0 24.9G 0 lvm /vol1
....
执行相关命令
# mdadm --grow /dev/md127 --size=max
# pvresize /dev/md127
# lvextend -l +100%FREE /dev/trim_4e5ad6ca_4091_4e19_ad28_e616a8dcd350/0
Size of logical volume trim_4e5ad6ca_4091_4e19_ad28_e616a8dcd350/0 changed from <24.95 GiB (6387 extents) to <49.95 GiB (12787 extents).
Logical volume trim_4e5ad6ca_4091_4e19_ad28_e616a8dcd350/0 successfully resized.
# btrfs filesystem resize max /vol1
Resize device id 1 (/dev/mapper/trim_4e5ad6ca_4091_4e19_ad28_e616a8dcd350-0) from 24.95GiB to max

3.5 Basic以及Linear
下述X为真实字母或数字
使用 Basic
需使用先 mdadm
命令进行扩容
# Basic
# 按顺序执行
# fdisk /dev/sdX --> d --> n(一路回车直到提示signature? [Y]es/[N]) --> No --> t --> 42 --> w --> q
# mdadm --grow /dev/mdX--size=max
# pvresize /dev/mdX
############## lvdisplay查询实际路径和df -h 配合 ####################
# lvresize -l +100%FREE /dev/trim_8a8c99a2_9f84_4dad_bdc8_96826af2414e/0
# btrfs filesystem resize max /volX/
使用 Linear
则和普通的逻辑卷操作
# Linear
# 按顺序执行
# fdisk /dev/sdX --> d --> n(一路回车直到提示signature? [Y]es/[N]) --> No --> t --> 42 --> w --> q
# pvresize /dev/mdX
############## lvdisplay查询实际路径和df -h 配合 ####################
# lvresize -l +100%FREE /dev/trim_8a8c99a2_9f84_4dad_bdc8_96826af2414e/0
# btrfs filesystem resize max /volX/
2.相关技术
目前飞牛OS支持组成0,1,5,6,10这五种阵列,如下表格:
阵列类型 |
至少所需硬盘 |
优点 |
缺点 |
RAID0 |
2块 |
磁盘利用率高,容量为硬盘总和 |
无冗余,任意硬盘损坏导致数据丢失 |
RAID1 |
2块 |
数据安全性高,磁盘互为镜像 |
磁盘利用率只50% |
RAID5 |
3块 |
存储效率高,容量利用率高于RAID1 |
写入较慢,只允许单块硬盘故障 |
RAID6 |
4块 |
数据安全性高,允许两块硬盘故障 |
写入慢,需多块硬盘以上,成本高 |
RAID10 |
4块 |
高性能存储,数据安全性高,允许多块硬盘故障 |
需多块硬盘以上,成本高 |
飞牛使用的文件系统格式是:Btrfs(B-Tree Filesystem),是一种现代的写时复制(Copy-On-Write, COW)。Btrfs融合了文件系统和卷管理器的功能,主要在实现高级功能的同时,注重容错性、修复性和易于管理性,这也说明了为什么飞牛OS用的逻辑卷为底层。
逻辑卷知识:PV-->VG-->LV
物理卷-->卷组-->逻辑卷
补充:
使用飞牛OS存储管理中自带的扩容,发现出错
