NOME¶
fakeroot - corre um comando num ambiente onde falsifica privilégios de
root para manipulação de ficheiro
SINOPSE¶
fakeroot [-l|--lib biblioteca] [--faked
binário-falsificado ] [-i load-file]
[-s save-file] [-u|--unknown-is-real ]
[-b|--fd-base ] [-h|--help ] [-v|--version ] [--]
[comando]
DESCRIÇÃO¶
fakeroot corre um comando num ambiente onde aparenta ter
privilégios de root para manipulação de ficheiro. Isto
é útil para permitir aos utilizadores criar arquivos (tar, ar,
.deb etc.) com ficheiros dentro com permissões/posse de root. Sem o
fakeroot seria preciso ter privilégios de root para criar os
ficheiros constituintes dos arquivos com as permissões e posse actuais,
e depois empacotá-los, ou seria preciso construir os arquivos
directamente, sem usar o arquivador.
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))
Se você pretende compilar pacotes com o
fakeroot, por favor tente
primeiro compilar o pacote fakeroot: a fase "debian/rules build" tem
alguns testes (testar principalmente por bugs em antigas versões do
fakeroot). Se esses testes falharem (por exemplo porque você tem certos
programas da libc5 no seu sistema), os outros pacotes que compile com o
fakeroot irão muito provavelmente falhar também, mas
possivelmente de maneiras muito mais subtis.
Note também que, é melhor não fazer a
compilação dos próprios binários sob o fakeroot.
Especialmente o configure e "amigos" não gostam quando o
sistema subitamente comporta-se de modo diferente do que eles esperam, (ou,
eles aleatoriamente desconfiguram algumas variáveis de ambiente,
algumas das quais o fakeroot precisa).
OPÇÕES¶
- -l biblioteca, --lib biblioteca
- Especifica uma biblioteca wrapper alternativa.
- --faked binário
- Especifica um binário alternativo para usar como falsificado.
- [--] comando
- Qualquer comando que deseje corre como fakeroot. Use ‘--’ se
no comando você tem outras opções que podem confundir
a análise de opções do fakeroot.
- -s save-file
- Guarda o ambiente do fakeroot para o save-file ao sair. Este ficheiro pode
ser usado para restaurar o ambiente mais tarde usando -i. No entanto, este
ficheiro irá ter fugas e o fakeroot irá comportar-se com
modos estranhos a menos que você deixe os ficheiros que foram
"mexidos" dentro do fakeroot, isolados e inalterados quando fora
do ambiente. Mesmo assim, isto pode ser útil. Por exemplo, pode ser
usado com o rsync(1) para salvaguardar e restaurar árvores de
directórios inteiras com informações de utilizador,
grupo e dispositivo sem a necessidade de ser root. Veja
/usr/share/doc/fakeroot/README.saving para mais detalhes.
- -i load-file
- Carrega um ambiente do fakeroot previamente guardado usando -s a partir de
load-file. Note que isto não salva implicitamente o ficheiro, use
-s também para esse comportamento. E seguro usar o mesmo ficheiro
para ambos -i e -s numa única invocação do
fakeroot.
- -u, --unknown-is-real
- Usa a posse real dos ficheiros anteriormente desconhecida para o fakeroot
em vez de fingir que eles são posse de root:root.
- -b fd
- Especifica a base fd (modo TCP apenas). O fd é o número
descritor de ficheiro mínimo usado para ligações TCP;
isto pode ser importante para evitar conflitos com os descritores de
ficheiro usados pelos programas que correm sob o fakeroot.
- -h
- Mostra a ajuda.
- -v
- Mostra a versão.
EXEMPLOS¶
Aqui está uma sessão exemplo com o
fakeroot. Note que
dentro do ambiente de root falso a manipulação de ficheiro que
requer privilégios de root tem sucesso, mas na realidade não
está a acontecer.
$ 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
Apenas os efeitos que o utilizador
joost podia fazer aconteceram de
verdade.
fakeroot foi especificamente escrito para permitir aos utilizadores
criarem pacotes Debian GNU/Linux (no formato
deb(5)) sem lhes dar
privilégios de root. Isto pode ser feito por comandos como
dpkg-buildpackage -rfakeroot ou
debuild -rfakeroot (na
realidade, -rfakeroot é predefinição no debuild nos dias
que correm, por isso você não precisa desse argumento).
ASPECTOS DE SEGURANÇA¶
fakeroot é um programa regular, não-setuid. Não
aumenta os privilégios do utilizador nem baixa a segurança do
sistema.
FICHEIROS¶
/usr/lib/*/libfakeroot-*.so The shared library containing the wrapper
functions.
AMBIENTE¶
- FAKEROOTKEY
- A chave usada para comunicar com o daemon do fakeroot. Qualquer programa
arrancado com o LD_PRELOAD correcto e um FAKEROOTKEY de um
daemon em execução irá ligar-se automaticamente a
esse daemon, e terá a mesma visão "falsa" das
permissões/propriedades do sistema de ficheiros. (assumindo que o
daemon e o programa que se liga foram arrancados pelo mesmo
utilizador).
- LD_LIBRARY_PATH
- LD_PRELOAD
- Fakeroot é implementado ao envolver chamadas do sistema. Isto
é conseguido ao definir LD_LIBRARY_PATH=/usr/lib/fakeroot e
LD_PRELOAD=libfakeroot.so.0. Essa biblioteca é carregada antes da
biblioteca C do sistema, e assim a maioria das funções da
biblioteca são interceptadas por ela. Você precisa de
definir ou LD_LIBRARY_PATH ou LD_PRELOAD de dentro de um
ambiente fakeroot, deverá ser definido em relação aos
caminhos fornecidos, como em
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/foo/bar/
LIMITAÇÕES¶
- Versões de biblioteca
- Cada comando executado dentro do fakeroot precisa de ser ligado por
link à mesma versão de biblioteca C do próprio
fakeroot.
- open()/create()
- O fakeroot não envolve o open(), create(), etc. Então, se o
utilizador joost também o fizer
touch foo
fakeroot
ls -al foo
ou do outro modo contrário,
fakeroot
touch foo
ls -al foo
No primeiro caso o fakeroot não tem maneira de saber isso, o dono de
foo deverá realmente ser joost enquanto no segundo caso
deveria ter sido root. Para o empacotamento de Debian, a
predefinição de dar a todos os ficheiros
"desconhecidos" uid=gid=0, está sempre OK. A maneira real
para contornar isto é envolver open() e create(), mas
isso cria outros problemas, como demonstrado pelo pacote libtricks. Este
pacote envolvia muitas mais funções, e tentava fazer muito
mais do que o fakeroot .. Aconteceu que uma
actualização menor da libc (de um caso em que a
função stat() não usava open() para um
com uma função stat() que usava (em alguns casos)
open()), veio a causar falhas de segmentação
inexplicáveis (isto é, o stat() da libc6 chamava o
open() envolvido, o qual iria então chamar a stat()
da libc6, etc.). Corrigir isto não foi lá muito
fácil, mas após corrigido, foi apenas uma questão de
tempo antes de outra função passar a usar open(), e
esqueçam de tentar portá-lo para outro sistema operativo
diferente. Assim Eu decidi manter o número de funções
envolvidas pelo fakeroot o mais pequeno possível, para limitar a
possibilidade de ‘colisões’.
- configure do GNU (e outros programas como tal)
- O fakeroot, efectivamente, está a alterar o modo como o sistema se
comporta. Programas que sondam o sistema como o configure do GNU podem
ficar confusos por isto (ou se não ficarem, podem
"stressar" o fakeroot tanto que o próprio fakeroot possa
ficar confuso). Portanto, é aconselhável não correr o
"configure" de dentro do fakeroot. Como o configure
deverá ser chamado na meta "debian/rules build", correr
"dpkg-buildpackage -rfakeroot" actualmente toma conta
disto.
BUGS¶
Não envolve open(). Isto não e mau por si próprio, mas se
um programa fizer open("file", O_WRONLY, 000), escrever no ficheiro
"file" e o fechar, e depois tentar abri-lo para ler o ficheiro,
então essa abertura vai falhar, pois o modo do ficheiro será
000. O bug é tal que se o root fizer o mesmo, open() irá ter
sucesso, pois as permissões não são verificadas para o
root. Eu escolhi não envolver open(), pois open() é usado por
muitas outras funções na libc (mesmo aquelas que já
estão envolvidas), assim criando ciclos viciosos (ou possíveis
ciclos futuros, quando a implementação de várias
funções da libc mudarem ligeiramente).
COPIAR¶
fakeroot é distribuído sob a GNU General Public License.
(GPL 2.0 ou superior).
AUTORES¶
- joost witteveen
- <joostje@debian.org>
- Clint Adams
- <clint@debian.org>
- Timo Savola
TRADUTOR¶
Américo Monteiro <a_monteiro@gmx.com>
PÁGINA DE MANUAL¶
a maioria por J.H.M. Dassen <jdassen@debian.org> Bastantes
modificações/adições por joost e Clint.
VEJA TAMBÉM¶
faked(1)
dpkg-buildpackage(1),
debuild(1)
/usr/share/doc/fakeroot/DEBUG