一、啟動(dòng)過程
?內(nèi)核啟動(dòng)通常包括4個(gè)階段:
- iROM代碼啟動(dòng)(BIOS啟動(dòng))。開發(fā)板上電后,先執(zhí)行內(nèi)部iROM中的固化代碼,類似于BIOS,執(zhí)行通電自檢和初始化過程,包括初始化CPU、存儲(chǔ)器、時(shí)鐘、總線等一些必要的硬件資源。
- 啟動(dòng)引導(dǎo)加載程序BootLoader。根據(jù)啟動(dòng)引腳的電平,讀取相應(yīng)的存儲(chǔ)介質(zhì)上的Uboot到RAM。接著,啟動(dòng)Uboot。U-Boot再根據(jù)用戶傳的參數(shù)加載內(nèi)核、設(shè)備樹、根文件系統(tǒng)。
- 裝載內(nèi)核。Linux內(nèi)核鏡像文件uImage被載入內(nèi)存后,首先將自身解壓,然后進(jìn)行系統(tǒng)的一系列初始化工作,包括初始化存儲(chǔ)器、中斷表、必要的設(shè)備驅(qū)動(dòng),設(shè)定分頁(yè)機(jī)制、任務(wù)調(diào)度機(jī)制,接著根據(jù)bootargs環(huán)境變量載入根文件系統(tǒng)。
- 系統(tǒng)初始化。根文件系統(tǒng)加載成功后,根據(jù)bootargs嘗試執(zhí)行/init命令。如果是RAMDisk,就嘗試執(zhí)行/init命令,否則,就嘗試執(zhí)行/sbin/init、 /etc/init、 /bin/init、 /bin/sh。如果其中任意一個(gè)能成功執(zhí)行,就進(jìn)人下一階段,否則,內(nèi)核啟動(dòng)失敗。
二、啟動(dòng)配置
Linux通常有3中系統(tǒng)初始化方式:SysV、systemd、UpStart。
(一)SysV初始化
init是系統(tǒng)的1號(hào)進(jìn)程,可以是可執(zhí)行腳本,或sysvinit,或者busybox的二進(jìn)制程序。ramdisk常用可執(zhí)行程序腳本程序的init,二進(jìn)制程序常依照/etc/inittab文件執(zhí)行初始化任務(wù)。管理員可以定制/etc/inittab 配置文件來建立所需的系統(tǒng)運(yùn)行環(huán)境。所以,/etc/inittab是rootfs中的重要文件。驗(yàn)證如下:
~$ ls /sbin/init -l
lrwxrwxrwx 1 1000 1000 14 Jan 25 2023 sbin/init -> ../bin/busybox
System V initialization是基于運(yùn)行級(jí)別(Runlevel)來啟動(dòng)系統(tǒng),用來設(shè)置不同環(huán)境下所運(yùn)行的程序和服務(wù)。使用運(yùn)行級(jí)別和對(duì)應(yīng)的鏈接文件(位于etc/rcn.d 目錄中,n為運(yùn)行級(jí)別,分別鏈接到/etc/init.d中的init 腳本)來啟動(dòng)和關(guān)閉系統(tǒng)服務(wù)。假設(shè)當(dāng)前inittab 中設(shè)置的默認(rèn)運(yùn)行級(jí)別是2,則init 進(jìn)程會(huì)運(yùn)行/etc/init.d/rc2命令,該命令會(huì)依據(jù)系統(tǒng)服務(wù)的依賴關(guān)系遍歷執(zhí)行/etc/rc2.d中的腳本或程序。/etc/rc2.d目錄中的文件實(shí)際都是指向/etc/init.d/下對(duì)應(yīng)的腳本或程序的軟鏈接。
init 進(jìn)程根據(jù)/etc/inittab中的配置初始化系統(tǒng),設(shè)置系統(tǒng)運(yùn)行級(jí)別及進(jìn)入各運(yùn)行級(jí)別對(duì)應(yīng)的要執(zhí)行的命令。inittab 提供了0~6的運(yùn)行級(jí)別選項(xiàng),runlevels是運(yùn)行級(jí)別列表(如下)。其中,1級(jí)(單用戶模式)和5級(jí)(多用戶標(biāo)準(zhǔn)模式)比較常用。系統(tǒng)工作不正常時(shí)使用單用戶模式維護(hù),工作正常時(shí)使用多用戶標(biāo)準(zhǔn)模式。在資源受限時(shí)(如沒有網(wǎng)絡(luò)環(huán)境或沒有圖形終端)可選擇2級(jí)。以S開頭的表示啟動(dòng),以K開頭的表示停止,并且S或K后面的兩位數(shù)數(shù)字代表了服務(wù)的啟動(dòng)順序,具體由服務(wù)依賴關(guān)系決定
# Runlevel 0:Halt.
# Runlevel 1:Single-user mode without networking,only for root.
# Runlevel 2:Multi-user mode without networking and daemons.
# Runlevel 3:Multi-user mode with networking.
# Runlevel 4:Not used or user-defined.
# Runlevel 5:Runlevel3+X-window,full functionally.
# Runlevel 6:Reboot.
(二)systemd初始化
新版本的Ubuntu使用systemd來初始化系統(tǒng),驗(yàn)證如下:
~$ ls /sbin/init -l
lrwxrwxrwx I root root 20 3月 30 00:40 /sbin/init -> /lib/systemd/systemd
systemd最主要的功能包括系統(tǒng)的主機(jī)名稱、網(wǎng)絡(luò)設(shè)置定、語(yǔ)言處理、文件系統(tǒng)格式及其他系統(tǒng)服務(wù)和應(yīng)用服務(wù)的啟動(dòng)等。所有的這些任務(wù)都會(huì)通過systemd的默認(rèn)啟動(dòng)目標(biāo)(/etc/systemd/system/default.target)來配置。
systemd依次執(zhí)行相應(yīng)的各項(xiàng)任務(wù)來完成系統(tǒng)的最終啟動(dòng)。例如,systemd 首先執(zhí)行initrd.target所有單元,包括掛載/etc/fstab,最后執(zhí)行 graphical所需的服務(wù)以啟動(dòng)圖形界面來讓用戶以圖形界面登錄。如果系統(tǒng)的defaulttarget 指向multi-user.target,那么此步驟就不會(huì)執(zhí)行。
三、rootfs中的啟動(dòng)配置文件
1、inittab
基本的ininttab內(nèi)容如下:
#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
inittab 文件中的每一項(xiàng)按下面的格式設(shè)置:
id: runlevels: action: process
每一項(xiàng)有四個(gè)字段,字段之間用冒號(hào)隔開。每個(gè)字段的含義如下。
(1)起d由1~4個(gè)字符組成,作為inittab項(xiàng)的唯一標(biāo)識(shí)。
(2)runlevedls 是運(yùn)行級(jí)別列表。
(3)action指明執(zhí)行什么動(dòng)作
(4)process字段包含init執(zhí)行的進(jìn)程。
與系統(tǒng)啟動(dòng)相關(guān)的文件和目錄如下:
|--/etc/
| |-- inittab (init腳本)
| |-- init.d/
| |-- rc (啟動(dòng)腳本)
| |-- rcS (啟動(dòng)腳本)
| |-- rc.local(附加啟動(dòng)腳本)
| |-- .... (其他系統(tǒng)服務(wù)腳本)
| |--rcS.d/ (S級(jí)服務(wù)管理目錄)
| |-- .... (init.d服務(wù)腳本鏈接)
| |-- rc0.d/ (0級(jí)服務(wù)管理目錄)
| |-- .... (init.d服務(wù)腳本鏈接)
2、/etc/init.d/rcS 腳本
#!/bin/sh
#
# rcS Call all S??* scripts in /etc/rcS.d in
# numerical/alphabetical order.
#
# Version: @(#)/etc/init.d/rcS 2.76 19-Apr-1999 miquels@cistron.nl
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
# Make sure proc is mounted
#
[ -d "/proc/1" ] || mount /proc
#
# Source defaults.
# 設(shè)置環(huán)境變量
#./etc/default/rcS
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
#
# Call all parts in order.
#
# exec /etc/init.d/rc S
/bin/mount -a
不要忘記為 rcS 添加可執(zhí)行權(quán)限:
$ chmod +x init.d/rcS
3、fstab
/etc/init.d/rcS中的mount -a。意思是將/etc/fstab的所有內(nèi)容重新加載。
/etc/fstab 文件負(fù)責(zé)配置Linux開機(jī)時(shí)自動(dòng)掛載的分區(qū)。
- fstab中的文件掛載操作如下:
??<file system> <mount point> <type> <options> <dump> <pass>
? <file system>:描述要掛載的特殊的塊設(shè)備或遠(yuǎn)程文件系統(tǒng),如/dev/cdrom /dev/sdb等,遠(yuǎn)程文件系統(tǒng)使用<host>:<dir>.
? <mount point>:描述文件系統(tǒng)的掛載點(diǎn);如果是一個(gè)交換分區(qū)(swap partitions),這個(gè)域應(yīng)寫為‘none’.
? <type>:描述文件系統(tǒng)的類型,Linux支持許多文件系統(tǒng)類型,如adfs, affs, autofs, coda, coherent, cramfs,devpts, efs, ext2, ext3, hfs, hpfs, iso9660, jfs, minix, msdos, ncpfs, nfs,ntfs, proc, qnx4, reiserfs, romfs, smbfs, sysv, tmpfs, udf, ufs, umsdos,vfat, xenix, xfs,等。
? <options>:描述關(guān)于這個(gè)文件系統(tǒng)的掛載選項(xiàng),基本的選項(xiàng)如下:
? default:使用默認(rèn)選項(xiàng),rw, suid, dev, exec, auto, nouser, and async
? noauto:當(dāng)啟動(dòng)時(shí)給出“mount -a”命令時(shí)并不掛載。
? user:允許用戶掛載
? owner:允許設(shè)備自己掛載
? comment:供fstab維護(hù)程序使用
? nofail:如果這個(gè)設(shè)備不存在,不報(bào)告錯(cuò)誤信息
? <dump>:當(dāng)其值設(shè)置為1時(shí)將允許dump備份程序備份;設(shè)置為0時(shí)忽略備份操作;如果文件系統(tǒng)需不需要被dump,則設(shè)置為0即可
? <pass>:該字段由fsck程序用于確定在重新啟動(dòng)時(shí)文件系統(tǒng)檢查完成的順序,啟動(dòng)用的文件系統(tǒng)需要制定為1,其他文件系統(tǒng)需要指定為2,如果沒有此域或設(shè)置為0表示不檢查。其值是一個(gè)順序。當(dāng)其值為0時(shí),永遠(yuǎn)不檢查;而 / 根目錄分區(qū)永遠(yuǎn)都為1。其它分區(qū)從2開始,數(shù)字越小越先檢查,如果兩個(gè)分區(qū)的數(shù)字相同,則同時(shí)檢查
參考博文: 根文件系統(tǒng)(linuxrc、inittab、fstab)
例1:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
例2:
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
nonc /dev/shm tmpfs defaults 0 0
/dev/hda4 swap swap dcfaults o 0
/dev/edrom /mntcdrom iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/hdal /mnt/c vfat exec,dev,suid,rw,umask=0, iocharset=gb2312,codepage=936 0 0
例3:fstab中添加了mount nfs的配置:文章來源:http://www.zghlxwxcb.cn/news/detail-548740.html
192.168.1.7:/CBT-SuperIOT/ /mnt/nfs/ nfs nolock 0 0
4、profile 文件
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
5、其他文件
service,inetd.conf,passwd文件,可以配置telnet服務(wù)器的配置和開啟:
確保fstab 文件中存在none /dev/pts devpts mode=0622 0 0這一行
確保services文件中存在 telnet 23/tcp這一行
確保 inetd.conf中存在telnet stream tcp nowait root /sbin/telnetd telnetd
確保passwd 文件中存在 root::0:0:root:/:/bin/sh ,表示沒有密碼的root 帳號(hào)文章來源地址http://www.zghlxwxcb.cn/news/detail-548740.html
到了這里,關(guān)于Linux內(nèi)核移植:內(nèi)核的啟動(dòng)過程分析、啟動(dòng)配置與rootfs必要文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!