Warum wird die Laufwerks- / Partitionsnummer noch verwendet?


14

Vor allem beim Herumspielen mit Bootloadern werden häufig numerische Laufwerks- und Partitionsnummern verwendet. Zum Beispiel beziehen sich meine UEFI-Starteinträge , wie /boot/grub/grub.cfgich sehe set root='hd0,gpt2', häufig auf Laufwerks- / Partitionsnummern, und sie scheinen in fast jedem Kontext aufzutauchen, in dem es um Bootloader geht.

Da wir nun UUID und PARTUUID haben, scheint es unglaublich instabil zu sein, Partitionen auf diese Weise zu adressieren.

Meine Fragen sind daher zweifach:

  1. Ist dieses Adressierungsschema so instabil wie oben beschrieben? Fehlt im Standard etwas, das bedeutet, dass dieses Schema weitaus zuverlässiger ist als erwartet, oder macht dieses Adressierungsschema Ihr System wirklich nicht mehr startfähig (bis Sie zumindest Ihre Starteinträge korrigiert haben), da Ihre Laufwerke einfach in a erkannt werden andere Reihenfolge oder stecken Sie sie in verschiedene Steckplätze auf Ihrem Motherboard?

  2. Wenn die Antwort auf die obige Frage Ja lautet, warum wird dieses Adressierungsschema dann weiterhin verwendet? Wäre die Verwendung von UUID oder PARTUUID für alles nicht wesentlich stabiler und konsistenter?


4
Das BIOS hat die Laufwerksnummern verwendet, UEFI kann die Nummern verwenden (nicht sicher, ob es auch UUID verwenden kann) und grub usw. Ordnen Sie die UUIDs einfach den verwendeten Nummern zu. Selbst wenn Sie UUIDs in jede Konfigurationsdatei einfügen, ist die Wahrscheinlichkeit hoch, dass es sich auf der unteren Ebene immer noch um Laufwerksnummern handelt. Die Treibernummern sind BIOS / UEFI / Hardware-abhängig und "instabil", die Partitionsnummern sind gut definiert und "stabil".
Dirkt

4
Ich stelle fest, dass Sie über UEFI sprechen. Beachten Sie, dass UEFI nur auf ungefähr 10% der von Linux unterstützten Plattformen vorhanden ist, noch weniger, wenn Sie andere Unices und Unixoids einbeziehen. Tatsächlich gibt es auch auf den CPU-Architekturen, auf denen UEFI verwendet wird (IA-32, AMD64 und IA-64), Nicht-UEFI-Systeme. PCs, die vor UEFI als "BIOS" bezeichnet wurden, und BIOS-basierte PCs gibt es immer noch. Außerdem gibt es Plattformen, die nicht auf PC x86 / AMD64 basieren und z. B. OpenFirmware, Coreboot oder manchmal gar keine Plattform-Firmware verwenden! Nicht alle Dateisysteme haben UUIDs. Nicht alle Partitionierungsschemata verfügen über UUIDs. Und so weiter ...
Jörg W Mittag

@ Jörg W Mittag das macht Sinn! Ich habe festgestellt, dass es ziemlich weit verbreitet ist, dass das BIOS-Booten "wahrscheinlich" die meiste Zeit funktioniert, und die Leute stellen es darüber hinaus nicht in Frage, weil es so weit verbreitet ist. Ich war gespannt, ob UEFI einige der oben genannten Probleme mit fehlenden Implementierungsgarantien im BIOS behoben hat, aber es sieht so aus, als ob wir immer noch darauf vertrauen, dass es "gut genug" funktioniert. Na ja ... Ich werde es einfach zum Laufen bringen und nicht anfassen.
Quixotrykd

Antworten:


13

Das einfache Nummerierungsschema wird in neueren Systemen nicht verwendet (wobei "recent" Ubuntu 9 und höher ist und möglicherweise auch andere Distributionen in dieser Ära angepasst wurden).
Beachten Sie, dass die Root-Partition mit dem einfachen Nummerierungsschema festgelegt wurde. Dies ist jedoch nur eine Standard- oder Ersatzeinstellung, die normalerweise mit dem nächsten Befehl überschrieben wird, z.

search --no-floppy --fs-uuid --set=root 74686973-6973-616e-6578-616d706c650a

