Копіювання glibc з initrd до моєї кореневої файлової системи


0

Я намагаюся встановити glibc 2.20 (нещодавно побудований) до Debian, використовуючи цей посібник з FAQ, на який посилається на цієї сторінки (питання в розділі FAQ Як встановити всі бібліотеки проектів бібліотеки GNU C, які я тільки що створив? ):

Єдиним педантично правильним способом встановлення цих бібліотек є виконання make install INSTALLDIR = / tmp / glibc, який встановлює бібліотеки в / tmp / glibc, після чого копіює цей каталог на початковий кореневий диск, завантажуючи початковий кореневий диск, і скопіюйте результати до кореневої файлової системи, а потім поверніть у кореневу файлову систему як останній крок завантаження. Тобто тільки безпечний спосіб встановлення glibc сьогодні.

Мені вдалося скопіювати цей свіжий каталог glibc (який містить продукт make install ) у розпаковану копію initrd (той, який завантажений за замовчуванням), стиснути його назад і успішно завантажитися після вказівки цього нового initrd в GRUB шляхом редагування командного рядка.

Чи може хто-небудь сказати мені, як і де я повинен скопіювати цей glibc до моєї кореневої файлової системи (щоб зробити її первинною бібліотекою C в системі замість поточної (за замовчуванням))?

Відповіді:


1

Твоє запитання (" як і де я повинен скопіювати цей 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 ", ви можете перейти таким чином:

  1. У меню grub виберіть запис, який ви зазвичай виконуєте, і натисніть "E" (Редагувати). (BTW: якщо у вас немає grub-меню, ніж це питання та / або інші онлайнові пошуки можуть допомогти). Ви отримаєте екран, подібний до цього:

enter image description here

Зверніть увагу на рядок, пов'язаний з ядром. У такому рядку ви знайдете:

  • посилання на ядро ​​(vmlinux-3.8.0-19-generic в моєму прикладі);
  • посилання на пристрій для використання для монтування кореневої файлової системи (root = / dev / mapper / kubuntu - vg-root в моєму прикладі);
  • інші параметри завантаження (ro quiet splash $ vt handoff)

    1. якщо ви хочете, щоб кореневе монтування initrd файл, який ви prerared (... містить оновлений glibc; а не загальний пристрій / hard_drive / розділ), ви повинні змінити вище рядка, замінюючи посилання на "root =" параметр, у:

enter image description here

Зверніть увагу, що я використав root = / initrd.img-3.8.0-19-загальний час Вам слід встановити посилання на ваш конкретний файл initrd

  1. як тільки ви правильно визначили ваш параметр "root =", просто натисніть F10. Через кілька секунд вам слід перейти до підказки (initramfs), як у:

enter image description here

Тепер "/" має папку / lib з бібліотеками, які ви скомпілювали ... і упаковані в INITRD.



Велике спасибі за цю відповідь. Ви пишете "ви завантажили кореневу ядро ​​вашого нового initrd (і, отже, закінчившись у рядку" (initramfs) "".
user3900460

Чи повинен я використовувати якийсь мінімальний initrd замість моєї копії initrd за замовчуванням для перенесення свіжого glibc? Або може бути (initramfs) підказка доступна після редагування командного рядка в меню GRUB при завантаженні?
user3900460

Я тільки що оновив свою відповідь, щоб пояснити, як завантажувати кореневу версію вашого initrd.
Damiano Verzulli

По-перше, я високо ціную ваші зусилля. Вони дійсно надихнули мене, хоча я не міг отримати завантажувальну систему після копіювання цих каталогів. До речі, в моєму випадку make install не генерує lib каталог. Каталоги є etc, lib64, sbin, usr і var. Найкраще, що я до сих пір досягла, - це завантаження зображення в реальному часі (рятувального) Debian, потім отримання кореневої оболонки, монтування файлової системи цілі pivot_root, chroot . bash, і потім make install у каталозі збирання. Тут виникає невідповідність версії ядра, оскільки я будую glibc для нового ядра, ніж у живому зображенні.
user3900460

Зрештою вона повертається FATAL: kernel too old, але glibc успішно оновлюється (перевіряється ldd --version ). Хоча getconf -a не працює ...
user3900460
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.