一,crovm简介
crosvm (The Chrome OS Virtual Machine Monitor) 是一个基于 Linux KVM 虚拟机监视器 (VMM),专注于轻量化、安全性和速度。crosvm 最初是为Chrome OS开发的,用于提供一个安全的虚拟化环境,但它也可以在其他Linux系统上运行。与 QEMU 相比,crosvm 不模拟架构或真实硬件,而是专注于半虚拟化设备,例如 virtio 标准。
本文主要介绍crosvm源码编译与基本运行,
1.1 运行环境:
> 操作系统:Windows 11 专业版
> 虚拟机(需要支持kvm):WSL2 Ubuntu-20.04
> 网络环境: 需要可以连接外网
二,crosvm源码下载与编译
2.1 源码下载
核心代码只有30MB+
$ git clone https://chromium.googlesource.com/crosvm/crosvm
$ cd crosvm
$ git submodule update --init
// 建议启用自动递归操作以保持子模块与主存储库同步
$ git config submodule.recurse true
$ git config push.recurseSubmodules no
// 安装依赖,如果遇到不支持模块,可以先注释掉。
$ ./tools/install-deps
2.2 编译
$ source ~/.cargo/env
## 简单编译,其它编译选项后续再介绍
$ cargo build
生成在 ./target/debug/crosvm, 然后就可以运行虚拟机了。
三,使用crosvm启动ubuntu20.04虚拟机
3.1 安装依赖
// 先确认是否支持kvm
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
$ sudo adduser $USER kvm
// 由于wsl2下无modules和vmlinuz,virt-builder构建ubuntu镜像会失败,可以用以下方法解决
$ sudo apt install linux-image-generic-hwe-20.04
$ sudo chmod 666 /boot/vmlinuz-5.15.0-67-generic
3.2 使用virt-builder构建ubuntu镜像
构建ubuntu 20.04镜像, 并支持tab网络和ssh连接
$ cd crosvm
$ sudo apt install libguestfs-tools
$ virt-builder ubuntu-20.04 --run-command "useradd -m -g sudo -p '' $USER ; chage -d 0 $USER" \
--hostname crosvm-test \
--copy-in "tools/examples/guest/01-netcfg.yaml:/etc/netplan/" \
--install openssh-server \
--ssh-inject "$USER:file:$HOME/.ssh/id_rsa.pub" \
-o ./rootfs
// 解压 Kernel 和 initrd
$ virt-builder --get-kernel ./rootfs -o .
3.3 创建tab网络
可以用以下命令或者tools/examples/setup_network脚本创建名字为crosvm_tap的tap网络
sudo ip tuntap add mode tap user "$USER" vnet_hdr crosvm_tap
sudo ip addr add 192.168.10.1/24 dev crosvm_tap
sudo ip link set crosvm_tap up
# ANCHOR_END: setup_tap
# ANCHOR: setup_routing
sudo sysctl net.ipv4.ip_forward=1
# Network interface used to connect to the internet.
HOST_DEV=$(ip route get 8.8.8.8 | awk -- '{printf $5}')
sudo iptables -t nat -A POSTROUTING -o "${HOST_DEV}" -j MASQUERADE
sudo iptables -A FORWARD -i "${HOST_DEV}" -o crosvm_tap -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i crosvm_tap -o "${HOST_DEV}" -j ACCEPT
3.4 启动ubuntu虚拟机
$ cargo run -- run \
--disable-sandbox \
--rwdisk ./rootfs \
--initrd ./initrd.img-* \
--tap-name crosvm_tap \
-p "root=/dev/vda5" \
./vmlinuz-*
warning: /home/huangqw/code/crosvm/Cargo.toml: file found to be present in multiple build targets: /home/huangqw/code/crosvm/src/main.rs
Finished dev [unoptimized + debuginfo] target(s) in 0.20s
Running `target/debug/crosvm run --disable-sandbox --rwdisk ./rootfs --initrd ./initrd.img-5.4.0-65-generic --tap-name crosvm_tap -p root=/dev/vda5 ./vmlinuz-5.4.0-65-generic`
syslog init failed: guess of fd for syslog connection was invalid
[2023-03-27T20:37:18.969515528+08:00 INFO crosvm] crosvm started.
[2023-03-27T20:37:18.972379208+08:00 INFO crosvm] CLI arguments parsed.
syslog init failed: guess of fd for syslog connection was invalid
[2023-03-27T20:37:18.980674123+08:00 INFO crosvm::crosvm::sys::unix::device_helpers] Trying to attach block device: ./rootfs
[2023-03-27T20:37:18.980940629+08:00 INFO disk] disk size 6442450944,
[2023-03-27T20:37:18.981008070+08:00 INFO disk] Disk image file is hosted on file system type ef53
[2023-03-27T20:37:19.093578544+08:00 INFO devices::sys::unix::acpi] Listening on acpi_mc_group of acpi_event family
[ 0.000000] Linux version 5.4.0-65-generic (buildd@lcy01-amd64-018) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021 (Ubuntu 5.4.0-65.73-generic 5.4.78)
[ 0.000000] Command line: panic=-1 acpi=noirq console=ttyS0 root=/dev/vda5
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] Hygon HygonGenuine
...
Ubuntu 20.04.1 LTS crosvm-test ttyS0
crosvm-test login:
// 成功启动后会进入命令终端,设置用户和密码后就可以正常使用了
3.5 通过ssh连接
ssh 192.168.10.2
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-65-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
New release '22.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Mon Mar 27 03:46:11 2023 from 192.168.10.1
$ uname -a
Linux crosvm-test 5.4.0-65-generic #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/issue
Ubuntu 20.04.1 LTS \n \l
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether a6:9b:df:3c:c5:2f brd ff:ff:ff:ff:ff:ff
inet 192.168.10.2/24 brd 192.168.10.255 scope global enp0s4
valid_lft forever preferred_lft forever
inet6 fe80::844a:1eff:fe71:894d/64 scope link
valid_lft forever preferred_lft forever
四,参考资料:
https://crosvm.dev/book/introduction.html
https://www.libguestfs.org/virt-builder.1.html
https://chromium.googlesource.com/chromiumos/platform/crosvm/+/HEAD/README.md