Dies wählt die Root-Partition basierend auf der UUID des Dateisystems aus.

In der Praxis ist das einfache Nummerierungsschema normalerweise stabil (solange keine Hardwareänderungen vorgenommen werden). Das einzige Beispiel, bei dem ich eine nicht vorhersehbare Nummerierung beobachtete, war ein System mit vielen USB-Laufwerken, die anhand eines First-Come-First-Serving-Musters aufgelistet und dann als IDE-Laufwerke emuliert wurden. Keiner dieser Prozesse ist von Natur aus chaotisch, daher gehe ich von einem Problem bei dieser speziellen System-BIOS-Implementierung aus.

Hinweis: "Root-Partition" bezeichnet in diesem Kontext die Partition, von der aus gebootet werden soll. Diese Partition kann sich von der Partition unterscheiden, die das "Root-aka. / Dateisystem" enthält.


Ich bin zurückgegangen und habe nachgeschaut, und Sie haben Recht, dass ich die nächste Zeile in meiner Konfigurationsdatei verpasst haben muss - das macht viel mehr Sinn. Meine UEFI-Starteinträge verwenden ebenfalls diese unformatierte Nummerierung (z. B. SATA (0x3, 0x0, 0x0). Bedeutet dies, dass meine UEFI-Starteinträge auch nicht mehr funktionieren, wenn ich meine Laufwerke verschiebe?
quixotrykd

1
@quixotrykd Ich habe keine Ahnung. Es würde mich nicht wundern, wenn es nicht durch einen Standard definiert wird und folglich von der jeweiligen EFI-Implementierung Ihres Systems abhängt.
Hermann

Es ist auch instabil NVMe Geräte, die Gerätenummer ist abhängig von Erfassungsreihenfolge nicht Schlitz Ordnung, zumindest hatte ich einige Maschinen , bei denen PCIe - Karte basierend NVMes ihre Zahl geschaltet (nach dem Neustart und wahrscheinlich Kernel - Update)
Eckes

20

Genau genommen spricht UUID überhaupt nicht an.

Die Adressierung ist sehr, sehr einfach: Laufwerk X Sektor Y lesen - oder auch. Speicheradresse Z auslesen - oder sonst. Die Adressierung ist einfach, schnell, lässt wenig Interpretationsspielraum und ist überall.

UUID adressiert nicht. Stattdessen wird gesucht, gefunden, manchmal darauf gewartet, dass Geräte angezeigt werden, und es werden auch Dateisysteme verstanden (★) verstanden. Und je nachdem, wie viele Geräte es gibt, kann es sehr lange dauern. Und einmal gefunden, zurück zur normalen Adressierung.

In GRUB heißt dies search(★★) und ist nur verfügbar, wenn GRUB bereits Flügel entwickelt hat (die Suche ist ein Modul, wie jedes unterstützte Dateisystem, und steht daher erst nach dem Laden des Kerns zur Verfügung). Unter Linux ist es (zum Beispiel) genannt findfs, findfs die Blockgeräte im System für ein Dateisystem oder eine Partition suchen suchen .

Es durchläuft alle Blockgeräte, weckt sie aus dem Standby-Modus, liest Daten und das Ergebnis kann sogar noch zufällig sein, wenn die UUID nicht eindeutig ist, wie es sein sollte (nach einem ddUnfall oder ähnlichem), oder Sie erhalten kein Ergebnis, wenn die UUID geändert wurde. UUIDs sind auch anfällig für Konfigurationsfehler.

Im Allgemeinen sind UUIDs großartig, und Sie sollten sie natürlich überall verwenden, wenn sie verfügbar sind, insbesondere dann, wenn die herkömmliche Adressierung fehlschlägt, da die Reihenfolge der Laufwerke unter Linux zufällig ist. Verstehen Sie jedoch, dass die Komplexität über das hinausgeht, was eine einfache Adressierung bewirken soll. Und gerade in den frühen Stadien von Bootloadern ist dies möglicherweise noch keine Option. Die Adressierung steht an erster Stelle, das Wachsen der Flügel kommt später.

Für den Bootloader ist es möglicherweise nicht erforderlich, sich die Mühe zu machen (nicht jeder Bootloader unterstützt eine Vielzahl von Dateisystemen wie GRUB). Wenn hd0aufgrund von Umständen garantiert "die Festplatte, von der wir gebootet haben" (vom BIOS bereitgestellt), und Sie daher Probleme mit der zufälligen Laufwerksreihenfolge ausschließen können, ist es möglicherweise nicht erforderlich, eine potenziell enorme Liste anderer Partitionen in zu durchsuchen Suche nach UUIDs.

Wenn Sie sich in Ihrer Konfiguration sicher genug sind, um zu sagen, dass dies hd0,gpt2die gewünschte Konfiguration ist und dies auch sein muss, und es auch nicht anders sein kann, dann ist es nichts Falsches daran, sie so zu verwenden. Manchmal funktioniert die einfache Adressierung einwandfrei.


(★) Ich habe dies zuvor für LABELs hier erklärt ...

Es gibt keinen generischen Standard für Etiketten, es ist alles handgestrickt, siehe zum Beispiel diese Implementierung von Superblock-Formaten in util-linux . Wenn Sie morgen ein neues Dateisystem erfinden, selbst wenn es eine Bezeichnung hat, wird es erst angezeigt, wenn die Unterstützung hinzugefügt wird.

... und bei UUIDs ist es ähnlich.


(★★) Eigentlich hat GRUB searcheine --hintOption, und ... jetzt habe ich den Quellcode nicht überprüft und es ist nicht einmal in ihrem Handbuch dokumentiert, aber eine solche Option wäre sinnvoll, um Ihnen das Beste aus beiden Welten zu bieten: Der Hinweis sollte darauf hinweisen search, dass zuerst diese Partition überprüft werden muss. Wenn die UUID wie erwartet übereinstimmt, wird das Gerät mit minimalem Aufwand identifiziert. Wenn sie nicht übereinstimmt, wird trotzdem auf die vollständige Suche zurückgegriffen, damit die Dinge irgendwie weiter funktionieren .

Darüber hinaus werden zuvor gefundene UUIDs in der Regel zwischengespeichert, sodass nicht immer wieder alle Geräte durchlaufen werden müssen - und dies funktioniert auch hervorragend, sofern die gesuchte UUID tatsächlich irgendwo vorhanden ist mache es zuerst in den Cache.


5

Vergessen Sie auch nicht Etiketten. Sie sind nicht so eindeutig wie UUIDs, aber viel informativer und machen Ihre fstab für den Menschen lesbar. Wenn es sich um Ihren Desktop oder eine kleine Firma handelt - mit anderen Worten, wenn Sie ein paar bis ein paar Dutzend Laufwerke verwalten, bevorzugen Sie möglicherweise Labels gegenüber UUIDs.

Über @ frostschutz ' hervorragende Antwort auf Ihre Frage nachgedacht , ist ein Szenario, in dem Sie wahrscheinlich die "klassische" Geräte-Link-Adressierung bevorzugen, das VM-Setup, insbesondere in den VM-for-Hire-Clouds (abgekürzt und verwirrend "IaaS"). Angenommen, Sie möchten ein Ubunzima 04.18- Image anpassen . Sie erstellen eine (Wegwerf-) VM mit zwei Laufwerken: eines ist das (Wegwerf-) Systemlaufwerk und das zweite das, das Sie bereitstellen und anpassen. Vermutlich mounten Sie auch die UEFI-Boot-Partition, wenn Sie einen neueren Grub auf Ihrer neuen Festplatte erstellen möchten. Angenommen, Sie haben Mount-Punkte für die Zielpartitionen unter ausgewählt /mnt, sieht Ihre gewünschte Mount-Tabelle wie folgt aus

/dev/sda1    /
/dev/sda9    /boot/efi
/dev/sdb1    /mnt/root
/dev/sdb9    /mnt/efi

Sie erstellen also aus dem vorhandenen, vom Anbieter bereitgestellten, Cloud-fähigen Image zwei identische Laufwerke, verbinden sie mit einer neuen VM und starten sie. Natürlich,

  • Alle modernen Betriebssystem-Distributionen, auch unser imaginäres Ubunzima 04.18 , setzen auf Mounts mit UUID-Namen.
  • Alle Festplatten, die von demselben Image bereitgestellt wurden, haben dieselbe UUID. UUIDs sind eindeutig. Was kann also schief gehen?

Sie sehen bereits, wohin das alles führt.

Beim ersten Start dieser frankencontraption wurde sie sda9als EFI- Startpartition ausgewählt , Linux entschied sich jedoch für die erneute Bereitstellung sdb1als Root-FS:

/dev/sda1    /mnt/root
/dev/sdb1    /
/dev/sda9    /boot/efi
/dev/sdb9    /mnt/efi

Und da mein Rollout-Skript dafür ziemlich unvorbereitet war, habe ich am Ende ein nicht bootfähiges Dud-Image, ohne dass sich ein einziges Tool während des Frankenbaus im Log beschwert!

Natürlich habe ich die Mount-Tabelle in den Protokollen ausgedruckt. Und natürlich ist das Durcheinander sehr schwer zu erkennen, da mount (8) die Drucke in der Reihenfolge zwischen zufällig und dem ausgibt, in der die Geräte montiert waren. Es war also nicht verwunderlich, dass ich es nicht sofort erkannt habe. Und stellen Sie sich vor, dass dasselbe Skript (jedoch mit Datenträgern aus verschiedenen Images) zuvor so reibungslos funktioniert hat wie der 15-jährige Glenfiddich. Ratet mal, wie viele Stunden ich damit verbracht habe, meine Haare über den Baumstamm zu ziehen, um das Problem herauszufinden?


Es gibt keine festen Regeln für jede Situation, von einem Desktop-PC über ein in einen Router eingebettetes Linux bis hin zu einem Android-Telefon und einem Cloud-Rechenzentrum. Eine SO-Antwort soll objektiv sein, und meine Erfahrungen oder Vorlieben natürlich nicht. Daher zeige ich eher Beispiele für logisches Denken, wenn ich zwischen verschiedenen Methoden zum Identifizieren von Partitionen wähle:

  • Lass es in Ruhe, wenn du keinen Grund hast es nicht zu tun. Die UUIDs sind die Standardeinstellungen für die meisten modernen Distributionen. Wenn Sie ein zweites Laufwerk hinzufügen möchten, versuchen Sie es und entscheiden Sie sich. Möglicherweise müssen Sie es nicht einmal wissen. Wenn Ihr System immer noch bootet und Sie das neue Gerät sehen und partitionieren können, formatieren Sie es und fügen Sie es zu fstab hinzu (nach UUID, nach LABEL oder nach einem /devLink gelten dieselben Überlegungen). Erst wenn sich Ihr System weigert, nach dem Einstecken des zusätzlichen Laufwerks zu starten, haben Sie ein Problem (und möglicherweise ist das Ändern der Startreihenfolge im UEFI-BIOS der schnellste Ausweg).

    Pragmatisch gesehen ist die Kennzeichnung, welcher SATA-Anschluss an welches Laufwerk in Ihrem eigenen Desktop angeschlossen ist, möglicherweise die schnellste und einfachste Lösung. Die Änderung der Art und Weise, in der das System gestartet wird, und die Wiederherstellung nach einem wahrscheinlichen Startfehler sind jedoch wahrscheinlich die schlimmsten Probleme. Aber wenn Sie es für 50 Programmierer schaffen, die der Meinung sind, dass das Einspielen eines zusätzlichen Laufwerks kein Problem ist, das Sie stören könnte, sollten Sie zumindest nicht die Grenzen Ihres Glücks testen und sicherstellen, dass alle anfänglichen Startlaufwerke von grub als hd0und erkannt werden das System als sda.

  • Etiketten zur Verwaltung Ihrer eigenen Laufwerke und Partitionen auf Ihrem Desktop oder in drei oder in einem kleinen Milieu (einem Wohnzimmer eines Hauses voller Software-Ingenieure, die den Ort auf lustige Weise als "Start-up-Büro" bezeichnen). Wenn Sie ein physisches Laufwerk aus dem Computer einer anderen Person ziehen, wissen Sie, woher es stammt, wenn Sie konsequent Etiketten verwenden.

    Wenn lsblk (8) sagt LABEL=bubba-boot, wissen Sie, dass es aus der Maschine namens bubba gezogen wurde . außerdem bubba-Boot rollt über meine Zunge viel einfacher als 6864c4ea-f9b9-46db-b875-4d7fc2981007 , die zu meinem verdorbenen Geschmack, geradezu ein jawbreaker. Sicherzustellen, dass Etiketten eindeutig sind, verlagert sich jetzt auf Sie. Als Gegenleistung erhalten Sie jedoch die Aussagekraft des Etiketts.

  • /dev-linkbasierte Benennung, wenn Sie ein Bataillon von relativ kurzlebigen, wartungsarmen VMs befehlen, die das gleiche Image hervorbringen, und Sie würden nicht auf Ihren Wochenlohn wetten, dass alle ihre UUIDs das Versprechen der UU einhalten. Jeder vernünftige VM-Dienst, sei es Vyper-H auf Ihrem eigenen physischen Server oder in der Kugel Cloud oder so, darf niemals Ihr Startlaufwerk aufrufen sde, und der zweite und der einzige andere sdc². Auf einer physischen Maschine hingegen können Sie diese Anordnung problemlos erreichen, indem Sie SATA-Kabel kreativ anschließen.

    Ich schweife jetzt ab, aber in diesem Szenario gehe ich denselben Weg mit der sogenannten „konsistenten“ Benennung der Ethernet-Schnittstelle: Deaktiviere sie in VMs. Verstehen Sie mich nicht falsch, die Benennung ist wirklich konsistent, solange die NIC, die Sie in den PCI-Steckplatz 4 gesteckt haben, nicht plötzlich von selbst auf Steckplatz 5 springt, während Sie nicht hinsehen (oder vielleicht sogar, während Sie NICs sind) habe überhaupt keine Schande). Leider tun sie dies tatsächlich im Milieu des „Bataillons der VMs“. In diesem Fall eth0ist es widersprüchlich konsistenter alsenp0s4f6. Der VM-Anbieter hat nicht versprochen, seine virtuelle NIC-Nummer 1 immer in Steckplatz 4 auf dem PCI-Bus 0 zu platzieren (und keine der 3 genannten Entitäten ist physisch real), und es wird immer die Funktion 6 sein. Aber Sie können hübsch sein Viel hängt davon ab, dass die erste Schnittstelle vor der zweiten geht, da sie normalerweise dasselbe Treibermodul haben, das üblicherweise aus der virtio-Familie stammt (und wenn die erste eth0Netzwerkkarte nicht immer dieselbe ist, gilt immer noch dieselbe Note²).


