日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux img 内核启动,linux的启动流程(initrd.img)

發(fā)布時(shí)間:2023/12/13 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux img 内核启动,linux的启动流程(initrd.img) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://www.ibm.com/developerworks/cn/linux/l-initrd.html

一、從哪里到哪里

本文旨在描述linux中內(nèi)核如何調(diào)用啟動(dòng),然后如何從img的文件系統(tǒng)切換到硬盤的過程。

描述起于:linux-2.6.11/init/main.c中函數(shù) static int init(void * unused)

描述止于:/etc/rc.d/rc.sysinit文件的被調(diào)用

二、描寫流程

在linux代碼linux-2.6.11/init/main.c中init這個(gè)函數(shù)被調(diào)用時(shí),初始啟動(dòng)的文件

系統(tǒng)鏡像:/boot/initrd-2.6.11.12.img(以2.6.11.12內(nèi)核為例)已被grub加載到

內(nèi)存中,并已掛載到根目錄上("/")。

1、我們先來看看initrd-2.6.11.12.img到底是個(gè)什么東西:

[root@wj-server1 tmp]# cd /tmp

[root@wj-server1 tmp]# cp /boot/initrd-2.6.11.12.img /tmp/initrd-2.6.11.12.gz

[root@wj-server1 tmp]# gunzip initrd-2.6.11.12.gz

解壓縮后的文件為:

[root@wj-server1 tmp]# ls -l initrd-2.6.11.12

-rw-r--r-- 1 root root 846848 7月 31 17:01 initrd-2.6.11.12

是一個(gè)CPIO格式的文件,該文件格式是種文件鏡像讓我們將它解開到一個(gè)目錄中看看

其中的具體內(nèi)容:

[root@wj-server1 tmp]# mkdir initrd

[root@wj-server1 tmp]# cd initrd

[root@wj-server1 initrd]# cpio -i < ../initrd-2.6.11.12

1654 blocks

[root@wj-server1 initrd]# ls

bin bootsplash dev etc init lib loopfs proc sbin sys sysroot

[root@wj-server1 initrd]# find .

.

./lib

./bin

./bin/nash

./bin/insmod

./bin/modprobe

./bin/hotplug

./etc

./dev

./dev/console

./dev/null

./dev/ram

./dev/systty

./dev/tty1

./dev/tty2

./dev/tty3

./dev/tty4

./loopfs

./proc

./sys

./sysroot

./sbin

./init

./bootsplash

可見該鏡像文件目錄中包括:

/bin 目錄下的四個(gè)用于啟動(dòng)和切換到硬盤上的程序:

nash(用于處理根目錄下的/init腳本)、insmod和modprobe來加載內(nèi)核驅(qū)動(dòng)、hotplug用

于外設(shè)的拔插處理。

/dev 目錄下的八個(gè)設(shè)備文件

/init 是個(gè)nash的啟動(dòng)腳本文件

/bootsplash 是內(nèi)核打了bootsplash補(bǔ)丁后,會(huì)在對該文件進(jìn)行讀取操作,然后將該文件

中包含的圖片文件在啟動(dòng)時(shí)顯示。

[root@wj-server1 initrd]# dmesg | grep -i bootsplash

bootsplash 3.1.6-2004/03/31: looking for picture... silentjpeg size 36270 bytes,

...found (1024x768, 19600 bytes, v3).

內(nèi)核的這個(gè)裝載信息就是在處理該文件。(具體的bootsplash的使用和創(chuàng)建這里不細(xì)說)。

附:CPIO文件的打包

[root@wj-server1 initrd]# cd /tmp/initrd

[root@wj-server1 initrd]# rm ../initrd-2.6.11.12

[root@wj-server1 initrd]# find . | cpio -c -o > ../initrd-2.6.11.12

1654 blocks

[root@wj-server1 initrd]# gzip ../initrd-2.6.11.12

[root@wj-server1 initrd]# mv ../initrd-2.6.11.12.gz ../initrd-2.6.11.12.img

