【k8s学习之CSI】理解 LVM 存储概念和相关操作
- 鸟哥的 Linux 私房菜 – Quota, Software RAID, LVM, iSCSI
0 | 理解 vg 相关概念
在 Linux LVM(逻辑卷管理) 中,以下是 partition(分区)、PV(物理卷)、VG(卷组)、LV(逻辑卷)、PE(物理块) 之间的关系:
LVM 结构层次
+-------------------------------+
| 文件系统(ext4 / xfs) | ⬅ 用户存储数据
+-------------------------------+
| 逻辑卷(LV,Logical Volume) | ⬅ 提供类似 /dev/sda1 的设备
+-------------------------------+
| 卷组(VG,Volume Group) | ⬅ 由多个 PV 组成的存储池
+-------------------------------+
| 物理卷(PV,Physical Volume) | ⬅ 磁盘或分区
+-------------------------------+
| 磁盘分区(Partition) | ⬅ 硬盘 /dev/sdX
+-------------------------------+
| 物理磁盘(HDD/SSD/RAID) |
+-------------------------------+
1. Partition(分区)
作用:
- 硬盘可以被分为多个 分区,每个分区可以用作不同用途(如 /boot、swap、LVM 等)。
- 分区工具:
fdisk
/parted
/gparted
。
示例:
# 8e 是 Linux 系统中表示 LVM(Logical Volume Manager)物理卷 的分区类型代码。
# 设置这个类型可以让系统识别这是 LVM 用途的分区。
fdisk /dev/sdb # 创建分区(比如 /dev/sdb1),设置类型为 8e
partprobe /dev/sdb # 让内核刷新分区表
pvcreate /dev/sdb1 # 创建物理卷
创建 LVM 兼容的分区时,建议使用 分区类型 8e
(Linux LVM)。
2. PV(物理卷,Physical Volume)
作用:
- LVM 的最底层单位,可以是整个硬盘
/dev/sdb
,也可以是一个分区/dev/sdb1
。 - 相当于 LVM 的“原材料”,多个 PV 组成一个 VG(卷组)。
创建 PV:
sudo pvcreate /dev/sdb1
查看 PV 信息:
sudo pvdisplay
3. VG(卷组,Volume Group)
作用:
- 多个 PV 组成一个 VG,相当于一个存储池,可以动态扩展和管理存储。
- VG 里可以创建多个 LV(逻辑卷)。
创建 VG:
sudo vgcreate my_vg /dev/sdb1 /dev/sdc1
查看 VG 信息:
sudo vgdisplay
4. PE(物理块,Physical Extent)
作用:
- LVM 以 PE(物理块)为单位分配空间(默认 4MB)。
- VG 内的所有 PE 大小相同,LV 由 PE 组成。
查看 PE 信息:
sudo vgdisplay my_vg | grep "PE"
5. LV(逻辑卷,Logical Volume)
作用:
- LV 相当于“动态分区”,可以自由创建、扩展、缩小(不像传统分区那样固定大小)。
- 在 VG 里划分 PE 创建 LV,可以格式化为 ext4/xfs 并挂载使用。
创建 LV:
sudo lvcreate -L 10G -n my_lv my_vg
格式化:
sudo mkfs.ext4 /dev/my_vg/my_lv
挂载:
sudo mount /dev/my_vg/my_lv /mnt/data
总结
概念 | 作用 | 命令 |
---|---|---|
Partition(分区) | 硬盘分区 | fdisk /dev/sdb |
PV(物理卷) | LVM 的最底层单元 | pvcreate /dev/sdb1 |
VG(卷组) | 由多个 PV 组成的存储池 | vgcreate my_vg /dev/sdb1 |
PE(物理块) | LVM 分配存储的基本单位 | `vgdisplay my_vg |
LV(逻辑卷) | 在 VG 里划分的存储空间 | lvcreate -L 10G -n my_lv my_vg |
实战示例
如果你有 两块磁盘 /dev/sdb
和 /dev/sdc
,想要创建一个 100GB 的逻辑卷:
# 1. 创建 LVM 分区
sudo fdisk /dev/sdb # 创建 LVM 分区(类型 8e)
sudo fdisk /dev/sdc # 创建 LVM 分区(类型 8e)# 2. 创建物理卷 PV
sudo pvcreate /dev/sdb1 /dev/sdc1# 3. 创建卷组 VG
sudo vgcreate my_vg /dev/sdb1 /dev/sdc1# 4. 创建逻辑卷 LV
sudo lvcreate -L 100G -n my_lv my_vg# 5. 格式化
sudo mkfs.ext4 /dev/my_vg/my_lv# 6. 挂载
sudo mount /dev/my_vg/my_lv /mnt/data
开机自动挂载:
echo "/dev/my_vg/my_lv /mnt/data ext4 defaults 0 2" | sudo tee -a /etc/fstab
LVM 的优势
✅ 可以动态调整大小(不像传统分区那样固定)。
✅ 多个磁盘可以合并成一个大存储池(VG)。
✅ 支持快照(Snapshot),适合备份恢复。
✅ 支持条带化(striping),提高性能。
LVM 适合 服务器、大型存储系统、RAID 方案等,如果你有具体需求,可以告诉我,我帮你设计最佳方案!🚀
1 | 整体流程梳理
好的,下面是一个完整的命令列表,涵盖了分区、创建 PV、PE、VG、LV,及扩容 VG 和 LV的完整操作流程。
🛠️ 完整命令列表:从分区、PV、VG、LV 到扩容
1. 分区操作(使用 fdisk
)
# 启动 fdisk 创建分区
sudo fdisk /dev/sdb# 在 fdisk 内部,按以下步骤操作
n # 创建新分区
p # 选择主分区(primary)
1 # 分区号(通常是 1)
[Enter] # 使用默认起始扇区
[Enter] # 使用默认结束扇区(即分区使用整盘空间)
t # 更改分区类型
8e # 设置为 LVM 类型
w # 保存并退出
2. 更新内核分区表
sudo partprobe /dev/sdb
3. 创建物理卷(PV)
sudo pvcreate /dev/sdb1
4. 创建卷组(VG)
# 创建一个新的卷组(假设名称为 vg0)
sudo vgcreate vg0 /dev/sdb1
5. 创建逻辑卷(LV)
# 创建一个 10G 的逻辑卷(假设名称为 my_lv)
sudo lvcreate -L 10G -n my_lv vg0
- 或者,如果想使用卷组中所有空闲空间:
sudo lvcreate -l 100%FREE -n my_lv vg0
6. 格式化逻辑卷
# 使用 ext4 格式化逻辑卷
sudo mkfs.ext4 /dev/vg0/my_lv
- 或者,如果使用
xfs
文件系统:
sudo mkfs.xfs /dev/vg0/my_lv
7. 挂载逻辑卷
# 创建挂载点
sudo mkdir /mnt/my_lv# 挂载逻辑卷
sudo mount /dev/vg0/my_lv /mnt/my_lv
🧑💻 扩容操作
8. 扩展卷组(VG)
如果现有 VG 空间不足,可以通过 vgextend
向卷组添加更多的物理卷。
# 创建新物理卷
sudo pvcreate /dev/sdc1# 将新物理卷添加到现有卷组 vg0
sudo vgextend vg0 /dev/sdc1
9. 扩容逻辑卷(LV)
如果需要将新增加的空间分配给某个逻辑卷,可以使用 lvextend
。
# 将逻辑卷 my_lv 扩展到 20G
sudo lvextend -L 20G /dev/vg0/my_lv# 或者将剩余的所有空闲空间分配给 my_lv
sudo lvextend -l +100%FREE /dev/vg0/my_lv
10. 扩展文件系统
扩展了逻辑卷之后,还需要扩展文件系统,以便能够使用新增的空间。
- 对于
ext4
文件系统:
sudo resize2fs /dev/vg0/my_lv
- 对于
xfs
文件系统:
sudo xfs_growfs /mnt/my_lv
📊 验证操作
- 查看物理卷状态:
sudo pvdisplay
- 查看卷组状态:
sudo vgdisplay
- 查看逻辑卷状态:
sudo lvdisplay
- 查看挂载的文件系统空间:
df -h
⚠️ 注意事项
- VG 扩容:在添加新的物理卷后,通过
vgextend
将其添加到现有的卷组。确保新的磁盘或分区已正确初始化为 LVM 类型。 - 扩容 LV:使用
lvextend
来将额外的空间分配给逻辑卷。记得扩展文件系统来利用这些新增的空间。 - 文件系统扩展:不同的文件系统需要不同的扩展命令。确保你选择了合适的命令(
resize2fs
用于ext4
,xfs_growfs
用于xfs
)。
✅ 总结
- 分区操作:使用
fdisk
创建新分区并设置为 LVM 类型8e
。 - 创建 PV:使用
pvcreate
创建物理卷。 - 创建 VG:使用
vgcreate
创建卷组。 - 创建 LV:使用
lvcreate
创建逻辑卷。 - 扩容 VG:使用
vgextend
向卷组添加物理卷。 - 扩容 LV:使用
lvextend
扩展逻辑卷。 - 扩展文件系统:使用
resize2fs
或xfs_growfs
扩展文件系统。
这些命令可以根据你的需求定制化,比如自动化脚本或批量操作。如果需要进一步帮助,随时告诉我!
2 | lv 扩容
在 Linux 系统中使用 LVM(Logical Volume Manager)扩容逻辑卷(lv
)一般分为以下几个步骤:
🌟 举个例子:
我们以逻辑卷 /dev/vg0/my_lv
扩容 10G 为例。
1. 查看当前磁盘和逻辑卷信息
# 查看物理卷(PV)
pvs# 查看卷组(VG)
vgs# 查看逻辑卷(LV)
lvs
lvdisplay /dev/vg0/my_lv
2. (可选)为 VG 添加新的物理卷
如果卷组空间不足,可以添加新的磁盘并初始化为 PV,然后加入 VG:
# 把新磁盘 /dev/sdb 初始化为 PV
pvcreate /dev/sdb# 加入已有的卷组 vg0
vgextend vg0 /dev/sdb
3. 扩容逻辑卷
比如扩容 10G:
lvextend -L +10G /dev/vg0/my_lv
或者扩容到 VG 所有剩余空间:
lvextend -l +100%FREE /dev/vg0/my_lv
4. 扩容文件系统
这个步骤根据你使用的文件系统类型不同而略有差别:
如果是 ext4:
resize2fs /dev/vg0/my_lv
如果是 xfs:
xfs_growfs /mount/point
⚠️ 注意:xfs 的扩容需要你指定挂载点,而不是设备文件!
5. 验证
df -h
需要我帮你写一个脚本来自动扩容吗?或者你现在的设备名、VG、LV 是什么样的,我可以帮你具体看下。
3 | 理解扩容参数
好问题!
lvextend
命令的 -L
和 -l
是 扩容逻辑卷大小的两种不同方式,区别如下:
✅ -L
(大写 L)——以字节为单位的绝对或相对容量
- 单位支持:
K
,M
,G
,T
等 - 用于指定 具体容量大小 或者 增加多少容量
示例:
# 扩展到 20G(绝对值)
lvextend -L 20G /dev/vg0/my_lv# 在当前基础上增加 10G(相对值)
lvextend -L +10G /dev/vg0/my_lv
✅ -l
(小写 L)——以扩展块(PE,Physical Extents)为单位
- 每个卷组(VG)由若干个 PE 构成(默认一个 PE 是 4MB)
- 更偏向底层,适用于需要更精细控制或自动扩满整个卷组空间
示例:
# 扩展到 1000 个 PE 的大小(绝对)
lvextend -l 1000 /dev/vg0/my_lv# 增加 500 个 PE(相对)
lvextend -l +500 /dev/vg0/my_lv# 使用所有可用空间(常见写法)
lvextend -l +100%FREE /dev/vg0/my_lv
🔍 那我该用哪一个?
用法场景 | 推荐参数 |
---|---|
想要加 10G 空间 | -L +10G |
想要用光 VG 的剩余空间 | -l +100%FREE |
做自动化脚本或精确控制 | -l (PE 级别) |
如果你输入 vgdisplay
可以看到 PE 大小和 VG 中总共多少 PE 可用。
需要我帮你把你当前的 VG/LV 状态分析一下选哪个更合适吗?你可以贴一下 vgs
和 lvs
输出。
4 | PE 大小的设置
是的,PE(Physical Extent)大小是可以设置的,但只能在 创建卷组(VG)的时候指定,一旦 VG 创建完成,PE 大小就不能更改了。
🔧 设置 PE 大小的方法
在创建 VG 时使用 vgcreate
命令加 -s
选项:
vgcreate -s 16M vg0 /dev/sdX
这个命令会创建一个名为 vg0
的卷组,PE 大小设置为 16MB
。
📌 支持的单位
常见单位:k
, m
, g
(不区分大小写)
- 一般默认是
4MB
,这对大多数应用是足够的 - 最大支持
16GB
🧠 为什么关心 PE 大小?
- 空间粒度:PE 越小,空间利用更精细;PE 越大,适合大容量分配但有可能浪费小空间。
- LV 大小限制:逻辑卷大小 = PE大小 × PE数量。如果你计划使用非常大的磁盘,就可能要调大 PE。
- 性能无明显区别:这主要是空间管理单位,不直接影响性能。
🔍 如何查看已有 VG 的 PE 大小?
vgdisplay vg0
输出中你会看到类似:
PE Size 4.00 MiB
❗ 一旦 VG 创建好了,PE 大小就固定了,不能更改
如果你非要修改,只能:
- 备份数据
- 删除 VG
- 重新创建 VG(设置新的 PE 大小)
- 恢复数据
想看看你当前的 VG 设置吗?可以发一下 vgdisplay
输出,我帮你解释下。
5 | 创建分区注意事项
是的,通常你需要先分区,才能创建 PV(Physical Volume),不过其实 并不是强制的——你也可以直接对整个磁盘创建 PV,而不分区。
✅ 两种方式对比如下:
方式 | 是否分区 | 设备路径 | 是否推荐 |
---|---|---|---|
推荐做法 | ✅ 是 | /dev/sdb1 | ✅ 推荐(兼容性好) |
直接用整块磁盘做 PV | ❌ 否 | /dev/sdb | ✅ 可以,但要小心 |
🔧 示例 1:标准流程(先分区)
fdisk /dev/sdb # 创建分区(比如 /dev/sdb1),设置类型为 8e
partprobe /dev/sdb # 让内核刷新分区表
pvcreate /dev/sdb1 # 创建物理卷
⚡ 示例 2:直接用整盘(不分区)
pvcreate /dev/sdb # 直接对整块磁盘操作
❗ 整盘创建 PV 的注意事项:
- 不需要分区表,也不会有
/dev/sdb1
这种分区设备。 - 某些旧版本的操作系统、安装器或工具(特别是系统恢复工具)可能不太支持裸盘做 PV。
- 如果将来这块盘要做别的用途,比如多分区使用、挂载普通文件系统等,直接用裸盘就不太方便了。
🧠 总结建议:
- 💡 生产环境 推荐用标准方式:先分区 ➜
pvcreate /dev/sdXN
- 🧪 测试环境 / 临时用途 可以直接用整盘 ➜
pvcreate /dev/sdX
你是打算长期用这块盘作为 LVM 存储吗?我可以根据你的使用场景建议最合适的方式。
6 | 理解 fdisk 创建分区设置为 8e 类型
理解fdisk
fdisk
作用
fdisk
是 Linux 的磁盘分区管理工具,用于查看、创建、删除和修改磁盘分区。
它主要用于 MBR(主引导记录)分区表,而对于 GPT(GUID 分区表),推荐使用 parted
或 gdisk
。
fdisk
主要功能
功能 | 命令 |
---|---|
查看磁盘分区 | sudo fdisk -l |
进入分区管理 | sudo fdisk /dev/sdX |
创建新分区 | n |
删除分区 | d |
修改分区类型 | t |
查看分区表 | p |
写入分区表并退出 | w |
退出不保存 | q |
fdisk
实战:创建 LVM 分区
假设你要在 /dev/sdb
和 /dev/sdc
上创建 LVM 分区,步骤如下:
1. 进入 fdisk
进行分区
sudo fdisk /dev/sdb
按以下步骤操作:
- 输入
n
→ 新建分区 - 选择
p
→ 主分区 - 选择 分区号(默认即可)
- 选择 起始扇区(默认即可)
- 选择 结束扇区(默认使用整个磁盘)
- 输入
t
→ 修改分区类型 - 选择
8e
→ Linux LVM - 输入
w
→ 写入并退出
2. 再次执行 fdisk
处理 /dev/sdc
sudo fdisk /dev/sdc
重复 1-8 步骤。
3. 查看分区是否创建成功
sudo fdisk -l /dev/sdb /dev/sdc
你应该会看到类似:
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 1953525167 1953523120 931.5G 8e Linux LVM
/dev/sdc1 2048 1953525167 1953523120 931.5G 8e Linux LVM
4. 创建 LVM 物理卷
sudo pvcreate /dev/sdb1 /dev/sdc1
之后可以继续创建 VG(卷组)、LV(逻辑卷),管理 LVM 存储。
总结
🔹 fdisk
是一个 磁盘分区管理工具,适用于 MBR 磁盘。
🔹 fdisk
可用于 创建 LVM 分区(类型 8e)。
🔹 fdisk -l
可用于 查看磁盘分区信息。
🔹 GPT 分区建议使用 parted
或 gdisk
。
你现在是要在 新磁盘上配置 LVM 吗?如果有具体需求,可以告诉我,我帮你设计方案! 🚀
7 | 线性模式或交错模式写入
在 LVM 中,线性模式(Linear Volume) 和 交错模式(Striped Volume) 是两种不同的逻辑卷(LV)创建方式,它们的创建方式和数据布局策略不同。下面是对这两种模式的详细解释,以及如何在这两种模式下创建逻辑卷。
1. 线性模式(Linear Volume)
线性模式是 LVM 的默认模式。在线性模式下,LVM 会将多个物理卷(PV)上的空间按顺序组合在一起,形成一个连续的逻辑卷。换句话说,数据会按照物理卷的顺序存储,不进行任何交错操作。
特点:
- 数据在物理卷之间按顺序分布。
- 不涉及并行读写,因此没有性能的提升。
- 适合于空间的简单扩展,尤其是当需要跨多个磁盘使用空间时。
创建线性逻辑卷(默认方式):
如果你没有指定 --type striped
参数,LVM 默认会创建一个线性逻辑卷。
命令示例:
# 手动指定要使用的物理卷(磁盘分区)
sudo lvcreate -L 20G -n my_linear_lv vg0 /dev/sdb1 /dev/sdc1
# 可以写为如下模式,直接采用 vg0 的存储空间,分配的物理卷(磁盘分区)由系统指定
sudo lvcreate -L 20G -n my_linear_lv vg0
-L 20G
:指定逻辑卷的大小为 20GB。-n my_linear_lv
:指定逻辑卷的名称为my_linear_lv
。vg0
:指定逻辑卷所在的卷组(VG)。/dev/sdb1 /dev/sdc1
:指定多个物理卷(PV),LVM 会按顺序在这些物理卷中分配空间。
数据布局:
- 数据会按顺序写入
/dev/sdb1
,直到其空间用尽,然后再写入/dev/sdc1
,以此类推。
2. 交错模式(Striped Volume)
交错模式是 LVM 提供的另一种逻辑卷类型。在交错模式下,LVM 会将数据分割成多个条带(stripes),并将这些条带分布到不同的物理卷上。这样,读写操作会并行进行,通常会提高磁盘 I/O 性能,尤其是在多个物理卷之间进行并行读写时。
特点:
- 数据被划分为多个条带(stripes),分布在不同的物理卷上。
- 适用于需要提高性能的场景,尤其是在多个磁盘之间进行并行读写时。
- 写入性能得到提升,但如果某个磁盘发生故障,可能会导致数据丢失。
创建交错逻辑卷:
要创建交错模式的逻辑卷,需要在 lvcreate
命令中明确指定 --type striped
参数。
命令示例:
# 手动指定要使用的物理卷(磁盘分区)
sudo lvcreate --type striped -L 20G -n my_striped_lv vg0 /dev/sdb1 /dev/sdc1
# 可以写为如下模式,直接采用 vg0 的存储空间,分配的物理卷(磁盘分区)由系统指定
sudo lvcreate --type striped -L 20G -n my_striped_lv vg0
--type striped
:指定创建交错模式的逻辑卷。-L 20G
:指定逻辑卷的大小为 20GB。-n my_striped_lv
:指定逻辑卷的名称为my_striped_lv
。vg0
:指定逻辑卷所在的卷组(VG)。/dev/sdb1 /dev/sdc1
:指定多个物理卷(PV)。
数据布局:
- 在交错模式下,LVM 会将数据划分为多个条带(stripes),并将它们交替分布到
/dev/sdb1
和/dev/sdc1
上。例如:- 数据的第一个条带会写入
/dev/sdb1
,第二个条带写入/dev/sdc1
,第三个条带写入/dev/sdb1
,以此类推。
- 数据的第一个条带会写入
- 这种方式可以显著提高磁盘的并行读写性能。
总结
模式 | 描述 | 性能优势 | 创建命令 |
---|---|---|---|
线性模式 | 将物理卷按顺序组合在一起,数据按顺序写入 | 不涉及并行读写,性能较低 | sudo lvcreate -L 20G -n my_linear_lv vg0 /dev/sdb1 /dev/sdc1 |
交错模式 | 数据被划分为条带并分布到多个物理卷上 | 并行读写,提高磁盘 I/O 性能 | sudo lvcreate --type striped -L 20G -n my_striped_lv vg0 /dev/sdb1 /dev/sdc1 |
关键点:
- 线性模式:数据按物理卷的顺序存储,适合于简单的空间扩展。
- 交错模式:数据被分为条带并分布到多个物理卷,适合需要提高磁盘 I/O 性能的场景,但也伴随更高的故障风险。
根据需求的不同,你可以选择使用线性模式或交错模式来创建逻辑卷。
8 | lvcreate 参数配置
LVM 创建逻辑卷(LV)时的物理卷指定方法总结
在使用 LVM(Logical Volume Manager)时,创建逻辑卷(LV)时可以选择是否指定物理卷(PV)。下面是两种方式的总结以及相关的注意事项。
1. 不指定物理卷参数
在不指定物理卷参数时,LVM 会自动从卷组(VG)中的所有可用物理卷中选择空间来创建逻辑卷。通常,这种方式非常简单,适用于卷组中有足够空间的情况。
命令示例:
sudo lvcreate -L 20G -n my_lv vg0
-L 20G
:指定逻辑卷的大小为 20GB。-n my_lv
:指定逻辑卷的名称为my_lv
。vg0
:指定逻辑卷所在的卷组(VG)。LVM 会从该卷组中的所有物理卷中选择空间。
注意事项:
- 卷组中的空间必须足够:如果卷组
vg0
中没有足够的空间来创建 20GB 的逻辑卷,命令将失败。 - 自动选择物理卷:LVM 会自动选择卷组中的所有物理卷来分配空间,无需手动指定。
2. 指定物理卷参数
在创建逻辑卷时,你也可以明确指定物理卷,这意味着 LVM 将仅从你指定的物理卷中选择空间来创建逻辑卷。你可以使用这种方式控制数据存储的位置。
命令示例:
sudo lvcreate -L 20G -n my_lv vg0 /dev/sdb1 /dev/sdc1
-L 20G
:指定逻辑卷的大小为 20GB。-n my_lv
:指定逻辑卷的名称为my_lv
。vg0
:指定逻辑卷所在的卷组(VG)。/dev/sdb1
和/dev/sdc1
:指定要用于创建逻辑卷的物理卷。LVM 会从这些物理卷中选择空间来创建逻辑卷。
注意事项:
-
物理卷需要提前初始化为 PV:在你使用物理卷(如
/dev/sdb1
和/dev/sdc1
)之前,必须通过pvcreate
命令将它们初始化为物理卷。sudo pvcreate /dev/sdb1 sudo pvcreate /dev/sdc1
-
物理卷需要加入到卷组(VG)中:物理卷必须先被添加到卷组中,才能用于创建逻辑卷。可以使用
vgextend
命令将物理卷加入现有的卷组。sudo vgextend vg0 /dev/sdb1 sudo vgextend vg0 /dev/sdc1
-
空间分配:如果指定了多个物理卷,LVM 会在这些物理卷中分配空间,按照一定的策略(如线性或交错模式)将空间划分到逻辑卷中。
3. 创建逻辑卷时的步骤总结
无论是否指定物理卷,在创建逻辑卷时,通常需要遵循以下步骤:
不指定物理卷:
- 确保卷组(VG)中有足够的可用空间。
- 使用
lvcreate
创建逻辑卷,LVM 会自动从卷组中选择物理卷进行空间分配。
指定物理卷:
-
初始化物理卷:使用
pvcreate
命令将硬盘或分区初始化为物理卷(PV)。sudo pvcreate /dev/sdb1 sudo pvcreate /dev/sdc1
-
将物理卷加入卷组:使用
vgextend
命令将物理卷添加到卷组(VG)中。sudo vgextend vg0 /dev/sdb1 sudo vgextend vg0 /dev/sdc1
-
创建逻辑卷:使用
lvcreate
命令创建逻辑卷,并指定物理卷。sudo lvcreate -L 20G -n my_lv vg0 /dev/sdb1 /dev/sdc1
4. 常见问题与注意事项
- 没有足够的空间:在不指定物理卷时,如果卷组中的空间不足,
lvcreate
命令会失败。指定物理卷时,需要确保这些物理卷有足够的空间。 - 物理卷的初始化和添加:如果指定的物理卷没有被初始化为 PV 或没有加入到卷组中,LVM 会报错,无法创建逻辑卷。
- 空间分配策略:当指定多个物理卷时,LVM 会根据逻辑卷的类型(线性或交错)分配空间。交错模式会提高性能,但需要小心数据丢失的风险。
总结
- 不指定物理卷:LVM 会自动从卷组中的所有物理卷中选择空间,适用于卷组中空间充足的情况。
- 指定物理卷:你可以控制逻辑卷的存储位置,前提是物理卷已经初始化为 PV,并加入到卷组中。
通过了解这些方法和注意事项,你可以灵活地在 LVM 中创建逻辑卷,并根据需求选择是否指定物理卷。
相关文章:
【k8s学习之CSI】理解 LVM 存储概念和相关操作
鸟哥的 Linux 私房菜 – Quota, Software RAID, LVM, iSCSI 0 | 理解 vg 相关概念 在 Linux LVM(逻辑卷管理) 中,以下是 partition(分区)、PV(物理卷)、VG(卷组)、LV&am…...
【分享开发笔记,赚取电动螺丝刀】使用STM32F103的hal库,采用PWM+DMA发送方式驱动WS2812的RGB彩灯
简单和大家介绍一下本文章的主要内容:使用STM32F103C8最小系统板,使用STM32 cubeMX 6.14版本生成底层的驱动库、结合定时器的PWM 输出功能、使用DMA发送数据的 方式,驱动WS2812 的RGB三色灯。 本次小的DIY所需的物料:stm32f103c8…...
CubeMX配置STM32VET6实现网口通信(无操作系统版-附源码)
下面是使用CubeMX配置STM32F407VET6,实现以太网通讯(PHY芯片为LAN8720)的具体步骤总结: 一、硬件连接方式: 硬件原理图: 使用外部晶振为PHY芯片提供时钟。 STM32F407VET6 与 LAN8720 采用 RMII 模式连接。…...
一种反激式开关电源设计流程
引:随着生产和技术的发展,对环保和能源的要求也越来越高,开关电源的应用也越来越广泛,开关电源电路结构种类繁多,包括单端转换器和双端转换器。本文介绍一种利用反激式变换电路实现5V开关电源的设计方法,以…...
数据结构实验3.2:链栈的基本操作与括号匹配问题
文章目录 一,问题描述二,基本要求三,算法分析(一)链栈的存储结构设计(二)链栈基本操作的时间复杂度分析(三)括号匹配算法分析 四,示例代码五,实验…...
一周学会Pandas2 Python数据处理与分析-NumPy算术运算和统计计算
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 算术运算 数组的灵魂就在于可以进行批量的运算而不是要在循环里面进行元素的运算: 示例: …...
2011年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2011年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
科普:GBDT与XGBoost比较
本文不去讲GBDT与XGBoost算法的原理及算法本身,而是从应用者的角度,对二者比较,以便选择。 XGBoost是GBDT的“工程化增强版”,在保持Boosting核心思想的同时,通过数学优化(二阶导数、正则化)和工…...
大数据技术之 Scala(5)
以下是今天学习的知识点与代码测试: 一、不可变数组与可变数组的转换 说明 arr1.toBuffer //不可变数组转可变数组arr2.toArray //可变数组转不可变数组 arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化arr1.toBuffer 返回结果才是一个可变…...
int 与 Integer 的区别详解
1. 本质区别 特性intInteger类型基本数据类型(Primitive)包装类(Wrapper Class)存储位置栈(或作为对象成员在堆中)堆(对象实例)默认值0null(可能导致 NullPointerExcept…...
初阶数据结构(3)顺序表
Hello~,欢迎大家来到我的博客进行学习! 目录 1.线性表2.顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现初始化尾插头插尾删头删查找指定位置之前插入数据删除指定位置的数据销毁 1.线性表 首先我们需要知道的是,…...
智能DNS解析:解决高防IP地区访问异常的实战指南
摘要:针对高防IP在部分地区无法访问的问题,本文设计基于智能DNS的流量调度方案,提供GeoDNS配置与故障切换代码示例。 一、问题背景 运营商误拦截或线路波动可能导致高防IP在福建、江苏等地访问异常。传统切换方案成本高,智能DNS可…...
瑞芯微RK3568嵌入式AI项目实战:项目方向(三)
基于RK3568的成熟开源项目和实战资源丰富,以下是针对小白的精选推荐及学习路径规划,结合多个开源项目和详细教程,帮助快速入门嵌入式开发: 一、OpenHarmony智能设备开发 1. 凌蒙派-RK3568开发板项目 项目特点:支持Op…...
go游戏后端开发26:红中麻将发牌逻辑
首先,麻将游戏创建房间的逻辑与之前我们做过的“赢三张”创建房间的逻辑是一致的,整体上没有问题。不同之处在于,我们在创建房间时会根据游戏类型来创建对应的“game”,即创建的是麻将的“game”。大家之前写过相关代码࿰…...
DataFrame的遍历、排序、去重与分组
一.遍历 1.1 series遍历 import pandas as pds pd.Series([a,b,c,d,e,f],index[1,2,3,4,5,6])for i in s:print(i) a b c d e f 可见,遍历series会直接拿到其中的值 1.2 DataFrame遍历 1.2.1 直接遍历 import pandas as pd data {name: [Alice, Bob, Charlie]…...
QEMU源码全解析 —— 块设备虚拟化(17)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社...
Java 中使用 File 类创建文件
文章目录 Java 中的 File 类一、文件(File)定义 二、File 类的介绍1 创建文件对象的相关构造器2 createNewFile() 的作用3 获取文件相关信息的常用方法4 目录的操作和文件的删除 Java 中的 File 类 在 Java 中,文件和文件流是处理数据输入/输…...
PowerBI-按钮过滤筛选-宜宾五粮液股份有限公司财务分析
下面为Powerbi制作的财务主题数据分析模版,以可视化的效果展示了某股份有限公司的财务关键指标数据,如营业收入、净利润、毛利率和净利率等。以瀑布图的方式展示了利润表项目金额情况,以树图方式展示了企业资产负债数据。另外图表可以进行筛选…...
【PyQt5】QSS样式表如何使用
在 PyQt5 中,使用 QSS(Qt Style Sheets)来为窗口中的各个控件添加样式是非常方便的,类似于 HTML 中的 CSS。你可以通过 QWidget.setStyleSheet() 方法应用 QSS 样式,或者通过 .qss 文件来设置样式。 基本步骤…...
数据结构:用生活中的例子解释 AOE 网中活动的最早和最迟开始时间的含义和计算方法
生活实例:装修房子中的活动安排 假设你要装修一套房子,主要流程如下: 拆旧(活动 A,3 天) → 拆旧完成(事件 X)水电改造(活动 B,4 天) → 水电完…...
第二篇:系统分析师——7-11章
目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌…...
二十七- Scala
抽象属性和方法 1. 基本语法: 定义抽象类:abstract class Person{} //通过 abstract 关键字标记抽象类 定义抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性 定义抽象方法:def hello():String //…...
轨检探伤专用一体机平板电脑:为铁路安全保驾护航
在铁路轨道检测领域,高效、精准的探伤设备是保障列车安全运行的核心工具。鲁成伟业针对轨检探伤小车的严苛需求,推出了多款高性能专用一体机平板电脑,以创新的技术设计和卓越的适应性,成为行业标杆解决方案。以下从产品性能、技术…...
2018年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2018年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
Python数据爬取
一.example1包下的 注意:需要在终端安装pip3 install -i https://requests.readthedocs.io/en/latest/ requests 1.Python网络爬虫初探-get请求 import requests rrequests.get(https://www.baidu.com) print(r.text) r1requests.get(https://www.jd.com) print…...
【详细解析:如何在小程序中实现动态二维码和预约信息展示】
背景介绍 随着小程序的快速发展,二维码已成为很多线上线下场景中必不可少的工具。在这篇文章中,我将分享如何在小程序中实现一个动态生成二维码并展示预约信息的功能。我们会使用 Vue 和 uni-app 框架,结合自定义的 API,来获取预…...
信息学奥赛一本通 1929:【04NOIP普及组】火星人 | 洛谷 P1088 [NOIP 2004 普及组] 火星人
【题目链接】 ybt 1929:【04NOIP普及组】火星人 洛谷 P1088 [NOIP 2004 普及组] 火星人 【题目考点】 1. 深搜回溯 2. STL next_permutation函数 头文件<algorithm> 函数定义:next_permutation(lb, ub, cmp) lb:区间下界ÿ…...
mysql8.0.29 win64下载
mysql win64安装包 mysql win64安装包下载 mysql win64安装包下载 通过网盘分享的文件:mysql 链接: https://pan.baidu.com/s/1sEOl-wSVtOG5gfIRdt5MXw?pwdgi7i 提取码: gi7i...
C++笔记-string(下)
这篇我们自己来简单实现一下string类中的各个接口,来帮助我们更好地理解string类接口的底层原理。 1.构造函数和析构函数 对于构造函数我们要写两种情况:空字符串和非空字符串 因为我们要自己实现string类,所以就不能用std命名空间…...
Android studio学习之路(六)--真机的调试以及多媒体照相的使用
多媒体应用(语言识别,照相,拍视频)在生活的各个方面都具有非常大的作用,所以接下来将会逐步介绍多媒体的使用,但是在使用多媒体之前,使用模拟器肯定是不行的,所以我们必须要使用真机…...
Airflow集成Lark机器人
🥭1. 实现目标 🕐 通过自定义函数,实现Lark机器人告警功能 🕐 通过Lark机器人代替邮件数据的发送功能 🥭2.自定义函数实现 from airflow import DAG from airflow.operators.python_operator import PythonOperator from airflow.models import Variable import requ…...
【电视软件】小飞电视v2.7.0 TV版-清爽无广告秒换台【永久更新】
软件介绍 小飞电视是一款电视端的直播软件,无需二次付费和登录,资源丰富,高清流畅。具备开机自启、推送功能、自定义直播源、个性化设置及节目预告等实用功能,为用户带来良好的观看体验。基于mytv开源项目二改,涵盖央…...
2025年- H1-Lc109-160. 相交列表--java版
1.题目描述 2.思路 “双指针切换链表头” 思路一:双指针路径对齐 while (pA ! pB) { pA (pA null) ? headB : pA.next; pB (pB null) ? headA : pB.next; } 让两个指针走相同的总路径长度! 设: 链表 A 独有部分长度是 lenA 链表 B …...
《大模型MCP服务协议与多智能体开发实战10讲》课程大纲
以下是针对大模型MCP(Model Context Protocol)服务协议的多智能体开发系列专栏的10节课课程设计,结合MCP协议特性与多智能体系统的前沿实践,课程结构从协议原理到工程落地,涵盖核心技术、实战案例与前沿趋势࿱…...
C++20 范围库:开启现代 C++ 编程的新篇章
文章目录 一、范围库的核心概念(一)范围(Range)(二)视图(View) 二、范围库的主要特性(一)范围工厂(二)范围适配器(三&…...
基于 Spring Boot 瑞吉外卖系统开发(二)
基于 Spring Boot 瑞吉外卖系统开发(二) 员工登录功能实现 员工登录页面login.html存放在/resources/backend/page/login目录下。 启动项目,在浏览器中通过地址“http://localhost:8080/backend/page/login/login.html”访问员工登录页面。…...
Matlab实现鼠群优化算法优化随机森林算法模型 (ROS-RF)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鼠群优化算法(Rat Swarm Optimizer, ROS)是一种基于老鼠觅食行为的新型元启发式优化算法。ROS通过模拟老鼠在寻找食物时的社会互动和群体智能来探索解空间,旨在高效地找到全局最…...
软件工程第四章习题
一、选择题 1.选择题 (1)在需求分析之前有必要进行( )工作。 A.程序设计 B.可行性研究 C. E-R 分析 D.行为建模 (2)需求分析是一个( ),它应该贯穿于系统的整个生命周期,而不是仅仅属于软件生 命周期早期的一…...
第十九:b+树和b-树
优点一: B树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。 优点二: B树所有的Data域在叶子节点,并且所有叶子节点之间都有一个链指针。 这样遍历叶子节点就能获得全部数据,这样…...
SQL Server查询性能下降:执行计划不稳定与索引优化
问题现象: SQL Server 2022 中某些关键查询性能突然下降,执行时间从毫秒级增至数秒,日志中未报错,但查询计划显示低效的索引扫描或键查找。 快速诊断 捕获实际执行计划: -- 启用实际执行计划 SET STATISTICS XML, TIME…...
python mcp server最佳实践
文章目录 1、使用fastmcp包还是mcp包?要不要使用uv创建虚拟环境?编写mcp server代码测试cline配置小Tip2、使用stdio还是sse?其实能做的选择不多: 1、使用fastmcp包还是mcp包? 2、使用stdio还是sse? 1、使用fastmcp包还是mcp包? 个人建议选择后者,因为大模型说,后者…...
STM32看门狗应用实战:独立看门狗与窗口看门狗深度解析(下) | 零基础入门STM32第九十五步
主题内容教学目的/扩展视频看门狗什么是看门狗,原理分析,启动喂狗方法,读标志位。熟悉在程序里用看门狗。 师从洋桃电子,杜洋老师 📑文章目录 一、看门狗应用架构分析1.1 系统监控流程图1.2 双看门狗应用场景对比 二、…...
操作符详解
1.操作符的分类 算数操作符: 、- 、 * 、 / 、 %移位操作符:>>、 <<位操作符:& 、| 、^ 赋值操作符:、、-、/、%、<<、>>、&、|、^单目操作符:!、、- -、&、*、、…...
LeetCode 第41~43题
目录 LeetCode 第41题:缺失的第一个正数 LeetCode 第42题:接雨水 LeetCode 第43题:字符串相乘 LeetCode 第41题:缺失的第一个正数 题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的…...
蓝桥杯web工作协调
在 JavaScript 里,Set 是一种内置对象,可存储任何类型的唯一值,无论是原始值还是对象引用。下面是 Set 集合常用方法的介绍: 1. 创建 Set 可以使用 new Set() 来创建一个空的 Set,或者传入一个可迭代对象来初始化 Se…...
夜神模拟器无法下载fiddler证书
提示信息: No root certificate was found. Have you enabled HTTPS traffic decryption in Fiddler yet? 在fiddler安装目录运行以下命令: makecert.exe -r -ss my -n "CNDO_NOT_TRUST_FiddlerRoot, ODO_NOT_TRUST, OUCreated by http://www.fidd…...
OpenCV阈值处理详解
文章目录 一、引言二、阈值处理的基本概念2.1 什么是阈值处理?2.2 为什么需要阈值处理? 三、OpenCV中的阈值处理方法3.1 基本阈值处理3.2 阈值类型详解1. 二进制阈值化 (cv2.THRESH_BINARY)2. 反二进制阈值化 (cv2.THRESH_BINARY_INV)3. 截断阈值化 (cv2…...
开源模型应用落地-Qwen2.5-Omni-7B模型-Gradio-部署 “光速” 指南(二)
一、前言 2025年3月,阿里巴巴通义千问团队开源的全模态大模型Qwen2.5-Omni-7B,犹如一记惊雷划破AI领域的长空。这个仅70亿参数的"小巧巨人",以端到端的架构实现了对文本、图像、音频、视频的全模态感知,更通过创新的Thinker-Talker双核架构,将人类"接收-思…...
【仪器仪表专题】案例:信号高电平到底是看顶端值还是最大值?
案例背景 本案例在于审查其他部门信号完整性测试报告中发现的一处有关RS232输入信号质量波形测试问题点。 首先发现测试报告中的RS232时序和信号质量测试中有一个NG项目,如下所示,可以看到T2IN的高电平要求是2.0V~3.6V之间,但是实测是3.8V,超过极限值,所以判定为NG。 …...
Git版本管理系列:(一)使用Git管理单分支
目录 基础概念介绍仓库的创建创建隐藏目录添加代码到暂存区提交代码到仓库提交记录查询比较差异标签文件删除版本回退总结 Git 是一个分布式版本控制系统(DVCS),用于跟踪文件的变更并协调多人协作开发,由 Linus Torvalds 于 2…...