Reler a tabela de partição sem reiniciar?

71

Às vezes, ao redimensionar ou mexer com partições em 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 esse é um problema de Linux e não de cfdisk.) Por que isso e por que isso acontece apenas às vezes e o que posso fazer para evitá-lo?

Nota: Assuma que nenhuma das partições que estou editando esteja aberta, montada ou em uso.


Atualizar:

O cfdisk usa ioctl(fd, BLKRRPART, NULL)para dizer ao Linux para reler a tabela de partição. Duas das outras ferramentas recomendadas até agora ( hdparm -z DEVICE, sfdisk -R DEVICE) fazem exatamente a mesma coisa. O partprobe DEVICEcomando, por outro lado, parece usar um novo ioctl chamado BLKPG, que pode ser melhor; Eu não sei. (Ele também recai no BLKRRPART se o BLKPG falhar.)

O BLKPG parece ser uma operação "esta partição foi alterada; aqui está o novo tamanho" e parecia ser partprobechamada individualmente em todas as partições do dispositivo aprovadas; portanto, deve funcionar se as partições individuais não forem usadas. No entanto, não tive a oportunidade de experimentá-lo.

Teddy
fonte
11
man sfdiskdiz:Since version 2.26 sfdisk no longer provides the -R or --re-read option to force the kernel to reread the partition table. Use blockdev --rereadpt instead.
Tom Hale

Respostas:

66

IMHO a resposta mais confiável / melhor é

partprobe /dev/sdX
Knweiss
fonte
11
Acabei de expandir um desenvolvedor no Ubuntu Server, este desenvolvedor é um ataque de hardware. Depois de expandir o ataque subjacente usando o controlador de ataque, desmontei o sistema de arquivos e tentei "partprobe / dev / sda" - isso não funcionou. "fdisk -l" ainda mostrava o tamanho antigo. Então executei "hdparm -z / dev / sda" e isso fez o truque. Eu poderia montar e redimensionar meu sistema de arquivos sem reiniciar. Eu sei que não estou adicionando nada realmente diferente de YMMV.
Mwuanno 28/05
estou no centos 6.5; kernel 2.6.32. todos os comandos a seguir não criaram a partição de releitura do kernel: - partprobe / dev / sda (warnikg: o kernel falhou ao reler)
Max
@ Max, também notei que, às vezes, até o partprobe imprime um erro que não funcionou. Às vezes, uma reinicialização é a única opção para ter certeza. Muitas vezes, porém, parece funcionar para mim.
Matt
Isso não funcionou para mim, porque havia alguns diretórios ainda montados com --bind. A partição em si já estava desmontada, mas as montagens de ligação que apontam para essa partição ainda estavam lá. Estranho que umount funcionasse e não testasse parcialmente, mas depois de desmontar também as montagens de ligação, eu também poderia testar parcialmente o disco.
Ethan Leroy
Isso funcionou para mim no CentOS 6 depois flagelando ao redor com kpartxe udevadm triggerpor 10 minutos. Obrigado!
Mike Andrews
19

Reler as informações da tabela de partições nem sempre funciona, mas tente

hdparm -z /dev/sda

ou

sfdisk -R /dev/sda

Se funcionar, os valores em / proc / partitions serão alterados.

ko-dos
fonte
O hdparm funcionou para mim.
Prof. Falken
3
a opção sfdisk -R não existe.
Matt
Note-se que o hdparmcomando só funcionará se as partições não estiverem montadas.
... na verdade, parece que sfdisk -Rfoi removido em algum lugar entre o util-linux 2.24.2 e 2.26.1 #
Charles Duffy
11
man sfdiskdiz:Since version 2.26 sfdisk no longer provides the -R or --re-read option to force the kernel to reread the partition table. Use blockdev --rereadpt instead.
Tom Hale
10

No Centos7:

De acordo com https://access.redhat.com/solutions/199573

Você deveria tentar :

partx -u <partition>

Funcionou para mim.

uus
fonte
11
Esse foi o único que funcionou para mim. Muito obrigado por compartilhar !! Topo do dia para você, senhor!
precisa saber é
8

