Partitionstabelle erneut lesen, ohne neu zu starten?

71

Manchmal sagt cfdisk, wenn Sie die Größe ändern oder auf andere Weise mit Partitionen auf einer Festplatte herumspielen:

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

(Dies geschieht auch mit anderen Partitionierungs-Tools. Ich denke, dies ist eher ein Linux-Problem als ein CFDisk-Problem.) Warum ist das so und warum passiert es nur manchmal und was kann ich tun, um es zu vermeiden?

Hinweis: Bitte nehmen Sie an, dass keine der Partitionen, die ich gerade bearbeite, geöffnet, gemountet oder anderweitig verwendet wird.


Aktualisieren:

cfdisk weist ioctl(fd, BLKRRPART, NULL)Linux an, die Partitionstabelle erneut zu lesen. Zwei der bisher empfohlenen Tools ( hdparm -z DEVICE, sfdisk -R DEVICE) machen genau dasselbe. Der partprobe DEVICEBefehl scheint dagegen ein neues ioctl mit dem Namen BLKPG zu verwenden, das möglicherweise besser ist. Ich weiß es nicht. (Es greift auch auf BLKRRPART zurück, wenn BLKPG fehlschlägt.)

Bei BLKPG handelt es sich anscheinend um eine Operation "Diese Partition hat sich geändert. Hier ist die neue Größe", die anscheinend für partprobealle Partitionen auf dem übergebenen Gerät einzeln aufgerufen wurde. Sie sollte also funktionieren, wenn die einzelnen Partitionen nicht verwendet werden. Ich hatte jedoch nicht die Gelegenheit, es zu versuchen.

Teddy
quelle
1
man sfdisksagt: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

Antworten:

66

IMHO ist die zuverlässigste / beste Antwort

partprobe /dev/sdX
knweiss
quelle
1
Ich habe gerade einen Entwickler unter Ubuntu Server erweitert, dieser Entwickler ist ein Hardware-Überfall. Nachdem ich den zugrunde liegenden RAID mit dem RAID-Controller erweitert hatte, habe ich das Dateisystem entladen und "partprobe / dev / sda" ausprobiert - dies hat nicht funktioniert. "fdisk -l" zeigte immer noch die alte Größe. Ich habe dann "hdparm -z / dev / sda" ausgeführt und dies hat den Trick getan. Ich könnte dann mein Dateisystem ohne Neustart mounten und die Größe ändern. Ich weiß, dass ich nichts wirklich anderes als YMMV hinzufüge.
Mwuanno
Ich bin auf Centos 6.5; Kernel 2.6.32. Bei allen folgenden Befehlen wurde die Kernel-Partition nicht erneut gelesen: - partprobe / dev / sda (Warnikg: Kernel konnte nicht erneut gelesen werden)
Max
@Max, mir ist auch aufgefallen, dass manchmal sogar partprobe einen Fehler ausgibt, der nicht funktioniert hat. Manchmal ist ein Neustart die einzige Option, um sicher zu sein. Oft scheint es jedoch für mich zu funktionieren.
Matt
Dies hat bei mir nicht funktioniert, da einige Verzeichnisse noch mit --bind gemountet waren. Die Partition selbst war bereits nicht gemountet, aber die Bindmounts, die auf diese Partition verweisen, waren noch vorhanden. Seltsam, dass umount funktionierte und partprobe nicht, aber nachdem ich auch die bind-mounts umountete, konnte ich auch partprobe der Platte.
Ethan Leroy
Dies funktionierte für mich auf CentOS 6, nachdem ich mit kpartxund udevadm triggerfür 10 Minuten herumgeimpft hatte. Danke!
Mike Andrews
19

Das erneute Lesen von Partitionstabelleninformationen funktioniert nicht immer, aber versuchen Sie es

hdparm -z /dev/sda

oder

sfdisk -R /dev/sda

Wenn es funktioniert, ändern sich die Werte in / proc / partitions.

ko-dos
quelle
hdparm hat für mich gearbeitet.
Prof. Falken
3
Die Option sfdisk -R existiert nicht.
Matt
Es sollte beachtet werden, dass der hdparmBefehl nur funktioniert, wenn Partitionen nicht gemountet sind.
... in der Tat sieht es so aus, als ob sfdisk -Res irgendwo zwischen util-linux 2.24.2 und 2.26.1 entfernt wurde
Charles Duffy
1
man sfdisksagt: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

Auf Centos7:

Laut https://access.redhat.com/solutions/199573

Du solltest es versuchen :

partx -u <partition>

Es hat bei mir funktioniert.

uus
quelle
1
Das war die einzige, die für mich funktioniert hat. Vielen Dank für das Teilen! Ich wünsche Ihnen alles Gute, Sir!
NotGaeL
8

Hinweis: Bitte nehmen Sie an, dass keine der Partitionen, die ich gerade bearbeite, geöffnet, gemountet oder anderweitig verwendet wird.

Da die Annahme, die Partitionstabelle kann erfolgreich neu gescannt werden, und das Problem wird nicht auftreten. Wenn Sie diese Fehler sind immer, dann ist es , weil die Partitionstabelle ist derzeit im Einsatz und kann daher nicht ohne die Schaffung Inkonsistenzen erneut gescannt werden.

womble
quelle
Einige Partitionen werden möglicherweise verwendet, aber keine von ihnen ist die, die ich gerade ändere, obwohl sie sich möglicherweise in derselben Partitionstabelle befinden.
Teddy
8
Der Kernel ist nicht so schlau. Wenn eine Partition in der Tabelle verwendet wird, wird der Kernel nicht erneut durchsucht. In die andere Richtung so etwas falsch zu machen, könnte katastrophal sein, also ist es sicher. Wenn Sie nach Belieben Partitionen hinzufügen möchten, verwenden Sie LVM.
womble
6

Es basiert nicht auf der Partition, die Sie bearbeiten.

Angenommen, Sie haben nur eine Festplatte ( /dev/sda) und zwei Partitionen ( /dev/sda1, /dev/sda2) und Sie haben nur eine Partition ( /dev/sda1) gemountet . Wenn Sie etwas an einer anderen Partition löschen oder ändern, die noch nicht einmal gemountet ist ( /dev/sda2), wird der Fehler angezeigt, dass das erneute Lesen der Partitionstabelle fehlgeschlagen ist und der Kernel die alte Tabelle verwendet.

Wenn Sie jedoch über zwei Festplatten ( /dev/sda, /dev/sdb) verfügen und keine der Partitionen von ( /dev/sdb) verwendet wird. Dann können Sie Partitionen hinzufügen / löschen / in der Größe ändern / bearbeiten /dev/sdbund sie werden ohne Probleme erneut gelesen. Aber selbst wenn eine Partition von / dev / sdb während der Änderung gemountet wurde. Dann wird der Kernel weiterhin die alte Tabelle verwenden.

Saurabh Barjatiya
quelle
5

Ich (der ursprüngliche Fragesteller) hatte vor einigen Tagen eine Situation, in der keine der anderen Antworten (einschließlich der partprobe /dev/sdXderzeit akzeptierten und am höchsten bewerteten Antwort) funktioniert hat. Was jedoch funktionierte, war Folgendes:

blockdev --rereadpt /dev/sdX

(Ich weiß nicht, warum das funktioniert hat und die anderen nicht, aber ich bin froh, dass es funktioniert hat, da es mir einen Neustart auf einem ausgelasteten Server erspart hat.)

Teddy
quelle
5

Ich bin auf Centos 6,5 x 64; Kernel 2.6.32. und ich teste den Fdisk-Trick, um die Größe zu ändern.

/dev/sda1 /boot
/dev/sda2 /

Bei allen folgenden Befehlen wurde die Kernel-Partition nicht erneut gelesen:

  • partprobe / dev / sda (Warnung: Kernel konnte nicht erneut gelesen werden ....)
  • hdparm -z / dev / sda (BLKRRPART fehlgeschlagen: Gerät oder Ressource belegt)
  • blockdev -rereadpt / dev / sda (BLKRRPART fehlgeschlagen: Gerät oder Ressource belegt)
  • sfdisk -R / dev / sda (BLKRRPART fehlgeschlagen: Gerät oder Ressource belegt)

Ich brauche noch einen Neustart, damit es funktioniert

Max
quelle
bei mir hat auch nichts davon geklappt (proxmox VM, centos 7, xfs partition, no lvm). @euus Antwort hat funktioniert, obwohl: serverfault.com/a/722386/102252
NotGaeL
Alle oben genannten Befehle haben auch bei mir nicht funktioniert.
Fadi Asbih
Ich denke, Kernel 2.6.32 hat Probleme. Ich habe diese zuvor auf anderen Computern verwendet. Es hat einwandfrei funktioniert, auch wenn Partitionen mit höheren Nummern zwischen älteren Partitionen hinzugefügt wurden. dh sdb1 sdb2 sdb3 - lösche sdb2, dann sdb1 sdb4 sdb5 sdb3. Darüber hinaus funktionierten partx, kpartx und blockdev nicht so gut.
SDKKS
Ich denke nicht, dass es ungewöhnlich ist, dass alle fehlschlagen, wenn ein Befehl die Partitionen erneut liest - siehe auch meine Antwort, wie einige Ursachen dafür behoben werden können .
Maxschlepzig
3

Wenn alle Einhängepunkte nicht eingehängt sind, führen Sie Yocto 2.4 aus:

partprobe /dev/sda 

Die Partitionstabelle konnte nach dem Löschen der Partitionen auf dem Gerät immer noch nicht neu geladen werden. Auch versucht - und gescheitert waren:

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

