# qemu 各種アーキ環境構築 ###### tags: `環境構築` `ctf` `pwn` `qemu-system` # QEMU 最新化 - qemu-5.2.0以降,buildディレクトリ配下に作られるようになった - qemu-6.1.0以降ではninja-buildも必要 - qemu-7.2.0以降では`--enable-slirp`が必要 - https://stackoverflow.com/questions/75641274/network-backend-user-is-not-compiled-into-this-binary - 要`apt install libslirp-dev` - `--target-list=`を指定しないと全てビルドされる - `qemu-user`をビルドしたい場合は`${ARCH}-softmmu`を`${ARCH}-linux-user`にすれば良い ``` apt-get build-dep qemu ninja-build wget https://download.qemu.org/qemu-7.2.0.tar.xz tar xf qemu-7.2.0.tar.xz cd qemu-7.2.0 cp -r pc-bios /usr/local/bin VERSION="72" ARCH_LIST="x86_64 i386 arm aarch64 mips mipsel mips64 mips64el ppc ppc64 s390x sparc sparc64 riscv32 riscv64" for ARCH in $ARCH_LIST; do ./configure --target-list=${ARCH}-softmmu --enable-slirp && make -j cp build/${ARCH}-softmmu/qemu-system-${ARCH} /usr/local/bin/qemu${VERSION}-system-${ARCH} make clean done ``` ::: spoiler qemu-5.2.0より前の場合はこちら ``` apt-get build-dep qemu wget https://download.qemu.org/qemu-5.1.0.tar.xz tar xvJf qemu-5.1.0.tar.xz cd qemu-5.1.0 cp -r pc-bios /usr/local/bin VERSION="51" ARCH_LIST="x86_64 i386 arm aarch64 mips mipsel mips64 mips64el ppc ppc64 s390x sparc sparc64" for ARCH in $ARCH_LIST; do ./configure --target-list=${ARCH}-softmmu && make -j cp ${ARCH}-softmmu/qemu-system-${ARCH} /usr/local/bin/qemu${VERSION}-system-${ARCH} make clean done ``` ::: # QEMU(buildroot) x86_64 ``` tar xf buildroot-2020.08.tar.bz2 cd buildroot-2020.08/ make qemu_x86_64_defconfig make qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append "rootwait root=/dev/vda console=tty1 console=ttyS0" -net nic,model=virtio -net user -nographic -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait ``` 注意: - buildrootの各種デフォルトのビルドコンフィグは`configs/`にある. - `make qemu_x86_64_defconfig`すると,トップディレクトリの`.config`へコピーされてそちらが使われる. - linuxカーネルのビルドコンフィグは`board/qemu/*/linux.config`にある. - コンフィグを変更したい場合はこれをいじるか,別の場所へコピーしてトップディレクトリにあるbuildroot自体のビルドコンフィグ(`.config`)で以下を指定する. - `BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y` - `BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="/path/to/config"` - ARM(vexpress)の場合は`board/qemu/arm-vexpress/linux.config`にコンフィグが存在しないので,一度すべてビルドし,生成された`output/build/linux-XXX/.config`を別の場所にコピーした上で内容を修正し,`BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE`で指定するなどの手順が必要(だと思う).正しいやり方はよくわからない.`board/qemu/arm-vexpress-tz`の方を使えばよいのだろうか. - 起動コマンドは`board/qemu/*/readme.txt`に書かれている.`-nographic`をつける,`-serial`を消すなど適宜修正すること. その他注意事項: ::: spoiler QemuのDLが遅すぎる場合 ビルドを中止して以下の通りミラーサイトに切り替え,再度makeすれば良い. ``` vi package/qemu/qemu.mk QEMU_SITE = http://download.qemu.org ↓ QEMU_SITE = https://mirror.koddos.net/blfs/conglomeration/qemu ``` ::: ::: spoiler カーネルを最新版に差し替えたい場合 個別にカーネルをビルドして,`bzImage`を差し替えて起動すれば良い. ``` cd /export/kernel git clone https://github.com/torvalds/linux.git cd linux/ make defconfig make ※ここでクロスコンパイルする場合、 i386の場合: make defconfig && make ARCH=i386 とする AArch64の場合: make ARCH=arm64 defconfig && make ARCH=arm64 CROSS_COMPILE="aarch64-linux-gnu-" とする ARMの場合: make ARCH=arm defconfig && make ARCH=arm CROSS_COMPILE="arm-linux-gnueabihf-" とする qemu-system-x86_64 -M pc -kernel /export/kernel/linux/arch/x86_64/boot/bzImage -drive file=/export/kernel/buildroot-2020.08/output/images/rootfs.ext2,if=ide \ -append "root=/dev/sda console=ttyS0" -nographic -netdev tap,id=tap0 -device e1000,netdev=tap0 -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait 注意1: カーネルを新しくすると何故かeth0を認識しなくなったので,qemuのコマンド(-netdev tap,id=tap0 -device e1000,netdev=tap0)でtap0を作って付与すると良い. https://unix.stackexchange.com/questions/171874/no-network-interface-in-qemu 注意2: カーネルを新しくすると何故か/dev/vdaを認識しなくなったので,タイプをideにして/dev/sdaとして起動すると良い(virtio→/dev/vda,ide接続→/dev/sda,sdカード→/dev/mmcblk0という対応となる). ``` ::: ::: spoiler その他参考情報 - https://www.hiroom2.com/2014/01/17/qemu-system-i386%E5%90%91%E3%81%91%E3%81%ABbuildroot%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B/ - https://www.hiroom2.com/2016/05/27/centos-7-buildroot%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B/ - http://qiita.com/kairi199088/items/a2cd962f375cf875fe52 - https://gist.github.com/Ga-ryo/02dec70b62864caaabff1e92970e8401 ::: # QEMU(buildroot) x86 ``` tar xf buildroot-2020.08.tar.bz2 cd buildroot-2020.08/ make qemu_x86_defconfig make qemu-system-i386 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append "rootwait root=/dev/vda console=tty1 console=ttyS0" -net nic,model=virtio -net user -nographic -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait ``` # QEMU(buildroot) arm ``` tar xf buildroot-2020.08.tar.bz2 cd buildroot-2020.08/ make qemu_arm_vexpress_defconfig make qemu-system-arm -M vexpress-a9 -m 256 -kernel output/images/zImage -dtb output/images/vexpress-v2p-ca9.dtb -drive file=output/images/rootfs.ext2,if=sd,format=raw -append "console=ttyAMA0,115200 rootwait root=/dev/mmcblk0" -net nic,model=lan9118 -net user -nographic -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait ``` # QEMU(buildroot) aarch64 ``` tar xf buildroot-2020.08.tar.bz2 cd buildroot-2020.08/ make qemu_aarch64_virt_defconfig make qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -smp 1 -kernel output/images/Image -append "rootwait root=/dev/vda console=ttyAMA0" -netdev user,id=eth0 -device virtio-net-device,netdev=eth0 -drive file=output/images/rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -nographic -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait ``` # QEMU(buildroot) mipsel ``` tar xf buildroot-2021.02.2.tar.bz2 cd buildroot-2021.02.2/ make qemu_mips32r6el_malta_defconfig make qemu-system-mipsel -M malta -cpu mips32r6-generic -kernel output/images/vmlinux -drive file=output/images/rootfs.ext2,format=raw -append "rootwait root=/dev/hda" -net nic,model=pcnet -net user -nographic -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait ``` mips32r6elは,MIPS32のリリース6(リトルエンディアン)を意味する. 参考: https://sourceware.org/binutils/docs/as/MIPS-Options.html # QEMU(buildroot) mips ``` tar xf buildroot-2021.02.2.tar.bz2 cd buildroot-2021.02.2/ make qemu_mips32r6_malta_defconfig make qemu-system-mips -M malta -cpu mips32r6-generic -kernel output/images/vmlinux -drive file=output/images/rootfs.ext2,format=raw -append "rootwait root=/dev/hda" -net nic,model=pcnet -net user -nographic -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait ``` # QEMU(buildroot) mips64el ``` tar xf buildroot-2021.02.2.tar.bz2 cd buildroot-2021.02.2/ make qemu_mips64r6el_malta_defconfig make qemu-system-mips64el -M malta -cpu I6400 -kernel output/images/vmlinux -drive file=output/images/rootfs.ext2,format=raw -append "rootwait root=/dev/hda" -nographic -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait ``` # QEMU(buildroot) mips64 ``` tar xf buildroot-2021.02.2.tar.bz2 cd buildroot-2021.02.2/ make qemu_mips64r6_malta_defconfig make qemu-system-mips64 -M malta -cpu I6400 -kernel output/images/vmlinux -drive file=output/images/rootfs.ext2,format=raw -append "rootwait root=/dev/hda" -nographic -gdb tcp::1234 -monitor telnet:127.0.0.1:9999,server,nowait ``` # QEMU(Debian) aach64 参考: https://blahcat.github.io/2018/01/07/building-a-debian-stretch-qemu-image-for-aarch64/ コマンド中のdebianのバージョンは最新版へ適宜変更すること. またNICドライバにはe1000ではなくvirtio-net-deviceを使ったほうが安定する(qemuの起動コマンドで指定している). ``` $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-arm64/current/images/netboot/debian-installer/arm64/initrd.gz $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-arm64/current/images/netboot/debian-installer/arm64/linux $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-aarch64 -smp 2 -M virt -cpu cortex-a57 -m 1G \ -initrd initrd.gz \ -kernel linux -append "root=/dev/ram console=ttyAMA0" \ -global virtio-blk-device.scsi=off \ -device virtio-scsi-device,id=scsi \ -drive file=disk.qcow2,id=rootimg,cache=unsafe,if=none \ -device scsi-hd,drive=rootimg \ -netdev user,id=unet -device virtio-net-device,netdev=unet \ -net user \ -nographic 言語はC,その他はJapan(やJapaneseなど)を選択. ミラーのDL先は場合によっては上手く行かないケースが有るため注意する.ftp.riken.jpが安定して早くて良い. インストールには2時間位かかる grubのインストールエラーが出る場合があるが無視して先へ進んで良い 最後にrebootするタイミングがあるが,ここで別端末からpkill -9 qemuなどして強制終了させる $ apt install nbd-client && modprobe nbd max_part=8 && qemu-nbd --connect=/dev/nbd0 disk.qcow2 $ mkdir mnt && mount /dev/nbd0p1 mnt && cp mnt/initrd.img-*-arm64 mnt/vmlinuz-*-arm64 . && sync $ umount /dev/nbd0p1 && nbd-client -d /dev/nbd0 && rmdir mnt && rm -f initrd.gz linux 以下が起動コマンド $ qemu-system-aarch64 -smp 2 -M virt -cpu cortex-a57 -m 1G \ -initrd initrd.img-4.19.0-9-arm64 \ -kernel vmlinuz-4.19.0-9-arm64 \ -append "root=/dev/sda2 console=ttyAMA0" \ -global virtio-blk-device.scsi=off \ -device virtio-scsi-device,id=scsi \ -drive file=disk.qcow2,id=rootimg,cache=unsafe,if=none \ -device scsi-hd,drive=rootimg \ -device virtio-net-device,netdev=net0 \ -netdev user,hostfwd=tcp:127.0.0.1:2222-:22,id=net0 \ -nographic ``` ``` 以下はゲストVMへログイン後に実行 $ apt-get update && apt-get -y upgrade $ apt-get -y install busybox-static aptitude apt-file vim netcat socat zip unzip gcc g++ make automake autogen autoconf cmake curl git nkf expect strace binutils elfutils gdb python3-pip net-tools bashrc関連 $ cat > ~/.bashrc << 'EEEOF' PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' umask 022 export LS_OPTIONS='--color=auto' eval "`dircolors`" alias ls='ls $LS_OPTIONS' alias ll='ls $LS_OPTIONS -l' alias l='ls $LS_OPTIONS -lA' alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias gdb='gdb -q' alias py='python3' alias py3='python3' if [ -f /etc/bash_completion ] && ! shopt -oq posix; then . /etc/bash_completion fi ulimit -c unlimited stty stop undef stty start undef export LIBRARY_PATH=/usr/local/lib:/usr/lib export PAGER=less export LESS='-R -q -X -i -P ?f%f:(stdin). [Line\.?lb%lb?L/%L..] [?eEOF:?pb%pb\%..] [Page\.?db%db?D/%D..] (?s%s byte.)' export GREP_COLOR='1;37;41' cd EEEOF $ vi /etc/ssh/sshd_config ... PermitRootLogin yes ... $ systemctl restart sshd ARM(32bit)への対応(AArch64では32bitARMバイナリも動かすことができる) $ dpkg --add-architecture armhf $ apt-get update && apt-get -y upgrade $ apt-get -y install libc6:armhf libstdc++6:armhf ARM(32bit)バイナリをクロスビルドしたい場合 $ apt-get -y install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf ``` # QEMU(Debian) arm 細かいところがaarch64の導入コマンドとは結構違うので注意. ``` $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-armhf/current/images/netboot/initrd.gz $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-armhf/current/images/netboot/vmlinuz $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-arm -smp 2 -M virt -cpu cortex-a15 -m 1G \ -initrd initrd.gz \ -kernel vmlinuz -append "root=/dev/ram console=ttyAMA0" \ -global virtio-blk-device.scsi=off \ -device virtio-scsi-device,id=scsi \ -drive file=disk.qcow2,id=rootimg,cache=unsafe,if=none \ -device scsi-hd,drive=rootimg \ -netdev user,id=unet -device virtio-net-device,netdev=unet \ -net user \ -nographic 言語はC,その他はJapan(やJapaneseなど)を選択. ミラーのDL先は場合によっては上手く行かないケースが有るため注意する.ftp.riken.jpが安定して早くて良い. インストールには2時間位かかる grubのインストールエラーが出る場合があるが無視して先へ進んで良い 最後にrebootするタイミングがあるが,ここで別端末からpkill -9 qemuなどして強制終了させる $ apt install nbd-client && modprobe nbd max_part=8 && qemu-nbd --connect=/dev/nbd0 disk.qcow2 $ mkdir mnt && mount /dev/nbd0p1 mnt && cp mnt/initrd.img-*-armmp-lpae mnt/vmlinuz-*-armmp-lpae . && sync $ umount /dev/nbd0p1 && nbd-client -d /dev/nbd0 && rmdir mnt && rm -f initrd.gz vmlinuz 以下が起動コマンド $ qemu-system-arm -smp 2 -M virt -cpu cortex-a15 -m 1G \ -initrd initrd.img-4.19.0-9-armmp-lpae \ -kernel vmlinuz-4.19.0-9-armmp-lpae \ -append "root=/dev/sda2 console=ttyAMA0" \ -global virtio-blk-device.scsi=off \ -device virtio-scsi-device,id=scsi \ -drive file=disk.qcow2,id=rootimg,cache=unsafe,if=none \ -device scsi-hd,drive=rootimg \ -device virtio-net-device,netdev=net0 \ -netdev user,hostfwd=tcp:127.0.0.1:2223-:22,id=net0 \ -nographic ゲストVMへログイン後に実行するコマンド群は,aarch64編を参照のこと. ``` # QEMU(Debian) mipsel 参考: https://blahcat.github.io/2017/07/14/building-a-debian-stretch-qemu-image-for-mipsel/ ``` $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-mipsel/current/images/malta/netboot/initrd.gz $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-mipsel/current/images/malta/netboot/vmlinux-4.19.0-9-4kc-malta $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-mipsel -M malta -m 1G \ -hda ./disk.qcow2 \ -initrd ./initrd.gz \ -kernel ./vmlinux-4.19.0-9-4kc-malta -append "nokaslr" \ -nographic 言語はC,その他はJapan(やJapaneseなど)を選択. ミラーのDL先は場合によっては上手く行かないケースが有るため注意する.ftp.riken.jpが安定して早くて良い. インストールには2時間位かかる grubのインストールエラーが出る場合があるが無視して先へ進んで良い 最後にrebootするタイミングがあるが,ここで別端末からpkill -9 qemuなどして強制終了させる $ apt install nbd-client && modprobe nbd max_part=8 && qemu-nbd --connect=/dev/nbd0 disk.qcow2 $ mkdir mnt && mount /dev/nbd0p1 mnt && cp mnt/boot/initrd.img-*-malta . && sync $ umount /dev/nbd0p1 && nbd-client -d /dev/nbd0 && rmdir mnt && rm -f initrd.gz 以下が起動コマンド $ qemu-system-mipsel -M malta -m 1G \ -hda ./disk.qcow2 \ -initrd ./initrd.img-4.19.0-9-4kc-malta \ -kernel ./vmlinux-4.19.0-9-4kc-malta -append "nokaslr root=/dev/sda1" \ -net nic,model=e1000 \ -net user,hostfwd=tcp:127.0.0.1:2224-:22,id=net0 \ -nographic ゲストVMへログイン後に以下実行 $ cat > /etc/network/interfaces << EOF auto lo auto enp0s18 iface lo inet loopback iface enp0s18 inet dhcp EOF $ systemctl restart networking その他のコマンド群は,aarch64編を参照のこと. ``` # QEMU(Debian) mips ``` $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-mips/current/images/malta/netboot/initrd.gz $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-mips/current/images/malta/netboot/vmlinux-4.19.0-9-4kc-malta $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-mips -M malta -m 1G \ -hda ./disk.qcow2 \ -initrd ./initrd.gz \ -kernel ./vmlinux-4.19.0-9-4kc-malta -append "nokaslr" \ -nographic 言語はC,その他はJapan(やJapaneseなど)を選択. ミラーのDL先は場合によっては上手く行かないケースが有るため注意する.ftp.riken.jpが安定して早くて良い. インストールには2時間位かかる grubのインストールエラーが出る場合があるが無視して先へ進んで良い 最後にrebootするタイミングがあるが,ここで別端末からpkill -9 qemuなどして強制終了させる $ apt install nbd-client && modprobe nbd max_part=8 && qemu-nbd --connect=/dev/nbd0 disk.qcow2 $ mkdir mnt && mount /dev/nbd0p1 mnt && cp mnt/boot/initrd.img-*-malta . && sync $ umount /dev/nbd0p1 && nbd-client -d /dev/nbd0 && rmdir mnt && rm -f initrd.gz 以下が起動コマンド $ qemu-system-mips -M malta -m 1G \ -hda ./disk.qcow2 \ -initrd ./initrd.img-4.19.0-9-4kc-malta \ -kernel ./vmlinux-4.19.0-9-4kc-malta -append "nokaslr root=/dev/sda1" \ -net nic,model=e1000 \ -net user,hostfwd=tcp:127.0.0.1:2225-:22,id=net0 \ -nographic ゲストVMへログイン後に以下実行 $ cat > /etc/network/interfaces << EOF auto lo auto enp0s18 iface lo inet loopback iface enp0s18 inet dhcp EOF $ systemctl restart networking その他のコマンド群は,aarch64編を参照のこと. ``` # QEMU(Debian) mips64el ``` $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-mips64el/current/images/malta/netboot/initrd.gz $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-mips64el/current/images/malta/netboot/vmlinux-4.19.0-9-5kc-malta $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-mips64el -M malta -cpu MIPS64R2-generic -m 1G \ -hda ./disk.qcow2 \ -initrd ./initrd.gz \ -kernel ./vmlinux-4.19.0-9-5kc-malta -append "nokaslr" \ -nographic 言語はC,その他はJapan(やJapaneseなど)を選択. ミラーのDL先は場合によっては上手く行かないケースが有るため注意する.ftp.riken.jpが安定して早くて良い. インストールには2時間位かかる grubのインストールエラーが出る場合があるが無視して先へ進んで良い 最後にrebootするタイミングがあるが,ここで別端末からpkill -9 qemuなどして強制終了させる $ apt install nbd-client && modprobe nbd max_part=8 && qemu-nbd --connect=/dev/nbd0 disk.qcow2 $ mkdir mnt && mount /dev/nbd0p1 mnt && cp mnt/boot/initrd.img-*-malta . && sync $ umount /dev/nbd0p1 && nbd-client -d /dev/nbd0 && rmdir mnt && rm -f initrd.gz 以下が起動コマンド $ qemu-system-mips64el -M malta -cpu MIPS64R2-generic -m 1G \ -hda ./disk.qcow2 \ -initrd ./initrd.img-4.19.0-9-5kc-malta \ -kernel ./vmlinux-4.19.0-9-5kc-malta -append "nokaslr root=/dev/sda1" \ -net nic,model=e1000 \ -net user,hostfwd=tcp:127.0.0.1:2226-:22,id=net0 \ -nographic ゲストVMへログイン後に以下実行 $ cat > /etc/network/interfaces << EOF auto lo auto enp0s18 iface lo inet loopback iface enp0s18 inet dhcp EOF $ systemctl restart networking その他のコマンド群は,aarch64編を参照のこと. ``` # QEMU(Debian) ppc64el ``` $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-ppc64el/current/images/netboot/debian-installer/ppc64el/initrd.gz $ wget http://ftp.debian.org/debian/dists/Debian10.4/main/installer-ppc64el/current/images/netboot/debian-installer/ppc64el/vmlinux $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-ppc64 -M pseries-2.12 -cpu power9 -smp 2 -m 2G \ -hda disk.qcow2 \ -initrd ./initrd.gz \ -kernel ./vmlinux -append "nokaslr" \ -net nic,macaddr=52:54:00:fa:ce:12,model=virtio -net user \ -nographic -nodefaults -serial stdio 言語はC,その他はJapan(やJapaneseなど)を選択. ミラーのDL先は場合によっては上手く行かないケースが有るため注意する.ftp.riken.jpが安定して早くて良い. インストールには2時間位かかる grubのインストールエラーが出る場合があるが無視して先へ進んで良い 最後にrebootするタイミングがあるが,ここで別端末からpkill -9 qemuなどして強制終了させる disk.qcow2をマウントしようとしてもwrong fs typeと言われてマウントできないため, disk.qcow2を7-zipのファイルマネージャで開き,以下2つを取り出す 1.img/boot/initrd.img-4.19.0-9-powerpc64le 1.img/boot/vmlinux-4.19.0-9-powerpc64le $ rm -f initrd.gz vmlinux # インストール時に利用したinitrd.gz, vmlinuxは削除して良い 以下が起動コマンド $ qemu-system-ppc64 -M pseries-2.12 -cpu power9 -smp 2 -m 2G \ -hda disk.qcow2 \ -initrd ./initrd.img-4.19.0-9-powerpc64le \ -kernel ./vmlinux-4.19.0-9-powerpc64le -append "nokaslr root=/dev/sda2" \ -net nic,macaddr=52:54:00:fa:ce:12,model=virtio \ -net user,hostfwd=tcp:127.0.0.1:2227-:22,id=net0 \ -nographic -nodefaults -serial stdio ゲストVMへログイン後に実行するコマンド群は,aarch64編を参照のこと. ``` # QEMU(Debian) sparc64 参考: https://wiki.debian.org/Sparc64Qemu ``` $ wget http://cdimage.debian.org/cdimage/ports/9.0/sparc64/iso-cd/debian-9.0-sparc64-NETINST-1.iso $ qemu-img create -f qcow2 disk.qcow2 20G ※9.0より後のバージョンはうまくインストールできない $ qemu-system-sparc64 -m 2G -hda disk.qcow2 -cdrom debian-9.0-sparc64-NETINST-1.iso -boot once=d -serial stdio -nographic -nodefaults Enterを押すとCDからブート開始,言語はC,その他はJapan(やJapaneseなど)を選択. NICがないと言われるが意図通りなので"no ethernet card"を選択して先へ進む. 別CD/DVDをスキャンするか聞かれたらNoを選択して先へ進む. ミラーを入力する場面は"Go Back"を押し,ネットワークからのインストールをスキップして先へ進む. インストールには2時間位かかる grubのインストールエラーが出る場合があるが無視して先へ進んで良い 最後にrebootするタイミングがあるが,ここで別端末からpkill -9 qemuなどして強制終了させる 以下が起動コマンド $ qemu-system-sparc64 -machine sun4u,accel=tcg,usb=off -m 2G \ -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 \ -uuid ccd8b5c2-b8e4-4d5e-af19-9322cd8e55bf -rtc base=utc -no-reboot -no-shutdown \ -boot strict=on \ -drive file=disk.qcow2,if=none,id=hd,format=qcow2,cache=none,aio=native \ -device ide-hd,bus=ide.0,unit=0,drive=hd \ -net nic,model=e1000 -net user,hostfwd=tcp:127.0.0.1:2228-:22,id=net0 \ -msg timestamp=on -serial mon:stdio -nographic -nodefaults ゲストVMへログイン後に以下実行 # NW自動起動 $ cat > /etc/network/interfaces << EOF auto lo auto enp2s0 iface lo inet loopback iface enp2s0 inet dhcp EOF $ systemctl restart networking # ブラックリストモジュール追加 $ cat > /etc/modprobe.d/drm-blacklist.conf << EOF # blacklist of DRM modules that do not load on qemu-system-sparc64 sun4u blacklist drm blacklist bochs-drm blacklist ttm EOF # apt用のリポジトリと鍵がないので追加 $ echo 'deb http://ftp.ports.debian.org/debian-ports/ unstable main' > /etc/apt/sources.list $ busybox wget http://ftp.ports.debian.org/debian-ports/pool/main/d/debian-ports-archive-keyring/debian-ports-archive-keyring_2019.11.05_all.deb $ dpkg -i debian-ports-archive-keyring_2019.11.05_all.deb && rm debian-ports-archive-keyring_2019.11.05_all.deb # apt時に並列ディスク書込が発生しI/Oエラーが頻発するため,aptのcacheをtmpfsに保存する(苦肉の策.もちろん再起動すると消えるが所詮キャッシュなので…) $ mv /var/cache/apt/archives/* /tmp $ rmdir /var/cache/apt/archives $ ln -s /tmp /var/cache/apt/archives $ apt install openssh-server その他のコマンド群は,aarch64編を参照のこと. ``` # QEMU(Debian) s390x ``` $ wget https://cdimage.debian.org/pub/debian/dists/stretch/main/installer-s390x/current/images/generic/kernel.debian $ wget https://cdimage.debian.org/pub/debian/dists/stretch/main/installer-s390x/current/images/generic/initrd.debian $ qemu-img create -f qcow2 disk.qcow2 20G $ git clone https://github.com/qemu/qemu.git $ cd qemu/ && ./configure --target-list=s390x-softmmu && make $ make install $ qemu-system-s390x -M s390-ccw-virtio -m 2G \ -kernel kernel.debian \ -initrd initrd.debian \ -drive file=disk.qcow2,if=none,format=qcow2,id=hd0 \ -device virtio-blk-ccw,drive=hd0,id=virtio-disk0 \ -net nic,macaddr=52:54:00:fa:ce:18,model=virtio -net user \ -nographic 最初にNICとIPを聞かれるので,モデルはvirtio, IPは10.0.2.15, デフォゲは10.0.2.2, DNSは10.0.2.3とする. 言語はC,その他はJapan(やJapaneseなど)を選択. ミラーのDL先は場合によっては上手く行かないケースが有るため注意する.ftp.riken.jpが安定して早くて良い. インストールには2時間位かかる grubのインストールエラーが出る場合があるが無視して先へ進んで良い 最後にrebootするタイミングがあるが,ここで別端末からpkill -9 qemuなどして強制終了させる $ apt install nbd-client && modprobe nbd max_part=8 && qemu-nbd --connect=/dev/nbd0 disk.qcow2 $ mkdir mnt && mount /dev/nbd0p1 mnt && cp mnt/boot/initrd.img mnt/boot/vmlinuz . && sync $ umount /dev/nbd0p1 && nbd-client -d /dev/nbd0 && rmdir mnt && rm -f initrd.gz 以下が起動コマンド $ qemu-system-s390x -M s390-ccw-virtio -m 2G \ -kernel vmlinuz -append "root=/dev/vda1" \ -initrd initrd.img \ -drive file=disk.qcow2,if=none,format=qcow2,id=hd0 \ -device virtio-blk-ccw,drive=hd0,id=virtio-disk0 \ -net nic,macaddr=52:54:00:fa:ce:18,model=virtio -net user,hostfwd=tcp:127.0.0.1:2230-:22,id=net0 \ -nographic ゲストVMへログイン後に実行するコマンド群は,aarch64編を参照のこと. ``` # QEMU(Debian) x86_64 ``` $ wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.6.0-amd64-netinst.iso $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-x86_64 -enable-kvm -m 2G -hda disk.qcow2 -net nic,model=virtio -net user -cdrom debian-10.6.0-amd64-netinst.iso -boot d ※何故か-nographic -serial mon:stdioをつけても画面に吐かれず上手く行かなかったので,それらのオプションなしで起動し,GUI有りの環境でセットアップした. disk.qcow2を7-zipのファイルマネージャで開き,以下2つを取り出す 0.img/boot/initrd.img-4.19.0-11-amd64 0.img/boot/vmlinuz-4.19.0-11-amd64 起動コマンド $ qemu-system-x86_64 -enable-kvm -m 2G -hda disk.qcow2 -kernel vmlinuz-4.19.0-11-amd64 -append 'root=/dev/sda1 console=ttyS0' -initrd initrd.img-4.19.0-11-amd64 -net nic,model=virtio -net user,hostfwd=tcp:127.0.0.1:2231-:22 -nographic -serial mon:stdio ゲストVMへログイン後に実行するコマンド群は,aarch64編を参照のこと. ``` # QEMU(Debian) x86 ``` $ wget https://cdimage.debian.org/debian-cd/current/i386/iso-cd/debian-10.6.0-i386-netinst.iso $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-i386 -enable-kvm -m 2G -hda disk.qcow2 -net nic,model=virtio -net user -cdrom debian-10.6.0-i386-netinst.iso -boot d ※何故か-nographic -serial mon:stdioをつけても画面に吐かれず上手く行かなかったので,それらのオプションなしで起動し,GUI有りの環境でセットアップした. disk.qcow2を7-zipのファイルマネージャで開き,以下2つを取り出す 0.img/boot/initrd.img-4.19.0-12-686-pae 0.img/boot/vmlinuz-4.19.0-12-686-pae 起動コマンド $ qemu-system-i386 -enable-kvm -m 2G -hda disk.qcow2 -kernel vmlinuz-4.19.0-12-686-pae -append 'root=/dev/sda1 console=ttyS0' -initrd initrd.img-4.19.0-12-686-pae -net nic,model=virtio -net user,hostfwd=tcp:127.0.0.1:2232-:22 -nographic -serial mon:stdio ゲストVMへログイン後に実行するコマンド群は,aarch64編を参照のこと. ``` # QEMU(Ubuntu) x86_64 ``` $ qemu-img create -f qcow2 disk.qcow2 20G $ qemu-system-x86_64 -enable-kvm -m 2G -hda disk.qcow2 -net nic,model=virtio -net user -cdrom ubuntu-22.04.2-desktop-amd64.iso -boot d ※何故か-nographic -serial mon:stdioをつけても画面に吐かれず上手く行かなかったので,それらのオプションなしで起動し,GUI有りの環境でセットアップした. ※ubuntuのserver版は,インストールはできたが上手く起動できなかった. disk.qcow2を7-zipのファイルマネージャで開き,以下2つを取り出す 2.img/boot/initrd.img-5.15.0-69-generic 2.img/boot/vmlinuz-5.15.0-69-generic 起動コマンド $ qemu-system-x86_64 -enable-kvm -m 2G -hda disk.qcow2 -kernel vmlinuz-5.19.0-38-generic -append 'root=/dev/sda3 console=ttyS0' -initrd initrd.img-5.19.0-38-generic -net nic,model=virtio -net user,hostfwd=tcp:127.0.0.1:2233-:22 -nographic -serial mon:stdio ``` ``` 以下はゲストVMへログイン後に実行 $ sudo su # passwd # rootのパスワードを作成 # apt update && apt -y upgrade # apt -y install busybox-static aptitude apt-file vim netcat socat zip unzip gcc g++ make automake autogen autoconf cmake curl git nkf expect strace binutils elfutils gdb python3-pip net-tools openssh-server bashrc関連 # cat >> ~/.bashrc << 'EEEOF' umask 022 alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias gdb='gdb -q' alias py='python3' alias py3='python3' ulimit -c unlimited stty stop undef stty start undef export LIBRARY_PATH=/usr/local/lib:/usr/lib export PAGER=less export LESS='-R -q -X -i -P ?f%f:(stdin). [Line\.?lb%lb?L/%L..] [?eEOF:?pb%pb\%..] [Page\.?db%db?D/%D..] (?s%s byte.)' export GREP_COLOR='1;37;41' cd EEEOF # vi /etc/ssh/sshd_config ... PermitRootLogin yes ... # systemctl restart sshd x86(32bit)への対応 # dpkg --add-architecture i386 # apt update && apt -y upgrade # apt -y install libc6:i386 libstdc++6:i386 GUIを削除したい場合 # apt purge "xserver-*" "gnome*" ligthdm plymouth # apt autoremove --purge # rm -rf /etc/X11 ``` qcowを圧縮するにはqemuを終了してから以下を実施. ``` cp disk.qcow2 disk.qcow2.bk mv disk.qcow2 disk_old.qcow2 qemu-img convert -O qcow2 -c disk_old.qcow2 disk.qcow2 ``` # QEMU(FreeBSD) aarch64 ``` $ wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd インストール済みイメージが公式に存在する $ wget https://download.freebsd.org/ftp/releases/VM-IMAGES/12.1-RELEASE/aarch64/Latest/FreeBSD-12.1-RELEASE-arm64-aarch64.qcow2.xz $ xz -d FreeBSD-12.1-RELEASE-arm64-aarch64.qcow2.xz $ qemu-img resize FreeBSD-12.1-RELEASE-arm64-aarch64.qcow2 +20G 以下が起動コマンド $ qemu-system-aarch64 -M virt -cpu cortex-a57 -m 2G \ -drive file=FreeBSD-12.1-RELEASE-arm64-aarch64.qcow2,if=none,format=qcow2,id=hd0 \ -device virtio-blk-device,drive=hd0 \ -netdev user,hostfwd=tcp:127.0.0.1:2229-:22,id=net0 \ -device virtio-net-device,netdev=net0,mac=52:54:00:fa:de:16 \ -bios QEMU_EFI.fd \ -serial mon:stdio -monitor null \ -nographic ゲストVMへログイン後に以下実行 $ passwd # rootのパスワードを作成 $ echo 'proc /proc procfs rw 0 0' >> /etc/fstab $ echo sshd_enable="YES" >> /etc/rc.conf $ sed -i "" 's/#PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config $ service sshd start $ pkg install -y gdb socat python3 wget curl busybox vim zip unzip git binutils elfutils automake autoconf autogen ``` # その他 参考: https://gmplib.org/~tege/qemu.html