Jump to content

# Kernel (Русский)

7 languages

- Bosanski
- English
- Français
- Magyar
- 日本語
- Português
- 中文（简体）

From ArchWiki

Ссылки по теме

- Модули ядра
- Compile kernel module
- Kernel Panics
- sysctl

Состояние перевода: На этой странице представлен перевод статьи Kernel. Дата последней синхронизации: 10 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Из Википедии:

  Ядро Linux — ядро операционной системы, соответствующее стандартам POSIX, составляющее основу операционных систем семейства Linux.

Дистрибутив Arch Linux основан на ядре Linux. Помимо основной стабильной (stable) версии в Arch Linux можно использовать некоторые альтернативные ядра. В статье описываются доступные в официальных репозиториях версии ядер, возможные патчи, а также способы, которыми пользователи могут скомпилировать собственное ядро.

Пакет ядра устанавливается в файловую систему в каталоге `/boot/`. Для загрузки нужного ядра при запуске системы необходимо соответствующим образом настроить загрузчик.

## Официальные ядра

Помощь при работе с официальными ядрами можно найти на форуме и в баг-трекере.

- Stable — "ванильное" ядро Linux с модулями и некоторыми патчами.

  https://www.kernel.org/ || linux

- Hardened — ориентированное на безопасность ядро Linux с набором патчей, защищающих от эксплойтов ядра и пространства пользователя. Содержит больше защитных особенностей, чем linux.

  https://github.com/anthraxx/linux-hardened || linux-hardened

- Longterm — ядро и модули с долгосрочной поддержкой (Long Term Support, LTS).

  https://www.kernel.org/ || linux-lts

- Zen Kernel — результат коллективных усилий исследователей с целью создать лучшее из возможных ядер Linux для систем общего назначения. Подробности проекта можно найти на сайте liquorix.net (там же можно скачать двоичные файлы Zen-ядра для Debian).

  https://github.com/zen-kernel/zen-kernel || linux-zen

## Компиляция

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

/Arch Build System
  Преимущества — наличие готового PKGBUILD для пакета linux и удобство системы управления пакетами.
/Традиционная компиляция
  Ручная загрузка архива файлов с исходными кодами ядра и их компиляция.

Важно:

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

Совет:

- Лучший способ повысить производительность — адаптировать ядро под свою систему, в первую очередь под архитектуру и тип процессора.
- Если оставить в ядре только действительно нужные вам функции, то удастся уменьшить его размер и, следовательно, время сборки. Например, удалите из него Bluetooth, Video4Linux, 1000Mbit Ethernet и прочие вещи, которые на вашей машине точно не понадобятся.

Файлы конфигурации пакетов с ядрами Arch можно найти в исходниках (например, файл [1] из linux). Если включена опция ядра `CONFIG_IKCONFIG_PROC`, то файл `/proc/config.gz` содержит настройки ядра, которое работает на вашей машине в данный момент.

Некоторые из перечисленных пакетов могут быть также доступны в двоичном виде в неофициальных репозиториях.

### Ядра kernel.org

- Git — ядро Linux, собранное из файлов с исходным кодом из git-репозитория Линуса Торвальдса.

  https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git || linux-gitAUR

- Mainline — ядра, в которых появляются все нововведения. Выходят каждые 2-3 месяца.

  https://www.kernel.org/ || linux-mainlineAUR

- Next — самые новейшие ядра, с улучшениями, которые будут добавлены в следующий mainline-выпуск.

  https://www.kernel.org/doc/man-pages/linux-next.html || linux-next-gitAUR

- Longterm 4.19 — LTS-ядро версии 4.19.

  https://www.kernel.org/ || linux-lts419AUR[ссылка недействительна: package not found]

- Longterm 5.4 — LTS-ядро версии 5.4.

  https://www.kernel.org/ || linux-lts54AUR

- Longterm 5.10 — LTS-ядро версии 5.10.

  https://www.kernel.org/ || linux-lts510AUR

