我們找個簡單的rcS檔案内容,我們分析一下:
[plain] view plain copy print ?
- #!/bin/sh
- PATH=/sbin:/bin:/usr/sbin:/usr/bin
- runlevel=S
- prevlevel=N
- umask 022
- export PATH runlevel prevlevel
- mount -a
- echo /sbin/mdev > /proc/sys/kernel/hotplug
- mdev -s
- /bin/hostname -F /etc/sysconfig/HOSTNAME
- ifconfig eth0 192.168.1.10
1.PATH=xxx
(1)首先從shell腳本的文法角度分析,這一行定義了一個變量PATH,值等于後面的字元串
(2)後面用export導出了這個PATH,那麼PATH就變成了一個環境變量。
(3)PATH這個環境變量是Linux系統内部定義的一個環境變量,含義是作業系統去執行程式時會預設到PATH指定的各個目錄下去尋找。如果找不到就認定這個程式不存在,如果找到了就去執行它。将一個可執行程式的目錄導出到PATH,可以讓我們不帶路徑來執行這個程式。
(4)rcS中為什麼要先導出PATH?就是因為我們希望一旦進入指令行下時,PATH環境變量中就有預設的/bin /sbin /usr/bin /usr/sbin 這幾個常見的可執行程式的路徑,這樣我們進入指令行後就可以ls、cd等直接使用了。
(5)為什麼我們的rcS檔案還沒添加,系統啟動就有了PATH中的值?原因在于busybox自己用代碼寫死為我們導出了一些環境變量,其中就有PATH。
2、runlevel=
(1)runlevel也是一個shell變量,并且被導出為環境變量。
(2)runlevel這個環境變量到底有什麼用?
(3)runlevel=S表示将系統設定為單使用者模式
3、umask=
(1)umask是linux的一個指令,作用是設定linux系統的umask值。
(2)umask值決定目前使用者在建立檔案時的預設權限。
4、mount -a
(1)mount指令是用來挂載檔案系統的
(2)mount -a是挂載所有的應該被挂載的檔案系統,在busybox中mount -a時busybox會去查找一個檔案/etc/fstab檔案,這個檔案按照一定的格式列出來所有應該被挂載的檔案系統(包括了虛拟檔案系統)
5、PATH&runlevel
(1)我們實戰發現rcS檔案明明存在但是卻提示不存在,問題原因就是rcS檔案在windows下建立的,行尾換行符為'\r\n',多了點東西。但是因為ubuntu中的vi對行尾做了優化,是以在ubuntu中是看不出來多了東西的。但是在securecrt下一看就發現每一行末尾多出來了一個^M。
(2)這個故事告訴我們:shell腳本檔案如果格式不對,運作時可能會被提示檔案不存在。
(3)擴充講一個:有時候一個應用程式執行時也會提示檔案不存在,問題可能是這個程式所調用的一個動态連結庫找不到。
(4)測試結果:PATH本來在busybox中就已經用代碼導出過了,是以rcS中再次導出沒有任何明顯的現象,是以看不出什麼差别;runlevel實際執行結果一直是unknown,問題在于busybox并不支援runlevel這個特性。
6、umask測試
(1)umask是022的時候,預設touch建立一個檔案的權限是644
(2)umask是044的時候,預設touch建立一個檔案的權限是622
(3)umask是444的時候,預設touch建立一個檔案的權限是222
總結:umask的規律就是:umask值和預設建立檔案的權限值加起來是666.
7、mount測試
(1)挂載時全部出錯:
mount: mounting proc on /proc failed: No such file or directory
mount: mounting sysfs on /sys failed: No such file or directory
mount: mounting tmpfs on /var failed: No such file or directory
mount: mounting tmpfs on /tmp failed: No such file or directory
mount: mounting tmpfs on /dev failed: No such file or directory
(2)原因是因為根檔案系統中找不到挂載點。所謂挂載點就是我們要将目标檔案系統(當然這裡都是虛拟檔案系統)挂載到目前檔案系統中的某一個目錄中,這個目錄就是挂載點。
(3)解決方案就是自己在制作的rootfs根目錄下建立這些挂載點目錄即可。
(4)驗證是否挂載成功,可以看挂載時輸出資訊;還可以啟動後去看proc和sys檔案夾,如果有檔案出現則證明挂載成功了,如果沒東西就證明失敗了。
8、mdev
(1)mdev是udev的嵌入式簡化版本,udev/mdev是用來配合linux驅動工作的一個應用層的軟體,udev/mdev的工作就是配合linux驅動生成相應的/dev目錄下的裝置檔案。
(2)因為這個問題涉及到驅動,是以詳細講解要等到驅動部分。這裡我們隻是通過一些直覺的現象來初步了解udev/mdev的工作效果。
(3)在rcS檔案中沒有啟動mdev的時候,/dev目錄下啟動後是空的;在rcS檔案中添加上mdev有關的2行配置項後,再次啟動系統後發現/dev目錄下生成了很多的裝置驅動檔案。
(4)/dev目錄下的裝置驅動檔案就是mdev生成的,這就是mdev的效果和意義。
9、hostname
(1)hostname是linux中的一個shell指令。指令(hostname xxx)執行後可以用來設定目前系統的主機名為xxx,直接hostname不加參數可以顯示目前系統的主機名。
(2)/bin/hostname -F /etc/sysconfig/HOSTNAME -F來指定了一個主機名配置檔案(這個檔案一般檔案名叫hostname或者HOSTNAME)
10、ifconfig
(1)有時候我們希望開機後進入指令行時ip位址就是一個指定的ip位址(譬如192.168.1.30),這時候就可以在rcS檔案中ifconfig eth0 192.168.1.30