內核體系設計分:單內核,微內核 windows是微內核設計。 Linux是單內核設計,但充分借鑒了為微內核體系的優點,為內核引入了模塊化機制。 內核的組成部分 kernel:內核核心,一般為bz壓縮的image文件,通常位於/boot目錄,名稱為vmlinuz VERSION release ker ...
內核體系設計分:單內核,微內核
windows是微內核設計。
Linux是單內核設計,但充分借鑒了為微內核體系的優點,為內核引入了模塊化機制。
內核的組成部分
kernel:內核核心,一般為bz壓縮的image文件,通常位於/boot目錄,名稱為vmlinuz-VERSION-release
kernel object:內核對象,即為內核模塊,一般放置於/lib/modules/VERSION-release目錄下
kernel和kernel object的版本號一定要完全一樣,才能正常使用。
[ ]:不編譯,不使用
[M]:編譯成模塊,不編譯進內核
[*]:直接編譯進kernel
ramdisk:輔助性文件,並非必須,這取決於內核是否能直接驅動rootfs所在的設備。
裡面放的是:
- 目標設備驅動,例如SCSI設備的驅動;
- 邏輯設備驅動,例如LVM設備驅動
- 文件系統,例如xfs文件系統
它是一個簡裝版的根文件系統
獲取內核版本信息的命令:uname
內核文件所在位置:/boot/vmlinuz-VERSION.release
獲取內核的release號:
# uname -r 2.6.32-754.el6.x86_64
獲取主機名:
# uname -n c610 # hostname c610
獲取內核已經裝載了哪些模塊:lsmod
顯示的信息來自/proc/modules文件
Module:模塊名字
size:大小
used by:被哪個模塊使用了,及被引用的次數
# lsmod
Module Size Used by
xt_CHECKSUM 12549 1
ipt_MASQUERADE 12678 3
nf_nat_masquerade_ipv4 13412 1 ipt_MASQUERADE
tun 31740 1
獲取模塊的詳細信息:modinfo NAME
即使模塊沒有被載入也可以獲得信息,類似rpm -ql
命令。
# modinfo xfs
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz
license: GPL
description: SGI XFS with ACLs, security attributes, no debug enabled
author: Silicon Graphics, Inc.
alias: fs-xfs
retpoline: Y
rhelversion: 7.6
srcversion: 799C7EBA4C499822FD1E465
depends: libcrc32c
intree: Y
vermagic: 3.10.0-957.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: B7:0D:CF:0D:F2:D9:B7:F2:91:59:24:82:49:FD:6F:E8:7B:78:14:27
sig_hashalgo: sha256
常用選項:
指定顯示的欄位:-F filed-name
# modinfo -F filename xfs /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz
顯示模塊文件的路徑:-n
# modinfo -n xfs /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz
如果有多個內核,顯示指定內核的信息:-k kernel
裝載/卸載模塊:modprobe
裝載模塊:
modprobe mode_name
# modprobe btrfs
卸載模塊:
modprobe -r mode_name
# modprobe -r btrfs
裝載/卸載模塊的另一組命令:
裝載模塊:
insmod file_name
裝載時使用模塊文件路徑。
# insmod /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz # insmod `modinfo -n xfs`
insmod和rpm類似,不能自動解決依賴關係。當你要裝載的模塊所依賴的模塊還沒有被裝載的化,裝載失敗。錯誤信息:Unknown symbol in module。 modeprobe可以自動解決依賴關係。
卸載模塊:
rmmod mode_name
卸載時,指定模塊的名字。
# rmmod xfs
生成模塊依賴關係文件:depmod
ramdisk文件的管理
不小心把/boot目錄下的initramfs-3.10.0-957.el7.x86_64.img文件刪除了,下次系統就不能啟動了,所以需要手動製作ramdisk文件。
創建ramdisk文件的命令:
centos5,6,7:mkinitrd
# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
/boot/initramfs-$(uname -r).img:指定ramdisk的文件名。
$(uname -r):指定kernel的release號
常用選項:
- 除了預設模塊之外,再安裝別的模塊到ramdisk里:--with=<module>
- 內核裝載ramdisk里的模塊前,預先裝載的模塊:--preload=<module>
centos6,7:dracut
kernel參數管理
修改kernel參數的作用:修改了kernel的參數,kernel的行為就發生變化了。
kernel的參數管理是用偽文件系統管理的,因為一切皆文件嘛,kernel參數也被抽象成了文件。
一,目錄/proc就是偽文件系統,kernel的參數在此存儲
- 所以查看kernel參數的值,就是用cat等命令查看/proc目錄下對應的文件即可。
- 所以修改kernel參數的值,就是用echo重定向/proc目錄下對應的文件即可。
- 當然也有專用的命令可以查看和修改kernel的參數。
查看當前運行的kernel的參數
查看內核的所有參數:sysctl -a
使用專用命令查看:
# sysctl abi.vsyscall32 abi.vsyscall32 = 1
使用文件系統的命令查看:
# cat /proc/sys/abi/vsyscall32 1
可以看出來參數是用點分隔的,把點換成/就找到了存儲此參數的文件的路徑。
例如,參數net.ipv4.ip_forward對應的文件的路徑就是:/proc/sys/net/ipv4/ip_forward
參數abi.vsyscall32對應的文件的路徑就是:/proc/sys/abi/vsyscall32
所以/proc/sys/目錄下存放的就是所有kernel參數了。
# ll /proc/sys
dr-xr-xr-x 0 root root 0 Feb 23 07:34 abi
dr-xr-xr-x 0 root root 0 Feb 23 07:31 crypto
dr-xr-xr-x 0 root root 0 Feb 23 07:34 debug
dr-xr-xr-x 0 root root 0 Feb 23 07:34 dev
dr-xr-xr-x 0 root root 0 Feb 23 07:31 fs
dr-xr-xr-x 0 root root 0 Feb 23 07:31 kernel
dr-xr-xr-x 0 root root 0 Feb 23 07:31 net
dr-xr-xr-x 0 root root 0 Feb 23 07:31 vm
修改當前運行的kernel的參數
使用專用命令修改:
# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
使用文件系統的命令修改:
# echo 0 > /proc/sys/net/ipv4/ip_forward # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0
上面的修改,僅在當前有效,重啟失效。所以配置文件登場
通過修改配置文件,讓kernel參數永久有效。
centos6:修改/etc/sysctl.conf
修改完文件後,不能立即生效。要想立即生效,可以使用:
sysctl -p [filename]
選項-p後,不給文件路徑的活,就是載入文件/etc/sysctl.conf文件。
修改/etc/sysctl.conf文件: net.ipv4.ip_forward = 1 # cat /proc/sys/net/ipv4/ip_forward 0 [root@c610 ~]# sysctl -p net.ipv4.ip_forward = 1 [root@c610 ~]# cat /proc/sys/net/ipv4/ip_forward 1
centos7:修改/etc/sysctl.d/*.conf文件
# emacs -nw /etc/sysctl.d/test1.conf net.ipv4.ip_forward = 0 # cat /proc/sys/net/ipv4/ip_forward 1 # sysctl -p /etc/sysctl.d/test1.conf net.ipv4.ip_forward = 0 # cat /proc/sys/net/ipv4/ip_forward 0
內核參數:net.ipv4.icmp_echo_ignore_all
- 0:別人發給我的ping請求,我回應,所以別人能ping通我
- 1:別人發給我的ping請求,我不回應,所以別人不能ping通我,但我還是可以ping別人。
二,目錄/sys也是偽文件系統
輸入kernel識別出的各個硬體設備的屬性信息,也有kernel控制硬體的參數,對此參數修改,即可定製硬體設備工作特性。
udev通過讀取/sys目錄下硬體設備信息,為硬體創建驅動程式(設備文件:/dev/xxx)。udev是用戶空間程式,工具是
devadmin
,hotplug
(熱插拔)kernel不知道,開機後,用戶還添加哪些硬體,所以就無法按需創建硬體驅動,所以,kernel2.4以前的做法就是把能知道的所以硬體設備驅動文件都放在/dev目錄下。這種做法,一是浪費空間,二是用戶不能通過/dev目錄下的文件來判斷當前系統上有哪些硬體設備。/sys目錄的出現,就能讓設備按需出現在/dev目錄。
udev為設備創建驅動程式時,會讀取事先定義好的規則文件
- centos7:一般在/etc/udev/rules.d/目錄,以及/usr/lib/udev/rules.d/目錄下。
- centos6:一般在/etc/udev/rules.d/目錄