Работа с ядром

Понятие ядра Linux

  • Ядро системы обеспечивает взаимодействие с аппаратными компонентами устройства

  • Для этого взаимодействия ядру нужны драйвера (модули в терминологии Linux)

  • У ядра есть различные способы обращения к этим драйверам:

    • initramfs (initial ram drive) - загружается вместе с системой, в него собираются драйверы перед установкой в систему

    • systemd-udevd - используется для взаимодействия с аппаратными компонентами, подключаемыми напрямую (например, USB Flash Drive), подгружая на лету драйвера устройства

    • modprobe - ручная загрузка драйвера

  • К ядру обращение происходит из шелла в пользовательском пространстве через syscall

Модули ядра

  • Модули ядра есть драйверы для взаимодействия с устройством

  • Большая часть модулей загружается с initramfs или systemd-udevd

  • modprobe используется для ручной загрузки модулей

    • modprobe -r - для выгрузки модулей

  • lsmod используется для отображения списка модулей

[root@centos8 ~]# lsmod
Module                  Size  Used by
binfmt_misc            20480  1
veth                   28672  0
nft_masq_ipv4          16384  1
nft_masq_ipv6          16384  1
nft_masq               16384  2 nft_masq_ipv6,nft_masq_ipv4
nf_conntrack_netlink    49152  0
xt_addrtype            16384  1
br_netfilter           24576  0
overlay               126976  0
fuse                  131072  3
rfcomm                 86016  6
xt_CHECKSUM            16384  1
ipt_MASQUERADE         16384  1
xt_conntrack           16384  1
ipt_REJECT             16384  1
nft_counter            16384  31
nf_nat_tftp            16384  0
nft_objref             16384  1
nf_conntrack_tftp      16384  3 nf_nat_tftp

Modprobe

  • Является наследником классической утилиты insmolt

    • insmolt не учитывал зависимости модулей, в отличии от modprobe

  • modinfo отображает параметры модуля

[root@centos8 ~]# modeinfo nvme
bash: modeinfo: command not found...
[root@centos8 ~]# modinfo nvme
filename:       /lib/modules/4.18.0-151.el8.x86_64/kernel/drivers/nvme/host/nvme.ko.xz
version:        1.0
license:        GPL
author:         Matthew Wilcox <willy@linux.intel.com>
rhelversion:    8.2
<....>
depends:        nvme-core
intree:         Y
name:           nvme
vermagic:       4.18.0-151.el8.x86_64 SMP mod_unload modversions 
sig_id:         PKCS#7
signer:         CentOS Linux kernel signing key
sig_key:        70:97:5E:C5:DC:19:13:9B:78:9D:5D:F8:75:EA:BB:44:25:A3:1F:93
sig_hashalgo:   sha256
<....>
parm:           use_threaded_interrupts:int
parm:           use_cmb_sqes:use controller's memory buffer for I/O SQes (bool)
parm:           max_host_mem_size_mb:Maximum Host Memory Buffer (HMB) size per controller (in MiB) (uint)
parm:           sgl_threshold:Use SGLs when average request segment size is larger or equal to this size. Use 0 to disable SGLs. (uint)
parm:           io_queue_depth:set io queue depth, should >= 2
parm:           write_queues:Number of queues to use for writes. If not set, reads and writes will share a queue set. (int)
parm:           poll_queues:Number of queues to use for polled IO. (int)
  • Для изменения конфигурации модулей используется /etc/modprobe.conf или файлы в /etc/modprobe.d

[root@centos8 ~]# ls -l /etc/modprobe.d/
total 32
-rw-r--r--. 1 root root  158 Nov  8 19:48 firewalld-sysctls.conf
-rw-r--r--. 1 root root  358 Feb  5 00:41 kvm.conf
-rw-r--r--. 1 root root  747 Nov  8 23:56 lockd.conf
-rw-r--r--. 1 root root 1004 Jun  3  2019 mlx4.conf
-rw-r--r--. 1 root root  101 May 11  2019 nvdimm-security.conf
-rw-r--r--. 1 root root   92 Nov 21 20:47 truescale.conf
-rw-r--r--. 1 root root  674 Jun 27  2019 tuned.conf
-rw-r--r--. 1 root root  111 Feb  5 00:41 vhost.conf

Использование proc

  • /proc является файловой системой, которая предоставляет доступ к информации в ядре

    • PID директории (информация о процессах)

    • Статусы файлов (состояния системы)

    • Настройки в /proc/sys

  • Через echo можно записать параметр в любой файл в /proc/sys для изменения настроек ядра

  • Для изменения настроек с сохранением после перезагрузки необходимо править /etc/sysctl.conf (последний способ - не рекомендуется)

    • sysctl -a покажет все текущие настройки

[root@centos8 ~]# sysctl -a | grep forward
net.ipv4.conf.all.bc_forwarding = 0
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.default.bc_forwarding = 0
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.conf.docker0.bc_forwarding = 0
net.ipv4.conf.docker0.forwarding = 1
net.ipv4.conf.docker0.mc_forwarding = 0
net.ipv4.conf.ens160.bc_forwarding = 0
net.ipv4.conf.ens160.forwarding = 1
net.ipv4.conf.ens160.mc_forwarding = 0
net.ipv4.conf.lo.bc_forwarding = 0
net.ipv4.conf.lo.forwarding = 1

Обновление ядра

  • Фактически обновление ядра проходит заменой старого на новое, инкрементальное обновление не допускается

  • Это же позволяет загрузить прежнее ядро в случае отказа нового

  • yum update kernel используется для обновления ядра

    • yum install kernel как альтернативный вариант

Last updated