Boot Loader:認識操做系統的文件格式,並據以加載核心到主存儲器執行。LILO(早期)、grub(如今主流)、spfdisk(臺灣)linux
BIOS:(Basic Input Output System)"基本輸入輸出系統"。其實,它是一組固化到計算機內主板上一個ROM芯片上的程序,它保存着計算機最重要的基本輸入輸出的程序、系統設置信息、開機後自檢程序和系統自啓動程序。 其主要功能是爲計算機提供最底層的、最直接的硬件設置和控制。vim
CMOS:(Complementary Metal Oxide Semiconductor),互補金屬氧化物半導體,常指保存計算機基本啓動信息(如日期、時間、啓動設置等)的芯片。有時人們會把CMOS和BIOS混稱,其實CMOS是主板上的一塊可讀寫的RAM芯片,是用來保存BIOS的硬件配置和用戶對某些參數的設定。windows
PnP設置:(plugin and play)PNP是由Microsoft提出的,意思是系統自動偵測周邊設備和板卡並自動安裝設備驅動程序,作到插上就能用,無須人工干預,是Windows自帶的一項技術。centos
MBR:(master boot record)主要啓動記錄區,每一個開機裝置的第一個啓動扇區bash
INT 13:直接經過控制磁盤控制器來訪問磁盤,但這樣就要涉及許多的硬件細節,如是OS們都藉助於BIOS的int 13h中斷例程來訪問磁盤.網絡
SATA:(Serial Advanced Technology Attachment),是由Intel、IBM、Dell、APT、Maxtor和Seagate公司共同提出的硬盤接口規範。ide
IDE:(Integrated Drive Electronics)即「電子集成驅動器」,俗稱PATA並口。工具
/boot/vmlinuz or /boot/vmlinuz-verson ----核心檔案測試
/lib/modules ----模塊的放置位置(驅動程序多以模塊的方式存在,/lib和/必須在同一分區)ui
/boot/initrd or /boot/initrd-verson ----虛擬文件系統 ,可以透過boot loader加載到內存仿真成一個根目錄,該文件系統還可提供一直程序加載開機過程須要的核心模塊(驅動程序)
/etc/inittab ----/sbin/init的配置文件,包含runlevel等設定項目
/etc/rc.d/rc.sysinit ----這個腳本在加載各項系統服務前設定好系統環境(不一樣的發行版可能會不一樣)【1-12】
/etc/rc.d/rc.local ----用戶自定義的開機啓動腳本
/etc/sysconfig/ ----開機過程涉及到的配置文件
/etc/sysconfig/modules/ ----用戶自定義加載的模塊的位置
/etc/modprobe.conf ----對應自定義模塊的配置文件(系統發現驅動程序錯誤時咱們才須要手動處理),更多信息:man modprobe.conf
/boot/vmlinuz or /boot/vmlinuz-verson ----..核心
/boot/initrd or /boot/initrd-verson ----..核心解壓縮須要藉助的虛擬文件系統
/lib/modules/version/kernel or /lib/modles/$(username -r)/kernel
/usr/src/linux ----核心原始碼,預設不會安裝
/proc/verson ----核心版本
/proc/sys/kernel ----系統核心功能
1 . linux的開機流程分析
1.1開機流程一覽【1-0】
1.2BIOS,boot loader與kenel載入
1.1.1BIOS,開機自測與MBR
1.1.2Boot Loader的主要功能
注意:每一個文件系統(扇區)都會保留一個boot sector(啓動扇區)提供給操做系統安裝boot loader,若是一個系統安裝在A分區,那麼MBR和A分區的boot loader中都會保存一份boot loader.【1-1】
一:提供選單
二:載入核心檔案
三:轉交其它loader
【開機管理程序的選單功能與控制權轉交功能示意圖 1-2】
1.1.3加載核心偵測硬件與initrd的功能
注意:linux將核心解壓縮到主存儲器後開始接管BIOS後的工做,利用核心的功能偵測驅動周邊裝置。核心會從新偵測一遍硬件,不必定會用到BIOS偵測的硬件信息。
# ls --format=single-column -F /boot ----觀察與核心相關的文件【1-3】
【 BIOS與boot loader及核心加載流程示意圖 1-4】
1.現將/boot/initrd複製到/tmp/initrd中,等待解壓縮
# mkdir /tmp/initrd
# cp /boot/initrd-2.6.18-92.el5.img /tmp/initrd/
# cd /tmp/initrd
# file initrd-2.6.18-92.el5.img ----查看該文件的格式,發現時gzip壓縮格式
2.將上述檔案解壓縮
# mv initrd-2.6.18-92.el5.img initrd-2.6.18-92.el5.gz ----改爲文件名改成.gz結尾,這樣一來解壓縮軟件就能夠識別了
# gzip -d initrd-2.6.18-92.el5.gz ----解壓縮
# file initrd-2.6.18-92.el5 ----查看該檔案的類型信息,發現是cpio指令壓縮成的
3.用cpio指令解壓縮
# cpio -ivcdu < initrd-2.6.18-92.el5 ;ll ---解壓換個文檔看看虛擬恩建系統是什麼樣子的【1-5】
4.觀察init檔案內重要的執行項目
# cat /tmp/initrd/init ----【1-6】
1.3第一支程序Init及配置文件/etc/inittab與runlevel
1.3.1Run level:執行等級有哪些【1-7】
# cat /etc/inittab ----【1-8,9】
【1-10 inittab的檔案語法】
1.3.2init的處理流程和簡單設置方法【1-11】
1.4init處理系統初始化流程(/ec/rc.d/rc.sysinit)
# cat /etc/rc.d/rc.sysinit ----查看各類服務啓動以前系統的的初始化工做【1-12】
1.5啓動系統服務與相關啓動配置文件(/etc/rc.d/rc N & /etc/sysconfig)
# ll /etc/rc5.d/ ----觀察run level爲5時系統服務的啓動狀況(能夠觀察一下/etc/init.d/rc這個腳本)
1.6用戶自定義開機啓動程序(/etc/rc.d/rc.local)
注意:一種比較麻煩的方法是將自定義的腳本放到/etc/init.d/下,而後在/etc/rc5.d/下創建連結檔,下面給出一般的簡單的方式
# vim /etc/rc.d/rc.local ----該文檔由/etc/rc.d/rc.sysinit在系統初始化時調用
1.7根據/etc/inittab之設定,加載終端機或x-windows接口【1-14】
1.8開機過程會用到的主要配置文件:/etc/modprobe.conf,/etc/sysconfig/*
1.8.1關於模塊:/etc/modprobe.conf【1-15】
1.8.2/etc/sysconfig/*【 1-16 幾個重要配置文件介紹】
1.9Runlevel的切換:runlevel,init
注意:# init 0 ----實現關機;# init 6實現重啓
# renlevel ----查看主機目前的run level
# init 3 ----暫時切換run level爲3(若是想在下次開機時依然生效須要修改/etc/inittab)
# runlevel ----查看變化
2 .核心與核心模塊
/boot/vmlinuz or /boot/vmlinuz-verson ----..核心
/boot/initrd or /boot/initrd-verson ----..核心解壓縮須要藉助的虛擬文件系統
/lib/modules/version/kernel or /lib/modles/$(username -r)/kernel
/usr/src/linux ----核心原始碼,預設不會安裝
/proc/verson ----核心版本
/proc/sys/kernel ----系統核心功能
/lib/moduels/$(uname -r)/modules.dep ----記錄了核心支持的模塊的各項相依相
2.1核心模塊與相依性:depmod
# ll /lib/moduels/$(uname -r)/kernel ----查看核心目下的子目錄【1-18】
depmod 創建核心模塊相依性檔案的指令【1-19】
案例一:假設作好了一個網卡驅動程序a.ko,更新核心相依性
# cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net ----將驅動模塊放入相應的文件夾中(系統給了特殊定義的文件夾)
# depmod ----該指令會將使以前作好的程序移動到標準放置目錄,並依據相關目錄的定義將全部模塊捉出來分析,最後將分析的結果寫入/lib/moduels/$(uname - r)/modules.dep文檔中
2.2核心模塊的觀察:lsmod,modinfo
# lsmod ----查看目前核心加載的所有模塊,顯示格式(模塊名稱 模塊大小 被誰使用)【1-20】
# modinfo mi ----查看模塊mi的詳細信息,能夠看到這個模塊的來源以及模塊的說明,該指令還能夠查看模塊的檔案(須要完整檔名)
2.3核心模塊的加載與移除:insmod,modprobe,rmmod
insmod 手動加載模塊指令,要求後面跟模塊(建議使用modprobe,會主動檢查模塊依賴性)
# insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko ---手動載這個文件系統相關的模塊,後面必須是(不會自動檢查模塊的依賴性)
# lsmod | grep cifs ----看看是否手動載入成功
rmmod 手動移除模塊,若是有依賴問題將沒法移除【1-22】
# rmmod cifs ----將剛剛加載的模塊移除
modprobe 取代insmod和rmmod,自動解決依賴問題
# modprobe cifs ---- 加載cifs文件系統模塊(不須要完整的檔名,由於完整文件名記錄在/lib/mudules/`uname -r`/modules.dep,而該指令會自動搜尋這個文件)【1-23】
# modprobe -r cifs ----移除這個模塊
案例一:手動加載vfat這二個模塊,而後觀察vfat依賴的模塊
# modprobe vfat ----加載模塊
# lsmod | grep vfat ----觀察發現是fat
2.4核心模塊的額外參數設定:/etc/modprobe.conf
案例一:兩個網絡卡使用贊成該模塊,設置額外的模塊參數防止衝突
# vi /etc/modprobe.conf
alias eth0 ne ----eth0網卡使用ne這個模塊
alias eth1 ne ----eth1網卡也使用這個模塊
options eth0 io=0x300 irq=5 ----強制指定io基地址和中斷請求
options eth1 io=0x320 irq=7
注:查看系統資源配置信息
# cat /proc/interrupts ---- 列出正在使用的IRQ(共16條IRQ請求線)中斷資源
# cat /proc/ioports ----列出正在使用的io端口地址
# cat /proc/dma ----列出正在使用的dma(直接存儲器存取,DMA0-7)通道
3 .Boot loaler:Grub
3.1boot loader的兩個stage
stage1:執行MBR或者boot loader中的最小主程序(只有446bytes的存儲空間,只有最小主程序存儲在裏面)
stage2:主程序加載配置文件(通常來講都在/boot/下面)
# ls -l /boot/grub ----查看與grub有關的配置文件【1-24】
3.2grub的配置文件/boot/grub/menu.lst與選單類型:磁盤代號,menu.lst
注意:grub是目前應用最普遍的開機管理程序,它的特色:【1-25】
3.2.1硬盤與分割槽在grub中的代號【1-26】
案例:假設系統中只有一顆sata硬盤,該硬盤的第一個邏輯分割槽在Linux與grub當中的代號和檔名【1-27】
檔名:/dev/sda5 grub中的代號:(hd0,4)
3.2.2/boot/grub/menu.lst配置文件
# vim /boot/grub/menu.lst ----看看grub的配置文件【1-28,29】
3.2.2.1選單中提供的兩種開機方式
第一種:直接指定核心開機(以/boot獨立分區的情形爲例)
# vim /boot/grub/menu.lst
title CentOS(2.6.18-92.el5) ---- 設置這個選單的標題
root (hda0,0) ----root指核心檔案所在的分區而不是根目錄所在分區,這裏指的是第一塊硬盤的第一個分區(/boot在/dev/hda1爲獨立分區)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite ----指出核心檔名和根目錄掛載的分區(/1指的是/dev/hda2),rhgb指色彩顯示,quite是安靜模式
initrd /intrd-2.6.18-92.el5.img ----這裏指出虛擬文件系統的檔名
或者
title CentOS(2.6.18-92.el5)
kernel (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite
initrd (hda0,0) /intrd-2.6.18-92.el5.img
注:/boot獨立分區和非獨立分區各給出一個案例【1-30】
第二種:利用chain loader轉角控制權的方式
# vim /boot/grub/menu.lst
title windows partition ----該案例針對裝在/dev/hda1上的windows
root (hd0,0) ----指出chain loader在第一塊硬盤的第一個分割槽內
chainloader +1 ----在這個分區的第一個扇區(即boot loader的位置)
改進(該分區須要設定爲激活狀態)
title windows partition
hide (hd0,4) ----隱藏/dev/hda5上的linux
rootnoverity (hd0,0) ----grub默認檢查激活狀態,咱們設定不檢查這個分區
chainloader +1
makeactive ----設定此分區爲開機碟
3.3initrd的重要性與創建新的initrd檔案:mkinitrd
注意:initrd未必會被用到,只有當核心不具有某種驅動以識別某些類型的文件系統是才須要,好比驅動在IDE接口的硬盤中就不須要,由於核心具有相關驅動【1-31】
mkinitrd 重置initrd文件的指令【1-32】
案例一
# mkinitrd -v initrd_$(uname -r) $(uname -r) ----以默認方式創建一個新的initrd檔案,指定核心的版本並顯示運做過程
# ll initrd_* ----能夠看看這個檔案創建好了沒【1-33】
案例二
# mkinitrd -v --with=8139too initrd_vbirdtest $(uname -r) ----建立時添加8139too這個模塊 ,意味着載入虛擬文件系統時會載入這個模塊
3.4測試與安裝grub:grub-install,grub sheel
grub-install 安裝grub配置文件的指令【1-34】
案例一:將grub安裝在目前系統的MBR下,系統所在磁盤爲/dev/hda
# grub-install /dev/hda ---查看/boot/grub下回發先文件已經被更新了
案例二:將grub安裝在某個指定分區的Boot sector內(假設/dev/hda3),注意grub能夠安裝在該系統所掛載的任何一個分區的boot sector內,不妨假設爲/home掛載的位置
# ggrub-install --root-directory=/home /dev/hda3
# ll /home/boot/grub/ ---- 觀察安裝進來沒有
案例三:編輯三個開機選項【1-35】
# vim /boot/grub/menu.lst
default=0 ----第一個選單爲默認選單
timeout=30 ----設置等待30秒
splashimage=(hd0,0)/grub/splash.xpm.gz ----選單背景圖片的位置
#hidenmenu ----讀秒期間顯示完整的選單畫面(預設隱藏)
title CentOS(2.6.18-92.el5)
root (hd0,0) ----root指核心檔案所在的分區而不是根目錄所在分區,這裏指的是第一塊硬盤的第一個分區(/boot在/dev/hda1爲獨立分區)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite ----指出核心檔名和根目錄掛載的分區
initrd /initrd-2.6.18-92.el5.img ----虛擬文件系統的檔名
title /dev/hda1 boot sector <=====================本例中的第一個新增選單(使用/dev/hda1中的boot loader)
root (hd0,0)
chainloader +1 ----第一個扇區
title MBR loader <=========================新增第二個選單(從新讀取MBR中的boot loader)
root (hd0) ----用整顆硬盤的代號表示MBR
chainloader +1
title single use mode <========================新增第三個選單(強制進入單人維護模式)
root (hd0,0) ----root指核心檔案所在的分區而不是根目錄所在分區,這裏指的是第一塊硬盤的第一個分區(/boot在/dev/hda1爲獨立分區)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite single ----指出核心檔名和根目錄掛載的分區、單人維護模式
initrd /initrd-2.6.18-92.el5.img ----虛擬文件系統的檔名
grub sheel 安裝grub主程序到boot loader的工具
1.幾個經常使用指令
grub> root (hdx,x) 選中含有grub目錄的分區(/boot/grub/所在的分區)
grub> find /boot/grub/stage1 ----看看可否找到安裝信息檔案
grub> find /boot/vmlinuz ----看看可否找到核心文件
grub> setup (hdx,x) ---將grub安裝在該分區上的boot sector
grub> setup (hdx) ----將grub裝在相應硬盤的MBR上
grub> quit ----離開grub sheel
2.幾個案例
案例一
# grub ---進入grub sheel
grub> root (hd0,0) ----/boot/grub在hda1中,grub能分辨出該分割槽的文件系統
grub> find /boot/grub/stage1 ----看看有沒有grub主程序,會顯示裝置的檔名
grub> find /boot/vmlinuz-2.6.18-92.el5 ----搜尋核心(/boot不獨立分區) or find /boot/vmlinuz-2.6.18-92.el5 ----搜尋核心(/boot獨立分區)
grub> setup (hd0) ----將主程序安裝到MBR
grub> setup (hd0,0) ----在/dev/hda1的boot sector中 也安裝一份
grub>quit ----退出grub sheel,安裝好的grub主程序會讀取/(hd0,0)/gurb/menu.lst這個配置文件
3.5開機前的額外功能修改
注意:遇到開機問題時能夠嘗試在選單階段從新編輯選單,可是若是grub也故障的話就應該嘗試外部掛載方式啓動了
3.6關於核心功能中的vga設定(修改終端分辨率)
# grep 'FRAMEBUFFER_CONSOLE' /boot/config-2.6.18-92.el5 ----查看核心是否支持終端分辨率的修改
CONFIG_FRAMEBUFFER_CONSOLE=y ----這一行後面爲y表示支持,若是被註釋或者n表示不支持
# vim /boot/grub/menu.lst
title CentOS(2.6.18-92.el5)
kernel (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790 ----分辨率設置依據表【1-36】
initrd (hda0,0) /intrd-2.6.18-92.el5.img
3.7BIOS沒法讀取大硬盤的問題
緣由:BIOD沒法正確識別大硬盤中kernel和initrd存儲的實際位置
解決方法一(系統安裝前):根據BIOS至少可以讀取1024磁柱之內的數據,分區時將/boot獨立分區且先分出這個分區給/boot (推薦)
解決方法二(系統安裝後):簡單一點直接重灌,即從新制做一個分區掛載/boot,保證這個新的/boot掛載的分區在1024轉之內 (推薦)
解決方法三(後):用光驅開機,藉助grub的可編寫能力進入linux
解決方法四:直接將硬盤的信息寫到BIOS
3.8爲個別選單加上密碼:gurb-md5-crypt
# grub-md5-crypt ----經過這個指令獲得一個對密碼字串加密後的md5值,$.....(以$開頭,以 . 結尾)
# vim /boot/grub/menu.lst ---編輯grub配置文件對選單加密
title CentOS(2.6.18-92.el5)
password --md5 $....... ----這一行具有加密的做用,注意必定是在title底下第一行,這種方式能夠經過編輯模式計入選單修改選單破解
kernel (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790 ----分辨率設置依據表【1-36】
initrd (hda0,0) /intrd-2.6.18-92.el5.img
升級 (用戶想進入編輯模式的話就要輸入密碼)
default=0 ----第一個選單爲默認選單
timeout=30 ----設置等待30秒
password --md5 $....... ----放在總體設置處
splashimage=(hd0,0)/grub/splash.xpm.gz ----選單背景圖片的位置
#hidenmenu ----讀秒期間顯示完整的選單畫面(預設隱藏)
title CentOS(2.6.18-92.el5)
lock ----在選單中增長lock字段
kernel (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790 ----分辨率設置依據表【1-36】
initrd (hda0,0) /intrd-2.6.18-92.el5.img
4 .開機過程當中的問題解決
4.1忘記root密碼的解決之道
第一步:重啓
第二步:開機進入grub選單
第三步:選擇一個進入詳細設定,移動到kernel那一行,e進入編輯狀態
grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quite single
第四步:【ENTER】,b,這時進入單人維護模式並獲得一個sheel
第五步:# passwd ----重置root的密碼
第六步:# init 5 ----進入x窗口模式
4.2init配置文件錯誤(/etc/inittab損壞)
第一步:重啓
第二步:開機進入grub編輯狀態
第三步:grub> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quite init=/bin/bash ----由於執行init時,任何開機模式都須要讀取/etc/inittab文件,所以咱們將實際的init替換爲/bin/bash,從而掠過文件系統直接進入bash sheel
第四步:【ENTER】,b,這時一個sheel工做
第五步:# mount -o remount,rw / ----由於根目錄在開機階段是以只讀的方式掛載的,所以咱們從新以可擦寫狀態掛載
# mount -a ----根據/etc/fstab的內容進行從新掛載文件系統測試
第六步:此時能夠進行救援了(修改/etc/inittab)
第七步:重啓
4.3BIOS磁盤對應的問題(device.map),兩個系統分別安裝在兩顆磁盤
注意:此時BIOS依據設定得到第一個可開機的裝置,並讀取boot loader,即grub,但grub中對磁盤的記錄代號是依據偵測的順序編寫的,可能不對應BIOS的指定
# vim /boot/grub/device.map ----寫死裝置的對應
(fd0) /dev/fd0
(hd0) /dev/hda
或者
# grub-install --recheck /dev/hda1 ----device.map會被主動更新
4.4因文件系統錯誤而沒法開機
【文件系統錯誤示意圖 1-37】
Give root passwd for maintenance
(or type Control-D to continue):****** ----輸入密碼取得bash
# mount -o remount,rw / ----將根目錄從新掛載爲可讀寫狀態
# fsck /dev/md0 ----作quota時出錯的話用fsck進行檢測
clear[Y/N]y ----清理錯誤
4.5利用chroot切換到另外一顆硬盤工做
第一步:進入一個正常的linux系統(cd/u盤/硬盤)
第二步:將故障的linux所在的分區全對應原來分區掛載的位置部進行以下掛載
# mount /dev/hdb1 /chroot/
# mount /dev/hdb2 /chroot/var
# mount /dev/hdb3 /chroot/home
# mount /dev/hdb4 /chroot/usr
# chroot /chroot ----更換根目錄
5.重點回顧【1-38】
6.本章習題
模擬題一:利用救援光盤來處理系統錯誤致使的沒法開機的問題
第一步:利用光盤開機,進入救援模式偵測
boot:linux rescue ----進入救援模式的偵測,按下F5就能夠看到輸入的選項
第二步:進行相似裝機的基本設置,以後救援光盤會將偵測到的centos整合成一個chroot等待處理
第三步:chroot /mnt/sysimage ----進入偵測到的出問題的系統,這是會獲得一個sheel
第四步:# df ----查看出錯的系統是否被正確地掛載了
第五步:對系統進行修復
簡答題:【1-39,40】