近來文章被踩的厲害,我隻想把自己從馬哥學的知識自己總結下發到部落格裡,但是沒想到昨天一篇文章剛發一上午被踩了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. 臨時調成(暫時有效,立即生效):
view plain copy to clipboard print ?- # 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
#######這個檔案是系統工程師生涯的直覺重要的檔案
http://www.ahbank.org/