由淺入深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 並回車,就可以直接登錄虛擬機了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM