У меня есть сервер 18.04 с пользовательскими модулями ядра ZFS (0.8.x вместо предоставленных 0.7.x).
Периодически при обновлении ядра мне приходится перекомпилировать модуль ядра ZFS, который в противном случае автоматически отключался бы.
В прошлый раз мне пришлось немного повозиться, чтобы это сделать, поэтому на этот раз я хотел бы заранее знать правильные шаги.
Я думаю
- обновление ядра и исходных кодов ядра
- загрузка исходного кода модуля и компиляция модуля
- удаление предыдущих пакетов kmod и установка новых
Однако, поскольку модуль ядра необходим для доступа к некоторым файловым системам, которые в данный момент смонтированы, какой следующий шаг? Просто перезагрузить, чтобы смонтировать новый модуль?
Мне также в какой-то момент пришлось включить службу автоматического импорта, см.https://unix.stackexchange.com/questions/338260/zfs-mounting-only-one-of-my-pools-on-boot
решение1
Если вы обновляете модуль для текущего работающего ядра, вам нужно прекратить использование модуля (т. е. umount
всех файловых систем), rmmod zfs
сделать новый модуль доступным и modprobe zfs
загрузить его снова. Перезагрузка обычно проще, но вы можете найти пример в другом месте, чтобы помочь сделать это во время работы системы, если это необходимо.
# # Stop using the module
# rmmod zfs
# 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
подойдет ли вам уже имеющийся.