Як заповнити / dev каталог під час створення власного initrd?


9

Я намагаюся дізнатися речі про initrd. Я дотримувався цього підручника, щоб створити власний initrd з нуля, і я встановив на ньому зайнятий ящик. Тоді я зробив з нього .iso з isolinux, щоб я міг перевірити його у virtualbox. Це чудово працює!

У мене є основні команди із зайнятого ящика, тому я хотів встановити файлову систему. Але каталог / dev майже порожній (без sda), за винятком деяких файлів, які я створив під час навчання. Я дізнався про удев і думаю, що це те, що мені потрібно. Однак я не впевнений, як це зробити.

Чи потрібно просто схопити останній вихідний код із udev, скласти його та додати до свого initrd? А потім зателефонувати / bin / udev чи щось подібне у моєму сценарії init? Або є інший / кращий спосіб заповнити каталог / dev?

Редагувати: додаткова інформація та оновлення того, що я вже зробив.

  • Я перевіряю все у віртуальній коробці. Я щойно встановив ubuntu minimal у віртуальний ящик, зробив .iso з мого initrd, а потім завантажився з iso у virtualbox.
  • Я використав vmlinuz, /lib/modulesякий був присутній на debian-businesscard.iso, і скопіював їх до свого initrd, який я створив, дотримуючись підручника, до якого я зв'язав раніше.
  • Ядро має CONFIG_DEVTMPFS=y
  • Деякі пристрої відображаються /dev, наприклад, tty0-tty63 та деякі інші, але немає sda / hda.
  • Побіг lspci -kу моїй операційній системі і у віртуальному вікні, щоб перевірити, які модулі використовуються. SATA Controllerкаже, що використовується ahciяк модуль.
  • Коли я modprobe -v ahciйого виконую, він дуже скаржиться на "невідомий символ: ata_some_stuff", але після цього він повертає щось на зразок SCSI Subsystem initialized, ATA-6: VBOX HARDDISKі Direct-Access ATA VBOX HARDDISK. Однак досі не знайдено жодних жорстких приладів /dev.

Мій поточний /init/сценарій такий:

#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login

Хтось має уявлення про те, що я роблю неправильно і що я повинен робити замість цього?

Відповіді:


12

Хоча відповідь Гілла правильна, це стара школа :-). Ще одна примітка (більше нітпік в термінології, аніж що інше) - це те, що посібник, з яким ви пов’язані, - це інструкції щодо створення initramfs, а не initrd. Ці дві схожі і служать одній і тій же цілі, але відрізняються тим, як зберігається і завантажується зображення.

У будь-якому випадку, відповідь на ваше запитання насправді насправді дуже проста.

  1. Увімкнути devtmpfsв ядрі ( CONFIG_DEVTMPFS=y)
  2. Запустити mount -t devtmpfs none /devяк перше, що у вашому initсценарії.

Це воно. Devtmpfs заповниться так /devсамо, як і udev. Вам навіть не потрібно попередньо заповнити /dev(в initramfs зображення) з основами , як null, zeroабо console.


Дякуємо за ваш коментар Я запустив вашу команду, і тепер у мене є більше пристроїв, але все ще немає ні sda, ні hda для монтажу. Чи щось я забув зробити? Я використовую ядро ​​vmlinuz, яке я отримав від живої системи Debians, чи слід насправді компілювати власну?
Карліто

@Carlito Чи ввімкнено це ядро ​​devtmpfs (перевірте конфігураційний файл)? Debian лише нещодавно перейшов на devtmpfs.
Жил "ТАК - перестань бути злим"

@Gilles Не надається конфігураційний файл, але я завантажив ядро, яке я отримав від debian, сказав конфігураційний файл CONFIG_DEVTMPFS=y, але я все ще не отримую жодних пристроїв sda. Я думаю, це тому, що я не завантажив жодних модулів (lsmod нічого не повертає). Які модулі слід завантажити, щоб отримати пристрої файлової системи? Або ще щось я забув?
Карліто

