Rileggere la tabella delle partizioni senza riavviare?


71

A volte, quando si ridimensiona o si scherza con le partizioni su un disco, cfdisk dirà:

Wrote partition table, but re-read table failed. Reboot to update table.

(Ciò accade anche con altri strumenti di partizionamento, quindi sto pensando che si tratti di un problema di Linux piuttosto che di un cfdisk.) Perché è questo e perché succede solo a volte e cosa posso fare per evitarlo?

Nota: supponiamo che nessuna delle partizioni che sto effettivamente modificando sia aperta, montata o altrimenti utilizzata.


Aggiornare:

cfdisk usa ioctl(fd, BLKRRPART, NULL)per dire a Linux di rileggere la tabella delle partizioni. Due degli altri strumenti consigliati finora ( hdparm -z DEVICE, sfdisk -R DEVICE) fanno esattamente la stessa cosa. Il partprobe DEVICEcomando, d'altra parte, sembra usare un nuovo ioctl chiamato BLKPG, che potrebbe essere migliore; Non lo so. (Ritorna anche su BLKRRPART se BLKPG fallisce.)

BLKPG sembra essere un'operazione "questa partizione è cambiata; ecco la nuova dimensione", e sembrava partprobechiamarla individualmente su tutte le partizioni sul dispositivo passate, quindi dovrebbe funzionare se le singole partizioni non vengono utilizzate. Tuttavia, non ho avuto l'opportunità di provarlo.


1
man sfdiskdice: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 il

Risposte:


66

IMHO è la risposta più affidabile / migliore

partprobe /dev/sdX

1
Ho appena ampliato uno sviluppatore sotto Ubuntu Server, questo sviluppatore è un raid hardware. Dopo aver espanso il raid sottostante usando raidcontroller, ho smontato il filesystem e ho provato "partprobe / dev / sda" - questo non ha funzionato. "fdisk -l" mostrava ancora le dimensioni precedenti. Ho quindi eseguito "hdparm -z / dev / sda" e questo ha funzionato. Potrei quindi montare e ridimensionare il mio filesystem senza riavviare. So che non sto aggiungendo altro che YMMV.
Mwuanno,

sono su centos 6.5; kernel 2.6.32. tutti i seguenti comandi non hanno fatto in modo che il kernel rileggesse la partizione: - partprobe / dev / sda (warnikg: il kernel non è riuscito a rileggere)
Max

@Max, ho anche notato che a volte anche partprobe stampa un errore che non ha funzionato. A volte un riavvio è l'unica opzione per essere certi. Molte volte sembra funzionare per me però.
Matt,

Questo non ha funzionato per me perché c'erano ancora alcune directory montate con --bind. La partizione stessa era già smontata, ma i bind-mount che puntavano a quella partizione erano ancora lì. Strano che umount abbia funzionato e non partprobe, ma dopo aver smontato anche i bind mount, ho potuto anche partprobe il disco.
Ethan Leroy,

Questo ha funzionato per me su CentOS 6 dopo aver flagellato con kpartxe udevadm triggerper 10 minuti. Grazie!
Mike Andrews,

19

Rileggere le informazioni sulla tabella delle partizioni non sempre funziona, ma provare

hdparm -z /dev/sda

o

sfdisk -R /dev/sda

Se funziona, i valori in / proc / partitions cambieranno.


hdparm ha funzionato per me.
Prof. Falken,

3
l'opzione sfdisk -R non esiste.
Matt,

Va notato che il hdparmcomando funzionerà solo se le partizioni non sono montate.

... in effetti, sembra che sia sfdisk -Rstato rimosso da qualche parte tra util-linux 2.24.2 e 2.26.1
Charles Duffy,

1
man sfdiskdice: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 il


8

Nota: supponiamo che nessuna delle partizioni che sto effettivamente modificando sia aperta, montata o altrimenti utilizzata.

Dato questo presupposto, la tabella delle partizioni può essere rieseguita con successo e il problema non si presenta. Se ricevi questo errore, è perché la tabella delle partizioni è attualmente in uso e quindi non può essere scansionata nuovamente senza creare incoerenze.


