Linux kernel簡介

来源:https://www.cnblogs.com/xiaoshiwang/archive/2020/02/23/12348885.html
-Advertisement-
Play Games

內核體系設計分:單內核,微內核 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是用戶空間程式,工具是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

本人微信:xiaoshitou5854


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以CentOS為例。 切換到root賬戶 檢查是否已安裝過jdk yum list --installed|grep jdk 或者java -version看下能不能執行。 如果已安裝過但jdk版本不符合要求,先yum remove卸載。 方式一、從軟體源下載安裝 1、列出可用的jdk yum li ...
  • 安裝PuTTY時自動安裝了PSFTP 使用PSFTP可以實現Winodws、Linux之間的文件傳輸。 打開PSFTP,輸入Linux的ip地址,輸入要登錄的用戶名、密碼 open Linux的ip地址 Windows向Linux傳文件: put D:\jdk-8u241-linux-x64.rpm ...
  • 頁式存儲管理 頁式存儲管理的基本原理 分頁存儲器將主存劃分成多個大小相等的頁架,受頁架尺寸限制,程式的邏輯地址也自然分成頁,不同的頁可以放在不同頁架中,不需要連續,頁表用於維繫進程的主存完整性 頁式存儲管理中的地址 頁式存儲管理的邏輯地址由兩部分組成,頁號和單元號,邏輯地址形式:頁號,單元號 頁式存 ...
  • Shell腳本命令的工作方式有兩種: 互動式(Interactive):用戶每輸入一條命令就立即執行。 批處理(Batch):由用戶事先編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多的命令。 一、編寫簡單的腳本 一個Shell腳本主要由三部分組成:腳本聲明、腳本註釋、腳本命令。 腳 ...
  • Yarn 對你的代碼來說是一個包管理器, 你可以通過它使用全世界開發者的代碼, 或者分享自己的代碼。Yarn 做這些快捷、安全、可靠,所以你不用擔心什麼。通過Yarn你可以使用其他開發者針對不同問題的解決方案,使自己的開發過程更簡單。 使用過程中遇到問題,你可以將其上報或者貢獻解決方案。一旦問題被修 ...
  • 方式一可以官方下載,安裝使用方式二使用 RT-Thread env工具,其中集成了scons工具env工具配置打開設置添加到右鍵菜單使用scons生成mdk5工程> scons --target=mdk5使用scons編譯> scons ...
  • 單片機的學習情況: 目 錄 第一講 初識、試用單片機……………………………..….……..… 第二講 讓 LED 舞起來……………………………………….……. 第三講 “開挖”單片機…………………………………….….….. 第四講 藉助定時器的單片機輸入輸出控制……………………… 第五講 八段數位管 ...
  • >test.txt set /p="Hello" <nul >>test.txt set /p=" world!" <nul 正文 平時,CMD中輸出一個字元串到文本文件,可使用echo,配合輸出重定向實現: echo "line1" > test.txt echo "line2" >> test. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...