這段時間接觸了下linux核心中的md**以及raid原始碼,想自己在上面加一些東西,期間就要重新編譯md和raid,但是由於修改的是核心原始碼,所以剛開始每次編譯都需要編譯核心,花費的時間比較長,於是就想起了將md和raid進行模組化,這樣的話就大大節省了編譯的時間,下面我們就來談談是怎麼模組化的。
模組化的步驟大致分為三個階段:編譯核心、編譯模組和插入模組。接下來逐一講下這三個階段。
選擇device drivers,進入如下介面:
選擇*multiple devices driver support(raid and lvm),進入md的模組設定介面:
這裡每一項的前面<>裡有兩個選項『m』和『*』,忽略空的情況。『m』表示編譯核心時將這一項編譯成模組,以後可以自行編譯插入到核心中,而無需再重新編譯核心;』*』表示編譯核心時將這項嵌入到核心中,以後再修改時,必須重新編譯核心。所以這裡對所有的條目能選』m』的都選』m』,不能選』m』的全打』*』。
注意:在make menuconfig
時有可能出現error,那是缺少相應的依賴條件,可執行apt-get install libncurses5-dev libncursesw5-dev
,然後再make menuconfig
即可。
接下來一次執行如下命令即可:
-make -j4
-make modules_install -j4
-make install -j4
-reboot
至此,核心編譯完畢,開始可使用uname -r
來檢視當前核心版本。
此時進入drivers/md/目錄下,需要修改makefile檔案內容以實現模組化編譯。
原先的makefile內容如下:
old-makefile
# makefile for the kernel software raid and lvm drivers.
#dm-mod-y += dm.o dm-table.o dm-target.o dm-linear.o dm-stripe.o \
dm-ioctl.o dm-io.o dm-kcopyd.o dm-sysfs.o dm-stats.o
dm-multipath-y += dm-path-selector.o dm-mpath.o
dm-snapshot-y += dm-snap.o dm-exception-store.o dm-snap-transient.o \
dm-snap-persistent.o
dm-mirror-y += dm-raid1.o
dm-log-userspace-y \
+= dm-log-userspace-base.o dm-log-userspace-transfer.o
dm-thin-pool-y += dm-thin.o dm-thin-metadata.o
dm-cache-y += dm-cache-target.o dm-cache-metadata.o dm-cache-policy.o
dm-cache-mq-y += dm-cache-policy-mq.o
dm-cache-cleaner-y += dm-cache-policy-cleaner.o
dm-era-y += dm-era-target.o
md-mod-y += md.o bitmap.o
raid456-y += raid5.o
# note: link order is important. all raid personalities
# and must come before md.o, as they each initialise
# themselves, and md.o may use the personalities when it
# auto-initialised.
obj-$(config_md_linear) += linear.o
obj-$(config_md_raid0) += raid0.o
obj-$(config_md_raid1) += raid1.o
obj-$(config_md_raid10) += raid10.o
obj-$(config_md_raid456) += raid456.o
obj-$(config_md_multipath) += multipath.o
obj-$(config_md_faulty) += faulty.o
obj-$(config_bcache) += bcache/
obj-$(config_blk_dev_md) += md-mod.o
obj-$(config_blk_dev_dm) += dm-mod.o
obj-$(config_blk_dev_dm_builtin) += dm-builtin.o
obj-$(config_dm_bufio) += dm-bufio.o
obj-$(config_dm_bio_prison) += dm-bio-prison.o
obj-$(config_dm_crypt) += dm-crypt.o
obj-$(config_dm_delay) += dm-delay.o
obj-$(config_dm_flakey) += dm-flakey.o
obj-$(config_dm_multipath) += dm-multipath.o dm-round-robin.o
obj-$(config_dm_multipath_ql) += dm-queue-length.o
obj-$(config_dm_multipath_st) += dm-service-time.o
obj-$(config_dm_switch) += dm-switch.o
obj-$(config_dm_snapshot) += dm-snapshot.o
obj-$(config_dm_persistent_data) += persistent-data/
obj-$(config_dm_mirror) += dm-mirror.o dm-log.o dm-region-hash.o
obj-$(config_dm_log_userspace) += dm-log-userspace.o
obj-$(config_dm_zero) += dm-zero.o
obj-$(config_dm_raid) += dm-raid.o
obj-$(config_dm_thin_provisioning) += dm-thin-pool.o
obj-$(config_dm_verity) += dm-verity.o
obj-$(config_dm_cache) += dm-cache.o
obj-$(config_dm_cache_mq) += dm-cache-mq.o
obj-$(config_dm_cache_cleaner) += dm-cache-cleaner.o
obj-$(config_dm_era) += dm-era.o
ifeq ($(config_dm_uevent),y)
dm-mod-objs += dm-uevent.o
endif
修改為如下內容:
new-makefile
linuxroot=/lib/modules/$(shell uname -r)/build
all:
make -c $(linuxroot) subdirs=`pwd` $(extra_cflags) kbuild_verbose=1 modules
obj-m += raid1.o
obj-m += raid10.o
obj-m += raid456.o
obj-m += md-mod.o
md-mod-objs := md.o bitmap.o
raid456-objs := raid5.o
再進行make
產生md-mod.ko 和 raid456.ko檔案(以raid5為例)。至此編譯結束。
首先插入md模組:insmod md-mod.ko
在插入raid456模組:insmod raid456.ko
卻出現如下錯誤:error: could not insert module raid456.ko: unknown symbol in module,原因是缺少依賴關係,可以用modprobe來自動補齊其依賴模組,命令為modprobe raid456
,使用modprobe時,後面那個raid456一定不能寫成raid456.ko!
至此插入模組也已經搞定啦,可以使用lsmod
來檢視系統的所有模組。接下來就可以按自己的想法來修改核心**了,比如說修改raid5的原始碼建立新的raid5
1等等之類的,嘻嘻^_^~
使用mdadm建立 ↩
linux核心中Kconfig及如何加自己的驅動
linux核心中kconfig及如何加自己的驅動 2.6核心的原始碼樹目錄下一般都會有兩個文文 kconfig和makefile。分布在各目錄下的kconfig構成了乙個分布式的核心配置資料庫,每個kconfig分別描述了所屬目錄原始檔相關的核心配置選單。在核心配置make menuconfig 或...
Linux核心中的list for each
在linux核心原始碼中,經常要對鍊錶進行操作,其中乙個很重要的巨集是list for each entry 意思大體如下 假設只有兩個結點,則第乙個member代表head,list for each entry的作用就是迴圈遍歷每乙個pos中的member子項。巨集list for each e...
linux核心中container of詳解
在linux 核心中,container of 函式使用非常廣,例如 linux核心鍊錶 list head 工作佇列work struct中。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。...