bootparam(7) аргументы, передаваемые ядру Linux во время загрузки

ОПИСАНИЕ

При запуске ядру Linux могут быть переданы «аргументы командной строки», иначе говоря, «параметры загрузки». Как правило, они служат для передачи ядру информации о тех параметрах аппаратного обеспечения, которые оно не может определить, или для удаления/замены значений, используемых ядром.

Если ядро загружается непосредственно из BIOS, то возможности указать параметры нет. Для того, чтобы передать параметры ядру, необходимо использовать системный загрузчик, позволяющий это сделать, например GRUB.

Список аргументов

Аргументы командной строки ядра преобразуются в список строк (параметров загрузки), разделённых пробелами. Большая часть аргументов имеет вид:

имя[=значение_1][,значение_2]…[,значение_10]

где «имя» — уникальное ключевое слово, используемое для определения части ядра, которой передаются указанные значения (если есть). Обратите внимание, что ограничение в 10 значений действительно существует, так как код, используемый в данный момент, обрабатывает только 10 разделённых запятой параметров на одно ключевое слово. Тем не менее, в особых случаях вы можете указать одно ключевое слово ещё раз, с помощью 10-и дополнительных параметров (если это позволяет функция настройки).

Большая часть обработки выполняется кодом из файла ядра init/main.c. Сначала ядро проверяет, является ли аргумент одним из специальных аргументов «root=», «nfsroot=», «nfsaddrs=», «ro», «rw», «debug» или «init». Назначение этих специальных аргументов объясняется ниже.

Затем производится проверка списка функций настройки: есть ли для заданного строкового параметра (например «foo») связанная с ним функция настройки («foo_setup()») для определённого устройства или части ядра. То есть, если вы передали ядру строку foo=3,4,5,6, то ядро проверит, зарегистрирован ли «foo» в массиве настроек. Если да, то будет вызвана соответствующая «foo» функция (foo_setup()), которой будут переданы аргументы 3, 4, 5 и 6, как указано в командной строке ядра.

Все параметры, указанные в виде «foo=bar» и не распознанные как обращения к функциям настройки (см. выше), считаются переменными окружения. Например, как аргумент загрузки можно указать «TERM=vt100».

Все остальные аргументы, не обработанные ядром и не считающиеся переменными окружения, затем будут переданы PID 1 (обычно, это программа init(1)). Наиболее часто встречающийся аргумент, передаваемый процессу init, — слово «single», указывающее, что система должна быть загружена в однопользовательском режиме, в котором не запускаются какие-либо службы. Более подробная информация об аргументах приведена в руководстве по установленной в системе версии init(1).

Общие аргументы загрузки, не относящиеся к настройке устройств

«init=…»
Задаёт начальную команду, запускаемую ядром. Если этот параметр не задан или программа не найдена, то ядро попробует запустить /sbin/init, затем /etc/init, затем /bin/init, затем /bin/sh. Если не удалось запустить ни одну из указанных программ, то ядро переходит в режим «паники».
«nfsaddrs=…»
Задаёт адрес загрузки с NFS. Используется при загрузке системы по сети.
«nfsroot=…»
Задаёт корневую файловую систему NFS. Если эта строка не начинается с «/», «,» или цифры, то перед ним будет вставлена строка «/tftpboot/». Этот параметр используется при загрузке системы по сети.
«root=…»
Этот аргумент указывает ядру, какое устройство должно быть использовано в качестве корневой файловой системы. Значение по умолчанию этого параметра устанавливается при сборке ядра и, как правило, совпадает с устройством, на котором была расположена корневая файловая система во время сборки. Для использования в качестве устройства с корневой файловой системой, к примеру, второго дисковода, следует указать «root=/dev/fd1».

Корневое устройство может быть указано как в символьном, так и в числовом виде. Символьное представление имеет вид /dev/XXYN, где XX означает тип устройства (например, «hd» — для совместимых с ST-506 жёстких дисков, при этом Y принимает значения от «a» до «d»; «sd» — для совместимых со SCSI дисков, при этом Y принимает значения от «a» до «e»), Y — буква или номер устройства, а N — номер (в десятичной системе счисления) раздела на этом устройстве.

