Crie um dispositivo de bloco na RAM

4

Uma das tarefas do dia-a-dia é criar uma imagem inicializável de um pendrive USB com o nosso software. A imagem deve consistir em duas partições, primeiro uma formatada com FAT32 e outra com EXT3. No primeiro colocamos o kernel do Linux e um pequeno script de inicialização que o bootloader no dispositivo que vamos inicializar com leituras na inicialização.

Na segunda partição, colocamos nossos rootfs.

Agora, aqui está como eu faço:

  1. insira um pendrive USB na minha composição do Linux. Descobrir seu arquivo de dispositivo (aqui vamos supor / dev / sdx)

  2. zere os primeiros 600 MB dele: dd se = / dev / zero de = / dev / sdx bs = contagem de 1M = 600

  3. Crie as duas partições, primeiro 10 MB e as segundas 500 MB: sfdisk / dev / sdx - unidade S < EOF 20000, c , 1000000, 83 EOF

    mkfs.vfat / dev / sdx1 mkfs.ext3 / dev / sdx2

(supondo que o tamanho do setor seja de 512 bytes!)

  1. copie o kernel e o script de inicialização para / dev / sdx1
  2. Descompacte o RootFS pré-compilado em / dev / sdx2
  3. Copie a imagem pronta do pendrive USB de volta para o nosso disco rígido: dd if = / dev / sdx de = usb.img bs = contagem de 1M = 520
  4. Compacte e envie para as pessoas que testam este software.
  5. as pessoas então descompactam, exibem seus discos USB com dd if = usb.img de = / dev / sdx inserir em seus dispositivos e testar.

Agora, tudo isso funciona. A melhoria óbvia é criar um script que faça tudo isso automaticamente. Isso também pode ser feito, mas uma etapa manual ainda permanecerá: insira o pendrive USB.

Eu estou pensando em vez do disco USB real que poderíamos usar um dispositivo de bloco na RAM. Isso não apenas eliminaria a etapa manual de inserir o disco USB, mas também seria mais rápido.

Então, o que eu preciso é de um dispositivo de bloco simples na RAM. Um que pode ser dividido em partições como um pendrive USB físico.

Eu apenas pesquisei este tópico e parece que as únicas opções são

  1. tmpfs e ramfs, o que obviamente não combina comigo
  2. ramdisk e o módulo do kernel 'brd', que, quando carregado, cria um número de 'partições': / dev / ram [0-15]

e cada um deles pode ser formatado e usado individualmente, mas como eu disse - eu quero um dispositivo de bloco simples na RAM que eu dividiria em duas partições de 10MB e 500MB, e de onde eu seria capaz de dd uma imagem para um arquivo no meu disco rígido.

Quais são minhas opções?

    
por Leszek 17.08.2015 / 15:58

1 resposta

11

Apenas use o brd e crie um dispositivo brd (ram0). Use esse dispositivo no lugar do seu drive USB. Você pode particioná-lo usando o sfdisk, usar as partições e, em seguida, usar o dd para despejar seu conteúdo no arquivo.

Não há necessidade de usar um sistema de arquivos por dispositivo brd.

Ou (embora pouco hacky) você pode usar tmpfs, criar arquivo de imagem e usá-lo como dispositivo de loop. Essa pode ser a maneira mais fácil de realizar o que você deseja. Como bônus, você tem essa imagem pronta e pode enviá-la imediatamente. Não há necessidade de dd.

# Create mountpoint for tmpfs
mkdir /tmp/tmpfs
# Mount tmpfs there
mount -t tmpfs none /tmp/tmpfs
# Create empty file of 600MB 
# (it creates 599MB hole, so it does not 
#  consume more memory than needed)
dd if=/dev/zero of=/tmp/tmpfs/img.bin bs=1M seek=599 count=1
# Partition the image file
cfdisk /tmp/tmpfs/img.bin 
# Create loop block device of it (-P makes kernel look for partitions)
losetup -P /dev/loop0 /tmp/tmpfs/img.bin 
# Create filesystems
mkfs.vfat /dev/loop0p1 
mkfs.ext4 /dev/loop0p2
# Now it's your turn:
#   mount loop0p1 and loop0p2 and copy whatever you want and unmount it
# detach the loop device
losetup -d /dev/loop0
# May i present you with your image ... 
ls -al /tmp/tmpfs/img.bin

Modifique para atender às suas necessidades.

    
por 17.08.2015 / 16:10

Tags