Linux系統詳解 第六篇:系統的啟動、登入登出、與開關機

前言:

本系列文章取材廣泛,有來自於網際網路的,有來自教科書的,有來自自己的筆記的,也有來自自己對Linux的經驗積累的。此係列的文章都是經過長時間的整理並多次修改後釋出。本文章的目的是為了讓剛入門Linux的讀者能夠快速的入手而無需到此搜尋網路和尋找教材,本系列文章也適應已經對Linux有一定的基礎的讀者加深印象或者說是回顧吧。由於個人的力量是有限的,所以在編寫過程中難免有錯別字或者疏漏的地方,希望眾大讀者如果發現本文章有什麼疏漏的地方請指出,以讓把文章修改得更好,從而讓更多的讀者在閱讀的時侯減少閱讀誤解。就像Linux的誕生一樣也是經過大眾的參與而逐步發展並強壯起來的,一人為”人”兩人為”從“三人為”眾“。眾志成城!所以讓我們,共同努力,共同學習,共同進步;快樂分享,快樂工作,快樂成長!這可是我一直倡導的主題精神O!

本篇學習目標

  • 瞭解Linux系統的啟動原裡。
  • 瞭解Linux系統的終端。
  • 熟悉Linux的登入和登出;關機、重啟、系統基本操作。
  • 熟悉Linux系統中使用者的切換,和檢視系統中和登入使用者有關的其他操作。

正文:

瞭解Linux系統的啟動原裡。

Linux的啟動過程簡介:

當使用者開啟計算機的電源的時候,首先會進行BIOS自檢,根據BIOS中設定的啟動裝置進行啟動。接著計算機讀取硬碟上的MBR記錄冰啟動裝置上安裝的載入程式GRUB或者LILO,載入程式接著開始引導Linux系統。此時,BIOS會將CPU的控制權交給Linux系統,Linux系統重新進行硬體自檢讓後引導核心,接下來執行init父程式,系統會根據/etc/inittab檔案選擇系統的啟動級別並呼叫rc.sysinit和/etc/rc目錄中的腳步。最後到達使用者的登入介面,使用者輸入正確的憑據後,就進入系統。到此,Linux啟動啟動完成。

上面只是簡單的介紹了Linux系統啟動過程,下面讓我們對Linux系統的啟動過程進行詳細的講解。

Linux系統的整個啟動需要經過多個步驟,我們逐一的對其進行分析。

1.BIOS開機自檢

計算機在接通電源之後首先由BIOS進行POST(Power On Self Testing)開機自檢,接著安裝BIOS設定的引導順序從網路、軟盤、硬碟、或光碟機中讀入載入程式。Linux系統通常都是從硬碟上引導的,其中分割槽中的主開機記錄(MBR)包含主引導載入程式(GRUB或者LILO)。MBR是一個512位元組大小的扇區,位於磁碟上的第一個扇區(0磁軌0柱面1扇區)。當MBR被載入到記憶體之後,BIOS就會將控制權交給MBR。Linux系統是從BIOS中的地址0xFFFF0處開始引導的。BIOS的第1個步驟是加電進行POST自檢。POST的工作是對硬體進行檢測。BIOS的第2個步驟是進行本地裝置的列舉和初始化。BIOS由兩部分組成:POST程式碼和執行時的服務。當POST在記憶體中完成自檢之後,POST程式碼將從記憶體中清理出來,但是BIOS執行時服務依然保留在記憶體中,這些服務可以提供給目標作業系統使用。

2.啟動GRUB/LILO引導載入程式

GRUB和LILO都是引導載入程式,但是LILO現在很少用了。引導載入程式用於引導作業系統啟動。當機器引導它的作業系統時,BIOS會讀取引導介質上最前面的512位元組(主開機記錄)。在單一的MBR中只能儲存一個作業系統的引導記錄,所以當安裝了多個作業系統時引導就會出現問題,所以就需要更靈活的引導載入程式。

所有引導載入程式都以類似的方式工作,滿足共同的目的,但LILO現在已經很少用了,因為l LILO沒有互動式命令介面、並且不支援從網路引導。所以現在大部分的系統引導載入程式都用GRUB。GRUB包含許多特性,這使得GRUB比其他可用的引導載入程式更加優越,下面列出一些比較重要的特性:

(1)GRUB在x86機器上提供一個真正基於命令列的、先於作業系統啟動的環境。

(2)GRUB支援邏輯塊定址(LBA)方式。

