Как передать параметр ядру linux до загрузки
Данная статья будет, в основном, полезна новичкам. В ней мы обзорно рассмотрим процесс загрузки системы с передачей ядру дополнительных параметров. Краткий ликбез в рамках принятой в статье терминологии: железо — это аппаратная начинка Вашего устройства (ноутбка, компьютера, пылесоса ); драйвер (он же, суть, модуль ядра) — это такая программная прослойка, которая позволяет Вашему железу работать так, как это задумал его производитель. Ядро linux, на котором построена Ubuntu, конечно содержит в себе модули для работы со многим железом. Однако, следует понимать, что засунуть в него поддержку всех существующих железок физически невозможно. Для этого и предусмотрена возможность установки драйверов от производителя, и просто сторонних драйверов. Вместе с тем, типовая ситуация, часто ставящая в тупик новичков: Вы купили новую видеокарту, или купили себе новый ноутбук, и при попытке установить систему сталкиваетесь с одним из нижеперечисленных явлений:
Типовые проблемы
С аналогичными проблемами Вы можете столкнуться и при попытке простого обновления проприетарного драйвера до более новой версии, либо при штатном обновлении ядра linux. В особенности это касается тех случаев, когда драйвер установлен с применением PPA производителя.
1. Случай с попыткой запуска системы с загрузочной флешки или загрузочного диска
а). Загрузочный носитель, запущенный в режиме UEFI
В данном случае загрузочное меню GRUB2 при корректно подготовленной загрузочной флешке будет показано автоматически. Бывают экзотические варианты, например при подготовке мультизагрузочных флешек отдельными специализированными утилитами загрузочное меню может быть модифицировано этими самыми утилитами, и там данная методика напрямую может не сработать, однако этот аспект выходит за рамки данной статьи. Итак при загрузке Вы видите загрузочное меню, которое приведено на картинке: По-умолчанию выбран пункт «Try Ubuntu without install» («Запустить Ubuntu без установки») — он нам и нужен. Не давая машине начать загрузку (а времени на размышления у нас 10 секунд, — если ничего не предпринять, начнется загрузка пункта, выбранного по-умолчанию), нажимаем клавишу E (латинская буква) на клавиатуре. Меню GRUB2 превращается в текстовый редактор, внешний вид которого приведен на картинке:
Обратите внимание на обратные слеши (знаки \) — их суть лишь в том, что таким образом GRUB2 показывает Вам, что текущая строка на этом не заканчивается, и написанное ниже — продолжение той же самой строки. Иными словами, не обращайте на эти символы внимания, — вводить их с клавиатуры не следует, — GRUB2 Вас не поймет. Фактически здесь мы имеем дело с таким кодом (убраны лишние пробелы — строка стала вмещаться в экран, слеши пропали сами):
Подчеркивание, которое стоит в начале самой первой строки — это курсор. Стрелочками [ ← , → , ↑ , ↓ ] на клавиатуре перемещаем курсор к строке, которая начинается со слова linux, и ведем курсор вправо, пока не поставим его в районе слов quiet и splash. Затираем эти два слова (клавишами Backspace или Delete , — по вкусу), и впечатываем туда с клавиатуры параметр ядра, с которым хотим загрузиться. В примере — вписывается параметр nomodeset:
Как только редактирование закончено, нажимаем клавишу F10 на клавиатуре, — пойдет загрузка. На сей раз во время загрузки будет показан подробный лог происходящих действий, поскольку мы убрали параметры quiet и splash, и дополнительно к ядру будет применен параметр nomodeset, обеспечивающий возможность загрузки на машинах с проблемной графикой. Если параметр помог — Вы попадете на рабочий стол Ubuntu (системы, запущенной в живом режиме).
б). Загрузочный носитель, запущенный в режиме Legacy
В данном случае загрузочное меню по-умолчанию не показывается. Вместо этого в начале загрузки на 10 секунд пользователю демонстрируется вот такой экран:
Как только мы его заметили — следует сразу же нажать клавишу Shift . Если успели — то экран преобразится до такого состояния:
Нам предлагают выбрать язык. Язык нас в данном случае мало интересует. А вот задать кастомный параметр ядру хотелось бы. Нажимаем клавишу Esc . Меню выбора языков уходит, и экран становится таким:
Как видим, в соответствии с подсказкой (напечатана внизу экрана), для выбора «Other Options» («Другие опции») следует нажать клавишу F6 . Нажимаем ее. Открывается список:
Всё для людей! Нам на выбор предлагают несколько параметров, чтобы подставить их в строку инициализации ядра:
Стрелочками [ ← , → , ↑ , ↓ ] на клавиатуре выбираем желаемый (в нашем примере это по-прежнему nomodeset), и нажимаем либо клавишу пробел , либо клавишу Enter , — в результате напротив выбранного нами пункта меню появляется звездочка (символ *):
При необходимости можно отметить сразу несколько параметров. Снимается отметка с параметра той же клавишей, какой и ставится. Выбрав желаемый для добавления пункт (в контексте примера — это nomodeset), нажмаем клавишу Esc . Это приведет к закрытию меню. Теперь мы видим строку инициализации (кстати, доступную для редактирования руками — если есть в этом необходимость), в которой уже прописан параметр nomodeset:
Нажимаем клавишу Enter — пошла загрузка. Будет применен добавленный нами параметр ядра nomodeset. В случае успеха Вы попадете на рабочий стол Ubutnu (системы, запущенной в живом режиме)
в). Особенность загрузочного меню установочного носителя для машин с UEFI начиная с версии 19.04
Начиная с версии 19.04 Disco Dongo, загрузочное меню GRUB2 установочного носителя для машин с UEFI содержит еще по одному дополнительному пункту меню: «Try Ubuntu without install (Safe Graphics)» и «Install Ubuntu (Safe Graphics)». Если для загрузки в Вашем случае достаточно будет добавления параметра nomodeset — выбирайте данный пункт, — указанный параметр ядра в нем уже прописан:
Для загрузки с иными параметрами ядра обращайтесь к принципу, описанному в пункте 1а) данной статьи.
2. Случай с попыткой запуска системы, уже установленной на жестком диске Вашего устройства (ПК, ноутбука)
Следует понимать при этом, что загрузка Вашей рабочей машины (ПК, ноутбука) в контексте рассматриваемого здесь вопроса, грубо говоря, происходит в три этапа:
Итак, имеем один из вышеперечисленных симптомов (черный экран, невозможность авторизации и т.п.). Перезагружаем устройство (ПК, ноутбук), и на этапе инициализации BIOS/UEFI попадаем в загрузочное меню GRUB2. Выглядит оно примерно так:
Если на Вашем устройстве (ПК, ноутбук) Ubuntu — единственная система, то по-умолчанию это загрузочное меню не показывается. Для того, чтобы в него попасть в этом случае на этапе инициализации BIOS/UEFI следует либо зажать и держать, либо многократно понажимать клавишу Shift (или клавишу Esc ). Если данная манипуляция все равно не позволяет попасть в загрузочное меню — убедитесь в том, что:
Попав в меню GRUB2, видим, что в нем по-умолчанию выбран пункт 'Ubuntu', и времени на размышления у нас 30 секунд. Если ничего не делать — будет выполнена загрузка с этим пунктом. Для добавления дополнительных параметров ядра нажимаем клавишу E (латинская буква), и экран GRUB2 перевоплощается в экран текстового редактора:
Вновь обращаю Ваше внимание на обратные слеши (знаки \) — их суть лишь в том, что таким образом GRUB2 показывает Вам, что строка на этом не заканчивается, и написанное ниже — продолжение той же самой строки. Иными словами, не обращайте на эти символы внимания — вводить их с клавиатуры не следует, — GRUB2 Вас не поймет, и этого маневра не оценит. Подчеркивание, которое стоит в начале самой первой строки — это курсор. Стрелочками [ ← , → , ↑ , ↓ ] на клавиатуре перемещаем курсор к строке, которая начинается со слова linux, и ведем курсор вправо, пока не поставим его в районе слов quiet и splash. Затираем эти два слова (клавишами Backspace или Delete , — по вкусу), и впечатываем туда с клавиатуры параметр ядра, с которым хотим загрузиться. В примере — вписывается параметр nomodeset:
После того, как редактирование закончено, следует нажать клавишу F10 . Загрузка пойдет в обычном режиме, с тою лишь разницей, что во-первых, за счет того, что мы убрали параметры ядра quiet и splash, вместо неинформативной картинки будет показан подробный лог загрузки, а во-вторых, и это в данном случае главное, — будет применен параметр ядра nomodeset. В случае успеха Вы попадете на рабочий стол своей системы (или на экран авторизации пользователя, с которого на сей раз сумеете авторизоваться, если проблема состояла в этом). После того, как Вам удалось войти в систему таким образом (прописав один из ранее поясненных параметров ядра), — следует приступить к выявлению и устранению проблем, мешающих нормальной загрузке. С высокой долей вероятности, Вам необходимо проверить установлены ли у Вас (и правильно ли установлены) все необходимые модули ядра (драйвера) для обеспечения корректной работы Вашего железа.
BIOS: настройка режима расширенного конфигурирования и управления питанием ACPI
BIOS
Здравствуйте, уважаемые читатели блога Help начинающему пользователю компьютера. В данной статье мы рассмотрим опции БИОС для настройки режима расширенного конфигурирования и управления питанием ACPI .
В качестве ликбеза. Режим расширенного управления питания ACPI ( Advanced Configuration and Power Interface ) реализует управление энергосберегающими функциями ПК:
Что означают различные Параметры загрузки? (т.е. acpi=off, noapic, nolapic, и т.д.)
У меня были проблемы, устанавливающие 11.04 на моем новом ноутбуке, решение состояло в том, чтобы включить любой из этих параметров загрузки:
- acpi=off
- noapic
- nolapic
Но, что на самом деле делают эти опции?
Какие проблемы находятся там во включении их?
т.е. они могут вызвать аппаратные проблемы (как вентиляторы, не выполняющие порождение системного перегрева).
2 ответа
В целом такие параметры начальной загрузки не нужны, если нет проблема с Вашим BIOS и как это обрабатывает эти стандарты, или это просто могло бы быть достаточно взрослым, где эти стандарты не были полностью реализованы правильно.
ACPI (Усовершенствованный интерфейс управления конфигурацией и энергопотреблением) является стандартом для обработки управления питанием. Более старые системы не могут поддерживать ACPI полный, поэтому иногда это помогает дать ядру подсказку для не использования его. "acpi=off"
APIC (Усовершенствованный Программируемый Контроллер прерываний) является своего рода функцией, найденной в более новых системах. "Локальную" версию называют "LAPIC". То, что может сделать этот контроллер, быть настроенным, чтобы генерировать и обработать прерывания, сигнал аппаратное использование для передачи сообщений. Снова, некоторые реализации APIC могут иметь проблемы в более старой системе, и таким образом, полезно отключить его. "noapic" и "nolapic".
Иногда APIC работает, но он замедляет вещи путем получения посреди раздаваемых сообщений. Это может смешать с обработкой аудиоданных и обработкой видеоданных, например. Люди могли бы отключить его по этой причине также.
без проблем для аппаратных средств, я думаю, как выделяющий те функции, на самом деле не выключает их, но устанавливает, кто реализует их — ‘прочь’ в BIOS, означал бы, что это будет ядром
то, что на самом деле влияет на вентиляторы охлаждения, я думаю, было ‘noapm’ или ‘apm=off’ (усовершенствованное управление питанием), но выключение, которое будет означать работу вентиляторов охлаждения в полной скорости все время как ‘усовершенствованная’ часть, на самом деле замедляет их когда достаточно прохладная система
установка тех вещей постоянно была doen путем записи им в файле личинки в/etc/default (обычно) и после той личинки восстановления с ‘личинкой обновления’, или ‘личинка-mkconfig’ (grub2 вместо личинки мог бы иногда быть необходим) в зависимости от системы
обычно это идет как, ‘чем меньший ноутбук — тем в большей вероятности этому будет нужно их и больше из них’ 😉
Прерывания от внешних устройств в системе x86. Часть 2. Опции загрузки ядра Linux
В предыдущей части мы рассмотрели эволюцию доставки прерываний от устройств в x86 системах (PIC → APIC → MSI), общую теорию и все необходимые термины.
В этой практической части мы рассмотрим как откатиться к использованию устаревших методов доставки прерываний в Linux, а именно рассмотрим опции загрузки ядра:
- pci=nomsi
- noapic
- nolapic
- pci=noacpi
- acpi=noirq
- acpi=off
Загрузка без дополнительных опций
Смотреть прерывания в данной статье мы будем на кастомной плате с Intel Haswell i7 с чипсетом lynxPoint-LP на которой запущен coreboot.
Информацию о прерываниях мы будем выводить через команду
Вывод при загрузке без дополнительных опций:
Файл /proc/interrupts предоставляет таблицу о количестве прерываний на каждом из процессоров в следующем виде:
- Первая колонка: номер прерывания
- Колонки CPUx: счётчики прерываний на каждом из процессоров
- Следующая колонка: вид прерывания:
- IO-APIC-edge — прерывание по фронту на контроллер I/O APIC
- IO-APIC-fasteoi — прерывание по уровню на контроллер I/O APIC
- PCI-MSI-edge — MSI прерывание
- XT-PIC-XT-PIC — прерывание на PIC контроллер (увидим позже)
Упрощённо схему роутинга прерываний можно нарисовать так (красным помечены активные пути, чёрным неиспользуемые).

Поддержка MSI/MSI-X устройством должна быть обозначена как соответствующая Capability в его конфигурационном пространстве PCI.
В подтверждении приведём небольшой фрагмент вывода lspci для устройств, для которых обозначено, что они используют MSI/MSI-X. В нашем случае это SATA контроллер (прерывание ahci), 2 ethernet контроллера (прерывания eth58* и eth59*), графический контроллер (i915) и 2 контроллера HD Audio (snd_hda_intel).
Как мы видим, у этих устройств присутствует строка либо «MSI: Enable+», либо «MSI-X: Enable+»
Начнём деградировать систему. Для начала загрузимся с опцией pci=nomsi.
pci=nomsi
Благодаря этой опции MSI прерывания станут IO-APIC/XT-PIC в зависимости от используемого контроллера прерываний
В данном случае у нас всё ещё приоритетный контроллер прерываний APIC, так что картина будет такая:

Все прерывания MSI/MSI-X ожидаемо исчезли. Вместо них устройства теперь используют прерывания вида IO-APIC-fasteoi.
Обратим внимание на то, что раньше до включения этой опции у eth58 и eth59 было по 9 прерываний! А сейчас только по одному. Ведь как мы помним, без MSI одной функции PCI доступно только одно прерывание!
Немного информации из dmesg по инициализации ethernet контроллеров:
— загрузка без опции pci=nomsi:
— загрузка с опцией pci=nomsi
Из-за уменьшения количества прерываний на устройство, включение данной опции может приводить к существенному ограничению производительности работы драйвера (это без учёта того, что согласно исследованию Intel Reducing Interrupt Latency Through the Use of Message Signaled Interrupts прерывания через MSI в 3 раза быстрее чем через IO-APIC и в 5 раз быстрее чем через PIC).
noapic
Данная опция отключает I/O APIC. MSI прерывания всё ещё могут идти на все CPU, но прерывания от устройств смогут идти только на CPU0, так как PIC связан только с CPU0. Но LAPIC работает и другие CPU могут работать и обрабатывать прерывания.

