ルートではない複数のユーザーがいるLinuxサーバーでADBを実行しようとしています(Androidエミュレーターで遊ぶため)。 adbデーモンは、ログをファイル/tmp/adb.log
に書き込みます。 残念ながら、これはADBにハードコードされているようで、この状況は変わりません。
そのため、adbの実行に失敗し、明らかなエラーが発生します:cannot open '/tmp/adb.log': Permission denied
。このファイルは、別のユーザーと/tmp
によって作成されています スティッキービットが付いています。 adb nodaemon server
でadbを起動した場合 stdoutに書き込むようにすると、エラーは発生しません(競合を避けるために、ポートを一意の値に設定しました)。
私の質問は、ADBに/tmp/adb.log
以外のファイルに書き込む方法はありますか? ? より一般的には、ある種のプロセス固有のシンボリックリンクを作成する方法はありますか? すべてのファイルアクセスを/tmp/adb.log
にリダイレクトしたい たとえば、ファイル~/tmp/adb.log
。
繰り返しますが、私はサーバーのrootではないので、chroot
、mount -o rbind
およびchmod
有効なオプションではありません。可能であれば、ADBソースを変更したくないのですが、他に解決策がない場合は、変更します。
P.S.特定のADBの場合、adb nodaemon server
を実行することに頼ることができます nohup
を使用 と出力のリダイレクトが、一般的な質問はまだ関連しています。
承認された回答:
これは、util-linux
を使用する非常に簡単な例です。 のunshare
プロセスをプライベートマウント名前空間に配置し、その親が現在持っているのと同じファイルシステムの異なるビューを与えるには:
{ cd /tmp #usually a safe place for this stuff
echo hey >file #some
echo there >file2 #evidence
sudo unshare -m sh -c ' #unshare requires root by default
mount -B file2 file #bind mount there over hey
cat file #show it
kill -TSTP "$$" #suspend root shell and switch back to parent
umount file #unbind there
cat file' #show it
cat file #root shell just suspended
fg #bring it back
cat file2 #round it off
}
there #root shell
hey #root shell suspended
hey #root shell restored
there #rounded
unshare
を使用して、プロセスにファイルシステムのプライベートビューを与えることができます。 最新のLinuxシステムでのユーティリティ。ただし、マウント名前空間機能自体は、3.xカーネルシリーズ全体でかなり成熟しています。 nsenter
を使用して、すべての種類の既存の名前名を入力できます 同じパッケージのユーティリティで、man
で詳細を確認できます。 。