Tengo un servidor 18.04 con módulos de kernel ZFS personalizados (0.8.x frente a 0.7.x proporcionado).
Periódicamente, cuando actualizo el kernel, tengo que recompilar el módulo del kernel ZFS, que de otro modo se desactivaría automáticamente.
La última vez tuve que trastear un poco para hacerlo, así que esta vez me gustaría saber de antemano los pasos correctos a seguir.
Creo
- actualizando el kernel y las fuentes del kernel
- descargar la fuente del módulo y compilar el módulo
- eliminando paquetes kmod anteriores e instalando los nuevos
Sin embargo, dado que se requiere el módulo del kernel para acceder a algunos sistemas de archivos que están actualmente montados, ¿cuál es el siguiente paso? ¿Simplemente reiniciar para montar el nuevo módulo?
También tengo que, en algún momento, habilitar el servicio de importación automática, verhttps://unix.stackexchange.com/questions/338260/zfs-mounting-only-one-of-my-pools-on-boot
Respuesta1
Si actualiza un módulo para el kernel que se está ejecutando actualmente, debe dejar de usar el módulo (es decir, umount
todos los sistemas de archivos), rmmod zfs
tener el nuevo módulo disponible y modprobe zfs
cargarlo nuevamente. Reiniciar suele ser más fácil, pero puede encontrar ejemplos en otros lugares que le ayudarán a lograrlo mientras el sistema está en ejecución, si lo desea.
# # Stop using the module
# rmmod zfs
# modprobe zfs
Si desea compilar e instalar automáticamente actualizaciones para un módulo cada vez que actualiza su kernel, puede que le intereseDKMS. Hay un granGuía de embalaje DKMSque analiza esto en detalle.
La idea es que tenga un módulo o algún cambio en el kernel que desee aplicar con cada actualización del kernel. Puede automatizar la compilación e instalación de los módulos cuando apt
se actualiza el kernel utilizado. Puedes encontrar buenos ejemplos de esto con VirtualBox y también con algunosControladores NVIDIA DKMS.
Otro buen ejemplo que muestra cómo configurar esto esbcwc_pcie de patjak. El procedimiento para compilar un módulo bcwc_pcie
o facetimehd
módulo y ponerlo a disposición de nuevos núcleos esdocumentado:
Configuración de DKMS (compilación automática al actualizar el kernel)
Esto supone que ya ha seguido los pasos del paquete deb de Debian/Ubuntu. Deberá verificar dkms.conf
que el nombre del módulo facetimehd
y el número de versión 0.1
sean correctos y actualizar dkms.conf
o ajustar las instrucciones donde se utilizan -m
y .-v
- Instale los paquetes necesarios:
# apt install debhelper dkms
- Elimine el paquete antiguo si está instalado:
# dpkg -r bcwc-pcie
- Cree un directorio para trabajar desde:
# mkdir /usr/src/facetimehd-0.1
- Cambie al directorio de repositorio de git:
$ cd bcwc_pcie
- Copiar archivos sobre:
# cp -r * /usr/src/facetimehd-0.1/
- Cambie a ese directorio:
# cd /usr/src/facetimehd-0.1/
- Elimine cualquier deuda y copia de seguridad anterior:
# rm backup-*tgz bcwc-pcie_*deb
- Borrar la compilación anterior:
# make clean
- Registre el nuevo módulo con DKMS:
# dkms add -m facetimehd -v 0.1
- Construya el módulo:
# dkms build -m facetimehd -v 0.1
- Cree un paquete fuente de Debian:
# dkms mkdsc -m facetimehd -v 0.1 --source-only
- Cree un paquete binario de Debian:
# dkms mkdeb -m facetimehd -v 0.1 --source-only
- Copie deb localmente:
# cp /var/lib/dkms/facetimehd/0.1/deb/facetimehd-dkms_0.1_all.deb /root/
- Deshágase de los archivos de compilación locales:
# rm -r /var/lib/dkms/facetimehd/
- Instale el nuevo paquete deb:
# dpkg -i /root/facetimehd-dkms_0.1_all.deb
Si tiene algún problema, lea esta guía sobre cómo crear un paquete DKMS: http://www.xkyle.com/building-linux-packages-for-kernel-drivers/
La única parte que falta en este bcwc_pcie
ejemplo es que este código base no se actualiza, mientras que el código del módulo que está compilando puede cambiar con el tiempo. Esto se puede hacer más fácilmente si puedes encontrar unel últimodescargar, frente a versiones específicas de la fuente que estás intentando compilar.
Podemos mirar el dkms.conf
en elDocumento comunitario de 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
También puede agregar opciones para llamar scripts antes o después de la compilación o instalación, proporcionar comandos make adicionales (condicionales), comandos de parche, etc. De hecho, dkms.conf se obtiene en un script de shell, por lo que se pueden realizar una buena cantidad de trucos. si necesario. Estas opciones y más se describen en la sección dkms.conf en man dkms.
PRE_BUILD= El nombre del script que se ejecutará antes de realizar una compilación. La ruta debe proporcionarse en relación con el directorio raíz de su fuente.
Puede crear un directorio que contenga un script que descargue y extraiga elúltima versión de ZFSen preparación para la construcción. Esto ayudará a automatizar el proceso. Puede usar git
o descargar y extraer la latest
fuente. A continuación se muestra un ejemplo de cómo determinar la URL de descarga más reciente para 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
Mencionas una complicación con systemd
la desactivación de los servicios. ¿Configurar su propia dkms
configuración ZFS resuelve este problema? ¿Tiene paquetes instalados que dependen del zfs-dkms
paquete real y que podrían causar conflictos? Como mínimo, puede conectarse POST_INSTALL
y ejecutar systemctl enable
para habilitar cualquier servicio que se esté deshabilitando.
Dicho esto, ZFS es un sistema de archivos bastante popular y ya debería tener un paquete DKMS disponible. Parece que esto es cierto y quezfs-dkms
está disponible enuniverso. Puede consultar los detalles de este paquete y ver si el que ya está disponible zfs-dkms
funciona para usted.