關于核心子產品編譯的過程中,往往我們僅僅需要其中一個小的子產品,但是卻因為核心源碼的龐雜而止步與子產品依賴的篩選過程中。
為了更加便捷得對核心各個子產品進行管理,這裡提供一個小腳本來進行指定子產品相關得子產品留存,不相關的子產品代碼自動清除。
單獨對核心指定子產品進行編譯,主要使用如下指令:
在相對目錄為:
../rpmbuild/BUILD/kernel-3.10.0-957.5.1.el7/linux-3.10.0-957.5.1.el7.x86_64
的目錄下執行指令
make M=fs/ceph
,M為指定子產品代碼的路徑,我這裡編譯的是ceph的核心子產品ceph.ko,是以指定路徑為
fs/ceph
總體思路是:
- 重命名相對目錄下第一個檔案夾中的一個檔案或者檔案夾
- 編譯需要編譯的KO,如果目前驅動依賴備份的檔案夾,則會傳回編譯失敗;
- 編譯成功,則删除備份的檔案夾或者檔案
以下腳本的運作路徑同樣為以上的相對目錄下
PS:有一個檔案
Module.symvers
可以提前備份,該檔案并不影響編譯,但影響最終的驅動資訊,它決定驅動的依賴和版本
#!/bin/bash
path=$1 #腳本輸入要編譯的驅動,僅支援篩選一個,如果要篩選多個,可以增加外層循環,一個一個嘗試
for i in `/usr/bin/ls`
do
if [ -d "$i" ];then
for j in `/usr/bin/ls $i` #核心驅動檔案夾僅為一級目錄,其次的目錄可以不用深入
do
/bin/rm $path/*.o 2>/dev/null #編譯前将已存在的o二進制檔案删除,防止僅僅連結.o檔案
/usr/bin/mv $i/$j $i/$j-bak #重命名一個檔案夾或者檔案
/usr/bin/make M=$path #進行編譯
if [ $? -ne 0 ];then
/usr/bin/mv $i/"$j"-bak "$i"/"$j"
echo -e "$i/$j is neccessary for $path\n " >> "$path"_necessary_file
else
/bin/rm $i/"$j"-bak 2>/dev/null
fi
done
else #不為目錄的則檢測檔案是否被我們要編譯到驅動依賴
/usr/bin/rm $path/*.o 2>/dev/null
/usr/bin/mv $i/$j $i/"$j"-bak
/usr/bin/make M=$path
if [ $? -ne 0 ];then
/usr/bin/mv $i/"$j"-bak $i/$j
echo -e "$i/$j is neccessary for $path\n " >> "$path"_necessary_file
else
/usr/bin/rm -r $i/"$j"-bak 2>/dev/null
fi
fi
done
[root@node1 linux-3.10.0-957.5.1.el7.x86_64]# ls
arch CREDITS firmware Kbuild Makefile REPORTING-BUGS sound vmlinux.id
block crypto fs Kconfig Makefile.qlock samples test x509.genkey
centos-kpatch.x509 Documentation hdrwarnings.txt kernel mm scripts test.sh
centos-ldup.x509 drivers include ldconfig-kernel.conf Module.symvers security tools
configs drivers.undef init lib net signing_key.priv usr
COPYING extra_certificates ipc MAINTAINERS README signing_key.x509 virt
[root@node1 linux-3.10.0-957.5.1.el7.x86_64]# ls
arch fs include Makefile Module.symvers net scripts tools