LBA的主要作用是尋找驅動器上檔案的地址並將其置於驅動器的硬體中,它被用在許多IDE和SCSI硬碟中。在使用LBA之前,硬碟驅動器遇到一個1024柱面的限制,即BIOS不能找到在1024柱面後的檔案(比如一個引導載入程式或是核心檔案)。只要系統BIOS能支援LBA模式(大多數都支援),那麼LBA就允許GRUB超越1024柱面的限制,引導作業系統。

(3)GRUB的配置能在每次系統引導時被讀取。

這就避免了使用者每次改變引導選項時都要重寫一次主開機記錄。大多數的引導載入程式都不能讀取配置檔案,並使用它們來設定引導選項。比如,使用者必需改變一個LILO的配置檔案,然後執行一個命令將新的配置資料重寫回系統的主開機記錄。這種方法比GRUB所採用的方法更加危險,因為一個錯誤配置的主開機記錄將使系統無法引導。在使用GRUB中,如果配置檔案被錯誤配置並且引導,那它也僅僅簡單地轉到一個預設的命令列,允許使用者手工輸入命令來執行作業系統。

下面對GRUB配置檔案進行講解:

GRUB的配置是通過位於/boot/grub/grub.conf的一個配置檔案來完成的。下面給出了一個示例配置,示例中安裝了雙系統,支援Linux和Windows的雙重引導。

# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/hda2 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=10 splashp_w_picpath=(hd1,3)/grub/splash.xpm.gz password –md5 $opeVt0$Y.br.18LyAasRsGdSKLYlp1 title RHEL AS4 (2.6.9-22.EL) password –md5 peVt0$Y.br.18LyAasRsGdSKLYlp1 root (hd1,3) kernel / vmlinuz-2.6.9-22.EL ro root=LABEL=/ rhgb quiet initrd / initrd-2.6.9-22.EL.img title Windows XP password –md5 peVt0$Y.br.18LyAasRsGdSKLYlp1 rootnoverify (hd0,0) chainloader +1

default=0表示引導第一個映像所指定的系統,default=1表示引導第二個映像所指定的系統,依次類推。如果沒有在配置檔案指定此選項,那麼它將引導檔案中指定的第一個映像。

“timeout=”:在自動引導預設作業系統(在本例中是RHEL 4)之前引導提示會等待多少秒。

“splashp_w_picpath=”:GRUB GUI背景的圖片所在的位置。

“password”:指定了使用MD5加密的口令。

“title”:標明瞭在執行期間能夠從使用者介面引導的具體作業系統。

“root”:GRUB作業系統檔案系統的實際位置。GRUB引用介質的方式與LILO不同。在LILO示例中,/dev/hdb3是第二塊硬碟中的第三個分割槽。GRUB將此硬碟引用為(hd1,3),即第二塊硬碟的第三個分割槽(disk 0是第一塊硬碟)。

“kernel”:vmlinuz-2.6.9-22.EL是root目錄中預設引導映像的名稱。

“initrd”:initrd-2.6.9-22.EL.img是root目錄中預設initrd映像的名稱。

“rootnoverify”:告訴GRUB不要嘗試去改變作業系統的root。這樣,當檔案系統不被GRUB所支援時,不會出現引導錯誤。

“chainloader +1”:告訴GRUB使用一個鏈式載入程式來載入這個作業系統,載入Windows時需要這個選項。

與LILO的配置檔案不同,grub.conf會在引導時被讀取,當被修改時不必去更新MBR。

3.載入核心

接下來的步驟就是載入核心映像到記憶體中,核心映像並不是一個可執行的核心,而是一個壓縮過的核心映像。通常它是一個zImage(壓縮映像,小於512KB)或是一個bzImage(較大的壓縮映像,大於512KB),它是提前使用zlib壓縮過的。負責核心映象的解壓和執行的是一個例程,它可以利用少量硬的件設定,對核心映像中包含的核心進行解壓縮,然後將解壓縮後的映象其放入高階記憶體中。如果有初始記憶體磁碟映像,系統就會將它移動到記憶體中,並標明以後使用。然後該例程會呼叫核心,並開始啟動核心引導的過程。

4.執行init程式

init程式是系統所有程式的起點,核心在完成核內引導以後,即在本程式空間內載入init程式,它的程式號是1。init程式是所有程式的發起者和控制者。因為在任何基於Linux的系統中,它都是第一個在執行的程式,所以init程式的編號(PID)永遠是1。

init程式有以下兩個作用:

init程式的第一個作用是扮演終結父程式的角色。因為init程式永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它為參照。如果某個程式在它衍生出來的全部子程式結束之前被終止,就會出現必須以init為參照的情況。此時那些失去了父程式的子程式就都會以init作為它們的父程式。

