隨著云計(jì)算相關(guān)產(chǎn)業(yè)蓬勃發(fā)展,用戶對(duì)移動(dòng)設(shè)備的彈性需求推動(dòng)出云手機(jī)、云游戲等概念,云手機(jī)和云游戲就是將云計(jì)算技術(shù)運(yùn)用于網(wǎng)絡(luò)終端服務(wù),通過云服務(wù)器實(shí)現(xiàn)云服務(wù)的手機(jī),支持彈性適配用戶個(gè)性化需求,釋放手機(jī)本身硬件資源。
安卓系統(tǒng)在Arm平臺(tái)上有著廣泛部署的歷史,Arm同時(shí)提供了高性能的云計(jì)算平臺(tái),既完全兼容安卓生態(tài),無指令翻譯環(huán)節(jié),海量應(yīng)用無需遷移,又支持虛擬化和容器技術(shù),CPU、內(nèi)存、存儲(chǔ)和網(wǎng)絡(luò)等資源可按需彈性分配,可以完美地為終端用戶提供安卓云服務(wù)。終端用戶可以通過手機(jī)、電腦等設(shè)備遠(yuǎn)程訪問Arm服務(wù)器上的安卓實(shí)例,并運(yùn)行標(biāo)準(zhǔn)的安卓應(yīng)用程序和游戲。
本文主要介紹在Arm服務(wù)器上,Robox安卓容器方案的構(gòu)建編譯過程和使用方法。
Robox簡(jiǎn)介
Robox容器方案是基于Docker容器使能安卓系統(tǒng)的虛擬化方案。容器的實(shí)現(xiàn)是基于一個(gè)anbox的基本框架,基本架構(gòu)如下圖所示。
環(huán)境要求
服務(wù)器:Arm服務(wù)器1臺(tái)
顯卡:AMD Radeon Pro WX 7100 或 Nvidia Tesla T4
配置編譯環(huán)境
系統(tǒng)要求
OS: Ubuntu 20.04.2
Kernel: 5.4.0
安裝依賴庫(kù)和基礎(chǔ)組件
1. 基礎(chǔ)依賴庫(kù)
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. 下載依賴庫(kù)并安裝
-
下載: 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
-
登錄到服務(wù)器,查看docker信息
-
修改storage driver的版本 如果“storage driver”的版本為“overlay”或者“overlay2”,則不需要進(jìn)行調(diào)整;如果“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”文件
安裝遠(yuǎn)程桌面
-
安裝xfce4
apt install xfce4 xfce4-* xrdp
-
打開.xsession文件夾
cd /home/ubuntu vi .xsession
注意 “/home/ubuntu”為用戶文件夾。
-
在.xsession中添加如下內(nèi)容
xfce4-session
-
重啟xrdp遠(yuǎn)程桌面
/etc/init.d/xrdp restart
Robox 安裝和配置
1. 下載Robox源碼并解壓到/home/目錄下
https://github.com/kunpen?gcompute/robox/tree/master2. binder.ko和ashmem.ko模塊編譯安裝
-
下載內(nèi)核源碼,供內(nèi)核模塊編譯
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進(jìn)行編譯和安裝
dkms install anbox-ashmem/1 dkms install anbox-binder/1
-
將ko模塊安裝到內(nèi)核,binder_linux模塊需要帶參數(shù)
modprobe ashmem_linux modprobe binder_linux num_devices=254 lsmod | grep -e ashmem_linux -e binder_linux chmod 777 /dev/ashmem /dev/binder*
注意:每次服務(wù)器重啟后,需要將binder_linux模塊移除之后,再重新安裝。
-
若ashmem和binder的屬性權(quán)限不是下列命令顯示的,需要使用chmod添加權(quán)限
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. 注冊(cè)安卓鏡像并存儲(chǔ)在docker中
-
下載安卓鏡像包:android.imghttps://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/native/android.img
-
將android鏡像掛載到“/mnt”目錄
cd /home mount /home/android.img /mnt
-
進(jìn)入/mnt目錄,注冊(cè)鏡像
cd /mnt tar --numeric-owner -cf- . | docker import - android:robox_with_exagear
-
查看系統(tǒng)容器
回顯信息如下,則確認(rèn)android容器存在
4. 編譯Robox源碼
-
創(chuàng)建編譯目錄
cd /home/robox-master mkdir build cd build
-
配置編譯,在“/home/robox-master/build”目錄執(zhí)行命令
cmake ..
-
在“/usr/include/glm/gtx/transform.hpp”文件中在第21行添加以下內(nèi)容
-
編譯安裝
make -j make install
5. 使能顯卡
AMD顯卡
?
-
?安裝xfce4桌面和相關(guān)工具
apt install -y xfce4 mesa-utils x11vnc vainf
-
修改/etc/X11/xorg.conf配置文件
在xorg.conf文件中添加如下內(nèi)容,其中BusID項(xiàng)需要根據(jù)服務(wù)器中顯卡pci號(hào)修改(BusID都是用英文冒號(hào)(:)分隔)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號(hào)
#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是十六進(jìn)制的,而配置文件中的BusID里面的值是十進(jìn)制的,所以需要做下轉(zhuǎn)換,例如上面查詢到的結(jié)果是81:00.0,而配置文件里面應(yīng)該填入的是pci00:00。
- 配置文件中的BusID格式是pcixx:xx,都是用“:”分隔的,而lspci看到的busid的信息是xx:xx.x,請(qǐng)勿直接拷貝lspci查到的busid去覆蓋配置文件中的BusID。
-
Modeline "1280x720" 字段需要大于等于安卓系統(tǒng)的分辨率。
-
編譯安裝mesa-19.0.8版本。重裝mesa方法如下
下載mesa代碼, 進(jìn)入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
執(zhí)行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更改庫(kù)鏈接順序,打開/etc/ld.so.conf文件, 添加/usr/local/lib到文件首內(nèi)容,修改后內(nèi)容如下
cat /etc/ld.so.conf /usr/local/lib include /etc/ld.so.conf.d/*.conf
-
執(zhí)行如下命令使能
ldconfig
-
測(cè)試Xorg是否可以正常啟動(dòng)
Xorg :0 -config /etc/X11/xorg.conf
NVIDIA顯卡
-
安裝顯卡驅(qū)動(dòng)
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
-
運(yùn)行如下命令創(chuàng)建Xconfig文件
sudo nvidia-xconfig Xorg :0 -config /etc/X11/xorg.conf
啟動(dòng)Robox安卓實(shí)例
???
-
將robox-master源碼里中binaryFiles目錄下的啟動(dòng)腳本robox拷貝到/home/robox-master下
cp /home/robox-master/binaryFiles/ /home/robox-master
注意:robox腳本里的docker run命令中的鏡像名稱需要改成本地自己注冊(cè)的名稱 -
設(shè)置環(huán)境變量,將容器指定到GPU卡上運(yùn)行
export DISPLAY=:0
注意:- robox腳本中設(shè)置的DISPLAY號(hào)要與此處設(shè)置的DISPLAY號(hào)一致。
- 啟動(dòng)Robox之前,先查看環(huán)境變量XDG_RUNTIME_DIR是否存在,若不存在,可以在robox可執(zhí)行腳本開始位置中增加export XDG_RUNTIME_DIR=/run/user/0,同時(shí)要確保“/run/user/0”目錄存在。
-
啟動(dòng)Robox容器時(shí),必須按照順序來啟動(dòng),即要先啟動(dòng)instance1,然后才能啟動(dòng)instance2、instance3、……,不能跳著啟動(dòng),否則不能使用宿主機(jī)IP地址連接Robox容器。
-
啟動(dòng)Robox容器實(shí)例,后面的數(shù)字代表啟動(dòng)的實(shí)例編號(hào),可以同時(shí)啟動(dòng)多個(gè)實(shí)例
./robox -v start 1
-
查看docker實(shí)例進(jìn)程
#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
-
查看主機(jī)session進(jìn)程,查看instance1、instance2對(duì)應(yīng)的兩個(gè)session是否正常運(yùn)行
#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
-
登錄到安卓容器內(nèi),確認(rèn)Robox實(shí)例是否啟動(dòng)成功
#docker exec -it instance1 sh 77b2c041315f:/ # getprop | grep sys.boot.completed [sys.boot_completed]: [1]
sys.boot.completed顯示為1,標(biāo)識(shí)安卓啟動(dòng)完畢???
???
遠(yuǎn)程訪問安卓實(shí)例
使用scrcpy遠(yuǎn)程訪問安卓實(shí)例。Scrcpy是一款開源免費(fèi)的安卓投屏控制軟件,支持在PC、Mac、linux上運(yùn)行。可參考下面鏈接安裝: https://github.com/Genymobile/scrcpy/blob/master/README.zh-Hans.md使用方法:
-
adb連接到安卓實(shí)例
adb connect serverip:android_instance_port
-
使用scrcpy遠(yuǎn)程訪問安卓實(shí)例
scrcpy -s serverip:android_instance_port
總結(jié)
基于以上步驟可以在Arm服務(wù)器上快速構(gòu)建安卓云服務(wù),終端用戶可以在手機(jī)、電腦等設(shè)備上遠(yuǎn)程訪問服務(wù)器上的安卓實(shí)例,并按需求安裝、運(yùn)行標(biāo)準(zhǔn)的安卓應(yīng)用程序和游戲,運(yùn)行效果如下圖。

原文標(biāo)題:技術(shù)分享 | 基于Arm服務(wù)器的安卓云容器方案構(gòu)建方法
文章出處:【微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
ARM
+關(guān)注
關(guān)注
134文章
9327瀏覽量
375637 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
9728瀏覽量
87439 -
容器
+關(guān)注
關(guān)注
0文章
508瀏覽量
22387 -
安卓
+關(guān)注
關(guān)注
5文章
2149瀏覽量
58442
原文標(biāo)題:技術(shù)分享 | 基于Arm服務(wù)器的安卓云容器方案構(gòu)建方法
文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
安卓原生兼容服務(wù)器
請(qǐng)問CYUSB3014支持安卓驅(qū)動(dòng)嗎?
迅為RK3588開發(fā)板安卓GPIO調(diào)用APP運(yùn)行測(cè)試
如意玲瓏應(yīng)用構(gòu)建規(guī)則實(shí)用案例

自制 AirTag,支持安卓/鴻蒙/PC/Home Assistant,無需擁有 iPhone
納祥科技安卓PD協(xié)議芯片NX799,超絕兼容性,適配華為、三星等主流安卓手機(jī)

給安卓11系統(tǒng)的RK3566主板搭建一體機(jī)
AIC3262 CODEC能否在安卓下運(yùn)用?
容器云服務(wù)引擎是什么?如何使用
LangChain框架關(guān)鍵組件的使用方法

評(píng)論