- Longterm 5.15 — LTS-ядро версии 5.15.

  https://www.kernel.org/ || linux-lts515AUR

### Неофициальные ядра

- Ck — патч от Con Kolivas, повышение быстродействия для настольных систем с любым типом нагрузки.

  http://ck.kolivas.org/ || linux-ckAUR

- Clear — патчи проекта Clear Linux от Intel. Содержит улучшения производительности и безопасности.

  https://github.com/clearlinux-pkgs/linux || linux-clearAUR

- GalliumOS — ядро Linux с патчами GalliumOS для Хромбуков.

  https://github.com/GalliumOS/linux || linux-galliumosAUR[ссылка недействительна: package not found]

- Libre — без проприетарных или обфусцированных драйверов устройств.

  https://www.fsfla.org/ikiwiki/selibre/linux-libre/ || linux-libreAUR

- Liquorix — ядро, собранное из исходного кода Zen с настройками для Debian. Разработан для настольных, мультимедийных и игровых систем, часто используется в качестве замены основному ядру Debian. Создатель патча Liquorix, Damentz, также является разработчиком набора патчей Zen.

  https://liquorix.net || linux-lqxAUR

- pf-kernel — набор неплохих улучшений, не вошедших в mainline. Сопровождается разработчиком ядра. Предоставляет порты улучшений для новых версий ядра, если они не были выпущены официально. Наиболее важные нововведения — UKSM.

  https://pfkernel.natalenko.name || Пакеты:
  - Репозиторий, linux-pfAUR от разработчика pf-kernel, post-factum.

- Realtime kernel — поддерживается небольшой группой разработчиков, возглавляемой Ingo Molnar. Патч позволяет применять kernel preemption практически ко всему ядру за исключением небольших участков кода ("raw_spinlock critical regions"). Этого удалось добиться за счёт замены большинства спинлоков ядра на мьютексы с поддержкой наследования приоритета, а также перемещением всех прерываний (в том числе и программных) в потоки ядра.

  https://wiki.linuxfoundation.org/realtime/start || linux-rt, linux-rt-lts

- Tkg — ядро с набором патчей для планировщиков PDS и Project C / BMQ. Стандартный планировщик CFS также доступен. Изменения нацелены на улучшение баланса интерактивность/производительность в играх. Автор и сопроводитель — Etienne Juvigny (Tk-Glitch).

  https://github.com/Frogging-Family/linux-tkg || not packaged? search in AUR

- VFIO — патч ядра от Alex Williamson с поддержкой PCI Passthrough для KVM на некоторых машинах.

  https://lwn.net/Articles/499240/ || linux-vfioAUR, linux-vfio-ltsAUR

- XanMod — улучшение производительности ядер рабочих станций, игровых компьютеров, медиацентров и других систем. Включает планировщик MuQSS, планировщик ввода-вывода BFQ, алгоритм дедупликации памяти в реальном времени UKSM, алгоритм управления перегрузками TCP BBR, расширенный набор команд для архитектуры x86_64 и другие изменения.

  https://xanmod.org/ || linux-xanmodAUR

## Решение проблем

### Паника ядра

Паника ядра (kernel panic) возникает, когда ядро Linux попадает в состояние невосстановимого сбоя. Это состояние обычно возникает из-за ошибок в драйверах оборудования, в результате чего система попадает в deadlock, не реагирует на запросы и требует перезагрузки. Непосредственно перед deadlock генерируется диагностическое сообщение, состоящее из: состояния компьютера, когда произошел сбой, трассировки (call trace), ведущей к функции ядра, распознавшей сбой, и списка загруженных в данный момент модулей. К счастью, паники ядра случаются нечасто при использовании основных версий ядра — таких, которые поставляются из официальных репозиториев — но когда они случаются, необходимо знать, как с ними бороться.