Alle meldeten ähnliche "BLKRRPART ist fehlgeschlagen: Gerät oder Ressource belegt ..." -Fehler, die mich zum Neustart aufforderten. Ist dieses Versagen früherer Arbeitsmethoden möglicherweise darauf zurückzuführen, dass udev nun systemgesteuert ist? In diesem Sinne habe ich versucht:

systemctl restart systemd-udevd.service

Und plötzlich ist meine Festplatte ohne Neustart wieder verfügbar !

Lager Waub-O-Jeeg
quelle
Die am häufigsten akzeptierte Antwort ist unvollständig: In der modernen systemdWelt ist DIES die richtige Antwort. Bitte beachten Sie, dass Sie auch einen dieser (oder beide) systemd-udev-settleund neu starten müssen systemd-udev-trigger. Ein Neustart, systemd-udevdwie Camp sagte, war mir nicht genug. Aber der Neustart auch der anderen beiden hat es geschafft!
Costin Gușă
1

Wenn ein Befehl wie mit blockdev --rereadpt /dev/sdXfehlschlägt

blockdev: ioctl error on BLKRRPART: Device or resource busy

Dies bedeutet normalerweise, dass eine (alte) Partition tatsächlich noch irgendwie vom Kernel verwendet wird.

Mögliche Ursachen / Korrekturen:

  1. eine sdX Trennwand - sagen sdX1- montiert ist immer noch - überprüfen Sie mit mountund umount es
  2. /dev/sdX1ist Teil eines Software - Raid - Checks cat /proc/mdstatund stoppt möglicherweise die entsprechenden Arrays, zmdadm --stop /dev/md126
  3. /dev/sdX1ist Teil eines physischen LVM-Volumes - mit pvdisplay/ prüfen vgdisplayund ggf. mit deaktivierenvgchange
  4. /dev/sdX1Teil einer Gerätezuordnung ist - beispielsweise über cryptsetup- prüfen /dev/mapperund lsblkund entfernen eventuell die Zuordnung (z cryptsetup luksClose)
  5. Race Condition mit einigem udev-Test - überprüfe laufende Prozesse mit psund beende möglicherweise einen

Wenn ein Werkzeug - sagen blockdev --rereadptversagt in der Regel ähnliche wie ( partx -uv, kpartx, partprobe, kpartprobe) nicht in ähnlicher Art und Weise , bis die Ursache beseitigt wird.

maxschlepzig
quelle
0

Sie können auch versuchen:

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

(Funktioniert aber nicht, siehe Kommentar unten)

Bogdano
quelle
3
Dadurch wird die Partitionstabelle nicht erneut gelesen. Es werden lediglich die Geometrieinformationen, der Cache-Modus usw. aktualisiert. SCSI IDENTIFY_DRIVE wird ausgegeben.
Dmitri Chubarov
0

kpartx -a <partition> kann zweimal auf einer neu erstellten Partition ausgeführt werden .... anstatt das System neu zu starten.

Kailas Kadam
quelle
2
Zwei mal? Läufst du auch " sync; sync; sync"? ☺ Ich rieche Aberglauben…
Teddy
1
Ich denke, dieser Aberglaube ist darauf zurückzuführen, dass Sie Ihre Synchronisierung überprüfen, indem Sie eine zweite Synchronisierung durchführen. Mit der Ausnahme, dass die zweite Option nur für den Bediener von Nutzen ist, müssen Sie sofort bestätigen, dass sie zur Eingabeaufforderung zurückkehrt, um anzuzeigen, dass die erste Synchronisierung wie erwartet abgeschlossen wurde. Ein paar Blogs und Tutorials später und ...
JM Becker
0

Denken Sie daran, zu überprüfen, ob der udev-Dienst ausgeführt wird. Dies ist besonders nützlich, wenn partprobe, hdparm, blockdev und verschiedene andere Befehle keinen Unterschied zwischen den im Verzeichnis / dev / verfügbaren Gerätedateien zu machen scheinen.

Kerolasa
quelle
0

Bei mir hat weder partprobenoch blockdevLösung geklappt. Obwohl dies funktioniert:

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

Wenn Sie die Manpage für 'man oracleasm-scandisks' lesen, werden Sie den folgenden Text beachten. oracleasm verwendet / proc / partitions als Quelle für alle durchgeführten Überprüfungen. Sie müssen Ihre Raw-Geräte in / proc / partitions eintragen, bevor Sie einen Scandisk ausführen können. Die Parameter Scanorder und Scanexclude, die Sie in / etc / sysconfig / oracleasm einfügen, beziehen sich auf die Namen in / proc / partitions (!!!!).

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

WIE DAS SCANNEN ABLÄUFT Der Scanvorgang erfolgt in vier grundlegenden Schritten.

   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
quelle
2
... er hat nichts über die Verwendung erwähntoracleasm-scandisks
voretaq7