一步步完善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
# 然後輸入自定義主機名
輸入的主機名在命令提示符中顯示,使用者名稱暫時不會顯示,因為還沒有做使用者登入。
參考資料:
- <<嵌入式Linux軟硬體開發詳解>>
- 朱老師嵌入式Linux網課
- https://blog.csdn.net/qq_34208467/article/details/81019467