我试图在多个系统之间节省一些磁盘空间并重新使用相同的交换分区(这似乎很好)。
我现在正在使用多个虚拟机,并正在考虑将文件系统传递到另一个驱动器以用作 Linux 交换区。
(我假设)可以将两个系统安装到同一个交换分区,但这会导致问题。由于应用程序已映射且不冲突,操作系统标识符是否也已映射或属于应用程序映射的一部分?
压力较大的场景是多个虚拟机正在运行(可能已暂停,因此不会同时主动运行)。
明确地说:
- 启动虚拟机1
- 暂停虚拟机 1
- 启动虚拟机2
两者共享相同的交换文件。没有冬眠如果看到过这个:FreeBSD 和 Linux 共享分区但答案表明这是未经证实的。我还需要知道它是否会因不同的操作系统/内核版本而崩溃。
答案1
我认为您会发现这样做是可能的,但可能不建议这样做。回顾 3 种虚拟化技术:
- 虚拟盒子
- 虚拟机软件
- 键盘虚拟机
在前两个(VirtualBox 和 VMWare)中似乎是可能的:
对于 KVM 来说这似乎也是可能的,但有一些注意事项。对于使用较新版本 RHEL 的人来说,一项新技术称为KSM - 内核同页合并已部署,允许跨 VM guest 共享相同页面,但它们“固定”在内存中并且无法换出。
系统无法交换 KSM 共享的内存页面,因为它们是固定的。
因此,如果虚拟机有自己的交换,并且这些来宾的页面之一需要由虚拟机交换,会发生什么就变得不清楚了。所以它会这样做,但物理内存不会被释放(这是我的猜测),因此现在浪费了虚拟机交换区中的磁盘,并且仍然继续使用物理 RAM。
此外,由于这个原因,让所有虚拟机使用相同的交换区似乎很危险:当交换区已满时会发生什么,所有虚拟机都面临风险,因为资源已基本耗尽。
由于 KVM 虚拟机是 Linux 进程,因此如果虚拟机空闲或使用率不高,虚拟机使用的内存可以放入交换区。可以在交换内存和物理 RAM 的总大小上提交内存。如果虚拟来宾使用其总 RAM,这可能会导致问题。如果没有足够的交换空间供虚拟机进程交换到 pdflush 进程,则清理进程将启动。 pdflush 杀死进程以释放内存,这样系统就不会崩溃。 pdflush 可能会破坏虚拟来宾或其他系统进程,从而导致文件系统错误并可能导致虚拟来宾无法启动。
KVM 交换出剖析
有一个KVM 网站上讨论 VM 如何配置内存的优秀文章以及它最终将如何利用交换。它是为 qemu-kvm v0.12 编写的,所以我不知道自该版本以来有多少变化。
上面页面摘录
换出路径
现在,假设主机面临内存压力。上面的页面已经通过了 Linux LRU,并发现自己位于非活动列表中。内核决定要返回该页面:
主机内核使用 rmap 结构来查找页面映射到哪个 VMA (vm_area_struct)。
主机内核查找与该 VMA 关联的 mm_struct,并沿着 Linux 页表查找该页的主机硬件页表条目 (pte_t)。
主机内核交换该页面并清除 pte_t(假设该页面仅在一个地方使用)。但是,在释放页面之前。
主机内核调用 mmu_notifier invalidate_page()。这会在 NPT/EPT 结构中查找页面条目并将其删除。
现在,对该页面的任何后续访问都将陷入主机(上面的故障路径中的(2))
所以上面想说的是,当客户虚拟机的内存页面需要被换出时,它是由主机完成的。但请注意,这是在整个主机耗尽其 RAM 时,而不是在来宾虚拟机耗尽 RAM 时。
你应该在 KVM 中使用交换吗?
我愿意,只要您了解,如果系统上有很多虚拟机,如果它们配置过多,它们可能都会访问磁盘,因此您将在磁盘上创建大量 I/O。看到这个ServerFault 问题以获取更多详细信息。
答案2
如果操作系统在具有一个共享交换分区的虚拟机中同时运行,则会造成严重破坏。
不要去那里,购买额外的磁盘。