Примечание: Паники ядра иногда называются oops или kernel oops. Хотя и то, и другое возникает в результате сбоя, oops является более общим явлением, поскольку не обязательно приводит к deadlock — иногда ядро может восстановиться после oops, убив проблемную задачу и продолжив работу.
Совет: Передайте параметр ядра `oops=panic` при загрузке или запишите `1` в `/proc/sys/kernel/panic_on_oops`, чтобы заставить восстановимый oops выдавать панику. Это рекомендуется сделать, если вас волнует небольшая вероятность получения нестабильной системы после восстановления из oops, что может затруднить диагностику будущих ошибок.

#### Изучение сообщения паники

Если паника ядра происходит очень рано в процессе загрузки, вы можете увидеть в консоли сообщение "Kernel panic - not syncing:", но после запуска systemd сообщения ядра обычно перехватываются и записываются в системный журнал. Однако, когда возникает паника, диагностическое сообщение, выдаваемое ядром, почти никогда не записывается в файл журнала на диске, потому что компьютер попадает в deadlock до того, как `system-journald` получит шанс записать журнал. Поэтому единственный способ просмотреть сообщение о панике — это просмотреть его на консоли в момент возникновения (не прибегая к установке kdump crashkernel). Вы можете сделать это, загрузившись со следующими параметрами ядра и попытавшись воспроизвести панику на tty1:

    systemd.journald.forward_to_console=1 console=tty1

Совет: Если сообщение о панике прокручивается слишком быстро, попробуйте передать параметр ядра `pause_on_oops=секунды` при загрузке.

##### Пример сценария: плохой модуль

