Kernel (Русский)

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

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

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

Ядро Linuxядро операционной системы, соответствующее стандартам POSIX, составляющее основу операционных систем семейства 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

    Компиляция

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

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

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

    Ядра 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

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

    • GalliumOS ядро Linux с патчами GalliumOS для Хромбуков.
    https://github.com/GalliumOS/linux || linux-galliumosAUR
    • Liquorix ядро, собранное из исходного кода Zen с настройками для Debian. Разработан для настольных, мультимедийных и игровых систем, часто используется в качестве замены основному ядру Debian. Создатель патча Liquorix, Damentz, также является разработчиком набора патчей Zen.
    https://liquorix.net || linux-lqxAUR

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

      Паника ядра

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

      Примечание: Паники ядра иногда называются oops или kernel oops. Хотя и то, и другое возникает в результате сбоя, oops является более общим явлением, поскольку не обязательно приводит к deadlock — иногда ядро может восстановиться после oops, убив проблемную задачу и продолжив работу.

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

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

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

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

      '''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, перезагрузитесь с параметром ядра .
      • Иначе перезагрузитесь с параметром ядра .

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

      См. General troubleshooting#Debugging regressions.

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

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

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

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

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

      This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.