![在没有分区的虚拟 LVM 磁盘上安装](https://linux22.com/image/1047498/%E5%9C%A8%E6%B2%A1%E6%9C%89%E5%88%86%E5%8C%BA%E7%9A%84%E8%99%9A%E6%8B%9F%20LVM%20%E7%A3%81%E7%9B%98%E4%B8%8A%E5%AE%89%E8%A3%85.png)
我正在使用文本/控制台安装程序在 KVM/libvirt vm 中安装 Ubuntu 服务器。
我打算将两个 LVM 卷作为 root 和 swap 移交给 VM 作为虚拟磁盘。
它们被正确检测为vda
和vdb
,但是安装程序似乎强迫我将它们分区为磁盘,这会破坏 LVM 的灵活性。
我怎样才能直接格式化虚拟磁盘而不是使用分区来安装 Ubuntu,或者这是一个坏主意?
动机:
关键在于通过从存储层次结构中删除不必要的抽象级别来降低复杂性。
- 物理驱动器:
host:/dev/sd{a,b}
- 分区:
host:/dev/sd{a,b}1
- sw-突袭:
host:/dev/md1
- lvm:
host:/dev/vg0/mylv_root
- VirtIO 磁盘
guest:/dev/vda
- 分区:
guest:/dev/vda1
- 文件系统:
guest:/
在这种布局中,当为单个虚拟机分配额外空间时,我必须执行以下步骤:
lvresize
parted
,尤其丑陋resize2fs
以相反的方式减少分配的空间(这更加丑陋)。
对于备份(例如使用lvcreate --snapshot
),还有一个额外的步骤,kpartex
如psusi所解释的。
我想从等式中删除 6.,因为我看不出这种抽象能提供什么价值。但它确实增加了复杂性、可能的性能影响和小空间浪费。
黑客解决方案:
使用kpartx
我能够将根文件系统从“引导分区”(在另一个临时逻辑卷内)移动到目标逻辑卷,然后通过直接内核引导进行引导。
kpartx -a /dev/vg0/mylv_bootstrapper
dd if=/dev/mapper/vg0-mylv_bootstrapper1 of=/dev/vg0/mylv_root bs=4M
e2fsck -f /dev/vg0/mylv_root
# Edit fstab inside /dev/vg0/mylv_root accordingly
resize2fs /dev/vg0/mylv_root
kpartx -d /dev/vg0/mylv_bootstrapper
然而:
- 这感觉很奇怪。
- 我不太喜欢直接内核启动的想法,因为每次升级内核时我都必须手动更新主机中客户机的内核版本。
答案1
嗯,无论它是否是 LVM,您都必须对空间进行分区/格式化。
是的,KVM 将把设备视为“vda”和“vdb”。
总的来说,尽管 KVM 使用原始分区/LVM,但在我看来,使用虚拟磁盘更可靠。占用相同的空间,并且您始终可以在虚拟磁盘上使用 LVM 和/或调整虚拟磁盘的大小。
答案2
实际上我发现有一个简单的答案:如果逻辑卷已格式化(例如host# mkfs.ext4 /dev/vg0/mylv_root
),则安装程序将检测并允许将其用作“虚拟磁盘的分区 1”。然后它甚至可以重新格式化分区。
但是 Grub 将无法安装,可以使用直接内核启动来代替。