it-swarm.com.de

Warum wird die Laufwerks- / Partitionsnummer immer noch verwendet?

Oft, besonders wenn ich mit Bootloadern herumspiele, werden numerische Laufwerks- und Partitionsnummern verwendet. Zum Beispiel in meinem /boot/grub/grub.cfg Aha set root='hd0,gpt2', meine UEFI-Starteinträge verweisen häufig auf Laufwerks-/Partitionsnummern, und es scheint in fast jedem Kontext aufzutauchen, wenn es um Bootloader geht.

Jetzt, da wir UUID und PARTUUID haben, scheint die Adressierung von Partitionen auf diese Weise unglaublich instabil zu sein (afaik, es wird nicht garantiert, dass Laufwerke immer in derselben Reihenfolge bereitgestellt werden, ein Benutzer kann die Reihenfolge der Laufwerke verschieben, die an seinen Mobo angeschlossen sind usw.).

Meine Fragen sind daher zweifach:

  1. Ist dieses Adressierungsschema so instabil wie oben beschrieben? Fehlt mir etwas im Standard, was bedeutet, dass dieses Schema weitaus zuverlässiger ist als ich erwartet habe, oder wird dieses Adressierungsschema Ihr System wirklich nicht mehr bootfähig machen (bis Sie zumindest Ihre Starteinträge korrigieren), 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 nicht für alles weitaus stabiler und konsistenter?

14
quixotrykd

Das einfache Nummerierungsschema wird in neueren Systemen nicht verwendet (wobei "kürzlich" Ubuntu 9 und höher ist, haben sich möglicherweise auch andere Distributionen in dieser Ära angepasst).
Sie beobachten zu Recht, dass die Root-Partition mit dem einfachen Nummerierungsschema festgelegt wurde. Dies ist jedoch nur eine Standardeinstellung oder eine Fallback-Einstellung, die normalerweise mit dem nächsten Befehl überschrieben wird, z.

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

Dadurch wird die Root-Partition basierend auf der UUID des Dateisystems ausgewählt.

In der Praxis ist das einfache Nummerierungsschema normalerweise stabil (solange keine Hardwareänderungen vorliegen). Die einzige Instanz, bei der ich eine nicht vorhersehbare Nummerierung beobachtete, war ein System mit vielen USB-Laufwerken, die basierend auf einem First-Come-First-Serve-Muster aufgelistet und dann als IDE-Laufwerke) emuliert wurden. Keiner dieser Prozesse ist dies von Natur aus chaotisch, daher gehe ich von einem Problem bei der Implementierung des jeweiligen System-BIOS aus.

Hinweis: "Root-Partition" bedeutet in diesem Zusammenhang, dass die Partition, von der aus gebootet werden soll, sich von der Partition unterscheiden kann, die das "root aka./File system" enthält.

13
Hermann

Genau genommen spricht UUID überhaupt nicht an.

Die Adressierung ist sehr, sehr einfach: Lesen Sie Laufwerk X Sektor Y - oder sonst. Speicheradresse Z lesen - oder sonst. Die Adressierung ist einfach, schnell, lässt nicht viel Interpretationsspielraum und ist überall.

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

In GRUB heißt dies search (★★) und ist nur verfügbar, wenn GRUB hat bereits Flügel bekommen (Suche ist ein Modul, wie jedes unterstützte Dateisystem, also nur) verfügbar nach dem Laden des Kerns). Unter Linux heißt es (zum Beispiel) findfs, findfs durchsucht die Blockgeräte im System nach einem Dateisystem oder einer Partition.

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 so eindeutig ist, wie sie sein sollte (nach einem dd -Unfall oder ähnlichem), oder Sie erhalten keine Ergebnis, wenn sich die UUID geändert hat - UUIDs sind auch anfällig für Konfigurationsfehler.

Im Allgemeinen sind UUIDs großartig, und natürlich sollten Sie sie überall verwenden, wenn sie verfügbar sind, insbesondere wenn die herkömmliche Adressierung fehlschlagen muss, da die Laufwerksreihenfolge unter Linux zufällig ist. Aber verstehen Sie, dass die Komplexität über das hinausgeht, was eine einfache Adressierung bewirken soll. Und gerade in den frühen Stadien der Bootloader ist dies möglicherweise noch keine Option. Die Adressierung steht an erster Stelle, die wachsenden Flügel kommen später.

Für den Bootloader ist es möglicherweise nicht erforderlich, sich anzustrengen (nicht jeder Bootloader unterstützt eine Vielzahl von Dateisystemen wie GRUB). Wenn hd0 ist aufgrund der Umstände (die vom BIOS bereitgestellt werden) garantiert "die Festplatte, von der wir gebootet haben". Wenn Sie also Probleme mit der Reihenfolge zufälliger Laufwerke ausschließen können, müssen Sie möglicherweise keine möglicherweise enorme Liste anderer Partitionen durchgehen auf der Suche nach UUIDs.

