什么是CrosVM
CrosVM是Chrome操作系统中,用于创建虚拟机的应用。是一个Rust编写的轻量级的虚拟机。亚马逊的Firecracker从crosvm开始。借助于CrosVM 用户可以很容易的在ChromeOS中运行Linux、Android以及Windows应用程序。
CrosVM 的源码是Google ChromeOS的一部分,但也可以独立编译使用。哎,还是那句话“不要问为什么连接打不开”。还好github.com有好多CrosVM的镜像,有需要的可以上去找下。
本文,我们着重描述下如何在Ubuntu 19.10中使用CrosVM创建一个Linux 虚拟机。
环境准备
安装minijail
这个是CrosVM 打开feature ’sandbox‘时需要的,因为是默认打开的,这里就罗列一下。如果编译有问题,或者很费劲,可以在运行crosvm的时候加上’–disable-sandbox’ 参数即可。
1
|
apt install build-essential libcap-dev libfdt-dev pkg-config python cargo repo
|
或者,如有有cros_sdk的话,在~/trunk/src/aosp/external/minijail
目录中执行cargo build
同样可以编译得到库文件,然后可以复制到/usr/local/lib/下面就好。
编译安装CrosVM
1
|
mkdir crosvm
|
编译虚拟机的内核(Kernel)
1
|
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
|
这里是我自己配置的kernel config
下载并并且改名字为 .config
然后编译内核:
1
|
make olddefconfig
|
在内核根目录中生成的vmlinux就是需要的内核文件了(ELF 64-bit LSB executable)。
准备虚拟镜像
1
|
# 创建一个空的image,大小是20G
|
对镜像的一些修改:
1
|
sudo mount ubuntu19.10_rootfs.img rootfs/
|
建议尝试启动VM之前,在rootfs中安装udev 和 systemd, 似乎debootstrap创建的rootfs并没有自带这两个tool,需要自己安装下,否则启动的时候会遇到问题。
1
|
mount ubuntu19.10_rootfs.img rootfs/
|
注: 如果有同学玩过Qemu,那么可以直接使用Qemu支持的raw或者qcow2格式的虚拟机镜像。
创建虚拟机
1
|
sudo LD_LIBRARY_PATH=~/project/vm/minijail/ ./target/debug/crosvm run
|
或者,CrosVM同样支持带有initrd的内核,如果编译内核有困难或者比较“懒”的同学,可以直接把Ubuntu或者其他Linux发行版的内核拿来用下,启动时可能会有少许问题,但或许可以起来尝鲜一下虚拟机:
1
|
sudo LD_LIBRARY_PATH=~/project/vm/minijail/ ./target/debug/crosvm run
|
运气好的话,在创建VM的终端里面,应该可以看到Kernel启动的log,最后停在登录提示符。输入root 并回车,就可以直接登录虚拟机了。