2、回到內(nèi)核init函數(shù)中,看看如何調(diào)用/boot/initrd-2.6.11.12.img中/init腳本的

....

// 這里判斷在grub裝載的/boot/initrd-2.6.11.12.img中是否有"/init"這個(gè)文件?

if (sys_access((const char __user *) "/init", 0) == 0)

execute_command = "/init"

else

....

// 如果有"/init"這個(gè)文件就先運(yùn)行它。

if (execute_command)

run_init_process(execute_command);

run_init_process("/sbin/init");

run_init_process("/etc/init");

run_init_process("/bin/init");

run_init_process("/bin/sh");

panic("No init found. Try passing init= option to kernel");

由代碼我們看到kernel會(huì)先判斷并運(yùn)行/boot/initrd-2.6.11.12.img中的/init文件,我們

來看看該/boot/initrd-2.6.11.12.img/init文件的內(nèi)容,我們上面已將該文件展開到目錄

/tmp/initrd中:

[root@wj-server1 initrd]# cat ./init

#!/bin/nash # 該文件是個(gè)nash的腳本文件

# 掛接proc文件系統(tǒng)

mount -t proc /proc /proc

# 不輸出nash調(diào)試信息,由/proc/cmdline決定,cat /proc/cmdline我的啟動(dòng)參數(shù)

# 輸出ro root=/dev/hda3 vga=791 splash=silent,如果該命令行中帶了quiet參

# 數(shù),則不輸出nash提示信息。

setquiet

# 提示信息(這里提示因該放到上面去,mkinitrd-4.2.17-2mgc.rpm包中原來如是,

# 筆誤?為什么這里牽涉到mkinitrd這個(gè)包類?因?yàn)?#xff1a;/boot/initrd-2.6.11.12.img

# 文件由下面命令生成:mkinitrd /boot/initrd-2.6.11.12.img 2.6.11.12)

echo Mounted /proc filesystem

# 掛接sys文件系統(tǒng)

echo Mounting sysfs

mount -t sysfs /sys /sys

# 創(chuàng)建/dev臨時(shí)目錄

echo Creating /dev

mount -o mode=0755 -t tmpfs /dev /dev

# 創(chuàng)建設(shè)備文件(這些設(shè)備文件在切換到硬盤后,由/etc/rc.sysinit中start_udev

# 重新創(chuàng)建)

mknod /dev/console c 5 1

mknod /dev/null c 1 3

mknod /dev/zero c 1 5

# 新建偽終端目錄

mkdir /dev/pts

# 新建共享內(nèi)存目錄

mkdir /dev/shm

# 這里是調(diào)用的nash中的makedevs指令裝載硬盤等塊設(shè)備,不裝載其他設(shè)備只裝載

# 硬盤等塊設(shè)備

echo Starting udev

# 告訴內(nèi)核當(dāng)發(fā)現(xiàn)新拔插設(shè)備時(shí)用"/sbin/hotplug"程序來處理

echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug

makedevs

makedevs # 這里多搞一次沒必要

echo Creating root device

# 由grub啟動(dòng)命令行root=/dev/hda3來聯(lián)接設(shè)備/dev/root到root變量所指定的啟動(dòng)

# 設(shè)備,見下面我的grub啟動(dòng)參數(shù):

# kernel /boot/vmlinuz-2.6.11.12 ro root=/dev/hda3 vga=791 splash=silent

mkrootdev /dev/root

# 掛接/dev/root目錄

echo Mounting root filesystem

mount -o defaults --ro -t ext3 /dev/root /sysroot

echo Switching to new root

# 切換根目錄到設(shè)備/dev/root目錄,運(yùn)行完該命令根目錄"/"->"/dev/hda3"

switchroot --movedev /sysroot

由上面的注釋我們大概能夠明白./init腳本的基本運(yùn)行流程:

a、裝載基本的內(nèi)核系統(tǒng)文件和設(shè)備文件

b、根據(jù)grub的啟動(dòng)命令行參數(shù),判斷root根文件設(shè)備,參看/boot/grub/grub.conf文件中制定

的參數(shù),該參數(shù)在內(nèi)核啟動(dòng)后可有cat /proc/cmdline顯示出來,nash和其他的一些程序也是通

過讀該系統(tǒng)文件來去內(nèi)核啟動(dòng)參數(shù)的。

c、在將從grub啟動(dòng)參數(shù)中獲得根設(shè)備并將其與/dev/root設(shè)備聯(lián)接以后,通過nash的switchroot

指令將/dev/root設(shè)備掛接到根目錄上("/")

看看這樣操作后,留下的痕跡:

[root@wj-server1 initrd]# ls -l /dev/root

lrwxrwxrwx 1 root root 9 7月 31 12:06 /dev/root -> /dev/hda3

[root@wj-server1 initrd]# mount

/dev/hda3 on / type ext3 (rw)

到此為止,已將硬盤設(shè)備裝載到根目錄下了,從而取代了原來有initrd.img文件的根位置。

3、再回頭看看內(nèi)核中main.c中init函數(shù),看看如何調(diào)用/sbin/init處理/etc/inittab文件

....

// 如果有"/init"這個(gè)文件就先運(yùn)行它。

if (execute_command)

run_init_process(execute_command);

run_init_process("/sbin/init");

run_init_process("/etc/init");

run_init_process("/bin/init");

run_init_process("/bin/sh");

panic("No init found. Try passing init= option to kernel");

我們已經(jīng)運(yùn)行完run_init_process(execute_command);這里了,然后繼續(xù)運(yùn)行:

run_init_process("/sbin/init");

run_init_process("/etc/init");

run_init_process("/bin/init");

run_init_process("/bin/sh");

/sbin/init這個(gè)文件在SysVinit-2.85-34mgc.rpm這個(gè)包中,該程序的主要處理代碼在文件:

sysvinit-2.85/src/init.c中,該文件主要查找和處理/etc/inittab文件,按照該文件的內(nèi)容

依次做處理。

[root@wj-server1 initrd]# cat /etc/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)

#

id:5:initdefault: # /sbin/init 根據(jù)這里判斷啟動(dòng)的級別

# System initialization.

si::sysinit:/etc/rc.d/rc.sysinit # /sbin/init 會(huì)最先運(yùn)行這個(gè)系統(tǒng)配置文件

l0:0:wait:/etc/rc.d/rc 0 # /sbin/init 根據(jù)上面取得的級別運(yùn)行相應(yīng)

l1:1:wait:/etc/rc.d/rc 1 # 目錄下的啟動(dòng)腳本

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

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

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

l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE

ca::ctrlaltdel:/sbin/shutdown -t3 -r now # 設(shè)置關(guān)機(jī)熱鍵

# 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"

# Run gettys in standard runlevels

1:2345:respawn:/sbin/mingetty tty1 # 建立6個(gè)登陸控制終端可以通過CTRL-ALT-F?

2:2345:respawn:/sbin/mingetty tty2 # 切換,'?'表示第幾個(gè)登陸控制臺,比如第1

3:2345:respawn:/sbin/mingetty tty3 # 個(gè)為F1,第2個(gè)為F2依次類推。F7為X11控制

4:2345:respawn:/sbin/mingetty tty4 # 臺,后面就沒有了,所以在X下可以很靈活

5:2345:respawn:/sbin/mingetty tty5 # 的切換到控制臺下面操作。

6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5

x:5:once:/etc/X11/prefdm -nodaemon

通過內(nèi)核中對/sbin/init的調(diào)用現(xiàn)在已經(jīng)執(zhí)行/etc/rc.d/rc.sysinit操作了。

閱讀(897) | 評論(0) | 轉(zhuǎn)發(fā)(0) |

總結(jié)

以上是生活随笔為你收集整理的linux img 内核启动,linux的启动流程(initrd.img)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。