Заметим, что в данном случае речь не идёт о конкретном назначении этих устройств в файловой системе. Приставка «/dev/» — это всего лишь дань соглашениям.

Также применяется менее удобный и менее совместимый способ указания устройств с помощью чисел в формате «старший/младший номер» (например, старший номер /dev/sda3 равен 8, младший равен 3, и устройство можно указать как «root=0x803»).

'rootdelay='
В этом параметре указывается задержка (в секундах) перед попыткой смонтировать корневую файловую систему.
'rootflags=...'
В этом параметре указывается строка параметров монтирования корневой файловой системы (смотрите также fstab(5)).
'rootfstype=...'
Параметр «rootfstype» указывает ядру смонтировать корневую файловую систему, как если бы она была задаваемого типа. Это может быть полезно (как пример) при монтировании файловой системы ext3 как ext2 и затем удалении журнала в корневой файловой системе, что, фактически, превращает ext3 в ext2 и для этого не нужно загружать машину с другого носителя.
«ro» и «rw»
Параметр «ro» указывает ядру монтировать корневую файловую систему «только для чтения» для того, чтобы программа проверки целостности файловой системы (fsck) могла работать с не изменяющейся файловой системой. Ни один процесс не может записать данные в файл, находящийся в данной файловой системе до тех пор, пока она не будет «перемонтирована» для чтения/записи, например, командой «mount -w -n -o remount /» (см. также mount(8)).

Параметр «rw» указывает ядру монтировать корневую файловую систему в режиме для чтения/записи. Он используется по умолчанию.

'resume=...'
Указывает ядру где расположены данные suspend-to-disk, которые вы хотите использовать для возобновления работы машины при выходе из состояния сна. Обычно совпадает с расположение раздела или файла подкачки. Пример:

resume=/dev/hda2
«reserve=…»
Этот параметр используется для защиты от тестирования определённых областей ввода/вывода. Команда должна быть задана в следующем виде:

reserve=iobase,extent[,iobase,extent]...

В некоторых машинах драйверы неправильно определяют аппаратное обеспечение или вызывают некорректную реакцию на тестирование определённых областей. В этих случаях может появиться необходимость предотвратить проверку (автоопределение) таких устройств.

Данный параметр загрузки служит для указания определённой области портов ввода/вывода, которую не нужно тестировать. Драйвер устройства не будет проверять указанную область, если только другой параметр явно не указывает на необходимость их проверки.

Например, загрузочная строка

reserve=0x300,32  blah=0x300
предотвращает проверку адресов 0x300-0x31f всеми драйверами устройств, кроме «blah».
«panic=N»
По умолчанию, ядро не будет перезагружаться после паники, однако этот параметр заставит ядро перезагрузиться через N секунд (если N больше 0). Время до перезагрузки может быть также изменено командой

echo N > /proc/sys/kernel/panic
«reboot=[warm|cold][,[bios|hard]]»
Начиная Linux 2.0.22 по умолчанию используется «холодная» (cold) перезагрузка. Возможно вернуть старое значение (warm) по умолчанию с помощью «reboot=warm» («холодная» перезагрузка может понадобиться для сброса аппаратного обеспечения, однако, она может уничтожить данные дискового кэша. «Теплая» перезагрузка может быть несколько быстрее). По умолчанию перезагрузка производится аппаратными (hard) средствами, а именно запросом контроллеру клавиатуры команды на установку низкого уровня линии сброса. Однако точно существует, по меньшей мере, один тип материнских плат, на которых этот способ не работает. При указании параметра «reboot=bios» перезагрузка будет осуществляться путем перехода в BIOS.
«nosmp» и «maxcpus=N»
(Только, если определён __SMP__.) Параметры загрузки «nosmp» или «maxcpus=0» полностью отключают SMP. Аргумент «maxcpus=N» ограничивает количество процессоров, активируемых в режиме SMP, значением N.

Аргументы загрузки, используемые разработчиками ядра

