qemu虚拟机使用

# 创建虚拟磁盘
qemu-img create -f raw vm.img 16G
# 扩容虚拟磁盘
qemu-img resize -f raw vm.img +20G


# 加载虚拟磁盘并启动
# 参数说明: https://www.zhaixue.cc/qemu/qemu-param.html
# 可以不加-nographic,加上无GUI显示
# -smp CPU的个数,不设置的话,默认是1
# -append cmdline 	设置Linux内核命令行、启动参数
# -net nic 	创建一个网卡
# -net nic -net tap 网卡和主机网卡建立桥接(Bridge), 需要TAP类型的网路适配器

# windows上面,使用openvpn创建的[TAP-Windows Adapter V9]虚拟网卡,命名为tap0,把tap0和外网(以太网)进行桥接即可,就可以使用: -net tap,ifname=tap0
# 下载地址: https://build.openvpn.net/downloads/releases/
# tap-windows-9.21.0.exe安装之后最后重启windows一下,启动虚拟机之后tap0就会连接,没启动之前就是拔出: 类型是TAP-Windows Adapter V9, 需要修改名字为tap0
qemu-system-x86_64 -m 1024 -boot d -smp 8,sockets=2,cores=4 -net nic -net tap,ifname=tap0 -net user -drive format=raw,file=vm.img -cdrom C:\Users\Administrator\Downloads\nixos-minimal-22.05.3900.26eb67abc9a-x86_64-linux.iso
# tap网卡是dhcp, 然后虚拟机配置相同网段,网关是tap的ip即可

# 启动磁盘镜像
qemu-system-x86_64 -enable-kvm -m 2048 -boot c -hda guix.qcow2
qemu-system-x86_64 -m 2048 -boot c -hda guix.qcow2


# 把22端口映射出来
qemu-system-x86_64 -m 1024 -boot d -net nic -net tap,ifname=tap0 -net user -netdev user,id=nde1,hostfwd=tcp::2222-:22 -drive format=raw,file=vm.img -cdrom C:\Users\Administrator\Downloads\nixos-minimal-22.05.3900.26eb67abc9a-x86_64-linux.iso

# 虚拟机里面设置ip的地址为主网络的20段
ip a
ifconfig -s ens3 static 192.168.20.128 255.255.255.0 192.168.20.1
# 或者
sudo ifconfig -s ens3 192.168.20.128 255.255.255.0 192.168.20.1

# 可以看到16g的sda
lsblk
  • 常见问题

# qemu-system-x86_64: -net tap: tap: no interface name
需要一个tab设备
# Device 'tap' could not be initialized
  • 使用qemu-user-static实现x86 chroot arm

# https://gist.github.com/gokart23/8ade2d431ead2de47340160301837cab

# qemu-user-static 软件包需要 Ubuntu 20.04 LTS (Focal Fossa) +
# wget http://mirrors.aliyun.com/ubuntu-releases/20.04/ubuntu-20.04.6-live-server-amd64.iso
# https://pkgs.org/search/?q=qemu-user-static
# 如果是docker运行, 需要 --privileged 特权模式
apt install qemu-user-static binfmt-support

# 使用普通用户进行操作: vi /etc/sudoers
wget https://mirrors.aliyun.com/alpine/v3.18/releases/aarch64/alpine-minirootfs-3.18.0-aarch64.tar.gz
tar xvf alpine-minirootfs-3.18.0-aarch64.tar.gz
# https://cdimage.ubuntu.com/releases/22.04/release/

# 查看格式是否启用
update-binfmts --display|grep qemu
update-binfmts --enable qemu-aarch64
ls /proc/sys/fs/binfmt_misc
# qemu-aarch64  register  status

# 复制兼容文件
cd /home/jcleng/work/chrootdir/
cp /usr/bin/qemu-aarch64-static ./usr/bin
# 无法联网把dns设置也复制过来
cat /etc/resolv.conf > ./etc/resolv.conf

# 进入chroot shell
sudo chroot . /bin/sh

uname -a
# Linux 587b2c13a64a 6.4.10 #1-NixOS SMP PREEMPT_DYNAMIC Fri Aug 11 10:14:29 UTC 2023 aarch64 Linux


# 执行单次命令
sudo chroot . /bin/su root /bin/sh -c ls
# 写成脚本
#!/usr/bin/bash
exec sudo chroot /home/jcleng/work/chrootdir/ /bin/su root /bin/sh -c "$@"
  • 使用docker运行arm

# https://github.com/qemus/qemu-arm/
docker run -itd --rm --name=armqemu \
-e "BOOT=https://mirrors.aliyun.com/alpine/v3.18/releases/aarch64/alpine-virt-3.18.3-aarch64.iso" \
-p 8006:8006 \
-p 5900:5900 \
-p 2222:22 \
--device=/dev/kvm \
--cap-add NET_ADMIN \
-e RAM_SIZE=4G \
-e CPU_CORES=4 \
-e DISK_SIZE=128G \
qemux/qemu-arm

# 访问, 进入安装界面
http://127.0.0.1:8006/
# 端口是虚拟机默认全部映射到qemudocker的
# 5900 是vnc的端口
# 2222 是ssh的端口
  • windows命令使用qemu-system

# 磁盘
"C:\Program Files\qemu\qemu-img.exe" create -f qcow2 disk-virt-alpine2.img 800g
# 安装
"C:\Program Files\qemu\qemu-system-x86_64.exe" -smp 1 -hda disk-virt-alpine2.img -cdrom alpine-virt-3.18.0-x86_64.iso -boot d -m 2048 -nographic
# 安装系统
setup-alpine
# 启动
"C:\Program Files\qemu\qemu-system-x86_64.exe" -smp 6 -hda disk-virt-alpine2.img -boot c -m 2048 -netdev user,id=nde1,hostfwd=tcp::1122-:22 -device e1000,netdev=nde1,id=d-net1 -nographic