近來文章被踩的厲害,我只想把自己從馬哥學的知識自己總結下發到部落格裡,但是沒想到昨天一篇文章剛發一上午被踩了9次。。。如果您真的覺得我的文章很爛,請告訴我原因,不勝感激。
這星期,馬哥講了關於Linux核心的編譯和Linux的核心模組,淺顯易懂,所以寫出來和大家一起分享學習成果。首先說明,這隻是簡單的編譯,和手動添加模組,而這篇主要介紹linux的核心分類,和linux核心相關的兩個檔案夾/proc /sys 這是實現核心編譯和添加核心模組的理論基礎。
核心的分類:
1. 微核心:儘可能的保證核心的精簡,所有的裝置都需要安裝驅動程式(不知道這樣說準確否) 例如windows,你所有的裝置的驅動城區都是你後來裝的。
2. 單核心:裝置直接融入到核心中去。
linux屬於單核心,但是由於它巧妙的設計(可以這樣想,核心外表有很多“洞”用於串連模組),它可以將很多裝置做成模組,當需要時自動加入核心,由於是在核心中工 作,所以效率非常高。
從理論上來講,微核心是更先進的設計,但是到目前為止,它的優勢都沒有發揮出來,linux由於單核心的設計,所以造成了驅動程式難安裝,難研發。
Linux核心的分類
1.kernel 核心本身
還記得initrd嗎?它其實是產生的,從過/sbin/mkinitrd這個指令碼,在你安裝作業系統後,自動產生,用於輔助核心。
2.kernel object 核心對象(核心模組)
它們是以.ko結尾的檔案,所有的,ko檔案只能在核心載入。他們位於/lib/modules目錄 大小50M左右,核心將檔案系統和各種外圍驅動都做成模組放在這裡面,而且每一個 不同版本的核心都對應一個和核心版本名字相同的檔案夾存放對應的核心模組檔案###必須嚴格對應,否則會出錯
核心編譯時間選擇的選項不同,功能也不同
redhat提供了3個32位核心版本,2個64位核心版本
32位
kernel 最多支援32位cpu,最多支援4G記憶體
kernel:1G 啟動時kernel要佔去1G記憶體,留給進程的只有3G
process:3G
kernel-PAE 最多支援32顆對稱式多處理器,支援16G記憶體
單個進程只能最多3G記憶體,對
kernel-xen 支援基於xen半虛擬化 ,現在不支援,轉向KVM
64位:
kernel : 64個cpu, 512G
kernel-xen:126顆cpu,512G記憶體
以目前的技術可以支援到1T的記憶體
核心參數:
核心可以接受很多參數,例如grub.conf在啟動時傳遞給核心啟動等級。而在系統啟動並執行時候也可以傳遞核心參數,核心工作在核心空間,但是使用者程式工作在使用者空間所以需要通過使用者空間傳遞一些參數給核心,讓核心按我們的需要來工作。
那麼向核心傳遞參數,這就是今天這兩個檔案夾的作用。
他們的作用:
/porc 正在啟動並執行核心資訊映射
主要輸出:進程資訊
記憶體資源資訊
磁碟分割資訊等等
/sys
硬體裝置的驅動程式資訊
它們都是偽檔案系統,如果瞭解這些檔案的參數,並向裡面傳遞特殊數值,完全可以實現即時調整核心工作特徵和硬體工作特徵。
那麼我們開啟/proc目錄來查看裡面的內容,具體命令我就不寫了,這裡我只根據分類樹來介紹我學到的各個目錄的作用(通過顏色識別),如果您有興趣可以看下~
/proc/
1/cmdline 啟動進程的命令列命令及其參數是什麼
1/proc/cmdline gurb向核心傳遞的參數檔案,以後可以通過指令碼讀取它的參數,來判定啟動時向核心傳遞什麼資訊
1/maps 記憶體使用量資訊的映射
1/mem 記憶體資訊
1/io 讀寫
1/stat 進程資訊
1/status
acpi 進階隊員管理子系統相關資訊
asoud 聲音資訊
budyinfo 夥伴系統資訊,實現記憶體回收的子系統,防止記憶體片段
bus 系統硬體匯流排資訊
cpuinfo
crypto 加密
devices 當前系統上所有的字元裝置和塊裝置
diskstat 磁碟狀態資訊 (很難懂)
iostat 通過這個檔案可以查看它的資訊
dma 直接記憶體存取,實現記憶體與對應的磁碟裝置,直接映射以後,訪問將資料脫離cpu管理時,仍然可以從磁碟讀取到記憶體的一種
系統最佳化裝置
fb (frame buffer) 幀緩衝,對一些特殊的顯卡顯示裝置提供驅動。
filesystems 當前系統中啟用的所有檔案系統
/cpuset cpu分組,可以實現進程和cpu綁定,可以將它掛載來查看那捆綁資訊,它也是一個偽目錄
ide
fs
interruptes 中斷(硬終端,非強制中斷)
ioports 硬體IO連接埠資訊
loadavg 平均負載,uptime命令查看這個檔案
locks 檔案鎖,檔案進程不允許兩個進程同時寫檔案
molues 當前系統上正在時候的模組
mdstat RAID
meminfo 記憶體資訊
partitions 核心識別的分區資訊
schedstat 進程調度資訊
slabinfo 記憶體子系統資訊和budyinfo一樣
swaps 交換分區資訊
uptime uptime命令顯示的檔案
version `uname -r`
vmstat
zoneinfo 記憶體的分區資訊,Normal段 DMA段 BIOS段
/proc/sys 凡是輸出在sys目錄裡的資訊,都是可以通過調整他們的參數來管理核心
crypto
debug
dev
ls
fs
kernel
net
/ipv4 裡面都是可以調整的網路模組
/ icmp_echo_ignore_all 改為1別人就ping不同
ip_forward 用於定義如果主機上有兩塊網卡,或者一個網卡有兩個地址,並且在不同網路段,
它能啟用在兩個網路之間實現資料包路由(直連路由)轉寄功能。它可以決定你的
主機是否可以作為路由器或網關使用。預設為0
max_orphans 最大孤兒連結數
tcp_fin_timeout tcp fin資料包等待逾時時間
tcp_max_syn_backets 網路調優其實就是調這些參數
tcp_mem 緩衝大小
tcp_rmen 讀緩衝大小
tcp_ wmen 寫緩衝大小
tcp_reuse tcp的連結數是否可重用,多次時間重用
sunrpc
vm
/dorp_caches 用於釋放記憶體裡緩衝
區別哪些檔案可以傳遞參數:凡是有w許可權的都是可以傳遞參數的
如何調整核心參數檔案的值 一般在/proc/sys
1. 臨時調成(暫時有效,立即生效):
# echo > echo 1 > /proc/sys/net/ipv4/ip_forward #全路徑 # sysctl -w sysctl -w net.ipv4.ip_forward=1 #去掉/proc/sys 用.隔開
2. 永久有效,(但是設定好不是立即生效)
通過設定/etc/sysct1.conf,他是啟動時rc.sysinit讀取的核心參數
例如修改裡面的
net.ipv4.ip_forward = 1 #開啟路由轉寄功能
另外如果想使修改後的值立即生效
#sysctl -p
顯示當前啟動並執行所有生效的核心參數的值
#sysctl -a
#######這個檔案是系統工程師生涯的直觀重要的檔案