Nota: Por favor, assuma que nenhuma das partições que estou editando está aberta, montada ou em uso.

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á atualmente em uso e, portanto, não pode ser verificada novamente sem criar inconsistências.

mulher
fonte
Algumas partições podem estar em uso, mas nenhuma delas é a que estou realmente alterando, embora possam estar na mesma tabela de partições.
Teddy
8
O kernel não é tão inteligente. Se alguma partição da tabela estiver em uso, o kernel não será verificado novamente. Entender errado na outra direção pode ser catastrófico, por isso é seguro. Se você quiser brincar com as partições à vontade, use o LVM.
Womble
6

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 algo sobre outra partição que nem esteja montada ( /dev/sda2), você receberá o erro de que a leitura da tabela de partição 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/sdbe elas serão relidas sem nenhum problema. Mas mesmo que uma partição do / dev / sdb tenha sido montada durante a alteração. Então o kernel continuará usando a tabela antiga.

Saurabh Barjatiya
fonte
5

Eu (o questionador original) tive uma situação há alguns dias atrás, quando nenhuma das outras respostas (incluindo partprobe /dev/sdX, atualmente, a resposta aceita e a mais votada) funcionou. O que funcionou, no entanto, foi o seguinte:

blockdev --rereadpt /dev/sdX

(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.)

Teddy
fonte
5

estou no centos 6.5 x64; kernel 2.6.32. e estou testando o truque do fdisk para redimensionar.

/dev/sda1 /boot
/dev/sda2 /

Todos os comandos a seguir não fizeram a releitura do kernel:

  • partprobe / dev / sda (aviso: o kernel falhou ao reler ....)
  • hdparm -z / dev / sda (BLKRRPART falhou: dispositivo ou recurso ocupado)
  • blockdev -rereadpt / dev / sda (BLKRRPART falhou: dispositivo ou recurso ocupado)
  • sfdisk -R / dev / sda (falha de BLKRRPART: dispositivo ou recurso ocupado)

eu ainda preciso de uma reinicialização para fazê-lo funcionar

Máx.
fonte
nada disso funcionou para mim também (proxmox VM, centos 7, partição xfs, sem lvm). resposta @uus fez trabalho, embora: serverfault.com/a/722386/102252
NotGaeL
Todos os comandos acima também não funcionaram para mim.
Fadi Asbih 15/03/19
Eu acho que o kernel 2.6.32 tem problema, eu os usei antes em outras máquinas, funcionou muito bem, mesmo ao adicionar partições com números mais altos entre as partições antigas. ou seja, sdb1 sdb2 sdb3 - exclua sdb2 e depois sdb1 sdb4 sdb5 sdb3. Além do acima, o partx, kpartx, blockdev não funcionou tão bem.
sdkks
Não acho incomum que, se um comando falhar na releitura das partições, tudo falhe - veja também a minha resposta sobre como eliminar algumas causas para isso .
maxschlepzig
3

Com todos os pontos de montagem desmontados, execute o Yocto 2.4:

partprobe /dev/sda 

Ainda não foi possível recarregar a tabela de partições após a exclusão das partições no dispositivo. Também tentaram - e falharam foram:

udevadm trigger --subsystem-match=block; udevadm settle
hdparm -z /dev/sda
blockdev --rereadpt /dev/sda

Todos relataram erros semelhantes "BLKRRPART falhou: dispositivo ou recurso ocupado ..." instruindo-me a reiniciar. Essa falha nos métodos de trabalho anteriores possivelmente se deve ao fato de o udev estar agora sob controle do systemd? Pensando nessas linhas, tentei:

systemctl restart systemd-udevd.service

E de repente meu disco está disponível novamente, sem uma reinicialização!

Acampamento Waub-O-Jeeg
fonte
A resposta mais aceita é incompleta: no systemdmundo moderno , ESTA é a resposta correta. Observe que você também precisa reiniciar um desses (ou ambos) systemd-udev-settlee systemd-udev-trigger. Reiniciar systemd-udevdcomo Camp disse não foi suficiente para mim. Mas reiniciar também os outros dois fez o truque!
Costin Gușă
1

