1. 程式人生 > >一步步完善rootfs:2.建立配置檔案

一步步完善rootfs:2.建立配置檔案

建立配置檔案

核心啟動到最後啟動的第一個使用者程序是init程序,它根據檔案系統下的配置檔案決定啟動哪些程式,init程序是後續所有程序的發起者。
/etc 目錄用於存放系統中的配置檔案,基本上所有的配置檔案都可以在這裡找到,這些檔案一般都以XXX.conf的形式命名,通過編輯這些檔案可以對系統進行更改和管理。進入BusyBox原始碼目錄下,將裡面的etc目錄複製到根檔案系統下:

[email protected]:~/rootfs_zht/busybox-1.29.2# cd ./examples/bootfloppy/
[email protected]:~/rootfs_zht/busybox-1.29.2/examples/bootfloppy# ls
bootfloppy.txt  display.txt  etc  mkdevs.sh  mkrootfs.sh  mksyslinux.sh  quickstart.txt  syslinux.cfg
[email protected]
:~/rootfs_zht/busybox-1.29.2/examples/bootfloppy# cp etc ~/rootfs_zht/rootfs -rf

etc目錄包含了下面幾個檔案,內容很少,接下來就要去修改它們。
├── fstab
├── init.d
│     └── rcS
├── inittab
└── profile

一、修改初始化檔案inittab

inittab格式為:<id>:<runlevels>:<action>:<process>


inittabd的格式在busybox中定義,想要詳細瞭解可以去看busybox原始碼。執行時busybox會先讀取配置檔案然後解析,決定要執行的動作。busybox中的程序1是linuxrc,程序1最終最主要的目的是做完其他的事情進入死迴圈,死迴圈中反覆檢查有沒有滿足條件,當滿足action的條件時,執行process這個程式。

<id> :表示這個子程序要使用的控制檯,如果省略,則使用與init程序一樣的控制檯。
<runlevels> :對於BusyBox init程式,這個欄位沒有意義,可以省略。
<action> :表示init程序如何控制這個子程序。

action名稱 執行條件 說明
sysinit 系統啟動後最先執行 只執行一次,init程序等待它結束才繼續執行其它動作
wait 系統執行完sysinit程序後 只執行一次,init程序等待它結束後才繼續執行其它動作
once 系統執行完wait程序後 只執行一次,init程序不等待它結束
raspawn 啟動完once程序後 init程序監測發現子程序退出時,重新啟動它
askfirst 啟動完raspawn程序後 與raspawn類似,不過init程序先輸出“Please press Enter to activate this console.”,等待使用者輸入回車鍵之後才能啟動子程序
shutdown 當系統關機時 即重啟、關閉系統時
restart BusyBox中配置了CONFIG_FEATURE_USE_INITTAB,並且init程序接收到SIGHUP訊號時 先重新讀取、解析/etc/inittab檔案、再執行restart程式
ctrlaltdel 按下Ctrl+Alt+Del組合鍵時 -

<process> :要執行的程式,可以是可執行程式,也可以是指令碼。如果<process>欄位前面有“-”字元,這個程式則稱為可以“互動的”。
在/etc/inittab檔案的控制下,init程序的行為總結如下。

  • 在系統啟動前期,init程序首先啟動<action>為sysinit、wait、once的3類子程序。
  • 在系統正常執行期間,init程序首先啟動<action>為raspawn、askfirst的2類子程序並監視它們,發現某個子程序退出時,重新啟動它們。
  • 在系統退出時,執行<action>為shutdown、restart、ctrlaltdel的3類子程序。

inittab修改為以下內容:

#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init

系統啟動後首先執行一次/etc/init.d/rcS指令碼,指令碼執行結束後執行profile指令碼(/bin/sh加上”-”的話就會在登陸終端之後呼叫/etc/目錄下的profile檔案,而不加”-”則不會執行這個指令碼),再執行/bin/sh程式,之後就可以在控制檯輸入互動命令,程序進入死迴圈,始終檢查是否滿足raspawn或者askfirst條件,一旦滿足就執行相應子程序;系統退出時執行hutdown、restart、ctrlaltdel的子程序。

執行結果如下:

二、修改/etc/init.d/rcS檔案

#! /bin/sh
umask 022
mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
ifconfig eth0 192.168.1.10
/bin/hostname -F /etc/hostname

