Здравствуйте. Возможно, если вы пользуйтесь линуксом, то вы слышали всякие страшилки про пересборку ядра и хотели бы по подробнее разобраться с тем что такое ядро. В этой статье я попробую подробно пройтись по этой теме.
Где оно?
Само ядро находится в директории /boot
и, обычно, имеет имя вроде vmlinuz-linux. Загрузчик во время запуска компьютера загружает его и передает ему управление для загрузки. Но, драйвера всех железяк не вкомпилишь в ядро, иначе оно будет слишком здоровым. Поэтому у linux есть динамически подгружаемые модули ядра, причем, зачастую необходимые модули ядра для загрузки системы тоже динамические. Это значит, что систему так просто не загрузишь: нужно предусмотреть механизм загрузки драйверов жестких дисков, файловых систем и т.д.
Для такого случая в типичном дистре предусмотрен initrd (Initial RAM disk). initrd — это файловая система, где находится минимальный UNIX, достаточный для того, чтобы загрузить модули ядра, необходимые для работы с дисками, файловыми системами, примонтировать раздел жесткого диска с установленной ОС в корень и продолжить процесс загрузки с монтированным разделом. Это — демон инициализации, shell, утилиты командной строки (обычно, busybox) и модули ядра. Во время установи системы или обновления ядра initrd автоматически собирается и, в результате, там оказываются необходимые нам модули.
Теперь, когда мы знаем про ramdisk, попробуем организовать процесс загрузки по другому: загрузчик загружает ядро, загружает рамдиск и по некому стандарту сообщает ядру об этом диске, затем передает управление ядру. Ядро запускает демон инициализации. Как правило это /bin/init, тот грузит модули, показывает красивую картинку загрузки вашей убунты(федоры, минта…) монтирует жесткий диск и работает там.
Давайте убедимся, что это так. Дружно запускаем команду
cat /etc/mtab
Если система действительно загрузилась с помощью initrd, мы увидим в первой строчке что-нибудь вроде:
rootfs / rootfs rw 0 0
После rootfs в корень ФС монтируется раздел вашего жесткого диска. Как и положено, вы после монтирования жесткого диска не можете видеть, что находится в rootfs, однако она смонтирована в корне до него.
initrd находится в директории /boot
и, в моем случае, зовется initramfs-linux.img
.
Если вы не нашли ядро или рамдиск советую посмотреть процедуру загрузки в конфигах загрузчика. Если ваш загрузчик — GRUB 2, то делается это так:
cat /boot/grub/grub.cfg
Где модули?
Модули в /boot
вы можете не искать, они находятся в папке /lib/modules
. Если у вас стоит несколько ядер, то там будет несколько папок. Для того, чтобы узнать папку запущенного ядра вбейте команду:
uname -r
Модули ядра имеют расширение *.ko и запакованы в архивы.
Let’s go!
Итак, давайте для начала условимся, что особенности сборки и установки ядра немного зависят от дистрибутива и того, как его устанавливали. У меня, например стоит Arch Linux и у меня во время сборки ядра возникли проблемы. Для того, чтобы на арче собрать ядро убедитесь, что у вас есть bc, docbook-xsl, inetutils и xmlto. Мне не следует вам напоминать, что у вас должен стоять компилятор gcc. Если во время сборки возникают проблема, вроде «не могу запустить такую-то программу», убедитесь, что у вас все есть.
Поехали. Для начала, скачайте исходники ядра:
wget https://www.kernel.org/pub/linux/v3.x/linux-3.18.6.tar.xz
Затем, распакуйте их с помощью архиватора tar и зайдите в папку:
tar -xJf linux-3.18.6.tar.xz
cd linux-3.18.6
Для начала было бы не плохо почитать README того, что вы скачали. Следует сконфигурировать ядро, прежде чем его собрать. Конфигурация иерархически упорядочена и состоит из параметров четырех типов. Первый — это переключатель с двумя-тремя состояниями: включить какой-то функционал, отключить или включить как динамически загружаемый модуль. Второй — это радиокнопка. Другие два типа — это числовые и строковые константы, которые позволяют выбрать имя ядра, файл системы инициализации по умолчанию, максимальное число графических процессоров и т.д.
Конфигурировать ядро можно по-разному. Перечислю наиболее — популярные команды.
- make menuconfig — подойдет, если мы не можем позволить себе такую роскошь, как графический интерфейс(например, мы не установили иксы, или они не запускаются из-за конфигурации ядра, или мы работаем по SSH, хотя собирать ядро по удаленке довольно странно). Будет представлен интерфейс на псевдографике, где мы сможем с помощью клавы отметить нужные чекбоксы.
- make xconfig — если у нас есть такая роскошь, как графический интерфейс и в нем используется библиотека Qt.
- make gconfig — у нас есть такая роскошь, как графический интерфейс, но по странному стечению обстоятельств вы используете GNOME вместо KDE.
- make oldconfig — дополняет старый конфиг новыми параметрами, задав вам несколько вопросов.
- make defconfig — настройки, по умолчанию.
Мы пойдем следующим путем: создатель дистрибутива тщательно подбирал настройки ядра и вы точно знаете, что система с ними работает. Мы возьмем настройки из рабочей системы. Если в конфигурации ядра был включен config.gz, то мы можем найти этот файл в файловой системе /proc:
cp /proc/config.gz .
gzip -d config.gz
mv config .config
make oldconfig
Дальше мы примемся все конфигурировать уже интересующие нас параметры. Во первых было-бы не плохо узнать, какие модули в наше системе в данный момент загружены. Команда lsmod выдает список модулей в три колонки:
- Module — имя модуля
- Size нас не интересует.
- Used by по сути две колонки. Первая — это число зависимостей от данного модуля. Вторая — это те самые модули, которые его используют.
Если в колонке used by разность числа модулей и числа зависимостей не равна нулю, значит в ядре есть, что-то что использует его и вы не можете этот модуль выгрузить, не введя систему в неработоспособное состояние. Это значит, вы не выгрузите драйвер жесткого диска, который уже примонтирован и на котором установлена работающая в данный момент ОС. Помимо, этого есть модули, от которых зависят — эти невыгружаемые модули. Все остальные вы можете так или иначе выгрузить в рантайме командой вида modprobe -r foo
и система, скорее всего, останется в работоспособном состоянии. Чтобы ваша система грузилась без рам диска вам, как минимум, нужно встроить в ядро невыгружаемые модули. Если вы хотите освободить несколько секунд загрузки, сделав ядро монолитным, встройте все, что вы видите в выхлопах команды lsmod. Приступим к конфигурированию:
make menuconfig
Не забудьте переименовать ядро, для поиска необходимых опций воспользуйтесь поиском. Помните, что вы не всегда найдете опцию, отвечающую за тот или иной модуль, в этом деле вам поможет Google (или Яндекс, Bing, поиск@mail.ru, в зависимости, от того, чем вы пользуетесь).
После, того как вы все настроили, осталось ядро собрать и установить вместе с модулями:
make
Отдохните, сделайте чай. У вас появилось несколько часов свободного времени, прежде чем вы выполните установку:
make install modules_install
Новое ядро будет установлено как /boot/vmlinuz. Переименуем его в vmlinuz-mykern, для того чтобы ядро было найдено GRUB’ом. Помимо, этого вам следует собрать initrd, даже если полагаете, что система загрузится без него, для того чтобы убедиться, что она загрузится хотя-бы с ним. В арче я делаю это так
mkinitcpio -g /boot/initramfs-mykern.img -k 3.18.6-MYKERN
(предполагалось, что вы дали ядру имя -MYKERN)
Нам остается обновить конфиги GRUB’а и ребутнуть систему. Будьте внимательны и не удаляйте ядро из дистра, поскольку ваше ядро окажется скорее-всего не рабочим и вам придется в таком случае брать загрузочный диск, монтировать жесткий перейти в chroot окружение и переустановить ядро(если вы не знаете, как это сделать, вам ещё рано пересобирать ядра).
grub-mkconfig -o /boot/grub/grub.cfg
reboot
Вместо заключения
На этом я заканчиваю столь подробный обзор пересборки ядра. Я рассказывал про то как компилировать ядро, поскольку описание того, как что-то собрать дает лучшее описание, как это что-то работает, чем какая-то диаграмма.
Попробуйте это, убедитесь, что это не так сложно собрать подходящее ядро с третей попытки, экспериментируйте и познавайте систему.
В акедемических интересах пересобрать ядро это очень хорошо, но на практике в этом нет необходимости:
1. лучше добавлять нужные модули без пересборки ядра.
2. в конкретном случае в archlinux и так приходят свежие ядра при обновлении.
Really great info can be found on blog.!
Immunofluorescent staining of Axin2 expressing cells with GFP C, in situ hybridisation analysis of dspp expression D and merged image E of damaged superior first molar from Axin2 CreERT2; Rosa26 mT mG flox mice 5 days post damage can you buy priligy online Experimental endometriosis was established by implanting endometrial tissue from green fluorescent protein GFP mice into the peritoneal cavity of DS- Red mice
priligy pill Management of vulvovaginal lichen planus a new approach