日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

鳥哥的linux私房菜——第20章 啟動流程、模塊管

系統(tǒng) 2134 0

20.1 Linux啟動流程分析

Linux啟動過程:

按下開機(jī)電源后計(jì)算機(jī)硬件主動讀取BIOS來加載硬件信息以及硬件系統(tǒng)的自我測試,之后系統(tǒng)會主動讀取第一個(gè)可啟動的設(shè)備(由BIOS設(shè)置),此時(shí)就可以讀入引導(dǎo)加載程序(boot loader)了,引導(dǎo)加載程序指定使用那個(gè)內(nèi)核文件來啟動,并實(shí)際加載內(nèi)核到內(nèi)存中解壓縮與執(zhí)行,此時(shí)內(nèi)核就能夠在內(nèi)存中活動,并檢測所有硬件信息與加載適當(dāng)?shù)尿?qū)動程序來使主機(jī)運(yùn)行,等內(nèi)核檢測硬件與加載驅(qū)動程序完畢后,就可以登錄了。

1)加載BIOS的硬件信息與進(jìn)行自我測試,并依據(jù)設(shè)置取得第一個(gè)可啟動的設(shè)備

2)讀取并執(zhí)行第一個(gè)啟動設(shè)備內(nèi)MBR的boot Loader(即grub,spfdisk等程序)

3)依據(jù)boot loader的設(shè)置加載內(nèi)核,內(nèi)核開始檢測硬件和加載驅(qū)動程序

4)在硬件驅(qū)動成功后,Kernel會主動調(diào)用init進(jìn)程,而init會取得run-level信息

5)init執(zhí)行/etc/rc.d/rc.sysinit文件來準(zhǔn)備軟件執(zhí)行的操作環(huán)境

6)init執(zhí)行run-level的各個(gè)服務(wù)的啟動

7)init執(zhí)行/etc/rc.d/rc.local文件

8)init執(zhí)行終端機(jī)模擬程序mingetty來啟動login進(jìn)程,最后等待用戶登錄

?

Boot Loader的主要功能:

提供菜單:用戶可以選擇不同的啟動選項(xiàng),也是多重引導(dǎo)的重要功能

加載內(nèi)核文件:直接指向可啟動的程序區(qū)段來開始操作系統(tǒng)

轉(zhuǎn)交其他loader:將引導(dǎo)裝載功能轉(zhuǎn)交給其他loader負(fù)責(zé)

?

問題1):每種操作系統(tǒng)都有自己的boot loader,對于多操作系統(tǒng),每個(gè)操作系統(tǒng)必須使用自己的loader才能加載自己的操作系統(tǒng)內(nèi)核,而系統(tǒng)的MBR只有一個(gè),怎么能同時(shí)在一部主機(jī)上安裝windows和linux呢

答案:由于boot loader具有菜單功能,因此可以選擇不同的內(nèi)核來啟動。由于具有控制權(quán)轉(zhuǎn)交的功能,因此可以加載其他boot sector內(nèi)的loader,(windows的loader默認(rèn)布局有控制權(quán)轉(zhuǎn)交功能,因此不能用windows的loader加載linux的loader)

?

問題2):假設(shè)linuux安裝在SATA硬盤上,可以通過BIOS的INT13取得boot loader與kenerl文件來啟動,然后kernel會開始接管系統(tǒng)并且檢測硬件及嘗試掛載根目錄來取得額外的驅(qū)動程序。但是內(nèi)核根本不認(rèn)識SATA磁盤,所以需要加載SATA磁盤的驅(qū)動程序,否則根本無法掛載根目錄,但是SATA的驅(qū)動程序在/lib/modules內(nèi),根本無法掛載根目錄,又怎么能讀取到/lib/modules內(nèi)的驅(qū)動程序呢?

答案:通過虛擬文件系統(tǒng)解決,一般使用的文件名是/boot/initrd。該文件能夠通過boot loader加載到內(nèi)存中,文件被解壓縮并在內(nèi)存中仿真成一個(gè)根目錄,且此仿真在內(nèi)存中的文件系統(tǒng)能夠提供一個(gè)可執(zhí)行程序,通過該程序來加載啟動過程中所需要的內(nèi)核模塊,通常是USB,RAID,LVM,SCSI等文件系統(tǒng)與硬盤接口的驅(qū)動程序。等載入完成后,會幫助內(nèi)核重新調(diào)用/sbin/init來開始后續(xù)的正常流程

