1、列舉常見的內(nèi)核參數(shù)以及參數(shù)的意義
在Linux中,給kernel傳遞參數(shù)以控制其行為總共有三種方法:
1.build kernel之時的各個configuration選項。
2.當(dāng)kernel啟動之時,可以參數(shù)在kernel被GRUB或LILO等啟動程序調(diào)用之時傳遞給kernel。
3.在kernel運(yùn)行時,修改/proc或/sys目錄下的文件。
這里我簡單講的就是第二種方式了,kernel在grub中配置的啟動參數(shù)。
首先,kernel有哪些參數(shù)呢? 在linux的源代碼中,有這樣的一個文檔Documentation/kernel-parameters.txt,它介紹了kernel的各個參數(shù)及其意義。
其次,kernel啟動參數(shù)以空格分隔,而且是嚴(yán)格區(qū)分大小寫的(如:mem和MEM是不一樣的)。
再次,對于module特有的kernel參數(shù)寫法是這樣的,[module name].[parameter=XX],例如,igb.max_vfs=7這個kernel啟動參數(shù)的效果就是相當(dāng)于這樣來動態(tài)加載module: modprobe igb max_vfs=7
另外,kernel是怎樣處理這些啟動參數(shù)的呢? 啟動參數(shù)通常是這樣的形式: name[=value_1][,value_2]...[,value_10]
"name"是關(guān)鍵字,內(nèi)核用它來識別應(yīng)該把"關(guān)鍵字"后面的值傳遞給誰,也就是如何處理這個值,是傳遞給處理進(jìn)程還是作為環(huán)境變量或者拋給"init"。值的個數(shù)限制為10,你可以通過再次使用該關(guān)鍵字使用超過10個的參數(shù)。 首先,kernel檢查關(guān)鍵字是不是 'root=', 'nfsroot=', 'nfsaddrs=', 'ro', 'rw', 'debug'或'init',然后內(nèi)核在bootsetups數(shù)組里搜索于該關(guān)鍵字相關(guān)聯(lián)的已注冊的處理函數(shù),如果找到相關(guān)的已注冊的處理函數(shù),則調(diào)用這些函數(shù)并把關(guān)鍵字后面的值作為參數(shù)傳遞給這些函數(shù)。比如,你在啟動時設(shè)置參數(shù)name=a,b,c,d,內(nèi)核搜索bootsetups數(shù)組,如果發(fā)現(xiàn)"name"已注冊,則調(diào)用"name"的設(shè)置函數(shù)如name_setup(),并把a(bǔ),b,c,d傳遞給name_setup()執(zhí)行。 所有型如"name=value"參數(shù),如果沒有被上面所述的設(shè)置函數(shù)接收,將被解釋為系統(tǒng)啟動后的環(huán)境變量,比如"TERM=vt100"啟動參數(shù)就會被作為一個啟動后的環(huán)境變量。所有沒有被內(nèi)核設(shè)置函數(shù)接收也沒又被設(shè)置成環(huán)境變量的參數(shù)都將留給init進(jìn)程處理,比如"single"。
下面簡單總結(jié)一下我在工作中常用到的一些kernel啟動參數(shù)吧。
根磁盤相關(guān)啟動參數(shù):
root #指出啟動的根文件系統(tǒng) 如:root=/dev/sda1
ro #指定根設(shè)備在啟動過程中為read-only,默認(rèn)情況下一般都是這樣配的
rw #和ro類似,它是規(guī)定為read-write,可寫
rootfstype #根文件系統(tǒng)類型,如:rootfstype=ext4
Console和kernel log相關(guān)啟動參數(shù):
console #console的設(shè)備和選項,如:console=tty0 console=ttyS0
debug #enable kernel debugging 啟動中的所有debug信息都會打印到console上
quiet #disable all log messages 將kernel log level設(shè)置為KERN_WARNING,在啟動中只非常嚴(yán)重的信息
loglevel #設(shè)置默認(rèn)的console日志級別,如:loglevel=7 (0~7的數(shù)字分別為:KERN_EMERG,..,KERN_DEBUG)
time #設(shè)置在每條kernel log信息前加一個時間戳
內(nèi)存相關(guān)的啟動參數(shù):
mem #指定kernel使用的內(nèi)存量,mem=n[KMG]
hugepages #設(shè)置大頁表頁(4MB大小)的最多個數(shù),hugepages=n
CPU相關(guān)的啟動參數(shù):
mce # Enable the machine check exception feature.
nosmp? #Run as a single-processor machine.? 不使用SMP(多處理器)
max_cpus? #max_cpus=n, SMP系統(tǒng)最多能使用的CPU個數(shù)(即使系統(tǒng)中有大于n個的CPU)
Ramdisk相關(guān)的啟動參數(shù):
initrd #指定初始化ramdisk的位置,initrd=filename
noinitrd #不使用initrd的配置,即使配置了initrd參數(shù)
初始化相關(guān)啟動參數(shù):
init #在啟動時去執(zhí)行的程序,init=filename,默認(rèn)值為/sbin/init
PCI相關(guān)的啟動參數(shù):
pci #pci相關(guān)的選項,我常使用pci=assign_buses,也使用過pci=nomsi
SELinux相關(guān)啟動參數(shù):
enforcing #SELinux enforcing狀態(tài)的開關(guān),enforcing=0表示僅僅是記錄危險而不是阻止訪問,enforcing=1完全enable,默認(rèn)值是0
selinux #在啟動時關(guān)閉或開啟SELinux,selinux=0表示關(guān)閉,selinux=1表示開啟selinux
另外,還是用max_loop來指定最多可使用的回路設(shè)備。
在Redhat的系統(tǒng)中,還有個經(jīng)常看到的kernel啟動參數(shù)——rhgb,rhgb表示redhat graphics boot,就是會看到圖片來代替啟動過程中顯示的文本信息,這些信息在啟動后用dmesg也可以看到
rhgb = redhat graphical boot - This is a GUI mode booting screen with most of the information hidden while the user sees a rotating activity icon spining and brief information as to what the computer is doing.
quiet = hides the majority of boot messages before rhgb starts. These are supposed to make the common user more comfortable. They get alarmed about seeing the kernel and initializing messages, so they hide them for their comfort.
2、如何通過/proc查看top中展示的進(jìn)程狀態(tài)
top -b -n 1 |grep 進(jìn)程名|awk '{print "VIRT:"$5,"RES:"$6,"cpu:"$9"%","mem:"$10"%"}'
或者簡單的top -p 進(jìn)程id.
對應(yīng)proc使用方法
cat /proc/pid/status
Pid為進(jìn)程的pid
其中VmRss 對應(yīng) Rss;VmSize 對應(yīng) VSZ
3、分別用while、for循環(huán)檢測10.0.0.1/24網(wǎng)段存活的IP地址
使用for
#!/bin/bash
ip_add='10.0.0.'
for i in `seq 0 255`
do
ping -c 1 $ip_add${i} >/dev/null
? ? ? if [ $? -eq 0 ];then
? ? ? ? echo "$ip_add${i} is alive"
? ? ? else
? ? ? ? echo "$ip_add${i} is down"
? ? ? fi
Done
使用while
#!/bin/bash
ip_add='10.0.0.'
i=0
while [ $i -lt 255 ]
do
ping -c 1 $ip_add${i} >/dev/null
? ? ? if [ $? -eq 0 ];then
? ? ? ? echo "$ip_add${i} is alive"
? ? ? ? i=`expr $i + 1`
? ? ? else
? ? ? ? echo "$ip_add${i} is down"
? ? ? ? i=`expr $i + 1`
? ? ? fi
done
4、說明initrd的作用
initrd是“initial ramdisk”的簡寫。initrd一般被用來臨時的引導(dǎo)硬件到實際內(nèi)核vmlinuz能夠接管并繼續(xù)引導(dǎo)的狀態(tài)。
比如,使用的是scsi硬盤,而內(nèi)核vmlinuz中并沒有這個scsi硬件的驅(qū)動,那么在裝入scsi模塊之前,內(nèi)核不能加載根文件系統(tǒng),但scsi模塊存儲在根文件系統(tǒng)的/lib/modules下。為了解決這個問題,可以引導(dǎo)一個能夠讀實際內(nèi)核的initrd內(nèi)核并用initrd修正scsi引導(dǎo)問題。
initrd映象文件是使用mkinitrd創(chuàng)建的。mkinitrd實用程序能夠創(chuàng)建initrd映象文件。這個命令是RedHat專有的。其它Linux發(fā)行版或許有相應(yīng)的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd下面的命令創(chuàng)建initrd映象文件。