在rock5b(armbian)上运行cuttlefish与redroid
2023-02-23 13:22:16

环境

设备 rock5b 16g + nvme
系统 armbian (需刷官网spi image)
内核 5.10.110-legacy-rockchip-rk3588

Cuttlefish与redroid对比

得益于rock5b搭载的arm架构cpu rk3588强大的性能,我们可以在这块板子上直接刷入android系统运行,亦可采用redroid或cuttlefish等方案容器化/虚拟化宿主机资源来提供android运行环境。

不过cuttlefish与redroid有什么异同点呢?这里总结一下

redroid cuttlefish
类型 基于docker的容器 基于 crosvm/qemu 的虚拟机
虚拟化 不需要 需要
内核 系统内核,需要开启ashmem,binder等。同时应用进程运行在系统内核中可以直接对其进行一些操作 独立android内核,运行在虚拟机中,内部进程对系统内核不可见
指令集翻译 可以添加libhoudini.so 未见支持理论可行
资源消耗 容器,内核部分共用节省资源 虚拟机,需要完整系统资源
AOSP 修改过 原装

redroid安装

由于redroid使用系统内核,需要开启一些android需要的内核功能。

这里可以参考官方安装步骤,由于我的rock5b安装的是armbian没有预构建模块,需要重新编译内核。

内核编译安装步骤

下载系统使用内核版本的源码

1
sudo apt install linux-source-5.10.110-legacy-rockchip-rk3588

安装完后在src目录下获得内核源码

1
2
3
4
/usr/src
├── linux-headers-5.10.110-rockchip-rk3588
├── linux-rockchip-rk3588-legacy_5.10.110_22.11.4_config.xz
└── linux-source-5.10.110-rockchip-rk3588.tar.xz

解压内核并覆盖配置(也可以 zcat /proc/config.gz > .config进行配置)

1
2
3
4
5
6
cd ~
mkdir kernel
cd kernel
tar -xf /usr/src/linux-source-5.10.110-rockchip-rk3588.tar.xz
tar -xf /usr/src/linux-rockchip-rk3588-legacy_5.10.110_22.11.4_config.xz
mv -v linux-rockchip-rk3588-legacy_5.10.110_22.11.4_config .config

使用mrproper进行清理并手动配置开启需要的内核功能

1
2
make mrproper
make menuconfig

进入 Device Drivers > Android 选中需要的特性(移动到位置空格选中)

image-20230223205940662

Device Drivers > Staging drivers > Android 开启ashmem

image-20230223210132207

选好之后切到save,保存完exit

构建并安装

1
make -j8

我们要替换内核,所以需要将我们编译的内核模块也进行安装,回到编译目录

1
sudo make modules_install

由于我们是直接编译的当前内核源码,所以使用sudo make install即可安装,下面的指令未更新initrd等数据,不建议使用,但提供在这方便手动调试等

手动替换文件安装内核(非必要不使用):

1
2
3
4
5
6
7
8
9
cp arch/arm64/boot/Image /boot/vmlinuz-5.10.110
chmod +x /boot/vmlinuz-5.10.110
cp .config /boot/config-5.10.110
cp System.map /boot/System.map-5.10.110
cd /boot
sudo mv Image Image.old
sudo ln -s vmlinuz-5.10.110 Image
sudo mv vmlinuz vmlinuz.old
sudo ln -s vmlinuz-5.10.110 vmlinuz

如果您是使用 make install进行安装的,请在重启前单独执行下面的命令(重要,未建立正确映射关系会导致内核无法启动,需要SD卡启动修复链接)

1
2
3
cd /boot
sudo mv Image Image.old
sudo ln -s vmlinuz-5.10.110 Image

docker安装

armbian按照官方介绍安装docker前执行

1
2
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

然后按照官方教程安装

1
2
3
4
5
6
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

运行redroid

1
2
3
4
5
docker run -itd --rm --privileged \
--pull always \
-v ~/data:/data \
-p 5555:5555 \
redroid/redroid:11.0.0-latest

由于这里使用的是armbian(ubuntu 22.04),会发现启动异常。查看日志lmkd反复退出android lmk服务异常。

SeeFlowerX大佬提示Ubuntu22.04使用cgroup v2,不满足redroid需求,需要开启cgroup v1

开启cgroup v1