«debug»
Сообщения ядра обрабатываются демоном (например, klogd(8) или подобным), что позволяет записывать их на диск. Сообщения с приоритетом выше console_loglevel выводятся также и на консоль (список приоритетов смотрите в syslog(2)). По умолчанию, значение console_loglevel устанавливается для протоколирования сообщений на уровень выше чем KERN_DEBUG. Этот загрузочный параметр указывает ядру также выводить сообщения приоритета KERN_DEBUG. Уровень журнала для консоли также может быть установлен во время работы через файл /proc/sys/kernel/printk (описан в syslog(2)), операцией SYSLOG_ACTION_CONSOLE_LEVEL в syslog(2) или dmesg(8).
«profile=N»
Существует возможность включить функцию оценки быстродействия ядра (kernel profiling). Для этого необходимо присвоить ненулевое значение переменной prof_shift. Это может быть сделано либо установкой параметра CONFIG_PROFILE при сборке ядра, либо указанием параметра «profile=N». Значение переменной prof_shift устанавливается равным N, или CONFIG_PROFILE или по умолчанию равняется 2. Оно определяет степень детализации оценки: если система исполняет код ядра, то с каждым тиком показания счётчика будут увеличиваться:

profile[address >> prof_shift]++;

Необработанную информацию оценки можно прочитать из /proc/profile. Для удобства чтения можно воспользоваться какой-либо утилитой, например, readprofile.c. Запись в /proc/profile приведёт к сбросу показаний счётчиков.

Аргументы загрузки для использования ramdisk

(Только, если ядро было собрано с CONFIG_BLK_DEV_RAM) В общем, использовать ram-диск под Linux — плохая идея, так как ядро использует доступную память гораздо эффективнее. Однако при загрузке часто удобней копировать содержимое дискеты на ramдиск. Также, это позволяет получить систему, в которой загрузка отдельных модулей (для файловых систем или оборудования) производится до получения доступа к основной файловой системе.

В Linux 1.3.48 работа с ramdisk была значительно изменена. Раньше память выделялась статически и существовал параметр «ramdisk=N», определявший её размер. Также возможно было задать необходимый размер во время сборки ядра. В настоящее время под ram-диски используются буферный кэш, размер которого изменяется динамически. Дополнительную информацию по текущем настройкам ramdisk можно найти в файле исходного кода ядра Documentation/blockdev/ramdisk.txt (в старых ядрах — Documentation/ramdisk.txt).

Существует четыре параметра: два логических и два целочисленных.

«load_ramdisk=N»
Если N=1, то выполнять загрузку ram-диска. Если N=0, то ramdisk не загружается (по умолчанию 0).
«prompt_ramdisk=N»
Если N=1, то запрашивать вставку дискеты (по умолчанию). Если N=0, то не запрашивать (таким образом, этот параметр вообще не нужен).
«ramdisk_size=N» или «ramdisk=N» (устарел)
Установить предельный размер ram-диска(-ов) равным N КБ. По умолчанию 4096 (4МБ).
«ramdisk_start=N»
Установить номер начального блока (смещение на дискете, с которого начинается ram-диск) равным N. Этот параметр не требуется, если ram-диск находится сразу за образом ядра.
«noinitrd»
(Только, если ядро было собрано с CONFIG_BLK_DEV_RAM и CONFIG_BLK_DEV_INITRD). В настоящее время существует возможность собрать ядро с поддержкой initrd. Если эта возможность включена, то при запуске загружается ядро и начальный ram-диск. Затем ядро преобразует initrd в «обычный» ram-диск, который монтируется в качестве корневой файловой системы на чтение-запись. Далее запускается /linuxrc. Затем монтируется «настоящая» корневая файловая система, а файловая система initrd переносится в //initrd. И, наконец, начинается обычная процедура загрузки (например, запускается /sbin/init).

Более подробно свойство initrd описано в файле исходного кода ядра Documentation/initrd.txt.

Параметр «noinitrd» указывает ядру пропускать вышеуказанные шаги, несмотря на то, что оно было собрано с поддержкой initrd. Данные initrd, тем не менее, остаются в /dev/initrd (это устройство может быть использовано только один раз: после того, как последний процесс, использующий /dev/initrd, завершится, данные освобождаются).

Параметры загрузки для SCSI-устройств

Общие соглашения для этого раздела:

iobase — первый порт ввода/вывода, занятый хостом SCSI. Порты указываются в шестнадцатеричной системе счисления, обычно их значения находятся в диапазоне от 0x200 до 0x3ff.

irq — аппаратное прерывание, настроенное для карты. Возможные значения зависят от карты, но обычно используются 5, 7, 9, 10, 11, 12 и 15. Остальные значения, как правило, используются общей периферией, такой как: жёсткие диски IDE, дисководы, последовательные порты и т. д.

scsi-id — ID, используемый хост-адаптерами для своей идентификации на шине SCSI. Только некоторые адаптеры позволяют изменять это значение, у большинства оно фиксировано. Обычно, в качестве значения используется 7, однако, карты Seagate и Future Domain TMC-950 используют 6.

parity — указывает, ожидает ли хост-адаптер SCSI от подключенных устройств передачу значений чётности во всей передаваемой информации. Для включения проверки чётности необходимо указать единицу, для отключения — ноль. Не все адаптеры позволяют управлять чётностью с помощью параметров загрузки.

«max_scsi_luns=…»
Устройство SCSI может включать в себя «подустройства». В качестве примера можно взять новые многодисковые SCSI CD-ROM-ы. Адрес каждого места под компакт-диск может быть задан «логическим номером устройства» (Logical Unit Number — LUN). Но большинство устройств, таких как, жёсткие диски, ленточные накопители и др., содержат только одно устройство, которому присваивается нулевой LUN.

Некоторые плохо спроектированные устройства SCSI не обрабатывают запросы для LUN, не равные нулю. Поэтому, новые ядра, если при сборке ядра не был установлен флаг CONFIG_SCSI_MULTI_LUN, по умолчанию будут опрашивать только устройства с LUN, равным нулю.

Для указания количества проверяемых при загрузке LUN можно в качестве параметра загрузки указать «max_scsi_luns=n», где n является числом от одного до восьми. Для избежания вышеописанной проблемы можно указать, что n=1.

Hастройка ленточных накопителей SCSI
С помощью приведённой ниже строки загрузочных параметров можно настроить драйвер ленточных накопителей SCSI:

st=buf_size[,write_threshold[,max_bufs]]

Первые два числа указываются в килобайтах. По умолчанию значение buf_size равно 32КБ, а максимальный размер, который может быть указан, — 16384КБ. В write_threshold задаётся значение, при достижении которого содержимое буфера записывается на ленту (по умолчанию равно 30КБ). Максимальное количество буферов (max_bufs) зависит от количество обнаруженных накопителей. По умолчанию используется два буфера. Пример использования этого параметра:

st=32,30,2
Более подробная информация приведена в файле Documentation/scsi/st.txt (или drivers/scsi/README.st — в старых ядрах), находящемся в дереве исходного кода ядра Linux.

Жёсткие диски

Параметры драйвера IDE-диска/CD-ROM
Драйвер IDE понимает довольно большое число параметров, начиная от указания геометрии диска до поддержки неисправных микросхем контроллера. Параметры, относящиеся к конкретному диску, указываются с помощью «hdX=», где X принимает значения от «a» до «h».

Общие для всех дисков параметры указываются с префиксом «hd=». Заметим, что их можно использовать и для какого-то конкретного диска, и при этом параметр будет применён именно так, как ожидалось.

Также заметим, что «hd=» может быть использован для ссылки на следующий неуказанный диск в последовательности (a, …, h) В дальнейшем, для краткости, параметры будут описаны в виде «hd=». Более подробная информация приведена в файле Documentation/ide/ide.txt (в старых ядрах — Documentation/ide.txt или в совсем старых — drivers/block/README.ide) из дерева исходного кода ядра Linux.

Параметры «hd=cyls,heads,sects[,wpcom[,irq]]»
Эти параметры используются для указания физической структуры диска. Обязательными являются только первые три значения. Значения цилиндров(cyls)/головок(heads)/секторов(sects) в дальнейшем используются в программе fdisk. Значение предварительной компенсации записи (wpcom) для дисков IDE игнорируется. Значение IRQ, указанное в качестве irq, используется в контроллере интерфейса, к которому подключён диск, и, на самом деле, не относится к диску.
Параметр «hd=serialize»
В микросхеме двойного IDE интерфейса CMD-640 содержится ошибка, приводящая к тому, что при одновременной работе дисков первичного и вторичного интерфейсов происходит повреждение данных. Этим параметром можно указать, что драйверу никогда не следует использовать оба интерфейса одновременно.
Параметр «hd=noprobe»
Не определять этот диск. Например,

