slackware啟動指令碼詳解(轉)

amyz發表於2007-08-10
slackware啟動指令碼詳解(轉)[@more@]

  我們知道,kernel成功啟動之後,在init/main.c中呼叫execve執行程式/sbin/init。init程式被稱為初始化程式,因為它負責系統的啟動。

  我以我的slackware10為例(不光因為它是我用的套件,而且啟動指令碼十分清晰明瞭),講一講啟動的具體過程:

  (史前時期)loadlin,grub,lilo把核心引數傳給kernel,如(BOOT_IMAGE=Linux ro root=307),,儲存在/proc/cmdline中。

  核心啟動成功後,把它的引數傳給1號程式(init),因為也許有一些引數應被使用者程式解釋。

  init程式將從上到下的讀取/etc/inittab檔案,只要狀態符合當前執行級就會去執行指令碼。

  inittab由幾行組成,每行被三個冒號分隔成四個部分,每個部分具有不同的含義。格式如下:

  行識別符號:狀態:動作:命令

  行識別符號是你的執行級指令碼的名字,不能使用重複的行識別符號。

  狀態是表示執行級指令碼何時應該執行的數字。狀態由0,1,2,3,4,5,6和S一個或多個數字字母組成。如果狀態為空,就是系統啟動必須執行的指令碼。

  下面是slackware的狀態定義:

  0 = halt

  1 = single user mode

  2 = unused (but configured the same as runlevel 3)

  3 = multiuser mode (default Slackware runlevel)

  4 = X11 with KDM/GDM/XDM (session managers)

  5 = unused (but configured the same as runlevel 3)

  6 = reboot

  S同狀態1相同。

  動作有once, wait, respawn, sysinit, crtlaltdel, initdefault組成,說明了init執行指令碼的方式。

  once:init在進入後只執行一次。init不等待命令的結束。

  wait:和once不同的是,init等待命令的結束。

  respawn:命令結束後會被重起。

  sysinit:init最先執行的執行級指令碼,狀態被忽略。說穿了就是無論何是都優先執行的指令碼,應指向系統初始化指令碼。

  ctrlaltdel:當“三指禪”被按下時,該執行級被啟動,一般是指向重啟指令碼。

  initdefault:指定系統啟動時的預設執行級。在sysinit後執行。

  對於slackware的inittab:

  id:3:initdefault:

  id指出預設為多使用者字元介面(3),不要把它設定成0或6!注意沒有命令。

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

  si指出系統初始化執行級,其中S等同於狀態1,它指向/etc/rc.d/rc.S,也就是說init第一個去執行的shell指令碼。

  rc:2345:wait:/etc/rc.d/rc.M

  rc指出多使用者啟動執行級,當狀態為2,3,4,5時被執行,init等待命令的結束,這也是為什麼啟動時沒有shell可用的原因。

  c1:1235:respawn:/sbin/agetty 38400 tty1 linux

  c1指出控制檯1,當它被殺死時init將重啟它。它開啟一個終端tty1供你使用。

  x1:4:wait:/etc/rc.d/rc.4

  x1指出多使用者GUI執行級,指向指令碼rc.4。

  rc.S(系統初始化執行級指令碼)做的事:

  • 安裝proc檔案系統。
  • 決定是否有需要使用Hotplug自動檢測硬體。
  • 啟動devfsd。
  • 安裝devfs。
  • 為2.6核心啟動udev。
  • 開啟交換分割槽,其中要讀取/etc/fstab中獲取分割槽資訊。
  • 檢查根分割槽是否為只讀,因為只有只讀時才能檢查硬碟。
  • 如有需要檢查根分割槽。
  • 安裝sysfs到/proc/sys。
  • 設定硬體時鐘。
  • 配置isa裝置。
  • 執行/etc/rc.d/rc.modules (這個檔案將剩下的核心模組裝入核心,稍後再講)。
  • 初始化lvm卷,不要問我為什麼。
  • 檢查非根分割槽。
  • 安裝本地硬碟分割槽。
  • 刪除臨時檔案。
  • initrd被安裝在/initrd中,它用來在核心啟動第一時間載入一些核心模組和必需程式(如fsck)等。現在解除安裝它。
  • 建立utmp。
  • 如果你是用的zipslack(一個工作在vfat上的linux套件),配置umsdos。
  • 把Linux 2.4.27寫入你的mtod檔案
  • 執行rc.sysvinit。(不像rh,slackware是一個“叛徒”。它的init指令碼結構不像大多數linux套件(基於SVR4),而像BSD,所以只是一個假檔案。)
  • 執行rc.serical。(串列埠)
  • 安裝隨機數種子

  rc.modules:

  • 決定核心版本,到目錄”/lib/modules/你的核心版本號/“去尋找模組
  • 更新核心模組依賴關係。
  • 裝入APM高階管理,它被註釋掉了,建議你啟用它以正常關機。
  • 一大堆被註釋掉了的硬體模組,如果hotplug找不到你的硬體就到這裡來。

  rc.S執行完成後,slackware將執行預設的執行級(3),也就是先執行rc.M(多使用者程式級)。

  • 設定黑屏時間。
  • 設定主機名,主機名儲存在/etc/HOSTNAME裡,預設為darkstar.example.net。
  • 設定dmesg緩衝區的大小。越多越好。
  • 執行rc.syslog,開啟syslog和klogd。
  • 執行rc.pcmcia,初始化PCMCIA卡,我不懂。
  • 執行rc.inet1,設定網路。重點。
  • 執行rc.hotplug,即插即用。
  • 執行rc.inet2,網路守護程式。重點。
  • 把所有的鎖檔案刪掉。
  • 把黑洞裝置和臨時目錄設成777。
  • 執行ldconfig,更新共享庫,我喜歡關掉。
  • 更新X字型快取,關掉吧。不過安了新字型後自己要手動執行一次”fc-cache"而已。
  • 執行rc.CUPS,UNIX列印守護程式。
  • 開啟appletalk。關了吧。
  • 開啟使用者限額。請看/usr/doc/Linux-HowTOs/Quota。
  • 執行rc.acpid。高階能源管理。
  • 執行rc.alsa。alsa聲音系統。
  • 執行rc.font。使用者自己的字型。
  • 執行rc.keymap。使用者自己的keymap。
  • 把你的一大堆網路standalone程式開啟。
  • 執行rc.gpm。字元介面上用滑鼠。
  • 又執行rc.sysinit一次。BUG?
  • 執行rc.local。最後,執行使用者你的自己的配置檔案。

  rc.inet1:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-941377/,如需轉載,請註明出處,否則將追究法律責任。

相關文章