init的第二個作用是在進入某個特定的執行級別時執行相應的程式,以此對各種執行級別進行管理。它的這個作用是由/etc/inittab檔案定義的。可以在該檔案中定義系統執行級別,級別編號從0到6和S/s,修改/etc/inittab檔案,找到id:5:initdefault:這一行,把“5”改成相應的數字id的執行級別即可。以下是/etc/inittab檔案的內容:

inittab是一個不可執行的文字檔案,它由若干行命令所組成。在RHEL 5系統中,inittab配置檔案的內容如下所示。

# # 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 have networking) # 3 – Full multiuser mode # 4 – unused # 5 – X11 # 6 – reboot (Do NOT set initdefault to this) # //表示當前預設執行級別為5,啟動系統進入圖形化介面 id:5:initdefault: //啟動時自動執行/etc/rc.d/rc.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為引數執行/etc/rc.d/rc指令碼,init將等待其返回 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 //在啟動過程中允許按[CTRL+ALT+DELETE]重啟系統 # 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為引數執行/sbin/mingetty程式,開啟ttyX終端用於使用者登入, 如果程式退出則再次執行mingetty程式 # 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圖形方式登入介面,並在退出時重新執行 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon

inittab配置檔案每行的基本格式如下。

id:runlevels:action:process

其中某些部分可以為空,下面我們逐一介紹。

1.id:1~2個字元,配置行的惟一標識,在配置檔案中不能重複。
2.runlevels :配置行適用的執行級別,在這裡可填入多個執行級別,比如12345或者35等。 Linux有7個執行級別,下面分別對各個級別進行講解:

開機執行級別0:用來關閉系統。(建議不要把/etc/inittab檔案的initdefault值設定為0)

開機執行級別1:用來進行單一使用者模式(字元介面)。

開機執行級別2:用來執行不帶網路功能的多使用者使用模式(字元介面)。

開機執行級別3:用來執行帶網路功能的多使用者戶使用模式(字元介面)。

開機執行級別4:用來執行使用者指定義的使用模式(保留不用)。

開機執行級別5:用來執行進入具有網路功能的X windows時的模式,也就是我們所說的圖行介面。

開機執行級別6:用來重啟系統。(建議不要把/etc/inittab檔案的initdefault值設定為6)

S/s不是用來直接使用的,配合開機執行級別1使用,當加上S/s後,表示開機後不不參考/etc/inittab檔案。

如果不想更改系統的預設開機執行級別,而是想臨時卻換的話,可以在終端中輸入init +相應的開機執行級別命令進行臨時卻換。如在文字終端模式下,輸入init 5則可以臨時進入x windows圖形介面。

3.action :Init有如下幾種行為。

respawn :啟動並監視第4項指定的process,若process終止則重啟它

wait :執行第4項指定的process,並等待它執行完備

once: 執行第4項指定的process

boot :不論在哪個執行等級,系統啟動時都會執行第4項指定的process

bootwait :不論在哪個執行等級,系統啟動時都會執行第4項指定的process,且一直等它執行完備

off :關閉任何動作,相當於忽略該配置行

ondemand :進入ondemand執行等級時,執行第4項指定的process

initdefault :系統啟動後進入的執行等級,該行不需要指定process

sysinit :不論在哪個執行等級,系統會在執行boot及bootwait之前執行第4項指定的process

powerwait :當系統的供電不足時執行第4項指定的process,且一直等它執行完備

powerokwait :當系統的供電恢復正常時執行第4項指定的process,且一直等它執行完備

powerfailnow :當系統的供電嚴重不足時執行第4項指定的process

ctrlaltdel :當使用者按下【Ctrl+Alt+Del】時執行的操作

kbrequest :當使用者按下特殊的組合鍵時執行第4項指定的process,此組合鍵需在keymaps檔案定義。

5./etc/inittab檔案進行初始化

init的工作是根據/etc/inittab來執行相應的指令碼,進行系統初始化,如設定鍵盤、字型、裝載模組,設定網路等。

etc/rc.d/rc.sysinit

在init的配置檔案中有如下一行:

si::sysinit:/etc/rc.d/rc.sysinit

