博客 / 詳情

返回

Linux內核源碼相關操作整理

轉自:Linux內核源碼相關操作整理

Linux內核開發過程中,大部分對源碼的操作都是通過源碼中提供的Makefile腳本完成的。
如在源碼根目錄下單獨使用一個“make”來編譯源碼;用“make install”來安裝內核;用“make clean”來清理編譯過程產生的文件。
下面介紹Makefile腳本提供了哪些功能:
(在Linux源碼目錄下執行“make help”可以看到相關幫助信息。)

清理相關:

clean - 刪除大部分生成的文件,但保留配置和足夠的構建支持以構建外部模塊
mrproper - 移除全部,包闊各種生成的“.o”文件, 配置/備份文件(記得備份配置文件)
distclean - mrproper + 移除編輯器備份和patch文件

配置編譯過程相關:

config - 使用基於行的程序更新當前配置
nconfig - 使用ncurses菜單程序更新當前配置
menuconfig - 使用菜單的程序更新當前配置(常用,好用)
xconfig - 使用Qt界面更新當前配置(麻煩,還得先裝Qt的依賴寶)
gconfig - 使用基於GTK+的前端更新當前配置
oldconfig - 使用提供的 .config 文件作為基礎更新當前配置
              (用法是在更新老核為新核時,先拷貝老核的config文件到源碼根目錄,然後運行oldconfig)
localmodconfig - 更新當前配置,禁用未加載的模塊,但保留 LMC_KEEP 環境變量保留的模塊
localyesconfig - 更新當前配置,將本地修改轉換為核心模塊,但保留 LMC_KEEP 環境變量保留的模塊
defconfig - 腳本判斷當前ARCH,然後創建當前Arch版本的默認配置文件“.config”
savedefconfig - 將當前配置保存為 ./defconfig(最小配置)
allnoconfig - 創建所有選項均為“no”的新配置文件
allyesconfig - 創建所有選項均為“yes”的新配置文件
allmodconfig - 創建新的配置文件,將所有可以編譯成模塊的都選擇編譯成模塊
                 (編譯成模塊的內容會在initramfs文件的/lib/modules/xxx/xxx.ko,而選擇y則會編譯到vmlinux文件中)
alldefconfig - 將所有符號設置為默認值的新的配置文件
randconfig - 隨機所有選項,然後創建為新配置文件
yes2modconfig - 將“yes”選項全更改為“mod”
mod2yesconfig - 將“mod”選項更改為“yes”
mod2noconfig - 將“mod”選項更改為“no”
listnewconfig - 列出新的,當前目錄下“.config”文件沒有的選項
helpnewconfig - 列出新的選項和幫助文本
olddefconfig - 類似於 oldconfig,但將新的符號設置為其默認值,無提示
tinyconfig - 配置儘可能小的內核
testconfig - 運行 Kconfig 單元測試(需要 python3 和 pytest)

其他通用:

all - 構建所有標有 [*] 的目標

vmlinux - 構建裸內核
modules - 構建所有模塊
modules_install - 將所有模塊安裝到 INSTALL_MOD_PATH 目錄(默認為 /)
dir/ - 構建dir目錄中及其子目錄中的所有文件
dir/file.[ois] - 僅構建指定dir下的目標文件
dir/file.ll - 構建 LLVM 彙編文件(需要編譯器支持 LLVM 彙編生成)
dir/file.lst - 僅構建指定的混合源/彙編目標(需要較新的 binutils 和最新的構建(System.map))
dir/file.ko - 構建模塊,包括最終鏈接
modules_prepare - 設置用於構建外部模塊的環境
tags/TAGS - 為編輯器生成 tags 文件
cscope - 生成 cscope 索引,cscope是一個瀏覽代碼linux插件
gtags - 生成 GNU GLOBAL 索引
kernelrelease - 輸出版本信息(與 make -s 一起使用)
kernelversion - 輸出存儲在 Makefile 中的版本信息(與 make -s 一起使用)
image_name - 輸出鏡像存放目錄(與 make -s 一起使用)
headers_install - 安裝經過清理的內核頭文件到 INSTALL_HDR_PATH(默認為 ./usr)

Rust相關:

rustavailable - 檢查 Rust 工具鏈是否可用,並在不可用時解釋原因
rustfmt - 重新格式化內核中的所有 Rust 代碼
rustfmtcheck - 檢查內核中的所有 Rust 代碼是否已格式化,否則打印差異
rustdoc - 生成 Rust 文檔(需要內核 .config)
rusttest - 運行 Rust 測試(需要內核 .config,同時下載相關包)
rust-analyzer - 生成 rust-project.json rust-analyzer 支持文件(需要內核 .config)
dir/file.[os] - 僅構建指定的目標
dir/file.rsi - 構建宏展開的源文件,類似於 C 中的預處理,輸出的內容不用於編譯

內核單測相關:

kselftest - 構建並運行內核單測
                        (會先構建、安裝和引導內核, 需要用root運行)
kselftest-all - 構建內核自測試
kselftest-install - 構建並安裝內核單測
kselftest-clean - 刪除所有生成的 kselftest 文件
kselftest-merge - 將 kselftest 的所有配置依賴項合併到現有 .config 中

工具相關:

nsdeps - 生成缺失符號的命名空間依賴項

靜態分析器相關:

checkstack - 生成棧溢出列表
versioncheck - 對 version.h 的使用進行健全性檢查
includecheck - 檢查是否有重複包含的頭文件
export_report - 列出所有導出符號的使用情況
headerdep - 檢測頭文件中的循環包含
coccicheck - 使用 Coccinelle 進行檢查
clang-analyzer - 使用 Clang 靜態分析器進行檢查
clang-tidy - 使用 Clang-Tidy 進行檢查

內核打包相關:

rpm-pkg - 構建源碼和二進制 RPM 內核包
binrpm-pkg - 僅構建二進制內核 RPM 包
deb-pkg - 構建源碼和二進制 deb 內核包
bindeb-pkg - 僅構建二進制內核 deb 包
snap-pkg - 僅構建二進制內核 snap 包(需要連接網絡)
dir-pkg - 以純目錄結構構建內核
tar-pkg - 以未壓縮的 tar 包形式構建內核
targz-pkg - 以 gzip 壓縮的 tar 包形式構建內核
tarbz2-pkg - 以 bzip2 壓縮的 tar 包形式構建內核
tarxz-pkg - 以 xz 壓縮的 tar 包形式構建內核
tarzst-pkg - 以 zstd 壓縮的 tar 包形式構建內核
perf-tar-src-pkg - 構建 perf-xxx.tar 源碼 tar 包
perf-targz-src-pkg - 構建 perf-xxx.tar.gz 源碼 tar 包
perf-tarbz2-src-pkg - 構建 perf-xxx.tar.bz2 源碼 tar 包
perf-tarxz-src-pkg - 構建 perf-xxx.tar.xz 源碼 tar 包
perf-tarzst-src-pkg - 構建 perf-xxx.tar.zst 源碼 tar 包

構建文檔相關:

內核源碼下只保存文檔的ReST(reStructuredText)格式,其他格式需要通過構建生成:
htmldocs - 生成HTML 格式
latexdocs - 生成LaTeX 格式
pdfdocs - 生成PDF 格式
epubdocs - 生成EPUB 格式
xmldocs - 生成XML 格式
linkcheckdocs - 檢查外部鏈接的可用性(需要連接網絡)
refcheckdocs - 檢查對不存在文件的引用(位於 Documentation 目錄下)
cleandocs - 清理所有生成的文檔相關的文件

"make SPHINXDIRS="s1 s2" [target]" - 生成特定文件夾 s1 和 s2 的文檔
                                        SPHINXDIRS 的值可為這些:PCI RCU accounting admin-guide arc arm arm64 block bpf cdrom core-api cpu-freq crypto dev-tools devicetree doc-guide driver-api fault-injection fb filesystems firmware-guide fpga gpu hid hwmon i2c ia64 iio infiniband input isdn kbuild kernel-hacking leds livepatch locking loongarch m68k maintainer mhi mips misc-devices mm netlabel networking nios2 openrisc parisc pcmcia peci power powerpc process riscv rust s390 scheduler scsi security sh sound sparc spi staging target timers tools trace translations usb userspace-api virt w1 watchdog x86 xtensa

"make SPHINX_CONF={conf-file} [target]" 可以使用額外的 sphinx-build 配置進行構建。對於使用 nit-picking 配置進行構建很有用。

