1. 程式人生 > 實用技巧 >由淺入深CrosVM(一)—— 如何在Ubuntu中搭建CrosVM

由淺入深CrosVM(一)—— 如何在Ubuntu中搭建CrosVM

什麼是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
2
3
4
5
6
apt install build-essential libcap-dev libfdt-dev pkg-config python cargo repo
git clone https://android.googlesource.com/platform/external/minijail
cd minijail
make
cp libminijail.so libminijailpreload.so /usr/local/lib/
cp minijail0 /usr/local/bin

或者,如有有cros_sdk的話,在~/trunk/src/aosp/external/minijail目錄中執行cargo build同樣可以編譯得到庫檔案,然後可以複製到/usr/local/lib/下面就好。

編譯安裝CrosVM

1
2
3
4
5
6
7
8
9
10
mkdir crosvm
cd crosvm
repo init -g crosvm -u https://chromium.googlesource.com/chromiumos/manifest.git --repo-url=https://chromium.googlesource.com/external/repo.git
repo sync

cd src/platform/crosvm #sync下來的是整個ChromeOS project的目錄結構,需要進到crosvm目錄裡面編譯
cargo build

mkdir -p /usr/share/policy/crosvm/ #這裡面是CrosVM執行時的一些policy配置
cp -r seccomp/x86_64/* /usr/share/policy/crosvm/

編譯虛擬機器的核心(Kernel)

1
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

這裡是我自己配置的kernel config
下載並並且改名字為.config
然後編譯核心:

1
2
make olddefconfig
make -j8

在核心根目錄中生成的vmlinux就是需要的核心檔案了(ELF 64-bit LSB executable)。

準備虛擬映象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 建立一個空的image,大小是20G
dd if=/dev/zero of=ubuntu19.10_rootfs.img bs=1M count=20480
方法2:
qemu-img create -f raw ubuntu19.10_rootfs.img 20G

# 格式化
mkfs.ext4 ubuntu19.10_rootfs.img

mkdir rootfs/
sudo mount ubuntu19.10_rootfs.img rootfs/

# 下載Ubuntu 19.10檔案系統(eoan)
debootstrap --arch amd64 eoan rootfs/ http://archive.ubuntu.com/ubuntu

sudo umount rootfs/

對映象的一些修改:

1
2
3
4
5
6
sudo mount ubuntu19.10_rootfs.img rootfs/

# 去掉rootfs中的密碼:
vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
取掉 root: 後面的那個x

建議嘗試啟動VM之前,在rootfs中安裝udev 和 systemd, 似乎debootstrap建立的rootfs並沒有自帶這兩個tool,需要自己安裝下,否則啟動的時候會遇到問題。

1
2
3
4
5
6
mount ubuntu19.10_rootfs.img rootfs/
chroot rootfs

apt install udev systemd
exit
umount rootfs

注: 如果有同學玩過Qemu,那麼可以直接使用Qemu支援的raw或者qcow2格式的虛擬機器映象。

建立虛擬機器

1
2
3
4
sudo LD_LIBRARY_PATH=~/project/vm/minijail/ ./target/debug/crosvm run \
--rwroot ubuntu19.10_rootfs.img \
--seccomp-policy-dir=/usr/share/policy/crosvm/x86_64/ \
vmlinux

或者,CrosVM同樣支援帶有initrd的核心,如果編譯核心有困難或者比較“懶”的同學,可以直接把Ubuntu或者其他Linux發行版的核心拿來用下,啟動時可能會有少許問題,但或許可以起來嚐鮮一下虛擬機器:

1
2
3
4
5
sudo LD_LIBRARY_PATH=~/project/vm/minijail/ ./target/debug/crosvm run \
--rwroot ubuntu19.10_rootfs.img \
--seccomp-policy-dir=/usr/share/policy/crosvm/x86_64/ \
-i /boot/initrd.img-4.13.0-46-generic \
/boot/vmlinuz-4.13.0-46-generic

運氣好的話,在建立VM的終端裡面,應該可以看到Kernel啟動的log,最後停在登入提示符。輸入root 並回車,就可以直接登入虛擬機器了。