Linux 基礎學習 - PowerPoint PPT Presentation

linux n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Linux 基礎學習 PowerPoint Presentation
Download Presentation
Linux 基礎學習

play fullscreen
1 / 39
Linux 基礎學習
147 Views
Download Presentation
stephen-hester
Download Presentation

Linux 基礎學習

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Linux 基礎學習 Chapter 20 開機流程、模組管理與Loader Linux基礎--開機流程、模組管理與Loader

  2. 內容 • Linux 的開機流程分析 • 核心與核心模組 • Boot Loader: Grub • 開機過程的問題解決 Linux基礎--開機流程、模組管理與Loader

  3. 20.1Linux 的開機流程分析 • 20.1.1 開機流程一覽 1.載入 BIOS 的硬體資訊與進行自我測試,並依據設定取得第一個可開機的裝置; 2.讀取並執行第一個開機裝置內 MBR 的 boot Loader (亦即是 grub, spfdisk 等程式); 3.依據 boot loader 的設定載入 Kernel ,Kernel 會開始偵測硬體與載入驅動程式; 4.在硬體驅動成功後,Kernel 會主動呼叫 init 程式,而 init 會取得 run-level 資訊; 5.nit 執行 /etc/rc.d/rc.sysinit 檔案來準備軟體執行的作業環境 (如網路、時區等); 6.init 執行 run-level 的各個服務之啟動 (script 方式); 7.init 執行 /etc/rc.d/rc.local 檔案; 8.init 執行終端機模擬程式 mingetty 來啟動 login 程式,最後就等待使用者登入啦;

  4. 20.1Linux 的開機流程分析 • 20.1.2BIOS, boot loader 與 kernel 載入 • BIOS, 開機自我測試與 MBR 我們知道每顆硬碟的第一個磁區內含有 446 bytes的 MBR 區域,那麼如果我的主機上面有兩顆硬碟的話,系統會去哪顆硬碟的 MBR 讀取 boot loader 呢?這個就得要看 BIOS 的設定了。基本上,我們常常講的『系統的 MBR』其實指的是第一個開機裝置的 MBR 才對! 所以,改天如果你要將開機管理程式安裝到某顆硬碟的 MBR 時,要特別注意當時系統的『第一個開機裝置』是哪個,否則會安裝到錯誤的硬碟上面的 MBR 喔!重要重要!

  5. 20.1Linux 的開機流程分析 • Boot Loader 的功能 boot loader 安裝在 MBR, boot sector 與作業系統的關係 開機管理程式的選單功能與控制權轉交功能示意圖 • 提供選單:使用者可以選擇不同的開機項目,這也是多重開機的重要功能! • 載入核心檔案:直接指向可開機的程式區段來開始作業系統; • 轉交其他loader:將開機管理功能轉交給其他 loader 負責。

  6. 20.1Linux 的開機流程分析 • 載入核心偵測硬體與 initrd 的功能 BIOS 與 boot loader 及核心載入流程示意圖

  7. 20.1Linux 的開機流程分析

  8. 20.1Linux 的開機流程分析 # 看!是否很像根目錄!尤其也是有 init 這個執行檔!務必看一下權限! # 接下來看看 init 這個檔案內有啥咚咚? # 4. 觀察 init 檔案內較重要的執行項目 [root@www initrd]# cat init #!/bin/nash <==使用類似 bash 的 shell 來執行 mount -t proc /proc /proc <==掛載記憶體的虛擬檔案系統 ....(中間省略).... echo Creating initial device nodes mknod /dev/null c 1 3 <==建立系統所需要的各項裝置! ....(中間省略).... echo "Loading ehci-hcd.ko module" insmod /lib/ehci-hcd.ko <==載入各項核心模組,就是驅動程式! ....(中間省略).... echo Creating root device. mkrootdev -t ext3 -o defaults,ro hdc2 <==嘗試掛載根目錄啦! ....(底下省略)....

  9. 20.1Linux 的開機流程分析 • 20.1.3 第一支程式 init 及設定檔 /etc/inittab 與 runlevel • Run level:執行等級有哪些? • 0 - halt (系統直接關機) • 1 - single user mode (單人維護模式,用在系統出問題時的維護) • 2 - Multi-user, without NFS (類似底下的 runlevel 3,但無 NFS 服務) • 3 - Full multi-user mode (完整含有網路功能的純文字模式) • 4 - unused (系統保留功能) • 5 - X11 (與 runlevel 3 類似,但加載使用 X Window) • 6 - reboot (重新開機)

  10. 20.1Linux 的開機流程分析 • /etc/inittab 的內容與語法

  11. 20.1Linux 的開機流程分析 • init 的處理流程 1.先取得 runlevel 亦即預設執行等級的相關等級 (以鳥哥的測試機為例,為 5 號); 2.使用 /etc/rc.d/rc.sysinit 進行系統初始化 3.由於 runlevel 是 5 ,因此只進行『l5:5:wait:/etc/rc.d/rc 5』,其他行則略過 4.設定好 [ctrl]+[alt]+[del] 這組的組合鍵功能 5.設定不斷電系統的 pf, pr 兩種機制; 6.啟動 mingetty 的六個終端機 (tty1 ~ tty6) 7.最終以 /etc/X11/perfdm -nodaemon 啟動圖形介面啦!

  12. 20.1Linux 的開機流程分析 • 20.1.4init 處理系統初始化流程 (/etc/rc.d/rc.sysinit) 1.取得網路環境與主機類型 2.測試與掛載記憶體裝置 /proc 及 USB 裝置 /sys 3.決定是否啟動 SELinux 4.啟動系統的亂數產生器 5.設定終端機 (console) 字形 6.設定顯示於開機過程中的歡迎畫面 (text banner) 7.設定系統時間 (clock) 與時區設定 8.周邊設備的偵測與 Plug and Play (PnP) 參數的測試 9.使用者自訂模組的載入 10.載入核心的相關設定 11.設定主機名稱與初始化電源管理模組 (ACPI)

  13. 20.1Linux 的開機流程分析 12.初始化軟體磁碟陣列 13.初始化 LVM 的檔案系統功能 14.以 fsck 檢驗磁碟檔案系統 15.進行磁碟配額 quota 的轉換 (非必要) 16.重新以可讀寫模式掛載系統磁碟 17.啟動 quota 功能 18.啟動系統虛擬亂數產生器 (pseudo-random) 19.清除開機過程當中的暫存檔案 20.將開機相關資訊載入 /var/log/dmesg 檔案中

  14. 20.1Linux 的開機流程分析 • 20.1.5 啟動系統服務與相關啟動設定檔 (/etc/rc.d/rc N & /etc/sysconfig) • 透過外部第一號參數($1) 來取得想要執行的腳本目錄。亦即由 /etc/rc.d/rc 5 可以取得 /etc/rc5.d/ 這個目錄來準備處理相關的腳本程式; • 找到 /etc/rc5.d/K??* 開頭的檔案,並進行『 /etc/rc5.d/K??* stop 』的動作; • 找到 /etc/rc5.d/S??* 開頭的檔案,並進行『 /etc/rc5.d/S??* start 』的動作;

  15. 20.1Linux 的開機流程分析 • 20.1.6 使用者自訂開機啟動程序 (/etc/rc.d/rc.local) 在完成預設 runlevel 指定的各項服務的啟動後,如果我還有其他的動作想要完成時,舉例來說,我還想要寄一封 mail 給某個系統管理帳號,通知他,系統剛剛重新開機完畢,那麼是否應該要製作一個 shell script 放置在 /etc/init.d/ 裡面,然後再以連結方式連結到 /etc/rc5.d/ 裡面呢?呵呵!當然不需要!還記得上一小節提到的 /etc/rc.d/rc.local 吧?這個檔案就可以執行你自己想要執行的系統指令了。 也就是說,我有任何想要在開機時就進行的工作時,直接將它寫入 /etc/rc.d/rc.local ,那麼該工作就會在開機的時候自動被載入喔!而不必等我們登入系統去啟動呢!是否很方便啊!一般來說,鳥哥就很喜歡把自己製作的 shell script 完整檔名寫入 /etc/rc.d/rc.local ,如此一來,開機就會將我的 shell script 執行過,真是好棒啊!

  16. 20.1Linux 的開機流程分析 • 20.1.7 根據 /etc/inittab 之設定,載入終端機或 X-Window 介面

  17. 20.1Linux 的開機流程分析 • 20.1.8 開機過程會用到的主要設定檔 • 關於模組:/etc/modprobe.conf • /etc/sysconfig/* • Authconfig • Clock • I18n • keyboard & mouse • Network • network-scripts/

  18. 20.1Linux 的開機流程分析 • 20.1.9Run level 的切換

  19. 20.2 核心與核心模組 • 核心與核心模組放在哪? • 核心:/boot/vmlinuz 或 /boot/vmlinuz-version; • 核心解壓縮所需 RAM Disk:/boot/initrd (/boot/initrd-version); • 核心模組:/lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel; • 核心原始碼:/usr/src/linux 或 /usr/src/kernels (要安裝才會有!預設不安裝!) • 如果該核心被順利的載入系統當中了,那麼就會有幾個資訊記錄下來: • 核心版本:/proc/version • 系統核心功能:/proc/sys/kernel • 問題來啦,如果我有個新的硬體,偏偏我的作業系統不支援,該怎麼辦?很簡單啊! • 重新編譯核心,並加入最新的硬體驅動程式原始碼; • 將該硬體的驅動程式編譯成為模組,在開機時載入該模組

  20. 20.2 核心與核心模組 • 20.2.1 核心模組與相依性

  21. 20.2 核心與核心模組 • 20.2.2 核心模組的觀察 • 使用lsmod 之後,系統會顯示出目前已經存在於核心當中的模組,顯示的內容包括有: • 模組名稱(Module); • 模組的大小(size); • 此模組是否被其他模組所使用 (Used by)。

  22. 20.2 核心與核心模組 • 20.2.3 核心模組的載入與移除 • 移除

  23. 20.2 核心與核心模組 • 載入

  24. 20.2 核心與核心模組 • 20.2.4 核心模組的額外參數設定:/etc/modprobe.conf 假設 • eth0 :I/O (0x300) 且 IRQ=5 • eth1 :I/O (0x320) 且 IRQ=7 則:

  25. 20.3Boot Loader: Grub • 20.3.1boot loader 的兩個 stage • Stage 1:執行 boot loader 主程式 • Stage 2:主程式載入設定檔

  26. 20.3Boot Loader: Grub • 20.3.2grub 的設定檔 /boot/grub/menu.lst 與選單類型 • 硬碟與分割槽在 grub 中的代號

  27. 20.3Boot Loader: Grub • /boot/grub/menu.lst 設定檔 • default=0 • timeout=5 • splashimage=(hd0,0)/grub/splash.xpm.gz • hiddenmenu

  28. 20.3Boot Loader: Grub • 20.3.3initrd 的重要性與建立新 initrd 檔案 • 一般來說,需要initrd 的時刻為: • 根目錄所在磁碟為 SATA、USB 或 SCSI 等連接介面; • 根目錄所在檔案系統為 LVM, RAID 等特殊格式; • 根目錄所在檔案系統為非傳統 Linux 認識的檔案系統時; • 其他必須要在核心載入時提供的模組。

  29. 20.3Boot Loader: Grub • 20.3.4 測試與安裝 grub

  30. 20.3Boot Loader: Grub # 4. 將主程式安裝上去吧!安裝到 MBR 看看! grub> setup (hd0) Checking if "/boot/grub/stage1" exists... no <==因為 /boot 是獨立的 Checking if "/grub/stage1" exists... yes <==所以這個檔名才是對的! Checking if "/grub/stage2" exists... yes Checking if "/grub/e2fs_stage1_5" exists... yes Running "embed /grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded. succeeded Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded <==將 stage1 程式安裝妥當囉! Done. # 很好!確實有裝起來~這樣 grub 就在 MBR 當中了! # 5. 那麼重複安裝到我的 /dev/hda1 呢?亦即是 boot sector 當中? grub> setup (hd0,0) Checking if "/boot/grub/stage1" exists... no Checking if "/grub/stage1" exists... yes Checking if "/grub/stage2" exists... yes Checking if "/grub/e2fs_stage1_5" exists... yes Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal) Running "embed /grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal) Running "install /grub/stage1 (hd0,0) /grub/stage2 p /grub/grub.conf "... succeeded Done. # 雖然無法將 stage1_5 安裝到 boot sector 去,不過,還不會有問題, # 重點是最後面那個 stage1 要安裝後,顯示 succeeded 字樣就可以了! grub> quit

  31. 20.3Boot Loader: Grub • 20.3.5 開機前的額外功能修改 grub 開機畫面示意圖 grub 單一選單內容 grub edit 的線上編修功能

  32. 20.3Boot Loader: Grub • 20.3.6 關於核心功能當中的 vga 設定

  33. 20.3Boot Loader: Grub • 20.3.7BIOS 無法讀取大硬碟的問題 • 在安裝的過程中,由於是使用 DVD 或 CD 開機,因此載入 Linux 核心不成問題,而核心會去偵測系統硬體,因此可以捉到 BIOS 捉不到的硬碟,此時你確實可以安裝 Linux 在大容量的硬碟上,且不會出現任何問題。 • 但是在進入硬碟開機時,由於 kernel 與 initrd 檔案都是透過 BIOS 的 INT 13 通道讀取的,因此你的 kernel 與 initrd 如果放置在 BIOS 無法判斷的磁區中,當然就無法被系統載入,而僅會出現 grub shell (grub>) 等待你的處理而已。 • 更多 grub 錯誤的代碼查詢可以到底下的連結查閱: • http://orgs.man.ac.uk/documentation/grub/grub_toc.html#SEC_Contents

  34. 20.3Boot Loader: Grub • 20.3.8 為個別選單加上密碼 grub 加密的示意圖

  35. 20.4 開機過程的問題解決 • 20.4.1 忘記 root 密碼的解決之道 1.重新開機!一定要重新開機!怎麼重開都沒關係; 2.在開機進入 grub 選單後, (1)在你要進入的選單上面點 'e' 進入詳細設定; (2)將光棒移動到 kernel 上方並點 'e' 進入編輯畫面; (3)然後出現如下畫面來處理: 重點就是那個特殊字體的咚咚啦!按下 [enter] 再按下 b 就能夠開機進入單人維護模式了。 3.進入單人維護模式後,系統會以 root 的權限直接給你一個 shell ,此時你就能 夠執行『 passwd 』這個指令來重建 root 的密碼啦!然後直接『 init 5 』就可 以切換成為 X 視窗介面囉!就是這麼簡單。

  36. 20.4 開機過程的問題解決 • 20.4.2init 設定檔錯誤 略過 init 的程序,直接進入 bash shell

  37. 20.4 開機過程的問題解決 • 20.4.3BIOS 磁碟對應的問題 (device.map)

  38. 20.4 開機過程的問題解決 • 20.4.4 因檔案系統錯誤而無法開機 檔案系統錯誤的示意圖

  39. 20.4 開機過程的問題解決 • 20.4.5 利用 chroot 切換到另一顆硬碟工作 1.用盡任何方法,進入一個完整的 Linux 系統 ( run level 3 或 5 ); 2.假設有問題的 Linux 磁碟在 /dev/hdb1 上面,且它整個系統的排列是: 掛載點裝置檔名 / → /dev/hdb1 /var → /dev/hdb2 /home → /dev/hdb3 /usr → /dev/hdb5 若如此的話,那麼在我目前的這個 Linux 底下,我可以建立一個目錄,然後可以這樣做: 掛載點裝置檔名 /chroot/ → /dev/hdb1 /chroot/var/ → /dev/hdb2 /chroot/home/ → /dev/hdb3 /chroot/usr/ → /dev/hdb5 3.全部掛載完畢後,再輸入『 chroot /chroot 』嘿嘿!你就會發現,怎麼根目錄 (/) 變成那 個 /dev/hdb1 的環境啦!這樣說明,瞭了嗎?^_^