用qemu在终端直接启动Linux虚拟机系统

陪她去流浪 桃子 阅读次数:30

经常用UTM在MacOS创建虚拟机Linux系统做一些相关测试,最近才发现UTM本身其实就是个QEMU的简单包装。所以,我直接把UTM创建好后的虚拟机命令(用ps命令拿到的)让Codex给我简化了一番,我现在可以非常简单快速的用命令创建、启动虚拟机了。

创建硬盘

创建的硬盘用于安装系统。使用如下命令:

1
2
$ qemu-img create -f qcow2 alpine.qcow2 1G
Formatting 'alpine.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=1073741824 lazy_refcounts=off refcount_bits=16

参数“alpine.qcow2”表示硬盘在当前文件系统的文件名,1G表示总大小1

可以把这个文件看作是一个类似Linux上的稀疏文件。刚创建好后可能非常小,后期写入后才会慢慢变大。

用ls/du可以看到真实大小,file命令可以分析文件结构并显示最终大小。

1
2
3
4
$ du -sh alpine.qcow2
208M	alpine.qcow2
$ file alpine.qcow2
alpine.qcow2: QEMU QCOW2 Image (v3), 1073741824 bytes

安装系统

安装系统的过程可以简单分成以下两个过程:

  1. 就是运行一个指定需求的虚拟机、挂载上硬盘、挂载上光碟💿️(系统ISO镜像)
  2. 把光碟上的系统安装到硬盘

我使用了如下的命令行(由Codex从UTM命令行精简得来):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ sudo qemu-system-aarch64 \
    -machine virt \
    -accel hvf \
    -cpu host \
    -smp 1  \
    -m 512 \
    -nographic \
    -serial mon:stdio \
    -drive if=pflash,format=raw,readonly=on,file=/opt/homebrew/share/qemu/edk2-aarch64-code.fd \
    -drive if=virtio,file=alpine.qcow2,format=qcow2 \
    -device virtio-net-pci,netdev=net0 \
    -netdev vmnet-bridged,id=net0,ifname=en0 \
    -cdrom alpine-virt-3.23.4-aarch64.iso

我简单描述一下上面各参数的含义:

  1. 使用ARM的Virt虚拟机方案,HyperVisor.framework框架,主机CPU;
  2. 1个CPU核心、512MB内存;
  3. 不进入图形系统(进入终端);
  4. 把串口和qemu管理命令/终端绑定到一起(默认是进入终端,按Ctrl-A + H可以查看qemu帮助);
  5. 挂载UEFI固件(就是上面那个edk2文件),路径可能与你自己安装的Homebrew相关,按需修改;
  6. 挂载指定路径的硬盘;
  7. 创建一张网卡;
  8. 创建一张网桥,并绑定前面的网卡和宿主机的桥接网卡(MacOS的Wi-Fi叫en0);
  9. 插入CD光碟,用于提供系统安装来源;

我使用的是Alpine的Virt版精简系统,ISO文件不足100MB,以下是系统安装过程:

  1. 运行上面的命令后,就会进入登录提示符,输入root(无密码)进入到Live系统(运行在RAM内);

  2. 运行setup-alpine就可以安装系统了。

  3. 主机名随意写,默认就好;

  4. 网络接口唯一可能用的就是上面创建的eth0

  5. 由于刚刚创建了网桥把虚拟机的eth0和宿主机的en0桥接起来,所以DHCP可以分配到和宿主同网段的IP地址;

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
     Interface
    -----------
    Available interfaces are: eth0.
    Enter '?' for help on bridges, bonding and vlans.
    Which one do you want to initialize? (or '?' or 'done') [eth0]
    Ip address for eth0? (or 'dhcp', 'none', '?') [dhcp]
    Do you want to do any manual network configuration? (y/n) [n]
    udhcpc: started, v1.37.0
    udhcpc: broadcasting discover
    udhcpc: broadcasting select for 192.168.10.231, server 192.168.10.1
    udhcpc: lease of 192.168.10.231 obtained from 192.168.10.1, lease time 43200
    
  6. 然后是设置root的密码;

  7. 时区设置。我在中国,先写Asia,再填Shanghai;

  8. 按需填写代理配置;

  9. 时间同步协议客户端(NTP)默认就好;

  10. 镜像源在国内填14(即“mirrors.ustc.edu.cn”)比较快;

  11. 无需设置独立用户;

  12. 使用OpenSSH作为SSH服务器;

  13. 是否允许root登录?填“yes”吧,可以允许密码登录,虚拟机无所谓安全了;

  14. 要使用哪块磁盘?直接填唯一的一块“vda”即可;

  15. 如何使用选中的磁盘?填“sys”即可。

  16. 擦除磁盘并继续?“y”。

  17. 然后就是安装过程,很快完成。

提示安装完成后,不要按提示执行“reboot”,而是“poweroff”。因为这时候光碟还在,重启后可能再次进入系统安装过程。

启动系统

“poweroff”后,去掉命令行的最后一个选项(及其参数)————光碟,即“-cdrom alpine-virt-3.23.4-aarch64.iso”。再次执行命令,这下进入的就是刚安装好的、最终的系统了。

以后也仅需重复执行上述命令即可开启系统。

退出系统

在终端里面按“Ctrl-c”只能取消运行命令,无法退出虚拟机。这时候需要先按qemu的前缀键“Ctrl-a”,再按“x”即可退出(按“h”可以看到全部的帮助)。

但是不建议这样“暴力”退出,建议执行“poweroff”安全关机,否则下次开机时会提示文件系统损坏(但是会修复成功)。


  1. 建议多分配一些,就我测试用的Alpine Linux精简版而言,100+分给了UEFI、200+分给了Swap,根文件系统只剩下了600+(但是对我来说够用了)。 ^