Ihre Frage (" Wie und wo soll ich diese glibc in mein Root-Dateisystem kopieren? ") Lässt mehrere Antworten zu, wobei die in den FAQ genannte die mit den Mindestanforderungen ist (wenn auch nicht die einfachste überhaupt, IMHO).
Nach dem Booten des Kernels als Root- Mount wird die neue initrd vorgeschlagen (und endet daher mit einer Eingabeaufforderung wie " (initramfs) " , wenn Sie Ihr reales System irgendwo unterhalb Ihres Dateisystems mounten. Angenommen, Sie haben Ihr reales Root-Dateisystem residiert in / dev / sda1, so etwas 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 das INITRD gepackt haben, mit dem Sie gebootet und als Root gemountet haben.
- / new_root / lib => enthält die alten Bibliotheken, die noch auf Ihrer Festplatte in Ihrem (nicht laufenden) realen System vorhanden sind.
(Übrigens: Abhängig von Ihrer Architektur können Sie neben der erwähnten / lib- Struktur auch eine lib64- Struktur haben. Wenden Sie vor dem Anwenden des, was ich schreibe, einige Überprüfungen auf gesunden Menschenverstand und Vernunft an.)
Zu diesem Zeitpunkt haben Sie bereits alle Voraussetzungen, um den Inhalt von / lib nach / new_root / lib zu kopieren und dann einfach / new_root zu laden und neu zu starten.
Also, warum schlagen sie eine solche "Magie" mit pivot_root und dergleichen vor?
IMHO gehen sie in den FAQ davon aus, dass Sie die Anzahl der Neustarts auf ein Minimum beschränken möchten. Ein Neustart ist unvermeidlich (um von INITRD zu starten). Dann können Sie die Root-Partition mounten, die Bibliotheken kopieren und ... das System anweisen, wie gewohnt weiter zu booten und auf das (neue) Root-Dateisystem zu verweisen, das Sie gerade von Ihrer Festplatte gemountet haben. Der entscheidende Punkt hierbei ist, dass der "Root-Mount-Punkt" (mit anderen Worten der Ordner "/") von dem zum INITRD-Image gehörenden zu dem zu Ihrem realen System gehörenden ersetzt werden muss (/ dev / sda1-Partition in / new_root unter dem Dateisystem INITRD eingehängt).
Es gibt mehrere Tools, die "root" ändern können, wobei pivot_root in den FAQ referenziert wird. Hier finden Sie eine Diskussion über die Verwendung von pivot_root, um zwischen zwei Linux-Installationen zu wechseln. Es ist perfekt für Ihren Fall geeignet, da es sich bei den beiden Systemen um das ursprüngliche INITRD-System und das reale System auf Ihrer Festplatte handelt.
Hier finden Sie einige Informationen (und Links), die pivot_root mit switch_root vergleichen.
Bevor ich diese Antwort poste, habe ich einige pivot_root-Tests durchlaufen: Leider konnte ich pivot_root nicht ausführen, was zu verschiedenen Fehlern führte (Übrigens: Ich bin anscheinend nicht allein hier).
Aufgrund der oben genannten Probleme bin ich zu dem Schluss gekommen, dass ein "zweiter Neustart" kein Problem ist und den gesamten Vorgang vereinfacht.
Wie bei anderen Ansätzen ist es auch möglich (... und noch viel einfacher), Ihre Linux-Box einfach mit einer Live-CD (wie SystemRescueCD ) zu booten und:
- Manuelles Extrahieren der (neuen) Bibliotheken aus dem INITRD.
- Ersetzen Sie die (alten) in Ihrem System durch die obigen.
Um auf Ihr INITRD und Ihr reales System zugreifen zu können, müssen Sie Ihre Partitionen natürlich irgendwo im Dateisystem der Live-CD "mounten" (wie oben beschrieben).
Nehmen wir für den Extraktionsprozess an, dass Ihre initrd /mnt/initrd.img-3.2.0-58-generic ist. Lassen Sie uns überprü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
Dekomprimieren wir es nicht, um seinen 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)
Okay. Jetzt haben wir also ein cpio-Archiv . Das Extrahieren des Inhalts ist so einfach wie:
damiano@tablet:/tmp/libs$ cpio -i < init_uncompressed
109835 blocchi
Jetzt haben wir endlich alles extrahiert, einschließlich Ihrer Bibliotheken:
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
Zu diesem Zeitpunkt können Sie einfach den Ordner lib (und lib64) von / tmp / libs nach / mnt kopieren (vorausgesetzt, Ihre Root-Partitionen - / dev / sda1 - sind unter / mnt gemountet) und anschließend neu starten.
Ein letzter (sehr persönlicher) Hinweis: Nachdem ich alles oben Genannte gesagt habe, möchte ich hinzufügen, dass ... obwohl die FAQ eindeutig besagt, dass es gefährlich ist , sich auf Paketmanager zu verlassen, um Systembibliotheken zu aktualisieren , ich persönlich glaube, dass der manuelle Umgang mit Systembibliotheken Bibliotheken alleine ... es ist sicher gefährlicher :-)
Also, bitte, beschuldigen Sie mich nicht, wenn Sie in einem nicht bootfähigen System laufen ;-)
Update 1:
Was " Sobald Sie Ihren Kernel als Root gebootet haben und Ihre neue initrd gemountet haben " betrifft , können Sie folgendermaßen vorgehen:
- Wählen Sie im Menü grub den Eintrag aus, den Sie normalerweise ausführen, und drücken Sie "E" (Bearbeiten). (Übrigens: Wenn Sie kein Menü haben, können diese Frage und / oder andere Online-Suchanfragen hilfreich sein.) Sie gelangen zu einem Bildschirm ähnlich dem folgenden:
Bitte beachten Sie die Zeile zum Kernel. In einer solchen Zeile finden Sie:
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 / lib-Ordner mit den Bibliotheken, die Sie kompiliert und in das INITRD gepackt haben.
make install
generiert in meinem Fall keinlib
Verzeichnis. Die Verzeichnisse sindetc
,lib64
,sbin
,usr
undvar
. Das Beste , was ich bisher erreicht bootet Debian leben (Rettungs-) Bild, dann Root - Shell bekommen, mein Ziel - Dateisystem Montage, Durchführungpivot_root
,chroot . bash
und dannmake install
in das Build - Verzeichnis. Das Problem hier ist die Nichtübereinstimmung der Kernel-Version, da ich glibc für einen neueren Kernel als im Live-Image erstelle.FATAL: kernel too old
, aber glibc selbst wird erfolgreich aktualisiert (überprüft vonldd --version
). Obwohlgetconf -a
nicht funktioniert ...