rc.sysinit是由init執行的第一個指令碼,它主要完成一些系統初始化的工作。rc.sysinit是每一個執行級別都要首先執行的重要指令碼,它主要完成的工作有:啟用交換分割槽、檢查磁碟、載入硬體模組以及其他一些需要優先執行的任務。/etc/rc.d/rc.sysinit主要完成各個執行模式中相同的初始化工作,包括:

  • 設定初始的$PATH變數;
  • 配置網路;
  • 為虛擬記憶體啟動交換;
  • 設定系統的主機名;
  • 檢查root檔案系統,以進行必要的修復;
  • 檢查root檔案系統的配額;
  • 為root檔案系統開啟使用者和組的配額;
  • 以讀/寫的方式重新裝載root檔案系統;
  • 清除被裝載的檔案系統表/etc/mtab;
  • 把root檔案系統輸入到mtab;
  • 使系統為裝入模組做準備;
  • 查詢模組的相關檔案;
  • 檢查檔案系統,以進行必要的修復;
  • 載入所有其他檔案系統;
  • 清除/etc/mtab、/etc/fastboot和/etc/nologin;
  • 刪除UUCP的lock檔案;
  • 刪除過時的子系統檔案;
  • 刪除過時的pid檔案;
  • 設定系統時鐘;
  • 啟用交換分割槽;
  • 初始化串列埠;
  • 裝入模組。

6.執行etc/rc.d/rcX.d/

在rc.sysinit執行後,將返回init,繼續執行/etc/rc.d/rc程式。以執行級別5為例,init將執行配置檔案inittab中的以下內容:

l5:5:wait:/etc/rc.d/rc 5

這一行表示以5為引數執行/etc/rc.d/rc,/etc/rc.d/rc是一個shell指令碼,它接受5作為引數,去執行/etc/rc.d/rc5.d/目錄下的所有的rc啟動指令碼,/etc/rc.d/rc5.d/目錄中的啟動指令碼實際上都是一些連結檔案,而不是真正的rc啟動指令碼,真正的rc啟動指令碼實際上都在/etc/rc.d/init.d/目錄下。而這些rc啟動指令碼有著類似的用法,它們一般能接受 start、stop、restart、status等引數。

/etc/rc.d/rc5.d/中的rc啟動指令碼通常是以K或S開頭的連結檔案,以S開頭的啟動指令碼將以start引數來執行。如果發現相應的指令碼也存在K打頭的連結,而且已經處於執行態了(以/var/lock/subsys/下的檔案作為標誌),則將首先以stop為引數停止這些已經啟動了的守護程式,然後再重新執行。這樣做是為了保證當init改變執行級別時,所有相關的守護程式都將重啟。

這個目錄下的程式可通過chkconfig程式進行管理,當然這個目錄下的程式需要符合一定規範,如果瞭解shell程式設計,可以檢視這些符號連結所指向的程式的原始碼。

init也是一個程式,和普通的程式具有一樣的屬性。比如修改了/etc/inittab,想讓修改馬上生效,可通過執行“kill -SIGHUP 1”來實現,也可通過執行“init q”來實現。

7.執行/etc/ec.d/rc.local

RHEL 4中的執行模式2、3、5都把/etc/rc.d/rc.local做為初始化指令碼中的最後一個,所以使用者可以自己在這個檔案中新增一些需要在其他初始化工作之後、登入之前執行的命令。在維護Linux系統時一般會遇到需要系統管理員對開機或者關機命令指令碼進行修改的情況。如果所做的修改只在引導開機的時候起作用,並且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local指令碼。這個命令指令碼程式是在引導過程的最後一步被執行的。

8.執行/bin/login程式

login程式會提示使用者輸入賬號及密碼,接著編碼並確認密碼的正確性,如果賬號與密碼相符,則為使用者初始化環境,並將控制權交給shell,即等待使用者登入。

login會接收mingetty傳來的使用者名稱作為使用者名稱引數,然後login會對使用者名稱進行分析。如果使用者名稱不是root,且存在/etc/nologin檔案,login將輸出nologin檔案的內容,然後退出。這通常用來在系統維護時防止非root使用者登入。只有在/etc/securetty中登記了的終端才允許root使用者登入,如果不存在這個檔案,則root可以在任何終端上登入。/etc/usertty檔案用於對使用者作出附加訪問限制,如果不存在這個檔案,則沒有其他限制。

在分析完使用者名稱後,login將搜尋/etc/passwd以及/etc/shadow來驗證密碼以及設定賬戶的其他資訊,比如:主目錄是什麼、使用何種shell。如果沒有指定主目錄,則將主目錄預設設定為根目錄;如果沒有指定shell,則將shell型別預設設定為/bin/bash。

login程式成功後,會向對應的終端再輸出最近一次登入的資訊(在/var/log/lastlog中有記錄),並檢查使用者是否有新郵件(在/usr/spool/mail/的對應使用者名稱目錄下),然後開始設定各種環境變數。對於bash來說,系統首先尋找/etc/profile指令碼檔案並執行它;然後如果使用者的主目錄中存在.bash_profile檔案,就執行它,在這些檔案中又可能呼叫了其他配置檔案,所有的配置檔案執行後,各種環境變數也設好了,這時會出現大家熟悉的命令列提示符,至此整個啟動過程就結束了。

