我有一個帶有自訂 ZFS 核心模組的伺服器 18.04(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。編譯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 repo 目錄:
$ 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 命令、補丁命令等。這些選項和更多選項在 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
是否適合您。