Linux kernel簡介


內核體系設計分:單內核,微內核

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是用戶空間程序,工具是devadminhotplug(熱插拔)

    kernel不知道,開機后,用戶還添加哪些硬件,所以就無法按需創建硬件驅動,所以,kernel2.4以前的做法就是把能知道的所以硬件設備驅動文件都放在/dev目錄下。這種做法,一是浪費空間,二是用戶不能通過/dev目錄下的文件來判斷當前系統上有哪些硬件設備。/sys目錄的出現,就能讓設備按需出現在/dev目錄。

  • udev為設備創建驅動程序時,會讀取事先定義好的規則文件

    • centos7:一般在/etc/udev/rules.d/目錄,以及/usr/lib/udev/rules.d/目錄下。
    • centos6:一般在/etc/udev/rules.d/目錄
# c/c++ 學習互助QQ群:877684253 ![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg) # 本人微信:xiaoshitou5854


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM