¿Cómo puedo manipular un file de tabla de partición sin que fdisk compruebe su validez?

Estoy creando una image en la memory (/ tmp es un tmpfs):

$ dd if=/dev/zero of=/tmp/sdcard.img bs=512 count=3147775 

Se supone que debe contener una tabla de particiones y las primeras 3 particiones de un dispositivo

 $ losetup /dev/loop0 /tmp/sdcard.img $ dd if=bootloader.img of=/dev/loop0 bs=512 

Los primeros 2048 sectores contienen una tabla de particiones.

 $ fdisk -l /tmp/sdcard.img Disk /dev/loop0: 1.5 GiB, 1611660800 bytes, 3147775 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x0000de21 Device Boot Start End Sectors Size Id Type /dev/loop0p1 2048 1050623 1048576 512M c W95 FAT32 (LBA) /dev/loop0p2 1050624 2099199 1048576 512M 83 Linux /dev/loop0p3 2099200 3147775 1048576 512M 83 Linux 

Pero tengo un problema.

Quiero agregar una cuarta partición / dev / loop0p4, que comienza en 3147775 y termina en 37748724.

No quiero crear físicamente la partición, pero quiero modificar la tabla de particiones para que crea que existe esta unidad.

Sin embargo, cuando uso fdisk para este propósito, se queja del Value out of range.

¿Cómo puedo forzar a fdisk a hacerlo? No me importa que la tabla de particiones no sea válida. Voy a enviar esto a un disco más grande y luego formatearlo más tarde. Me gustaría que la tabla de parición sea parte de lo que hice con ese disco más grande (hay motivos para esto, preferiría no profundizar en esos detalles). Todo lo que quiero saber es cómo puedo escribir una tabla de partición con estos valores arbitrarios sin tener que sacar el editor hexadecimal.

Puede crear un file tan grande o pequeño como desee, especialmente en un linux tmpfs.

 df -h /tmp 

 Filesystem Size Used Avail Use% Mounted on tmpfs 12G 472K 12G 1% /tmp 

Podemos hacer un file disperso.

 for cmd in \ 'dd bs=1024k seek=20k of=' \ 'ls -slh ' do eval "$cmd/tmp/file" echo done </dev/null 

 0+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000152051 s, 0.0 kB/s 0 -rw-r--r-- 1 mikeserv mikeserv 20G Dec 24 20:19 /tmp/file 

¿Ver? Está usando 0 bloques de espacio en disco, pero su tamaño aparente es de 20 gigabytes.

A continuación, puede simplemente fdisk /tmp/file . Acabo de crear una tabla de particiones en ella. Aquí está fdisk -l :


 Disk /tmp/file: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x057d787a Device Boot Start End Sectors Size Id Type /tmp/file1 2048 20973567 20971520 10G 83 Linux /tmp/file2 20973568 31459327 10485760 5G 5 Extended /tmp/file3 31459328 41943039 10483712 5G 83 Linux 

Después de que se escribe la tabla, usa un poco de espacio:

 ls -lsh /tmp/file 

 8.0K -rw-r--r-- 1 mikeserv mikeserv 20G Dec 24 20:21 /tmp/file 

Aunque no lo sabrías.

 df -h /tmp 

 Filesystem Size Used Avail Use% Mounted on tmpfs 12G 480K 12G 1% /tmp 

Y puede extender escasamente un file de la misma manera:

 for cmd in \ 'dd bs=1024k seek=30k of=' \ 'ls -slh ' 'fdisk -l ' do eval "$cmd/tmp/file" echo done </dev/null 

 0+0 records in 0+0 records out 0 bytes (0 B) copied, 9.8239e-05 s, 0.0 kB/s 8.0K -rw-r--r-- 1 mikeserv mikeserv 30G Dec 26 14:24 /tmp/file Disk /tmp/file: 30 GiB, 32212254720 bytes, 62914560 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x057d787a Device Boot Start End Sectors Size Id Type /tmp/file1 2048 20973567 20971520 10G 83 Linux /tmp/file2 20973568 31459327 10485760 5G 5 Extended /tmp/file3 31459328 41943039 10483712 5G 83 Linux 

Según lo veo, tienes 3 opciones:

1) Use otra herramienta que no haga verificaciones de cordura. Mencionaste un editor hexadecimal tú mismo …

2) Modifique la herramienta (fdisk) que está utilizando y elimine la verificación de cordura. La fuente de fdisk está ahí, tal vez ya esté incluida en su distribución.

3) Modifique su image para que el chequeo de cordura sea válido. Podría crear una image más grande, crear sus particiones y luego usar dd para copyr solo el comienzo de la image a un nuevo file con el tamaño que desee.