亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網(wǎng)絡,我們將竭誠為您提供優(yōu)質(zhì)的服務! 誠征網(wǎng)絡推廣 | 網(wǎng)站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯(lián)系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業(yè)務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發(fā)消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術(shù)支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術(shù)文章 >> 文章瀏覽
技術(shù)文章

剖析Linux系統(tǒng)啟動過程

添加時間:2011-2-21  添加: admin 
本文以RedHat9.0和i386平臺為例,剖析了從用戶打開電源直到屏幕出現(xiàn)命令行提示符的整個Linux啟動過程。并且介紹了啟動中涉及到的各種文件。
 
 閱讀Linux源代碼,無疑是深入學習Linux的最好方法。在本文對Linux啟動過程的介紹中,我們也嘗試從源代碼的視角來更深入的剖析Linux的啟動過程,所以其中也簡單涉及到部分相關(guān)的Linux源代碼,Linux啟動這部分的源碼主要使用的是C語言,也涉及到了少量的匯編。而啟動過程中也執(zhí)行了大量的shell(主要是bashshell)所寫腳本。為了方便讀者閱讀,筆者將整個Linux啟動過程分成以下幾個部分逐一介紹,大家可以參考下圖:
  當用戶打開PC的電源,BIOS開機自檢,按BIOS中設(shè)置的啟動設(shè)備(通常是硬盤)啟動,接著啟動設(shè)備上安裝的引導程序lilo或grub開始引導Linux,Linux首先進行內(nèi)核的引導,接下來執(zhí)行init程序,init程序調(diào)用了rc.sysinit和rc等程序,rc.sysinit和rc當完成系統(tǒng)初始化和運行服務的任務后,返回init;init啟動了mingetty后,打開了終端供用戶登錄系統(tǒng),用戶登錄成功后進入了Shell,這樣就完成了從開機到登錄的整個啟動過程。

    下面就將逐一介紹其中幾個關(guān)鍵的部分:
  第一部分:內(nèi)核的引導(核內(nèi)引導)
 
 Red
