fakeroot - utför ett kommando i en miljö som fejkar
root-privilegier för filmanipulation
fakeroot [-l|--lib bibliotek] [--faked
fejkad-binär ] [-i läsfil]
[-s sparfil] [-u|--unknown-is-real ]
[-b|--fd-base ] [-h|--help ] [-v|--version ] [--]
[kommando]
fakeroot utför ett kommando i en miljö där kommandot
tror sig ha root-privilegier för filmanipulering. Detta är
användbart för att ge användare möjlighet att
skapa arkiv (tar, ar, .deb osv) som innehåller filer med
root-rättigheter/ägarskap. Utan
fakeroot tvingas man att
ha root-privilegier för att skapa de filer arkivet består av med
korrekt ägarskaps- och rättighetsinformation, alternativt
konstruera arkiven manuellt utan att använda arkiveringsprogrammet.
fakeroot works by replacing the file manipulation library functions
(
chmod(2),
stat(2) etc.) by ones that simulate the effect the real library
functions would have had, had the user really been root. These wrapper
functions are in a shared library
/usr/lib/*/libfakeroot-*.so or
similar location on your platform. The shared object is loaded through the
LD_PRELOAD mechanism of the dynamic loader. (See
ld.so(8))
Om du planerar att bygga paket med hjälp av
fakeroot,
försök först att bygga fakeroot-paketet:
”debian/rules build”-stadiet har ett par tester (som mestadels
testar efter buggar i gamla versioner av fakeroot). Om dessa tester misslyckas
(till exempel på grund av att du har vissa libc5-program på ditt
system) så är det troligt att du också kommer att
misslyckas bygga andra paket, och det är möjligt att dessa fel
blir betydligt svårare att hitta.
Märk väl att det är bäst att inte bygga
binärerna själva med hjälp av fakeroot. Särskilt
configure och liknande program ogillar att systemet plötsligt beter sig
annorlunda än vad de förväntar sig. Det är
också möjligt att dessa program rensar bort vissa
miljövariabler som fakeroot behöver.
-
-l bibliotek, --lib
bibliotek
- Ange ett alternativt bibliotek med
ersättningsfunktioner.
-
--faked binär
- Ange en alternativ binär att använda
istället för faked(1).
-
[--] kommando
- Det kommando som du vill att fakeroot skall utföra.
Använd ‘--’ om kommandot har andra flaggor som kan
tänkas förvirra fakeroots tolkning av
kommandoradsflaggor.
-
-s sparfil
- Spara fakeroot-miljön till sparfil vid avslut. Denna
fil kan användas för att senare återställa
miljön med -i. Men om denna filen skulle läcka kommer
fakeroot börja bete sig på konstiga sätt om du inte
låter bli filerna som använts inuti fakeroot när du
är utanför miljön. Detta kan dock fortfarande vara
användbart. Det kan till exempel användas med rsync(1)
för att säkerhetskopiera och återställa hela
katalogträd kompletta med användare, grupp och
enhetsinformation utan att behöva vara root. Se
/usr/share/doc/fakeroot/README.saving för vidare
information.
-
-i läsfil
- Läs in en fakeroot-miljö som tidigare sparats
via -s från läsfil. Notera att detta inte implicit sparar
filen, använd -s också för det beteendet.
Användning av samma fil för både -i och -s vid samma
fakeroot-körning är säkert.
-
-u, --unknown-is-real
- Använd det riktiga ägarskapet för
filer som inte tidigare är kända av fakeroot istället
för att låtsas att de ägs av root:root.
-
-b fd
- Ange fd-bas (endast TCP-läge). fd är det
minsta fildeskriptornummer som används för TCP-anslutningar;
detta kan vara viktigt för att undvika konflikter med
fildeskriptorerna som används av program som körs under
fakeroot.
- -h
- Visa hjälp.
- -v
- Visa version.
Här är ett exempel på hur
fakeroot kan
användas. Notera att i den fejkade root-miljön så lyckas
filmanipulering som kräver root-privilegier, trots att den egentligen
inte utförs.
$ whoami
joost
$ fakeroot /bin/bash
# whoami
root
# mknod hda3 b 3 1
# ls -ld hda3
brw-r--r-- 1 root root 3, 1 Jul 2 22:58 hda3
# chown joost:root hda3
# ls -ld hda3
brw-r--r-- 1 joost root 3, 1 Jul 2 22:58 hda3
# ls -ld /
drwxr-xr-x 20 root root 1024 Jun 17 21:50 /
# chown joost:users /
# chmod a+w /
# ls -ld /
drwxrwxrwx 20 joost users 1024 Jun 17 21:50 /
# exit
$ ls -ld /
drwxr-xr-x 20 root root 1024 Jun 17 21:50 //
$ ls -ld hda3
-rw-r--r-- 1 joost users 0 Jul 2 22:58 hda3
Enbart de operationer som användaren
joost skulle kunna ha
genomfört som sig själv utförs på riktigt.
fakeroot skrevs speciellt i syfte att ge användare
möjlighet att skapa Debian GNU/Linux-paket (i
deb(5) format)
utan att behöva root-privilegier. Detta kan utföras genom
kommandon såsom
dpkg-buildpackage -rfakeroot eller
debuild
-rfakeroot (-rfakeroot är numera standard i debuild, så du
behöver inte ens använda den parametern).
fakeroot är ett vanligt program utan setuid. Det ger inte
användaren några extra privilegier, och minskar inte systemets
säkerhet.
/usr/lib/*/libfakeroot-*.so The shared library containing the wrapper
functions.
- FAKEROOTKEY
- Den nyckel som används för att kommunicera
med fakeroot-demonen. Varje program som startats med korrekt
LD_PRELOAD och en FAKEROOTKEY för en körande
demon kommer automatiskt att ansluta till den demonen, och kommer att ha
samma fejkade syn på filsystemets ägarskap och
rättigheter (givet att demonen och programmet som ansluter till den
startats av samma användare).
- LD_LIBRARY_PATH
- LD_PRELOAD
- Fakeroot är implementerat av ersättning av
systemanrop. Detta åstadkoms genom att ställa in
LD_LIBRARY_PATH=/usr/lib/fakeroot och LD_PRELOAD=libfakeroot.so.0. Det
biblioteket läses in innan systemets C-bibliotek, och
därför kan de flesta biblioteksfunktioner genskjutas av det.
Om du behöver ställa in antingen LD_LIBRARY_PATH
eller LD_PRELOAD inifrån en fakeroot-miljö bör
den ställas in relativt till de givna sökvägarna,
d.v.s. LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/foo/bar/
- Biblioteksversioner
- Varje kommando som utförs inom fakeroot
måste vara länkat mot samma version av libc som
fakeroot självt.
- open()/create()
- fakeroot innehåller inga
ersättningsfunktioner för open(), create(), osv. Så
om användaren joost antingen utför
touch foo
fakeroot
ls -al foo
eller omvänt,
fakeroot
touch foo
ls -al foo
så kan fakeroot inte på något sätt känna
till att i det första fallet så borde ägaren
för filen foo vara joost men i det senare fallet
root. När det gäller Debian-paket, så
är det alltid ok att ge alla ”okända” filer
uid=gid=0. Den korrekta lösningen på det här
problemet är att även ha en ersättningsfunktion
för open() och create(), men det skapar andra
problem, såsom paketet libtricks visar exempel på. Det
paketet har ersättningar för betydligt fler funktioner, och
försökte att göra betydligt mer än fakeroot
. Det visade sig att en smärre uppgradering av libc
(från en version där funktionen stat() inte
använde sig av open() till en version där
stat() ibland använde sig av open()), orsakade
oförklarliga krascher (dvs, stat() i libc6 anropade
ersättningsfunktionen för open(), som senare anropade
libc6 version av stat(), osv).
- GNU configure (och liknande program)
- fakeroot ändrar i praktiken hur systemet beter sig.
Program som försöker känna av systemets beteende
(exempelvis GNU configure) kan bli förvirrade av detta (och
även om de inte blir det så kan fakeroot bli
förvirrat). Därför är det inte rekommenderat
att utföra ”configure” inifrån fakeroot.
Då configure bör anropas av ”debian/rules
build”, så borde ”dpkg-buildpackage
-rfakeroot” ta hand om detta på ett korrekt
sätt.
fakeroot har ingen ersättningsfunktion för open(). Detta i sig
självt är inget fel, men om ett program utför
open("fil", O_WRONLY, 000), försöker skriva till filen
”fil”, stänger den, och sedan försöker att
läsa filen, så misslyckas detta då filen kommer att ha
rättigheterna 000. Felet består i att om en process med
root-privilegier försöker sig på det samma, så
kommer anropet till open() att lyckas, eftersom filrättigheter inte
kontrolleras alls för root. Jag valde att inte skriva
ersättningsfunktioner för open(), eftersom open() används
av många andra funktioner i libc (även de som har
ersättningsfunktioner), vilket ger upphov till cirkelreferenser eller
potential för cirkelreferenser ifall implementationen av vissa
funktioner i libc förändras).
fakeroot distribueras under GNU General Public License. (GPL 2.0 eller
senare).
- joost witteveen
- <[email protected]>
- Clint Adams
- <[email protected]>
- Timo Savola
David Weinehall <
[email protected]>
till större delen skriven av J.H.M. Dassen
<
[email protected]> med ett flertal
ändringar/tillägg av joost och Clint.
faked(1) dpkg-buildpackage(1),
debuild(1)
/usr/share/doc/fakeroot/DEBUG