Como posso particionar um volume em um arquivo regular sem loop?

5

Estou tentando brincar com o desenvolvimento do sistema operacional e comecei com um gerenciador de inicialização, onde a fase 0 carrega a fase 1 de um arquivo (especificado pelo inode) em uma partição ext4 (especificada pelo primeiro LBA). Claro, eu preciso de algo para inicializar, então eu peguei o QEMU. E agora?

O que funcionou bem até agora é este:

truncate -s64M /tmp/SomeVolume
/sbin/mke2fs -t ext4 -F /tmp/SomeVolume
yasm phase0.asm
dd if=phase0 of=/tmp/SomeVolume conv=notrunc

Eu faço um volume de cerca de 64 MB, formato como ext4 e sobrescrevo os primeiros 1024 octetos com phase0 (que tem sempre 1024 bytes de tamanho). Isso funciona bem.

Mas agora eu quero fazer um arquivo particionado corretamente, para testá-lo em cenários mais realistas. Eu sei que eu poderia /sbin/cfdisk meu arquivo de volume, mas mke2fs não tem um parâmetro que me permite escolher um intervalo dentro do arquivo.

Agora estou ciente das soluções que usam o loop , mas infelizmente isso não parece funcionar para mim (parece que não consigo alterar max_part no Debian jessie). Parece haver um outro módulo chamado nbd , mas eu não tenho o servidor e o cliente para esse módulo instalado. E está ficando um pouco ridículo que eu precise de privilégios de root para algo que poderia ser feito claramente na userland.

Como posso fazer isso como usuário? Ou devo apenas construir o volume particionado por MBR / GPT em torno do arquivo formatado em ext4 que eu criei?

    
por Rhymoid 08.10.2013 / 16:51

4 respostas

3

O caminho mais longo. Mas para se divertir:

1. Crie uma imagem temporária:

    $ truncate -s64MiB tmp.img

2. Crie duas partições usando fdisk :

Um pouco detalhado, mas OK.

$ fdisk tmp.img

Primeira partição:

: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>

Segunda partição:

: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)

Imprima o que estamos prestes a escrever:

: x
: p
Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start      Size ID
 1 00  32  33    0  57  52    5       2048      81920 83
 2 00  57  53    5  40  32    8      83968      47104 83

Escreva e saia:

:w (Dont! forget ;-) )

Temos duas partições de 40 e 23 MiB:

81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB

3. Crie dois sistemas de arquivos:

truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img

4. Costure tudo junto:

Extraia primeiro 2048*512 bytes da imagem temporária:

dd if=tmp.img of=disk.img bs=512 count=2048

Combine-os:

cat ext4.img ext3.img >> disk.img

Bem.

    
por 08.10.2013 / 18:38
2

Eu não tenho certeza se entendi corretamente sua pergunta. Se você está tentando particionar a imagem da VM, você tem várias opções:

  1. use loops ou mapeador de dispositivo no modo linear para cada partição. Você não precisa ter essas configurações em paralelo para formatação;

  2. partx / kpartx para dizer ao kernel quais partições ele deve considerar em um dispositivo de mapeamento de loop / dispositivo ou até mesmo um arquivo regular:

    kpartx -av /path/to/file
    

    ou

    losetup /dev/loopX /path/to/file
    kpartx -av /dev/loopX
    

    Os dispositivos são dispositivos de mapeamento de dispositivos (isto é, vinculados a /dev/mapper por padrão).

  3. usando partprobe

    losetup /dev/loopX /path/to/file
    partprobe /dev/loopX
    

    que instruirá o kernel a verificar o particionamento, criando assim /dev/loopXpY .

  4. inicialize a imagem de CD / USB ao vivo (pode ser um instalador) na VM e faça o particionamento de dentro. Isso tem a vantagem óbvia de poder particionar o disco virtual mesmo para imagens de VM armazenadas em formatos especiais (como o qcow2 do QEMU, por exemplo).

por 08.10.2013 / 17:06
1

link

Parece ter alguma informação sobre isso. Parece que você pode montar o disco bruto como um dispositivo de loopback:

Monte sua imagem de disco bruta como um dispositivo de loopback: losetup /dev/loop0 [path to image]

Execute o kpartx e: kpartx -va /dev/loop0

Isto irá adicionar suas partições para / dev / mapper / loop0pX onde cada X é uma partição diferente

Agora você pode montar cada partição: mount /dev/mapper/loop0pX /media/partition

Se você quiser ter certeza de não escrever nada no seu backup, simplesmente monte-o como somente leitura: mount -o ro /dev/mapper/loop0pX /media/partition

Quando você terminar, precisará fazer a limpeza.

Desmontar: umount /media/partition Remova os dispositivos mapeadores: kpartx -d /dev/loop0 Remova o dispositivo de loopback: losetup -d /dev/loop0

Esses comandos podem todos precisar ser executados como root. Se loop0 informar que está ocupado, basta escolher outro dispositivo de loop (/ dev / loop1, ect).

-edit: Eu vejo que você quer fazer isso não-root, então o que foi mencionado acima pode não ser útil para você.

    
por 09.10.2013 / 13:12
0

Você não precisa mexer com max_part. Use parted para criar as partições no dispositivo de loop ou partprobe para ativá-las, se elas já existirem. Você pode precisar atualizar para a versão do parted em testing / unstable.

    
por 08.10.2013 / 19:46