This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.
Please visit our production wiki at https://wiki.gentoo.org
Handbook:MIPS/Installation/Kernel
Установка исходного кода
Все дистрибутивы строятся вокруг ядра Linux. Ядро является прослойкой между пользовательским программным обеспечением и физическим оборудованием. Gentoo предоставляет несколько вариантов исходного кода ядра. Полный список с описанием доступен в статье общие сведения о ядре.
Для систем, основанных на mips архитектуре, рекомендуется пакет sys-kernel/mips-sources.
Выберем подходящий исходный код ядра и установим с помощью emerge:
root #
emerge --ask sys-kernel/mips-sources
Данная команда установит исходный код ядра Linux в /usr/src/, в котором символьная ссылка linux будет указывать на установленную версию:
root #
ls -l /usr/src/linux
lrwxrwxrwx 1 root root 12 Oct 13 11:04 /usr/src/linux -> linux-3.16.5-gentoo
Теперь следует настроить и собрать ядро. Здесь существует два основных подхода:
- Ядро настраивается и собирается вручную.
- Утилита genkernel собирает и устанавливает его автоматически.
В данной инструкции мы расскажем, как провести настройку вручную, поскольку это лучший способ оптимизировать окружение.
Основной вариант: Ручная настройка
Введение
Согласно расхожему мнению, настройка ядра- наиболее сложная процедура, с которой сталкивается пользователь Линукса. Это сильное преувеличение и собрав пару-тройку ядер никто и не вспомнит, что это было сложно.
Но один факт учитывать стоит. Для ручной настройки ядра необходимо иметь представление о том, из чего собран компьютер. Большую часть можно узнать, установив sys-apps/pciutils и выполнив команду lspci:
root #
emerge --ask sys-apps/pciutils
Если находитесь внутри chroot, то можете спокойно игнорировать предупреждения о pcilib (навроде pcilib: cannot open /sys/bus/pci/devices), которая может появляться в выводе lspci.
Другой источник информации о системе можно получить, выполнив lsmod и посмотрев, какие модули ядра подгрузились на установочном носителе.
Остаётся перейти в директорию с ядром и выполнить make menuconfig. Нас поприветствует экран конфигурации.
root #
cd /usr/src/linux
root #
make menuconfig
В конфигурации ядра Linux есть много-много секций. Сначала пройдёмся по опциям, которые должны быть включены (иначе Gentoo будет работать неправильно или же вовсе не запустится). Для более глубокого ознакомления стоит посетить гайд по настройке ядра Gentoo.
Включаем обязательные опции
Убедитесь, что драйверы, необходимые для загрузки системы (например, контроллер SCSI и так далее) собраны прямо в ядре, а не как модуль. В противном случае, система может не загрузиться.
Следует выбрать тип процессора, а так же рекомендуется включить опции MCE, чтобы получать информацию о проблемах с "железом". На некоторых архитектурах (например, x86_64) подобные ошибки выводятся не в dmesg, а /dev/mcelog. Так что понадобится пакет app-admin/mcelog.
Активируйте опцию Maintain a devtmpfs file system to mount at /dev, тогда критичные для устройств файлы будут подгружаться как можно раньше (CONFIG_DEVTMPFS и CONFIG_DEVTMPFS_MOUNT):
Device Drivers ---> Generic Driver Options ---> [*] Maintain a devtmpfs filesystem to mount at /dev [ ] Automount devtmpfs at /dev, after the kernel mounted the rootfs
Удостоверьтесь, что поддержка SCSI-дисков была включена (CONFIG_BLK_DEV_SD):
Device Drivers ---> SCSI device support ---> <*> SCSI disk support
Дальше стоит включить поддержку используемых Вами файловых систем. Рутовая ФС должна быть включена в ядро, а не подгружена в качестве модуля, иначе Gentoo не сможет примонтировать данный раздел. Не забудьте также включить Virtual memory и /proc file system. По необходимости выберете один или несколько параметров из списка (CONFIG_EXT2_FS, CONFIG_EXT3_FS, CONFIG_EXT4_FS, CONFIG_MSDOS_FS, CONFIG_VFAT_FS, CONFIG_PROC_FS и CONFIG_TMPFS):
File systems ---> <*> Second extended fs support <*> The Extended 3 (ext3) filesystem <*> The Extended 4 (ext4) filesystem <*> Reiserfs support <*> JFS filesystem support <*> XFS filesystem support <*> Btrfs filesystem support DOS/FAT/NT Filesystems ---> <*> MSDOS fs support <*> VFAT (Windows-95) fs support Pseudo Filesystems ---> [*] /proc file system support [*] Tmpfs virtual memory file system support (former shm fs)
Если для подключения к сети интернет используется PPPoE или dial-up модем, то тогда включите следующие параметры (CONFIG_PPP, CONFIG_PPP_ASYNC и CONFIG_PPP_SYNC_TTY):
Device Drivers ---> Network device support ---> <*> PPP (point-to-point protocol) support <*> PPP support for async serial ports <*> PPP support for sync tty ports
Опции сжатия не повредят, но и не являются обязательными, как и PPP over Ethernet. Фактически, последний используется только когда ppp сконфигурирован на использование PPPoE режима ядра.
Не забудьте настроить поддержку сетевых карт (кабельных и беспроводных).
Поскольку большинство современных систем являются многоядерными, нам понадобится Symmetric multi-processing support (CONFIG_SMP):
Processor type and features ---> [*] Symmetric multi-processing support
Во многоядерных системах каждое ядро считается за один процессор.
Если используются USB-устройства ввода (например клавиатуру и мышь) или другие USB-устройства, то не забудьте включить и эти параметры (CONFIG_HID_GENERIC, CONFIG_USB_HID, CONFIG_USB_SUPPORT, CONFIG_USB_XHCI_HCD, CONFIG_USB_EHCI_HCD, CONFIG_USB_OHCI_HCD):
Device Drivers ---> HID support ---> -*- HID bus support <*> Generic HID driver [*] Battery level reporting for HID devices USB HID support ---> <*> USB HID transport layer [*] USB support ---> <*> xHCI HCD (USB 3.0) support <*> EHCI HCD (USB 2.0) support <*> OHCI HCD (USB 1.1) support
Подготовка конфигурации
На некоторых системах (Origin 200/2000, Indigo2 Impact (R10000), Octane/Octane2 и O2) необходимо 64-битное ядро для загрузки. Для таких систем установите sys-devel/kgcc64, чтобы собрать кросс-компилятор для построения 64-битных ядер.
Многие из поддерживаемых систем имеют примерные файлы .configs, скрытые в исходных кодах ядра. Не все системы имеют конфигурацию распространяемую таким образом. Те, которые имеют, могут быть сконфигурированы командами, показанными в таблице ниже.
Система | Команда конфигурации |
---|---|
Сервера Cobalt | make cobalt_defconfig |
Indy, Indigo2 (R4k), Challenge S | make ip22_defconfig |
Origin 200/2000 | make ip27_defconfig |
Indigo2 Impact (R10k) | make ip28_defconfig |
O2 | make ip32_defconfig |
Все образы для установки Gentoo включают в себя конфигурацию ядра как часть образа. Конфигурация находится в /proc/config.gz. Во многих случаях данный файл можно использовать. Лучше, если ваши исходные коды ядра почти совпадают с ядром, которое в настоящее время работает. Чтобы распаковать данный файл, просто пропустите его через zcat, как показано ниже.
root #
zcat /proc/config.gz > .config
Данная конфигурация ядра настроена для образа netboot. Поэтому она будет ожидать, что где-то рядом находится образ корневой файловой системы, либо как каталог для initramfs, либо устройство-петля для initrd. Когда вы запустите make menuconfig, не забудьте зайти в General Setup и выключить опции для initramfs.
Настройка конфигурации
Как только вы нашли конфигурацию, скачайте ее в каталог с вашим исходным кодом ядра, и переименуйте ее в .config. Далее вы можете запустить make oldconfig чтобы обновить конфигурацию, и получить возможность изменить ее до компиляции.
root #
cd /usr/src/linux
root #
cp /path/to/example-config .config
root #
make oldconfig
Пока просто нажмите ENTER (также известная как Return) на каждую подсказку, чтобы выбрать опцию по умолчанию...
root #
make menuconfig
В разделе Kernel Hacking есть опция, названная "Are You Using A Cross Compiler?". Она сообщает ядру, что нужно добавить "mips-linux-" (либо mipsel-linux ... и так далее) к командам gcc и as при компиляции ядра. Это нужно выключить, даже если вы и правда делаете кросс-компиляцию. Вместо этого, если вам нужно вызвать кросс-компилятор, укажите префикс, используя переменную CRROSS_COMPILE, как показано в следующем разделе.
Существует известная ошибка с JFS и ALSA на системах Octane, когда ALSA не работает. Из-за недостаточной стабильности JFS на MIPS, рекомендуется пока не использовать JFS.
Компиляция и установка
Теперь, когда ядро настроено, настало время его скомпилировать и установить. Выйдите из настройки и запустите процесс компиляции:
На 64-битных машинах вам нужно указать CROSS_COMPILE=mips64-unknown-linux-gnu- (или mips64el-... на системе little-endian) для использования 64-битного компилятора.
Обычная компиляция:
root #
make vmlinux modules modules_install
При кросс-компиляции на целевой системе измените mips64-unknown-linux-gnu- так, как вам необходимо:
root #
make vmlinux modules modules_install CROSS_COMPILE=mips64-unknown-linux-gnu-
При компиляции на другой системе, например, x86, используйте следующие команды для компиляции ядра и установки модулей в отдельный каталог, который потом можно передать на целевую систему.
root #
make vmlinux modules CROSS_COMPILE=mips64-unknown-linux-gnu-
root #
make modules_install INSTALL_MOD_PATH=/куда_нибудь
При компиляции 64-битного ядра для Indy, Indigo2 (R4k), Challenge S и O2, используйте цель vmlinux.32 вместо vmlinux. В противном случае ваша система не сможет загрузиться. Это для того, чтобы обойти PROM, который не понимает формат ELF64.
root #
make vmlinux.32
Возможно включить параллельную сборку, используя
make -jX
, где X это число параллельных задач, которые может запустить процесс сборки. Это похоже на инструкции, которые были даны ранее относительно файла /etc/portage/make.conf в части переменной MAKEOPTS.Данная команда создаст vmlinux.32 - который будет вашим конечным ядром
По завершении компиляции ядра, скопируйте образ ядра в каталог /boot:
На серверах Cobalt, начальный загрузчик ожидает увидеть запакованный образ ядра. Помните, что нужно выполнить gzip -9 для образа, прежде чем положить его в /boot/.
root #
cp vmlinux /boot/kernel-3.16.5-gentoo
Для серверов Cobalt сожмите образ ядра:
root #
gzip -9v /boot/kernel-3.16.5-gentoo
Опционально: Собираем initramfs
В некоторых случаях необходимо включить поддержку initramfs - an initial ram-based file system (файловая система, основанная на оперативной памяти). Наиболее распространённая причина это нахождение различных системных путей (вроде /usr/ или /var/) на различных разделах. При наличии initramfs эти разделы могут быть подгружены средствами initramfs.
Без initramfs существует вероятность неправильной загрузки, так как для запуска некоторых ФС может потребоваться информация на этих самых разделах. Initramfs подгружает всю информацию в небольшой архив, который читается сразу после загрузки ядра, но до передачи управления службам инициализации. Таким образом набор скриптов initramfs проследит, чтобы все разделы были примонтированы верно перед продолжением процесса загрузки.
Для установки initramfs, сперва нужен sys-kernel/genkernel, который его сгенерирует:
root #
emerge --ask sys-kernel/genkernel
root #
genkernel --install initramfs
Если необходима поддержка LVM или RAID, то следует указать это как опцию genkernel. Для более подробной информации взгляните на genkernel --help. В следующем примере включена поддержка LVM и программного RAID (mdadm):
root #
genkernel --lvm --mdadm --install initramfs
Initramfs будет расположен в /boot/. Можно посмотреть файлы, начинающиеся с "initramfs":
root #
ls /boot/initramfs*
Продолжим в Модули ядра.
Альтернативно: Используя genkernel
Если ручная установка кажется слишком сложной, то следует воспользоваться утилитой genkernel, которая настроит и соберёт ядро автоматически.
genkernel конфигурирует ядро примерно так же, как в установочном носителе. Таким образом, ядро, сконфигурированное genkernel постарается определить всё оборудование в процессе загрузки. Поскольку genkernel не требует самостоятельной настройки ядра, он рекомендован для тех, кто не готов собирать собственное ядро.
Приступим. Сперва, нужно установить sys-kernel/genkernel:
root #
emerge --ask sys-kernel/genkernel
Затем отредактируйте файл /etc/fstab, где следует указать в строке /boot/ правильное устройство во втором поле. Если следовали примеру из данной инструкции, то, скорее всего, это устройство /dev/sda1 с файловой системой ext2 и строка должна выглядеть следующим образом:
root #
nano -w /etc/fstab
/etc/fstab
Настраиваем точку монтирования /boot/dev/sda1 /boot ext2 defaults 0 2
В процессе настройки Gentoo /etc/fstab еще будет изменён. На данный момент мы правим лишь /boot, так как genkernel использует эту настройку.
Осталось скомпилировать ядро, выполнив genkernel all. Учтите, что поскольку genkernel включает поддержку как можно большего диапазона оборудования, процесс сборки может занять некоторое время!
Если для загрузочного раздела не используется ext2 или ext3, то возможно придётся вручную настроить ядро, выполнив genkernel --menuconfig all и добавив поддержку нужной ФС (не как модуля). Пользователям LVM2 следует также добавить
--lvm
в качестве аргумента.root #
genkernel all
По завершению мы получим полный набор модулей и initramfs. Ядро и initrd нам ещё понадобятся при настройке загрузчика. Запишите название файлов ядра и initrd, так как они нам ещё понадобятся. Initrd запускается сразу после ядра для определения оборудования, перед запуском самой системы.
root #
ls /boot/kernel* /boot/initramfs*
Модули ядра
Настройка модулей
Hardware modules are optional to be listed manually. udev will normally load all hardware modules that are detected to be connected in most cases. However, it is not harmful for automatically detected modules to be listed. Sometimes exotic hardware requires help to load their drivers.
Укажите модули, которые должны подгружаться автоматически в /etc/modules-load.d/*.conf файлах. Один модуль на строку. Дополнительные опции для модулей при необходимости нужно указывать в файлах /etc/modprobe.d/*.conf.
Чтобы посмотреть доступные модули, выполните команду find, не забыв заменить "<kernel version>" на собранную в предыдущем шаге версию:
root #
find /lib/modules/<kernel version>/ -type f -iname '*.o' -or -iname '*.ko' | less
Например, чтобы автоматически подгрузить модуль 3c59x.ko (драйвер для определённой семьи интернет-карт от 3Com), отредактируйте файл /etc/modules-load.d/network.conf добавив имя модуля. Фактическое имя файла несущественно для загрузчика.
root #
mkdir -p /etc/modules-load.d
root #
nano -w /etc/modules-load.d/network.conf
/etc/modules-load.d/network.conf
Принудительная загрузка модуля 3c59x во время загрузки3c59x
Продолжим установку в Настройка системы.
Опционально: Установка файлов прошивки
Для корректной работы некоторых драйверов требуется установка дополнительных файлов прошивки. Часто подобное требуется для сетевых интерфейсов, особенно беспроводных. Также, современные видео чипы, от вендоров AMD, NVidia и Intel, при использовании отрытых драйверах, часто нуждаются во внешних файлах firmware. Большинство файлов прошивки поставляется в пакете sys-kernel/linux-firmware:
root #
emerge --ask sys-kernel/linux-firmware