linux的開/關機腳本執行順序和自啓動腳本實踐

linux

Linux是一種開源電腦操作系統內核。它是一個用C語言寫成,符合POSIX標準的類Unix操作系統。

90年代初期Linux開始出現的時候,僅僅是以源代碼形式出現,用戶需要在其他操作系統下進行編譯才能使用。後來出現了一些正式版本。目前最流行的幾個正式版本有:SUSE、RedHat、Fedora、Debian、Ubuntu、CentOS、Gentoo,等等。用戶可根據自己的經驗和喜好選用合適的Linux發行版。
原先Linus TorvaldsLinux置於一個禁止任何商業行爲的條例之下,但之後改用GNU通用公共許可證第二版。該協議允許任何人對軟件進行修改或發行,包括商業行爲,只要其遵守該協議,所有基於Linux的軟件也必須以該協議的形式發表,並提供源代碼。

對於開發人員而言,很多時候都會接觸到LINUX系統,甚至要去維護和開發,所以對開機/關機過程需要一定的認識,特別是服務器大部分都是linux系統的時候,我們重啓服務、切換服務等都需要保障服務的功能不能中斷,這就更需要對linux的運行過程有深入的認識,本文只是記錄一小部分過程。

Linux操作系統運行級別

Linux 使用的是基於運行級(run-levels) 概念的稱爲 SysVinit 的專用啓動工具。 它在不同的系統上可能是完全不一樣的, 所以不能認爲一個腳本在某個 Linux 發行版上工作正常。

SysVinit以運行級的模式來工作,一般有 7 (從 0 到 6)個運行級 (實際上可以有更多的運行級,但都是用於特殊情況而且一般使用不到。 參見 init(8)以獲得更多信息),每個運行級對應於一套設定好的任務, 當啓動一個運行級的時候, 計算機就需要執行相應的任務。 默認的運行級是 3,下面是對不同運行級的描述:

0: 關閉計算機
1: 單用戶模式
2: 無網絡多用戶模式
3: 有網絡多用戶模式
4: 保留作自定義,否則同運行級 3 
5: 同運行級 4,一般用於圖形界面(GUI)登錄(如 X的 xdm 或 KDE的 kdm) 
6: 重啓動計算機

可以使用runlevel查看,也可以在/etc/inittab文件中看到以下:

# 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)
# 
id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

也就是說我們系統的運行級別目前是3,那麼需要看的就是/etc/rc3.d下的內容,其實裏面都是軟連接,所有的軟鏈指向/etc/init.d/中的腳本文件,命名規範如下:

[K|S][number][service name] --> ../init.d/servicename
      S 表示 Start,開啓服務
      [number]表示的是該腳本的運行優先級,number越小,腳本的運行優先級就越高
      [service name]表示的是服務的名稱。
      因此我們如果需要定義一個服務啓動的優先級(順序),則需指定腳本的number即可。

開機過程

  1. 加載內核

    打開電腦電源,開始讀取 BIOS 並進行主機的自我測試;透過 BIOS 取得第一個可開機裝置,讀取主要開機區 (MBR) 取得開機管理程式;
    LILO啓動之後,如果你選擇了Linux作爲準備引導的操作系統,第一個被加載的東西就是內核。請記住此時的計算機內存中還不存在任何操作系統,PC(因爲它們天然的設計缺陷)也還沒有辦法存取機器上全部的內存。因此,內核就必須完整地加載到可用RAM的第一個兆字節之內。爲了實現這個目的,內核是被壓縮了的。這個文件的頭部包含着必要的代碼,先設置CPU進入安全模式(以此解除內存限制),再對內核的剩餘部分進行解壓縮。
  2. 執行內核

    內核在內存中解壓縮之後,就可以開始運行了。此時的內核只知道它本身內建的各種功能,也就是說被編譯爲模塊的內核部分還不能使用。最基本的是,內核必須有足夠的代碼設置自己的虛擬內存子系統和根文件系統(通常就是ext2文件系統)。一旦內核啓動運行,對硬件的檢測就會決定需要對哪些設備驅動程序進行初始化。從這裏開始,內核就能夠掛裝根文件系統(這個過程類似於Windows識別並存取C盤的過程)。內核掛裝了根文件系統之後,將啓動並運行一個叫做init的程序。
  3. init進程

    init 程式開始執行系統初始化,最先讀取/etc/inittab文件中的配置,配置中一般是先執行下 /etc/rc.d/rc.sysinit,然後執行/etc/init.d/functions ,設置環境變量等,同時讀取runlevel的配置級別,對於嵌入式開發而言,在執行rcN.d之前會有/etc/init.d/rcS 單用戶模式啓動腳本的執行
    依據 init 的設定的initdefault進行 daemon start (/etc/rc.d/rc[0-6].d/*),依次執行腳本,啓動服務。關機時依次關閉服務。
    rc0.d~rc.6.d文件夾下分別對應的是操作系統0-6級運行的狀態下需要執行的腳本。在這些文件夾下的文件,都是軟鏈文件,指向指定位置的腳本,這些軟鏈都是指向同一個文件夾/etc/init.d/的腳本文件,
  4. 載入本機設定 (/etc/rc.d/rc.local)

    rc.local文件,

/etc/profile文件。這個文件是系統啓動時,任何用戶登錄時執行的文件。任何用戶登錄前,root用戶也會執行一遍。

~/.bash_profile文件。這個文件每個用戶都有。它在用戶登錄時自動執行,擁有用戶的權限。它export的環境變量對該用戶隨後啓動的進程都有效。

自啓動腳本實踐

  • 如果用戶需要開機自動以root權限執行一些腳本,那麼最好的方法是編輯/etc/rc.d/rc.local文件。
  • 如果每一個用戶登錄時都應該執行的腳本,如設置一些環境變量。那麼應該修改/etc/profile文件。
  • 如果某一個特定用戶登錄時應該執行特定的腳本,如設置該用戶特定的環境變量,應該修改~/.bash_profile文件。
============
/etc/profile
============
此文件爲系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行.
並從/etc/profile.d目錄的配置文件中搜集shell的設置.

===========
/etc/bashrc
===========
爲每一個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取.

===============
~/.bash_profile
===============
每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該
文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件.

=========
~/.bashrc
=========
該文件包含專用於你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該文件被讀取.

==========
~/.profile
==========
在Debian中使用.profile文件代 替.bash_profile文件
.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)兩個文件是.bash_profile的同義詞,目的是爲了兼容其它Shell。在Debian中使用.profile文件代 替.bash_profile文件。

==============
~/.bash_logout
==============當每次退出系統(退出bash shell)時,執行該文件. 

Linux如何實現開機啓動程序詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章