Kopieren von glibc aus initrd in mein Root-Dateisystem

801
user3900460

Ich versuche, glibc 2.20 (vor kurzem erstellt) in Debian zu installieren, wobei diese Richtlinie aus den FAQ verwendet wird, auf die auf dieser Seite verwiesen wird (die Frage in den FAQ lautet: Wie installiere ich alle gerade erstellten GNU C Library-Projektbibliotheken? ):

Die einzige pedantisch korrekte Methode zum Installieren dieser Bibliotheken ist das Ausführen einer make install INSTALLDIR = / tmp / glibc, mit der die Bibliotheken nach / tmp / glibc installiert werden. Anschließend kopieren Sie dieses Verzeichnis auf eine erste Root-Festplatte. Starten Sie die ursprüngliche Root-Festplatte. Kopieren Sie die Ergebnisse in Ihr Root-Dateisystem und schwenken Sie dann als letzten Schritt des Bootvorgangs in das Root-Dateisystem. Dies ist der einzig sichere Weg, um glibc heute zu installieren.

Es ist mir gelungen, dieses frische glibc-Verzeichnis (das das Produkt enthält make install) in eine dekomprimierte (in Standardeinstellung geladene) Kopie von initrd zu kopieren, es wieder zu komprimieren und nach dem Festlegen dieses neuen initrd in GRUB durch Bearbeiten der Befehlszeile erfolgreich zu booten.

Kann mir jemand sagen, wie und wo ich diese Datei in mein Root-Dateisystem kopieren soll (um sie zur primären C-Bibliothek im System zu machen, anstatt zur aktuellen (Standard))?

0

1 Antwort auf die Frage

1
Damiano Verzulli

Ihre Frage (" wie und wo sollte ich diese Glibc in mein Root-Dateisystem kopieren ") gibt mehrere Antworten, wobei die in den FAQ erwähnte eine Mindestanforderung ist (obwohl nicht die einfachste überhaupt, IMHO).

Was sie vorschlagen, sobald Sie Ihren Kernel mit dem Root-Mounting Ihrer neuen initrd gestartet haben (und daher mit einer Eingabeaufforderung wie ' (initramfs) ' enden, müssen Sie Ihr echtes System irgendwo unterhalb Ihres Dateisystems anhängen. Angenommen, Ihr eigentliches Root-Dateisystem liegt in / dev / sda1, etwa wie

 (initramfs) mkdir /new_root (initramfs) mount /dev/sda1 /new_root 

Danach haben Sie:

  • / lib => enthält die neuen Bibliotheken, die Sie selbst kompiliert und in die INITRD gepackt haben, die Sie zum Booten und Root-Mount verwendet haben.
  • / new_root / lib => enthält die alten Bibliotheken, die noch auf der Festplatte Ihres (nicht laufenden) realen Systems vorhanden sind;

(Übrigens: Sie könnten neben der genannten / lib auch eine lib64- Struktur haben. Abhängig von Ihrer Architektur. Bitte führen Sie einige Überprüfungen des Verstandes und der Vernunft durch, bevor Sie das anwenden, was ich schreibe.)

Zu diesem Zeitpunkt haben Sie bereits alles, was Sie zum Kopieren des Inhalts von / lib nach / new_root / lib benötigen, und dann einfach / new_root umounten und neu starten.

Warum schlagen sie eine solche "Magie" mit Pivot_Root und dergleichen vor?

IMHO wird in den FAQ davon ausgegangen, dass Sie die Anzahl der Neustarts auf ein Minimum beschränken möchten. Ein Neustart ist unvermeidlich (zum Starten von INITRD). Dann können Sie die Root-Partition einhängen, die Bibliotheken kopieren und ... das System anweisen, wie üblich mit dem Booten fortzufahren, wobei auf das (neue) Root-Dateisystem verwiesen wird, das Sie gerade von Ihrer Festplatte gemountet haben. Der Schlüsselpunkt dabei ist, dass der "root-Einhängepunkt" (mit anderen Worten der Ordner "/") von dem mit dem INITRD-Image verbundenen zu dem für Ihr reales System (/ dev / sda1-Partition gemountet an / new_root unter dem INITRD-Dateisystem).

Es gibt mehrere Tools, die in der Lage sind, "root" zu ändern, wobei "pivot_root" in den FAQs referenziert wird. Hier finden Sie eine Diskussion über die Verwendung von pivot_root zum Wechseln zwischen zwei Linux-Installationen. Es ist perfekt für Ihren Fall geeignet, da die beiden Systeme das erste INITRD-System und das eigentliche System auf Ihrer Festplatte sind.

Hier finden Sie einige Informationen (und Links) zum Vergleich von pivot_root mit switch_root.

Bevor ich diese Antwort gepostet habe, habe ich einen Pivot_Root-Test durchlaufen: Leider war ich für PENDEL_Root nicht in der Lage, mit verschiedenen Fehlern zu enden (BTW: Ich scheine hier nicht alleine zu sein ).

Aufgrund der oben genannten Probleme bin ich zu dem Schluss gekommen, dass ein "zweiter Neustart" kein Problem ist und der ganze Vorgang einfach ist.

Wie bei anderen Ansätzen ist es auch möglich (... und sogar viel einfacher), Ihre Linux-Box einfach mit einer Live-CD (wie SystemRescueCD ) zu booten und:

  • Extrahieren Sie die (neuen) Bibliotheken manuell aus dem INITRD.
  • Ersetzen Sie die (alten) in Ihrem System durch Oben.

Um Zugang zu Ihrem INITRD sowie zu Ihrem realen System zu erhalten, müssen Sie Ihre Partitionen irgendwo innerhalb des Dateisystems der live-cd "einhängen" (auf dieselbe Weise wie oben beschrieben).

Nehmen wir für den Extraktionsprozess an, dass Ihre initrd /mnt/initrd.img-3.2.0-58-generic ist. Wir prüfen, ob es komprimiert ist:

damiano@tablet:/$ file /mnt/initrd.img-3.2.0-58-generic /mnt/initrd.img-3.2.0-58-generic: gzip compressed data, from Unix, last modified: Wed Jan 8 11:54:03 2014 

Lassen Sie es nicht dekomprimieren, um den Inhalt besser zu überprüfen (wir arbeiten im Verzeichnis / tmp / libs):

damiano@tablet:/$ mkdir /tmp/libs damiano@tablet:/$ cd /tmp/libs damiano@tablet:/tmp/libs$ gzip -dc /mnt/initrd.img-3.2.0-58-generic > init_uncompressed damiano@tablet:/tmp/libs$ 

Lassen Sie uns nun überprüfen, was in der unkomprimierten Datei enthalten ist:

damiano@tablet:/tmp/libs$ file init_uncompressed  init_uncompressed: ASCII cpio archive (SVR4 with no CRC) 

OK. Jetzt haben wir ein cpio-Archiv . Das Extrahieren des Inhalts ist so einfach wie folgt:

damiano@tablet:/tmp/libs$ cpio -i < init_uncompressed 109835 blocchi 

Nun, endlich haben wir alles extrahiert, inklusive Ihrer Libs:

 damiano@tablet:/tmp/libs$ ls -l totale 54968 drwxr-xr-x 2 verzulli verzulli 4096 dic 31 14:42 bin drwxr-xr-x 3 verzulli verzulli 4096 dic 31 14:42 conf drwxr-xr-x 8 verzulli verzulli 4096 dic 31 14:42 etc -rwxr-xr-x 1 verzulli verzulli 7230 dic 31 14:42 init -rw-rw-r-- 1 verzulli verzulli 56235520 dic 31 14:38 init_uncompressed drwxr-xr-x 9 verzulli verzulli 4096 dic 31 14:42 lib drwxr-xr-x 2 verzulli verzulli 4096 dic 31 14:42 lib64 drwxr-xr-x 2 verzulli verzulli 4096 dic 31 14:42 run drwxr-xr-x 2 verzulli verzulli 4096 dic 31 14:42 sbin drwxr-xr-x 10 verzulli verzulli 4096 dic 31 14:42 scripts drwxr-xr-x 4 verzulli verzulli 4096 dic 31 14:42 usr 

An diesem Punkt können Sie einfach den Ordner lib (und lib64) von / tmp / libs nach / mnt kopieren (vorausgesetzt, Ihre Root-Partitionen - / dev / sda1 - sind unter / mnt eingehängt), und starten Sie dann neu.


Eine abschließende (sehr persönliche) Anmerkung: Nachdem ich all das gesagt habe, möchte ich folgendes hinzufügen ... Auch wenn die FAQ eindeutig darauf hinweist, dass die Verwendung von Paket-Managern zur Aktualisierung von Systembibliotheken gefährlich ist, glaube ich persönlich, dass der manuelle Umgang mit System- Bibliotheken alleine ... es ist sicherlich gefährlicher :-)

