Snažím se spustit ADB na linuxovém serveru s více uživateli, kde nejsem root (abych si mohl hrát s emulátorem Androidu). Démon adb zapisuje své protokoly do souboru /tmp/adb.log
který se bohužel zdá být pevně zakódován do ADB a tato situace se nezmění.
Adb se tedy nespouští, což dává zjevnou chybu:cannot open '/tmp/adb.log': Permission denied
. Tento soubor je vytvořen jiným uživatelem a /tmp
má na sobě lepivý kousek. Pokud spustím adb pomocí adb nodaemon server
při zápisu do stdout nedochází k žádným chybám (také jsem nastavil jeho port na jedinečnou hodnotu, abych se vyhnul konfliktům).
Moje otázka zní:existuje nějaký způsob, jak přimět ADB zapisovat do jiného souboru než /tmp/adb.log
? Obecněji, existuje způsob, jak vytvořit určitý druh symbolického odkazu specifického pro proces? Chci přesměrovat všechny přístupy k souborům na /tmp/adb.log
do souboru ~/tmp/adb.log
.
Opět nejsem root na serveru, takže chroot
, mount -o rbind
a chmod
nejsou platné možnosti. Pokud je to možné, nerad bych upravoval zdroje ADB, ale pokud neexistují žádná jiná řešení, udělám to.
P.S. Pro konkrétní případ ADB se mohu uchýlit ke spuštění adb nodaemon server
pomocí nohup
a přesměrování výstupu, ale obecná otázka je stále relevantní.
Přijatá odpověď:
Zde je velmi jednoduchý příklad použití util-linux
unshare
umístit proces do jmenného prostoru soukromého připojení a dát mu jiný pohled na stejný souborový systém, jaký má v současnosti jeho rodič:
{ 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
Procesu můžete poskytnout soukromý pohled na jeho souborový systém pomocí unshare
nástroj na aktuálních linuxových systémech, i když samotné zařízení jmenného prostoru mount je pro celou sérii jádra 3.x poměrně vyspělé. Pomocí nsenter
můžete zadat již existující jmenné prostory všeho druhu utility ze stejného balíku a více můžete zjistit pomocí man
.