Como o cfdisk corrige minha imagem de disco?

1

Estou trabalhando em um aplicativo complexo enorme. Você conecta um disco, pressiona um botão e ele particiona e formata o disco, monta-o e copia alguns arquivos para ele.

Para testar este aplicativo, temos um sistema de teste que monta em loop uma imagem de disco e executa o mesmo processo. Exceto que mudamos a lógica do aplicativo e agora o sistema de teste não funciona. Se você der ao programa um disco real , tudo funciona bem. Mas se você der um dispositivo de loop, ele falhará.

Especificamente, o aplicativo particiona o disco, formata-o e depois reclama que não pode montar a partição. O comando exato é

mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800

(Aqui /dev/vda é meramente um link simbólico para /dev/loop0 . Não faz diferença se eu me referir a loop0 diretamente).

Se eu executar o comando manualmente, obtenho isto:

root# mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800
FUSE exfat 1.0.1
ERROR: exFAT file system is not found.
root# echo $?
1

Eu posso executar este comando uma e outra vez, e isso simplesmente não funciona. Nenhuma razão, simplesmente não faz.

Aqui está a parte aterrorizante: Se eu executar cfdisk /dev/vda e, em seguida, sair imediatamente sem alterar nada, agora ele é montado !!

O que o inferno faz cfdisk fazer no disco que faz com que ele comece a funcionar de repente? E como posso remover a necessidade de chamar este programa?

(Eu tentei em vão chamar sfdisk -R /dev/vda ; ele apenas reclama de "parâmetro inválido" ou algo assim.)

Eu posso kludge o aplicativo para chamar cfdisk -Ps /dev/vda ou algo assim, mas eu realmente prefiro não fazer isso. Eu quero descobrir por que nada disso é necessário. Antes de mudarmos a aplicação, tudo funcionou bem ...

    
por MathematicalOrchid 17.09.2014 / 16:10

3 respostas

1

Fiz uma pequena alteração na estrutura de teste e o problema desapareceu.

Especificamente, em vez de chamar kpartx -u /dev/vda depois de reparticionar o dispositivo, chamo kpartx -d seguido por kpartx -a . E agora está tudo bem. Estranho ...

    
por 18.09.2014 / 14:42
1

Uma punhalada no escuro, mas talvez cfdisk atualize a tabela de partição do kernel quando ela é executada?

A lógica da sua aplicação é compatível com dispositivos de loop?

  1. Formate o arquivo de imagem do disco, criando suas partições desejadas
  2. Configure o dispositivo de loopback usando a opção -P para atualizar a tabela de partições do kernel:

    losetup -P /dev/loop0 <image file>

  3. Monte a partição: mount /dev/loop0p1 /mnt

Dessa forma, não há necessidade de se preocupar com deslocamentos e seu comando mount está mais próximo do que você usaria com um disco real. Você poderia, presumivelmente, adicionar outro passo entre 2 e 3 para criar um symlink como você tem.

    
por 17.09.2014 / 16:32
1

O kernel primeiro tem que aprender sobre as partições. Depois de particionar um dispositivo de loop (digamos, /dev/loop0 ), você não conseguirá montá-lo como tal (obviamente, a partição não começa no início do dispositivo). Para unidades físicas, você pode instruir o kernel a reler a tabela de partições (pelo menos para as unidades ATA) com hdparm -z .

Outra opção é usar um utilitário especial, que verificará o dispositivo em busca de uma tabela de partição (não necessariamente apenas GPT ou MBR) e criará os arquivos do dispositivo de partição para você. Um deles é partx (vem com o util-linux).

    
por 17.09.2014 / 16:37