現在使用中のカーネル モジュールを更新するための完全な手順は何ですか?

現在使用中のカーネル モジュールを更新するための完全な手順は何ですか?

カスタム ZFS カーネル モジュール (0.8.x 対提供の 0.7.x) を搭載したサーバー 18.04 があります。

定期的にカーネルを更新するときは、ZFS カーネル モジュールを再コンパイルする必要があります。そうしないと、自動的に無効になります。

前回は、完了するまでにしばらく手間取ったので、今回は正しい手順を事前に知っておきたいと思っています。

私は思う

  1. カーネルとカーネルソースの更新
  2. モジュールソースをダウンロードしてコンパイルする
  3. 以前の kmod パッケージを削除し、新しいものをインストールする

ただし、カーネル モジュールは現在マウントされているいくつかのファイル システムにアクセスする必要があるため、次の手順は何でしょうか。新しいモジュールをマウントするには、単に再起動すればよいのでしょうか。

また、ある時点で自動インポートサービスを有効にするには、https://unix.stackexchange.com/questions/338260/zfs-mounting-only-one-of-my-pools-on-boot

答え1

現在実行中のカーネルのモジュールを更新する場合は、モジュール (つまり、umountすべてのファイルシステム) の使用を中止し、rmmod zfs新しいモジュールを使用可能にして、modprobe zfs再度ロードする必要があります。通常は再起動する方が簡単ですが、必要に応じて、システムの実行中にこれを実行するのに役立つ例が他の場所にある場合もあります。

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

カーネルを更新するたびにモジュールのアップデートを自動的にコンパイルしてインストールしたい場合は、DKMS素晴らしいDKMS パッケージング ガイドこれについて詳しく説明します。

アイデアとしては、カーネルのアップデートごとに適用したいモジュール、またはカーネルへの何らかの変更があるというものです。カーネルがアップデートされるときに、モジュールのコンパイルとインストールを自動化できますapt。VirtualBoxでも良い例が見つかります。NVIDIA DKMS ドライバー

これを設定する方法を示すもう一つの良い例はpatjak の bcwc_pciebcwc_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.confDKMS コミュニティ ドキュメント:

$ 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 は実際にはシェル スクリプトにソース化されているため、必要に応じてかなりのトリックを実行できます。これらのオプションなどについては、man dkms の dkms.conf セクションで説明されています。

そしてマニュアルページ:

PRE_BUILD= ビルドを実行する前に実行するスクリプトの名前。パスはソースのルート ディレクトリからの相対パスで指定する必要があります。

ダウンロードして抽出するスクリプトを格納するディレクトリを作成できます。ZFSの最新バージョンビルドの準備として、このプロセスを自動化するのに役立ちます。ソースを使用するgitか、ダウンロードして抽出することができますlatest。ZFS の最新のダウンロード URL を確認する方法の例を次に示します。

$ 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。独自の ZFSdkmsセットアップを行えば、この問題は解決しますか? 競合の原因となる実際のzfs-dkmsパッケージに依存するパッケージがインストールされていませんか? 少なくとも、無効になっているサービスにフックしてPOST_INSTALL実行するsystemctl enableことで、有効にすることができます。


そうは言っても、ZFSは非常に人気のあるファイルシステムであり、DKMSパッケージはすでに利用可能であるはずです。これは事実のようです。zfs-dkmsは、宇宙このパッケージの詳細を調べて、すでに利用可能なこのパッケージがzfs-dkms自分に適しているかどうかを確認できます。

関連情報