Hat9.0可以使用lilo或grub等引導程序開始引導Linux系統(tǒng),當引導程序成功完成引導任務后,Linux從它們手中接管了CPU的控制權(quán),
然后CPU就開始執(zhí)行Linux的核心映象代碼,開始了Linux啟動過程。這里使用了幾個匯編程序來引導Linux,這一步泛及到Linux源代碼樹中
的“arch/i386/boot”下的這幾個文件:bootsect.S、setup.S、video.S等。
  其中bootsect.S是生成引導扇區(qū)的匯編源碼,它完成加載動作后直接跳轉(zhuǎn)到setup.S的程序入口。setup.S的主要功能就是將系統(tǒng)參數(shù)(包括內(nèi)存、磁盤等,由BIOS返回)拷貝到特別內(nèi)存中,以便以后這些參數(shù)被保護模式下的代碼來讀取。此外,setup.S還將video.S中的代碼包含進來,檢測和設(shè)置顯示器和顯示模式。最后,setup.S將系統(tǒng)轉(zhuǎn)換到保護模式,并跳轉(zhuǎn)到 0x100000。  那么0x100000這個內(nèi)存地址中存放的是什么代碼?而這些代碼又是從何而來的呢?
 
 0x100000這個內(nèi)存地址存放的是解壓后的內(nèi)核,因為RedHat提供的內(nèi)核包含了眾多驅(qū)動和功能而顯得比較大,所以在內(nèi)核編譯中使用了“makebzImage”方式,從而生成壓縮過的內(nèi)核,在RedHat中內(nèi)核常常被命名為vmlinuz,在Linux的最初引導過程中,是通過"arch/i386/boot/compressed/"中的head.S利用misc.c中定義的decompress_kernel()函數(shù),將內(nèi)核vmlinuz解壓到0x100000的! ‘擟PU跳到0x100000時,將執(zhí)行"arch/i386/kernel/head.S"中的startup_32,它也是vmlinux的入口,然后就跳轉(zhuǎn)到start_kernel()中去了。start_kernel()是"init/main.c"中的定義的函數(shù),start_kernel()中調(diào)用了一系列初始化函數(shù),以完成kernel本身的設(shè)置。start_kernel()函數(shù)中,做了大量的工作來建立基本的Linux核心環(huán)境。如果順利執(zhí)行完start_kernel(),則基本的Linux核心環(huán)境已經(jīng)建立起來了。
  在start_kernel()的最后,通過調(diào)用init()函數(shù),系統(tǒng)創(chuàng)建第一個核心線程,啟動了init過程。而核心線程init()主要是來進行一些外設(shè)初始化的工作的,包括調(diào)用do_basic_setup()完成外設(shè)及其驅(qū)動程序的加載和初始化。并完成文件系統(tǒng)初始化和root文件系統(tǒng)的安裝。
  當do_basic_setup()函數(shù)返回init(),init()又打開了/dev/console設(shè)備,重定向三個標準的輸入輸出文件stdin、stdout和stderr到控制臺,最后,搜索文件系統(tǒng)中的init程序(或者由init=命令行參數(shù)指定的程序),并使用execve()系統(tǒng)調(diào)用加載執(zhí)行init程序。到此init()函數(shù)結(jié)束,內(nèi)核的引導部分也到此結(jié)束了,
    第二部分:運行init
 
 init的進程號是1,從這一點就能看出,init進程是系統(tǒng)所有進程的起點,Linux在完成核內(nèi)引導以后,就開始運行init程序,。init程序需要讀取配置文件/etc/inittab。inittab是一個不可執(zhí)行的文本文件,它有若干行指令所組成。在Redhat系統(tǒng)中,inittab的內(nèi)容如下所示(以“###"開始的中注釋為筆者增加的):
  #
  # inittab       This file describes how the INIT process should set up
  #               the system in a certain run-level.
  #
  # Author:       Miquel van Smoorenburg,
  #               Modified for RHS Linux by Marc Ewing and Donnie Barnes
  #
  # Default runlevel. The runlevels used by RHS are:
  #   0 - halt (Do NOT set initdefault to this)
  #   1 - Single user mode
  #   2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)
  #   3 - Full multiuser mode
  #   4 - unused
  #   5 - X11
  #   6 - reboot (Do NOT set initdefault to this)
  #
  ###表示當前缺省運行級別為5(initdefault);
  id:5:initdefault:
  ###啟動時自動執(zhí)行/etc/rc.d/rc.sysinit腳本(sysinit)
  # System initialization.
  si::sysinit:/etc/rc.d/rc.sysinit
  l0:0:wait:/etc/rc.d/rc 0
  l1:1:wait:/etc/rc.d/rc 1
  l2:2:wait:/etc/rc.d/rc 2
  l3:3:wait:/etc/rc.d/rc 3
  l4:4:wait:/etc/rc.d/rc 4
  ###當運行級別為5時,以5為參數(shù)運行/etc/rc.d/rc腳本,init將等待其返回(wait)
  l5:5:wait:/etc/rc.d/rc 5
  l6:6:wait:/etc/rc.d/rc 6
  ###在啟動過程中允許按CTRL-ALT-DELETE重啟系統(tǒng)
  # Trap CTRL-ALT-DELETE
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  # When our UPS tells us power has failed, assume we have a few minutes
  # of power left.  Schedule a shutdown for 2 minutes from now.
  # This does, of course, assume you have powerd installed and your
  # UPS connected and working correctly.
  pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
  # If power was restored before the shutdown kicked in, cancel it.
  pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
  ###在2、3、4、5級別上以ttyX為參數(shù)執(zhí)行/sbin/mingetty程序,打開ttyX終端用于用戶登錄,
  ###如果進程退出則再次運行mingetty程序(respawn)
  # Run gettys in standard runlevels
  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6
  ###在5級別上運行xdm程序,提供xdm圖形方式登錄界面,并在退出時重新執(zhí)行(respawn)
  # Run xdm in runlevel 5
  x:5:respawn:/etc/X11/prefdm -nodaemon
以上面的inittab文件為例,來說明一下inittab的格式。其中以#開始的行是注釋行,除了注釋行之外,每一行都有以下格式:
  id:runlevel:action:process
  對上面各項的詳細解釋如下:
  1. id
  id是指入口標識符,它是一個字符串,對于getty或mingetty等其他login程序項,要求id與tty的編號相同,否則getty程序?qū)⒉荒苷9ぷ鳌?BR>  2. runlevel
 
 runlevel是init所處于的運行級別的標識,一般使用0-6以及S或s。0、1、6運行級別被系統(tǒng)保留:其中0作為shutdown動作,1作為重啟至單用戶模式,6為重啟;S和s意義相同,表示單用戶模式,且無需inittab文件,因此也不在inittab中出現(xiàn),實際上,進入單用戶模式時,init直接在控制臺(/dev/console)上運行/sbin/sulogin。在一般的系統(tǒng)實現(xiàn)中,都使用了2、3、4、5幾個級別,在Redhat系統(tǒng)中,2表示無NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級別),4保留給用戶自定義,5表示XDM圖形登錄方式。
7-9級別也是可以使用的,傳統(tǒng)的Unix系統(tǒng)沒有定義這幾個級別。runlevel可以是并列的多個值,以匹配多個運行級別,對大多數(shù)action來說,僅當runlevel與當前運行級別匹配成功才會執(zhí)行。
  3. action
  action是描述其后的process的運行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等:
 
 initdefault是一個特殊的action值,用于標識缺省的啟動級別;當init由核心激活以后,它將讀取inittab中的
initdefault項,取得其中的runlevel,并作為當前的運行級別。如果沒有inittab文件,或者其中沒有initdefault
項,init將在控制臺上請求輸入runlevel。
  sysinit、boot、bootwait等action將在系統(tǒng)啟動時無條件運行,而忽略其中的runlevel。
  其余的action(不含initdefault)都與某個runlevel相關(guān)。各個action的定義在inittab的man手冊中有詳細的描述。
  4. process
  process為具體的執(zhí)行程序。程序后面可以帶參數(shù)。
  第三部分:系統(tǒng)初始化
  在init的配置文件中有這么一行:
  si::sysinit:/etc/rc.d/rc.sysinit
 
 它調(diào)用執(zhí)行了/etc/rc.d/rc.sysinit,而rc.sysinit是一個bash
shell的腳本,它主要是完成一些系統(tǒng)初始化的工作,rc.sysinit是每一個運行級別都要首先運行的重要腳本。它主要完成的工作有:激活交換分區(qū),檢查磁盤,加載硬件模塊以及其它一些需要優(yōu)先執(zhí)行任務。
  rc.sysinit約有850多行,但是每個單一的功能還是比較簡單,而且?guī)в凶⑨專ㄗh有興趣的用戶可以自行閱讀自己機器上的該文件,以了解系統(tǒng)初始化所詳細情況。由于此文件較長,所以不在本文中列出來,也不做具體的介紹。
  當rc.sysinit程序執(zhí)行完畢后,將返回init繼續(xù)下一步。
第四部分:啟動對應運行級別的守護進程
  在rc.sysinit執(zhí)行后,將返回init繼續(xù)其它的動作,通常接下來會執(zhí)行到/etc/rc.d/rc程序。以運行級別3為例,init將執(zhí)行配置文件inittab中的以下這行:
  l5:5:wait:/etc/rc.d/rc 5
 
 這一行表示以5為參數(shù)運行/etc/rc.d/rc,/etc/rc.d/rc是一個Shell腳本,它接受5作為參數(shù),去執(zhí)行/etc/rc.d