Wenn Sie in Ihrer Konfiguration sicher genug sind, um zu sagen, dass hd0,gpt2 ist das, was du willst, und es muss sein, und es kann nicht anders sein, dann ist nichts falsch daran, es so zu benutzen. Manchmal funktioniert die einfache Adressierung einwandfrei.


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

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

... und es ist ähnlich für UUIDs.


(★★) Tatsächlich hat GRUBs search ein --hint Option, und ... jetzt habe ich den Quellcode nicht überprüft und er 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 search bis überprüfen Sie zuerst diese Partition, und wenn die UUID wie erwartet übereinstimmt, identifiziert sie das Gerät mit minimalem Aufwand, und wenn sie nicht übereinstimmt Es wird immer noch auf die vollständige Suche zurückgreifen, damit die Dinge irgendwie funktionieren.

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

20
frostschutz

Etiketten auch nicht vergessen. Sie sind nicht so einzigartig wie UUIDs, aber viel informativer und machen Ihren fstab menschlich lesbar. Wenn es sich um Ihren Desktop oder ein kleines Unternehmen handelt - mit anderen Worten, Sie verwalten einige bis einige Dutzend Laufwerke -, bevorzugen Sie möglicherweise Labels gegenüber UUIDs.

Nachdenken über @ frostschutz's ausgezeichnete Antwort auf Ihre Frage, ein Szenario, in dem Sie wahrscheinlich die "klassische" Adressierung von Geräteverbindungen bevorzugen würden, ist das VM Setup, insbesondere in der VM-for-Hire (abgekürzt, verwirrend "IaaS") Wolken. Angenommen, Sie möchten ein bunzima 04.18 Bild anpassen. Sie erstellen ein (Wegwerf-) VM mit 2 Festplatten: Eine ist das (Wegwerf-) Systemlaufwerk und die zweite das, das Sie bereitstellen und anpassen. Vermutlich mounten Sie auch die UEFI-Boot-Partition, wenn Sie einen neueren Grub auf Ihrer neuen Festplatte grubben möchten. Angenommen, Sie haben unter /mnt Einhängepunkte für die Zielpartitionen ausgewählt, sieht Ihre gewünschte Einhänge-Tabelle so aus

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

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

  • Alle modernen Betriebssystem-Distributionen, von denen unsere imaginären bunzima 04.18 keine Ausnahme sind, basieren auf UUID-benannten Mounts.
  • Alle Festplatten, die vom selben Image bereitgestellt werden, haben dieselbe UUID. UUIDs sind einzigartig. Was kann also schief gehen?

Sie sehen bereits, wohin das alles führt.

Beim ersten Start dieser frankencontraption wurde sda9 Als EFI-Bootpartition ausgewählt, aber Linux hat beschlossen, sdb1 Als Root-FS erneut bereitzustellen:

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

Und da mein Roll-out-Skript darauf nicht vorbereitet war, habe ich am Ende ein nicht bootfähiges Dud-Image, ohne dass sich ein einziges Tool während des Frankenbuilds im Protokoll beschwert!

