Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 內核模塊化編譯安裝文件系統:以 Fedora 8 上編譯 Minix 模塊為例

編輯:Linux 教學

場景:需要使用 Minix 文件系統,但內核未內建,且不想重新編譯整個內核

**模塊化編譯 (Out-of-tree / In-tree 模塊編譯)** 允許針對單一文件系統/驅動編譯 .ko 模塊,動態載入 — **無需重啟、無需重編內核、版本強綁定當前運行內核**。

前置條件:內核源碼與開發包對齊

# 1. 確認運行內核版本
uname -r
# 2.6.24.4-64.fc8

# 2. 安裝對應版本內核開發包 (必須精確匹配)
sudo dnf install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
# 驗證
rpm -qa | grep kernel
# kernel-devel-2.6.24.4-64.fc8
# kernel-headers-2.6.24.4-64.fc8
# kernel-2.6.24.4-64.fc8

獲取文件系統源碼

從 kernel.org 下載對應版本內核源碼 (linux-2.6.24.4.tar.xz),提取 fs/minix/ 目錄 — **僅需目標文件系統代碼,不需全樹**。

編寫模塊專用 Makefile (核心技巧)

# fs/minix/Makefile
# 1. 聲明為模塊編譯
obj-m += minix.o

# 2. 多文件模塊組成 (對應源碼中的文件)
minix-objs := bitmap.o itree_v1.o itree_v2.o namei.o inode.o file.o dir.o

# 3. 內核構建樹路徑 (自動獲取當前運行內核)
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

# 4. 默認目標:進入內核樹以模塊模式構建當前目錄
default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

# 5. 清理
clean:
	rm -rf *.o *.mod.c *.ko *.symvers *.order

關鍵語法解析

  • obj-m:告訴 kbuild 這是**可加載模塊** (生成 .ko),而非內建 (obj-y)。
  • minix-objs:模塊名 + -objs 後綴,列出組成模塊的目標文件 — **多源文件模塊必須**。
  • $(MAKE) -C $(KERNELDIR) M=$(PWD) modules:
    — -C 切換到內核構建樹 (含 scripts/、Module.symvers 等)
    — M=$(PWD) 指定外部模塊源碼路徑
    — modules 目標僅構建模塊
  • 縮進必須用 Tab,不能用空格 — Makefile 語法鐵律,違反即報 Nothing to be done for 'default'。

編譯與驗證

cd /path/to/minix/source
make
# 輸出:
#   CC [M]  /path/to/minix/bitmap.o
#   ...
#   LD [M]  /path/to/minix/minix.ko
# 產出 minix.ko (模塊文件)

# 驗證模塊信息
modinfo minix.ko
# filename: /path/to/minix/minix.ko
# license: GPL
# depends:
# vermagic: 2.6.24.4-64.fc8 SMP mod_unload 686  (必須與 uname -r 完全一致)

動態載入/卸載測試

# 載入
sudo insmod minix.ko
# 或 sudo modprobe minix (需放入 /lib/modules/$(uname -r)/kernel/fs/minix/ 並 depmod)

# 驗證載入
lsmod | grep minix
# minix 28676 0 - Live 0xd0e7d000

# 掛載測試
mkdir /mnt/minix
mount -t minix /dev/loop0 /mnt/minix  # 需 Minix 格式的映像/設備

# 卸載模塊
sudo rmmod minix
lsmod | grep minix  # 無輸出 = 已卸載

現代化補充:DKMS (Dynamic Kernel Module Support)

# 將模塊源碼打包為 DKMS 格式
# /usr/src/minix-1.0/dkms.conf
PACKAGE_NAME="minix"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="minix"
DEST_MODULE_LOCATION[0]="/kernel/fs/minix"
AUTOINSTALL="yes"

sudo dkms add -m minix -v 1.0
sudo dkms build -m minix -v 1.0
sudo dkms install -m minix -v 1.0
# 之後內核升級,DKMS 自動重新編譯安裝模塊 — 徹底解決內核升級模塊失效問題

結語

**內核模塊化編譯三要素**:版本對齊的 kernel-devel/headers、正確的 Makefile (obj-m/obj-y、KERNELDIR、Tab 縮進)、動態 insmod/rmmod 驗證。掌握此法,任何文件系統 (Btrfs/ZFS/ext4 新特性)、驅動 (顯卡/網卡/存儲控制器) 均可熱插拔式部署。生產環境請配合 DKMS 實現內核升級免維護。

Copyright © Windows教程網 All Rights Reserved