登入到Linux系統

1.首先先讓我們瞭解一下登入到Linux的基礎知識:

虛擬控制檯:RHEL在電腦為使用者提供了6個可以使用的虛擬控制檯(Virtual Console)擬當Unix的”啞終端“。我們可以用CTRL+ALT+F1~F6這6個組合鍵來訪問對應的VC,每個VC對應6個組合鍵中的一個,在圖形介面時可以用組合鍵CTRL+ALT+F7回到圖形環境。

X圖形環境(X-server),當它啟動時,它會找到”第一個可以用”的VC。因為通常有6個VC用於文字終端,X-Server一般會使用第7個VC。如果正在使用VC,並且知道X-Server在機器上執行,通常可以用CTRL+ALT+F7卻換到X-Server。

圖形環境中的終端:和VC相似。

可以用who命令判斷誰在系統上,其中顯示的TTY1、TTY2……表示VC1、VC2…….。0指X-Server本身,PTS/0表示在X-Server中開啟的第一個終端。

可以通過網路登入一臺機器:可以使用SSH(Security Shell),Telnet等工具輕易地登入到遠端機器上,不過要求遠端機器配置為”執行遠端登入“而且使用者在此臺機器上必須有賬號存在,那麼登入遠端機器就像登入VC一樣容易。

2.識別終端型別:

TTYN:虛擬控制檯

TTYSN:串列埠埠裝置

PTS/N:作為終端(一個模擬的終端,常被X圖形環境中的終端視窗或者始於網路的SHELL(如SSH霍總Telnet)使用),偽終端不能直接與物理裝置相連。

:0:X-Server:並不是真正的終端,當使用者使用X圖形介面環境的登入管理器登入時,其終端經常被視為X-Server。

3.管理終端:

在終端中可以用以下快捷鍵進行管理:

CTRL+C:非常規終端,中斷前臺程式。

CTRL+H:刪除一個字元

CTRL+U:刪除當前行

CTRL+S:鎖住終端

CTRL+Q:解鎖終端

CTRL+L:bash清屏

CTRL+Z:掛起前臺顯示

CTRL+J:換行

Linux系統終端下的關機和重啟和登出

Linux系統啟動後,螢幕上將快速閃過一串串啟動內容的文字提示,在各服務正常啟動之後,系統會顯示

linux login:

提示使用者登入。如果使用者想要以超級使用者的身份登入,在”login:”後面輸入”root”,然後回車,系統提示

Password:

該提示提醒使用者輸入安裝時設定的系統管理員密碼並按Enter鍵,如果密碼正確,系統將完成登入。

一般情況下,為了安全考慮不推薦使用root賬號登入系統。因為root賬號許可權太大,很容易由於誤操作導致系統崩潰,一般情況下都以普通使用者賬號登入系統。

在使用普通賬號的過程中如果要完成某些只有root賬號才能執行的操作,要臨時以root賬號登入,或者想要以其他賬號臨時登入系統,Linux系統提供了su命令。su命令格式如下:

su 使用者名稱,如從普通賬戶切換到root賬戶可以用SU -或者SU root。

如果要退出某個使用者的登入,可以使用exit命令登出系統。

Linux提供了三種關機/重啟系統的命令:shutdown、halt和reboot。這三個命令在一般情況下只有系統的超級使用者(一般是指root)才可以執行。輸入沒有引數的shutdown命令,兩分鐘之後即可關閉系統。在這段時間,Linux將提示所有已經登入系統的使用者系統將要退出。

該命令的一般格式為

shutdown [選項] [時間] [警告資訊]。

其中,命令中[選項]的含義為

k:並不真正關機,只是發出警告資訊給所有使用者;

r:關機後立即重新啟動;

h:關機後不重新啟動;

f:快速關機,重新啟動時跳過fsck;

n:快速關機,不經過init程式;

c:取消一個已經執行的shutdown。

如果要設定等待的時間,可以使用[時間]的選項。

now:立即退出系統;

+mins:在指定的分鐘之後退出系統;

hh:ss:在指定的時間退出系統。

在關掉系統之前,系統會自動產生一個/etc/nologin檔案,用於說明系統即將關閉,使用者不能登入進入。在這段時間中,只有系統管理員可以進入。如果使用者要獲得有關shutdown命令的更詳細的幫助,可以使用man shutdown命令。

halt命令相當於shutdown -h now,表示立刻關機。reboot命令相當於shutown -r now,表示立刻重新啟動。