我正在尝试在虚拟机中运行一个简单的单文件 C 程序。其实就是fork炸弹c程序:
#include <stdio.h>
#include <sys/types.h>
int main()
{
while(1)
{
fork();
}
return 0;
}
我想这样做是为了检查该虚拟机对系统上运行的其他虚拟机有多大影响。
我想知道在虚拟机中执行此操作的最简单方法是什么,并且如果可能的话,可以避免下载、编译和构建整个 Ubuntu/其他 Linux 虚拟机。我经常使用 Unikernels 来做这样的事情,但是我知道的大多数 Unikernels 都不支持 fork() 系统调用。
答案1
使用 qemu kvm,在无头虚拟机中启动主机内核,并使用串行控制台 I/O(重定向到运行它的终端):
将其编译
fork-bomb.c
为静态init
可执行文件:gcc -static -o init fork-bomb.c
在根目录下创建一个 initramfs
init
:bsdtar --format newc -cf initrd init
在其上启动虚拟机:
kvm -nographic \ -kernel "/boot/vmlinuz-$(uname -r)" \ -initrd initrd \ -append 'console=ttyS0 debug=9'
按Ctrl+a然后x终止虚拟机。
您可以添加一个-m 4G
以获得 4GiB 的 RAM(而不是默认的 128MiB),-smp 4
以获得 4 个 CPU(而不是 1 个)。请参阅man qemu-system-x86_64
自定义虚拟硬件的其他方法。Ctrl+ a,c获取 qemu 监视器控制台,您可以在其中热插拔更多组件或检查虚拟机的状态/配置、挂起、保存状态等。
在这里,我们启用最大 Linux 内核调试级别debug=9
;您可以在运行时通过发送 sysrq 后跟一个数字来更改它。当控制台处于串行状态时,sysrq 是通过发送“中断”来实现的,在这里您可以使用Ctrl+ a,来执行此操作b。