Quando um comando como blockdev --rereadpt /dev/sdXfalha com

blockdev: ioctl error on BLKRRPART: Device or resource busy

isso geralmente significa que alguma partição (antiga) ainda é de alguma forma usada pelo kernel.

Possíveis causas / correções:

  1. uma partição sdX - digamos sdX1- ainda está montada - verifique mounte desmonte
  2. /dev/sdX1faz parte de uma invasão de software - verifique cat /proc/mdstate possivelmente interrompa as matrizes relevantes, por exemplomdadm --stop /dev/md126
  3. /dev/sdX1faz parte de um volume físico LVM - verifique com pvdisplay/ vgdisplaye possivelmente desative comvgchange
  4. /dev/sdX1faz parte de algum mapeamento de dispositivo - por exemplo, via cryptsetup- check /dev/mappere, lsblke possivelmente remove o mapeamento (por exemplo cryptsetup luksClose)
  5. Condição de corrida com algumas sondagens no udev - verifique os processos em execução pse, possivelmente, mate um

Se uma ferramenta - dizer blockdev --rereadptnão aqueles geralmente semelhantes, como ( partx -uv, kpartx, partprobe, kpartprobe) falhar de forma semelhante até que a causa raiz é eliminado.

maxschlepzig
fonte
0

Você também pode tentar:

echo 1 > /sys/block/sdX/device/rescan

(Mas não vai funcionar, veja o comentário abaixo)

Bogdano
fonte
3
Isso não relê a tabela de partição. Apenas atualiza as informações da geometria, modo de cache, etc. Está sendo emitido SCSI IDENTIFY_DRIVE.
Dmitri Chubarov
0

kpartx -a <partition> pode ser executado duas vezes na partição recém-criada .... em vez de reiniciar o sistema.

Kailas Kadam
fonte
2
Duas vezes? Você também executa " sync; sync; sync"? ☺ Sinto cheiro de superstição ...
Teddy
11
Eu acho que essa superstição veio do fato de você verificar se a sua sincronização, fazendo uma segunda sincronização. Exceto que o segundo é valioso apenas para o operador, para confirmar que ele retorna imediatamente, indicando a primeira sincronização concluída conforme o esperado. alguns blogs e tutoriais mais tarde, e ....
JM Becker
0

Lembre-se de verificar se o serviço udev está em execução. Isso é especialmente útil quando partprobe, hdparm, blockdev e vários outros comandos não parecem fazer diferença em quais arquivos de dispositivo estão disponíveis no diretório / dev /.

kerolasa
fonte
0

Para mim nem partprobeou blockdevsolução funcionou. Embora, este funcione:

udevadm settle --exit-if-exists=/dev/sdb1
Sibi
fonte
-3

Se você ler a página de manual de 'man oracleasm-scandisks', anote o texto abaixo. O oracleasm está usando / proc / partitions como a fonte de todas as varreduras realizadas. Você deve ter seus dispositivos brutos listados em / proc / partitions antes de poder fazer um scandisk. Os parâmetros Scanorder e Scanexclude que você coloca em / etc / sysconfig / oracleasm estão relacionados aos nomes encontrados em / proc / partitions (!!!!).

---------- man oracleasm-scandisks ------ ...

COMO A DIGITALIZAÇÃO ACONTECE A digitalização prossegue em quatro estágios básicos.

   First, the list of disks to scan is created. If disks were specified on the command line, this is the list.
   If not, /proc/partitions is read, and each block device is added, subject to the -o and -x options.

   Second, the partition tables of each disk in the scan are reloaded unless the -s option was specified. Any
   disks that no longer exist are dropped.

   Third, the list of disks is recreated based on the new partition tables.

   Finally, each disk in the list is checked to see if it is marked for ASM use. Disks that are marked are
   instantiated.
user168717
fonte
2
... ele é mencionado nada sobre o usooracleasm-scandisks
voretaq7