Natürlich Ich habe die Mount-Tabelle in die Protokolle gedruckt. Und natürlich das Durcheinander ist sehr schwer zu erkennen, da Mount (8) die Halterungen in der Reihenfolge zwischen zufällig und der Reihenfolge, in der die Geräte montiert wurden, druckt. Es war also nicht überraschend, dass ich dies nicht tat Finde es sofort. Und stellen Sie sich vor, dasselbe Skript (aber mit Datenträgern aus verschiedenen Bildern) funktionierte zuvor so reibungslos 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 Ihrem Android Telefon und einem Cloud-Rechenzentrum. Eine SO Antwort soll objektiv sein, und meine Erfahrungen oder Vorlieben sind es natürlich nicht. Daher möchte ich lieber Beispiele für logisches Denken zeigen, wenn ich zwischen verschiedenen Methoden zur Identifizierung von Partitionen auswähle:

  • Lass es in Ruhe , wenn du keinen Grund hast, es nicht zu tun. Die UUIDs sind die Standardeinstellung für die meisten modernen Distributionen. Wenn Sie ein zweites Laufwerk hinzufügen möchten, versuchen Sie es und entscheiden Sie. Wahrscheinlich müssen Sie es nie wissen. Wenn Ihr System immer noch startet und Sie das neue Gerät sehen und partitionieren können, formatieren Sie es und fügen Sie es zu fstab hinzu (nach UUID, LABEL oder über einen /dev - Link gelten dieselben Überlegungen). Nur wenn Ihr System nach dem Einstecken des zusätzlichen Laufwerks den Start verweigert, tritt ein Problem auf (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 auf Ihrem eigenen Desktop angeschlossen ist, möglicherweise die schnellste und einfachste Lösung, während die Änderung der Art und Weise, wie das System gestartet wird, und die Wiederherstellung nach einem sehr wahrscheinlichen Startfehler wahrscheinlich der schlimmste Zeitfresser ist. Aber wenn Sie es für 50 Programmierer schaffen, die der Meinung sind, dass das Einwerfen eines zusätzlichen Laufwerks kein Problem ist, das Sie stört, testen Sie zumindest nicht die Grenzen Ihres Glücks und stellen Sie sicher, dass ihre anfänglichen Startlaufwerke alle von grub als hd0 Und das System als sda.

  • Labels zum Verwalten Ihrer eigenen Laufwerke und Partitionen auf Ihrem oder drei Desktops oder ein kleines Milieu (ein Wohnzimmer eines Hauses voller Software-Ingenieure, die den Ort lustigerweise als ihr „Startup-Büro“ bezeichnen ”). Wenn Sie ein physisches Laufwerk von einem Computer ziehen, wissen Sie, woher es stammt, wenn Sie Etiketten konsequent verwenden.

    Wenn lsblk (8) LABEL=bubba-boot Sagt, wissen Sie, dass es von der Maschine mit dem Namen bubba gezogen wurde. Außerdem rollt bubba-boot ​​viel einfacher über meine Zunge als 6864c4ea-f9b9-46db-b875-4d7fc2981007, was nach meinem verwöhnten Geschmack geradezu ein Kieferbrecher ist. Wenn Sie sicherstellen, dass Etiketten eindeutig sind, werden Sie jetzt davon überzeugt. Als Gegenleistung erhalten Sie jedoch die Aussagekraft des Etiketts.

  • /dev - Linkbasierte Benennung, wenn Sie ein Bataillon relativ kurzlebiger, wartungsarmer VMs befehligen, die das Ergebnis desselben Images sind, und Sie würden nicht wetten Ihr Wochenlohn, dass alle ihre UUID das UU-Versprechen einhalten. Jeder sane VM Dienst, sei es Vyper-H auf Ihrem eigenen physischen Server oder Kugel Cloud oder irgendetwas, darf niemals Rufen Sie Ihr Boot-Laufwerk sde und das zweite und einzige andere sdc ² auf. In einer physischen Maschine hingegen können Sie diese Anordnung leicht erreichen, indem Sie SATA-Kabel kreativ anschließen.

    Ich schweife jetzt ab, aber in diesem Szenario gehe ich den gleichen Weg mit der sogenannten „konsistenten“ Benennung der Ethernet-Schnittstelle: Deaktivieren Sie sie in VMs. Versteh mich nicht falsch, die Benennung ist wirklich konsistent, solange das NIC, das du in den PCI-Steckplatz 4 steckst, nicht plötzlich aus eigener Laune zu Steckplatz 5 springt, während du nicht hinschaust (oder vielleicht) auch wenn Sie es sind; NICs schämen sich überhaupt nicht). Leider tun sie dies im Milieu des „Bataillons der VMs“ tatsächlich. In diesem Fall ist eth0 Gegenintuitiv mehr konsistent als enp0s4f6. 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 drei genannten Entitäten ist physisch real), und das Es wird immer die Funktion 6 sein. Sie können sich jedoch ziemlich darauf verlassen, dass die erste Schnittstelle vor der zweiten liegt, da sie normalerweise dasselbe Treibermodul haben, üblicherweise aus der virtio-Familie (und wenn das erste NIC ist nicht immer eth0, es gilt immer noch der gleiche Hinweis²).


¹ Im übertragenen Sinne natürlich. Ich war schon viel zu lange in diesem Geschäft, um noch etwas übrig zu haben.
² Wenn ja, würde ich ernsthaft darüber nachdenken schreiend davonlaufen Ändern des Anbieters oder der Hypervisor-Software VM.

5
kkm

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. Beispielsweise könnte man das ältere Schema bevorzugen (und sogar Persistenz-Hacks im udev-Stil deaktivieren), wenn das Ersetzen von Laufwerken (virtuelle Hardware oder tatsächliche Hardware) im laufenden Betrieb erfolgt, ohne dass Konfigurationsdateien geändert werden müssen wollte.

3
rackandboneman

Die Antwort auf Ihre zweite Frage ("Warum wird dieses Adressierungsschema weiterhin verwendet?") Ist vermutlich Trägheit. Ja, es ist durchaus möglich, nur UUIDs auf GPT-partitionierten Festplatten zu verwenden. Sie können UUIDs anstelle von /dev/xxx - Namen in /etc/fstab Verwenden. Und jetzt, da wir 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 fehlt der Eintrag root= In der Kernel-Befehlszeile vollständig.

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

2
Johan Myréen