Alcune partizioni potrebbero essere in uso, ma nessuna di esse è quella che sto effettivamente cambiando, sebbene possano trovarsi nella stessa tabella delle partizioni.
Teddy

8
Il kernel non è così intelligente. Se è in uso una partizione nella tabella, il kernel non esegue nuovamente la scansione. Sbagliarlo nella direzione opposta potrebbe essere catastrofico, quindi è sicuro. Se vuoi andare in giro con le partizioni a piacimento, usa LVM.
womble

6

Non si basa sulla partizione che si sta modificando.

Supponiamo di avere solo un disco rigido ( /dev/sda) e due partizioni ( /dev/sda1, /dev/sda2) e di aver montato solo una partizione ( /dev/sda1). Se elimini o modifichi qualcosa su un'altra partizione che non è nemmeno montata ( /dev/sda2) otterrai l'errore che la rilettura della tabella delle partizioni non è riuscita e che il kernel userà la vecchia tabella.

Ma se hai due hard disk ( /dev/sda, /dev/sdb) e nessuna delle partizioni di ( /dev/sdb) è in uso. Quindi è possibile aggiungere / eliminare / ridimensionare / modificare le partizioni /dev/sdbe verranno rilette senza alcun problema. Ma anche se una partizione di / dev / sdb è stata montata durante il cambio. Quindi il kernel continuerà a usare la vecchia tabella.


5

