環境
クライアントPC:RockyLinux9.8 + Xorg+Openbox+xfdesktop
192.168.20.117
|
|
192.168.20.118
ホストVM: ESXi6.5 (vm:cpu 4コア,mem:4G)
RockyLInux9.8 minimal
失敗例から
失敗なので、短めに書きます。
(1)クライアントPC: android-tools をインストール
(2)ホストVM:
①7.3.1-1.el9.elrepo.x86_64 へカーネルを変更 ※dnfで実施 (android機能への対応のため)
②docker をインストール
③redroid 用コンテナを起動
(3)クライアントPC: adb connect 192.168.20.118 → no route to host
※もちろん、firewalld や クライアント・ホスト間ipレイヤのルーティングは問題なし
→色々切り分けると、ホスト側docker redroidのnetd が kernelモジュール(Binder)を読み込めずにクラッシュしていることが発覚
→ホスト側でmodprobe,modinfoなどでロードしているモジュールを確認すると、binderはロードされておらず、個別コンパイルも不可の状況
成功した構築例
(全体の流れ)RockyLinux9.8へ Redroido(docker)をインストール
1. カーネルソース取得
2. 現在の設定を流用
3. Binder / BinderFS有効化
4. ビルド
5. インストール
6. Binderデバイス作成
7. Redroid再起動 (※事前にdockerのインストール)
8. Clientからadbおよびscrcpyで接続
カーネルコンパイル
##開発ツールなど必要ツールのインストール
sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y \
gcc gcc-c++ make ncurses-devel \
bison flex elfutils-libelf-devel \
openssl-devel rpm-build bc rsync
sudo dnf install wget
##ソース取得
su -
cd /usr/src
wget https://cdn.kernel.org/pub/linux/kernel/v7.x/linux-7.3.1.tar.xz
tar -xf linux-7.3.1.tar.xz
cd linux-7.3.1
##Make
#現在の設定コピー
cp /boot/config-$(uname -r) .config
#makeの設定
make menuconfig
# --- 以下の設定を有効化--- #
Device Drivers
└ Android
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
## ----- ##
#Configへ反映
make olddefconfig
#コンパイル
make -j2 2>&1 | tee make.log
#モジュールのインストール
make modules_install
#カーネルのインストール
make install
#新しい、カーネルがロードされるかどうかを確認
uname -r
7.3.1-1.el9.elrepo.x86_64
grubby --info=ALL
index=1
kernel="/boot/vmlinuz-7.3.1"grubby --default-kernel
/boot/vmlinuz-7.3.1
...
grubby --default-kernel
/boot/vmlinuz-7.3.1
#再起動
reboot
#カーネルバージョン確認
uname -r
========
モジュールロード
--- Binder デバイスの作成 ---
# マウント先ディレクトリの作成
sudo mkdir -p /dev/binderfs
# binderfsをマウント(これにより、必要なデバイスがディレクトリ内に自動生成されます)
sudo mount -t binder binder /dev/binderfs
#確認
ls -l /dev/binderfs/
crw-------. 1 root root 241, 1 11月 4 09:52 binder
crw-------. 1 root root 241, 0 11月 4 09:52 binder-control
drwxr-xr-x. 2 root root 0 11月 4 09:52 features
crw-------. 1 root root 241, 2 11月 4 09:52 hwbinder
crw-------. 1 root root 241, 3 11月 4 09:52 vndbinder
docker(redroid)起動
--reroid起動--
#secureLinuxをOFF
sudo getenforce
→Enforcingなら以下
sudo setenforce 0
#以前に古いdockerで作成したことがあれば一度削除
docker rm -f redroid
ーーdockerインストール---
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
sudo shutdown -r now
--redroidコンテナを作成---
#reroid作成/run
docker run -d --privileged --name redroid -v ~/data:/data:z -p 0.0.0.0:5555:5555 redroid/redroid:13.0.0-latest androidboot.use_metadata_allocator=1 androidboot.hardware=redroid androidboot.use_memfd=sudo dnf install growpart
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8dee5577120f redroid/redroid:13.0.0-latest "/init qemu=1 androi…" 6 seconds ago Up 5 seconds 0.0.0.0:5555->5555/tcp redroid
---firewall設定---
sudo systemctl stop firewalld
※ちゃんと、5555ポートのみを許可する場合は調べて設定のこと
--reroid内部の確認---
docker exec -it redroid sh
getprop service.adb.tcp.port
##以下実ログ
docker exec -it redroid sh
8dee5577120f:/ # getprop service.adb.tcp.port
8dee5577120f:/ # getprop | grep adb
[init.svc.adbd]: [running]
[init.svc_debug_pid.adbd]: [111]
[persist.adb.wifi.guid]: [adb-wBnlcZLNpHuOZOOM-OcwCLe]
[persist.sys.usb.config]: [adb]
[ro.adb.secure]: [0]
[ro.boottime.adbd]: [770463322084]
[sys.usb.config]: [adb]
[sys.usb.state]: [adb]
8dee5577120f:/ # ip route
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2
8dee5577120f:/ # ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 4 *:5555 *:*
8dee5577120f:/ # getprop init.svc.netd
running
8dee5577120f:/ #
クライアント側のインストール
===Client側====
#必要ソフトインストール
sudo dnf install -y android-tools
sudo dnf install -y ninja-build pkgconfig SDL2-devel ffmpeg-devel libusb1-devel --skip-broken
sudo dnf install ffmpeg-devel --allowerasing
#scrcpy ソースインストール
git clone https://github.com/Genymobile/scrcpy.git
cd /usr/local/src/scrcpy
#一括インストールシェル
./install_release.sh
adb connect 192.168.20.118:5555
#起動
scrcpy --keyboard=uhid --audio-codec=aac
→uhidがエラーとなる場合は,--keybordは除いて起動
(参考)日本語化
■ホスト側でuhidのを許可
docker exec -it redroid sh
8dee5577120f:/ # chmod 666 /dev/uhid
■日本語のインストール
adb install Gboard.apk # 適切な最新版をクライアント側でダウンロードしてadbでインストール
■確認
adb shell ime list -s
※なお、必要なソフトウェアのxxxx.apkファイルをクライアントに落としてきて、
adb install xxxx.apk
で概ねのソフトウェアはインストール可能
=====(参考)トラブルシュート用※主に通信関係=====
#dockerのすべてのコンテナを確認する
sudo docker ps -a
#redroidの中のIProute
docker exec redroid ip route
#redroidのリッスンポート確認
docker exec redroid sh -c "ss -lnt"
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 4 *:5555 *:*
#redroid から ping
docker exec redroid ping -c 3 172.17.0.1
#コンテナ内に入ってから詳細にNW系ログを確認するコマンド
logcat -d | grep -iE "netd|network|eth0|route"
#悪かった実績のあるnetdのサービス状態の確認
getprop init.svc.netd
または
docker exec redroid getprop init.svc.netd
#docker内部のログの確認 (今回は主にnetdのエラーログ解析用)
docker exec redroid sh
logcat -b crash -d | tail -100
logcat -d | grep -A20 -B20 "netd"
→ Binderがカーネルで有効化されていなかったので、netd起動時にbinder読み込み不可でエラーとなっていた
=== カーネル関係切り分け ===
find /lib/modules/$(uname -r) -name '*binder*'
grep BINDER /boot/config-$(uname -r)