Gentoo kernel upgrade: различия между версиями

Материал из AlexNook
Перейти к навигацииПерейти к поиску
 
(не показано 9 промежуточных версий этого же участника)
Строка 109: Строка 109:


{{root|module-rebuild rebuild}}
{{root|module-rebuild rebuild}}
==Ручное обновление ядра БЕЗ genkernel==
Можно пойти по другому пути и обновить ядро не используя утилиту '''genkernel'''. Для этого выполняем:
Обновление дерева портажей
{{root|emerge --sync}}
Важно сохранить старый конфигурационный файлик перед обновлением. Он располагается в {{path|/usr/src/linuc/.config}}
Затем ставим исходники нового ядра
{{root|emerge -pv gentoo-sources}}
Следом нам следует указать системе на новые исходники, переделав символичскую ссылку {{path|/usr/src/linux}}
Для этого удобно использовать '''eselect'''
{{root|eselect kernel list}}
{{root|eselect kernel set 3}}
После чего заходим в папку с исходниками нового ядра
{{root|cd /usr/src/linux}}
Далее копируем старый конфиг ядра в папку с новыми исходниками
{{root|cp /root/config /usr/src/linux/.config}}
(у меня он был сохранён в домашнюю директорию пользователя root)
Теперь нам нужно выполнить процедуру обновления этого конфига. Команда ниже сохраняет настройки старой версии ядра (она берёт их из скопированного конфига), а затем добавляет в настройки специфичные для новой версии ядра, снабжая их пометкой '''NEW'''
{{root|make olddefconfig}}
Теперь настраиваем ядро
{{root|make menuconfig}}
Затем копилируем ядро
{{root|make}}
Теперь монитруем раздел с загрузчиком системы
{{root|mount /dev/sda1 /boot/}}
После чего выполняем установку свежескомпилированного ядра
Сперва модулей (драйверы собранные в ядре как M)
{{root|make modules_install}}
{{note|В этот момент нужно поставить все LKM, которые собирались отдельно из firmware вендора. Например у меня это драйвер сетевухи '''r8168''' Важно: При переустановке LKM сетевухи связь по ethernet отвалится, т.к. перед установкой выполняется rmmod}}
{{note|LKM ставятся в {{path|/lib/modules/<kernel version>/}}}}
И самой системы
{{root|make install}}
===Загрузчик GRUB2===
Должен быть подмонтирован раздел {{path|/boot}}
Затем выполнить
{{root|grub-mkconfig -o /boot/grub/grub.cfg}}
===Загрузчик GRUB===
Теперь правим файл загрузчика '''Grub''' (у меня стоит старая версия legacy. Принципиально ставлю именно её)
{{root|nano /boot/grub/grub.conf}}
{{File|/boot/grub/grub.conf|
<pre>OLDCONFIG="no"
default 0
timeout 10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Gentoo Linux 4.19.86
root (hd0,0)
kernel /boot/vmlinuz-4.19.86-gentoo_alx root=/dev/sda3
</pre>}}
===Загрузчик EFI===
Подразумевается что в системе установлен {{path|sys-boot/efibootmgr}} и всё настроено для его использования.
Для начала создаём папку, куда поместим ядро. В этой папке UEFI прошивка материнки будет искать ядро линукса.
{{root|mkdir -p /boot/efi/boot }}
Далее копируем в созданную папку наше ядро
{{root|cp /boot/vmlinuz-* /boot/efi/boot/bootx64.efi }}
И наконец сообщаем прошивки UEFI нашей материнки куда она может обращатся за ядром линукса для его загрузки.
{{root|efibootmgr --create --disk /dev/sda --part 1 --label "Gentoo" --loader "\efi\boot\bootx64.efi"}}
'''Описание аргументов команды'''
'''To create an EFI boot entry, a couple of arguments are passed to efibootmgr:'''
* '''--create or -c''' to create a new entry;
* '''--part or -p''' followed by the partition number on which the EFI System Partition is hosted;
* '''--disk or -d''' followed by the disk on which the EFI System Partition is hosted;
* '''--label or -L''' followed by the label to use as the boot entry;
* '''--loader or -l''' followed by the path of the EFI image to boot
Кажется ничего не забыл. Теперь можно перезагрузится в новую систему.
{{root|shutdown -r now}}
Далее для обновления пакетов системы, которые содержат модуля ядра ОС можно выполнить
{{root|emerge @module-rebuild}}


