閱讀核心工具源碼是深入理解 Linux 系統行為的最佳途徑。本文以 cat 為例,示範從二進制檔案反查源碼套件、下載、解包、定位原始碼的標準化流程。
rpm -qif $(which cat)
# 或 dpkg -S $(which cat) (Debian/Ubuntu)
關鍵輸出:Source RPM: coreutils-5.2.1-31.8.el4_7.1.src.rpm、URL: ftp://alpha.gnu.org/gnu/coreutils/
.src.rpm (RHEL/Fedora) → rpm2cpio pkg.src.rpm | cpio -idmv → 得到 coreutils-x.y.z.tar.xz。coreutils-x.y.z.tar.xz (最新版)。
tar -xvf coreutils-*.tar.xz
cd coreutils-*
find . -name 'cat.c' -o -name 'cat.h'
# 通常在 src/ 目錄
ls src/cat.c
coreutils-9.4/
├── src/ # 所有指令 C 源碼 (cat.c, ls.c, cp.c ...)
├── lib/ # 共用函式庫 (引數解析、錯誤處理、檔案操作封裝)
├── man/ # man page 源碼
├── tests/ # 單元測試
├── configure.ac # Autotools 配置 (5 萬+ 行,Shell 進階技巧寶庫)
├── Makefile.am
└── README
| 指令 | 套件 | 源碼倉庫 |
|---|---|---|
| bash | bash | git.savannah.gnu.org/git/bash.git |
| systemd | systemd | github.com/systemd/systemd |
| kernel | kernel | git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git |
| glibc | glibc | sourceware.org/git/glibc.git |
| openssh | openssh | github.com/openssh/openssh-portable |
| vim | vim | github.com/vim/vim |
https://elixir.bootlin.com/linux/latest/source (核心交叉參考)man 指令 理解介面語意。src/指令.c 的 main() 入口,追蹤核心邏輯。error(), die()) 與邊界條件。tests/ 理解預期行為。「源碼面前無秘密」。建立「指令 → 套件 → 源碼倉庫」的查找肌肉記憶,配合 rpm -qif/dpkg -S、GNU 官網、Git 歷史,即可隨時深入任何工具內部實作。