Твоє запитання (" як і де я повинен скопіювати цей glibc до моєї кореневої файлової системи ") допускає кілька відповідей, причому згаданий у FAQ часто відповідає мінімальним вимогам (хоча не найпростішим, IMHO).
Що вони пропонують, коли ви завантажили кореневу систему ядра вашого нового initrd (і, отже, закінчившись запитом на зразок ' (initramfs) - це змонтувати реальну систему десь нижче файлової системи. Припустимо, що ваша справжня коренева файлова система знаходиться в / dev / sda1, наприклад:
(initramfs) mkdir /new_root
(initramfs) mount /dev/sda1 /new_root
Після цього у вас буде:
- / lib = & gt; містить новий бібліотеки, які ви самі зібрали та упаковані в INITRD, які ви використовували для завантаження та встановлення root;
- / new_root / lib = & gt; містить старі бібліотеки, які все ще присутні на вашому жорсткому диску, у вашій реальній системі;
(BTW: ви також можете мати a lib64 Структура осторонь згаданого / lib , залежно від архітектури. Будь ласка, застосуйте перевірку здорового глузду та розумності перед застосуванням того, що я пишу)
На цьому етапі у вас вже є все, що потрібно для копіювання вмісту з / lib в / new_root / lib, а потім просто umount / new_root і перезавантаження.
Так чому ж вони пропонують таку "магію" з pivot_root і тому подібним?
IMHO, те, що вони припускають, в FAQ, це те, що ви хочете обмежити кількість перезавантаження до мінімуму. Одне перезавантаження неминуче (для завантаження з INITRD). Потім ви можете змонтувати кореневий розділ, скопіювати бібліотеки та .... скажіть системі, щоб продовжити завантаження як звичайно, вказуючи на (нову) кореневу файлову систему, яку ви тільки що встановили з вашого жорсткого диска. Тут ключовим моментом є те, що "коренева точка монтування" (тека "/", іншими словами) повинна бути замінена з тієї, що стосується зображення INITRD, до тієї, що стосується вашої реальної системи (/ dev / розділ sda1, встановлений на / new_root під файловою системою INITRD).
Існує декілька інструментів, які дозволяють "змінювати кореневу систему", з посиланням на 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:
Як для " після завантаження кореневого ядра вашого нового iitrd ", ви можете перейти таким чином:
- У меню grub виберіть запис, який ви зазвичай виконуєте, і натисніть "E" (Редагувати). (BTW: якщо у вас немає grub-меню, ніж це питання та / або інші онлайнові пошуки можуть допомогти). Ви отримаєте екран, подібний до цього:
Зверніть увагу на рядок, пов'язаний з ядром. У такому рядку ви знайдете:
Зверніть увагу, що я використав root = / initrd.img-3.8.0-19-загальний час Вам слід встановити посилання на ваш конкретний файл initrd
- як тільки ви правильно визначили ваш параметр "root =", просто натисніть F10. Через кілька секунд вам слід перейти до підказки (initramfs), як у:
Тепер "/" має папку / lib з бібліотеками, які ви скомпілювали ... і упаковані в INITRD.