==Удаление старого ядра==
==Удаление старого ядра==
Строка 121: Строка 240:
Успешность выполненых нами операций можно проверить командой
Успешность выполненых нами операций можно проверить командой
{{root|eselect kernel list}}
{{root|eselect kernel list}}
==Защита исходников от удаления deeplean==
Исходные коды ядра постепенно становятся неподдерживавыми. Некоторым пакетам необходим текущий код для сборки. Чтобы защитить новую версию от удаления с помощью depclean, можно добавить его в набор world (файл {{path|/var/lib/portage/world}}) так:
{{root|emerge --noreplace sys-kernel/gentoo-sources:6.1.53-r1}}
Старые версии, который больше не поддерживаются, могут быть удалены из набора world:
{{root|emerge --deselect sys-kernel/gentoo-sources:6.1.53-r1}}


==Ссылки==
==Ссылки==

Текущая версия на 14:31, 22 ноября 2023

Общие слова о обновлении ядра в Gentoo Linux

Сидел я долгое время на ядре версии 2.4. Потом обновил железо и решил поставить новую систему с новым ядром - 2.6 на 64 bit. Всё было отлично, но прошёл год, мне к тому времени понадобилось внести некоторые изменения в ядро и пересобрать его. Думал как всегда вызвать genkernel и menuconfig и не трудиться особенно, но потом решил проверить, а может вышли новые версии ядра. И действительно - за год версия немного изменилась. Ну что же, раз пересобирать ядро и править .config, то тогда сразу на новое из портажей. С предисловием закончил приступим к делу =).

Подготовка к обновлению ядра Gentoo

Для начала обновим портажи

emerge --sync

Я привык уже пользоваться sys-kernel/genkernel, так что обновляем и это приложение.

emerge genkernel

Теперь обновим пакеты app-admin/eselect и sys-kernel/module-rebuild (или если их нет то поставим с нуля)

emerge eselect
emerge module-rebuild && module-rebuild populate

Настройка Genkernel

Так как я люблю использовать для компиляции ядра Genkernel, то есть смысл перед его использованием настроить, или хотябы убедиться, что в конфигурационном файле genkernel /etc/genkernel.conf всё в порядке.

Приведу основные опции из своего файла и кратко опишу их

File: /etc/genkernel.conf
OLDCONFIG="no"
MENUCONFIG="yes"
CLEAN="yes"
MRPROPER="yes"
MOUNTBOOT="yes"
SAVE_CONFIG="yes"
USECOLOR="yes"

OLDCONFIG - запуск до компиляции ядра команды make oldconfig, которая попробует собрать информацию о системы, основываясь на /usr/share/genkernel/. При этом, если активирован флаг --clean, то он автоматом превращается в --no-clean.

CLEAN - запускает make clean до начала процесса сборки (компиляции) ядра, что удаляет всех зависимости и объектные файлы из исходного (старого) ядра. При этом, если этот флаг имеет значение NO, то не будет выполнена команда MRPROPER. Так же не будет скопирован поверх конфигурационный файл, будет использован текущий.

MRPROPER - выполняет очистку как и CLEAN, но дополнительно ещё и удаляет все конфигурационные файлы (например .config).

MENUCONFIG - запускает menuconfig, который помогает в графическом интерфейсе ncurses настроить ядро (.config).

MOUNTBOOT - монтирование загрузочного раздела, если он не подмонтирован (BOOTDIR). Обычно это /boot

SAVE_CONFIG - в случае успешной компиляции ядра сохраняет конфигурационный файл в /etc/kernels

USECOLOR - использовать цветной вывод информации в работе Genkernel.


С подготовкой закончили. Теперь самое время приступать к обновлению.

Установка исходников (source) ядра

Для начала давайте посмотрим, а что за систему мы имеем в данный момент:

uname -a

Теперь проверим, а что есть нового в портажах к данному моменту.

emerge -pv gentoo-sources

Мы получим на экране что-то типа

Calculating dependencies... done!
[ebuild  NS   ] sys-kernel/gentoo-sources....

где NS будет означать, что исходники ядра будут установлены рядом со старым в новый слот. В общем ставим их, а точнее качаем с нета, стандартно выполнив:

emerge gentoo-sources

Можем теперь посмотреть на них

ls -la /usr/src

Если всё в порядке, то мы должны увидеть в папке подпапку с исходниками нового ядра Gentoo. Теперь переходим к настройке системы, самого ядра и его компиляции (сборки ядра Gentoo).

Настройка системы и конфигурирование исходников ядра

Если вы не сохранили свой конфиг ядра при его первоначальной сборке, то самое время сделать это сейчас. Настраивать ядро с нуля (особенно если последний раз вы этим занимались не вчера и даже не полгода назад) не очень простая задача и достаточно трудоёмка. Есть смысл иметь конфиг, где потом просмотреть только необходимые места.

В общем сохраняем конфиг старого ядра:

cp /usr/src/linux/.config ~/.config_backup

При просмотре исхдников в предыдущем пункте вы наверняка обратили внимание на файл linux, который явдяется simlink'ом, и указывает на текущую версию ядра. Для того, чтобы "нацелить" его на свежие исходники, выполняем следующие действия. Сперва есть смысл посмотреть список всех текущих доступных версий ядра.

eselect kernel list

Будет выведено что-то типа:

Available kernel symlink targets:
  [1]   linux-2.6.25-gentoo-r6
  [2]   linux-2.6.27-gentoo-r8
  [3]   linux-2.6.31-gentoo-r6 *
Note: Звёздочкой (*) выделена текущая версия ядра

Нацеливаем файл linux на свежие исходники командой

eselect kernel set 3

Всё теперь смело можем приступать к сборке нового ядра!

Компиляция нового ядра из исходников (genkernel + menuconfig)

Для сборки нового ядра из исходников запускаем любимый мною genkernel

genkernel all

Внутри интерфейса консольной программы, написанного с использованием ncurses, находим пункт меню

Load an Alternate Configuration File

Что позволяет нам загрузить наш конфигурационный файл. Соответственно нам просто надо указать путь, куда мы забэкапили старый конфиг (например /root/.config_backup.

Всё файл загружен и мы имеем уже наше старое настроенное ядрышко. При этом в связи с изменением ядра на более новое, все новшества и новые опции и фичи будут отмечены ключевыми словами NEW. Настраиваем как нам угодно наше ядро, меняем то что хотели в нём и, и компилируем его? - Нет сперва надо сохранить наш конфигурационный файл с правками в папку, где genkernel будет его искать, то есть по адресу /usr/src/linux/.config. Но т.к. мы находимся в menuconfig, то нам надо выполнить лишь действия сохранения из главного меню:

Save an Alternate Configuration File

Где в качестве полного имени файла указываем .config, что и сохранит его сразу в нужную папку (/usr/src/linux/).

Note: Можем выполнить эту процедуру ещё раз, чтобы забэкапить новонастроенный под новое ядро конфиг, но на этот раз указав пусть типа домашней папки root'а или куда-то ещё.

Всё теперь находясь в главном меню menuconfig'а нажимаем два раза esc и наше ядро начинает компилироваться!

Когда все эти операции позади - мы получаем новое ядро. Теперь надо подмонтировать /boot и прописать в GRUB загрузку этого ядра. Но это уже совсем другая статья дожна быть =).

Далее мы можем пересобрать все внешние модули, которые мы не встроили в ядро, а выбрали букву M вместо *.

module-rebuild rebuild

Ручное обновление ядра БЕЗ genkernel

Можно пойти по другому пути и обновить ядро не используя утилиту genkernel. Для этого выполняем:

Обновление дерева портажей

emerge --sync

Важно сохранить старый конфигурационный файлик перед обновлением. Он располагается в /usr/src/linuc/.config

Затем ставим исходники нового ядра

emerge -pv gentoo-sources

Следом нам следует указать системе на новые исходники, переделав символичскую ссылку /usr/src/linux Для этого удобно использовать eselect

