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=panic при загрузке или запишите 1 в /proc/sys/kernel/panic_on_oops, чтобы заставить восстановимый oops выдавать панику. Это рекомендуется сделать, если вас волнует небольшая вероятность получения нестабильной системы после восстановления из 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.

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

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

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

      gollark: Which firecubez has, yes.
      gollark: Okay, "quite fast" may be an overstatement.
      gollark: This is far more readable than foolish "shell scripts", and actually quite fast.
      gollark: It's HIGHLY advanced.
      gollark: If you want, I can make it compile in parallel, but I haven't done this.
      This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.