/rc5.d/目錄下的所有的rc啟動腳本,/etc/rc.d/rc5.d/目錄中的這些啟動腳本實際上都是一些鏈接文件,而不是真正的rc啟動腳本,
真正的rc啟動腳本實際上都是放在/etc/rc.d/init.d/目錄下。而這些rc啟動腳本有著類似的用法,它們一般能接受start、stop、
restart、status等參數(shù)。
  /etc/rc.d/rc5.d/中的rc啟動腳本通常是K或S開頭的鏈接文件,對于以以S開頭的啟動腳本,將以start參數(shù)來運行。而如果發(fā)現(xiàn)存在相應的腳本也存在K打頭的鏈接,而且已經(jīng)處于運行態(tài)了(以/var/lock/subsys/下的文件作為標志),則將首先以stop為參數(shù)停止這些已經(jīng)啟動了的守護進程,然后再重新運行。這樣做是為了保證是當init改變運行級別時,所有相關(guān)的守護進程都將重啟。
  至于在每個運行級中將運行哪些守護進程,用戶可以通過chkconfig或setup中的"System Services"來自行設(shè)定。常見的守護進程有:
  amd:自動安裝NFS守護進程
  apmd:高級電源管理守護進程
  arpwatch:記錄日志并構(gòu)建一個在LAN接口上看到的以太網(wǎng)地址和IP地址對數(shù)據(jù)庫
  autofs:自動安裝管理進程automount,與NFS相關(guān),依賴于NIS
  crond:Linux下的計劃任務的守護進程
  named:DNS服務器
  netfs:安裝NFS、Samba和NetWare網(wǎng)絡文件系統(tǒng)
  network:激活已配置網(wǎng)絡接口的腳本程序
  nfs:打開NFS服務
  portmap:RPC portmap管理器,它管理基于RPC服務的連接
  sendmail:郵件服務器sendmail
  smb:Samba文件共享/打印服務
  syslog:一個讓系統(tǒng)引導時起動syslog和klogd系統(tǒng)日志守候進程的腳本
  xfs:X Window字型服務器,為本地和遠程X服務器提供字型集
  Xinetd:支持多種網(wǎng)絡服務的核心守護進程,可以管理wuftp、sshd、telnet等服務
  這些守護進程也啟動完成了,rc程序也就執(zhí)行完了,然后又將返回init繼續(xù)下一步。
    第五部分:建立終端
  rc執(zhí)行完畢后,返回init。這時基本系統(tǒng)環(huán)境已經(jīng)設(shè)置好了,各種守護進程也已經(jīng)啟動了。init接下來會打開6個終端,以便用戶登錄系統(tǒng)。通過按Alt+Fn(n對應1-6)可以在這6個終端中切換。在inittab中的以下6行就是定義了6個終端:
  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6
 
 從上面可以看出在2、3、4、5的運行級別中都將以respawn方式運行mingetty程序,mingetty程序能打開終端、設(shè)置模式。同時它會顯示一個文本登錄界面,這個界面就是我們經(jīng)常看到的登錄界面,在這個登錄界面中會提示用戶輸入用戶名,而用戶輸入的用戶將作為參數(shù)傳給login程序來驗證用戶的身份。
  第六部分:登錄系統(tǒng),啟動完成
  對于運行級別為5的圖形方式用戶來說,他們的登錄是通過一個圖形化的登錄界面。登錄成功后可以直接進入KDE、Gnome等窗口管理器。而本文主要講的還是文本方式登錄的情況:
  當我們看到mingetty的登錄界面時,我們就可以輸入用戶名和密碼來登錄系統(tǒng)了。
 
 Linux的賬號驗證程序是login,login會接收mingetty傳來的用戶名作為用戶名參數(shù)。然后login會對用戶名進行分析:如果用戶名
不是root,且存在/etc/nologin文件,login將輸出nologin文件的內(nèi)容,然后退出。這通常用來系統(tǒng)維護時防止非root用戶登
錄。只有/etc/securetty中登記了的終端才允許root用戶登錄,如果不存在這個文件,則root可以在任何終端上登錄。/etc
/usertty文件用于對用戶作出附加訪問限制,如果不存在這個文件,則沒有其他限制。
  在分析完用戶名后,login將搜索/etc/passwd以及/etc/shadow來驗證密碼以及設(shè)置賬戶的其它信息,比如:主目錄是什么、使用何種shell。如果沒有指定主目錄,將默認為根目錄;如果沒有指定shell,將默認為/bin/bash。
 
 login程序成功后,會向?qū)慕K端在輸出最近一次登錄的信息(在/var/log/lastlog中有記錄),并檢查用戶是否有新郵件(在/usr
/spool/mail/的對應用戶名目錄下)。然后開始設(shè)置各種環(huán)境變量:對于bash來說,系統(tǒng)首先尋找/etc/profile腳本文件,并執(zhí)行
它;然后如果用戶的主目錄中存在.bash_profile文件,就執(zhí)行它,在這些文件中又可能調(diào)用了其它配置文件,所有的配置文件執(zhí)行后后,各種環(huán)境變
量也設(shè)好了,這時會出現(xiàn)大家熟悉的命令行提示符,到此整個啟動過程就結(jié)束了。
  希望通過上面對Linux啟動過程的剖析能幫助那些想深入學習Linux用戶建立一個相關(guān)Linux啟動過程的清晰概念,進而可以進一步研究Linux接下來是如何工作的。
關(guān)鍵字:系統(tǒng)、啟動、用戶
分享到:

頂部 】 【 關(guān)閉
版權(quán)所有:佛山思海電腦網(wǎng)絡有限公司 ©1998-2024 All Rights Reserved.
聯(lián)系電話:(0757)22630313、22633833
中華人民共和國增值電信業(yè)務經(jīng)營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網(wǎng)站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網(wǎng)安 舉報有獎  警警  手機打開網(wǎng)站