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/cfdisk
meu arquivo de volume, mas mke2fs
nã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_part
no 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*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
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:
use loops ou mapeador de dispositivos em modo linear para cada partição. Você não precisa configurá-los em paralelo para formatação;
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/mapper
por padrão).usando
partprobe
losetup /dev/loopX /path/to/file partprobe /dev/loopX
que instruirá o kernel a verificar o particionamento, criando assim o arquivo
/dev/loopXpY
.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 parted
para criar as partições no dispositivo de loop ou partprobe
para ativá-las se já existirem. Pode ser necessário atualizar para a versão do parted em testes/instável.