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:
- 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)
- 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
- 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.