Linux 內(nèi)核是一種開源的類 Unix 操作系統(tǒng)宏內(nèi)核。
Linux 內(nèi)核是 Linux 操作系統(tǒng)的主要組件,也是計(jì)算機(jī)硬件與其進(jìn)程之間的核心接口。它負(fù)責(zé)兩者之間的通信,還要盡可能高效地管理資源。之所以稱為內(nèi)核,是因?yàn)樗诓僮飨到y(tǒng)中就像果實(shí)硬殼中的種子一樣,并且控制著硬件的所有主要功能。內(nèi)核的用途主要有以下 4 項(xiàng)工作:
內(nèi)存管理:追蹤記錄有多少內(nèi)存存儲了什么以及存儲在哪里
進(jìn)程管理:確定哪些進(jìn)程可以使用中央處理器、何時(shí)使用以及持續(xù)多長時(shí)間
設(shè)備驅(qū)動(dòng)程序:充當(dāng)硬件與進(jìn)程之間的調(diào)解程序/解釋程序
系統(tǒng)調(diào)用和安全防護(hù):從流程接受服務(wù)請求
在正確實(shí)施的情況下,內(nèi)核對于用戶是不可見的,它在自己的小世界(稱為內(nèi)核空間)中工作,并從中分配內(nèi)存和跟蹤所有內(nèi)容的存儲位置。用戶所看到的內(nèi)容則被稱為用戶空間。這些應(yīng)用通過系統(tǒng)調(diào)用接口(SCI)與內(nèi)核進(jìn)行交互。
Linux系統(tǒng)內(nèi)核概述
1. 內(nèi)核簡介
單內(nèi)核體系設(shè)計(jì)、但充分借鑒了微內(nèi)核設(shè)計(jì)體系的優(yōu)點(diǎn),為內(nèi)核引入模塊化機(jī)制。
Linux 內(nèi)核的重要組成部分,主要有以下幾部分:
kernel
內(nèi)核核心,一般為 bzImage
通常在 /boot 目錄下,名稱為 vmlinuz-VERSION-RELEASE
kernel object
內(nèi)核對象,一般放置于 /lib/modules/VERSION-RELEASE/
[ ] ==> N ==> 不編譯進(jìn)內(nèi)核
[M] ==> M ==> 編譯為模塊文件
[*] ==> Y ==> 編譯進(jìn)內(nèi)核
輔助文件(ramdisk)
initrd
initramfs
2. 內(nèi)核模塊
2.1 uname 命令
使用格式
uname [OPTION]...
參數(shù)解釋
-n 顯示節(jié)點(diǎn)名稱
-r 顯示VERSION-RELEASE
-s 內(nèi)核名稱
-v 內(nèi)核版本
-n 節(jié)點(diǎn)名
-m 硬件名稱
-i 硬件平臺
-p 處理器類型
-o 操作系統(tǒng)
#?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 命令
顯示由核心已經(jīng)裝載的內(nèi)核模塊
命令定義
顯示的內(nèi)容來自于: /proc/modules 文件。
使用 lsmod 命令時(shí),常會采用類似 lsmod | grep -i ext4 這樣的命令來查詢系統(tǒng)是否加載了某些模塊。
#?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 列:表示依賴模塊的個(gè)數(shù)
第 4 列:表示依賴模塊的內(nèi)容
#?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 命令
顯示模塊的詳細(xì)描述信息
命令定義
modinfo 列出 Linux 內(nèi)核中命令行指定的模塊的信息。
modinfo 能夠查詢系統(tǒng)中未安裝的模塊信息。
若模塊名不是一個(gè)文件名,則會在 /lib/modules/version 目錄中搜索,就像 modprobe 一樣。
modinfo 默認(rèn)情況下,為了便于閱讀,以下面的格式列出模塊的每個(gè)屬性:fieldname : value。
語法
modinfo [選項(xiàng)] [ modulename|filename... ]
選項(xiàng)
-n 只顯示模塊文件路徑
-p 顯示模塊參數(shù)
-a author
-d description
-l license
-0 使用’’字符分隔 field 值,而不是一個(gè)新行,對腳本比較有用
實(shí)戰(zhàn)演示
#?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 命令
裝載或卸載內(nèi)核模塊
命令定義
配置文件
/etc/modprobe.conf
/etc/modprobe.d/*.conf
解決依賴
modprobe需要一個(gè)最新的modules.dep文件,可以用depmod來生成
該文件列出了每一個(gè)模塊需要的其他模塊,modprobe使用這個(gè)去自動(dòng)添加或刪除模塊的依賴
#?modules.dep為解決依賴的配置文件,modules.dep.bin二進(jìn)制文件運(yùn)行 #?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 … ]
選項(xiàng)
-v
顯示程序在干什么,通常在出問題的情況下,modprobe 才顯示信息
-C
重載,默認(rèn)配置文件(/etc/modprobe.conf 或 /etc/modprobe.d)
-c
輸出配置文件并退出
-n
可以和 -v 選項(xiàng)一起使用,調(diào)試非常有用
-i
該選項(xiàng)會使得 modprobe 忽略配置文件中的,在命令行上輸入的 install 和 remove
-q
一般 modprobe 刪除或插入一個(gè)模塊時(shí),若沒有找到會提示錯(cuò)誤。使用該選項(xiàng),會忽略指定的模塊,并不提示任何錯(cuò)誤信息。
-r
該選項(xiàng)會導(dǎo)致 modprobe 去刪除,而不是插入一個(gè)模塊
通常沒有沒有理由去刪除內(nèi)核模塊,除非是一些有 bug 的模塊
-f
使用該選項(xiàng)是比較危險(xiǎn)的
和同時(shí)使用 –force-vermagic,–force-modversion 一樣
-l
列出所有模塊
-a
插入所有命令行中的模塊
-t
強(qiáng)制 -l 顯示 dirname 中的模塊
-s
錯(cuò)誤信息寫入 syslog
2.5 depmod 命令
內(nèi)核模塊依賴關(guān)系文件及系統(tǒng)信息映射文件的生成工具
語法
depmod [-adeisvV][-m <文件>][--help][模塊名稱]
參數(shù)
-a 分析所有可用的模塊
-d 執(zhí)行排錯(cuò)模式
-e 輸出無法參照的符號
-i 不檢查符號表的版本
-m<文件> 使用指定的符號表文件
-s 在系統(tǒng)記錄中記錄錯(cuò)誤
-v 執(zhí)行時(shí)顯示詳細(xì)的信息
-V 顯示版本信息
--help 顯示幫助
2.6 insmod 和 rmmod 命令
裝載或卸載內(nèi)核模塊
不解決依賴關(guān)系,需要自己手動(dòng)卸載
insmod命令
向 Linux 內(nèi)核中插入一個(gè)模塊
insmod 是一個(gè)向內(nèi)核插入模塊的小程序
大多數(shù)用戶使用 modprobe 因?yàn)樗容^智能化
insmod [ filename ] [ module options... ]
rmmod命令
命令解析
刪除內(nèi)核中的一模塊
rmmod 是一個(gè)可以從內(nèi)核中刪除模塊的小程序,大多數(shù)用戶使用modprobe -r去刪除模塊
語法格式
rmmod [ modulename ]
參數(shù)選項(xiàng)
-f
除非編譯內(nèi)核時(shí)?CONFIG_MODULE_FORCE_UNLOAD?被設(shè)置該命令才有效果,否則沒效果
用該選項(xiàng)可以刪除正在被使用的模塊,設(shè)計(jì)為不能刪除的模塊,或者標(biāo)記為?unsafe?的模塊
-w
rmmod 拒絕刪除正在被使用的模塊
使用該選項(xiàng)后,指定的模塊會被孤立起來,直到不被使用
-s
將錯(cuò)誤信息寫入?syslog,而不是標(biāo)準(zhǔn)錯(cuò)誤(stderr)
3. /proc 目錄
內(nèi)核把自己內(nèi)部狀態(tài)信息及統(tǒng)計(jì)信息,以及可配置參數(shù)通過 proc 偽文件系統(tǒng)加以輸出。
#?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(選項(xiàng))(參數(shù))
命令參數(shù)
-n 打印值時(shí)不打印關(guān)鍵字
-e 忽略未知關(guān)鍵字錯(cuò)誤
-N 僅打印名稱
-w 當(dāng)改變 sysctl 設(shè)置時(shí)使用此項(xiàng)
-p 從配置文件 /etc/sysctl.conf 加載內(nèi)核參數(shù)設(shè)置
-a 打印當(dāng)前所有可用的內(nèi)核參數(shù)變量和值
-A 以表格方式打印當(dāng)前所有可用的內(nèi)核參數(shù)變量和值
默認(rèn)配置文件
/etc/sysctl.conf
命令使用方式
(1) 設(shè)置某參數(shù)
sysctl -w parameter=VALUE
(2) 通過讀取配置文件設(shè)置參數(shù)
sysctl -p [/path/to/conf_file]
參數(shù)說明
只讀:輸出信息
可寫:可接受用戶指定“新值”來實(shí)現(xiàn)對內(nèi)核某功能或特性的配置/proc/sys
兩種修改方式
(1) sysctl 命令用于查看或設(shè)定此目錄中諸多參數(shù)
sysctl -w path.to.parameter=VALUE
sysctl -w kernel.hostname=mail.escapelife.com
(2) echo 命令通過重定向的方式也可以修改大多數(shù)參數(shù)的值
echo "VALUE" > /proc/sys/path/to/parameter
echo "www.escapelife.com" > /proc/sys/kernel/hostname
配置文件中常用的幾個(gè)參數(shù)
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 實(shí)戰(zhàn)演示
#?查看所有可讀變量 sysctl?-a #?修改對應(yīng)參數(shù) sysctl?-w?kernel.sysrq=0 sysctl?-w?kernel.core_uses_pid=1 sysctl?-w?net.ipv4.conf.default.accept_redirects=0 #?如果希望屏蔽別人?ping?你的主機(jī),配置文件修改 net.ipv4.icmp_echo_ignore_all?=?1 #?編輯完成后,請執(zhí)行以下命令使變動(dòng)立即生效 /sbin/sysctl?-p /sbin/sysctl?-w?net.ipv4.route.flush=1
4. /sys 目錄
sysfs 偽文件系統(tǒng),輸出內(nèi)核識別出的各硬件設(shè)備的相關(guān)屬性信息,也有內(nèi)核對硬件特性的設(shè)定信息。有些參數(shù)是可以修改的,用于調(diào)整硬件工作特性。
4.1 udev
udev 是運(yùn)行用戶空間程序。
udev 通 /sys/ 路徑下輸出的信息動(dòng)態(tài)為各設(shè)備創(chuàng)建所需要設(shè)備文件。
udev 是 Linux 內(nèi)核的設(shè)備管理器,它取代了 udevadmin 和 ?hotplug,負(fù)責(zé)管理 ?/dev 中的設(shè)備節(jié)點(diǎn)。
udev 也處理所有用戶空間發(fā)生的硬件添加、刪除事件,以及某些特定設(shè)備所需的固件加載。
udev 為設(shè)備創(chuàng)建設(shè)備文件時(shí),會讀取其事先定義好的規(guī)則文件,一般在 /etc/udev/rules.d 及 /usr/lib/udev/rules.d 目錄下。
4.2 ramdisk 文件的制作
方法一
mkinitrd 命令
為當(dāng)前正在使用的內(nèi)核重新制作 ramdisk 文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
#?移動(dòng)ramdisk文件到/root目錄下 mv?/boot/initramfs-2.6.32...img?/root #?為當(dāng)前正在使用的內(nèi)核重新制作ramdisk文件 mkinitrd?/boot/initramfs-$(uname?-r).img?$(uname?-r)
方法二
dracut 命令
為當(dāng)前正在使用的內(nèi)核重新制作 ramdisk 文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
#?移動(dòng)ramdisk文件到/root目錄下 mv?/boot/initramfs-2.6.32...img?/root #?為當(dāng)前正在使用的內(nèi)核重新制作ramdisk文件 dracut?/boot/initramfs-$(uname?-r).img?$(uname?-r)
4.3 查看 ramdisk
#?使用file命令查看ramdisk文件發(fā)現(xiàn)是以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命令查看發(fā)現(xiàn)是以cpio存放的文本文件 file?initramfs-2.6.32-504.el6.x86_64.img #?解壓這個(gè)文本文件 #?之后會在initrd目錄下生成相應(yīng)的文件,一個(gè)微型的/root mkdir?initrd cd?initrd cpio?-id?../initramfs-2.6.32-504.el6.x86_64.img #?這個(gè)時(shí)候就可以查看init腳本文件了 cat?init #?在sbin文件中存放著相關(guān)的命令 ls?sbin
5. 編譯內(nèi)核
5.1 前提準(zhǔn)備
(1) 準(zhǔn)備好開發(fā)環(huán)境
包組(CentOS 6)
Server Platform Development
Development Tools
(2) 獲取目標(biāo)主機(jī)上硬件設(shè)備的相關(guān)信息
CPU
cat /proc/cpuinfo
x86info -a
lscpu
PCI 設(shè)備
lspci
-v
-vv
lsusb
-v
-vv
lsblk
了解全部硬件設(shè)備信息
hal-device
(3) 獲取到目標(biāo)主機(jī)系統(tǒng)功能的相關(guān)信息
(4) 獲取內(nèi)核源代碼包
www.kernel.org
5.2 簡易安裝內(nèi)核
簡易安裝
獲取當(dāng)前系統(tǒng)的安裝文件作為模塊安裝較為方便
修改相應(yīng)的參數(shù)即可
只適用于當(dāng)前特定的內(nèi)核版本
當(dāng)前系統(tǒng)的安裝文件在 config-2.6.32-504.el6.x86_64
簡單依據(jù)模板文件的制作內(nèi)核
#?下載對應(yīng)的Linux內(nèi)核版本進(jìn)行解壓縮 #?會在/usr/src目錄下創(chuàng)建debug、kernels和linux-3.10.67目錄 tar?xf?linux-3.10.67.tar.xz?-C?/usr/src #?為了方便多內(nèi)核共存,使用連接指向 #?會在當(dāng)前目錄下創(chuàng)建一個(gè)鏈接文件?linux?->?linux-3.10.67 cd?/usr/src ln?-sv?linux-3.10.67?linux #?創(chuàng)建模板 cd?linux #?查看鏈接指向的文件內(nèi)容 ls #?拷貝系統(tǒng)自帶的模板文件 cp?/boot/config-$(uname?-r)?.config #?打開圖形界面配置內(nèi)核選項(xiàng),選擇添加、刪除內(nèi)核模塊 #?添加的默認(rèn)選項(xiàng)來自.config配置文件 make?menuconfig #?使用screen來不中斷安裝 screen #?采用幾個(gè)線程進(jìn)行編譯 make?-j?n #?安裝內(nèi)核 make?modules_install #?make?install中將會安裝內(nèi)容 #?安裝bzImage為/boot/vmlinuz-VERSION-RELEASE #?生成initramfs文件 #?編輯grub的配置文件 make?install #?重啟系統(tǒng),并測試使用新內(nèi)核,不是默認(rèn)啟動(dòng)內(nèi)核 init?6
5.3 詳解編譯內(nèi)核
(1) 配置內(nèi)核選項(xiàng)
支持“更新”模式進(jìn)行配置
(a) make config:基于命令行以遍歷的方式去配置內(nèi)核中可配置的每個(gè)選項(xiàng)
(b) make menuconfig:基于 curses 的文本窗口界面
(c) make gconfig:基于 GTK 開發(fā)環(huán)境的窗口界面
(d) make xconfig:基于 Qt 開發(fā)環(huán)境的窗口界面
支持“全新配置”模式進(jìn)行配置
(a) make defconfig:基于內(nèi)核為目標(biāo)平臺提供的“默認(rèn)”配置進(jìn)行配置
(b) make allnoconfig: 所有選項(xiàng)均回答為”no“
(2) 編譯 - make [-j #]
如何只編譯內(nèi)核中的一部分功能
#?(a)只編譯某子目錄中的相關(guān)代碼 cd?/usr/src/linux make?dir/ #?(b)只編譯一個(gè)特定的模塊 cd?/usr/src/linux make?dir/file.ko #?例如:只為e1000編譯驅(qū)動(dòng) make?drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉編譯內(nèi)核
#?編譯的目標(biāo)平臺與當(dāng)前平臺不相同; make?ARCH=arch_name #?要獲取特定目標(biāo)平臺的使用幫助 make?ARCH=arch_name?help
如何在已經(jīng)執(zhí)行過編譯操作的內(nèi)核源碼樹做重新編譯
#?事先清理操作 #?清理大多數(shù)編譯生成的文件,但會保留config文件等 make?clean #?清理所有編譯生成的文件、config及某些備份文件 make?mrproper #?mrproper、patches以及編輯器備份文件 make?distclean
編輯:黃飛
?
評論
查看更多