hdb=noprobe hdb=1166,7,17
отключит проверку, но одновременно задаст структуру диска, так что он будет зарегистрирован как обычное блочное устройство, и с ним можно будет работать.
Параметр «hd=nowerr»
Бит WRERR_STAT на некоторых дисках установлен постоянно. Этот параметр позволяет обойти эту проблему в таких устройствах.
Параметр «hd=cdrom»
Указывает драйверу IDE, что вместо обычного жёсткого диска IDE подключён CD-ROM, совместимый с ATAPI. В большинстве случаев CD-ROM определяется автоматически, однако, если этого не происходит, можно воспользоваться данным параметром.
Стандартные параметры драйвера дисков ST-506 («hd=»)
Стандартный драйвер дисков, также как драйвер IDE, понимает аргументы, описывающие структуру дисков. Однако он ожидает указания только трёх значений (C/H/S), а если их будет больше или меньше, то просто проигнорирует их. Кроме того, аргумент должен быть указан в виде «hd=», то есть «hda=» и т. п., в данном случае, являются неправильным. Формат следующий:

hd=cyls,heads,sects
Если установлено два диска, то для второго диска нужно повторить вышеуказанную строку со структурой.

Устройства Ethernet

Различные драйверы используют разные параметры, но все они, как минимум, распознают IRQ, базу ввода/вывода и имя. В общей форме выглядит это примерно так:

ether=irq,iobase[,param_1[,...param_8]],name

Первый не числовой аргумент воспринимается как имя. Значения param_n (если есть) у разных карт/драйверов, обычно, имеют различный смысл. Обычно, значения param_n используются для указания адреса общей памяти, выбранного интерфейса, канала DMA и т. п.

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

ether=0,0,eth1

Обратите внимание, что ноль в качестве значения IRQ и базы ввода/вывода указывает драйверам определять значения автоматически.

Исчерпывающей документацией по использованию нескольких карт и по специфичным для карты/драйвера значениям param_n можно считать Ethernet-HowTo. Желающие могут обратиться к соответствующему их карте разделу этого документа.

Драйвер дисковода

У драйвера дисковода есть много параметров. Все они перечислены в файле Documentation/blockdev/floppy.txt (в старых ядрах — Documentation/floppy.txt или в совсем старых ядрах — drivers/block/README.fd) из дерева исходного кода ядра Linux. Дополнительную информацию ищите в этом файле.

Драйвер звука

Драйвер звука также может учитывать параметры загрузки для замены встроенных при компиляции значений по умолчанию. Не рекомендуется заново определять значение параметров, так как это довольно сложно. Описание находится в файле Documentation/sound/oss/README.OSS (и в drivers/sound/Readme.linux у старых ядер) в дереве исходного кода ядра Linux. Параметр загрузки имеет следующий вид:

sound=device1[,device2[,device3...[,device10]]]
где каждое значение устройства N имеет формат 0xTaaaId, байты которого используются следующим образом:

T — тип устройства: 1=FM, 2=SB, 3=PAS, 4=GUS, 5=MPU401, 6=SB16, 7=SB16-MPU401

aaa — адрес ввода/вывода в шестнадцатеричном виде.

I — линия прерывания в шестнадцатеричном виде (т. е. 10=a, 11=b, …)

d — канал DMA.

Как видите, результат довольно непонятен, поэтому лучше установить собственные значения при компиляции. Параметр загрузки «sound=0» полностью отключит драйвер звука.

Драйвер принтера

«lp=»

Синтаксис:

lp=0
lp=auto
lp=reset
lp=port[,port...]
Вы можете указать драйверу принтера, какие порты надо использовать, а какие не использовать совсем. Это удобно, если не нужно, чтобы драйвер принтера захватывал все доступные параллельные порты, и оставлял их другим драйверам (таким, как PLIP, PPA).

В значении перечисляется несколько названий портов. Например, при lp=none,parport0 используется первый параллельный порт для lp1 и отключается lp0. Чтобы вообще отключить драйвер принтера, укажите lp=0.