Io (l'interrogatore originale) ho avuto una situazione qualche giorno fa in cui nessuna delle altre risposte (inclusa partprobe /dev/sdX, attualmente la risposta accettata e più votata) ha funzionato. Ciò che ha funzionato, tuttavia, è stato questo:

blockdev --rereadpt /dev/sdX

(Non so perché questo abbia funzionato e gli altri no, ma sono contento che abbia funzionato, poiché mi ha salvato un riavvio su un server occupato.)


5

sono su centos 6,5 x64; kernel 2.6.32. e sto testando il trucco di fdisk per ridimensionare.

/dev/sda1 /boot
/dev/sda2 /

Tutti i seguenti comandi non hanno fatto eseguire la rilettura della partizione del kernel:

  • partprobe / dev / sda (attenzione: il kernel non è riuscito a rileggere ....)
  • hdparm -z / dev / sda (BLKRRPART non riuscito: dispositivo o risorsa occupata)
  • blockdev -rereadpt / dev / sda (BLKRRPART non riuscito: dispositivo o risorsa occupata)
  • sfdisk -R / dev / sda (BLKRRPART non riuscito: dispositivo o risorsa occupata)

ho ancora bisogno di un riavvio per farlo funzionare


nessuna di queste ha funzionato neanche per me (proxmox VM, centos 7, partizione xfs, no lvm). La risposta di @uus ha funzionato, tuttavia: serverfault.com/a/722386/102252
NotGaeL

Tutti i comandi sopra non hanno funzionato neanche per me.
Fadi Asbih,

Penso che il kernel 2.6.32 abbia dei problemi, li ho usati prima su altre macchine, ha funzionato bene, anche quando ho aggiunto partizioni con numeri più alti tra le partizioni più vecchie. cioè sdb1 sdb2 sdb3 - cancella sdb2, quindi sdb1 sdb4 sdb5 sdb3. Oltre a quanto sopra, anche partx, kpartx, blockdev non hanno funzionato.
sdkks,

Non penso che sia insolito che se un comando non riesce a rileggere le partizioni, tutto fallisce - vedi anche la mia risposta su come eliminare alcune cause per questo .
maxschlepzig,

3

Con tutti i punti di montaggio smontati, con Yocto 2.4 in esecuzione:

partprobe /dev/sda 

Impossibile caricare nuovamente la tabella delle partizioni dopo che le partizioni sono state eliminate sul dispositivo. Anche provato - e fallito sono stati:

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

Tutti hanno riportato errori simili "BLKRRPART non riusciti: dispositivo o risorsa occupata ..." che mi indicavano di riavviare. Questo fallimento di metodi precedentemente funzionanti è forse dovuto al fatto che udev è ora sotto il controllo del sistema? Pensando in tal senso ho provato:

systemctl restart systemd-udevd.service

E improvvisamente il mio disco è nuovamente disponibile, senza riavvio!


La risposta più accettata è incompleta: nel systemdmondo moderno , QUESTA è la risposta corretta. Nota che devi anche riavviare uno di quelli (o entrambi) systemd-udev-settlee systemd-udev-trigger. Riavviare systemd-udevdcome ha detto Camp non è stato abbastanza per me. Ma riavviare anche gli altri due ha funzionato!
Costin Gușă,

1

Quando un comando come blockdev --rereadpt /dev/sdXfallisce

blockdev: ioctl error on BLKRRPART: Device or resource busy

questo di solito significa che alcune (vecchie) partizioni sono effettivamente ancora in qualche modo utilizzate dal kernel.

Possibili cause / correzioni:

  1. una partizione SDX - diciamo sdX1- è ancora montata - controlla mounte smonta
  2. /dev/sdX1fa parte di un raid software - controlla cat /proc/mdstated eventualmente ferma gli array rilevanti, ad esmdadm --stop /dev/md126
  3. /dev/sdX1fa parte di un volume fisico LVM: verificare con pvdisplay/ vgdisplaye possibilmente disattivarlo convgchange
  4. /dev/sdX1è parte di alcuni mappatura dispositivo - ad esempio tramite cryptsetup- controllare /dev/mappered lsblkeventualmente eliminare la mappatura (es cryptsetup luksClose)
  5. Condizioni di gara con alcuni sondaggi udev - controlla i processi in esecuzione con psed eventualmente uccidine uno

Se uno strumento - dire blockdev --rereadptnon quelli normalmente simili come ( partx -uv, kpartx, partprobe, kpartprobe) sicuro in modo analogo fino la causa principale viene eliminata.


0

Puoi anche provare:

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

(Ma non funzionerà, vedi il commento qui sotto)


3
Ciò non rilegge la tabella delle partizioni. Aggiorna semplicemente le informazioni sulla geometria, la modalità cache, ecc. È stato emesso SCSI IDENTIFY_DRIVE.
Dmitri Chubarov,

0

kpartx -a <partition> può essere eseguito due volte sulla partizione appena creata .... invece di riavviare il sistema.


2
Due volte? Corri anche " sync; sync; sync"? ☺ Sento odore di superstizione ...
Teddy,

1
Penso che questa superstizione sia venuta dal fatto che controlli se la tua sincronizzazione, facendo una seconda sincronizzazione. Tranne che il secondo è prezioso solo per l'operatore, per confermare che ritorna immediatamente al prompt, indicando così la prima sincronizzazione completata come previsto. alcuni blog e tutorial più tardi, e ...
JM Becker,

0

Ricordarsi di verificare che il servizio udev sia in esecuzione. Ciò è particolarmente utile quando partprobe, hdparm, blockdev e vari altri comandi non sembrano fare alcuna differenza sui file di dispositivo disponibili nella directory / dev /.


0

Per me né partprobeo blockdevsoluzione ha funzionato. Anche se questo funziona:

udevadm settle --exit-if-exists=/dev/sdb1

-3

Se leggi la manpage di "man oracleasm-scandisks" noterai il testo qui sotto. oracleasm sta usando / proc / partitions come la fonte di tutte le scansioni che esegue. Devi avere i tuoi dispositivi grezzi elencati in / proc / partitions prima di poter fare uno scandisk. I parametri Scanorder e Scanexclude inseriti in / etc / sysconfig / oracleasm si riferiscono ai nomi trovati in / proc / partitions (!!!!).

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

COME SI EFFETTUA LA SCANSIONE La scansione procede in quattro fasi di base.

   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.

2
... non ha menzionato nulla sull'usooracleasm-scandisks
voretaq7 del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.