Also, bitte, gib mir nicht die Schuld, wenn du in einem nicht bootfähigen System rennst ;-)


Update 1:

"Wenn Sie den Kernel mit dem neuen initrd booten ", können Sie folgendermaßen vorgehen:

  1. Wählen Sie im Grub-Menü den Eintrag aus, den Sie normalerweise ausführen, und drücken Sie "E" (Bearbeiten). (Übrigens: Wenn Sie kein Grub-Menü haben, können diese Frage und / oder andere Online-Suchen hilfreich sein). Sie gelangen zu einem Bildschirm, der diesem ähnlich ist:

Bitte beachten Sie die Zeile, die sich auf den Kernel bezieht. In dieser Zeile finden Sie:

  • Verweis auf den Kernel (vmlinux-3.8.0-19-generic in meinem Beispiel);
  • Verweis auf das Gerät, das zum Einhängen des Root-Dateisystems verwendet werden soll (root = / dev / mapper / kubuntu - vg-root in meinem Beispiel);
  • andere Boot-Parameter (ro quiet splace $ vt_handoff)

    1. Wenn Sie die initrd-Datei, die Sie vorbereitet haben (und nicht die übliche Einheit device / hard_drive / partition) enthält, in das root-mount einbinden möchte, müssen Sie die Zeile oben bearbeiten und die Referenz auf den Parameter "root =" as ersetzen im:

Bitte beachten Sie, dass ich root = / initrd.img-3.8.0-19-generic verwendet habe, während Sie auf Ihre spezifische initrd-Datei verlinken sollten

  1. Wenn Sie den Parameter "root =" richtig definiert haben, drücken Sie einfach die Taste F10. Nach einigen Sekunden sollten Sie zur Eingabeaufforderung (initramfs) gelangen, wie in:

Jetzt hat Ihr "/" einen Ordner / lib mit den Bibliotheken, die Sie kompiliert haben ... und innerhalb der INITRD gepackt sind.


Vielen Dank für diese Antwort. Sie schreiben "Sie haben Ihren Kernel mit dem Root-Mounting Ihrer neuen initrd (und damit endend mit einer Eingabeaufforderung wie" (initramfs) ")" ". Könnten Sie bitte sagen, was ich tun soll, um eine Eingabeaufforderung wie (initramfs) zu erhalten? user3900460 vor 9 Jahren 0
Soll ich für meine frische Glibc eine Art minimaler Initrd anstelle meiner Standard-Initrd verwenden? Oder ist die Eingabeaufforderung (initramfs) nach dem Bearbeiten der Befehlszeile im GRUB-Menü beim Booten erreichbar? user3900460 vor 9 Jahren 0
Ich habe gerade meine Antwort aktualisiert, um zu erklären, wie Sie Ihr initrd booten können. Damiano Verzulli vor 9 Jahren 0
Zunächst schätze ich Ihre Bemühungen sehr. Sie haben mich wirklich inspiriert, obwohl ich nach dem Kopieren dieser Verzeichnisse kein bootfähiges System erhalten konnte. In meinem Fall generiert "make install" übrigens kein "lib" -Verzeichnis. Die Verzeichnisse lauten `etc`,` lib64`, `sbin`,` usr` und `var`. Das Beste, was ich bisher erreicht habe, ist das Booten eines Live-Images von Debian (Rettung), das Erhalten der Root-Shell, das Anhängen meines Zieldateisystems, das Ausführen von "pivot_root", "chroot". bash `und dann` make install` im build-Verzeichnis. Das Problem hier ist der Kernelversionskonflikt, da ich glibc für einen neueren Kernel als im Livebild baue. user3900460 vor 9 Jahren 0
Es kehrt schließlich mit `FATAL: Kernel zu alt` zurück, aber glibc selbst wird erfolgreich aktualisiert (überprüft von` ldd --version`). "Getconf -a" funktioniert jedoch nicht ... user3900460 vor 9 Jahren 0
Die letzte Herausforderung auf diesem Weg besteht vielleicht darin, den Kernel in diesem Live-Image von Debian zu aktualisieren, damit `make install 'so ausgeführt werden kann, wie es sollte ... user3900460 vor 9 Jahren 0