そのシステムを実際に起動せずに、他の作業システムからいくつかのパッケージをダウンロード、コンパイル、インストールするためにlive-cdを起動しました。
次のコマンドを実行して、システムにビルドユーザーを作成しました。useradd -m -G wheel -s /bin/bash builder
その後、パーティションとchroot環境をインストールしました。
# mount /dev/mapper/luksdev on /mnt
# cd /mnt
# cp /etc/resolv.conf etc
# mount -t proc /proc proc
# mount --make-rslave --rbind /sys sys
# mount --make-rslave --rbind /dev dev
# mount --make-rslave --rbind /run run
# chroot /mnt /bin/bash
次に、Clone、Chown、およびビルドするプロジェクトに移動します。
(chroot)# git clone https://aur.archlinux.org/lighttpd2-git.git /home/builder/lighttpd2
(chroot)# chown -R builder.builder /home/builder/lighttpd2
(chroot)# sudo -u builder -s
(chroot|builder ~)$ cd /home/builder/lighttpd2/
(chroot|builder lighttpd2)$ /usr/bin/makepkg -s --noconfirm
ルートとして名前ルックアップを実行するのに問題はないので、期待git clone
どおりに機能します。ただし、このパッケージをビルドしながら他のユーザーに切り替えてください。(またはgit clone
root以外のユーザーとして実行している場合)、私は次を得る:
fatal: unable to access 'https://git.lighttpd.net/lighttpd/lighttpd2.git/': Could not resolve host: git.lighttpd.net
ping
それで問題を把握するために簡単な検査をしてみようかと思いました。ping www.google.com
のように振る舞いますが、そうしないroot
でくださいbuilder
。しかしping 8.8.8.8
両方に有効 root
& builder
。
(chroot)# ping -c 1 www.google.com
PING www.google.com (172.217.22.164) 56(84) bytes of data.
64 bytes from arn09s11-in-f164.1e100.net (172.217.22.164): icmp_seq=1 ttl=55 time=2.03 ms
(chroot|builder)$ ping -c 1 www.google.com
ping: www.google.com: Name or service not known
(chroot)# ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=121 time=1.97 ms
(chroot|builder)$ ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=121 time=1.98 ms
論理的には、これは特定のユーザーの名前解決に関連していると思います。しかし、これを行うと:
(chroot)# nslookup www.google.com
Server: 8.8.8.8
Name: www.google.com
Address: 216.58.207.196
(chroot|builder)$ nslookup www.google.com
Server: 8.8.8.8
Name: www.google.com
Address: 216.58.207.196
どちらのユーザーも nslookup を実行できます。これは/etc/resolv.conf
存在し、有効なようです。ただし、ホスト名をpingするか、nslookup / dig以外のすべての種類の名前解決操作を使用すると機能しません。
(chroot|builder)$ python
>>> from socket import *
>>> s = socket()
>>> s.connect(('www.google.com', 80))
socket.gaierror: [Errno -2] Name or service not known
簡単にするためにpingだけを使ってみました。
また、私は私のpingをブロックしていないことを確認しようとしました:
(chroot)# chown root:root /bin/ping; chmod u+srwx,go=rx /bin/ping
(chroot)# getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
しかし、それでもホスト名でpingすることはできませんが、IPはまだ機能します。
(chroot|builder)$ strace ping www.google.com
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = -1 EACCESS (Permission denied)
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) = -1 EPERM (Operation not permitted)
write(2, "ping: socket: Operation not perm"..., 38ping: socket: Operation not permitted)= 38
/home
そして/root
両方ともインストールされていませんnosuid
。残念ながら、これは仮想マシンなのでスクリーンショットの。
でpingを試しているので、/home
これがなぜ問題を引き起こすのかわかりません。システムから起動し、live-cd起動中に作成したユーザーと同じ操作を実行すると、ホスト名をpingできます。
この時点で、なぜ一部のユーザーはping、照会などを実行できますが、他のユーザーはchroot環境で実行できないのかを理解したいと思います。基本的な問題を解決または理解するために、ここでデバッグ/続行をどこで開始するのかわかりません。 IRCの一部を助けてくれた人たちも連絡しようとしましたが、私たちは皆混乱しました。
編集する:
mount --make-rslave --rbind /run run
問題に絞り込んでみました。理由が何であれ、これが理由です。問題の開始時にping www.google.com
各コマンドを実行しようとすると、インストールの直後に停止します。mount
/run