eselect kernel list
eselect kernel set 3


После чего заходим в папку с исходниками нового ядра

cd /usr/src/linux

Далее копируем старый конфиг ядра в папку с новыми исходниками

cp /root/config /usr/src/linux/.config

(у меня он был сохранён в домашнюю директорию пользователя root)

Теперь нам нужно выполнить процедуру обновления этого конфига. Команда ниже сохраняет настройки старой версии ядра (она берёт их из скопированного конфига), а затем добавляет в настройки специфичные для новой версии ядра, снабжая их пометкой NEW

make olddefconfig

Теперь настраиваем ядро

make menuconfig

Затем копилируем ядро

make

Теперь монитруем раздел с загрузчиком системы

mount /dev/sda1 /boot/

После чего выполняем установку свежескомпилированного ядра

Сперва модулей (драйверы собранные в ядре как M)

make modules_install
Note: В этот момент нужно поставить все LKM, которые собирались отдельно из firmware вендора. Например у меня это драйвер сетевухи r8168 Важно: При переустановке LKM сетевухи связь по ethernet отвалится, т.к. перед установкой выполняется rmmod
Note: LKM ставятся в /lib/modules/<kernel version>/

И самой системы

make install

Загрузчик GRUB2

Должен быть подмонтирован раздел /boot

Затем выполнить

grub-mkconfig -o /boot/grub/grub.cfg



Загрузчик GRUB

Теперь правим файл загрузчика Grub (у меня стоит старая версия legacy. Принципиально ставлю именно её)

nano /boot/grub/grub.conf
File: /boot/grub/grub.conf
OLDCONFIG="no"
default 0
timeout 10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz


title Gentoo Linux 4.19.86
root (hd0,0)
kernel /boot/vmlinuz-4.19.86-gentoo_alx root=/dev/sda3

Загрузчик EFI

Подразумевается что в системе установлен sys-boot/efibootmgr и всё настроено для его использования.

Для начала создаём папку, куда поместим ядро. В этой папке UEFI прошивка материнки будет искать ядро линукса.

mkdir -p /boot/efi/boot

Далее копируем в созданную папку наше ядро

cp /boot/vmlinuz-* /boot/efi/boot/bootx64.efi

И наконец сообщаем прошивки UEFI нашей материнки куда она может обращатся за ядром линукса для его загрузки.

efibootmgr --create --disk /dev/sda --part 1 --label "Gentoo" --loader "\efi\boot\bootx64.efi"

Описание аргументов команды

To create an EFI boot entry, a couple of arguments are passed to efibootmgr:

  • --create or -c to create a new entry;
  • --part or -p followed by the partition number on which the EFI System Partition is hosted;
  • --disk or -d followed by the disk on which the EFI System Partition is hosted;
  • --label or -L followed by the label to use as the boot entry;
  • --loader or -l followed by the path of the EFI image to boot


Кажется ничего не забыл. Теперь можно перезагрузится в новую систему.

shutdown -r now


Далее для обновления пакетов системы, которые содержат модуля ядра ОС можно выполнить

emerge @module-rebuild

Удаление старого ядра

В случае успешной установки нового ядра и при не надобности старого, его можно удалить. Для начала удалим исходники старого ядра:

emerge -P gentoo-sources

Теперь есть смысл удалить временные файлы, оставшиеся после компиляции старого ядра

rm -rf /usr/src/linux-2.6._Старое_ядро

Теперь удаляем модули, оставшиеся от старого ядра:

rm -rf /lib/modules/2.6._Старое_ядро

Успешность выполненых нами операций можно проверить командой

eselect kernel list

Защита исходников от удаления deeplean

Исходные коды ядра постепенно становятся неподдерживавыми. Некоторым пакетам необходим текущий код для сборки. Чтобы защитить новую версию от удаления с помощью depclean, можно добавить его в набор world (файл /var/lib/portage/world) так:

emerge --noreplace sys-kernel/gentoo-sources:6.1.53-r1

Старые версии, который больше не поддерживаются, могут быть удалены из набора world:

emerge --deselect sys-kernel/gentoo-sources:6.1.53-r1

Ссылки