在文件 /boot/armbianEnv.txt 中加入一行(插入内核cmdline systemd.unified_cgroup_hierarchy=0

1
extraargs=systemd.unified_cgroup_hierarchy=0

重启即可生效

连接

前面运行的时候暴漏了adb 5555端口,adb connect ip:5555即可,scrcpy可以操作亦可参照官方的使用其他方式查看视频流。

cuttlefish安装

1
2
3
sudo apt install -y git devscripts config-package-dev debhelper-compat golang curl
git clone https://github.com/google/android-cuttlefish
cd android-cuttlefish

下一步前因为网络环境问题建议做两件事

1.修改 frontend/src/goutil 中的goproxy地址

当然你也可以把他拿出if里面,go低于1.15不设置这个环境变量的话网络环境不好本身也直连不上。

image-20230226165051193

2.修改frontend/setup-nodejs-env.sh中nodejs下载地址

1
2
sudo vim frontend/setup-nodejs-env.sh
:%s/https:\/\/nodejs.org\/dist\//https:\/\/mirrors.tuna.tsinghua.edu.cn\/nodejs-release\/

构建deb

1
2
3
4
5
for dir in base frontend; do
cd $dir
debuild -i -us -uc -b -d
cd ..
done

安装deb

1
2
3
4
sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
sudo usermod -aG kvm,cvdnetwork,render $USER
sudo reboot

下载cuttlefish使用的镜像

ci.android.com 选择cf的的镜像跟工具下载

image-20230226181424429

1
2
3
4
mkdir cf
cd cf
tar -xvf cvd-host_package.tar.gz
unzip aosp_cf_arm64_phone-img-9657764.zip

别怪我把文件解压的乱七八糟,官方guide教的

启动

1
HOME=$PWD ./bin/launch_cvd --daemon

如果您启动时遇到Address family not supported by protocol

经排查是cuttlefish在绑定vsock时出错,参照文档发现其需要内核开启VSOCK,而guide在debian环境下,经查debian默认开启了该特性,所以我们需要在armbian的内核上开启VSOCK支持,开启过程参照内核编译安装步骤,需要开启的选项参照 https://github.com/radxa/kernel/commit/8f044dffd16fd667ff2272ee626e3ce0355c7eaa (感谢非虫大佬 https://zhuanlan.zhihu.com/p/609085533)

关闭

1
./bin/launch_cvd

GPU加速

暂不支持

由于Cuttlefish的arm host package使用bionic运行时,测试发现其在加载glibc编译的gl库时出现崩溃,目前并没有去探究崩溃的原因但由于这是一个兼容性问题,大可从三方面解决

  1. 编译bionic运行时下的gl库 (mesa)
  2. 修改aosp构建系统配置,构建arm glibc cvd host package
  3. 为具有gpu加速的android docker补充cvd需要的主机文件,使其在android docker内运行(测试可正常调用gl库,但缺少android-cuttlefish下安装的东西)

文档

请查看 https://source.android.com/docs/setup/create/cuttlefish?hl=zh-cn 或在cuttlefish代码页查看readme(内容一致,网页机翻可切英文)

内核无法启动排查与修复

我所使用的armbian boot分区结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
drwxr-xr-x  4 root root     4096 Feb 27 15:13 ./
drwxr-xr-x 19 root root 4096 Dec 9 18:50 ../
-rw-r--r-- 1 root root 253 Feb 27 15:13 armbianEnv.txt
-rw-r--r-- 1 root root 1536 Dec 9 19:03 armbian_first_run.txt.template
-rw-r--r-- 1 root root 38518 Dec 9 19:03 boot.bmp
-rw-r--r-- 1 root root 3180 Dec 9 18:50 boot.cmd
-rw-rw-r-- 1 root root 3252 Dec 9 19:05 boot.scr
-rw-r--r-- 1 root root 213137 Feb 27 15:11 config-5.10.110
-rw-r--r-- 1 root root 212174 Dec 8 23:14 config-5.10.110-rockchip-rk3588
lrwxrwxrwx 1 root root 28 Dec 9 18:52 dtb -> dtb-5.10.110-rockchip-rk3588/
drwxr-xr-x 3 root root 4096 Dec 9 18:52 dtb-5.10.110-rockchip-rk3588/
lrwxrwxrwx 1 root root 16 Feb 27 13:34 Image -> vmlinuz-5.10.110
lrwxrwxrwx 1 root root 19 Feb 26 22:35 initrd.img -> initrd.img-5.10.110
-rw-r--r-- 1 root root 15218451 Feb 27 15:11 initrd.img-5.10.110
-rw-r--r-- 1 root root 15257055 Feb 26 22:09 initrd.img-5.10.110-rockchip-rk3588
drwx------ 2 root root 16384 Dec 9 19:05 lost+found/
-rw-r--r-- 1 root root 0 Dec 9 18:52 .next
-rw-r--r-- 1 root root 7629956 Feb 27 15:11 System.map-5.10.110
-rw-r--r-- 1 root root 7630638 Dec 8 23:14 System.map-5.10.110-rockchip-rk3588
lrwxrwxrwx 1 root root 16 Feb 27 15:11 uInitrd -> uInitrd-5.10.110
-rw-r--r-- 1 root root 15218515 Feb 27 15:11 uInitrd-5.10.110
-rw-r--r-- 1 root root 15254433 Dec 9 19:07 uInitrd-5.10.110-rockchip-rk3588
lrwxrwxrwx 1 root root 16 Feb 27 15:11 vmlinuz -> vmlinuz-5.10.110
-rw-r--r-- 1 root root 33438208 Feb 27 15:11 vmlinuz-5.10.110
-rw-r--r-- 1 root root 33020416 Dec 8 23:14 vmlinuz-5.10.110-rockchip-rk3588

当上电5b蓝灯常亮时基本可以确认内核无法正确启动,您可以使用sd卡引导或拆卸硬盘在可运行的系统上挂载boot分区

比较重要的几个文件

vmlinuz

1
2
3
4
dia@rock-5b:/boot$ file vmlinuz
vmlinuz: symbolic link to vmlinuz-5.10.110
dia@rock-5b:/boot$ file vmlinuz-5.10.110
vmlinuz-5.10.110: Linux kernel ARM64 boot executable Image, little-endian, 4K pages

内核二进制文件,在这里的链接并不合理。经测试不使用该文件

initrd.img

initramfs,如果您使用make install安装内核会自动打包该文件,无法启动也请检查符号链接

uInitrd

uboot所用,make install时生成

Image

经测试armbian实际通过该文件启动内核,请确认该文件正确链接到内核二进制文件(同上面的vmlinuz)上

启动进入initramfs shell

如果您exit提示找不到启动设备,可能是在编译时使用了错误的配置/配置文件导致nvme加载出错。请恢复原内核重新配置编译

Prev
2023-02-23 13:22:16
Next