TL;DR

qemu-img create -f raw /path/to/myblock.raw 10G
qm set 102 --args '-drive format=raw,file=/path/to/myblock.raw,if=none,id=nvm -device nvme,drive=nvm,serial=deadbeef'

Detail

1. Image file 생성

  • NVMe 를 emulation 하기 위한 raw 포맷의 블럭이 하나 필요하다.
  • 해보니 대충 세가지 방법이 있는듯
  1. qemu-img 사용하기
qemu-img create -f raw /path/to/myblock.raw 10G
  1. dd 사용하기
    • 아래 명령어는 10GiB raw image 를 생성한다.
    • 기본 block 사이즈가 512byte 이므로 인 것.
dd if=/dev/zero of=/path/to/myblock.raw count=$(( 10 * 1024 * 1024 * 2 ))
  1. Proxmox UI 사용하기
    • GUI 로 해결할 수 있긴 하지만 좀 부자연스럽긴 하다.
    • VM -> Hardware -> Add (Hard Disk) 에서 Format 만 Raw disk image (raw) 로 설정해주고 생성한 뒤에
    • Detach 버튼 눌러서 Unused Disk 상태로 만든 뒤
    • 다음 명령어로 raw file path 만 찾아주면 된다.
find / -name '*.raw'

2. VM 에 NVMe device parameter 주입하기

  • 공식문서 에 parameter guide 를 참고해서 VM args 에 넣어주면 된다.
  • 가장 간단하게는 다음의 parameter 를 넣어주면 됨.
-drive format=raw,file=/path/to/myblock.raw,if=none,id=nvm
-device nvme,drive=nvm,serial=deadbeef
  • 근데 이걸 어떻게 이미 생성된 VM 에 넣어주느냐.
  • VM arg 에 추가하는 방법은 아래처럼 cli 로 하거나
qm set ${VMID} --args '-drive format=raw,file=/path/to/myblock.raw,if=none,id=nvm -device nvme,drive=nvm,serial=deadbeef'
  • VM 설정 파일을 직접 수정해 줘도 된다.
vim /etc/pve/qemu-server/${VMID}.conf
args: -drive format=raw,file=/path/to/myblock.raw,if=none,id=nvm -device nvme,drive=nvm,serial=deadbeef
...뭐 나머지 설정들...

Journal

  • 처음에 공식문서 를 봤을 때 parameter guide 만 나오고 어떤 명령어에 이것을 주입해주는지 설명이 (물론 어딘가에는 되어있었겠지만) 없어서 한참 찾아다녔다.
  • 결국에는 qemu-system-x86_64 명령어에 넣어주는 것이라는 것을 알았으나 이 명령어를 사용하면 새로 nvme device 를 emulate 해서 vnc server 를 열어주는 것이 아닌가.