隨著云計算相關產業蓬勃發展,用戶對移動設備的彈性需求推動出云手機、云游戲等概念,云手機和云游戲就是將云計算技術運用于網絡終端服務,通過云服務器實現云服務的手機,支持彈性適配用戶個性化需求,釋放手機本身硬件資源。
安卓系統在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版本
-
打開“/etc/default/docker”文件
安裝遠程桌面
-
安裝xfce4
apt install xfce4 xfce4-* xrdp
-
打開.xsession文件夾
cd /home/ubuntu vi .xsession
注意 “/home/ubuntu”為用戶文件夾。
-
在.xsession中添加如下內容
xfce4-session
-
重啟xrdp遠程桌面
/etc/init.d/xrdp restart
Robox 安裝和配置
1. 下載Robox源碼并解壓到/home/目錄下
https://github.com/kunpen?gcompute/robox/tree/master2. 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.imghttps://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 "pci00: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,而配置文件里面應該填入的是pci00:00。
- 配置文件中的BusID格式是pcixx: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上運行??蓞⒖枷旅骀溄影惭b: 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服務器上快速構建安卓云服務,終端用戶可以在手機、電腦等設備上遠程訪問服務器上的安卓實例,并按需求安裝、運行標準的安卓應用程序和游戲,運行效果如下圖。
原文標題:技術分享 | 基于Arm服務器的安卓云容器方案構建方法
文章出處:【微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。
-
ARM
+關注
關注
134文章
9104瀏覽量
367870 -
服務器
+關注
關注
12文章
9206瀏覽量
85563 -
容器
+關注
關注
0文章
495瀏覽量
22072 -
安卓
+關注
關注
5文章
2133瀏覽量
57278
原文標題:技術分享 | 基于Arm服務器的安卓云容器方案構建方法
文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論