Eu tenho um servidor 18.04 com módulos de kernel ZFS personalizados (0.8.x vs 0.7.x fornecido).
Periodicamente, quando atualizo o kernel, preciso recompilar o módulo do kernel ZFS, que de outra forma seria desativado automaticamente.
Da última vez, tive que mexer um pouco para fazer isso, então desta vez gostaria de saber com antecedência as etapas corretas envolvidas.
Eu penso
- atualizando o kernel e as fontes do kernel
- baixando a fonte do módulo e compilando o módulo
- removendo pacotes kmod anteriores e instalando os novos
Entretanto, como o módulo do kernel é necessário para acessar alguns sistemas de arquivos que estão atualmente montados, qual é o próximo passo? simplesmente reinicialize para montar o novo módulo?
Também tenho que, em algum momento, ativar o serviço de importação automática, consultehttps://unix.stackexchange.com/questions/338260/zfs-mounting-only-one-of-my-pools-on-boot
Responder1
Se você atualizar um módulo para o kernel atualmente em execução, você precisará descontinuar o uso do módulo (isto é: umount
todos os sistemas de arquivos) rmmod zfs
, ter o novo módulo disponível e modprobe zfs
carregá-lo novamente. A reinicialização geralmente é mais fácil, mas você pode encontrar exemplos em outro lugar para ajudar a fazer isso enquanto o sistema está em execução, se desejar.
# # Stop using the module
# rmmod zfs
# modprobe zfs
Se você deseja compilar e instalar automaticamente atualizações para um módulo cada vez que atualizar seu kernel, você pode estar interessado emDKMS. Há um grandeGuia de embalagem DKMSque discute isso em detalhes.
A ideia é que você tenha um módulo, ou alguma alteração no kernel que deseja aplicar a cada atualização do kernel. Você pode automatizar a compilação e instalação dos módulos ao apt
atualizar o kernel utilizado. Você pode encontrar bons exemplos disso no VirtualBox e também em algunsDrivers NVIDIA DKMS.
Outro bom exemplo que mostra como configurar isso ébcwc_pcie de patjak. O procedimento para ter um módulo bcwc_pcie
ou facetimehd
módulo compilado e disponibilizado para novos kernels édocumentado:
Configurando o DKMS (compilação automática na atualização do kernel)
Isso pressupõe que você já seguiu as etapas do pacote deb Debian/Ubuntu. Você precisará verificar dkms.conf
se o nome do módulo facetimehd
e o número da versão 0.1
estão corretos e atualizar dkms.conf
ou ajustar as instruções onde -m
e -v
são usados.
- Instale os pacotes necessários:
# apt install debhelper dkms
- Remova o pacote antigo, se instalado:
# dpkg -r bcwc-pcie
- Crie um diretório para trabalhar:
# mkdir /usr/src/facetimehd-0.1
- Mude para o diretório do repositório git:
$ cd bcwc_pcie
- Copie os arquivos:
# cp -r * /usr/src/facetimehd-0.1/
- Mude para esse diretório:
# cd /usr/src/facetimehd-0.1/
- Remova quaisquer debs e backups anteriores:
# rm backup-*tgz bcwc-pcie_*deb
- Limpe a compilação anterior:
# make clean
- Registre o novo módulo no DKMS:
# dkms add -m facetimehd -v 0.1
- Construa o módulo:
# dkms build -m facetimehd -v 0.1
- Construa um pacote fonte Debian:
# dkms mkdsc -m facetimehd -v 0.1 --source-only
- Construa um pacote binário 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/
- Livre-se dos arquivos de compilação locais:
# rm -r /var/lib/dkms/facetimehd/
- Instale o novo pacote deb:
# dpkg -i /root/facetimehd-dkms_0.1_all.deb
Se você tiver algum problema, leia este guia sobre como criar um pacote DKMS: http://www.xkyle.com/building-linux-packages-for-kernel-drivers/
A única parte que falta neste bcwc_pcie
exemplo é que esta base de código não é atualizada, enquanto o código do módulo que você está compilando pode mudar com o tempo. Isso pode ser feito mais facilmente se você encontrar ummais recentedownload, versus versões específicas da fonte que você está tentando compilar.
Podemos olhar para dkms.conf
oDocumento da comunidade 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
Você também pode adicionar opções para chamar scripts antes ou depois da construção ou instalação, fornecer comandos make adicionais (condicionais), comandos de patch, etc. O dkms.conf é de fato originado em um script de shell, portanto, uma boa quantidade de truques pode ser feita se necessário. Essas opções e muito mais estão descritas na seção dkms.conf em man dkms.
PRE_BUILD= O nome do script a ser executado antes de uma construção ser executada. O caminho deve ser fornecido em relação ao diretório raiz da sua fonte.
Você pode criar um diretório para conter um script que baixe e extraia oversão mais recente do ZFSem preparação para a construção. Isso ajudará a automatizar o processo. Você pode usar git
ou baixar e extrair a latest
fonte. Aqui está um exemplo de como determinar o URL de download mais recente 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
Você menciona uma complicação com systemd
a desativação de serviços. Configurar sua própria dkms
configuração do ZFS resolve esse problema? Você tem pacotes instalados que dependem do zfs-dkms
pacote real que causaria conflito? No mínimo, você poderia conectar-se POST_INSTALL
e executar systemctl enable
para ativar quaisquer serviços que estejam sendo desativados.
Dito isto, o ZFS é um sistema de arquivos bastante popular e já deve ter um pacote DKMS disponível. Parece que isso é verdade, e quezfs-dkms
está disponível emuniverso. Você pode examinar os detalhes deste pacote e ver se ele já disponível zfs-dkms
funciona para você.