Можно сделать предположение о том, какая подсистема или модуль вызывает панику, используя информацию в диагностическом сообщении. В этом сценарии мы имеем панику на некотором воображаемом компьютере во время загрузки. Обратите внимание на строки, выделенные жирным:

    kernel: BUG: unable to handle kernel NULL pointer dereference at (null) [1]
    kernel: IP: fw_core_init+0x18/0x1000 [firewire_core] [2]
    kernel: PGD 718d00067
    kernel: P4D 718d00067
    kernel: PUD 7b3611067
    kernel: PMD 0
    kernel:
    kernel: Oops: 0002 [#1] PREEMPT SMP
    kernel: Modules linked in: firewire_core(+) crc_itu_t cfg80211 rfkill ipt_REJECT nf_reject_ipv4 nf_log_ipv4 nf_log_common xt_LOG nf_conntrack_ipv4 ... [3]
    kernel: CPU: 6 PID: 1438 Comm: modprobe Tainted: P           O    4.13.3-1-ARCH #1
    kernel: Hardware name: Gigabyte Technology Co., Ltd. H97-D3H/H97-D3H-CF, BIOS F5 06/26/2014
    kernel: task: ffff9c667abd9e00 task.stack: ffffb53b8db34000
    kernel: RIP: 0010:fw_core_init+0x18/0x1000 [firewire_core]
    kernel: RSP: 0018:ffffb53b8db37c68 EFLAGS: 00010246
    kernel: RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
    kernel: RDX: 0000000000000000 RSI: 0000000000000008 RDI: ffffffffc16d3af4
    kernel: RBP: ffffb53b8db37c70 R08: 0000000000000000 R09: ffffffffae113e95
    kernel: R10: ffffe93edfdb9680 R11: 0000000000000000 R12: ffffffffc16d9000
    kernel: R13: ffff9c6729bf8f60 R14: ffffffffc16d5710 R15: ffff9c6736e55840
    kernel: FS:  00007f301fc80b80(0000) GS:ffff9c675dd80000(0000) knlGS:0000000000000000
    kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    kernel: CR2: 0000000000000000 CR3: 00000007c6456000 CR4: 00000000001406e0
    kernel: Call Trace:
    kernel:  do_one_initcall+0x50/0x190 [4]
    kernel:  ? do_init_module+0x27/0x1f2
    kernel:  do_init_module+0x5f/0x1f2
    kernel:  load_module+0x23f3/0x2be0
    kernel:  SYSC_init_module+0x16b/0x1a0
    kernel:  ? SYSC_init_module+0x16b/0x1a0
    kernel:  SyS_init_module+0xe/0x10
    kernel:  entry_SYSCALL_64_fastpath+0x1a/0xa5
    kernel: RIP: 0033:0x7f301f3a2a0a
    kernel: RSP: 002b:00007ffcabbd1998 EFLAGS: 00000246 ORIG_RAX: 00000000000000af
    kernel: RAX: ffffffffffffffda RBX: 0000000000c85a48 RCX: 00007f301f3a2a0a
    kernel: RDX: 000000000041aada RSI: 000000000001a738 RDI: 00007f301e7eb010
    kernel: RBP: 0000000000c8a520 R08: 0000000000000001 R09: 0000000000000085
    kernel: R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000c79208
    kernel: R13: 0000000000c8b4d8 R14: 00007f301e7fffff R15: 0000000000000030
    kernel: Code: <c7> 04 25 00 00 00 00 01 00 00 00 bb f4 ff ff ff e8 73 43 9c ec 48
    kernel: RIP: fw_core_init+0x18/0x1000 [firewire_core] RSP: ffffb53b8db37c68
    kernel: CR2: 0000000000000000
    kernel: ---[ end trace 71f4306ea1238f17 ]---
    kernel: Kernel panic - not syncing: Fatal exception [5]
    kernel: Kernel Offset: 0x80000000 from 0xffffffff810000000 (relocation range: 0xffffffff800000000-0xfffffffffbffffffff
    kernel: ---[ end Kernel panic - not syncing: Fatal exception

- [1] Указывает тип ошибки, вызвавшей панику. В данном случае это была ошибка программиста.
- [2] Указывает, что паника произошла в функции под названием fw_core_init в модуле firewire_core.
- [3] Указывает, что firewire_core был последним загруженным модулем.
- [4] Указывает, что функция, вызвавшая функцию fw_core_init, была do_one_initcall.
- [5] Указывает на то, что это сообщение oops на самом деле является паникой ядра, и система ушла в deadlock.

Мы можем предположить, что паника произошла во время инициализации модуля firewire_core при его загрузке. (Тогда можно предположить, что аппаратное обеспечение компьютера несовместимо с данной версией модуля драйвера firewire из-за ошибки программиста, и придётся ждать новой версии). Тем временем, самый простой способ заставить компьютер снова работать — это предотвратить загрузку проблемного модуля. Это можно сделать одним из двух способов:

- Если модуль загружается в процессе работы initramfs, перезагрузитесь с параметром ядра `rd.blacklist=firewire_core`.
- Иначе перезагрузитесь с параметром ядра `module_blacklist=firewire_core`.

### Отладка регрессий

См. General troubleshooting#Debugging regressions.

Прежде всего проверьте ядро linux-mainlineAUR на предмет того, не была ли проблема уже решена. В прикреплённом комментарии указан репозиторий с уже собранными ядрами, так что собирать ядро вручную не придётся.

Если проблема проявляется не слишком часто, то имеет смысл попробовать LTS-ядро (linux-lts). Старые версии LTS-ядер можно найти в архиве Arch Linux.

Если избавиться от проблемы не удалось, попробуйте локализовать баг в linux-gitAUR, после чего сообщите о нём в баг-трекер ядра. Важно проверять ванильное непропатченное ядро, чтобы убедиться, что причиной ошибки является не патч. Если проблемы вызывает патч, то сообщите об этом его автору.

Примечание: Локализация местонахождения бага в коде может занять много времени, поскольку придётся многократно пересобирать ядро.

## Смотрите также

- O'Reilly — Linux Kernel in a Nutshell — электронная книга "Ядро Linux в двух словах".
- Какую из stable-версий ядра лучше использовать? от Greg Kroah-Hartman.
- Документация ядра Linux

Categories:

- Kernel (Русский)
- Lists of software (Русский)

Hidden categories:

- Pages with broken package links
- Pages with missing package links