33

Martin_Ma · 2022年06月14日

基于Arm服务器的安卓云容器方案构建方法

随着云计算相关产业蓬勃发展,用户对移动设备的弹性需求推动出云手机、云游戏等概念,云手机和云游戏就是将云计算技术运用于网络终端服务,通过云服务器实现云服务的手机,支持弹性适配用户个性化需求,释放手机本身硬件资源。

安卓系统在Arm平台上有着广泛部署的历史,Arm同时提供了高性能的云计算平台,既完全兼容安卓生态,无指令翻译环节,海量应用无需迁移,又支持虚拟化和容器技术,CPU、内存、存储和网络等资源可按需弹性分配,可以完美地为终端用户提供安卓云服务。终端用户可以通过手机、电脑等设备远程访问Arm服务器上的安卓实例,并运行标准的安卓应用程序和游戏。

本文主要介绍在Arm服务器上,Robox安卓容器方案的构建编译过程和使用方法。

Robox简介

Robox容器方案是基于Docker容器使能安卓系统的虚拟化方案。容器的实现是基于一个anbox的基本框架,基本架构如下图所示。
 title=

环境要求

服务器: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. 下载依赖库并安装

3. 更换docker storage driver

  • 登录到服务器,查看docker信息
     title=
  • 修改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版本
      image.png

安装远程桌面

  • 安装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中

4. 编译Robox源码

  • 创建编译目录

    cd /home/robox-master
    mkdir build
    cd build
  • 配置编译,在“/home/robox-master/build”目录执行命令

    cmake ..
  • 在“/usr/include/glm/gtx/transform.hpp”文件中在第21行添加以下内容
     title=
  • 编译安装

    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服务器上快速构建安卓云服务,终端用户可以在手机、电脑等设备上远程访问服务器上的安卓实例,并按需求安装、运行标准的安卓应用程序和游戏,运行效果如下图。
image.png

参考

https://support.huaweicloud.com/prtg-robox-kunpengcps/kunpengcps_robox_25_0001.html

推荐阅读
关注数
17397
内容数
80
分享arm服务器软件应用经验、测试方法、优化思路、工具使用等。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息