Como posso manipular um arquivo de tabela de partições sem que o fdisk verifique a validade dele?

2

Estou criando uma imagem na memória (/ tmp é um tmpfs):

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

Deverá manter uma tabela de partições e as 3 primeiras partições de um dispositivo

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

Os primeiros 2048 setores contêm uma tabela de partições.

$ 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

Mas eu tenho um problema.

Eu quero adicionar uma quarta partição / dev / loop0p4, que começa em 3147775 e termina em 37748724.

Eu não quero criar fisicamente a partição, mas quero modificar a tabela de partição para que ela pense que essa unidade existe.

No entanto, quando eu uso fdisk para essa finalidade, ele reclama Value out of range.

Como posso forçar o fdisk para apenas fazê-lo. Eu não ligo se a tabela de partições é inválida. Vou colocar isso em um disco maior e depois formatá-lo depois. Eu gostaria que a tabela de parição fizesse parte do que eu dd para esse disco maior (há razão para isso, prefiro não aprofundar esses detalhes). Tudo o que eu quero saber é como eu posso escrever uma tabela de partições com estes valores arbitrários sem retirar o editor hexadecimal.

    
por peskal 23.12.2015 / 20:29

2 respostas

4

Você pode criar um arquivo tão grande ou tão pequeno quanto quiser - especialmente em um linux tmpfs.

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

Podemos apenas criar um arquivo esparso.

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

Veja? Está usando 0 blocos de espaço em disco, mas seu tamanho aparente é de 20 gigabytes.

Você pode então apenas fdisk /tmp/file . Acabei de criar uma tabela de partições nele. Aqui 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

Depois que a tabela é escrita, ela usa um pouco de espaço pouco :

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

Você não saberia, no entanto.

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

E você pode esparsamente estender um arquivo da mesma maneira:

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
    
por 25.12.2015 / 05:24
1

Como eu vejo, você tem 3 opções:

1) Use outra ferramenta que não faça verificações de sanidade. Você mencionou um editor hexadecimal ...

2) Modifique a ferramenta (fdisk) que você está usando e remova a verificação de integridade. A fonte do fdisk está lá, talvez já esteja incluída na sua distribuição.

3) Modifique sua imagem para que a verificação de sanidade se torne válida. Você poderia criar uma imagem maior, criar suas partições e usar o dd para copiar apenas o início da imagem para um novo arquivo com o tamanho desejado.

    
por 23.12.2015 / 21:09