Backup de tabela de partições aproximado com sfdisk

4

Eu queria converter algumas partições lógicas para as estendidas, então eu estava seguindo esta resposta aceita . No entanto, no passo de fazer o backup da minha tabela de partições atual, eu errei e digitei o seguinte em vez do que foi escrito.

sfdisk -f /dev/sda > /mnt/parts.txt

O que resultou nisso:

Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1          0+    304-    304-   2441214+  82  Linux swap / Solaris
/dev/sda2   *    304+    565-    262-   2097152   83  Linux
/dev/sda3        565+   4486-   3921-  31495168   83  Linux
/dev/sda4       4486+  30401-  25916- 208163840    5  Extended
/dev/sda5       4486+  24026-  19540- 156954624   83  Linux

Como você pode ver, as unidades são cilindros e blocos, o que provavelmente faz uma perda de precisão em comparação a uma exportação correta com setores.

O problema é que eu quebrei minha tabela de partições e agora tenho que explorar esse backup incompleto (ou é?).

Até agora, tentei reescrever a tabela de partição usando setor como uma unidade (os cilindros não levam a lugar nenhum) sabendo que um bloco é dois setores (não sei se é geral, mas exportando a tabela de partições em setores informa que 1 setor = 512 bytes e 1 bloco = 1024 bytes ...).

root@debian:/home/user# sfdisk -u S /dev/sda
Checking that no-one is using this disk right now ...
OK

Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sda1             1   4882429    4882429  82  Linux swap / Solaris
/dev/sda2       4882430   9076733    4194304  83  Linux
/dev/sda3       9076734  72067069   62990336  83  Linux
/dev/sda4      72067070 488394749  416327680  83  Linux
Input in the following format; absent fields get a default value.
<start> <size> <type [E,S,L,X,hex]> <bootable [-,*]> <c,h,s> <c,h,s>
Usually you only need to specify <start> and <size> (and perhaps <type>).

/dev/sda1 :1 4882429 S
/dev/sda1             1   4882429    4882429  82  Linux swap / Solaris
/dev/sda2 :4882430 4194304 L *
/dev/sda2   *   4882430   9076733    4194304  83  Linux
/dev/sda3 :9076734 62990336
/dev/sda3       9076734  72067069   62990336  83  Linux
/dev/sda4 :72067070 416327680 E
/dev/sda4      72067070 488394749  416327680   5  Extended
/dev/sda5 :72067071 313909248
/dev/sda5      72067071 385976318  313909248  83  Linux
/dev/sda6 :
/dev/sda6     385976320 488394749  102418430  83  Linux
/dev/sda7 :
No room for more
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sda1             1   4882429    4882429  82  Linux swap / Solaris
/dev/sda2   *   4882430   9076733    4194304  83  Linux
/dev/sda3       9076734  72067069   62990336  83  Linux
/dev/sda4      72067070 488394749  416327680   5  Extended
/dev/sda5      72067071 385976318  313909248  83  Linux
/dev/sda6     385976320 488394749  102418430  83  Linux
Warning: partition 1 does not end at a cylinder boundary
Warning: partition 2 does not start at a cylinder boundary
Warning: partition 2 does not end at a cylinder boundary
Warning: partition 3 does not start at a cylinder boundary
Warning: partition 3 does not end at a cylinder boundary
Warning: partition 4 does not start at a cylinder boundary
Warning: partition 4 does not end at a cylinder boundary
Warning: partition 5 does not end at a cylinder boundary
Warning: partition [6] does not start at a cylinder boundary
Warning: partition [6] does not end at a cylinder boundary
Warning: partition 6 does not end at a cylinder boundary
Do you want to write this to disk? [ynq] y
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

Ele diz: nenhuma partida / parada da partição em um limite de cilindro. Não sei o que isso significa, mas como existem + e - , isso significa que o número foi arredondado, na exportação original, presumo que isso seja normal .

Também emiti o mesmo comando errado para ver se a saída era a mesma:

Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1          0+    303-    304-   2441214+  82  Linux swap / Solaris
/dev/sda2   *    303+    565-    262-   2097152   83  Linux
/dev/sda3        565+   4485-   3921-  31495168   83  Linux
/dev/sda4       4485+  30401-  25916- 208163840    5  Extended
/dev/sda5       4485+  24025-  19540- 156954624   83  Linux
/dev/sda6      24025+  30401-   6376-  51209215   83  Linux

Está perto, mas não é exatamente o mesmo. Além disso, o gparted não parece reconhecer nenhum sistema de arquivos de partição (tudo é "desconhecido").

Além disso, como pode / dev / sda1 ter 304 cilindros grandes, mas termina em 303 cilindros?

Eu acho que estou perto da solução, mas não consigo obter os números exatos que são necessários, provavelmente porque eu calculei mal algo ou estou fazendo errado. Mas eu não posso mudá-los um por um para ver qual combinação funciona (eu posso, mas exigiria algum tempo bash de codificação e processamento, e eu não saberia o que estava errado).

Eu tenho backups recentes dos mais importantes para este disco, mas se eu pudesse corrigi-lo sem reinstalar e copiar arquivos, isso poderia ser bom.

    
por GeoffreyFrogeye 20.10.2014 / 00:18

1 resposta

3

Isso vai ser difícil de consertar manualmente. Espero que você não tenha modificado mais dados neste disco, além da tabela de partições quebrada que você escreveu para ele.

Usar sfdisk, fdisk, etc para criar um backup da tabela de partição é uma boa idéia (quando você não acidentalmente digitar o comando errado :)). Mas para o seguro extra eu gosto de fazer backup dos setores de inicialização de minhas unidades usando dd.

Tem certeza que sda1 começa no bloco 1, ou foi um palpite? Costumava ser comum que apenas 1 bloco fosse usado no início de um disco, já que é tudo o que você precisa para armazenar o MBR e a tabela de partições (primária), mas nos últimos anos tem sido comum o particionamento de software reservar mais espaço, por exemplo um setor inicial de 63 para a primeira partição não é incomum. Eu também vi software de particionamento (gparted, IIRC) reservar um megabyte no início de uma unidade e, em seguida, forçar todas as partições subseqüentes em limites de megabytes.

Em sistemas mais antigos, era importante que as partições começassem e parassem nos limites dos cilindros. IOW, região não particionada no início do disco deve ser um número inteiro de cilindros, e assim deve cada partição primária subseqüente; geralmente também haverá espaço não alocado no final do disco. Mas isso geralmente não é um problema há muitos anos, mas muitos softwares de particionamento ainda o mencionam, caso você esteja interessado. :)

No entanto, as partições do precisam iniciar e parar nos limites do setor. E isso torna a análise de seus dados orientados a blocos na primeira listagem muito mais fácil. Portanto, 2441214+ blocos podem somente referir-se a 2441214.5 blocos = 4882429 setores = 2499803648 bytes.

Mas, em vez de tentar corrigir isso manualmente, você deve considerar seriamente o uso de uma ferramenta como testdisk . Você pode até tê-lo instalado em sua distro, se não, ele deve estar em seus repositórios.

    
por 20.10.2014 / 08:04