"make DOCS_THEME={sphinx-theme}" 選擇不同的 Sphinx 主題。

"make DOCS_CSS={a .css file}" 為 html/epub 輸出添加 DOCS_CSS 重寫文件。

生成的文檔的默認位置為 Documentation/output

特定架構相關(x86):

bzImage - 構建壓縮的內核映像(arch/x86/boot/bzImage)
install - 使用自己的“~/bin/installkernel”或“/sbin/installkernel”來安裝內核,或將其安裝到 $(INSTALL_PATH) 並運行 lilo
fdimage - 創建 1.4MB 引導軟盤映像(arch/x86/boot/fdimage)
fdimage144 - 創建 1.4MB 引導軟盤映像(arch/x86/boot/fdimage)
fdimage288 - 創建 2.8MB 引導軟盤映像(arch/x86/boot/fdimage)
hdimage - 創建 BIOS/EFI 硬盤映像(arch/x86/boot/hdimage)
isoimage - 創建啓動 CD-ROM 映像(arch/x86/boot/image.iso)
                    bzdisk/fdimage*/hdimage/isoimage可接受如下參數:
                                FDARGS="..." 作為啓動內核的參數
                                FDINITRD=file 作為啓動內核的 initrd 文件
kvm_guest.config - 啓用 KVM 客户機運行該內核的 Kconfig 項目
xen.config - 啓用 Xen 客户機運行該內核的 Kconfig 項目
x86_debug.config - 啓用 tip 樹調試選項進行測試
i386_defconfig - 為 i386 構建
x86_64_defconfig - 為 x86_64 構建

"make V=0|1 [targets]" 0 => 靜默構建(默認),1 => 詳細構建
"make V=2 [targets]" 2 => 詳細輸出構建目標的過程
"make O=dir [targets]" 將所有輸出文件(包括 .config)放在 "dir" 中定位
"make C=1 [targets]" 通過 $CHECK(默認為 sparse)檢查重新編譯的 c 源文件
"make C=2 [targets]" 強制使用 $CHECK 檢查所有 c 源文件
"make RECORDMCOUNT_WARN=1 [targets]" 警告忽略的 mcount 部分
"make W=n [targets]" 啓用額外的構建檢查,n=1,2,3,其中:
            1: 可能相關且不經常發生的警告
            2: 經常發生但仍可能相關的警告
            3: 更加深奧的警告,可能可以忽略
            e: 將警告視為錯誤
            可以通過 W=12 或 W=123 組合多個級別

其他工具

用"make tools/help" 或 "cd tools; make help" 可以查看用户空間工具相關説名

acpi - ACPI 工具
bpf - 雜項 BPF 工具
cgroup - cgroup 工具
counter - 計數器工具
cpupower - x86 CPU 電源相關的工具
debugging - 調試工具
firewire - IEEE-1394 流量嗅探器 nosy 的用户空間部分
firmware - 固件工具
freefall - 用於磁盤保護的筆記本加速計程序
gpio - GPIO 工具
hv - 在 Hyper-V 客户端中使用的工具
iio - IIO 工具
intel-speed-select - Intel Speed Select 工具
kvm_stat - 類似 top 的用於顯示 kvm 統計信息的實用程序
leds - LED 工具
nolibc - nolibc 頭文件測試和安裝
objtool - 一個 ELF 對象分析工具
pci - PCI 工具
perf - Linux 性能測量和分析工具
selftests - 各種內核自測試
bootconfig - 啓動配置工具
spi - SPI 工具
tmon - 温度監控和調整工具
thermometer - 温度捕獲工具
thermal-engine - 温度監控工具
thermal - 熱管理庫
tracing - 雜項跟蹤工具
turbostat - Intel CPU 空閒狀態和頻率報告工具
usb - USB 測試工具
virtio - vhost 測試模塊
vm - 雜項虛擬機工具
wmi - WMI 接口示例
x86_energy_perf_policy - Intel 能效策略工具

你可以在內核命令行中執行以下操作:

$ make -C tools/ <tool>_install
用於構建和安裝上述工具中的一個。

$ make tools/all
構建所有工具

$ make tools/install
安裝所有工具。


清理構建文件:在所有上述目標後添加 "_clean" 字符串將清理相應的構建目錄。
clean:清理所有,用於清理 all 文件夾。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.