# 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