第1行:表示這是一個指令碼檔案,指明瞭指令碼直譯器的路徑,使用sh進行解析。
第2行:設定linux系統的umask的值,決定使用者建立檔案的預設許可權。
第3行:mount -a用來掛載所有/etc/fstab指定的檔案系統。
第4、5行:利用BusyBox自帶的mdev可執行檔案在系統啟動時建立所有的裝置節點。mdev的作用主要有兩個:初始化/dev目錄和動態更新,動態更新不僅是更新/dev目錄,還支援熱插拔動作(前提是保證核心中支援hotplug)。
第6行:設定板子IP地址。
第7行:-F來指定一個主機名的配置檔案,檔名一般叫hostname或者HOSTNAME。

三、修改fstab檔案

詳細參考:https://blog.csdn.net/richerg85/article/details/17917129

# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# 	<file system> 	<mount point> 	<type> 	<options> 	<dump> 	<pass>
	proc 			/proc 			proc 	defaults 	0 		0
	sysfs 			/sys 			sysfs 	defaults 	0 		0
	tmpfs 			/var 			tmpfs 	defaults 	0 		0
	tmpfs 			/tmp 			tmpfs 	defaults 	0 		0
	tmpfs 			/dev 			tmpfs 	defaults 	0 		0
  • file system:要掛載的分割槽或儲存裝置。
  • mount point:掛載點。
  • type:要掛載裝置或是分割槽的檔案系統型別,支援許多種不同的檔案系統:ext2, ext3, ext4, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap 及 auto。 設定成auto型別,表示自動檢測檔案系統型別。
  • options:掛載時使用的引數。
  • dump和pass:用來決定dump、pass程式的行為。

四、建立資料夾

fstab檔案中指定的掛載點現在在rootfs中並不存在,所以需要在rootfs目錄下手動建立這幾個資料夾。如果不建立的話,系統啟動會提示掛載失敗。

mkdir proc sys var tmp dev

這個時候重新執行rootfs就可以看到proc下面多出了很多檔案,說明掛載成功了。

五、修改profile檔案

Linux是一個多使用者的作業系統,每個使用者登入系統後都會有一個專用的執行環境,這個執行環境就是一組環境變數的定義,將定義集中在一個檔案中,即是/etc/profile檔案,可以通過修改profile檔案對執行環境進行配置。

export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=lib:/usr/lib
HOSTNAME='/bin/hostname'
export PS1="\e[32;01m\[email protected]\h\e[00m:\e[34;01m\w\e[00m\# "
alias ll='/bin/ls -laF'

第1行:定義PATH變數,賦值為後面的字串,然後匯出為環境變數。PATH表示了當前使用者的系統命令、常用命令及應用程式的預設儲存路徑。執行指令時,shell會按照列出的路徑順序依次查詢符合要求的可執行檔案。
第2行:LD_LIBRARY_PATH設定了應用程式庫的路徑。
第3行:定義變數並賦值
第4行:定義PS1變數並匯出為環境變數,PS1是基本提示符,以上格式與ubuntu同款。

  • \e[32;01m:讓後面的\[email protected]\h顯示為綠色,高亮顯示
  • \u:顯示當前使用者名稱稱
  • \h:顯示主機名稱
  • \e[00m:關閉所有屬性(用於顯示冒號)
  • \e[34;01m:讓後面的\w顯示為藍色,高亮顯示
  • \w:顯示完整的工作目錄名稱,\W顯示當前目錄
  • \# :root使用者提示符為# ,普通使用者為$。
  • 注意字串最後面要有個空格!

第5行: alias用來設定別名,簡化常用的較長命令
PS1設定字元序列顏色格式為: \e[ F;B;Cm
①.F為前景色,B為背景色,C為程式碼;②.這個地方只填一個值就不需要寫分號,填了多個值才需要用分號隔開;③.FBC不分先後次序,根據值來設定相應顏色。
顏色表

前景 背景 顏色
30 40 黑色
31 41 紅色
32 42 綠色
33 43 黃色
34 44 藍色
35 45 紫紅色
36 46 青藍色
37 47 白色

程式碼表

程式碼 意義
0 關閉所有屬性
1 高亮顯示
4 下劃線
5 閃爍
7 反白顯示
8 不可見
[email protected]:~/rootfs_zht/rootfs/etc# vi hostname
# 然後輸入自定義主機名

輸入的主機名在命令提示符中顯示,使用者名稱暫時不會顯示,因為還沒有做使用者登入。


參考資料: