當前位置:首頁 » 操作系統 » linux的啟動過程

linux的啟動過程

發布時間: 2023-09-12 19:24:35

A. linux中啟動進程的方法有哪些哪種更好用

Linux手工啟動進程

手工啟動進程指的是由用戶輸入命令直接啟動一個進程,根據所啟動的進程類型和性質不同,又細分為前台啟動和後台啟動兩種。

前台啟動進程

這是手工啟動進程最常用的方式,因為當時輸入一個命令並運行,就已經啟動了一個進程,而且是一個前台的進程,此時系統其實已經處於一個多進程的狀態,一個是shell進程,另一個是新啟動的進程。

實際上,系統自動時就有許多進程悄悄地在後台運行,不過為了方便閱讀,並沒有將這些進程包括在內。

假如啟動一個比較耗時的進程,然後再把該進程掛起,並使用ps命令查看,就會看到該進程在PS顯示列表中。將進程掛起,指的是將前台運行的進程放到後台,並且暫停其運行。

後台啟動進程

進程直接從後台運行,用的相對比較少,除非該進程非常耗時,且用戶也不急著需要其運行結果的時候,例如,用戶需要啟動一個需要長時間運行的格式化文本文件的進程,為了不使整個shell在格式化過程中都處於被佔用狀態,從後台啟動這個進程是比較明智的選擇。

從後台啟動進程,其實就是在命令結尾處添加一個&符號。輸入命令並運行之後,shell會提供給我們一個數字,此數字就是該進程的進程號。然後直接就會出現提示符,用戶就可以繼續完成其他工作。

手工啟動的2種方式,實際上它們有個共同的特點,就是新進程都是由當前shell這個進程產生的,換句話說,是shell創建了新進程,於是稱這種關系為進程間的父子關系,其中shell是父進程,新進程是子進程。

且一個父進程可以有多個子進程,通常子進程結束後才能繼續父進程;當然,如果是從後台啟動,父進程就不用等待子進程了。

Linux調度啟動進程

在Linux系統中,任務可以被配置在指定的時間、日期或者系統平均負載量低於指定值時自動啟動。

例如,Linux預配置了重要系統任務的運行,以便可以使系統能夠實時被更新,系統管理員也可以使用自動化的任務來定期對重要數據進行備份。

實現調度啟動進程的方法有很多,比如通過crontab、cat等命令。

B. 怎樣製作LINUX啟動U盤

分類: 電腦/網路 >> 操作系統/系統故障
問題描述:

我有一個U盤,256M的,如和製作一個LINUX啟動U盤??

解析:

U盤做Linux的啟動盤

摘要

本文描述了如何在USB存儲設備上建立Linux啟動系統的過程。

首先讓我們先了解一下LINUX下USB設備, Linux USB 驅動程序有三種不同的 USB 主控制器選項,這是因為在主板和 PCI 卡上有三種不同類型的 USB 晶元。"EHCI"驅動程序設計成為實現新的高速 USB 2.0 協議的晶元提供支持。"OHCI"驅動程序用來為非 PC 系統上的(以及帶有 SiS 和 ALi 晶元組的 PC 主板上的)USB 晶元提供支持。"UHCI"驅動程序用來為大多數其它 PC 主板(包括 Intel 和 Via)上的 USB 實現提供支持。只需選擇與希望啟用的 USB 支持的類型對應的"?HCI"驅動程序即可。

啟用了"USB support"和適當的"?HCI"USB 主控制器驅動程序後,使 USB 啟動並運行只需再進行幾個步驟。應該啟用"Preliminary USB device filesystem",SCSI計算機標准介面,因為通常我們的USB存儲設備,模擬為SCSI硬碟而進行訪問

一、關於內核

u *** -storage模塊包括在內核但是由於U盤的初始化過程比執行/ *** in/init慢,導致內核已經啟動完成了,優盤還沒有完成初始化工作,因此根文件系統沒有載入,這時執行/ *** in/init命令肯定不成功。所以要對系統內核初始化代碼作修改如下:

/init/do_mounts.c

……

* Allow the user to distinguish beeen failed open

* and bad superblock on root device.

*/

- printk ("VFS: Cannot open root device "%s" or %s",

+ printk ("VFS: Cannot open root device "%s" or %s,

retrying in 1 second.", root_device_name, kdevname (ROOT_DEV));

- printk ("Please append a correct "root=" boot option");

- panic("VFS: Unable to mount root fs on %s",

- kdevname(ROOT_DEV));

+ printk ("You may need to append a correct "root=" boot option");

+ printk ("or wait for the root device to bee ready.");

+

+ /* wait 1 second and try again,

+ * allowing time for hubs/devices to bee ready */

+ set_current_state(TASK_INTERRUPTIBLE);

+ schele_timeout(HZ);

+ goto retry;

}

panic("VFS: Unable to mount root fs on %s", kdevname(ROOT_DEV));

out:

……

按照需要重新編譯內核。

您也可以在啟動內核時載入initrd.img文件到內存中,等待3秒使優盤完成初始化工作,再執行/ *** in/init指令。

1、建立initrd.img文件

# mkdir -p /mnt/initrd

# cd /tmp

# mkinitrd /tmp/initrd.gz 2.4.20-u ***

2、解壓initrd.img文件,修改啟動腳本linuxrc

# gunzip initrd.gz

# mount -o loop /tmp/initrd /mnt/initrd

# cp / *** in/busybox /mnt/initrd/bin

# cd /mnt/initrd/bin

# ln -s busybox sleep

# vi /mnt/initrd/linuxrc

加入如下內容:

echo wait 3 seconds.....

/bin/sleep 3

3、重新生成initrd.img文件

由於預設建立的initrd文件比較大(為4MB),為了加快優盤的啟動,必須減小它。具體操作如下:

# mkdir -p /mnt/initr ***

# cd /tmp

# dd if =/dev/zero of= /tmp/initr *** bs=1M count=1

# mke2fs -m 0 initr ***

# mount -o loop /tmp/initr *** /mnt/initr ***

# cp -a /mnt/initrd/* /mnt/initr ***

# umount /mnt/initrd

# umount /mnt/initr ***

# cd /tmp

# gzip -9 initr ***

# cp initr *** .gz /boot/initrd-2.4.20-u *** .img

二、建立優盤啟動配置與目錄結構

(/dev, /proc, /bin, /etc, /lib, /usr, /tmp, /var)

1、將優盤分成兩個分區

留給Linux分區容量大小完全取決於安裝哪些系統維護工具,結果如下:

# fdisk -l /dev/sda

Disk /dev/sda: 16 heads, 63 sectors, 126 cylinders

Units = cylinders of 1008 * 512 bytes

Device Boot Start End Blocks Id System

/dev/sda1 1 102 51376+ 6 FAT16

/dev/sda2 103 126 12096 83 Linux

注意:如果需要使用優盤引導Windows 98,扇區大小必須設置為63個扇區,可以通過fdisk的x命令擴展修改heads、sectors和cylinders參數。最好還是利用U盤相應工具建立.

2、建立與生成ext2分區

# mke2fs -m 0 /dev/sda2

# mkdir -p /mnt/sda2

# mount /dev/sda2 /mnt/sda2

# cd /mnt/sda2

3、建立boot目錄

將編譯好的內核與initrd.img文件拷貝到boot目錄、編譯好的模塊拷貝到lib/moles目錄,以及將/boot/grub的文件拷貝到boot目錄,編輯boot/grub/menu.lst文件,內容如下:

timeout 10

color 0x17 0x70

default 0

title Windows 98

rootnoverify (hd0,0)

makeactive

chainloader +1

title GNU/Linux Redhat 8.0 (2.4.20-u *** )

root (hd0,1)

kernel /boot/bzImage ro root=/dev/sda2

initrd /boot/ initrd.img 如果沒有initrd.img,這句就不要了

安裝grub,具體操作如下:

grub>; root (hd1,1)

grub>; setup (hd1)

4、建立bin目錄

根據自工作的需要拷貝系統維護工具,如in *** od、fsck和mkdosfs等實用程序。

對於常用的工具,建議使用tinylogin tinylogin.busybox 或者busybox busybox,它們可以認您節約不省的空間.

另外,如果使用bash,還必須編輯與裁減/etc/termcap及如下文件:

/bin/bash

/etc/termcap

/usr/share/terminfo/l/linux

/usr/share/terminfo/k/klone+acs

/usr/share/terminfo/k/klone+color

/usr/share/terminfo/k/klone+sgr

5、建立dev proc usr *** in目錄

使用cp -a命令拷貝常用的設備文件,包括console、tty1、tty2、tty3sda、sda1、sda2、hda、hdb和hda1等設備文件。如果您的內核使用Devfs, 只要建立這個目錄即可.

建立proc usr *** in目錄,你了可以ln –s bin *** in建立 *** in的連接.

6、建立lib目錄

一定要注意使用ldd命令檢查那些共享庫文件,這些文件需要按照原來的路徑拷貝到lib目錄。

一般應有如下文件:

/lib:

–rwxr–xr–x 1 root root 45415 Nov 1 15:39 ld–2.0.7.so

lrwxrwxrwx 1 root root 11 Nov 1 15:39 ld–linux.so.2 –>;

ld–2.0.7.so

–rwxr–xr–x 1 root root 731548 Nov 1 15:39 libc–2.0.7.so

lrwxrwxrwx 1 root root 13 Nov 1 15:39 libc.so.6 –>;

libc–2.0.7.so

lrwxrwxrwx 1 root root 17 Nov 1 15:39 lib_err.so.2 –>;

lib_err.so.2.0

–rwxr–xr–x 1 root root 6209 Nov 1 15:39 lib_err.so.2.0

–rwxr–xr–x 1 root root 153881 Nov 1 15:39 libcrypt–2.0.7.so

lrwxrwxrwx 1 root root 17 Nov 1 15:39 libcrypt.so.1 –>;

libcrypt–2.0.7.so

–rwxr–xr–x 1 root root 12962 Nov 1 15:39 libdl–2.0.7.so

lrwxrwxrwx 1 root root 14 Nov 1 15:39 libdl.so.2 –>;

libdl–2.0.7.so

lrwxrwxrwx 1 root root 14 Nov 1 15:39 libpam.so.0 –>;

libpam.so.0.64

–rwxr–xr–x 1 root root 26906 Nov 1 15:39 libpam.so.0.64

lrwxrwxrwx 1 root root 19 Nov 1 15:39 libpam_misc.so.0 –>;

libpam_misc.so.0.64

–rwxr–xr–x 1 root root 7086 Nov 1 15:39 libpam_misc.so.0.64

–r–xr–xr–x 1 root root 35615 Nov 1 15:39 libproc.so.1.2.6

lrwxrwxrwx 1 root root 19 Nov 1 15:39 libtermcap.so.2 –>;

libtermcap.so.2.0.8

–rwxr–xr–x 1 root root 12041 Nov 1 15:39 libtermcap.so.2.0.8

–rwxr–xr–x 1 root root 12874 Nov 1 15:39 libutil–2.0.7.so

lrwxrwxrwx 1 root root 16 Nov 1 15:39 libutil.so.1 –>;

libutil–2.0.7.so

drwx––x––x 3 root root 1024 Nov 1 15:39 moles

drwx––x––x 2 root root 1024 Nov 1 15:39 security

/lib/moles:

drwx––x––x 4 root root 1024 Nov 1 15:39 2.0.35

/lib/moles/2.0.35:

drwx––x––x 2 root root 1024 Nov 1 15:39 block

drwx––x––x 2 root root 1024 Nov 1 15:39 cdrom

/lib/moles/2.0.35/block:

drwx–––––– 1 root root 7156 Nov 1 15:39 loop.o

/lib/moles/2.0.35/cdrom:

drwx–––––– 1 root root 24108 Nov 1 15:39 c31a.o

/lib/security:

–rwx––x––x 1 root root 8771 Nov 1 15:39 pam_permit.so

三、建立配置文件

1、編輯etc/init.d/rcS ?文件名決定於etc/inittab

內容如下:

#!/bin/sh

PATH=/ *** in:/bin

export PATH

mount -n -t proc none /proc

umount /initrd

mount -n -o remount,rw /

mount -n -o remount,rw -t proc none /proc

ifconfig lo 127.0.0.1

hostname U *** Boot

2、編輯etc/fstab文件

內容如下:

/dev/sda2 / ext2 defaults 1 1

none /proc proc defaults 0 0

3、建立etc/inittab文件,如果用busybox生成的init這個文件可以不要。

id:2:initdefault:

si::sysinit:/etc/rcS

1:2345:respawn:/ *** in/getty 9600 tty1

2:23:respawn:/ *** in/getty 9600 tty2

4、建立nsswitch.conf文件

passwd: files

shadow: files

group: files

hosts: files

services: files

neorks: files

protocols: files

rpc: files

ethers: files

masks: files

bootparams: files

automount: files

aliases: files

group: files

publickey: files

5、建立/etc/pam.conf文件

OTHER auth optional /lib/security/pam_permit.so

OTHER account optional /lib/security/pam_permit.so

OTHER password optional /lib/security/pam_permit.so

OTHER session optional /lib/security/pam_permit.so

C. LINUX操作系統的啟動過程

一、啟動內核
首先介紹啟動內核部分。電腦啟動時,BIOS裝載MBR,然後從當前活動分區啟動,LILO獲得引
導過程的控制權後,會顯示LILO提示符。此時如果用戶不進行任何操作,LILO將在等待制定
時間後自動引導默認的操作系統,而如果在此期間按下TAB鍵,則可以看到一個可引導的操作
系統列表,選擇相應的操作系統名稱就能進入相應的操作系統。
當用戶選擇啟動LINUX操作系統時,LILO就會根據事先設置好的信息從ROOT文件系統所在的分
區讀取LINUX映象,然後裝入內核映象並將控制權交給LINUX內核。LINUX內核獲得控制權後,
以如下步驟繼續引導系統:
1. LINUX內核一般是壓縮保存的,因此,它首先要進行自身的解壓縮。內核映象前面的一些
代碼完成解壓縮。
2. 如果系統中安裝有可支持特殊文本模式的、且LINUX可識別的SVGA卡,LINUX會提示用戶
選擇適當的文本顯示模式。但如果在內核的編譯過程中預先設置了文本模式,則不會提示選
擇顯示模式。該顯示模式可通過LILO或RDEV工具程序設置。
3. 內核接下來檢測其他的硬體設備,例如硬碟、軟盤和網卡等,並對相應的設備驅動程序
進行配置。這時,顯示器上出現內核運行輸出的一些硬體信息。
4. 接下來,內核裝載ROOT文件系統。ROOT文件系統的位置可在編譯內核時指定,也可通過
LILO或RDEV指定。文件系統的類型可自動檢測。如果由於某些原因裝載失敗,則內核啟動
失敗,最終會終止系統。

二、執行init程序
其次介紹init程序,利用init程序可以方便地定製啟動其間裝入哪些程序。init的任務是
啟動新進程和退出時重新啟動其它進程。例如,在大多數Linux系統中,啟動時最初裝入
六個虛擬的控制台進程,退出控制台窗口時,進程死亡,然後init啟動新的虛擬登錄控制台,
因而總是提供六個虛擬登陸控控制台進程。
控制init程序操作的規則存放在文件/etc/inittab中。Red Hat Linux預設的inittab文
件如下:
#
#inittab This file describes how the INIT process should set up the system in a certain
#run-level.
#
#
#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
10:0:wait:/etc/rc.d/rc 0
11:1:wait:/etc/rc.d/rc 1
12:2:wait:/etc/rc.d/rc 2
13:3:wait:/etc/rc.d/rc 3
14:4:wait:/etc/rc.d/rc 4
15:5:wait:/etc/rc.d/rc 5
16:6:wait:/etc/rc.d/rc 6
#Things to run in every runlevel
ud:once:/sbin/update

#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.Schele a
#shutdown for 2 minutes from now.
#This does,of course,assume you have powered installed and your UPS
connected and working
#correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Restored;Shutdown Cancelled"

#Run gettys in standard runlevels
1:12345:respawn:/sbin/minggetty tty1
2:2345:respawn:/sbin/minggetty tty2
3:2345:respawn:/sbin/minggetty tty3
4:2345:respawn:/sbin/minggetty tty4
5:2345:respawn:/sbin/minggetty tty5
6:2345:respawn:/sbin/minggetty tty6
#Run xdm in runlevel 5

x:5:respawn:/usr/bin/X11/xdm -nodaemon
Linux有個運行級系統,運行級是表示系統當前狀態和init應運行哪個進程並保持在這種
系統狀態中運行的數字。在inittab文件中,第一個項目指定啟動時裝入的預設運行級。
上例中是個多用戶控制台方式,運行級為3。然後,inittab文件中每個項目指定第二個
欄位的項目用哪種運行級(每個欄位用冒號分開)。因此,對運行級3,下列行是相關的:
13:3:wait:/etc/rc.d/rc 3
1:12345:respawn:/sbin/minggetty tty1
2:2345:respawn:/sbin/minggetty tty2
3:2345:respawn:/sbin/minggetty tty3
4:2345:respawn:/sbin/minggetty tty4
5:2345:respawn:/sbin/minggetty tty5
6:2345:respawn:/sbin/minggetty tty6
最後六行建立Linux提供的六個虛擬控制台。第一行運行啟動腳本/etc/rc.d/ rc 3;
這將運行目錄/etc/
rc.d/rc3.d中包含的所有腳本,這些腳本表示系統初始化時要啟動的程序。一般來說,
這些腳本不需要編輯或改變,是系統預設的。

D. Linux( bootloader)啟動操作系統過程

Linux Booting Process:
(1) BIOS
功能:執行計算機系統完整性檢測;通電自檢;搜索/載入/執行 boot loader程序。
一旦 boot loader 程序被探測到,並且載入到內存,BIOS會把控制權交給它。
(2) MBR
MBR位於引導盤(Bootable Disk)的第一個扇區(512B)。
通常是在 /dev/sda 或者 /dev/hda 。

注意:引導盤(bootable disk)和引導分區(bootable partition)的區別。

(3) GRUB
GRUB = Grand Unified Bootloader

如果在系統中安裝有多個內核鏡像,你可以選擇某一個被執行。
GRUB展示了一個啟動畫面,等待幾秒,如果你不輸入任何字元,它將會按照grub配置文件的規定載入默認的內核鏡像。

Grub配置文件在: /boot/grub/grub.conf
它包含了內核和initrd.img

(4) Kernal
(注意Kernal和kernel不一樣)

Kernal按照grub.conf文件的規定,掛載根文件系統。
一旦kernal啟動,它第一件事情就是執行:sbin/init 進程。

initrd是被kernel用做臨時根文件系統,直到Kernal掛載了根文件系統。

(5) INIT(Initilization)

根據 /etc/inittab 文件決定Linux運行層級,運行級別決定了哪個初始化程序(Initial Programs)被載入到啟動項。

(6) Run Level

根據你的運行級別的設定,操作系統會執行下來對應的文件夾下的程序:

Linux的7個運行級別(Run levels):

標準的Linux運行級別為3或者5,如果是3的話,系統就在多用戶狀態;如果是5的話,則是運行著XWindow系統。不同的運行級別有著不同的用處,也應該根據自己的不同清晰來設置。例如,如果丟失了root口令,那麼可以讓機器啟動進入單用戶模式來設置。

如果是使用S(Start)開頭的程序,那麼是用在啟動的時候,
如果是使用K(Kill)開頭的程序,那麼是用在關機的時候。

E. linux啟動過程步驟

這是一個非常復雜的過程,但是可以簡單的概括為如下幾個步驟,每一個步驟你可以構思一些巧妙的實現來加深體。

啟動第一步--載入BIOS
當你打開計算機電源,計算機會首先載入BIOS信息,BIOS信息是如此的重要,以至於計算機必須在最開始就找到它。這是因為BIOS中包含了CPU的相關信息、設備啟動順序信息、硬碟信息、內存信息、時鍾信息、PnP特性等等。在此之後,計算機心裡就有譜了,知道應該去讀取哪個硬體設備了。

啟動第二步--讀取MBR
眾所周知,硬碟上第0磁軌第一個扇區被稱為MBR,也就是Master Boot Record,即主引導記錄,它的大小是512位元組,別看地方不大,可裡面卻存放了預啟動信息、分區表信息。
系統找到BIOS所指定的硬碟的MBR後,就會將其復制到0x7c00地址所在的物理內存中。其實被復制到物理內存的內容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。

啟動第三步--Boot Loader
Boot Loader 就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核做好一切准備。
Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的Loader。
我們以Grub為例來講解吧,畢竟用lilo和spfdisk的人並不多。
系統讀取內存中的grub配置信息(一般為menu.lst或grub.lst),並依照此配置信息來啟動不同的操作系統。

啟動第四步--載入內核
根據grub設定的內核映像所在路徑,系統讀取內存映像,並進行解壓縮操作。此時,屏幕一般會輸出「Uncompressing Linux」的提示。當解壓縮內核完成後,屏幕輸出「OK, booting the kernel」。
系統將解壓後的內核放置在內存之中,並調用start_kernel()函數來啟動一系列的初始化函數並初始化各種設備,完成Linux核心環境的建立。至此,Linux內核已經建立起來了,基於Linux的程序應該可以正常運行了。

啟動第五步--用戶層init依據inittab文件來設定運行等級
內核被載入後,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,並依據此文件來進行初始化工作。
其實/etc/inittab文件最主要的作用就是設定Linux的運行等級,其設定形式是「:id:5:initdefault:」,這就表明Linux需要運行在等級5上。Linux的運行等級設定如下:
0:關機
1:單用戶模式
2:無網路支持的多用戶模式
3:有網路支持的多用戶模式
4:保留,未使用
5:有網路支持有X-Window支持的多用戶模式
6:重新引導系統,即重啟
關於/etc/inittab文件的學問,其實還有很多,在後序文章中設計到的,賣個關子,敬請期待,呵呵

啟動第六步--init進程執行rc.sysinit
在設定了運行等級後,Linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序,它做的工作非常多,包括設定PATH、設定網路配置(/etc/sysconfig/network)、啟動swap分區、設定/proc等等。如果你有興趣,可以到/etc/rc.d中查看一下rc.sysinit文件,裡面的腳本夠你看幾天的:P

啟動第七步--啟動內核模塊
具體是依據/etc/moles.conf文件或/etc/moles.d目錄下的文件來裝載內核模塊。

啟動第八步--執行不同運行級別的腳本程序
根據運行級別的不同,系統會運行rc0.d到rc6.d中的相應的腳本程序,來完成相應的初始化工作和啟動相應的服務。

啟動第九步--執行/etc/rc.d/rc.local
你如果打開了此文件,裡面有一句話,讀過之後,你就會對此命令的作用一目瞭然:
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don』t
# want to do the full Sys V style init stuff.
rc.local就是在一切初始化工作後,Linux留給用戶進行個性化的地方。你可以把你想設置和啟動的東西放到這里。

啟動第十步--執行/bin/login程序,進入登錄狀態
此時,系統已經進入到了等待用戶輸入username和password的時候了,你已經可以用自己的帳號登入系統了。:)

F. Linux如何啟動流程Linux啟動流程詳解

當用戶打開電源後,BIOS開機自檢,確定啟動設備,安裝啟動設備,啟動設備上面安裝的GRUB開始引導Linux,Linux首先先進行內核引導,通過跟切換,執行init程序,init程序確定啟動級別,根據啟動級別進行系統初始化和運行的服務,然後返回init啟動終端,用戶通過驗證成功登陸Shell,這就是一個從開機到登陸的啟動過程。

一、硬體引導啟動
當用戶打開電源後POST開始自檢,檢測硬體設備是否確實或者存在故障(是否影響正常開機),如果不影響正常開機,就把任務交給BIOS。BIOS通過搜索,安裝啟動確定啟動設備,啟動項為硬碟,BIOS去讀取硬碟的前512位元組到內存,找到BootLoader,確定GRUB

二、GRUB引導啟動內核
這一部分概況起來就是:GRUB程序載入執行並開始引導kernel程序

Boot Loader就是在操作系統內核運行之前運行的一小段程序。通過GRUB引導可以確定內核程序,因為引導扇區只有446位元組,GRUB只是一個小的程序安裝在裡面,真正使用的在MBR後面的扇區存放,我們想使用Bootloader GRUB功能必須讀取後面的文件,Bootloader GRUB功能程序的運行和載入配置選項分為三個階段

Stage1階段:
Stage1階段其實就是執行系統安裝時預先寫入到MBR的Bootloader中的程序。

Stage1階段的任務僅是將硬碟0柱面0磁軌2扇區的內容讀入內存並執行,它是Stage1.5階段或Stage2階段的入口,引導進入Stage1.5階段或Stage2階段。 在此Stage1階段,還沒有識別文件系統的能力。

Stage1.5階段:
stage1.5階段是stage1階段和stage2階段的中間橋梁。stage1.5階段具有識別啟動分區文件系統的能力,此後GRUB程序便有能力去訪問/boot分區下/grub目錄下的 stage2文件,並將stage2載入內存執行。

Stage2階段
Stage2階段執行時,首先會解析GRUB程序的配置文件grub.conf,並依配置文件決定是否顯示系統啟動菜單。然後載入內核鏡像到內存中,通過initrd程序建立RAMDisk內存虛擬根文件系統。此時控制權將轉交給內核程序。

三、內核引導啟動
這一部分主要是通過在內存中建立虛擬根文件系統實現相關設備的驅動並建立和切換到真正的根文件系統。

解壓內核鏡像載入到內存,以及initrd程序建立RAMDisk內存虛擬根文件系統後,內核開始驅動基本硬體,並調用虛擬根文件系統中的init程序載入驅動模塊初始化系統中各種設備的相關配置工作,其中包括CPU、I/O、存儲設備等。當所需的驅動程序載入完後,會根據grub.conf配置文件中「root=XXX」部分所指定的內容創建一個根設備,然後將根文件系統以只讀的方式掛載,並切換到真正的根文件系統上,同時調用系統進程的/sbin/init程序,進入系統初始化階段。

四、系統初始化
這一步是通過/sbin/init,init程序准備軟體運行壞境,啟動系統服務

通過/etc/inittab文件確定運行級別,然後去執行系統初始化腳本/etc/rc.sysinit,為用戶初始化用戶空間環境,在完成初始化後,根據運行級別,系統開始對應級別的目錄啟動服務,關閉那些不要的服務(裡面S99local -> ../rc.local)用戶自動服務啟動腳本

運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網路功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別:3, 5
切換級別:init #
查看級別:runlevel ; who -r
五、啟動終端,用戶登錄
這一步是用戶登錄shell過程

如果沒有改變級別,默認情況執行/sbin/mingetty打開6個純文本終端,讓用戶輸入用戶名和密碼。輸入完成後,再調用login程序,核對密碼。如果密碼正確,就從文件 /etc/passwd 讀取該用戶指定的shell,然後啟動這個shell。更多Linux介紹請查看《Linux就該這么學》。

G. Linux系統啟動及定製過程

CentOS的啟動流程總體順序如下:

POST --> Boot Sequence --> bootloader(MBR) --> Kernel --> 載入rootfs --> switchroot --> /sbin /init --> (配置文件:/etc/inittab, /etc/init/*.conf) --> 根據init配置文件設置默認運行級別 --> 運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化 --> 開啟或關閉用戶選定的對應運行級別下所對應的服務 --> 啟動終端,列印登錄提示符。

註:前面加粗部分代表內核空間的系統啟動流程,後面未加粗部分代表用戶空間的系統啟動流程。

第一步:硬體啟動過程

POST加電自檢

主要實現的功能是檢測各個外圍硬體設備是否存在而且能夠正常運行起來,實現這一自檢功能的是固化在主板上的ROM(主要代表為CMOS)晶元上的BIOS(Basic Input/Output System)程序;例如BIOS會檢測CPU、Memory以及I/O設備是否能夠正常運行,如果是個人計算機的話可能還會檢測一下顯示器。只要一通電,CPU就會自動去載入ROM晶元上的BIOS程序,是這樣來實現的。而檢測完成之後就進行硬體設備的初始化。

選擇啟動設備以載入MBR

主要實現的功能是選擇要啟動的硬體設備,選擇了之後就可以讀取這個設備上位於MBR里頭的bootloader了。這一步的實現是這樣的:根據BIOS中對啟動順序的設定,BIOS自己會依次掃描各個引導設備,然後第一個被掃描到具有引導程序(bootloader)的設備就被作為要啟動的引導設備。

MBR(Main Boot Record),是硬碟的0柱面,0磁軌、1扇區(第一個扇區),稱為主引導扇區,也稱為主引導記錄。它由三部分組 成:主引導程序(BootLoader)、硬碟分區表DPT(Disk Partition table)和硬碟有效標志(55AA)。
註:硬碟默認一個扇區大小為512位元組。
第一部分,主引導程序(BootLoader)佔446個位元組,負責從活動分區中裝載,並運行系統引導程序。
第二部分,硬碟分區表DPT佔64個位元組,有4個分區表項,每個分區表項佔16個位元組,硬碟中分區有多少以及每一個分區的大小都記 錄在其中。
第三部分,硬碟有效標志,佔2個位元組,固定為55AA。如果這個標志位0xAA55,就認為這個是MB

第二步:GRUB引導階段

不同的系統有不同的主引導程序(BootLoader)。Windows使用的是NTLDR(NT Loader,Windows NT系列操作系統)、Bootmgr(Boot Manager,Windows Vista,7,8,10),Linux一般使用的是grub(也叫grub legacy)和grub2。GRUB程序載入執行並引導kernel(內核)程序,其中有三個階段,Grub引導階段的文件都在/boot/grub/目錄下。

stage1: 這一階段執行的就是系統安裝時預先寫入到MBR的Bootloader程序,即是存放在MBR的前446位元組里的程序。它的任務僅是讀取(載入)硬碟的0柱面,0磁軌,2扇區的內容(/boot/grub/stage1)並執行。

stage1.5: 這一階段是Stage1階段和Stage2階段的橋梁,功能是載入stage2所在分區的文件系統驅動,讓stage1中的bootloader能識別stage2所在分區的文件系統,此後grub程序便有能力去訪問/boot/grub/stage2。

stage2: 這一階段讀取並解析grub的配置文件/boot/grub/grub.cnf,根據配置文件載入內核鏡像到內存中,通過initrd程序建立虛擬根文件系統,最後調用(轉交)內核。

第三步:內部引導階段

載入內核,核心開始解壓,啟動一些最核心的程序。為了讓內核足夠的輕小,硬體驅動並沒放在內核文件裡面。系統僅探測可識別到的所有硬體設備,載入硬體驅動程序,即載入真正的根文件系統所在設備的驅動程序(有可能會藉助於ramdisk載入驅動),以只讀方式掛載根文件系統,運行用戶空間的第一個應用程序:/sbin/init。

第四步:init初始化階段(系統初始化階段)

雖然CentOS 5、CentOS 6以及CentOS 7的/etc/init配置文件內容各不相同,但總體的啟動流程相同:/sbin/init --> 根據/etc/inittab配置文件設置默認運行級別 --> 運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統初始化 --> 關閉或啟動用戶選定的默認運行級別所對應的服務 。

對於CentOS 5來說,初始化程序init是SysV init,其配置文件為:/etc/inittab; 對於CentOS 6來說,初始化程序init是upstart,其配置文件為:/etc/inittab, /etc/init/ .conf,也就是upstart將配置文件拆分成多個,在/etc/init/目錄下以conf結尾的都是upstart風格的配置文件,而/etc/inittab僅用於設置默認運行級別; 對於CentOS 7來說,初始化程序init是systemd,其配置文件:/usr/lib/system/systemd/, /etc/systemd/system/

具體執行過程:/sbin/init程序會讀取/etc/inittab文件確認運行級別,然後執行/etc/rc.d/rc腳本,根據確認的運行級別啟動對應/etc/rc.d/rc#.d/目錄下的服務(#為0~6),與此同時執行系統初始化腳本/etc/rc.sysinit(軟鏈接,指向/etc/rc.d/rc.sysinit),還會載入/etc/rc.local(軟鏈接,指向/etc/rc.d/rc.local文件)用戶自定義服務(腳本)。

CentOS7中初始化進程變為了systemd,systemd即為system daemon,是Linux下的一種init軟體,開發目標是提供更優秀的框架以表示系統服務間的依賴關系,並依此實現系統初始化時服務的並行啟動,同時達到降低Shell系統開銷的效果,最終代替現在常用的System V與BSD風格的init程序。與多數發行版使用的System V風格的init相比,systemd採用了以下的新技術:A.採用Socket激活式與匯流排激活式服務,以提高相互依賴的各服務的並行運行性能;B.用Cgroup代替PID來追蹤進程,即使是兩次fork之後生成的守護進程也不會脫離systemd的控制。

第五步:啟動終端

根據前面獲取的運行級別來啟動終端,mingetty程序是用於啟動終端的,它會調用登錄程序login,這樣就能顯示出登錄提示符了,類似mingetty這種用於打開終端的程序還有getty等。而如果默認運行級別為5,則會打開圖形界面。

第一步:硬體啟動過程

這一步和CentOS6差不多,詳細請看1.1內容。

第二步:GRUB引導階段

從這一步開始,CentOS6和CentOS7的啟動流程區別開始展現出來了。CentOS7的主引導程序使用的是grub2,執行過程是先載入boot.img、core.img兩個鏡像,再載入MOD模塊文件,把grub2程序載入執行,接著解析配置文件/boot/grub/grub.cfg,根據配置文件載入內核鏡像到內存,之後構建虛擬根文件系統,最後轉到內核。

CentOS7中使用命令進行配置,而不直接去修改配置文件了。grub.cfg配置文件開頭注釋部分說明了由/etc/grub.d/目錄下文件和/etc/default/grub文件組成。改好配置後都需要使用命令grub2-mkconfig -o /boot/grub2/grub.cfg,將配置文件重新生成。

第三步:內部引導階段

這一步與CentOS6也差不多,載入驅動,切換到真正的根文件系統,唯一不同的是執行的初始化程序變成了/usr/lib/systemd/systemd。

第四步:init初始化階段(系統初始化階段)

CentOS7中我們的初始化進程變為了systemd。執行默認target配置文件/etc/systemd/system/default.target(這是一個軟鏈接,與默認運行級別有關)。然後執行sysinit.target來初始化系統和basic.target來准備操作系統。接著啟動multi-user.target下的本機與伺服器服務,並檢查/etc/rc.d/rc.local文件是否有用戶自定義腳本需要啟動。最後執行multi-user下的getty.target及登錄服務,檢查default.target是否有其他的服務需要啟動。

注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目錄下的graphical.target或multiuser.target。而graphical.target依賴multiuser.target,multiuser.target依賴basic.target,basic.target依賴sysinit.target,所以倒過來執行。

unit對象:unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其他與init相關的信息。(也就是CentOS6中的伺服器啟動腳本)

第五步:啟動終端

systemd執行sysinit.target
systemd啟動multi-user.target下的本機與伺服器服務
systemd執行multi-user.target下面的/etc/rc.d/rc.local
Systemd執行multi-user.target下的getty.target及登錄服務
getty.target是啟動終端的systemd對象。如果到此步驟,系統沒有指定啟動圖形桌面,到此就可以結束了,如果需要啟動圖形界面,要在此基礎上啟動桌面程序。

從 CentOS 7 版本之後,系統開始用 systemd 實現init進程,系統啟動和伺服器守護進程管理器功能,負責在系統啟動或運行時,激活系統資源,伺服器進程和其它進程。

unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息。

3.2 system unit文件格式

/usr/lib/systemd/system:發行版打包者使用,每個服務最主要的啟動腳本設置,類似於之前的/etc/init.d/

/etc/systemd/system:系統管理員和用戶使用,管理員建立的執行腳本,類似於/etc/rcN.d/Sxx的功能,比上面目錄優先運行

/lib/systemd/system::ubutun的對應目錄

/run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行

unit 格式說明:

service unit file文件通常由三部分組成:

Unit段的常用選項:

Service段的常用選項:

Install段的常用選項:

注意:對於新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而後可以選擇重啟。

首先在啟動界面按e編輯啟動參數,

將ro參數更改為rw init=/sysroot/bin/sh,按ctr + x啟動系統

按下圖執行命令更改root密碼

熱點內容
領航s1配置怎麼樣 發布:2025-01-26 09:58:10 瀏覽:763
公司區域網搭建伺服器搭建 發布:2025-01-26 09:16:56 瀏覽:433
android裁剪圓形圖片 發布:2025-01-26 09:05:56 瀏覽:411
小貸源碼 發布:2025-01-26 08:20:58 瀏覽:536
更換電腦名登錄伺服器 發布:2025-01-26 07:56:52 瀏覽:240
後台phpjava 發布:2025-01-26 07:12:34 瀏覽:657
微信解綁密碼是什麼 發布:2025-01-26 06:50:07 瀏覽:734
app如何訪問伺服器 發布:2025-01-26 06:36:56 瀏覽:741
拳皇安卓單機哪裡下載 發布:2025-01-26 06:30:46 瀏覽:539
注冊會員時積分消費密碼是什麼 發布:2025-01-26 06:30:45 瀏覽:247