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
編輯:黃飛
?
評論
查看更多