[Ubuntu 22.04.3 Server LTS] QEMU/KVM passthrough & ์ค์ฒฉ ๊ฐ์ํ
[ํ๋น๋ฏธ๋์ด]์ด๊ฒ์ด ์ฐ๋ถํฌ ๋ฆฌ๋ ์ค๋ค : ์ฐ๋ถํฌ ๋ฆฌ๋ ์ค ์ค์น๋ถํฐ ๋คํธ์ํฌ์ ์๋ฒ ๊ตฌ์ถ ์ด์๊น์ง
COUPANG
www.coupang.com
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ QEMU/KVM passthrough & ์ค์ฒฉ ๊ฐ์ํ
๐ฝ ๊ฐ์
๐ฆ ์๊ฐ
์ด๋ฒ์ ํด ๋ณผ ์์
์ ํ์ฌ ์ฌ์ฉ์ค์ธ ํธ์คํธ ์๋ฒ ์ฐ๋ถํฌ์ ๊ฐ์ํ ๊ธฐ๋ฅ์ ๊ฐ์ ๋จธ์ ์๋ ๋ถ์ฌํ๊ณ , ๊ทธ๋ํฝ ์นด๋๋ ์ฌ์ฉํ ์ ์๋๋ก ์์
ํด ๋ณด๋ ค๊ณ ํด์.
QEMU/KVM Passthrough๋ ํธ์คํธ ์์คํ
์ ํ๋์จ์ด ์์์ ๊ฐ์ ๋จธ์ ์ ์ง์ ํ ๋นํ๋ ๊ธฐ์ ์ด์์.
์ด๊ฒ์ ์ฃผ๋ก ๊ฐ์ ๋จธ์ ์์ ๊ฐ์ํ๋ ํ๋์จ์ด ๋์ ์ค์ ํ๋์จ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๊ณ ์์ด์.
์ฃผ๋์ ๊ฐ์ด ์ฃผ๋ก ๊ทธ๋ํฝ ์นด๋(GPU)์ ๋คํธ์ํฌ ์ด๋ํฐ, ์ค๋์ค, ๋ฏธ๋์ด ์ฅ์น ๋ฑ์ ๋ํ Passthrought๊ฐ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ด์.
์ฐธ๊ณ ๋ก Passthrough์ ์ฌ์ฉํ๋ฉด ํด๋น PCI ์ฅ์น๋ฅผ ์๋ฒ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๊ณ , ๊ฐ์ ๋จธ์ ์์ ์ด ์ฅ์น๋ฅผ ๋จ๋
์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด ์ฃผ๋ ๊ฒ์ด์์. (PCI ์ฅ์น๋ฅผ ๊ฐ์ํ ํธ์คํธ์ PIC ์ฅ์น๋ก ์ธ์ํ๊ณ , ๋จ๋
์ผ๋ก ์ฌ์ฉ.)
ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ ์ด ์ข์๊น์?
- ๊ณ ์ฑ๋ฅ ๊ทธ๋ํฝ ๊ฐ์ํ: ๊ฐ์ ๋จธ์ ์์ ๊ฒ์ ๋๋ ๊ทธ๋ํฝ ์ธํ
์๋ธํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์คํํ ๋, GPU Passthrough๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ์ฑ๋ฅ์ ์ป์ ์ ์์.
- ์ ๊ทผ์ฑ ๋ฐ ํธํ์ฑ: ํน์ ํ๋์จ์ด ์ฅ์น์ ๋๋ผ์ด๋ฒ ์ง์์ ํ์ฉํ๊ณ , ํธ์คํธ์ ๊ฐ์ ๋จธ์ ๊ฐ์ ๋์ ํธํ์ฑ ์ ๊ณต.
- ์ ๊ทผ ์ ์ด: ํน์ ๊ฐ์ ๋จธ์ ์๋ง ํน์ ํ๋์จ์ด๋ฅผ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ , ๋ณด์ ๊ฐํ.
- ํน๋ณํ ์ฌ์ฉ ์ฌ๋ก: ๊ฒ์ ๊ฐ์ํ, GPU ๊ฐ์ ๋จธ์ ๋ฌ๋, ๊ทธ๋ํฝ ๋์์ธ ์์
๋ฑ๊ณผ ๊ฐ์ ํน์ํ ์ฌ์ฉ ์ฌ๋ก์์ ์ ์ฉ.
๊ทธ๋ ๋ค๋ฉด ์ค์ฒฉ ๊ฐ์ํ(Nested Virtualizaion)์ ๋ฌด์์ผ๊น์?
์ค์ฒฉ ๊ฐ์ํ๋ ๊ฐ์ ๋จธ์ ๋ด๋ถ์์ ๋ ๋ค๋ฅธ ๊ฐ์ ๋จธ์ ์ ์คํํ๋ ๊ธฐ์ ์ ๋งํด์. ์ฆ, ๊ฐ์ ๋จธ์ ๋ด๋ถ์์ ๊ฐ์ํ ์๋ฃจ์
์ ์ฌ์ฉํ์ฌ ๋ ๋ค๋ฅธ ๊ฐ์ ๋จธ์ ์ ํธ์คํ
ํ๋ ๊ฒ์ ๋งํ๋ต๋๋ค. ์ด๊ฒ์ ๋ณดํต ๊ฐ์ ๋จธ์ ๋ด๋ถ์์ Hypervisor(ํ์ดํผ๋ฐ์ด์ )๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ณ ์์ด์.
๊ทธ๋ ๋ค๋ฉด ์ด๋ค ํน ์ฅ์ ์ ๊ฐ์ง๊ณ ์์๊น์?
- ํ
์คํธ ๋ฐ ๊ฐ๋ฐ ํ๊ฒฝ: ์ค์ฒฉ ๊ฐ์ํ๋ ๊ฐ์ ๋จธ์ ๊ฐ๋ฐ ๋ฐ ํ
์คํธ ํ๊ฒฝ์์ ์ ์ฉ. ๊ฐ์ ๋จธ์ ๋ด๋ถ์์ ๋ ๋ค๋ฅธ ๊ฐ์ ๋จธ์ ์ ์คํํ์ฌ ์ํํธ์จ์ด๋ฅผ ์์ ํ๊ฒ ํ
์คํธํ๊ณ , ๊ฐ๋ฐํ ์ ์์.
- ์๋ฒ ๊ฐ์ํ ํ
์คํธ: ์ค์ฒฉ ๊ฐ์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ ๊ฐ์ํ ํ๊ฒฝ์ ํ
์คํธํ๊ณ , ๋ค์ํ ๊ฐ์ ๋จธ์ ์ํฉ์ ์๋ฎฌ๋ ์ด์
ํ ์ ์์.
- ์์ ๊ฒฉ๋ฆฌ: ์ค์ฒฉ ๊ฐ์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ํ๊ฒฝ์ ๊ฒฉ๋ฆฌํ๊ณ , ๋
๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ.
๋ค๋ง, ์ฃผ์ํ ์ ์ ์ค์ฒฉ ๊ฐ์ํ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋์ ์ฑ๋ฅ์ ์๊ตฌํ์ง ์๊ณ , ํธ์คํธ ์์คํ
์ ํ๋์จ์ด ๋ฐ ํ์ดํผ๋ฐ์ด์ ์ ๋ฐ๋ผ ์ง์ ์ฌ๋ถ๊ฐ ๋ฌ๋ผ์ง ์ ์์ด์. ์ผ๋ถ ํ์ดํผ๋ฐ์ด์ ์ ํ๋์จ์ด ์กฐํฉ์์๋ ์ค์ฒฉ ๊ฐ์ํ๋ฅผ ์ฌ์ฉํ ์ ์์ ์๋ ์์ด์.
์ ๋ฆฌํ์๋ฉด QEMU/KVM Passthrough๋ ์ค์ ํ๋์จ์ด ์์์ ๊ฐ์ ๋จธ์ ์ ํ ๋นํ๋ ๊ธฐ์ ์ด๊ณ , ์ค์ฒฉ ๊ฐ์ํ๋ ๊ฐ์ ๋จธ์ ๋ด์์ ๋ ๋ค๋ฅธ ๊ฐ์ ๋จธ์ ์ ์คํํ๋ ๊ธฐ์ ์ด์์.
์ฃผ๋๋ ์ด๋ฅผ ํตํด ์ด ์ ์ ๋ง๋ค์๋ ์๋์ฐ 10์ ํด๋น ๊ธฐ์ ์ ํ ๋นํ๊ณ , ๋ธ๋ฃจ ์คํ (GPU ๋ฐ ๊ฐ์ํ ๊ธฐ๋ฅ ํ์)์ ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌ์ฑํด ๋ณด๋ ค๊ณ ํด์.
๐ฝ KVM - Passthrough
๐ฆ ๊ตฌ์ฑ
์ต์ด ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ BIOS ์ค์ ์์ VT-d (Intel) ํน์ AMD IOMMU (AMD) ๊ด๋ จ Option์ Enable(ํ์ฑ)ํด ์ฃผ์ด์ผ ํด์.
์ต์ด ์ฐ๋ถํฌ ํธ์คํธ ์๋ฒ์์ Kernel(์ปค๋) Boot(๋ถํธ) Parameter(ํ๋ผ๋ฏธํฐ)์ IOMMU๋ฅผ ํ์ฑํ ํ๋๋ก grub ์ค์ ํ์ผ์ ์์ ํ๋๋ก ํ ๊ฒ์.
๋จผ์ ์์ ๊ฐ์ด ์ค์ ํ์ผ์ ๋ฐฑ์
ํด ๋์์ด์.
์ ๋ช
๋ น์ด๋ฅผ ํตํด PCI ID๋ฅผ ํ์ธํด ์ค ์ ์์ด์.
์์์ PCI ID๋ 10de:24c9์ 10de:228b์์.
์ ์ค์ ํ์ผ์์ 10๋ฒ์งธ ์ค์ ์ ๋ด์ฃผ๋ ค๊ณ ํด์.
์ฃผ๋๋ Intel CPU์ด๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด ๋ณ๊ฒฝํด ์ฃผ์์ด์.
์ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์์ ํ /etc/default/grub ์ค์ ํ์ผ์ ์คํํ์ฌ ๋ฐ์ํด ์ฃผ์์ด์.
grub-mkconfig -o /boot/grub/grub.cfg
๋๋ ์์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์๋ ์์ด์.
sh -c 'echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf'
sh -c 'echo "blacklist nvidia_uvm" >> /etc/modprobe.d/blacklist.conf'
sh -c 'echo "blacklist nvidia_drm" >> /etc/modprobe.d/blacklist.conf'
sh -c 'echo "blacklist nvidia_modeset" >> /etc/modprobe.d/blacklist.conf'
sh -c 'echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf'
๊ทธ๋ฐ ๋ค ์ ๋ช
๋ น์ด๋ก ํธ์คํธ ์๋ฒ์์ nVidia Driver๋ฅผ Disable(๋นํ์ฑํ) ํด ์ฃผ์์ด์.
์ฐธ๊ณ ๋ก ์ด๋ ๊ฒ ํ๋ฉด ํธ์คํธ ์๋ฒ์์๋ ๊ทธ๋ํฝ ์นด๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ผ์.
์ฌ๊ธฐ๊น์ง ํ ๋ค ์๋ฒ ์ฌ๋ถํ ์ ์งํํด ์ฃผ์์ด์.
์ ๋ช
๋ น์ด๋ก PCI ์ฅ์น ์ค Passthrough ํ ์ฅ์น์ ID๋ฅผ ํ์ธํด ์ฃผ์ด์ผ ํด์.
์ฃผ๋๊ฐ Passthroughํ nVidia RTX 3060 Ti๋ ์์ ๊ฐ์ด PCI ID๊ฐ 10de:24c9(VGA)์ด๊ณ , 10de:228b(Audio) ์ธ ๊ฒ์ ํ์ธํ ์ ์์ด์.
options vfio-pci ids=10de:24c9,10de:228b
softdep nvidia pre: vfio-pci
๊ทธ๋ฐ ๋ค ์์ ๊ฐ์ด vfio.conf๋ฅผ ๋ง๋ค๊ณ , ์์ ๊ฐ์ด ๋ด์ฉ์ ์
๋ ฅํด ์ฃผ์์ด์.
(PCI ID๊ฐ ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ ์ฝค๋ง(,)๋ก ๊ตฌ๋ถํ์ฌ ์
๋ ฅ)
์ ๋ช
๋ น์ด๋ฅผ ํตํด initramfs ๊ฐฑ์ ์ ํด ์ฃผ์์ด์.
๋ง์ฝ ๋ถํ
์์ initramfs ๊ธฐ๋ฐ ๋ฐฐํฌํ์ด ์๋๊ฑฐ๋, ์ฐ๋ถํฌ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ๊ณผ์ ์ ๋ค์ ๋ค๋ฅผ ์ ์์ด์.
์ฌ๊ธฐ๊น์ง ๋์์ผ๋ฉด ์๋ฒ๋ฅผ ์ฌ๋ถํ
ํด ์ฃผ์ด์ผ ํด์.
์์ ๊ฐ์ด vfio์์ ๋๋ฐ์ด์ค๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒฝ์ฐ ์์ ํ์ง ์์ ๊ตฌ์ฑ/์ค๋จ์ ํ์ฉํด์ผ ํ ์ ์์ด์.
๐ฝ QEMU/KVM ๊ฐ์ ๋จธ์ ๊ด๋ฆฌ์
๐ฆ Use virtual machine GPU Config
์ด์ ๊ฐ์ ๋จธ์ ๊ด๋ฆฌ์๋ฅผ ํตํด ์ด ์ ์ ๋ง๋ ์๋์ฐ 10 ๊ฐ์ ๋จธ์ ์ GPU๋ฅผ ์ธ์ ์์ผ ๋ณผ๊ฒ์.
์ต์ด ๊ฐ์ ๋จธ์ ์ค์ ํ๋ฉด์์ ๋งจ ๋ฐ์ Add Hardware๋ฅผ ๋๋ฌ์ค๊ฑฐ์์.
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ด GPU ์ฅ์น๋ฅผ ์ฐพ์ ์ ํํ ๋ค Finish๋ฅผ ๋๋ฌ์ค๊ฒ์.
๊ทธ๋ผ ์์ ๊ฐ์ด PCI ์ฅ์น๊ฐ ์ถ๊ฐ ๋๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
๊ฐ์ ๋จธ์ ์ ์ผ๊ณ , ํ์ธํด ๋ณธ ๊ฒฐ๊ณผ ์์ ๊ฐ์ด ๊ทธ๋ํฝ ์นด๋๊ฐ ์ถ๊ฐ๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
๐ฝ KVM - Nested Virtualizaion
๐ฆ ๊ตฌ์ฑ
์ด๋ฒ์ ์ค์ฒฉ ๊ฐ์ํ์ ๋ํ ๊ตฌ์ฑ์ ํด๋ณผ๊ฒ์.
์ค์ฒฉ ๊ฐ์ํ๋ ํ๋์จ์ด ๊ฐ์ํ๋ฅผ ์ ๊ณตํ๋ ๋๋ถ๋ถ์ ์ต์ ํ๋ก์ธ์ ์ ํ๊ตฐ์์ ์ง์ํ๊ณ ์์ด์.
CPU ์ํคํ
์ฒ๊ฐ Intel์ธ์ง AMD์ธ์ง์ ๋ฐ๋ผ cat ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ํ์ดํผ๋ฐ์ด์ ์์ ์ค์ฒฉ์ด ์ด๋ฏธ ํ์ฑํ ๋์๋์ง ํ์ธํ ์ ์์ด์.
์ฃผ๋์ ์๋ฒ CPU๋ Intel ๊ณ์ด์ด๋ผ ์์ ๊ฐ์ด ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
๋ง์ฝ AMD ๊ณ์ด์ด๋ผ๋ฉด ์๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
cat /sys/module/kvm_amd/parameters/nested
์์ ๊ฐ์ด ๋ช
๋ น์ด ๊ฒฐ๊ณผ๋ Y ํน์ N์ผ๋ก ์ถ๋ ฅ๋๊ณ , Y๊ฐ ํ์๋๋ฉด ์ค๋น๊ฐ ๋์๋ค๋ ์๋ฏธ์ด๊ณ ,
์ด๋ฏธ ์ค์ฒฉ ๊ฐ์ํ ์ค๋น๊ฐ ๋๋ฌ๋ค๋ ๊ฑธ ์๋ฏธํด์.
ํ์ง๋ง, N์ด๋ผ๋ฉด KVM ์ปค๋ ๋ชจ๋์ ํตํด ์ค์ฒฉ ๊ฐ์ํ๋ฅผ ํ์ฑํํด ์ฃผ์ด์ผ ํด์.
์ค์ฒฉ๋ KVM ๊ฐ์ํ๋ฅผ ํ์ฑํํ๋ ๋ฐฉ๋ฒ
์ค์ฒฉ๋ KVM ๊ฐ์ํ๋ฅผ ํ์ฑํํ๋ ๋ฐฉ๋ฒ KVM์ Linux ์ปค๋์ ํตํฉ๋ ๊ฐ์ํ ๊ธฐ์ ์ ๋๋ค. KVM์ด ํ์ฑํ๋ ์์คํ ์ ํ๋ก์ธ์๊ฐ ์ง์ํ๋ ๊ฒฝ์ฐ ์ ํ 1 ํ์ดํผ๋ฐ์ด์ ์ญํ ์ ํ ์ ์์ต๋๋ค. KVM์ ์ฌ์ฉํ
ko.linux-console.net
์ค์ ๋ฐฉ๋ฒ์ ์ ๋ฐฉ๋ฒ์ ๋ฐ๋ผํด๋ณด๋ฉด ์ข์ ๊ฑฐ ๊ฐ์์.
๊ทธ๋ฐ ๋ค ๊ฐ์ ๋จธ์ ์์ฑ์ ์ ๋ด์ค์ผ ํ๋๋ฐ, 26๋ฒ์ฌ ์ค์ CPU ๋ผ๊ณ ๋์ด ์๋ Tag ๋ถ๋ถ์
์ฃผ๋์ฒ๋ผ host-passthrough์ด๋ผ๊ณ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํด์.
์ฐ๋ถํฌ ๋ฆฌ๋ ์ค : ์์คํ & ๋คํธ์ํฌ
COUPANG
www.coupang.com
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ง ์ฐธ๊ณ ์๋ฃ
GitHub - lateralblast/kvm-nvidia-passthrough: Nvidia GPGPU Pass-Through with KVM
Nvidia GPGPU Pass-Through with KVM. Contribute to lateralblast/kvm-nvidia-passthrough development by creating an account on GitHub.
github.com