環境 

クライアント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)