修改主机和 KVM 来宾上安装的分区上的文件,了解造成的损坏

修改主机和 KVM 来宾上安装的分区上的文件,了解造成的损坏

我有一台服务器,添加了两个 SSD。在主机上,我使用 mdadm 创建了两个 RAID 1。

创建 RAID 的方法是首先在 SSD 上创建分区,然后使用分区创建 RAID,然后将其格式化为 ext4 并对其进行标记。

parted -a optimal /dev/nvme1n1 mkpart primary ext4 0% 100%
parted -a optimal /dev/nvme2n1 mkpart primary ext4 0% 100%

parted -a optimal /dev/nvme1n1 set 1 raid on
parted -a optimal /dev/nvme2n1 set 1 raid on

mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/nvme[12]n1p1

mkfs.ext4 /dev/md2

e2label /dev/md2 nvme-250gb

我使用以下命令在主机上挂载/卸载此设备,并且无意为其创建 fstab 条目。

sudo mount /dev/disk/by-label/nvme-250gb /media/nvme-250gb-raid

sudo umount /media/nvme-250gb-raid

挂载的分区可以正常使用。

该分区的目的是在 KVM 内部使用它来存储数据,操作系统不会在其上运行。

但我还想在虚拟机关闭时通过主机对其进行一些管理,例如创建备份或将大文件复制到其上。我无意在虚拟机运行时将其安装在主机上。

至于VM,我将这个分区添加到其中作为附加存储设备。我使用了虚拟机管理器中的“添加硬件”选项。该硬件的 XML 文件如下:

<disk type="block" device="disk">
  <driver name="qemu" type="raw" cache="none" io="native"/>
  <source dev="/dev/disk/by-label/nvme-250gb" index="2"/>
  <backingStore/>
  <target dev="vdb" bus="virtio"/>
  <alias name="virtio-disk1"/>
  <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
</disk>

在虚拟机内部,我安装/卸载该设备的方式与在主机上安装它的方式相同:

sudo mount /dev/disk/by-label/nvme-250gb /media/nvme-250gb-raid

sudo umount /media/nvme-250gb-raid

为了完成其中的 KVM 部分,我使用了此答案中提供的信息为KVM虚拟机添加物理磁盘

答案指出

当心不是在您的来宾中使用的物理驱动器中安装任何卷,否则您将严重损坏其文件系统!

我想对此进行测试,看看这种损坏是什么样子,因此我将其安装在主机和虚拟机中,并开始使用touch.

通常这会起作用,但我发现它们不同步。即使发布了sync对来宾所做的更改在主机上也不可见,反之亦然,而且,我认为偶尔它确实有效,但也许我只是感到困惑。

在任何情况下,当从来宾和/或主机写入时,然后卸载(如果在主机上)并发出

sudo fsck.ext4 -f /dev/disk/by-label/nvme-250gb

在主机上,它产生了

$ sudo fsck.ext4 -f /dev/disk/by-label/nvme-250gb
2fsck 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
Free blocks count wrong (59780755, counted=59780756).
Fix<y>? yes
Free inodes count wrong (15253502, counted=15261679).
Fix<y>? yes

nvme-250gb: ***** FILE SYSTEM WAS MODIFIED *****
nvme-250gb: 17/15261696 files (0.0% non-contiguous), 1235564/61016320 blocks

当修复它们并从虚拟机卸载设备并fsck在那里执行操作时,没有显示任何错误,因为主机已经修复了它们。如果我跳过修复,我可以在主机和虚拟机上的同一位置看到它们。

我想知道的是这里可​​能发生了什么样的损害。虚拟机是否会覆盖主机写入的数据,反之亦然,或者这只是一个fsck可以通过修复一些索引节点内容来解决的问题(我对此不太了解),然后只有文件丢失。

正如我所说,我无意将其同时安装在主机和虚拟机上。

但我确实需要知道,可以将其安装在主机或虚拟机上,并以 100% 的信心对其进行操作,在其上复制/创建文件不会因为我没有想到的事情而意外损坏某些东西的。

由于它是 RAID,我假设如果一个 SSD 损坏,另一块仍将保留数据,然后我可以更换损坏的 SSD 并重新同步阵列。当然,我会在虚拟机关闭时执行此操作。

但这引发了另一个(不相关的)问题:在 RAID 1 的背景下,如果 SSD 仅安装在虚拟机中,主机是否会知道 SSD 有问题?如果这是一个问题,那么将其作为文件系统安装在虚拟机中是否更有意义?这会对性能产生什么影响?

答案1

每个安装了物理卷的系统都假定它知道并控制与该卷关联的所有元数据。如果您有两个系统彼此独立地更改元数据,则内存中的数据结构将不同步。文件系统可能损坏。一次在一个系统上安装卷是安全的。

RAID 1 意味着两个磁盘保持同步。如果您损坏了文件系统,则两个磁盘上都会有损坏的镜像。 RAID 1/5/6 为您提供硬件故障时的冗余,但不能防止其他问题。特别是,RAID不是备份。

答案2

Doneal24 是正确的。您不能同时在多个主机(或虚拟机)上安装相同(不可共享)的文件系统。如果您在两个系统上挂载读/写,则会发生 FS 损坏。如果您将其中一个安装为只读,而将所有其他安装为只读 - 那么只读系统将无法准确跟踪更改。这些“本地”文件系统从未设计用于同时安装多操作系统。

我想知道的是这里可​​能发生了什么样的损害。

几乎所有的事情——都不好。想象一下,你有一位称职的讲师坐在黑板上,黑板上被分成几个块或几个部分,一边写一边擦。当一位讲师独占黑板控制权时,一切都是连贯的。

现在想象一下,您有两位称职的讲师都使用相同的黑板,但没有任何相互通信,无法可靠地检测对方何时/是否写入或擦除或重新使用了一个块。一片混乱,董事会变得难以理解。讲师 A 正在展示一个供考虑的块,B 刚刚删除或覆盖了该块 - 这是胡言乱语。

更糟糕的是,所有现代文件系统都是基于有序的块列表。想象一下,讲师 A 写下(在黑板上的某个块中)依次阅读第 12、17、11 块中的化学讲义。而讲师B则写道,他的历史讲座应该从第16、22、11块开始阅读。我们可以肯定,第 11 块会让一半的学生(读者)感到困惑。

这个问题可以通过同步每个操作系统(讲师)来解决,但它成本高昂且访问速度慢。

相关内容