Какова полная процедура обновления используемого в данный момент модуля ядра?

Какова полная процедура обновления используемого в данный момент модуля ядра?

У меня есть сервер 18.04 с пользовательскими модулями ядра ZFS (0.8.x вместо предоставленных 0.7.x).

Периодически при обновлении ядра мне приходится перекомпилировать модуль ядра ZFS, который в противном случае автоматически отключался бы.

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

Я думаю

  1. обновление ядра и исходных кодов ядра
  2. загрузка исходного кода модуля и компиляция модуля
  3. удаление предыдущих пакетов kmod и установка новых

Однако, поскольку модуль ядра необходим для доступа к некоторым файловым системам, которые в данный момент смонтированы, какой следующий шаг? Просто перезагрузить, чтобы смонтировать новый модуль?

Мне также в какой-то момент пришлось включить службу автоматического импорта, см.https://unix.stackexchange.com/questions/338260/zfs-mounting-only-one-of-my-pools-on-boot

решение1

Если вы обновляете модуль для текущего работающего ядра, вам нужно прекратить использование модуля (т. е. umountвсех файловых систем), rmmod zfsсделать новый модуль доступным и modprobe zfsзагрузить его снова. Перезагрузка обычно проще, но вы можете найти пример в другом месте, чтобы помочь сделать это во время работы системы, если это необходимо.

  1. # # Stop using the module
  2. # rmmod zfs
  3. # modprobe zfs

Если вы хотите автоматически компилировать и устанавливать обновления для модуля каждый раз при обновлении ядра, вам может быть интересноДКМС. Есть большойРуководство по упаковке DKMSгде это подробно обсуждается.

Идея в том, что у вас есть модуль или какое-то изменение в ядре, которое вы хотите применить с каждым обновлением ядра. Вы можете автоматизировать компиляцию и установку модулей при обновлениях aptиспользуемого ядра. Вы можете найти хорошие примеры этого с VirtualBox, а также с некоторымиДрайверы NVIDIA DKMS.

Еще один хороший пример, показывающий, как это настроить:bcwc_pcie patjak. Процедура, чтобы иметь bcwc_pcie, илиfacetimehd сделать модуль доступным для новых ядер, такова:задокументировано:

Настройка DKMS (автоматическая компиляция при обновлении ядра)

Это предполагает, что вы уже выполнили шаги пакета Debian/Ubuntu deb. Вам нужно будет проверить правильность dkms.confимени модуля facetimehdи номера версии 0.1и либо обновить, dkms.confлибо скорректировать инструкции, где используются -mи .-v

  • Установите необходимые пакеты:# apt install debhelper dkms
  • Удалить старый пакет, если он установлен:# dpkg -r bcwc-pcie
  • Создайте каталог для работы:# mkdir /usr/src/facetimehd-0.1
  • Перейдите в каталог репозитория git:$ cd bcwc_pcie
  • Скопировать файлы:# cp -r * /usr/src/facetimehd-0.1/
  • Перейдите в этот каталог:# cd /usr/src/facetimehd-0.1/
  • Удалите все предыдущие deb-файлы и резервные копии:# rm backup-*tgz bcwc-pcie_*deb
  • Очистить предыдущую компиляцию:# make clean
  • Зарегистрируйте новый модуль в DKMS:# dkms add -m facetimehd -v 0.1
  • Соберите модуль:# dkms build -m facetimehd -v 0.1
  • Соберите исходный пакет Debian:# dkms mkdsc -m facetimehd -v 0.1 --source-only
  • Соберите двоичный пакет Debian:# dkms mkdeb -m facetimehd -v 0.1 --source-only
  • Скопируйте deb локально:# cp /var/lib/dkms/facetimehd/0.1/deb/facetimehd-dkms_0.1_all.deb /root/
  • Избавьтесь от локальных файлов сборки:# rm -r /var/lib/dkms/facetimehd/
  • Установите новый deb-пакет:# dpkg -i /root/facetimehd-dkms_0.1_all.deb

Если у вас возникли какие-либо проблемы, прочтите это руководство по созданию пакета DKMS: http://www.xkyle.com/building-linux-packages-for-kernel-drivers/


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

Мы можем посмотреть на dkms.confнаДокумент сообщества DKMS:

$ cat dkms.conf 
MAKE="make -C src/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C src/ clean"
BUILT_MODULE_NAME=awesome
BUILT_MODULE_LOCATION=src/
PACKAGE_NAME=awesome
PACKAGE_VERSION=1.1
REMAKE_INITRD=yes

Вы также можете добавлять опции для вызова скриптов до или после сборки или установки, предоставлять дополнительные (условные) команды make, команды patch и т. д. Фактически, dkms.conf исходит из скрипта оболочки, поэтому при необходимости можно проделать немало трюков. Эти и другие опции описаны в разделе dkms.conf в man dkms.

истраница руководства:

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

Вы можете создать каталог, содержащий скрипт, который загружает и извлекаетпоследняя версия ZFSв подготовке к сборке. Это поможет автоматизировать процесс. Вы можете использовать gitили загрузить и извлечь latestисходный код. Вот пример того, как определить последний URL загрузки для ZFS:

$ curl -s https://api.github.com/repos/zfsonlinux/zfs/releases/latest | jq '.assets[].browser_download_url' | tr -d '"' | grep -E 'tar.gz$'
https://github.com/zfsonlinux/zfs/releases/download/zfs-0.8.1/zfs-0.8.1.tar.gz

Вы упоминаете о сложностях с systemdотключением служб. Решает ли эту проблему настройка вашей собственной dkmsнастройки ZFS? Установлены ли у вас пакеты, которые полагаются на фактический zfs-dkmsпакет, что может привести к конфликту? По крайней мере, вы можете подключиться POST_INSTALLи запустить, systemctl enableчтобы включить любые отключенные службы.


При этом ZFS — довольно популярная файловая система, и пакет DKMS должен быть уже доступен. Похоже, что это правда, и чтоzfs-dkmsдоступно ввселенная. Вы можете изучить особенности этого пакета и решить, zfs-dkmsподойдет ли вам уже имеющийся.

Связанный контент