Ваш вопрос (« как и где я должен скопировать этот glibc в мою корневую файловую систему ») допускает несколько ответов, причем тот, который упоминается в FAQ, является вопросом с минимальными требованиями (хотя и не самым простым, IMHO).
То, что они предлагают, после того, как вы загрузили ядро с монтированием root для вашего нового initrd (и, следовательно, заканчиваете приглашением типа ' (initramfs) ' ) , это монтирование вашей реальной системы где-то ниже вашей файловой системы. Предположим, что ваша настоящая корневая файловая система находится в /dev /sda1, что-то вроде:
(initramfs) mkdir /new_root
(initramfs) mount /dev/sda1 /new_root
После этого у вас будет:
- /lib => содержит новые библиотеки, которые вы сами скомпилировали и упаковали в INITRD, который вы использовали для загрузки и монтирования root;
- /new_root/lib => содержит старые библиотеки, все еще присутствующие на вашем жестком диске, в вашей (не запущенной) реальной системе;
(Кстати: вы могли бы также иметь структуру lib64 помимо упомянутой /lib, в зависимости от вашей архитектуры. Пожалуйста, примените некоторые проверки здравого смысла и здравомыслия, прежде чем применять то, что я пишу)
На этом этапе у вас уже есть все, что нужно для копирования содержимого из /lib в /new_root /lib, а затем просто отключите /new_root и перезагрузите компьютер.
Так почему же они предлагают такую "магию" с pivot_root и тому подобным?
ИМХО, они предполагают в FAQ, что вы хотите ограничить количество перезагрузок до минимума. Одна перезагрузка неизбежна (для загрузки из INITRD). Затем вы можете смонтировать корневой раздел, скопировать библиотеки и ... сказать системе продолжить загрузку в обычном режиме, указывая на (новую) корневую файловую систему, которую вы только что смонтировали со своего жесткого диска. Здесь ключевой момент заключается в том, что "корневая точка монтирования" (другими словами, папка «/») должна быть заменена на ту, что относится к образу INITRD, на ту, что относится к вашей реальной системе (/dev/ раздел sda1, смонтированный в / new_root в файловой системе INITRD).
Есть несколько инструментов, способных "сменить root", на pivot_root есть ссылка в FAQ. Здесь вы можете найти обсуждение использования pivot_root для переключения между двумя установками Linux. Это идеально подходит для вашего случая, так как две системы - начальная INITRD и реальная система на вашем диске.
Здесь вы можете найти некоторую информацию (и ссылки), сравнивающую pivot_root с switch_root.
Перед тем как разместить этот ответ, я бежать через некоторые испытания pivot_root: несчастливо я не смог pivot_root, заканчиваясь в различных ошибок (BTW: кажется , что я не один здесь).
Из-за вышеперечисленных проблем я пришел к выводу, что "вторая перезагрузка" не является проблемой и облегчает весь процесс.
Что касается других подходов, также возможно (... и даже намного проще) просто загрузить linux-box с Live-CD (например, SystemRescueCD) и:
- вручную извлекать (новые) библиотеки из INITRD;
- замените (старые) в вашей системе вышеупомянутыми.
Очевидно, чтобы получить доступ к вашему INITRD, а также к вашей реальной системе, вам необходимо "смонтировать" ваши разделы где-нибудь в файловой системе live-cd (так же, как обсуждалось выше).
Что касается процесса извлечения, давайте предположим, что ваш initrd является /mnt/initrd.img-3.2.0-58-generic.
Давайте проверим, что это сжато:
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
Не будем его распаковывать, чтобы лучше проверить его содержимое (мы будем работать в каталоге /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$
Теперь давайте проверим, что находится в несжатом файле:
damiano@tablet:/tmp/libs$ file init_uncompressed
init_uncompressed: ASCII cpio archive (SVR4 with no CRC)
Хорошо. Итак, теперь у нас есть архив cpio. Извлечь его содержание так же просто, как:
damiano@tablet:/tmp/libs$ cpio -i < init_uncompressed
109835 blocchi
Теперь, наконец, у нас есть все, включая ваши библиотеки:
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
На этом этапе вы можете просто скопировать папку lib (и lib64) из /tmp /libs в /mnt (при условии, что ваши корневые разделы - /dev /sda1-- смонтированы в /mnt) и затем перезагрузиться.
Последнее (очень личное) замечание: сказав все вышесказанное, позвольте мне добавить, что ... хотя в FAQ четко сказано, что полагаться на менеджеры пакетов при обновлении системных библиотек опасно, я лично считаю, что вручную иметь дело с системными библиотеки сами по себе ... это, безусловно, более опасно :-)
Так что, пожалуйста, не вините меня, если вы работаете в не загружаемой системе ;-)
Обновление 1:
Что касается «как только вы загрузили ядро с монтированием нового initrd », вы можете сделать следующее:
- В меню grub выберите запись, которую вы обычно запускаете, и нажмите "E" ("Правка"). (Кстати: если у вас нет меню grub, то этот вопрос и / или другие онлайн-поиски могут помочь). Вы попадете на экран, похожий на этот:
Обратите внимание на строку, связанную с ядром. На такой строке вы найдете:
Обратите внимание, что я использовал root =/initrd.img-3.8.0-19-generic, в то время как вы должны ссылаться на ваш конкретный файл initrd
- После того, как вы правильно определили параметр «root =», просто нажмите F10. Через несколько секунд вы должны получить приглашение (initramfs), как в:
Теперь у вашего "/" есть папка /lib с библиотеками, которые вы скомпилировали ... и упаковали в INITRD.