Criando a imagem do cartão SD de partição dupla por um script

1

Eu tenho um sistema que gera sistemas Linux embarcados. O sistema gera três arquivos:

  • um tarball contendo rootfs excluindo os módulos do kernel
  • um tarball contendo os módulos do kernel
  • uImage

O sistema é implantado em um cartão SD de 1 GB, dos quais 10 MB são dados para uma partição de inicialização FAT e o restante para uma partição raiz ext4.

O formato de saída mais ideal para o sistema seria um arquivo de imagem que poderia ser gravado no cartão SD usando dd. No momento, esse arquivo de imagem é criado particionando e formatando o cartão SD manualmente, extraindo / copiando os arquivos e, em seguida, lendo o conteúdo do cartão usando dd. Funciona, mas o processo pode ser muito mais fácil.

Eu sei que é possível criar um sistema de arquivos de loop representando a placa, criar os sistemas de arquivos e depois extrair / copiar os arquivos neles. Eu tentei isso e funciona até certo ponto, mas não o suficiente. O problema parece estar relacionado ao particionamento e à "geometria" (como na geometria de um disco rígido, que, até onde eu sei, não deveria importar no caso de um cartão de memória) do cartão SD, como Se o particionamento deve ser específico para o modelo do cartão, mas eu não sou um especialista suficiente nessa área para dizer mais do que isso.

Qual seria a maneira correta de obter os dois tarballs e uImagem para uma imagem que poderia ser copiada no cartão SD com dd?

    
por TheAG 02.01.2018 / 09:47

1 resposta

0

Se você tiver certeza de que o cartão SD é sempre do mesmo tamanho (ou maior) que o que você realmente tem, e o 1G é suficiente para o que você deseja copiar, você pode proceder da seguinte maneira:

  1. Particione manualmente um cartão SD apropriado, mas deixe as partições vazias (mas crie os sistemas de arquivos necessários nelas)
  2. Copie todo o cartão SD (digamos, /dev/sdb ) para o seu sistema com dd if=/dev/sdb of=empty.image bs=4M
  3. Sempre que você precisar criar um novo cartão SD, copie a imagem vazia para uma nova imagem: cp empty.image new.image
  4. Agora crie um dispositivo de loop nesse arquivo: losetup -f -P new.image ( -P é importante, pois isso forçará o kernel a ler as informações da partição).

Isso criará um novo dispositivo de loop (digamos /dev/loop0 ) e as partições /dev/loop0p1.../dev/loop0pn . Estes agora podem ser montados e usados como qualquer partição "normal". Após terminar seu trabalho, ligue para losetup -d /dev/loop0 e copie a imagem criada para o seu SD usando dd if=new.image of=/dev/sdb bs=4M . Todas essas etapas podem ser removidas.

Editar:

Em vez de 2) e 3) acima:

Você também pode copiar apenas o bloco de partição (se for MBR) e manter isso ( dd if=/dev/sdb of=empty_MBR bs=512 count=1 ); então para o novo SD, cesse o arquivo vazio ( truncate -s 1G empty.file ), que é apenas um arquivo esparso (tamanho = 0), copie a tabela de partição ( dd if=empty_MBR of=empty.file ), crie o dispositivo de loop ( losetup -f -P empty.file ), formate as partições, e prossiga como mostrado acima.

Edit2:

Se você não quiser manter o pequeno arquivo MBR, também poderá usar sfdisk scripted (consulte man sfdisk ou link ). Isso significa: Crie um arquivo vazio (sa), crie um dispositivo de loop (sem partições, sem -P ), particione esse dispositivo com sfdisk , retire o dispositivo de loop, reconecte o dispositivo de loop (com partições -P ) e continue. p>     

por 02.01.2018 / 11:57