clone árvore de diretórios raiz usando o busybox

2

Eu tenho um sistema baseado em TI DaVinci (arquitetura ARM parecida com OMAP) que netboots usando TFTP e sistema de arquivos raiz montado NFS, e estou tentando fazê-lo inicializar sozinho sem um servidor netboot.

A abordagem básica é copiar a imagem do kernel para o flash NAND e o sistema de arquivos raiz para um disco SATA conectado (NAND flash não é grande o suficiente para todo o sistema), então configure o u-boot para carregar o kernel de NAND flash e passe um argumento root= apropriado.

Estou preso na etapa de copiar o sistema de arquivos. Esta questão é relevante, mas nenhuma das recomendações funciona porque tenho somente as versões do busybox das ferramentas cp e cpio e a opção --one-file-system não são suportadas pelo busybox.

Como posso clonar o sistema de arquivos raiz quando só tenho os recursos de ferramenta fornecidos pelo busybox? Ajudaria a executar comandos de criação de arquivo no servidor NFS (arquitetura x64 executando o Ubuntu) e então descompactar no destino?

    
por Ben Voigt 30.07.2013 / 21:40

3 respostas

1

O find do BusyBox suporta a opção -xdev , então você pode fazer um arquivo cpio do sistema de arquivos raiz dessa forma. Ao contrário do tar, o cpio não arquiva o conteúdo de um diretório quando arquiva esse diretório.

find . -xdev | cpio -H newc -o |
{ cd /mnt && cpio -m -i; }

Eu não entendo muito bem porque você está construindo a imagem a partir de um dispositivo. Eu esperaria construir uma imagem do sistema de arquivos usando seus scripts de construção em uma máquina de desenvolvimento e implantar essa imagem.

    
por 31.07.2013 / 02:41
1

Acho que você seria capaz de fazer o que quiser usando cp . Do site do busybox.net :

cp
Usage: cp [OPTION]... SOURCE DEST

           or: cp [OPTION]... SOURCE... DIRECTORY

Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

Options:

            -a      Same as -dpR
            -d      Preserve links
            -p      Preserve file attributes if possible
            -R      Copy directories recursively

Exemplo

$ cp -a / /mnt/newroot

tar

Se cp não puder manipular nenhum dispositivo como /dev/zero , tenho certeza de que não é possível usar tar , que também está incluído no BusyBox.

$ (cd /; tar cf - .)|(cd /mnt/newroot; tar pxvf -)
    
por 30.07.2013 / 21:57
1

Parece que o uso de ferramentas com excesso de caixa de tarefas para isso é muito mais problemático do que vale a pena, porque o processamento de um único sistema de arquivos é realmente necessário para isso e está ausente do busybox cp . Possivelmente find poderia ser usado para copiar arquivos individualmente e evitar recursões em pontos de montagem, mas isso envolveria muitos processos individuais e seria muito lento.

Preparar o sistema de arquivos no servidor NFS é uma alternativa muito mais viável. Calcule o tamanho da partição em bytes usando fdisk -l e, em seguida,

truncate -s N the-root-image
mkf.ext3 the-root-image
sudo mount -o loop the-root-image /mnt/somewhere

Agora copie o conteúdo usando este comando encontrado na pergunta vinculada

sudo rsync --archive --inplace --hard-links --acls --xattrs --devices --specials --one-file-system --8-bit-output --human-readable --progress path/to/nfs/share /mnt/somewhere

Coloque a imagem em um local de rede onde o destino possa acessá-la:

sudo umount /mnt/somewhere
mv the-root-image path/to/nfs/share

Finalmente, a partir do local de destino, a imagem no disco de destino

dd if=/the-root-image of=/dev/sda1 bs=16M
    
por 30.07.2013 / 23:28