啟動和內核管理 :
CentOS 5和6的啟動流程
服務管理
Grub管理
自制Linux
啟動排錯
編譯安裝內核
-
CentOS 5和6的啟動流程
Linux系統的組成部分:內核+根文件系統
內核(kernel):進程管理,內存管理,完了協議棧,文件系統,驅動程序,安全功能
根文件系統(rootfs):程序和glibc
庫:函數集合,function,調用接口(頭文件負責描述)
過程調用:proceduce,無返回值
函數調用:function
程序:二進制執行文件
運行的系統環境可分為兩層:內核空間,用戶空間
用戶空間:應用程序(進程或線程)
內核空間:內核代碼(系統調用)
內核設計流派:
單內核設計(monolithic kernel):把所有功能集于同一個程序;
Linux
微內核設計(micro kernel):每種功能使用一個單獨的子系統實現
Windows,solarls
Linux內核特點:
支持模塊化:.ko(內核對象kernel object)
如:文件系統,硬件驅動,網絡協議…
支持內核模塊的動態裝載和卸載
組成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:輔助的偽根文件系統
CentOS5/boot/initrd-VERSION-release.img
CentOS6,7:/boot/initramfa-VERSION-release.img
模塊文件:/lib/modules/VERSION-release
CentOS系統的啟動流程:
1.PSOT:加電自檢,是BIOS功能的一個主要部分。負責完成對CPU,主板,內存,硬盤子系統,
顯示子系統,串并行接口,鍵盤。CD-ROM光驅等硬件情況的檢測
ROM:BIOS,Basic Iuput Output System,保存著有關計算機系統最重要的基本輸入輸出
程序,系統信息設置,開機加電自檢程序和系統啟動自舉程序等
RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定
2.Boot Sequence:
按次序查找引導設備,第一個引導程序的設備為本次啟動設備
bootloader:引導加載器,引導程序
Windows:ntloader,僅是啟動OS
Linux:
LILO:Linux LOader
GRUB:Grand Uniform Bootloader
centos 5:GRUB 0.x==>Grub Legacy(現名)
centos 7: GRUB 1.x==>Grub2(現名)
功能(Linux):提供一個菜單,運行用戶選擇要啟動的系統或不同的內核版本;把用戶選定的
內核裝載到RAM中的特定空間中,解壓,展開,而后把系統控制權移交給內核。
MBR:Master Boot Record
512bytes:
446bytes:bootloader
64bytes:分區別
2bytes:55AA
GRUB:
primary boot loader:1st stage 1.5 stage
secondary boot loader:2nd stage,分區文件
stage1:/boot/grub中的stage1的文件大小為512字節,它是引導扇區中引導程序(前446字節為引導程序)的備份文件,
功能是用來裝載 stage1.5或stage2
stage1.5:因為stage2較大,通常都是放在一個文件系統當中的,但是stage1并不能識別文件系統格式,所有才需要stage1.5
來引導位于某個文件系統當中的stage2,根據文件系統格式的不同,stage1.5也需要相應的文件,如:e2fs_stage1_5,fat_stage1_5
分別識別的ext和fat的文件系統格式,我的系統上stage1_5如下:
但是,當stage1加載1.5時,原則上是不認識ext文件系統的,應該也是無法找到1.5程序的,而實際上在安裝
grub時,程序已經把1.5程序寫到磁盤最前面的32k中,因為緊連著MBR的一段磁盤空間通常是空白無用的,
grub就把1.5程序寫到這個地方,這個地方沒有文件系統,stage1程序可以直接去加載1.5
stage2:grub能讓用戶以選項方式將OS加載,改變參數,修改選項等,這些都是stage2程序的功能。stage2可以去
獲取grub.conf等文件內容
3.kernel
自身初始化:
1.探測可識別的所有硬件設備
2.加載硬件驅動程序;(有可能會借助ramdick)
3.以只讀方式掛載根文件系統
4.運行用戶空間的第一個應用程序:/sbin/init
init程序的類型:
CentOS 5-:SysV init
配置文件:/etc/inittab
CentOS 6 :Upstart
配置文件/etc/inittab
/etc/init/*conf
CentOS 7 :Systemd
配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
ramdisk:
Linux內核的特性之一:使用緩沖和緩存來加速磁盤上的文件訪問
ramdisk—>ramfs 提高速度
CentOS 5:initrd,
工具程序:mkinitrd
CentOS 6 7:initramfs
工具程序:dracut,mkinitrd
總結:
系統初始化流程(內核級別):POST–>Boot Sequence(BIOS)–>BootLoader(MBR)–>kernel(ramdisk)–>rootfs(只讀readonly)–>/sbin/init()
/sbin/init:
CentOS 5-:SysV init
運行級別:為系統的運行或維護等目的而設定的機制
0-6:7個級別
0:關機。shutdown
1:單用戶模式(single user),root用戶,無須認證;維護模式
2:多用戶模式(multi user),會啟動網絡功能,但不會啟動DNS,維護模式
3:多用戶模式(multi user),完全功能模式;本文界面
4:預留級別;目前無特別使用目的,但習慣同3級別功能使用
5:多用戶模式(multi user),完全功能模式;圖形界面
6:重啟模式,reboot
默認級別:3,5
級別切換:init #
查看級別:runlevel ; who -r
命令顯示的第一個數字為上一次的運行級別,第二個數字為當前運行級別
配置文件:/etc/inittab
每行定義一種action以及與之對應的process
id:runlevels:action:process
id:一個任務的標識符
runlevels:在哪個級別啟動此任務;#,###,也可以為空,表示使用默認級別
action:在什么條件下啟動此任務
process:任務
action:
wait:等待切換此任務所在的級別時執行一次
respawn:一旦此任務終止時,就自動重新啟動之
initdefault:設定默認運行級別;此時process省略
sysinit:設定系統初始化方式,此處一般指定/etc/rc.d/rc/sysinit
例如;
l0:0:wait:/etc/rc.d/rc3
表示去啟動或關閉/etc/rc.d/rc3.d/目錄下的服務器腳本所控制服務;
K*:要停止的服務;K##*。優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉依賴的服務
S*:要啟動的服務;S##*。優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動
rc腳本:接受一個運行級別數字為參數
腳本框架:
for srv in /etc/rc.d/rc#.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc#.d/S*;do
$srv start
done
/etc/init.d/*(/etc/rc.d/init.d/*)腳本執行方式;
#/etc/init.d/SRV_SCRIPT{start|stop|restart|status}
#service SRV_SCRIPT{start|stop|restart|status}
chkconfig命令:管控/ect/init.d/每個服務器各級別下的啟動或關閉狀態
查看:chkconfig –list [name]
添加:chkconfig –add name
能被添加的服務的腳本的定義格式之一
#!/bin/bash
#chkconfig:LL NN NN
#Description:info
刪除:chkconfig -del name
修改指定的鏈接類型:
conkconfig [–level LEVELS] name <on|off|reset>
–level LEVELS:指定要控制的級別,默認為2345
創建服務腳本
將以前寫的一個腳本稍微修改下,變成一個服務腳本,
將此腳本移至/etc/init.d目錄下
#!/bin/bash #chkconfig:35 98 12 file=/var/lock/subsys/pingxiong start(){ if [[ -f $file ]];then echo "$file is exsit" else touch $file&&echo "start finshed" fi } stop(){ if [[ -f $file ]];then rm -rf $file &&echo "stop finshed" else echo "No such file" fi } status(){ if [[ -f $file ]];then echo "$file is running" else echo "$file is stoped" fi } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo "you should input {start|stop|restart|status}" esac
使用chkconfig命令添加此腳本
添加成功后在/etc/rc.d目錄下已自動增加了相應的軟鏈接文件
服務器啟用和關閉的優先級也自動對應(12 98)
可以用service pingxiong {start|stop|restart|status}啟用或關閉
這個簡單的腳本就算成功了(雖然沒什么用)
xinetd管理的服務
service命令:手動管理服務
service服務 start|stop|stop|restart
瞬態(Transient)服務被xinetd進程所管理
進入的請求首先被 xinetd代理
配置文件:/etc/xinetd.conf,/etc/xinetd/<service>
與libwrap.so文件鏈接
用chkconfig控制的服務
chkconfig SERVICE on|off
注意:正常級別下,最后啟動的一個服務S99local沒有鏈接值/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d/rc/.local(/etc/rc.;local)
腳本;因此,不便或不需寫為服務腳本的程序期望能開機啟動運行時,直接放置于此腳本文件即可
tty1:2345:respawn:/usr/sbin/mingetty tty1
….
tty6:2345:respawn:/usr/sbin/mingetty tty6
1.mingetty會調用login程序
2.打開虛擬終端的程序除了mingetty之外,還有諸如getty等
系統初始化腳本;/etc/rc.d/rc.sysinit
1.設置主機名
2.設置歡迎信息
3.激活udev和selinux
4.掛載/etc/fatab文件中定義的所有文件系統
5.檢測根文件系統,并以讀寫方式重新掛載根文件系統
6.設置系統時鐘
7.根據/etc/sysctl.conf文件的設置,來設置內核參數
8.激活lvm和軟raid設備
9.激活各swap設備
10.加載額外設備的驅動程序
11.清理操作
總結:(用戶空間的啟動流程):/sbin/init(/etc/inittab)
設置默認運行級別–>運行系統初始化腳本,完成系統初始化–>關閉對應級別下需要停止的服務,啟動對應級別下需要啟動的服務
–>設置登錄終端[–>啟動圖形終端]
CentOS 6 :
init程序:upstart,但依然為/sbin/init。其配置文:
/etc/init*.conf/inittab(僅用于定義默認運行級別);
注意:*.conf巍峨哦upstart風格的配置文件
CentOS 7 :
init程序:systemd;配置文件:/usr/lib/systemd/system/*, /etc/systemd/system/*
完全兼容SysV腳本機制;因此,service命令依然可用不過,建議使用sysytemctl命令來控制服務
sysytemctl {start….} name [.service]
示例:破解CentOS5 和6 的root口令
我們以往老師給我們的redhat 5為例
1.進入開機界面時按回車進入到如下界面
2.鍵入a鍵進入選擇修改內核參數,進入到如下界面
3.在命令行中輸入空格加數字1,出現如下界面
4.無須輸入帳號密碼進入系統中,且為root用戶登錄的,將密碼修改為自己的密碼,然后重啟系統
5.成功登錄進了redhat 5 系統(密碼破解成功)
grub legacy
CentOS 6啟動流程:
POST–>Boot Sequence(BIOS)–>Boot Loader–>kernel(ramdisk)–>rootfs–>switchroot–>/sbin/init
–>(/etc/inittab,/etc/init/*.conf)–>設置默認運行級別–>系統初始化腳本rc.sysinit–>關閉或啟動對應級別的服務
–>啟動終端[–>圖形終端]
GRUB:Grand Uniform Bootloader
centos5: GRUB 0.x ==>Grub Legacy(現名)
centos7 :GRUB 1.x===>Grub2(現名)
grub legacy:
stage1:mbr
stage1.5:mbr之后的扇區,讓stage1中的bootloader能識別是stage2所在的分區上的文件系統
stage2:磁盤分區(/boot/grub)
配置文件:/boot/grub/grub.conf <— /etc/grub.conf
stage及內核等通常放置于一個基本磁盤分區;
功用:
1.提供菜單,并提供交互式接口
e:編輯模式,用于編輯菜單
c:命令模式,交互式接口
2.加載用戶選擇的內核或操作系統
允許傳遞參數給內核
可隱藏此菜單
3.為菜單提供了保護機制
為編輯模式進行認證
為啟用內核或操作系統進行認證
如何識別設備:
(hd#,#)
hd#:磁盤編號,用數字表示;從0開始編號
#:分區編號,用數字表示;從0開始編號
(hd0,0):第一個磁盤的第一個分區
grub的命令行接口
help:獲取幫助列表
help keyword:詳細幫助信息
find (hd#,#0) /path/to/somefile
root (hd#,#)
kernel /path/to/kernel_file:設定本次啟動時用到的內核文件;額外還可以添加許多內核支持的的cmdline參數
例如:max_loop=100 selinux=0 init=/path/to/init
initrd /path/to/initramfs_file:設定為選定的內核提供額外文件的ramdisk
boot:引導啟動選定的內核
手動在grub命令行接口啟動系統
第一步:在此界面鍵入c鍵,
第二步:在命令行中輸入命令
grub> root(hd#,#)
grub>kernel /vilinuz-version-release ro root=/dev/device
grub>initrd /initramfs-version-release.img
grub>boot
第三步:進入到登錄界面
grub legacy配置文件
/boot/rgub/grub.conf
我的grub legacy配置文件做過修改了,和原裝的有一些配置沒了
參數如下:
default=#:設定默認啟動的菜單項;菜單項(title)編號從0開始
timeout=#:指定菜單項等待選項選擇的時長
splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜單背景圖片文件路徑
hiddenmenu:隱藏菜單
password [–md5] STRING:啟動菜單編輯認證
tutle TITLE:定義菜單項“標題”,可出現多次
root(hd#,#):grub查找stage2及kernel文件所在設備分區;為”grub“的根
kernel:/PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核
initrd:/PATH/TO/INITRAMFS_FILE:內核匹配的ramfs文件
password [–md5] STRING:啟動選項的內核或操作系統是進行認證
grub加密
grub-md5-crypt命令
破解root口令:
啟動系統時,設置其運行級別為1
進入單用戶模式:
1.編輯grub菜單(選定要編輯的title,而后使用e命令)
2.在選定的kerne后附加1,s,S或single都可以
3.在kernel所在行,鍵入”b“命令
和上面的破解案例的效果是一樣的,這里就不演示了
grub安裝
安裝grub:
1.grub-install
安裝grub stage1和stage1.5到/dev/DISK磁盤上,并復制GRUB相關文件到DIR/boot目錄下
grub-install -root-directory=DIR /dev/DISK
2.grub
grub> root (hd#,#)
grub> setup(hd#)
實驗1:破壞stage1,然后修復
1.要破壞stage1,只需要破壞第一磁盤的第0扇區的前446字節即可
2.reboot重啟系統,因為引導程序被破壞了,所以系統直接進入了光盤引導界面,我們選擇救援模式(Rescue installed system)
3.在進入到就救援模式系統中,會有一些列的選項,例如選擇語言,是否開啟網絡等等,這里就
一一截圖了,一系列選項選完了進入到如下界面
4.因為此時是光盤引導登錄的,要到root環境下,需要切換到/mnt/sysimage
5.安裝grub,可將grub stage1安裝到磁盤上,如出現以下Unknown partition table signature
不要慌(第一次遇到慌得要死,到處找錯誤….),這是正常現象,耐心等待即可!
6.輸入exit兩次,退出選擇重啟
7.到了登錄界面,修復成功
實驗2:破壞stage1.5,然后修復
-
前文有講到stage1.5在第一磁盤的第0扇區的前32k中,而MBR占用了前面的512字節,
所以需要破壞512字節后的內容即可
2.reboot重啟,stage1.5被破壞了,系統界面如下,我們切換到光盤引導界面
3.選擇Rescue installed system
4.默認選擇英文
5.默認選擇us鍵盤
6.是否開啟網絡接口,可根據自己的實際情況選擇,我這里選擇不開網絡接口
7.進入到Rescue界面,選擇Continue
8.系統掛載在/mnt/sysimage下,如果要進入到root環境,運行chroot /mnt/sysimage命令
9.系統已掛載在/mnt/sysimage下
10.三種選項:shell 進入命令行模式;fakd是診斷模式;reboot重啟電腦;我們這里選擇shell
11.進入shell界面,切換到root環境
12.安裝grub,可將grub stage1安裝到磁盤上,使用命令:grub-install /dev/sda
13.輸入兩次exit退出,選擇reboot重啟
14.進入登錄界面,修復成功
實驗3:刪除boot目錄
-
刪除/boot目錄下內容,然后卸載/boot,然后刪除/boot目錄
2.進入如下界面。
3.重啟選擇光盤引導進入救援模式,上面兩個例子,已經詳細講述了這么進入救援模式,限于篇幅,
在這里就不重復寫了,直接進入到救援模式界面(詳細步驟參照上面案例)
4.因為這里刪除的stage2,所以只使用grub安裝時無法修復的,內核也修要重新安裝,要安裝內核需要先掛載光盤
在安裝內核的時候加上–force選項強制安裝
5.內核安裝好了 ,安裝grub
6.編輯/boot/grub/grub.conf文件,保存退出
7.鍵入exit兩次,選擇reboot重啟系統
8.進入登錄界面,登錄成功
實驗四:刪除/boot目錄和/etc/fatab文件,然后修復系統!
1.刪除/boot和/etc/fstab,然后重啟系統
2.進入到救援模式,詳細步驟就不寫了因為/etc/fstab刪了,各分區沒有自動掛載,所有我們首先要掛載分區
但是我們的分區使用邏輯卷做的,所以要先找到邏輯卷并啟用!
3.在生產環境中,我看你不知道顯示的分區中,那個是/,/boot,/usr…所有我們首先將這些分區隨便掛載在一個目錄下,然后通過目錄訪問
磁盤分區內容來判斷此分區究竟是什么分區,然后在/根分區里面編輯/etc/fatab文件,內容如下,任何reboot重啟
4.然后就是安裝內核和grub了
5.編輯/boot/grub/grub.conf文件,編輯內容如下:
6.exit退出,reboot重啟,修復中……
7.修復成功
自制Linux系統
1.分區并創建文件系統
2.掛載分區
3.安裝grub(注意安裝位置,root位置)
4.恢復內核和initramfs文件
5.建立grub.conf /mnt/boot/grub/grub.conf
備注:此處的root=/dev/sda2是因為此磁盤會單獨作為一個Linux的磁盤,到時候會自動讀取為/dev/sda
二,/dev/sda1為boot分區,所有root=/dev/sda2
5.創建一級目錄
6.:
復制bash 和相關 庫文件
復制相關命令及相關庫文件
如:ls,cat, vim,reboot,hostname,bash等 利用之前的腳本
7.新建一個虛擬機,將/dev/sdb當作此虛擬機的磁盤,啟動系統,如下
一個超簡易的linux就完成了!!大部分命令都是可以使用的!
如果系統出現了什么故障,導致無法啟動,或者一些配置文件的丟失,損壞,
都可進入到救援模式中,
系統在引導期間,很重要的一個過程就是init 進程讀取其配置文件/etc/inittab ,
啟動系統基本服務程序及默認運行級別的服務程序完成系統引導,如果/etc/inittab 誤刪除
或修改錯誤,Linux 將無法正常啟動。此時,只有通過救援模式才可以解決此類問題。
有備份文件的回復方法
沒有備份文件的恢復辦法
有備份文件的恢復辦法:
進入救援模式,執行chroot 命令后,如果有此文件的備份(強烈建議系統中的重要數據目錄
,如/etc 、/boot 等要進行備份),直接將備份文件拷貝回去,退出重啟即可。如果是
配置文件修改錯誤,如比較典型的/boot/grub/grub.conf及/etc/passwd 的文件修改錯誤
,也可以直接修正恢復。假設有備份文件/etc/inittab.bak ,則在救援模式下執行:
sh-3.1# chroot /mnt/sysimage
sh-3.1# cp /etc/inittab.bak /etc/inittab
沒有備份文件的恢復辦法
如果一些配置文件丟失或軟件誤刪除,且無備份,可以通過重新安裝軟件包來恢復
,首先查找到/etc/inittab 屬于哪一個RPM包
# chroot /mnt/sysimage
# rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64
退出chroot 模式 :
# exit
掛載存放RPM 包的安裝光盤(在救援模式下,光盤通常掛載在/mnt/source 目錄下):
# mount /dev/sr0 /mnt/source
CentOS6 系統的RPM 包存放在光盤Package 目錄下,要修復的硬盤系統的根目錄在
/mnt/sysimage 下,需要使用–root 選項指定其位置。覆蓋安裝/etc/inittab 文件
所在的RPM 包:
# rpm -ivh –replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
其中的rpm 命令選項“–replacepkgs”或者–force 表示覆蓋安裝,執行完成
后,即已經恢復了此文件
如果想只提取RPM 包中的/etc/inittab 文件進行恢復,可以在進
入救援模式后,執行命令 :
# rpm2cpio /mnt/source/Packages/initscripts-9.03.49-
1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab
# cp etc/inittab /mnt/sysimage/etc
注意此命令執行時不能將文件直接恢復至/etc 目錄,只能提取到當前目錄下,
且恢復的文件名稱所在路徑要寫完整 的路徑 。提取文件成功后,將其復制到根分
區所在的/mnt/sysimage 目錄下相應位置即可
linux內核的組成部分:
1.kernel:內核核心,一般為bzlmage,通常位于/boot目錄,名稱為vmlinuz-VERSION-release
2.kernel object:內核對象,即內核模塊,一般放置于/lib/modules/VERSION-release/
內核模塊內核核心版本一定要嚴格匹配;
[ ] :N
[ M]:Module
[*] :Y,編譯進內核核心
內核:動態裝載和卸載
3.ramdisk:輔助性文件,并非必須,這取決于內核是否直接驅動rootfs所在的設備;
目標設備驅動,例如SCSI設備的驅動
邏輯設備驅動,例如LVM設備的驅動
文件系統,例如xfs文件系統
ramdisk:是一個簡裝版的根文件系統;為了讓內核找到真正的根文件系統
內核信息查看:
uname命令
-r:內核的release號
-n:顯示當前主機名
-a:顯示所有信息
模塊信息獲取和管理:
lsmod:顯示模塊信息
來自cat /proc/modules 信息
modinfo命令:顯示一個內核模塊的信息
-F file:僅顯示指定自動的信息
-n:顯示文件路徑
modprobe命令:模塊的動態裝載和卸載
格式:modproe [-r] module_name(帶r選項是卸載,不帶是裝載)
depmod命令:內核模塊依賴關系文件的生成工具;
模塊的裝載和卸載的另一組命令:
insmod命令:
insmod [filename] [module options…](完整路徑)
例:insmod 'modinfo -n btrfs'
rmmod命令:
rmmod [module_name]
例:rmmod btrfs
ramdisk文件的管理:
1.mkinitrd命令
為當前使用中的內核重新制作ramdisk文件
–with=<module>:除了默認額模塊之外需要裝載至initramfs中的模塊
-preload-<module>:initramfs所提供的模塊需要預先裝載的模塊
實例:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
2.dracut命令
dracut [OPTION…] [<image> [<kernel version>]]
實例:dracut /boot/initramfs-$(uname -r ).img $(uname -r )
內核信息輸出的偽文件系統:
/proc:內核狀態和統計信息的輸出接口;同時還提供一個配置接口。/proc/sys;
參數:
只讀:信息輸出;例如/proc/#/*
只寫:可接受用戶指定一個“新值”來實現對內核某功能或特性的配置;/proc/sys/
/proc/sys:
net/ipv4/ip_forward相當于net,ipv4.ip_forward
1.sysctl命令
專用于查看或設定/proc/sys命令下參數的值;
sysctl [options] [varilable=value]
查看:
#sysctl -a
#sysctl variable
cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
修改其值:
#sysctl -w variable=value
2.文件系統命令(cate,cho命令)
查看:
cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
修改:
echo “ VALUE” >/proc/sys/PATH/TO/SOME_KERNEL_FILE
注意:上述兩種方式的設定僅當前運行內核有效;
配置文件:/etc/sysctl.conf, /etc/sysctl.d/*.conf
立即生效的方式: sysctl -p [/PATH/TO/CONFIG_FILE]
內核參數:
net.ipv4.ip_forward:核心轉發
vm
kernel.hostname:主機名
net.ipv4icmp_echo-ignore_all:忽略所有ping操作
/sys目錄:
sysfs:輸出內核識別出的各硬件設備的相關屬性信息,也有內核對硬件特性的可設置參數;對此些參數的修改,即可定制硬件設備工作特性
udev:通過讀取/sys目錄下的硬件設備信息按需為各硬件設備創建設備文件
udev是用戶空間程序,專用工具:devamdin,hotplug;
udev為設備創建設備文件時,會讀取其實現定義好的規則文件,一般在/etc/udev/rules.d/目錄下。以及/usr/lib/udev/rules.d/目錄下
內核編譯
程序包的編譯安裝:
./configure ,make,make install
編譯內核前提:開發環境(開發工具,開發庫),頭文件:/usr/include
前提:
1.準備好開發環境
2.獲取目標主機上硬件的相關信息
3.獲取到目標主機系統功能的相關信息,例如要啟用的文件系統
4.獲取內核源代碼
1.準備開發環境
centos 6 7:
包組:
Devrlopment Tools
Server platfrom Development
centos 7:
包組:
Devrlopment Tools
Server platfrom Development
具體命令
yum groupinstall "Development tools" "Server Platform Development"
2.獲取目標主機上的硬件上的相關信息
CPU:
cat /proc/couinfo
lscup
x86info -a (查看更詳細的信息,但是此命令需要安裝),如下
yum install x86info
PCI設備:
lspci命令:
-v:顯示詳細信息
-vv:顯示更詳細信息
lsusb命令:
-v:顯示詳細信息
-vv:顯示更詳細信息
lsblk命令
了解全部硬件設備信息
hal -device
3.不做深入了解
4.內核編譯過程
步驟如下:
1.tar xf linux-3.18.41.tar.xz -C /usr/src
2.cd /usr/src
3.ln -sv linux-3.18.41 linux
4.cd linu
5.make menuconfi 配置內核選項
6.make 編譯內核,可使用-j指定編譯線程數量
7.make modules_install 安裝內核模塊
8.make install 安裝內核
重啟系統,選擇使用新內核
詳細如下:
1.下載一個新內核,然后解壓到指定目錄下,通常在/usr/src目錄
tar xf linux-3.18.41.tar.xz -C /usr/src
2.cd /usr/src,進入到此目錄
3和4 . 給生成的目錄創建軟鏈接文件,進入到此目錄
ln -sv linux-3.18.41 linux
5.配置內核選項
如果不知道編譯內核時要選擇那些選項,可參照/boot/config-2.6.32-642.el6.x86_64
cp /boot/config-2.6.32-642.el6.x86_64 .config
配置內核選項有很多選項,后面會做詳細解說,此次博客簡單了解,如下
6.因為編譯內核時間太長,未免出現意外,我們使用screen命令,之前博客有提到,這里不做詳細說明
我們在終端是使用screen命令,然后在會話中執行make命令編譯,即使此終端意外斷開,再次連接終端后,
進入screen中,編譯不會斷開,會保持編譯中狀態中…
命令如下:
screen make
7.安裝內核模塊
執行命令
make modules_install
最后竟然報錯了 ,在網上查找時,說是內存不夠,然后就增加了一個swap分區,并啟用,看是否能夠正常安裝內核模塊?
重新安裝內核模塊結果如下,沒有報錯,看來就是內存的原因了
8.安裝內核,然后reboot重啟,新內核無法讀取,只顯示了原內核,發現/boot/grub/gurb.conf文件中沒
有自動生成新內核條目,以下為手動添加,在重啟,新內核顯示了,且內核版本為3.18.41,內核編譯成功
以上出現的問題還需研究?。?/p>
原創文章,作者:qiuwei,如若轉載,請注明出處:http://www.www58058.com/45873