fakeroot(1) Manual Debian fakeroot(1) NOME fakeroot - corre um comando num ambiente onde finge privilegios de root para manipulacao de ficheiro SINOPSE fakeroot [-l|--lib biblioteca] [--faked binario-falsificado] [-i load-file] [-s save-file] [-u|--unknown-is-real ] [-b|--fd-base ] [-h|--help ] [-v|--version ] [--] [comando] DESCRICAO fakeroot corre um comando num ambiente onde aparenta ter privilegios de root para manipulacao de ficheiros. Isto e util para permitir aos utilizadores criar arquivos (tar, ar, .deb etc.) com ficheiros dentro com permissoes/posse de root. Sem o fakeroot seria preciso ter privilegios de root para criar os ficheiros constituintes dos arquivos com as permissoes e posse atuais, e depois empacota-los, ou seria preciso construir os arquivos diretamente, sem usar o arquivador. fakeroot funciona ao substituir as funcoes da biblioteca de manipulacao de ficheiros (chmod(2), stat(2) etc.), por outras que simulam o efeito que teriam as funcoes da biblioteca real, caso o utilizador fosse realmente o root. Estas funcoes envolventes estao numa biblioteca partilhada /usr/lib/*/libfakeroot-*.so ou localizacao semelhante na sua plataforma. O objecto partilhado e carregado atraves do mecanismo LD_PRELOAD do carregador dinamico. (Veja ld.so(8)) Se voce 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 versoes do fakeroot). Se esses testes falharem (por exemplo porque voce tem certos programas da libc5 no seu sistema), os outros pacotes que compilem com o fakeroot irao muito provavelmente falhar tambem, mas possivelmente de maneiras muito mais subtis. Note tambem que, e melhor nao fazer a compilacao dos proprios binarios sob o fakeroot. Especialmente o configure e "amigos" nao gostam quando o sistema subitamente se comporta de modo diferente do que eles esperam, (ou, eles desconfiguram aleatoriamente algumas variaveis de ambiente, algumas das quais o fakeroot necessita). OPCOES -l biblioteca, --lib biblioteca Especifica uma biblioteca wrapper alternativa. --faked binario Especifica um binario alternativo para usar como fingido. [--] comando Qualquer comando que deseje corre como fakeroot. Use `--' se no comando voce tem outras opcoes que podem confundir a analise de opcoes 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 ira ter fugas e o fakeroot ira comportar-se de modo estranho a menos que voce deixe os ficheiros que foram "mexidos" dentro do fakeroot, isolados e inalterados quando fora do ambiente. Mesmo assim, isto podera ser util. Por exemplo, pode ser usado com o rsync(1) para salvaguardar e restaurar arvores de diretorios inteiras com informacoes 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 nao salva implicitamente o ficheiro, use -s tambem para esse comportamento. E seguro usar o mesmo ficheiro para ambos -i e -s numa unica invocacao do fakeroot. -u, --unknown-is-real Usa a posse real dos ficheiros anteriormente desconhecida para o fakeroot em vez de fingir que eles sao posse de root:root. -b fd Especifica a base fd (apenas modo TCP). O fd e o numero descritor de ficheiro minimo usado para ligacoes 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 versao. EXEMPLOS Aqui esta uma sessao exemplo com o fakeroot. Note que dentro do ambiente fingido de root a manipulacao de ficheiro que requer privilegios de root tem sucesso, mas na realidade nao esta 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 privilegios de root. Isto pode ser feito por comandos como dpkg-buildpackage -rfakeroot ou debuild -rfakeroot (na realidade, -rfakeroot e predefinicao no debuild nos dias que correm, por isso voce nao precisa desse argumento). ASPECTOS DE SEGURANCA fakeroot e um programa normal, nao-setuid. Nao aumenta os privilegios do utilizador nem baixa a seguranca do sistema. FICHEIROS /usr/lib/*/libfakeroot-*.so A biblioteca partilhada que contem as funcoes wrapper. AMBIENTE FAKEROOTKEY A chave usada para comunicar com o daemon do fakeroot. Qualquer programa arrancado com o LD_PRELOAD correto e um FAKEROOTKEY de um daemon em execucao ira ligar-se automaticamente a esse daemon, e tera a mesma visao "falsa" das permissoes/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 e implementado ao envolver chamadas do sistema. Isto e conseguido ao definir LD_LIBRARY_PATH=/usr/lib/fakeroot e LD_PRELOAD=libfakeroot.so.0. Essa biblioteca e carregada antes da biblioteca C do sistema, e assim a maioria das funcoes da biblioteca sao interceptadas por ela. Voce precisa de definir ou LD_LIBRARY_PATH ou LD_PRELOAD de dentro de um ambiente fakeroot, devera ser definido em relacao aos caminhos fornecidos, como em LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/foo/bar/ LIMITACOES Versoes de biblioteca Cada comando executado dentro do fakeroot precisa de ser ligado por link a mesma versao de biblioteca C do proprio fakeroot. open()/create() O fakeroot nao envolve o open(), create(), etc. Entao, se o utilizador joost tambem o fizer touch foo fakeroot ls -al foo ou do outro modo contrario, fakeroot touch foo ls -al foo No primeiro caso o fakeroot nao tem maneira de saber isso, o dono de foo devera realmente ser joost enquanto no segundo caso deveria ter sido root. Para o empacotamento de Debian, a predefinicao de dar a todos os ficheiros "desconhecidos" uid=gid=0, esta sempre OK. A maneira real para contornar isto e envolver open() e create(), mas isso cria outros problemas, como demonstrado pelo pacote libtricks. Este pacote envolvia muitas mais funcoes, e tentava fazer muito mais do que o fakeroot .. Aconteceu que uma actualizacao menor da libc (de um caso em que a funcao stat() nao usava open() para um com uma funcao stat() que usava (em alguns casos) open()), veio a causar falhas de segmentacao inexplicaveis (isto e, o stat() da libc6 chamava o open() envolvido, o qual iria entao chamar a stat() da libc6, etc.). Corrigir isto nao foi la muito facil, mas apos corrigido, foi apenas uma questao de tempo antes de outra funcao passar a usar open(), e esquecam de tentar porta-lo para outro sistema operativo diferente. Assim Eu decidi manter o numero de funcoes envolvidas pelo fakeroot o mais pequeno possivel, para limitar a possibilidade de `collisions'. configure do GNU (e outros programas como tal) O fakeroot, efectivamente, esta a alterar o modo como o sistema se comporta. Programas que testam o sistema como o configure do GNU podem ficar confusos por isto (ou se nao ficarem, podem "stressar" o fakeroot tanto que o proprio fakeroot possa ficar confuso). Portanto, e aconselhavel nao correr o "configure" de dentro do fakeroot. Como o configure devera ser chamado na meta "debian/rules build", correr "dpkg-buildpackage -rfakeroot" actualmente toma conta disto. BUGS Nao envolve open(). Isto nao e mau por si proprio, 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, entao essa abertura vai falhar, pois o modo do ficheiro sera 000. O bug e tal que se o root fizer o mesmo, open() ira ter sucesso, pois as permissoes nao sao verificadas para o root. Eu escolhi nao envolver open(), pois open() e usado por muitas outras funcoes na libc (mesmo aquelas que ja estao envolvidas), assim criando ciclos viciosos (ou possiveis ciclos futuros, quando a implementacao de varias funcoes da libc mudarem ligeiramente). COPIAR fakeroot e distribuido sob a GNU General Public License. (GPL 2.0 ou superior). AUTORES joost witteveen Clint Adams Timo Savola TRADUTOR Americo Monteiro PAGINA DE MANUAL a maioria por J.H.M. Dassen Bastantes modificacoes/adicoes por joost e Clint. VEJA TAMBEM faked(1) dpkg-buildpackage(1), debuild(1) /usr/share/doc/fakeroot/DEBUG Projecto Debian 5 de Outubro de 2014 fakeroot(1)