(如果linux安裝在IDE接口的磁盤上,且默認(rèn)使用ext2/ext3文件系統(tǒng),那么不需要initrd也能順利啟動linux)

?

內(nèi)核加載完畢進(jìn)行完硬件檢測與驅(qū)動程序加載后,主機(jī)硬件就已經(jīng)準(zhǔn)備就緒來,此時(shí)內(nèi)核會主動調(diào)用第一個(gè)進(jìn)程,就是/sbin/init (init的PID為1),/sbin/init的主要功能就是準(zhǔn)備軟件執(zhí)行的環(huán)境,包括系統(tǒng)主機(jī)名、網(wǎng)絡(luò)設(shè)置、語系處理、文件系統(tǒng)格式及其他服務(wù)的啟動。而所有的操作都會通過init的配置文件/etc/inittab來規(guī)劃

inittab一個(gè)很重要的設(shè)置選項(xiàng)就是run level

0——halt (系統(tǒng)直接關(guān)機(jī))

1——single user mode(單用戶維護(hù)模式,用在系統(tǒng)出問題時(shí)維護(hù))

2——Multi-user,without NFS(類似run level3,但無NFS服務(wù))

3——Full multi-user mode(完整含有網(wǎng)絡(luò)功能的純文本模式)

4——unused (系統(tǒng)保留功能)

5——X11(與run level3 類似,但加載使用X Windows)

6——reboot (重新啟動)

?

在/etc/inittab里有一句:"si::sysint:/etc/rc.d/rc.sysinit"表示:開始加載各項(xiàng)系統(tǒng)服務(wù)之前,得先設(shè)置好整個(gè)系統(tǒng)環(huán)境,主要利用/etc/rc.d/rc.sysinit這個(gè)shell script 來設(shè)置好系統(tǒng)環(huán)境的

?

啟動系統(tǒng)服務(wù)與相關(guān)啟動配置文件(/etc/rc.d/rc N & /etc/sysconfig)

/etc/rc.d/rc5的意義是這樣的:

通過外部第一號參數(shù)($1)來取得想要執(zhí)行的腳本目錄,即由/etc/rc.d/rc 5可以取得/etc/rc5.d/這個(gè)目錄來準(zhǔn)備處理相關(guān)的腳本程序

找到/etc/rc5.d/K??*開頭的文件,并進(jìn)行/etc/rc5.d/K??* stop 的操作

找到/etc/rc5.d/S??*開頭的文件,并進(jìn)行/etc/rc5.d/S??* start的操作

(/etc/rc5.d下的文件全部是鏈接文件,鏈接到stand alone服務(wù)啟動的目錄/etc/init.d中)

如/etc/rc5.d/K91capistop-->/etc/init.d/capistop

/etc/rc5.d/S10networkstart--> /etc/init.d/networdkstart?

S和K后的數(shù)字表示文件執(zhí)行的順序,S99local就是/etc/rc.d/rc.local是最后執(zhí)行

?

用戶自定義開機(jī)啟動程序(/etc/rc.d/rc.local)

如果用戶有任何想要在啟動時(shí)進(jìn)行的工作,直接將它寫入/etc/rc.d/local,那個(gè)該工作就會在啟動的時(shí)候自動加載

?

啟動過程會用到的主要配置文件:

1)模塊:/etc/modprobe.conf (這個(gè)文件大多在于指定系統(tǒng)內(nèi)的硬件所使用的模塊,如果系統(tǒng)檢測到錯(cuò)誤的驅(qū)動程序,或者你想要使用更新的驅(qū)動程序來對應(yīng)相關(guān)的硬件配備時(shí),就得要手動處理該文件)

