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

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

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

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

Я думаю

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

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

У меня также есть возможность включить службу автоматического импорта, см. https://unix.stackexchange.com/questions/338260/zfs -mounting только-один-из-моих бассейнов-на-ботинка

2
задан 17 June 2019 в 16:05

1 ответ

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

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

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

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

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

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

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

  • Установите необходимые пакеты: # apt install debhelper dkms
  • Удалите старый пакет, если он установлен: # dpkg -r bcwc-pcie
  • Создайте каталог для работы с: # mkdir /usr/src/facetimehd-0.1
  • Перейдите в каталог git repo: $ cd bcwc_pcie
  • Скопируйте файлы в: # cp -r * /usr/src/facetimehd-0.1/
  • Перейдите в этот каталог: # cd /usr/src/facetimehd-0.1/
  • Удалите все предыдущие копии и резервные копии: # 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 Community Doc :

$ 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.

и Страница man :

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 

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


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

https://github.com/zfsonlinux/zfs/releases/download/zfs-0.8.1/zfs-0.8.1.tar.gz

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


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

2
ответ дан 17 June 2019 в 16:05

Другие вопросы по тегам:

Похожие вопросы: