Wie verwende ich eine neue fdisk-Tabelle ohne Neustart (kpartx)?


10

Wenn ich fdisk ausführe und die Größe einer Partition ändere, sagt fdisk am Ende der Ausgabe:

The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8)

Ich möchte dies tun, ohne neu starten zu müssen (und dann ein Skript zu schreiben, das dies tut). Wie verwende ich kpartx , um dies korrekt durchzuführen ? Ich habe es versucht:

kpartx -f -v /dev/mmcblk0

Welche Ausgänge:

mmcblk0p1 : 0 102400 /dev/mmcblk0 2048
mmcblk0p2 : 0 7657472 /dev/mmcblk0 104448

und:

kpartx -a -v /dev/mmcblk0

welche Ausgänge:

device-mapper: reload ioctl on mmcblk0p1 failed: Invalid argument
create/reload failed on mmcblk0p1
add map mmcblk0p1 (0:0): 0 102400 linear /dev/mmcblk0 2048
device-mapper: reload ioctl on mmcblk0p2 failed: Invalid argument
create/reload failed on mmcblk0p2
add map mmcblk0p2 (0:0): 0 7657472 linear /dev/mmcblk0 104448

Dies ist für eine SD-Karte in einem Raspi mit Debian.

EDIT: Um zu klären, was ich versuche zu tun; Ich lösche einen nicht verwendeten p3 von einer SD-Karte und ändere die Größe von p2, um die Karte zu füllen. Die Karte enthält derzeit eine kleine Boot-Partition p1 und p2 befindet sich auf dem Betriebssystem.


Wird die SD-Karte derzeit verwendet? (ZB hat es ein gemountetes Dateisystem?)
derobert

@derobert, ja das tut es. Es hat 2 Partitionen: eine kleine Boot-Partition und eine größere Hauptpartition, auf der sich der Großteil des Betriebssystems befindet. Ich versuche nur, die 2. Partition zu erweitern, um die Karte zu füllen.
Octopus

2
Ich bin mir ziemlich sicher, dass das die Antwort ist - das kannst du nicht. Der Kernel wird eine Partitionstabelle nicht erneut lesen, es sei denn, das Gerät wird nicht verwendet ...
derobert

Antworten:


6

Ich glaube, dass @derobert (der die ursprüngliche Frage kommentiert hat) wahrscheinlich richtig ist. Wenn Sie eine Partition fdisking verwenden, die gerade verwendet wird, gibt es anscheinend keine andere Option als einen Neustart.

Selbst wenn ich benutze partprobe(was mit erhalten wird apt-get install parted), erhalte ich die folgende Ausgabe:

Error: Partition(s) 2, 3 on /dev/mmcblk0 have been written, but we have 
been unable to inform the kernel of the change, probably because it/they 
are in use.  As a result, the old partition(s) will remain in use.  You 
should reboot now before making further changes.

Ich habe das Gleiche getan. Eine gute Nachricht ist, dass ich die Bereitstellung aufheben, partprobe <Gerät> ausführen und beide Partitionen ohne Neustart erneut bereitstellen konnte. Leider waren aufgrund des Herunterfahrens von Diensten immer noch Ausfallzeiten erforderlich.
Rahly

3
Neuere Versionen von parted/ partprobegeben keinen solchen Fehler aus und können auf einer bereitgestellten Partition ohne Neustart verwendet werden.
Psusi

@psusi, ich verwende eine aktuelle Version von parted, erhalte aber immer noch den gleichen Fehler. Die Lösung besteht darin, die Bereitstellung des Geräts aufzuheben, bevor es partedauf dem Gerät ausgeführt wird. Anschließend müssen Sie Ihr System nicht neu
starten

6

Sie möchten partx -unicht kpartx(was auf Device-Mapper-Geräten funktioniert).


Was ist der Zweck der -uFlagge?
Igor Ganapolsky

1
@IgorGanapolsky, um die Kernel-Partitionstabelle so zu aktualisieren , dass sie mit der auf der Festplatte übereinstimmt. Ein schneller man partxhätte darauf geantwortet.
Psusi

@ Octopus Das hat es für mich getan, wo partprobe es nicht getan hat. Partprobe kehrte dann ohne diesen Fehler zurück.
Duncan X Simpson

1

Ich habe dieses Problem bekommen, weil ich vergessen habe, das Gerät abzumelden. Nach einer:

sudo umount /dev/sdb

fdisk hat richtig funktioniert.


1
Ich erhalte immer noch eine Fehlermeldung: Aufruf von ioctl () zum erneuten Lesen der Partitionstabelle. Das erneute Lesen der Partitionstabelle ist fehlgeschlagen: Gerät oder Ressource ausgelastet
IgorGanapolsky
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.