2)/etc/sysconfig/*下的幾個(gè)文件:

authconfig 這個(gè)文件主要設(shè)置用戶的身份認(rèn)證的機(jī)制,包括是否使用本地/etc/passwd,/etc/shadow等

clock 該文件用于設(shè)置linux主機(jī)的失去,可以使用格林威治時(shí)間,也可以使用本地時(shí)間

i18n 用于設(shè)置一些語系的使用方面

keyboard&mouse 設(shè)置鍵盤與鼠標(biāo)的形式

network 可以設(shè)置是否啟動網(wǎng)絡(luò),以及設(shè)置主機(jī)名還有網(wǎng)關(guān)信息

network-scripts 主要用于設(shè)置網(wǎng)卡

?

切換run level: init N

顯示當(dāng)前的run level :runlevel  ?。ㄝ敵鼋Y(jié)果左邊代表前一個(gè)runlevel,右邊代表目前的runlevel)

init 0 關(guān)機(jī)

init 6 重啟

?

?

20.2 內(nèi)核與內(nèi)核模塊

內(nèi)核和內(nèi)核模塊存放位置:

內(nèi)核:/boot/vmlinuz或/boot/vmlinuz-version

內(nèi)核解壓所需RAMDisk:/boot/initrd (/boot/initrd-version)

內(nèi)核模塊:/lib/modules/version/kernel或 /lib/modules/$(uname -r)/kernel

內(nèi)核源碼:/usr/src/linux 或/usr/src/kernels(要安裝才會有,默認(rèn)不安裝)

內(nèi)核版本:/proc/version

系統(tǒng)內(nèi)核功能:/proc/sys/kernel

?

內(nèi)核模塊與依賴性:

/lib/modules/$(uname -r)/modules.dep文件記錄了在內(nèi)核支持的模塊的各項(xiàng)依賴性

例如,做好的網(wǎng)卡驅(qū)動程序,文件名為a.ko,如何更新內(nèi)核依賴性?

使用depmod命令就可以實(shí)現(xiàn)(depmod [-Ane])

cp a.ko /lib/module/$(uname -r)/kernel/driver/net

depmod

?

內(nèi)核模塊的查看:

lsmod

使用lsmod后,系統(tǒng)會顯示出目前已存在與內(nèi)核中的模塊,顯示包括:模塊名稱module、模塊的大小size、此模塊是否被其他模塊所使用Used by

modinfo [-adln] [module_name|filename]

如:modinfo wmi

?

內(nèi)核模塊的加載與刪除:

如果想要自行手動加載模塊,最簡單也建議使用modprobe命令來加載模塊,因?yàn)閙odprobe會主動查找modules.dep的內(nèi)容,先克服了模塊的依賴性后,菜決定需要加載的模塊有哪些。insmod則完全有用戶加載一個(gè)完整文件名的模塊,并不會主動分析模塊依賴性

modprobe [-lcfr] module_name

insmod [/full/path/module_name] [parameters]

例如:嘗試載入cifs.ko這個(gè)文件系統(tǒng)模塊

insmod /lib/module/$(uname -r)/kernel/fs/cifs/cifs.ko

lsmod | grep cifs

刪除模塊:rmmod [-fw] module_name

?

?

20.3 Boot Loader:Grub

boot loader的程序代碼執(zhí)行與設(shè)置值加載分為兩個(gè)階段來執(zhí)行

stage1:執(zhí)行boot loader主程序(這個(gè)主程序必須要安裝在啟動區(qū),即MBR或者boot sector,因?yàn)镸BR實(shí)在太小來,所以MBR或boot sector通常僅安裝boot loader最小主程序,并沒有安裝loader的相關(guān)配置文件)

stage2:通過boot loader加載所有配置文件與相關(guān)的環(huán)境參數(shù)文件(包括文件系統(tǒng)定義與主要配置文件menu.lst),一般來說,配置文件都在/boot下

?

安裝在MBR的grub主程序最終要的任務(wù)之一就是從磁盤中加載內(nèi)核文件,以讓內(nèi)核能夠順利驅(qū)動整個(gè)系統(tǒng)的硬件

grub的硬盤代號如hd(0,0)表示第一塊查找到的硬盤代號為(hd0),該硬盤的第一號分區(qū)為(hd0,0)

?

/boot/grub/menu.lst (grub.cfg)

default=0  默認(rèn)的啟動選項(xiàng),使用第一個(gè)啟動菜單

timeout=5?  若5秒內(nèi)未動鍵盤,使用默認(rèn)菜單啟動

hiddenmenu 讀秒期間是否顯示完整的菜單界面

?

需要initrd時(shí)刻為:

根目錄所在磁盤為SATA、USB或SCSI等連接接口

跟母所在文件系統(tǒng)為LVM、RAID等特殊格式

根目錄所在文件系統(tǒng)為非傳統(tǒng)Linux“認(rèn)識”的文件系統(tǒng)

其他必須要在內(nèi)核加載時(shí)提供的模塊

?

可以使用mkinitrd命令來重制initrd文件

mkinitrd [-v] [--with=模塊名稱] initrd文件名 內(nèi)核版本

例1:以mkinitrd的默認(rèn)功能創(chuàng)建一個(gè)initrd虛擬硬盤文件

mkinitrd -v initrd_$(uanem -r) ?$(uname -r)

例2:增加8139too這個(gè)模塊的initrd文件

mkinitrd -v --with=8139too initrd_vbirdtest ?$(uname -r)

?

安裝grub(grub-install是安裝grub相關(guān)的文件到設(shè)備上去等待在啟動時(shí)被讀取,但還需要設(shè)置好配置文件menu.lst后,再以grub shell來安裝grub主程序到MBR或者boot sector上面去)

grub-install [--root-directory=DIR] ?INSTALL_DEVICE

例1:將grub安裝到目前系統(tǒng)的MBR下面,我的系統(tǒng)為/dev/had

grub-install /dev/hda

例2:我的/home為獨(dú)立的/dev/sda3,如何安裝grub到/dev/sda3

grub-install --root-directory=/home /dev/sda3

?

內(nèi)核功能中的vga設(shè)置

解決tty1~tty6的分辨率問題

首先產(chǎn)看是否支持FRAMEBUFFER_CONSOLE這個(gè)內(nèi)核功能參數(shù)

grep 'FRAMEBUFFER_CONSOLE' ?/boot/config-3.2.0-23-generic-pae (如果出現(xiàn)CONFIG FRAMEBUFFER CONSOLE=y表示有支持)

修改分辨率 vi /boot/grub/menu.lst (或者是grub.cfg文件 添加紅色部分)

menuentry 'Ubuntu,Linux 3.2.0-67-generic-pae' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root c6008246-e4ee-490f-bec6-3f72108424dd
linux /boot/vmlinuz-3.2.0-67-generic-pae root=UUID=c6008246-e4ee-490f-bec6-3f72108424dd ro quiet splash $vt_handoff vga=790
initrd /boot/initrd.img-3.2.0-67-generic-pae
}

790對應(yīng)著1024*768的分辨率,還有其他參數(shù),如784~795,769,771,773,775

?

20.4啟動過程的問題解決

1)忘記密碼

a.重新啟動

b.啟動進(jìn)入grub菜單后,在要進(jìn)入的菜單上按“e” 進(jìn)入菜單設(shè)置

grub edit>kernel /vmlinuz-2.6.18-92.e15 ro root=LABEL=/ rhgb quiet single

(我的ubuntu下應(yīng)該是linux /boot/vmlinuz-3.2.0-67-generic-pae root=UUID=c6008246-e4ee-490f-bec6-3f72108424dd ro quiet splash $vt_handoff single

按下enter在按b就能夠啟動進(jìn)入單用戶維護(hù)模式

c.進(jìn)入單用戶模式后,就可以執(zhí)行shell,輸入passwd就能夠重新root密碼,在執(zhí)行init 5可以切換成X窗口界面

?

2)init配置文件錯(cuò)誤

a.同樣啟動進(jìn)入grub后

grub edit>kernel /vmlinuz-2.6.18-92.e15 ro root=LABEL=/ rhgb quiet? init=/bin/bash

將內(nèi)核調(diào)用的第一個(gè)進(jìn)程init變成/bin/bash

b.在shell中輸入mount -o remount,rw /(將根目錄重新掛載成可讀寫)

mount -a(參考/etc/fstab的內(nèi)容重新掛載文件系統(tǒng))

c.然后進(jìn)行救援工作,完畢后,重啟一次就可以了

?

鳥哥的linux私房菜——第20章 啟動流程、模塊管理與loader


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 浠水县| 扶沟县| 拜泉县| 泰顺县| 克什克腾旗| 永昌县| 崇信县| 克拉玛依市| 徐州市| 凤城市| 灵川县| 永昌县| 化隆| 高密市| 那曲县| 临高县| 宝山区| 卢龙县| 松潘县| 灌南县| 南皮县| 兴山县| 安泽县| 桂平市| 大名县| 额济纳旗| 南开区| 东明县| 政和县| 鲁甸县| 龙胜| 武夷山市| 扬中市| 乳源| 天津市| 康定县| 新化县| 娄底市| 游戏| 措美县| 佛山市|