@Carlito так, якщо у вас з'являються інші речі /dev, а не диски, тоді devtmpfs працює, і ви, ймовірно, не вистачаєте модуля дискового контролера (як ви здогадалися). На жаль, єдиний спосіб дізнатися, який драйвер / модуль вам потрібен - це або прочитати інформацію для кожного з них у конфігурації ядра, або запустити lspci -kв запущеній системі Linux (яка покаже, який драйвер ядра використовують різні компоненти вашої системи) .
Патрік

1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功CONFIG_DEVTMPFS_MOUNT=yне впливає на initramfs. Із довідкового тексту ядра: "Цей параметр не впливає на завантаження на основі initramfs, тут файлову систему devtmpfs завжди потрібно встановлювати вручну після встановлення rootfs"
Патрік,

4

Udev заповнюється /devавтоматично на основі драйверів, завантажених у ядро ​​та пристроїв, які ці драйвери виявляють. Назви пристроїв та їх дозволів базуються на наборі правил, які адміністратори можуть точно налаштувати. Більшість систем Linux повинні використовувати udev; виняток становлять системи (як правило, вбудовані), де конфігурація обладнання відома в момент встановлення системи і не зміниться після цього.

Як правило, ви телефонуєте udevдосить рано у своїй послідовності запуску. Одна з небагатьох речей, які ви повинні (повинні?) Зробити перед цим - це встановити /procі /sys. Запустивши демон, udevadm trigger --action=add; udevadm settleзакликте зробити udev обробляти всі очікувані події з ядра ( trigger) і зачекайте, поки події будуть оброблені, перш ніж продовжити ( settle). Потім можна перейти до пошуку пристрою, що містить кореневу файлову систему.

Окрім udevdдвійкового, вам знадобляться інші частини udevвашого initrd. Сюди входять файли конфігурації в /etc/udev, базова конфігурація /lib/udev, а також допоміжні бінарні файли, такі як scsi_idтакож в /lib/udev. Вам потрібні всі програми, які викликаються з правил udev, які ви включаєте в initrd.

В кінці initrd, перш ніж передати управління на реальний кореневий розділ, вам потрібно буде зупинитись, udevdяк і будь-яка інша програма з initrd. Це не видаляє жоден пристрій із /dev. Використовуйте mount --move /dev /root/devдля переміщення змонтованого /devдо справжнього кореня.

У Gentoo є посібник з initramfs та вікі-сторінка initramfs, в якій серед іншого згадується udev. Initramfs - це сучасний спадкоємець initrd, використовуючи архів cpio, а не зображення файлової системи та з іншим інтерфейсом процесу (на initrd, /linuxrcповинен вийти, тоді як на initramfs /initповинен execінітитувати з реального кореня); Більшість систем переключилися в ці дні (навіть якщо файл все ще може називатися initrd).


Дякую за вашу відповідь. Я прийшов до висновку, що насправді я зробив initramfs замість initrd. Але я використовую ядро ​​vmlinuz, яке я отримала від живої системи Debians, чи слід насправді компілювати власне ядро ​​для цього (тому я знаю, які модулі існують для завантаження жорстких дисків), чи є якась мінімальна версія, яку я міг би використовувати з основними модулями ? Я, мабуть, завантажуватиму останнє udev і спробую компілювати та запустити його.
Карліто

@Carlito Я рекомендую спершу спробувати ядро ​​Debian, оскільки забуття необхідного драйвера - це звичайна помилка при складанні власного ядра.
Жил "ТАК - перестань бути злим"

Але як би я його дістав? Я щойно скопіював vmlinuz, який я знайшов у debian-businesscard.iso (мабуть, не найкраща ідея). Чи слід просто скопіювати стандартне ядро, яке я отримав від ubuntu чи debian, і весь каталог / lib / module?
Карліто

@Carlito Вам знадобляться принаймні всі модулі, необхідні для вашого обладнання. Знайти все, що потрібно від перегляду списку, може бути важко. Найкращий спосіб з’ясувати, що вам потрібно - це запустити lsmodробочу систему. Тож почніть з усіх них, а потім оберігайте розумно, якщо вам потрібно заощадити місце.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.