간단한 C 프로그램을 실행하는 가상 머신을 실행하는 가장 쉬운 방법은 무엇입니까

간단한 C 프로그램을 실행하는 가상 머신을 실행하는 가장 쉬운 방법은 무엇입니까

가상 머신에서 간단한 단일 파일 C 프로그램을 실행하려고 합니다. 사실, 이것은 포크 폭탄 C 프로그램입니다:

#include <stdio.h>
#include <sys/types.h>
 
int main()
{
    while(1)
    {
        fork();   
    }
    return 0;
}

이 가상 머신이 시스템에서 실행 중인 다른 가상 머신에 얼마나 많은 영향을 미치는지 확인하기 위해 이 작업을 수행하고 싶습니다.

가상 머신에서 이 작업을 수행하는 가장 쉬운 방법이 무엇인지 알고 싶습니다. 가능하다면 전체 Ubuntu/기타 Linux 가상 머신을 다운로드, 컴파일 및 빌드하지 마세요. 나는 이런 일을 위해 종종 유니커널을 사용하지만, 내가 아는 대부분의 유니커널은 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 44개의 CPU(1개가 아닌)를 얻을 수 있습니다. man qemu-system-x86_64가상 하드웨어를 사용자 정의하는 다른 방법을 알아보세요 . Ctrl+ a, c더 많은 구성 요소를 핫 플러그하거나 가상 머신의 상태/구성, 일시 중지, 저장 상태 등을 확인할 수 있는 qemu 모니터 콘솔을 가져옵니다.

여기서는 최대 Linux 커널 디버깅 수준을 활성화합니다 debug=9. sysrq 뒤에 숫자를 전송하여 런타임에 이를 변경할 수 있습니다. sysrq는 콘솔이 직렬 상태에 있을 때 "인터럽트"를 전송하여 구현됩니다. 여기서 Ctrl+를 사용하여 a이를 수행 할 수 있습니다 b.

관련 정보