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/cfdisk
mi archivo de volumen, pero mke2fs
no 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_part
en 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*512
bytes 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:
utilice bucles o asignador de dispositivos en modo lineal para cada partición. No es necesario configurarlos en paralelo para formatear;
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/mapper
forma predeterminada).usando
partprobe
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
.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 parted
para crear las particiones en el dispositivo de bucle o partprobe
para activarlas si ya existen. Es posible que necesites actualizar a la versión de parted en testing/inestable.