¹ Natürlich bildlich. Ich war viel zu lange in diesem Geschäft, um noch welche zu haben.
² Wenn ja, würde ich ernsthaft erwägen , vor ihnen wegzulaufen und den Anbieter oder die VM-Hypervisor-Software zu wechseln.


3

Beide Schemata können mit den meisten Linux-Distributionen gemischt und abgeglichen werden.

Die Konsequenzen können je nach Anwendungsfall wünschenswert oder unerwünscht sein - zum Beispiel kann man das ältere Schema bevorzugen (und sogar Persistenz-Hacks im Udev-Stil deaktivieren), wenn Hot-Replacement von Laufwerken (virtuelle Hardware oder tatsächliche Hardware) ohne Änderung der Konfigurationsdateien erforderlich ist wollte.


2

Die Antwort auf Ihre zweite Frage ("Warum wird dieses Adressierungsschema weiterhin verwendet?") Ist, denke ich, Trägheit. Ja, es ist absolut möglich, nur UUIDs auf mit GPT partitionierten Festplatten zu verwenden. Sie können in UUIDs anstelle von /dev/xxxNamen verwenden /etc/fstab. Und da wir nun die Discoverable Partitions Specification haben , müssen Sie in vielen Fällen nicht einmal mehr die UUIDs angeben. Partitionieren Sie einfach Ihre Festplatte mit dem Partitionstyp, und die Partitionen werden automatisch abgerufen. Auf meinem Computer root=fehlt der Eintrag in der Kernel-Befehlszeile.

Apropos Bootloader: GRUB ist auf modernen UEFI-PCs meist überflüssig, da es sehr wenig mit dem Bootstrapping der Maschine zu tun hat. Heutzutage fungiert GRUB lediglich als Kernelauswahlprogramm, für welche Aufgabe es einfachere und bessere Alternativen gibt, wie zum Beispiel systemd-boot.

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.