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

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

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, preciso de algo para inicializar, então peguei o QEMU. O que agora?

O que funcionou bem até agora é o seguinte:

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

Eu crio um volume de cerca de 64 MB, formato-o como ext4 e sobrescrevo os primeiros 1.024 octetos por phase0 (que sempre tem 1.024 bytes de tamanho). Isso funciona bem.

Mas agora quero criar um arquivo particionado adequadamente, para testá-lo em cenários mais realistas. Eu sei que poderia usar /sbin/cfdiskmeu arquivo de volume, mas mke2fsnão tem um parâmetro que me permita escolher um intervalo dentro do arquivo.

Agora estou cientesoluções usando loop, mas infelizmente parece não funcionar para mim (parece que não consigo mudar max_partno Debian jessie). Parece haveroutro módulo chamadonbd, mas não tenho o servidor e o cliente desse módulo instalados. E está ficando um pouco ridículo que eu precise de privilégios de root para algo que poderia claramente ser feito na área do usuário.

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

Responder1

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:

Bastante 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 vamos 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 os primeiros 2048*512bytes da imagem temporária:

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

Combine-os:

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

Multar.

Responder2

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

  1. use loops ou mapeador de dispositivos em modo linear para cada partição. Você não precisa configurá-los em paralelo para formatação;

  2. partex/kpartxpara informar ao kernel quais partições ele deve considerar em dispositivos mapeadores de loop/dispositivo ou até mesmo em um arquivo normal:

    kpartx -av /path/to/file
    

    ou

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

    Os dispositivos são dispositivos mapeadores de dispositivos (ou seja, vinculados /dev/mapperpor padrão).

  3. usandopartprobe

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

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

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

Responder3

http://blog.lifebloodnetworks.com/?p=934

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 kpartx e:kpartx -va /dev/loop0

Isto irá adicionar suas partições a /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 gravar nada em seu backup, basta montá-lo como somente leitura:mount -o ro /dev/mapper/loop0pX /media/partition

Quando terminar, você 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

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

-edit: Vejo que você deseja fazer isso sem root, então o que foi dito acima pode não ser útil para você.

Responder4

Você não precisa mexer com max_part. Use partedpara criar as partições no dispositivo de loop ou partprobepara ativá-las se já existirem. Pode ser necessário atualizar para a versão do parted em testes/instável.

informação relacionada