Descompacte, modifique e empacote o initrd como um usuário

4

Eu tenho um problema com a reconstrução da imagem initrd como usuário. Em primeiro lugar, quando tento "descompactar" a imagem initrd original:

cpio -idm < initrd-base 
cpio: dev/tty8: Cannot mknod: Operation not permitted
cpio: dev/tty3: Cannot mknod: Operation not permitted
cpio: dev/zero: Cannot mknod: Operation not permitted
cpio: dev/loop0: Cannot mknod: Operation not permitted
cpio: dev/loop4: Cannot mknod: Operation not permitted
cpio: dev/loop7: Cannot mknod: Operation not permitted
cpio: dev/loop5: Cannot mknod: Operation not permitted
cpio: dev/loop2: Cannot mknod: Operation not permitted
cpio: dev/tty9: Cannot mknod: Operation not permitted
cpio: dev/tty4: Cannot mknod: Operation not permitted
cpio: dev/null: Cannot mknod: Operation not permitted
cpio: dev/loop6: Cannot mknod: Operation not permitted
cpio: dev/loop1: Cannot mknod: Operation not permitted
cpio: dev/console: Cannot mknod: Operation not permitted
cpio: dev/loop3: Cannot mknod: Operation not permitted
cpio: dev/tty1: Cannot mknod: Operation not permitted
133336 blocks

Como posso me livrar desses avisos?

Em segundo lugar, não sei ao certo como a propriedade do arquivo será tratada. Depois de descompactar, parece que tudo pertence ao usuário atual.

Como o initrd vai cuidar do seu reempacotamento? Eu prefiro não alterar os direitos de acesso padrão.

    
por Dejwi 11.07.2014 / 12:48

4 respostas

0

Obrigado pelas suas respostas, elas foram úteis, mas eu descubro minha própria solução.

Recriar a imagem do initrd pode ser feito com o fakeroot-ng (e provavelmente com o fakeroot também).

A idéia básica das ferramentas para envolver todas as chamadas do sistema, então todos os programas executados dentro do fakeroot environment pensam que eles são executados por uma raiz.

Eu chamo parte do meu script dentro do ambiente fakeroot - descompacte o initramfs, faça todas as alterações e empacote novamente.

Todos os privelages estão definidos corretamente, root é o proprietário de todos os arquivos.

O fakeroot-ng está disponível em: link

    
por 04.08.2014 / 11:28
5

Como você está usando o cpio, na verdade você está fazendo um initramfs , não um initrd . Um initrd seria armazenado como uma imagem do sistema de arquivos, não como um arquivo cpio. Initrd e initramfs têm funções similares no processo de inicialização do Linux, para fornecer alguns arquivos que estão disponíveis antes do verdadeiro sistema de arquivos raiz (e que são usados para montar o verdadeiro sistema de arquivos raiz); eles são tratados de maneiras bem diferentes, mas isso não é relevante aqui. O initrd é mais antigo e um pouco depreciado em favor do initramfs. Muitos sistemas de compilação ainda usam o nome de arquivo initrd , mesmo que tenham alterado o conteúdo para um initramfs.

Imagens raiz geralmente contêm nós de dispositivos e arquivos que precisam de permissões específicas. O comando cpio pode gerar apenas um archive com base nos arquivos que existem em seu sistema de arquivos, e você precisa de permissão de root para criar nós de dispositivos ou arquivos pertencentes ao root. A origem do kernel contém uma ferramenta usr/gen_init_cpio e um script de wrapper scripts/gen_initramfs_list.sh que são fornecidos precisamente para gerar um initramfs sem ter que criar todos os arquivos no sistema de arquivos e, portanto, gerar um initramfs sem exigir nenhum privilégio. Esses programas estão documentados na árvore de fontes do kernel, em Documentation/filesystems/ramfs-rootfs-initramfs.txt e < href="https://www.kernel.org/doc/Documentation/early-userspace/README"> Documentation/early-userspace/README .

A maneira normal de criar um initramfs é descrita em ramfs-rootfs-initramfs.txt na seção “Preenchendo initramfs”. Você escreve um arquivo de texto contendo uma lista de caminhos para criar com seu tipo (diretório, regular, nó de dispositivo, etc.), permissões e outros atributos. Para arquivos regulares, você fornece o nome de um arquivo local com o conteúdo. Em seguida, execute usr/gen_init_cpio neste arquivo. Ao criar um kernel, se você definir a opção CONFIG_INITRAMFS_SOURCE como um nome de arquivo, um initramfs será gerado chamando usr/gen_init_cpio nesse arquivo.

Se você já tiver uma imagem initramfs e desejar modificá-la, use cpio -tv para listá-la e reconstrua o arquivo de descrição de ramfs com base nisso. Se possível, obtenha o arquivo de descrição initramfs da fonte original do kernel, para salvar seu trabalho. Extraia o conteúdo dos arquivos regulares somente em algum diretório. Em seguida, modifique os arquivos regulares e o arquivo de descrição de ramfs e, finalmente, execute usr/gen_init_cpio para gerar um novo initramfs.

    
por 13.07.2014 / 00:47
2

Esses erros estão lá porque o usuário não tem permissão para criar nós. Apenas o root pode criar nós diferentes de fifos e sockets (consulte a documentação do mknod em EPERM )

Quando você empacotar novamente o initrd, esses arquivos especiais não estarão lá. Para reempacotar o initrd, há uma opção chamada --owner que pode ser usada para definir o proprietário para todos os arquivos. MAS , somente o root pode usar essa opção.

A única maneira que vejo é copiar o initrd para outro sistema, onde você tem acesso root e faz as operações lá. Depois disso copie de volta.

    
por 11.07.2014 / 13:16
1

Se você precisar descompactar o initramfs e empacotá-lo novamente, poderá usar as opções -s / -i para armazenar o ambiente do fakeroot em um arquivo.

$ mkdir initrd
$ cd initrd
$ zcat ../initrd.gz | fakeroot -s ../initrd.fakeroot cpio -i

Agora você tem um arquivo com o ambiente fakeroot contendo algo assim:


dev=fe05,ino=20326044,mode=120777,uid=0,gid=0,nlink=1,rdev=0 dev=fe05,ino=20326045,mode=20664,uid=0,gid=0,nlink=1,rdev=1281 dev=fe05,ino=20326046,mode=20664,uid=0,gid=0,nlink=1,rdev=259 dev=fe05,ino=20326047,mode=100644,uid=0,gid=0,nlink=1,rdev=0

Veja os seus arquivos:

$ stat dev/console
   File: 'dev/console'
   Size: 0               Blocks: 0          IO Block: 4096   regular empty file
 Device: fe05h/65029d    Inode: 20326045    Links: 1

Eu não fui mais fundo, mas parece que você pode criar nós nesessários apenas por

$ touch <file>
$ stat <file>
$ # put info about file into your fakeroot environment with your own params

Para criar o initramfs, basta executar

$ find | fakeroot -i ../initrd.fakeroot cpio -o -H newc | gzip -c > ../initrd.gz
    
por 12.06.2016 / 13:35