Как видим, все прерывания IO-APIC-* превратились в XT-PIC-XT-PIC, причём эти прерывания роутятся только на CPU0. Прерывания MSI остались без изменений и идут на все CPU0-3.
nolapic
Отключает LAPIC. MSI прерывания не могут работать без LAPIC, I/O APIC не может работать без LAPIC. Поэтому все прерывания от устройств будут идти на PIC, а он работает только с CPU0. И без LAPIC остальные CPU даже работать в системе не будут.

Комбинации:
На самом деле всего одна для нового варианта: «noapic pci=nomsi». Все прерывания от устройств смогут идти только на CPU0 через PIC. Но LAPIC работает и другие CPU могут работать и обрабатывать прерывания.
Одна, потому что с «nolapic» можно ничего не комбинировать, т.к. эта опция и так сделает недоступным I/O APIC и MSI. Так что если вы когда-то прописывали опции загрузки «noapic nolapic» (или самый распространённый вариант «acpi=off noapic nolapic»), то судя по всему вы набирали лишние буквы.
Итак, что будет от опций «noapic pci=nomsi»:

Таблицы роутинга прерываний и опции «acpi=noirq», «pci=noacpi», «acpi=off»
Как операционная система получает информацию о роутинге прерываний от устройств? BIOS подготавливает информацию для ОС в виде:
- ACPI таблиц (методы _PIC/_PRT)
- _MP_ таблицы (MPtable)
- $PIR таблицы
- Регистров 0x3C/0x3D конфигурационного пространства PCI устройств
Таблицы в списке выше обозначены в порядке приоритета. Рассмотрим это подробней.
Допустим BIOS предоставил все эти данные и мы грузимся без каких-либо дополнительных опций:
- ОС находит таблицы ACPI
- ОС выполняет метод ACPI «_PIC», передаёт ему аргумент, что нужно грузиться в режиме APIC. Тут код метода обычно сохраняет выбранный режим в переменной (допустим PICM=1)
- Для получения данных о прерываниях ОС вызывает метод ACPI «_PRT». Он внутри себя проверяет переменную PICM и возвращает роутинг для APIC случая
- ОС находит таблицы ACPI
- ОС выполняет метод ACPI «_PIC», передаёт ему аргумент, что нужно грузиться в режиме PIC. Тут код метода обычно сохраняет выбранный режим в переменной (допустим PICM=0)
- Для получения данных о прерываниях ОС вызывает метод ACPI «_PRT». Он внутри себя проверяет переменную PICM и возвращает роутинг для PIC случая
- ОС не находит/не смотрит таблицы ACPI
- ОС находит таблицу MPtable (_MP_)
- ОС не находит/не смотрит таблицу ACPI
- ОС не находит/не смотрит таблицу MPtable (_MP_)
- ОС находит таблицу $PIR
Суммируем всё вышеизложенное следующей картинкой:

Следует помнить, что не каждый BIOS предоставляет все 3 таблицы (ACPI/MPtable/$PIR), так что если вы передали опцию загрузчику отказаться от использования ACPI или ACPI и MPtable для роутинга прерываний, далеко не факт, что ваша система загрузится.
Замечание 1: в случае если мы попытаемся загрузиться в режиме APIC с опцией acpi=noirq и без наличия MPtable, то картина прерываний будет как и в случае обычной загрузки с единственной опцией noapic. Операционная система сама перейдёт в режим PIC прерываний.
В случае если мы попытаемся загрузиться вообще без таблиц ACPI (acpi=off) и не предоставив MPtable, то картина будет такая:Это проиcходит из-за того, что без ACPI таблицы MADT (Multiple APIC Description Table) и необходимой информации из MPtable, операционная система не знает APIC идентификаторы (APIC ID) для других процессоров и не может с ними работать, но LAPIC основного процессора работает, так как мы это не запрещали, и MSI прерывания могут на него приходить. То есть будет так:

Замечание 2: в целом роутинг прерываний при использовании ACPI в случае APIC совпадает с роутингом прерываний через MPtable. А роутинг прерываний через ACPI в случае использования PIC совпадает с роутингом прерываний через $PIR. Так что и выводы /proc/interrupts отличаться не должны. Однако в процессе исследований заметил одну странность. При роутинге через MPtable в выводе почему-то присутствует каскадное прерывание «XT-PIC-XT-PIC cascade».
Немного странно, что так происходит, но в документации ядра вроде говорится, что это нормально.