Linux 內核是 Linux 操作系統的主要組件,也是計算機硬件與其進程之間的核心接口。它負責兩者之間的通信,還要盡可能高效地管理資源。之所以稱為內核,是因為它在操作系統中就像果實硬殼中的種子一樣,并且控制著硬件的所有主要功能。內核的用途主要有以下 4 項工作:
內存管理:追蹤記錄有多少內存存儲了什么以及存儲在哪里
進程管理:確定哪些進程可以使用中央處理器、何時使用以及持續多長時間
設備驅動程序:充當硬件與進程之間的調解程序/解釋程序
系統調用和安全防護:從流程接受服務請求
在正確實施的情況下,內核對于用戶是不可見的,它在自己的小世界(稱為內核空間)中工作,并從中分配內存和跟蹤所有內容的存儲位置。用戶所看到的內容則被稱為用戶空間。這些應用通過系統調用接口(SCI)與內核進行交互。
Linux系統內核概述
1. 內核簡介
單內核體系設計、但充分借鑒了微內核設計體系的優點,為內核引入模塊化機制。
Linux 內核的重要組成部分,主要有以下幾部分:
kernel
內核核心,一般為 bzImage
通常在 /boot 目錄下,名稱為 vmlinuz-VERSION-RELEASE
kernel object
內核對象,一般放置于 /lib/modules/VERSION-RELEASE/
[ ] ==> N ==> 不編譯進內核
[M] ==> M ==> 編譯為模塊文件
[*] ==> Y ==> 編譯進內核
輔助文件(ramdisk)
initrd
initramfs
2. 內核模塊
2.1 uname 命令
使用格式
uname [OPTION]...
參數解釋
-n 顯示節點名稱
-r 顯示VERSION-RELEASE
-s 內核名稱
-v 內核版本
-n 節點名
-m 硬件名稱
-i 硬件平臺
-p 處理器類型
-o 操作系統
#?uname?-m i686 #?uname?-r 2.6.32-573.22.1.el6.i686 #?uname?-a Linux?MyServer?2.6.32-573.22.1.el6.i686?...?i686?i386?GNU/Linux
2.2 lsmod 命令
顯示由核心已經裝載的內核模塊
命令定義
顯示的內容來自于: /proc/modules 文件。
使用 lsmod 命令時,常會采用類似 lsmod | grep -i ext4 這樣的命令來查詢系統是否加載了某些模塊。
#?cat?/proc/modules iptable_filter?2173?0?-?Live?0xed9b2000 ip_tables?9567?1?iptable_filter,?Live?0xed9a9000 ext3?203718?1?-?Live?0xed962000 jbd?65315?1?ext3,?Live?0xed904000 xenfs?4360?1?-?Live?0xed8e6000 ipv6?271097?14?-?Live?0xed88e000 xen_netfront?15871?0?-?Live?0xed7d9000 ext4?339812?2?-?Live?0xed764000 jbd2?75927?1?ext4,?Live?0xed6d9000 mbcache?6017?2?ext3,ext4,?Live?0xed6b7000 xen_blkfront?19209?5?-?Live?0xed69f000 dm_mirror?11969?0?-?Live?0xed68d000 dm_region_hash?9644?1?dm_mirror,?Live?0xed67e000 dm_log?8322?2?dm_mirror,dm_region_hash,?Live?0xed672000 dm_mod?84711?11?dm_mirror,dm_log,?Live?0xed64e000
#?lsmod?|?grep?ext4 ext4??????????????????339812??2 jbd2???????????????????75927??1?ext4 mbcache?????????????????6017??2?ext3,ext4
字段含義
第 1 列:表示模塊的名稱
第 2 列:表示模塊的大小
第 3 列:表示依賴模塊的個數
第 4 列:表示依賴模塊的內容
#?lsmod Module??????????????????Size??Used?by iptable_filter??????????2173??0 ip_tables???????????????9567??1?iptable_filter ext3??????????????????203718??1 jbd????????????????????65315??1?ext3 xenfs???????????????????4360??1 ipv6??????????????????271097??14 xen_netfront???????????15871??0 ext4??????????????????339812??2 jbd2???????????????????75927??1?ext4 mbcache?????????????????6017??2?ext3,ext4 xen_blkfront???????????19209??5 dm_mirror??????????????11969??0 dm_region_hash??????????9644??1?dm_mirror dm_log??????????????????8322??2?dm_mirror,dm_region_hash dm_mod?????????????????84711??11?dm_mirror,dm_log
2.3 modinfo 命令
顯示模塊的詳細描述信息
命令定義
modinfo 列出 Linux 內核中命令行指定的模塊的信息。
modinfo 能夠查詢系統中未安裝的模塊信息。
若模塊名不是一個文件名,則會在 /lib/modules/version 目錄中搜索,就像 modprobe 一樣。
modinfo 默認情況下,為了便于閱讀,以下面的格式列出模塊的每個屬性:fieldname : value。
語法
modinfo [選項] [ modulename|filename... ]
選項
-n 只顯示模塊文件路徑
-p 顯示模塊參數
-a author
-d description
-l license
-0 使用’’字符分隔 field 值,而不是一個新行,對腳本比較有用
實戰演示
#?modinfo?ext4 filename:???????/lib/modules/2.6.32-573.22.1.el6.i686/kernel/fs/ext4/ext4.ko license:????????GPL description:????Fourth?Extended?Filesystem author:?????????Remy?Card,?Stephen?Tweedie,?Andrew?Morton,?Andreas?Dilger,?Theodore?and?others srcversion:?????CB1B990F5A758DFB0FB12F1 depends:????????mbcache,jbd2 vermagic:???????2.6.32-573.22.1.el6.i686?SMP?mod_unload?modversions?686 #?modinfo?btrfs filename:???????/lib/modules/2.6.32-573.22.1.el6.i686/kernel/fs/btrfs/btrfs.ko license:????????GPL alias:??????????devname:btrfs-control alias:??????????char-major-10-234 srcversion:?????B412C18B0F5BF7F1B3C941A depends:????????libcrc32c,zlib_deflate,lzo_compress,lzo_decompress vermagic:???????2.6.32-573.22.1.el6.i686?SMP?mod_unload?modversions?686
2.4 modprobe 命令
裝載或卸載內核模塊
命令定義
配置文件
/etc/modprobe.conf
/etc/modprobe.d/*.conf
解決依賴
modprobe需要一個最新的modules.dep文件,可以用depmod來生成
該文件列出了每一個模塊需要的其他模塊,modprobe使用這個去自動添加或刪除模塊的依賴
#?modules.dep為解決依賴的配置文件,modules.dep.bin二進制文件運行 #?ls?/lib/modules/2.6.32-358.6.1.el6.i686/ build??????????????modules.block????modules.ieee1394map??modules.ofmap?????modules.symbols.bin??weak-updates extra??????????????modules.ccwmap???modules.inputmap?????modules.order?????modules.usbmap kernel?????????????modules.dep??????modules.isapnpmap????modules.pcimap????source modules.alias??????modules.dep.bin??modules.modesetting??modules.seriomap??updates modules.alias.bin??modules.drm??????modules.networking???modules.symbols???vdso
語法
modprobe [ -c ]
modprobe [ -l ] [ -t dirname ] [ wildcard ]
modprobe [ -r ] [ -v ] [ -n ] [ -i ] [ modulename … ]
選項
-v
顯示程序在干什么,通常在出問題的情況下,modprobe 才顯示信息
-C
重載,默認配置文件(/etc/modprobe.conf 或 /etc/modprobe.d)
-c
輸出配置文件并退出
-n
可以和 -v 選項一起使用,調試非常有用
-i
該選項會使得 modprobe 忽略配置文件中的,在命令行上輸入的 install 和 remove
-q
一般 modprobe 刪除或插入一個模塊時,若沒有找到會提示錯誤。使用該選項,會忽略指定的模塊,并不提示任何錯誤信息。
-r
該選項會導致 modprobe 去刪除,而不是插入一個模塊
通常沒有沒有理由去刪除內核模塊,除非是一些有 bug 的模塊
-f
使用該選項是比較危險的
和同時使用 –force-vermagic,–force-modversion 一樣
-l
列出所有模塊
-a
插入所有命令行中的模塊
-t
強制 -l 顯示 dirname 中的模塊
-s
錯誤信息寫入 syslog
2.5 depmod 命令
內核模塊依賴關系文件及系統信息映射文件的生成工具
語法
depmod [-adeisvV][-m <文件>][--help][模塊名稱]
參數
-a 分析所有可用的模塊
-d 執行排錯模式
-e 輸出無法參照的符號
-i 不檢查符號表的版本
-m<文件> 使用指定的符號表文件
-s 在系統記錄中記錄錯誤
-v 執行時顯示詳細的信息
-V 顯示版本信息
--help 顯示幫助
2.6 insmod 和 rmmod 命令
裝載或卸載內核模塊
不解決依賴關系,需要自己手動卸載
insmod命令
向 Linux 內核中插入一個模塊
insmod 是一個向內核插入模塊的小程序
大多數用戶使用 modprobe 因為它比較智能化
insmod [ filename ] [ module options... ]
rmmod命令
命令解析
刪除內核中的一模塊
rmmod 是一個可以從內核中刪除模塊的小程序,大多數用戶使用modprobe -r去刪除模塊
語法格式
rmmod [ modulename ]
參數選項
-f
除非編譯內核時?CONFIG_MODULE_FORCE_UNLOAD?被設置該命令才有效果,否則沒效果
用該選項可以刪除正在被使用的模塊,設計為不能刪除的模塊,或者標記為?unsafe?的模塊
-w
rmmod 拒絕刪除正在被使用的模塊
使用該選項后,指定的模塊會被孤立起來,直到不被使用
-s
將錯誤信息寫入?syslog,而不是標準錯誤(stderr)
3. /proc 目錄
內核把自己內部狀態信息及統計信息,以及可配置參數通過 proc 偽文件系統加以輸出。
#?ls?/proc/ 1?????1173??22?????29855??35??47???60???973??????????filesystems??loadavg???????scsi???????????version 10????12????23?????3??????36??48???600??buddyinfo????fs???????????locks?????????self???????????vmallocinfo 1071??13????232????30?????37??49???61???bus??????????interrupts???mdstat????????slabinfo???????vmstat 1082??14????234????31?????38??5????62???cgroups??????iomem????????meminfo???????softirqs???????xen 1085??15????24?????31314??39??528??7????cmdline??????ioports??????misc??????????stat???????????zoneinfo 11????16????25?????317????4???531??739??cpuinfo??????irq??????????modules???????swaps 1150??17????252????318????40??543??8????crypto???????kallsyms?????mounts????????sys 1162??18????253????32?????41??56???808??devices??????kcore????????mtd???????????sysrq-trigger 1163??19????26?????320????42??566??830??diskstats????keys?????????net???????????sysvipc 1165??1908??27?????33?????43??567??853??dma??????????key-users????pagetypeinfo??timer_list 1167??2?????28?????330????44??57???9????driver???????kmsg?????????partitions????timer_stats 1169??20????29?????334????45??59???94???execdomains??kpagecount???sched_debug???tty 1171??21????29853??34?????46??6????95???fb???????????kpageflags???schedstat?????uptime
3.1 sysctl 命令
語法格式
sysctl(選項)(參數)
命令參數
-n 打印值時不打印關鍵字
-e 忽略未知關鍵字錯誤
-N 僅打印名稱
-w 當改變 sysctl 設置時使用此項
-p 從配置文件 /etc/sysctl.conf 加載內核參數設置
-a 打印當前所有可用的內核參數變量和值
-A 以表格方式打印當前所有可用的內核參數變量和值
默認配置文件
/etc/sysctl.conf
命令使用方式
(1) 設置某參數
sysctl -w parameter=VALUE
(2) 通過讀取配置文件設置參數
sysctl -p [/path/to/conf_file]
參數說明
只讀:輸出信息
可寫:可接受用戶指定“新值”來實現對內核某功能或特性的配置/proc/sys
兩種修改方式
(1) sysctl 命令用于查看或設定此目錄中諸多參數
sysctl -w path.to.parameter=VALUE
sysctl -w kernel.hostname=mail.escapelife.com
(2) echo 命令通過重定向的方式也可以修改大多數參數的值
echo "VALUE" > /proc/sys/path/to/parameter
echo "www.escapelife.com" > /proc/sys/kernel/hostname
配置文件中常用的幾個參數
net.ipv4.ip_forward
/proc/sys/net/ipv4/ip_forward
vm.drop_caches
/proc/sys/vm/drop_caches
kernel.hostname
/proc/sys/kernel/hostname
3.2 修改配置文件
#?cat?/etc/sysctl.conf #?Kernel?sysctl?configuration?file?for?Red?Hat?Linux #?Controls?IP?packet?forwarding net.ipv4.ip_forward?=?0 #?Controls?source?route?verification net.ipv4.conf.default.rp_filter?=?1 #?Do?not?accept?source?routing net.ipv4.conf.default.accept_source_route?=?0 #?Controls?the?System?Request?debugging?functionality?of?the?kernel kernel.sysrq?=?0 #?Controls?whether?core?dumps?will?append?the?PID?to?the?core?filename. #?Useful?for?debugging?multi-threaded?applications. kernel.core_uses_pid?=?1 #?Controls?the?use?of?TCP?syncookies net.ipv4.tcp_syncookies?=?1 #?Disable?netfilter?on?bridges. net.bridge.bridge-nf-call-ip6tables?=?0 net.bridge.bridge-nf-call-iptables?=?0 net.bridge.bridge-nf-call-arptables?=?0 #?Controls?the?default?maxmimum?size?of?a?mesage?queue kernel.msgmnb?=?65536 #?Controls?the?maximum?size?of?a?message,?in?bytes kernel.msgmax?=?65536 #?Controls?the?maximum?shared?segment?size,?in?bytes kernel.shmmax?=?4294967295 #?Controls?the?maximum?number?of?shared?memory?segments,?in?pages kernel.shmall?=?268435456 #?Auto-enabled?by?xs-tools:install.sh net.ipv4.conf.all.arp_notify?=?1
3.3 實戰演示
#?查看所有可讀變量 sysctl?-a #?修改對應參數 sysctl?-w?kernel.sysrq=0 sysctl?-w?kernel.core_uses_pid=1 sysctl?-w?net.ipv4.conf.default.accept_redirects=0 #?如果希望屏蔽別人?ping?你的主機,配置文件修改 net.ipv4.icmp_echo_ignore_all?=?1 #?編輯完成后,請執行以下命令使變動立即生效 /sbin/sysctl?-p /sbin/sysctl?-w?net.ipv4.route.flush=1
4. /sys 目錄
sysfs 偽文件系統,輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的設定信息。有些參數是可以修改的,用于調整硬件工作特性。
4.1 udev
udev 是運行用戶空間程序。
udev 通 /sys/ 路徑下輸出的信息動態為各設備創建所需要設備文件。
udev 是 Linux 內核的設備管理器,它取代了 udevadmin 和 ?hotplug,負責管理 ?/dev 中的設備節點。
udev 也處理所有用戶空間發生的硬件添加、刪除事件,以及某些特定設備所需的固件加載。
udev 為設備創建設備文件時,會讀取其事先定義好的規則文件,一般在 /etc/udev/rules.d 及 /usr/lib/udev/rules.d 目錄下。
4.2 ramdisk 文件的制作
方法一
mkinitrd 命令
為當前正在使用的內核重新制作 ramdisk 文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
#?移動ramdisk文件到/root目錄下 mv?/boot/initramfs-2.6.32...img?/root #?為當前正在使用的內核重新制作ramdisk文件 mkinitrd?/boot/initramfs-$(uname?-r).img?$(uname?-r)
方法二
dracut 命令
為當前正在使用的內核重新制作 ramdisk 文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
#?移動ramdisk文件到/root目錄下 mv?/boot/initramfs-2.6.32...img?/root #?為當前正在使用的內核重新制作ramdisk文件 dracut?/boot/initramfs-$(uname?-r).img?$(uname?-r)
4.3 查看 ramdisk
#?使用file命令查看ramdisk文件發現是以gz壓縮存放的 file?/boot/initramfs-2.6.32-504.el6.x86_64.img #?改名稱,解壓 cd?/boot/ mv?initramfs-2.6.32-504.el6.x86_64.img?initramfs-2.6.32-504.el6.x86_64.img.gz gzip?-d?initramfs-2.6.32-504.el6.x86_64.img.gz #?使用file命令查看發現是以cpio存放的文本文件 file?initramfs-2.6.32-504.el6.x86_64.img #?解壓這個文本文件 #?之后會在initrd目錄下生成相應的文件,一個微型的/root mkdir?initrd cd?initrd cpio?-id?../initramfs-2.6.32-504.el6.x86_64.img #?這個時候就可以查看init腳本文件了 cat?init #?在sbin文件中存放著相關的命令 ls?sbin
5. 編譯內核
5.1 前提準備
(1) 準備好開發環境
包組(CentOS 6)
Server Platform Development
Development Tools
(2) 獲取目標主機上硬件設備的相關信息
CPU
cat /proc/cpuinfo
x86info -a
lscpu
PCI 設備
lspci
-v
-vv
lsusb
-v
-vv
lsblk
了解全部硬件設備信息
hal-device
(3) 獲取到目標主機系統功能的相關信息
(4) 獲取內核源代碼包
www.kernel.org
5.2 簡易安裝內核
簡易安裝
獲取當前系統的安裝文件作為模塊安裝較為方便
修改相應的參數即可
只適用于當前特定的內核版本
當前系統的安裝文件在 config-2.6.32-504.el6.x86_64
簡單依據模板文件的制作內核
#?下載對應的Linux內核版本進行解壓縮 #?會在/usr/src目錄下創建debug、kernels和linux-3.10.67目錄 tar?xf?linux-3.10.67.tar.xz?-C?/usr/src #?為了方便多內核共存,使用連接指向 #?會在當前目錄下創建一個鏈接文件?linux?->?linux-3.10.67 cd?/usr/src ln?-sv?linux-3.10.67?linux #?創建模板 cd?linux #?查看鏈接指向的文件內容 ls #?拷貝系統自帶的模板文件 cp?/boot/config-$(uname?-r)?.config #?打開圖形界面配置內核選項,選擇添加、刪除內核模塊 #?添加的默認選項來自.config配置文件 make?menuconfig #?使用screen來不中斷安裝 screen #?采用幾個線程進行編譯 make?-j?n #?安裝內核 make?modules_install #?make?install中將會安裝內容 #?安裝bzImage為/boot/vmlinuz-VERSION-RELEASE #?生成initramfs文件 #?編輯grub的配置文件 make?install #?重啟系統,并測試使用新內核,不是默認啟動內核 init?6
5.3 詳解編譯內核
(1) 配置內核選項
支持“更新”模式進行配置
(a) make config:基于命令行以遍歷的方式去配置內核中可配置的每個選項
(b) make menuconfig:基于 curses 的文本窗口界面
(c) make gconfig:基于 GTK 開發環境的窗口界面
(d) make xconfig:基于 Qt 開發環境的窗口界面
支持“全新配置”模式進行配置
(a) make defconfig:基于內核為目標平臺提供的“默認”配置進行配置
(b) make allnoconfig: 所有選項均回答為”no“
(2) 編譯 - make [-j #]
如何只編譯內核中的一部分功能
#?(a)只編譯某子目錄中的相關代碼 cd?/usr/src/linux make?dir/ #?(b)只編譯一個特定的模塊 cd?/usr/src/linux make?dir/file.ko #?例如:只為e1000編譯驅動 make?drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉編譯內核
#?編譯的目標平臺與當前平臺不相同; make?ARCH=arch_name #?要獲取特定目標平臺的使用幫助 make?ARCH=arch_name?help
如何在已經執行過編譯操作的內核源碼樹做重新編譯
#?事先清理操作 #?清理大多數編譯生成的文件,但會保留config文件等 make?clean #?清理所有編譯生成的文件、config及某些備份文件 make?mrproper #?mrproper、patches以及編輯器備份文件 make?distclean
編輯:黃飛
?
評論
查看更多