¿Cómo puedo particionar un volumen en un archivo normal sin bucle?

¿Cómo puedo particionar un volumen en un archivo normal sin bucle?

Estoy tratando de jugar con el desarrollo del sistema operativo y comencé con un cargador de arranque, donde la fase 0 carga la fase 1 desde un archivo (especificado por inodo) en una partición ext4 (especificada por el primer LBA). Por supuesto, necesito algo desde donde arrancar, así que tomé QEMU. ¿Ahora que?

Lo que ha funcionado bien hasta ahora es esto:

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

Hago un volumen de aproximadamente 64 MB, lo formateo como ext4 y sobrescribo los primeros 1024 octetos con fase0 (que siempre tiene un tamaño de 1024 bytes). Esto funciona bien.

Pero ahora quiero crear un archivo particionado correctamente para probarlo en escenarios más realistas. Sé que podría /sbin/cfdiskmi archivo de volumen, pero mke2fsno tengo un parámetro que me permita elegir un intervalo dentro del archivo.

Ahora soy consciente desoluciones usando bucle, pero desafortunadamente, no parece funcionar para mí (parece que no puedo cambiar max_parten Debian jessie). Parece serotro módulo llamadonbd, pero no tengo instalados el servidor y el cliente para ese módulo. Y se está volviendo un poco ridículo que necesite privilegios de root para algo que claramente se puede hacer en el país de usuario.

¿Cómo puedo hacer esto como usuario? ¿O debería simplemente crear el volumen particionado con MBR/GPT alrededor del archivo con formato ext4 que creé?

Respuesta1

El camino más largo. Pero por diversión:

1.Crea una imagen temporal:

    $ truncate -s64MiB tmp.img

2.Crea dos particiones usando fdisk:

Bastante detallado, pero está bien.

$ fdisk tmp.img

Primera partición:

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

Segunda partición:

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

Imprime lo que estamos a punto de escribir:

: 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

Escribir y salir:

:w (Dont! forget ;-) )

Disponemos de dos particiones de 40 y 23 MiB:

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

3.Cree dos sistemas de archivos:

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.Coserlo todo junto:

Extraiga los primeros 2048*512bytes de la imagen temporal:

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

Combínalos:

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

Bien.

Respuesta2

No estoy realmente seguro de haber entendido correctamente su pregunta. Si está intentando particionar la imagen de la máquina virtual, tiene varias opciones:

  1. utilice bucles o asignador de dispositivos en modo lineal para cada partición. No es necesario configurarlos en paralelo para formatear;

  2. partx/kpartxpara decirle al kernel qué particiones debe considerar en un bucle/dispositivo asignador de dispositivos o incluso en un archivo normal:

    kpartx -av /path/to/file
    

    o

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

    Los dispositivos son dispositivos mapeadores de dispositivos (es decir, vinculados desde /dev/mapperforma predeterminada).

  3. usandopartprobe

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

    lo que le indicará al kernel que verifique la partición y, por lo tanto, creará /dev/loopXpY.

  4. inicie la imagen de CD/USB en vivo (puede ser un instalador) en la máquina virtual y realice la partición desde dentro. Esto tiene la ventaja obvia de poder particionar la unidad virtual incluso para imágenes de VM almacenadas en formatos especiales (como qcow2 de QEMU, por ejemplo).

Respuesta3

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

Parece tener alguna información sobre esto. Parece que puedes montar el disco sin formato como un dispositivo de loopback:

Monte su imagen de disco sin formato como un dispositivo loopback:losetup /dev/loop0 [path to image]

Ejecute kpartx y:kpartx -va /dev/loop0

Esto agregará sus particiones a /dev/mapper/loop0pX donde cada X es una partición diferente

Ahora puedes montar cada partición:mount /dev/mapper/loop0pX /media/partition

Si desea asegurarse de no escribir nada en su copia de seguridad, simplemente móntela como de solo lectura:mount -o ro /dev/mapper/loop0pX /media/partition

Una vez que haya terminado, deberá hacer la limpieza.

Desmontar: umount /media/partition Quitar los dispositivos asignadores: kpartx -d /dev/loop0 Quitar el dispositivo loopback:losetup -d /dev/loop0

Es posible que todos estos comandos deban ejecutarse como root. Si loop0 informa que está ocupado, simplemente elija otro dispositivo de bucle (/dev/loop1, etc.).

-editar: Veo que quieres hacer esto sin ser root, por lo que es posible que lo anterior no te resulte útil.

Respuesta4

No necesitas meterte con max_part. Úselo partedpara crear las particiones en el dispositivo de bucle o partprobepara activarlas si ya existen. Es posible que necesites actualizar a la versión de parted en testing/inestable.

información relacionada