none:nogroupを使用してディレクトリの所有権を変更するには?私が試したことはすべて「作業が許可されていません」で終わります。
cat /etc/debian_version
10.2
root@torrent:/srv# chown -R rtorrent:rtorrent rtorrent
chown: cannot read directory 'rtorrent/.local/share': Permission denied
chown: changing ownership of 'rtorrent/.local': Operation not permitted
chown: changing ownership of 'rtorrent/.bash_history': Operation not permitted
chown: changing ownership of 'rtorrent/session/rtorrent.dht_cache': Operation not permitted
chown: changing ownership of 'rtorrent/session': Operation not permitted
chown: changing ownership of 'rtorrent/.rtorrent.rc': Operation not permitted
chown: changing ownership of 'rtorrent/download': Operation not permitted
chown: changing ownership of 'rtorrent/watch': Operation not permitted
chown: changing ownership of 'rtorrent': Operation not permitted
rm -r download/
rm: cannot remove 'download/': Permission denied
root@torrent:/srv/rtorrent# ls -al
total 32
drwxr-xr-x 6 nobody nogroup 4096 Jan 24 18:16 .
drwxr-xr-x 3 root root 4096 Jan 24 16:46 ..
-rw------- 1 nobody nogroup 47 Jan 24 18:16 .bash_history
drwxr-xr-x 3 nobody nogroup 4096 Jan 24 18:15 .local
-rw-r--r-- 1 nobody nogroup 3224 Jan 24 18:16 .rtorrent.rc
drwxr-xr-x 2 nobody nogroup 4096 Jan 24 16:46 download
drwxr-xr-x 2 nobody nogroup 4096 Jan 24 18:21 session
drwxr-xr-x 2 nobody nogroup 4096 Jan 24 16:46 watch
答え1
あなたのコンテナは、以下に基づいて構築されたユーザ(ルート化されていない)コンテナとして実行されているようです。ユーザーネームスペース。
操作するには、ユーザーコンテナに接続UID/ジド翻訳ホストへのマッピングUID/ジドコンテナにUID/ジド。これらのホスト全体の範囲は2^32です(実際には0から始まります)。根ユーザー)。これからコンテナの割り当て範囲は通常 2^16 に保たれるようです (これは歴史的に互換性があります)。UID範囲)。
すべてのホストUID範囲は次に変換されません。UIDコンテナは次のように表示されます。誰も(それぞれ:グループなし~のためジド)ユーザーコンテナ内。このコンテナと同様に根そのような製品に対する権利はありませんUID、変更できず、通常のユーザーとして実行するのと同じように、操作は失敗します。
以下は、問題を説明するProxmoxのリンクです。
https://pve.proxmox.com/wiki/Unprivileged_LXC_containers
しかし、次の条件が満たされている限り、すべてのファイルとディレクトリが「nobody」(uid 65534)にマップされていることにすぐに気付くでしょう。
- 制限された権限を設定していません(グループ/ユーザーのみがファイルを読み取ったり、ディレクトリにアクセスしたりできます)。
- すべてのファイルが高いマッピング(100000+)uidで生成されるため、特定のuid / gidを使用してファイルを作成したくありません。
これらの範囲を変換するために特別に設計されたツールがあるため、準備されたシステムツリーレイアウトをターゲットコンテナに適した範囲に転送できます。これらのツールはホストシステムで実行する必要があります(または少なくとも「再帰」コンテナの場合、コンテナはユーザーの名前空間を「作成」します)。たとえば、
https://github.com/jirutka/uidmapshift
これは明らかに存在しないプロジェクトnsexecでuidmapshiftを再実装したものです:
https://github.com/fcicq/nsexec
もちろん、正しい目標を計算して手動で実行することもできます。UID:ジドchown
(ホストから)使用します。値と単純なマッピングがあれば簡単です。以下は、実行中のユーザーLXCコンテナを使用する例です。
コンテナ(と呼ばれる)バスター-amd64):
user@buster-amd64:~$ ls -n test
-rw-r--r--. 1 65534 65534 0 Jan 24 21:09 test
root@buster-amd64:/home/user# chown user:user test
chown: changing ownership of 'test': Operation not permitted
ホスト(同じファイルを表示):
user@host:~$ ls -n ~/.local/share/lxc/buster-amd64/rootfs/home/user/test
-rw-r--r--. 1 1000 1000 0 Jan 24 22:09 /home/user/.local/share/lxc/buster-amd64/rootfs/home/user/test
次のコマンドは init プロセスを取得します。PID(コンテナには1つありますが、ここではPIDコンテナで実行される値(ホストマシンに表示されます)(コンテナの他のプロセスも機能します):
user@host:~$ lxc-info -Hpn buster-amd64
22926
user@host:~$ cat /proc/22926/uid_map
0 1410720 65536
このマッピングはLXC構成ですでに定義されている必要があります。
user@host:~$ grep lxc.idmap ~/.local/share/lxc/buster-amd64/config
lxc.idmap = u 0 1410720 65536
lxc.idmap = g 0 1410720 65536
ユーザーコンテナのuidが1000で、ファイル/ディレクトリがそのユーザーに属する必要がある場合は、新しいホストのuidは1410720 + 1000 = 1411720でなければなりません。
コンソールでは今回は(本物)根ユーザー:
root@host:~# chown 1411720:1411720 ~user/.local/share/lxc/buster-amd64/rootfs/home/user/test
これは、コンテナのファイルシステムがホストファイルシステムのどこかに直接マウントされず(たとえば、LVMバックアップストアまたはtmpfsを使用してマウントされているため)、アクセスできない場合は実行中のコンテナにも当てはまります(優先する必要があります)。
root@host:~# chown 1411720:1411720 /proc/22926/root/home/user/test
今コンテナから:
user@buster-amd64:~$ ls -n test
-rw-r--r--. 1 1000 1000 0 Jan 24 21:09 test
そしてその根ファイルが正しい場所にあるので、ユーザーはファイルに対する権限を持ちます。UID/ジドマッピング。
root@buster-amd64:~# chown root:root ~user/test
root@buster-amd64:~#
カーネル側では、次の機能を使用する作業が進行中です。シフトファイルシステムまだフォームの変更バンドルマウントを介してこの変換を実行すると、これらの問題を軽減するのに役立ちます。