
Nvidia がシールド上で開発用に用意した Ubuntu 16.04 イメージを chroot しようとしています。SD カードに配置して /mnt/chroots にマウントしましたが、apt-get update が失敗して動作せず、ping も失敗します。助けていただけるとありがたいです。
cd rootfs
mount -t proc proc proc/
mount -t sysfs sys sys/
mount -o bind /dev dev/
mount -o bind /dev/pts dev/pts/
chroot . /bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
また、グループにルートを追加しました:
groupadd -g 3001 aid_net_bt_admin
groupadd -g 3002 aid_net_bt
groupadd -g 3003 aid_inet
groupadd -g 3004 aid_inet_raw
groupadd -g 3005 aid_inet_admin
gpasswd -a root aid_net_bt_admin
gpasswd -a root aid_net_bt
gpasswd -a root aid_inet
gpasswd -a root aid_inet_raw
gpasswd -a root aid_inet_admin
/etc/resolv.conf
nameserver 8.8.8.8
/etc/init.d/networkingを起動する
root@localhost:/# apt-get update
Err:1 http://ports.ubuntu.com/ubuntu-ports xenial InRelease
Temporary failure resolving 'ports.ubuntu.com'
Err:2 http://ports.ubuntu.com/ubuntu-ports xenial-updates InRelease
Temporary failure resolving 'ports.ubuntu.com'
Err:3 http://ports.ubuntu.com/ubuntu-ports xenial-security InRelease
Temporary failure resolving 'ports.ubuntu.com'
Reading package lists... Done
W: Failed to fetch http://ports.ubuntu.com/ubuntu-ports...nial/InRelease Temporary failure resolving 'ports.ubuntu.com'
W: Failed to fetch http://ports.ubuntu.com/ubuntu-ports...ates/InRelease Temporary failure resolving 'ports.ubuntu.com'
W: Failed to fetch http://ports.ubuntu.com/ubuntu-ports...rity/InRelease Temporary failure resolving 'ports.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
答え1
ここでは2つの異なる問題があります
- apt が DNS を解決しない
- pingが機能しない
-
APT が DNS を解決しない:
問題は、APT が _apt を非特権ユーザーとして使用することです。パラノイド ネットワークの Android では、グループ 3003 aid_inet または 3004 aid_inet_raw のユーザーのみがネットワーク ソケットを開くことができます。apt がインストールされると、ユーザー _apt が作成されます。
# add unprivileged user for the apt methods
adduser --force-badname --system --home /nonexistent \
--no-create-home --quiet _apt || true
ユーザーは/etc/passwdで次のように表示されます
root@localhost:~
# grep -E "_apt" /etc/passwd
_apt:x:103:65534::/nonexistent:/bin/false
パスワードのフォーマットは
ユーザー名:暗号化されたパスワード:ユーザーID番号(UID):ユーザーのグループID番号(GID):ユーザーのフルネーム(GECOS):ユーザーのホームディレクトリ:ログインシェル
_apt ユーザーを見ると、GID は 65534 に設定されており、これはグループがないことを意味します。通常の Linux システムではこれで問題ありません。Android では、この GID ではネットワーク接続ができません。GID を 3003 に変更する必要があります。
# usermod -g 3003 _apt
GIDが変更されます
root@localhost:~
# grep -E "_apt" /etc/passwd
_apt:x:103:3003::/nonexistent:/bin/false
APTはAndroid chrootで動作するようになりました
PINGが機能しない
私の場合、このコマンド例を使用してchrootしたときに気づいた
# chroot /linux /bin/bash -l
Androidでは、グループはアプリに多少使用されます。そのため、ルート呼び出しbashはルートグループでのみ実行できます。
# groups
root
ユーザー名なしで実行されるグループは現在のプロセスグループを出力します。
これを試してみましょう
# su - root
suコマンドはユーザーを切り替える
# groups
root sdcard-rw aid_bt aid_bt-net aid_inet aid_net-raw aid_net_admin
これでpingが機能するようになります
私は今
# chroot /linux /bin/su - root
Android の root ではなく Linux の root としてログインする