随着云计算相关产业蓬勃发展,用户对移动设备的弹性需求推动出云手机、云游戏等概念,云手机和云游戏就是将云计算技术运用于网络终端服务,通过云服务器实现云服务的手机,支持弹性适配用户个性化需求,释放手机本身硬件资源。
安卓系统在Arm平台上有着广泛部署的历史,Arm同时提供了高性能的云计算平台,既完全兼容安卓生态,无指令翻译环节,海量应用无需迁移,又支持虚拟化和容器技术,CPU、内存、存储和网络等资源可按需弹性分配,可以完美地为终端用户提供安卓云服务。终端用户可以通过手机、电脑等设备远程访问Arm服务器上的安卓实例,并运行标准的安卓应用程序和游戏。
本文主要介绍在Arm服务器上,Robox安卓容器方案的构建编译过程和使用方法。
Robox简介
Robox容器方案是基于Docker容器使能安卓系统的虚拟化方案。容器的实现是基于一个anbox的基本框架,基本架构如下图所示。
环境要求
服务器:Arm服务器1台
显卡:AMD Radeon Pro WX 7100 或 Nvidia Tesla T4
配置编译环境
系统要求
OS: Ubuntu 20.04.2
Kernel: 5.4.0
安装依赖库和基础组件
1. 基础依赖库
apt install dpkg libncurses5-dev libncursesw5-dev libssl-dev cmake cmake-data debhelper dbus google-mock libboost-dev libboost-filesystem-dev libboost-log-dev libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-test-dev libboost-thread-dev libcap-dev libsystemd-dev libdbus-1-dev libegl1-mesa-dev libgles2-mesa-dev libglib2.0-dev libglm-dev libgtest-dev liblxc1 libproperties-cpp-dev libprotobuf-dev libsdl2-dev libsdl2-image-dev lxc-dev pkg-config protobuf-compiler libboost-filesystem1.62.0 libboost-system1.62.0 docker.io dkms libboost-iostreams1.62.0
apt install build-essential
apt install mesa-common-dev
2. 下载依赖库并安装
- 下载:
libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb: https://launchpad.net/ubuntu/zesty/arm64/libprocess-cpp3/3.0.1-0ubuntu5
libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb: https://launchpad.net/ubuntu/zesty/arm64/libdbus-cpp5/5.0.0+16.10.20160809-0ubuntu2
libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb: https://launchpad.net/ubuntu/bionic/arm64/libdbus-cpp-dev/5.0.0+16.10.20160809-0ubuntu2 安装
dpkg -i libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb dpkg -i libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb dpkg -i libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb
3. 更换docker storage driver
- 登录到服务器,查看docker信息
修改storage driver的版本
如果“storage driver”的版本为“overlay”或者“overlay2”,则不需要进行调整;如果“storage driver”的版本为“aufs”,则需要把“storage driver”从“aufs”修改为“overlay”,步骤如下:打开“/etc/default/docker”文件
vim /etc/default/docker
添加如下脚本
DOCKER_OPTS= -s overlay
重启docker让修改生效
/etc/init.d/docker restart
- 查看docker的storage driver版本
安装远程桌面
安装xfce4
apt install xfce4 xfce4-* xrdp
打开.xsession文件夹
cd /home/ubuntu vi .xsession
注意 “/home/ubuntu”为用户文件夹。
在.xsession中添加如下内容
xfce4-session
重启xrdp远程桌面
/etc/init.d/xrdp restart
此后,可以通过远程桌面访问服务器图形桌面,使用root帐号登录。
Robox 安装和配置
1. 下载Robox源码并解压到/home/目录下
https://github.com/kunpengcompute/robox/tree/master
2. binder.ko和ashmem.ko模块编译安装
下载内核源码,供内核模块编译
apt search linux-source apt install linux-source-5.4.0
拷贝ashmem和binder源码
cd /home/robox-master/kernel/robox-modules cp anbox.conf /etc/modules-load.d/ cp 99-anbox.rules /lib/udev/rules.d/ cp -rT ashmem /usr/src/anbox-ashmem-1 cp -rT binder /usr/src/anbox-binder-1
使用dkms进行编译和安装
dkms install anbox-ashmem/1 dkms install anbox-binder/1
将ko模块安装到内核,binder_linux模块需要带参数
modprobe ashmem_linux modprobe binder_linux num_devices=254 lsmod | grep -e ashmem_linux -e binder_linux chmod 777 /dev/ashmem /dev/binder*
注意:每次服务器重启后,需要将binder_linux模块移除之后,再重新安装。
若ashmem和binder的属性权限不是下列命令显示的,需要使用chmod添加权限
ls -alh /dev/binder* /dev/ashmem crwxrwxrwx 1 root root 10, 55 Oct 22 10:47 /dev/ashmem crwxrwxrwx 1 root root 511, 0 Oct 22 10:47 /dev/binder0 crwxrwxrwx 1 root root 511, 0 Oct 22 10:47 /dev/binder1 ...
3. 注册安卓镜像并存储在docker中
- 下载安卓镜像包:android.img
https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/native/android.img 将android镜像挂载到“/mnt”目录
cd /home mount /home/android.img /mnt
进入/mnt目录,注册镜像
cd /mnt tar --numeric-owner -cf- . | docker import - android:robox_with_exagear
- 查看系统容器
回显信息如下,则确认android容器存在
4. 编译Robox源码
创建编译目录
cd /home/robox-master mkdir build cd build
配置编译,在“/home/robox-master/build”目录执行命令
cmake ..
- 在“/usr/include/glm/gtx/transform.hpp”文件中在第21行添加以下内容
编译安装
make -j make install
5. 使能显卡
AMD显卡
安装xfce4桌面和相关工具
apt install -y xfce4 mesa-utils x11vnc vainf
修改/etc/X11/xorg.conf配置文件
在xorg.conf文件中添加如下内容,其中BusID项需要根据服务器中显卡pci号修改(BusID都是用英文冒号(:)分隔)ection "ServerFlags" Option "DontVTSwitch" "on" Option "AutoAddDevices" "off" Option "AutoEnableDevices" "off" Option "AutoAddGPU" "off" Option "AutoBindGPU" "off" EndSection Section "Device" Identifier "AMD" Driver "amdgpu" BusID "pci:01:00:00" EndSection Section "Monitor" Identifier "monitor0" Modeline "1280x720" 74.50 1280 1344 1472 1664 720 723 728 748 -hsync +vsync Option "enable" "true" EndSection Section "Screen" Identifier "screen0" Device "AMD" Monitor "monitor0" DefaultDepth 24 SubSection "Display" Depth 24 Modes "1280x720" EndSubSection EndSection
查询显卡的pci号
#lspci |grep AMD 05:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon Pro WX 7100] 05:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590]
注意:
- lspci看到的busid是十六进制的,而配置文件中的BusID里面的值是十进制的,所以需要做下转换,例如上面查询到的结果是81:00.0,而配置文件里面应该填入的是pci:129:00:00。
- 配置文件中的BusID格式是pci:xx:xx:xx,都是用“:”分隔的,而lspci看到的busid的信息是xx:xx.x,请勿直接拷贝lspci查到的busid去覆盖配置文件中的BusID。
- Modeline "1280x720" 字段需要大于等于安卓系统的分辨率。
编译安装mesa-19.0.8版本。重装mesa方法如下
下载mesa代码, 进入mesa代码目录,切换到19.0.8分支。cd /home/ git clone https://anongit.freedesktop.org/git/mesa/mesa.git cd /home/mesa git checkout mesa-19.0.8
下载编译依赖包
apt build-dep mesa apt install libomxil-bellagio-dev libva-dev llvm-7 llvm-7-dev python-mako
执行autogen.sh生成Makefile
./autogen.sh --enable-texture-float --with-gallium-drivers=radeonsi,swrast --with-dri-drivers=radeon,swrast --with-platforms=drm,x11 --enable-glx-tls --enable-shared-glapi --enable-dri3 --enable-lmsensors --enable-gbm --enable-xa --enable-osmesa --enable-vdpau --enable-nine --enable-omx-bellagio --enable-va --with-llvm-prefix=/usr/lib/llvm-7 --enable-llvm --target=aarch64-linux-gnu CFLAGS="-fsigned-char -O2" CPPFLAGS="-fsigned-char -O2" CXXFLAGS="-fsigned-char -O2" --enable-autotools
编译并安装
make -j make install
修改ldconfig更改库链接顺序,打开/etc/ld.so.conf文件, 添加/usr/local/lib到文件首内容,修改后内容如下
cat /etc/ld.so.conf /usr/local/lib include /etc/ld.so.conf.d/*.conf
执行如下命令使能
ldconfig
测试Xorg是否可以正常启动
Xorg :0 -config /etc/X11/xorg.conf
NVIDIA显卡
安装显卡驱动
wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux_sbsa.run sudo sh cuda_11.6.2_510.47.03_linux_sbsa.run
运行如下命令创建Xconfig文件
sudo nvidia-xconfig Xorg :0 -config /etc/X11/xorg.conf
启动Robox安卓实例
将robox-master源码里中binaryFiles目录下的启动脚本robox拷贝到/home/robox-master下
cp /home/robox-master/binaryFiles/ /home/robox-master
注意:robox脚本里的docker run命令中的镜像名称需要改成本地自己注册的名称
设置环境变量,将容器指定到GPU卡上运行
export DISPLAY=:0
注意:
- robox脚本中设置的DISPLAY号要与此处设置的DISPLAY号一致。
- 启动Robox之前,先查看环境变量XDG_RUNTIME_DIR是否存在,若不存在,可以在robox可执行脚本开始位置中增加export XDG_RUNTIME_DIR=/run/user/0,同时要确保“/run/user/0”目录存在。
- 启动Robox容器时,必须按照顺序来启动,即要先启动instance1,然后才能启动instance2、instance3、……,不能跳着启动,否则不能使用宿主机IP地址连接Robox容器。
启动Robox容器实例,后面的数字代表启动的实例编号,可以同时启动多个实例
./robox -v start 1
查看docker实例进程
#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b77d371b402c android:robox_with_exagear "/anbox-init.sh" 13 seconds ago Up 11 seconds 0.0.0.0:5561->5555/tcp instance2 77b2c041315f android:robox_with_exagear "/anbox-init.sh" 2 hours ago Up 2 hours 0.0.0.0:5559->5555/tcp instance1
查看主机session进程,查看instance1、instance2对应的两个session是否正常运行
#ps -aux | grep session root 4330 0.0 0.0 9332 6160 ? Ss Oct22 0:01 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile -- systemd-activation --syslog-only root 172678 22.1 0.0 6433328 250472 pts/8 Sl 19:51 25:38 anbox session-manager --run-multiple=instance1 --standalone -- experimental --single-window --gles-driver=translator --window-size=720,1280 root 215155 1.4 0.0 5196228 185688 pts/8 Sl 21:46 0:01 anbox session-manager --run-multiple=instance2 --standalone -- experimental --single-window --gles-driver=translator --window-size=720,1280
登录到安卓容器内,确认Robox实例是否启动成功
#docker exec -it instance1 sh 77b2c041315f:/ # getprop | grep sys.boot.completed [sys.boot_completed]: [1]
sys.boot.completed显示为1,标识安卓启动完毕
远程访问安卓实例
使用scrcpy远程访问安卓实例。Scrcpy是一款开源免费的安卓投屏控制软件,支持在PC、Mac、linux上运行。可参考下面链接安装:
https://github.com/Genymobile/scrcpy/blob/master/README.zh-Hans.md
使用方法:
adb连接到安卓实例
adb connect serverip:android_instance_port
使用scrcpy远程访问安卓实例
scrcpy -s serverip:android_instance_port
总结
基于以上步骤可以在Arm服务器上快速构建安卓云服务,终端用户可以在手机、电脑等设备上远程访问服务器上的安卓实例,并按需求安装、运行标准的安卓应用程序和游戏,运行效果如下图。
参考
https://support.huaweicloud.com/prtg-robox-kunpengcps/kunpengcps_robox_25_0001.html