Às vezes, ao redimensionar ou mexer nas partições de um disco, o cfdisk dirá:
Wrote partition table, but re-read table failed. Reboot to update table.
(Isso também acontece com outras ferramentas de particionamento, então estou pensando que este é um problema do Linux e não um problema do cfdisk.) Por que isso acontece e por que isso só acontece às vezes , e o que posso fazer para evitá-lo?
Nota: Por favor, assuma que nenhuma das partições que estou realmente editando está aberta, montada ou em uso.
Atualizar:
cfdisk usa ioctl(fd, BLKRRPART, NULL)
para dizer ao Linux para reler a tabela de partições. Duas das outras ferramentas recomendadas até agora ( hdparm -z
DEVICE
, sfdisk -R
DEVICE
) fazem exatamente a mesma coisa. O partprobe
DEVICE
comando, por outro lado, parece usar um novo ioctl chamado BLKPG, que pode ser melhor; Não sei. (Ele também recorre ao BLKRRPART se o BLKPG falhar.)
O BLKPG parece ser uma operação "esta partição mudou; aqui está o novo tamanho" e parecia ser partprobe
chamado individualmente em todas as partições do dispositivo passado, portanto, deve funcionar se as partições individuais não forem usadas. No entanto, não tive a oportunidade de experimentá-lo.
IMHO a resposta mais confiável/melhor é
Reler as informações da tabela de partição nem sempre funciona, mas tente
ou
Se funcionar, os valores em /proc/partitions serão alterados.
Eu (o questionador original) tive uma situação há alguns dias em que nenhuma das outras respostas (incluindo
partprobe /dev/sdX
, atualmente a resposta aceita e mais votada) funcionou. O que funcionou, no entanto, foi o seguinte:(Não sei por que isso funcionou e os outros não, mas estou feliz que funcionou, pois me salvou de uma reinicialização em um servidor ocupado.)
No Centos7:
De acordo com https://access.redhat.com/solutions/199573
Você deveria tentar :
Funcionou para mim.
Dada essa suposição, a tabela de partição pode ser verificada novamente com êxito e o problema não surgirá. Se você está recebendo esse erro, é porque a tabela de partição está em uso no momento e, portanto, não pode ser verificada novamente sem criar inconsistências.
Não é baseado na partição que você está editando.
Suponha que você tenha apenas um disco rígido (
/dev/sda
) e duas partições (/dev/sda1
,/dev/sda2
) e tenha montado apenas uma partição (/dev/sda1
). Se você excluir ou alterar qualquer coisa sobre outra partição que nem esteja montada (/dev/sda2
), você receberá o erro de que a releitura da tabela de partições falhou e o kernel usará a tabela antiga.Mas se você tiver dois discos rígidos (
/dev/sda
,/dev/sdb
) e nenhuma das partições de (/dev/sdb
) estiver em uso. Em seguida, você pode adicionar / excluir / redimensionar / editar partições/dev/sdb
e elas serão relidas sem nenhum problema. Mas mesmo que uma partição de /dev/sdb tenha sido montada durante a alteração. Então o kernel continuará usando a tabela antiga.Com todos os pontos de montagem desmontados, executando o Yocto 2.4:
Ainda não foi possível recarregar a tabela de partições depois que as partições foram excluídas no dispositivo. Também tentou - e falhou foram:
Todos relataram erros semelhantes "BLKRRPART falhou: dispositivo ou recurso ocupado...", instruindo-me a reinicializar. Essa falha dos métodos de trabalho anteriores possivelmente se deve ao fato de o udev estar agora sob controle do systemd? Pensando nessa linha, tentei:
E de repente meu disco está disponível novamente, sem reinicialização!
estou no centos 6.5x64 ; núcleo 2.6.32 . e estou testando o truque do fdisk para redimensionar.
Todos os comandos a seguir não fizeram a partição de releitura do kernel:
eu ainda preciso de uma reinicialização para fazê-lo funcionar
Quando um comando como
blockdev --rereadpt /dev/sdX
falha comisso geralmente significa que alguma partição (antiga) ainda é de alguma forma usada pelo kernel.
Possíveis causas/correções:
sdX1
- ainda está montada - verifiquemount
e desmonte-a/dev/sdX1
faz parte de uma invasão de software - verifiquecat /proc/mdstat
e possivelmente pare as matrizes relevantes, por exemplomdadm --stop /dev/md126
/dev/sdX1
faz parte de um volume físico LVM - verifique compvdisplay
/vgdisplay
e possivelmente desative comvgchange
/dev/sdX1
faz parte de algum mapeamento de dispositivo - por exemplo, viacryptsetup
- check/dev/mapper
elsblk
possivelmente remova o mapeamento (por exemplocryptsetup luksClose
)ps
e possivelmente mate umSe uma ferramenta - digamos
blockdev --rereadpt
falhar, geralmente outras semelhantes como (partx -uv
,kpartx
,partprobe
,kpartprobe
) falham de maneira semelhante até que a causa raiz seja eliminada.Você também pode tentar:
(Mas pode não funcionar, veja o comentário abaixo)