Данный vmlinuz и initrd.gz, как я узнаю, откуда ядро собирается загрузиться / (корневая) файловая система?

Я не знаком с psg, но я знаю (твердый путь, так сказать), если я работаю ps ax | grep progname видеть, работает ли какой-либо процесс, который содержит progname, Я буду всегда получать a с тех пор grep progname самостоятельно команда, которая содержит "progname".

Я не знаю жемчуг, но в ударе, я обхожу это как это, например, если я хочу проверить, работает ли какой-либо экземпляр progname, я работаю ps ax | grep -c "[p]rogname", который решает проблему всегда получения да.

3
01.10.2013, 18:52
4 ответа

Это дано во время начальной загрузки Вашим загрузчиком, например, Личинка.

Для наблюдения, с которых аргументов было запущено ядро сделайте это:

$ cat /proc/cmdline

Для меня, этого ouputs:

BOOT_IMAGE=/vmlinuz-3.5.0-13-generic root=/dev/mapper/crypt-precise--root ro

Таким образом, initrd/initramfs попытается смонтировать мой /dev/mapper/crypt-precise--root (зашифрованный LVM) логический том как /.

Можно реконфигурировать Личинку, чтобы загрузить другие операционные системы из жесткого диска с помощью того же ядра (мультиначальная загрузка) или отредактировать это время выполнения строки путем нажатия e при выборе (еще не загружающийся) запись Личинки.

Для недавних находящихся в Debian дистрибутивов, изменяя его постоянно работает как это:
(будьте осторожны, Вы не можете загружаться в свою исходную операционную систему снова!)

В файле /etc/default/grub установите некоторых GRUB_CMDLINE_LINUX="root=/dev/mydevice" самостоятельно и Личинка обновления путем выполнения update-grub.

Однако я рекомендую Вам настроить мультиначальную загрузку, иначе не возможно изменить или обновить Вашу конфигурацию Личинки снова легко.

6
27.01.2020, 21:09
  • 1
    Спасибо, gertvdijk! (Я должен был найти, что сам, просто пропустил строки в конфигурации, извините.) –  Boris Burkov 18.09.2012, 21:40
  • 2
    Эй, gertvdijk, кажется, что Вы обманули меня со своим ответом :) Посмотрите мое обновление вопроса. –  Boris Burkov 01.10.2013, 18:53
  • 3
    @Bob нет, я думаю, что Вы пропускаете то, что initrd, к которому Вы обращаетесь, не является тем же как тем, которое Вы устанавливаете - отмечают hd-media префикс в документах. Кроме того, "Реальный корень настроен в init сценарий [...]" <-взят от параметра ядра, если initrd не настраивается для загрузки его из где-то в другом месте (как Debian hd-media версия initrd.) –  gertvdijk 01.10.2013, 19:54
  • 4
    Хорошо, это справедливо, не могло бы быть никакого initramfs вообще. :) медиа HD временное ядро и initramfs для установщика образа CD, но его initramfs, кто делает поиск ядра корня в.ISO, не GRUB. Спасибо и За Ваше здоровье! –  Boris Burkov 01.10.2013, 21:02

Учитывая загрузочный образ, Вы могли найти внутреннюю строку версии ядра с file команда:

%> file /boot/vmlinuz-linux
/boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 3.5.3-1-NAME (X@Y) #1 SMP PREEMPT WEEK MON DAY, RO-rootFS, swap_dev 0x5, Normal VGA
3
27.01.2020, 21:09

На большинстве установок Вы указываете корневое устройство к загрузчику. Корневое устройство передается ядру, в качестве параметра названному root. В зависимости от загрузчика это может быть частью параметров командной строки ядра (который может быть похожим ro quiet root=/dev/sda1) или отдельная установка. Для некоторых общих загрузчиков:

  • Lilo: в конфигурационном файле (/etc/lilo.conf), существует a root директива для указания на корневое устройство Linux.
  • Копайте наследие (версии 0.9x): в конфигурационном файле (обычно /boot/grub/menu.lst), корневое устройство передается как часть командной строки ядра (kernel директива). Обратите внимание, что существует другое root директива для самой Личинки; это говорит Личинку, где искать файлы, такие как ядро. Во многих системах конфигурационный файл Личинки сгенерирован update-grub сценарий, который заполняет корневое устройство от установленной системы (использование /boot/grub/device.map).
  • Копайтесь 2 (версии 1.9x): в конфигурационном файле (обычно /boot/grub/grub.cfg), корневое устройство передается как часть командной строки ядра (linux директива). Обратите внимание, что существует другое root переменная (set root=(hd0,1)) это говорит Личинку, где искать файлы, такие как ядро. Во многих системах конфигурационный файл Личинки сгенерирован update-grub сценарий, который заполняет корневое устройство от установленной системы (использование /boot/grub/device.map).
  • Подводная лодка: корневое устройство передается как часть параметров командной строки в bootargs переменная среды. Двоичный файл подводной лодки содержит значение по умолчанию, испеченное в во время компиляции, который может быть переопределен установкой во флэш-памяти (если устройство разрешает).

В отсутствие a root параметр командной строки, initrd или initramfs, если используется, может попытаться найти, что корневой раздел монтируется. Даже в присутствии a root аргумент, initrd или initramfs могут решить использовать другое устройство. Вызовы кода switch_root переключаться от initrd до фактического корня.

Корневое устройство по умолчанию, когда существует нет root параметр командной строки определяется во время компиляции. Можно изменить то значение в двухуровневом изображении с rdev утилита.

На загруженном ядре Вы видите root параметр (если таковые имеются), который был передан ядру в /proc/cmdline. Вы видите существующее устройство, смонтированное на / в /proc/mounts.

1
27.01.2020, 21:09

Не уверен, что это все еще интересно, но для будущих гуглеров, таких как я:

При загрузке / установке из grub используются два отдельных корневых каталога. Это корень grub и корень linux (я не уверен, что это технический термин).


Корень grub может быть установлен в grub.cfg , и он определяет, какие файлы легко видны в grub. Корневой каталог grub по умолчанию должен быть корневым каталогом загрузочного диска grub, поэтому, если содержимое вашего загрузочного диска:

/boot/
/boot/grub2/
/boot/grub2/grub.cfg
...

Тогда расположение grub.cfg из корня grub будет /boot/grub2/grub.cfg

Корень grub можно изменить в grub.cfg, используя set root = .

Вы можете использовать это, чтобы установить корень в каталог внутри текущего корня ( set root = / boot / приведет к тому, что grub.cfg будет расположен по адресу /grub2/grub.cfg), который ведет себя аналогично chroot в Linux.

Вы также можете изменить текущий корень на другой диск ( set root = (hd0,1) установит ваш корень на hd0, раздел 1. Полный список устройств, которые вы можете использовать, см. страница grub об этом http://www.gnu.org/software/grub/manual/grub.html#Device-syntax ).

Хотя изменение корневого каталога grub может быть полезно, вы также можете префикс любого пути тем, что вы собираетесь использовать (например, linux (hd0,1): / boot / OS / RHEL / isolinux / vmlinuz вместо сначала установите root = (hd0,1) ).Кроме того, после запуска ядра корень grub не имеет значения


Что касается корня Linux , это параметр, который вы можете передать ядру (vmlinuz) при его загрузке. Для этого вы можете передать ядру параметр root = (это значение появится в / proc / cmdline)

Однако важно отметить, что этот новый корень, как ожидается, будет содержать корневую файловую систему Linux (см. для / etc / / var / и так далее). При установке вы предоставляете initrd (INITial Ram Disk), который содержит эти элементы, поэтому вам, вероятно, не нужно / не нужно менять корень Linux во время установки.

Если вы все же меняете корень Linux, будьте осторожны с установочным носителем Linux, который не является корневой файловой системой Linux, хотя внутри находится initrd.img.


Если вы пытаетесь использовать файлы в вашем iso в качестве аргументов вашего ядра, тогда есть решение. Если вы создадите устройство loopback в grub, оно будет сохраняться при запуске ядра (так что вы должны увидеть устройство с именем / dev / loop0 в корне Linux во время установки)

Я дам небольшой фрагмент файла grub.cfg, который относится к ISO и RHEL, в частности:

menuentry "RHEL" {
    set isofile='/boot/iso/RHEL.iso' #this is just a grub variable

    loopback loop $isofile           #mount the $isofile with label=loop as a loopback device

    set root=(loop)                  #set the grub root to the mounted iso (so / is the top level directory in the iso)

    #this starts the kernel and passes the paramter inst.stage2 using the ISO and kickstart as a location on the loopback device created by grub (the syntax for this line is liable to change between distros)
    linux /isolinux/vmlinuz noeject inst.ks=hd:/dev/loop0:/ks/ks.cfg inst.stage2=hd:LABEL=USBDRIVELABEL:/$isofile  

    initrd /isolinux/initrd.img      #provide an initial ramdisk (which will become the **Linux root**
}

Имейте в виду, что синтаксис строки ядра в grub.cfg следующий:

linux [path to kernel] [kernel argument 1] [kernel argument 2] ...

Все аргументы ядра появятся в / proc / cmdline . Важно отметить, что, поскольку они обрабатываются, синтаксис grub ядра недопустим.

Вы можете найти больше об этом в документации grub ( http://www.gnu.org/software/grub/manual/grub.html#Introduction )

и на странице Archwiki параметров ядра ( https://wiki.archlinux.org/index.php / kernel_parameters # GRUB )

, а также параметры загрузки для соответствующего дистрибутива (RHEL https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/ chap-anaconda-boot-options.html # list-boot-options-sources )

1
27.01.2020, 21:09

Теги

Похожие вопросы