一気に凉しくなって、いきなり着るものに困っています。極端ですな。
昔から知っていましたが、よく思い返してみると触ったこともなかったので、QEMUをきちんと触ってみました。
そもそもQEMUとは
QEMU is a generic and open source machine emulator and virtualizer.
とあるように、emulatorとvirtualizer、つまり仮想化をするためのソフトウェアです。QEMU自体はとても昔から開発されており、Windows/macOSを含めてmulti platformで展開されています。
最初はCPU emulationのために作られた、という話があるため、古今東西のCPUを指定して仮想マシンを起動することができます。
最初の仮想マシン
なんらかの方法でqemuをインストールしたら、とりあえずcommandを実行してみましょう。
$ qemu-system-x86_64
起動すると、Windowと共に真っ黒な画面が表示されるはずです。QEMUはdefaultではSeaBIOSというOSSのBIOS実装を利用して起動するので、マザーボードに電源だけいれた、という状態ですね。これだけだと意味がないので、なんかisoを入れてみましょう。
$ qemu-system-x86_64 -cdrom ubuntu.iso
見おぼえのあるubuntuのinstallerが起動します。なんか適当に選んでみましょう。
起動してみると、起動した瞬間にkernel panicしているはずです。QEMUは、指定がないとmemory/CPUも設定されていない(!)ので、このままでは何もできません。このあたり、大体いい感じの設定がbattery includedされている最近の風潮とは一線を画しています。
CPUとmemoryの設定
CPUとmemoryがないとなにもできないので、追加してみましょう。
$ qemu-system-x86_64 -m size=4096 \
-smp 8 \
-cdron ubuntu.iso
-m
でmemoryの量を指定できます。基本的にMB単位での指定です。 -smp
で、仮想マシンで利用するCPUの数を指定できます。
networkの有効化
当然ですがNICなんてものは最初から入っているわけではないので、NICについても指定する必要があります。QEMUのnetworkにはuser mode networkというemulation modeがあり、大抵はこれで用が足ります。
# localhost:2222を22と接続する
$ qemu-system-x86_64 \
# network deviceを追加する
-device virtio-net-pci,netdev=unet \
# netdevでdeviceに対する設定を追加する
-netdev user,id=unet,hostfwd=tcp::2222-:22 \
-m 4096 \
-smp 10 \
-cdrom ubuntu.iso
hostfwd
を指定すると、port forwardingができるので、guestとSSHで繋いで~というのがお手軽にできます。設定しておくと捗りますよ。
ちなみにこの設定だけで、wgetとかcurlとかは大体動作します。ただ、pingは何もしない状態だと許可されていないので、必要ならsysfsで許可する必要があります。以下が参考になります。
https://www.qemu.org/docs/master/system/devices/net.html#using-the-user-mode-network-stack
storageを追加する
さて、いざインストール・・・というところで、storageがないぞ?となるかと思います。storageも当然ないので、作る必要があります。
qemuに同梱されている qemu-img
を利用することで、QCOW形式などQEMUで利用できるblock deviceを作製することができます。VirtualBoxなどを利用したことがある方は、 .qcow2
とかの拡張子を見たことがあると思いますが、あれになります。
$ qemu-img create <file path> <size>
# nixos.qcow2を10GiBのサイズで作る
# k/m/g でそれぞれ指定できる
# -fで指定しないとRAW formatで作られるので、指定された容量がそのまま割り当てられる
$ qemu-img create -f qcow2 nixos.qcow2 10g
# 利用するときは -hda などに渡すことで、block deviceとして利用できる。
$ qemu-system-x86_64 -hda ./nixos.qcow2
-hda
に渡すと、大抵は /dev/sda
として認識されますので、あとはpartedやfdiskで料理できます。
UEFIで起動する
さて、なにがしかをinstallしていると、最近のdistributionはUEFIでの起動が前提になっているケースが多いでしょう。そうなると、ここまでの設定だと動きません。UEFIはUEFIの設定が必要になります。
OVMFというOSSのUEFI実装があり、これが広く使われています。これを次のように利用します。
# UEFIの設定変更などはここに入るので、専用にcopyしておく
$ cp <path of ovmf/OFMV_VARS.fd .
# UEFIはbiosではないので、 -bios オプションは利用しなくてよい
$ qemu-system-x86_64 \
-drive if=pflash,format=raw,file=/usr/share/edk2-ovmf/OVMF_CODE.fd,readonly=on \
-drive if=pflash,format=raw,file=./OVMF_VARS.fd \
-enable-kvm \
...args
OVMF.fdだったりしますので、ファイル名やパスは、ご利用のdistributionを参照下さい。 OFMV_VARS
的なファイルは、 UEFIの設定変更 が入るため、基本的には個人毎にcopyしておくのが推奨です。
QEMUで使い捨ての自由なemulation環境を
QEMUはKVMなども利用することで、準仮想化をすることができます。NVMeとかのemulationもできたり、GPUの利用などもできます。使ったことのないsoftwareの素振りや、完全に分離された作業環境が必要なときなどにいかがでしょう。
ちなみに、CLIからやるのは一般的ではないので、大抵はvirt-managerとかから利用することになります(私は使ってないですが)。
さて、いきなりなんでこんな記事を書いたのかというと、次の記事へ繋げるため、という感じになります。