Qual é o procedimento completo para atualizar um módulo do kernel atualmente em uso?

Qual é o procedimento completo para atualizar um módulo do kernel atualmente em uso?

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

  1. atualizando o kernel e as fontes do kernel
  2. baixando a fonte do módulo e compilando o módulo
  3. 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 é: umounttodos os sistemas de arquivos) rmmod zfs, ter o novo módulo disponível e modprobe zfscarregá-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.

  1. # # Stop using the module
  2. # rmmod zfs
  3. # 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 aptatualizar 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_pcieou facetimehdmó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.confse o nome do módulo facetimehde o número da versão 0.1estão corretos e atualizar dkms.confou ajustar as instruções onde -me -vsã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_pcieexemplo é 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.confoDocumento 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.

epágina de manual:

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 gitou baixar e extrair a latestfonte. 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 systemda desativação de serviços. Configurar sua própria dkmsconfiguração do ZFS resolve esse problema? Você tem pacotes instalados que dependem do zfs-dkmspacote real que causaria conflito? No mínimo, você poderia conectar-se POST_INSTALLe executar systemctl enablepara 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-dkmsestá disponível emuniverso. Você pode examinar os detalhes deste pacote e ver se ele já disponível zfs-dkmsfunciona para você.

informação relacionada