天天看點

/etc/init.d/rcS檔案詳解

我們找個簡單的rcS檔案内容,我們分析一下:

[plain]  view plain  copy  print ?

  1. #!/bin/sh  
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin  
  3. runlevel=S  
  4. prevlevel=N  
  5. umask 022  
  6. export PATH runlevel prevlevel  
  7. mount -a  
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug  
  9. mdev -s  
  10. /bin/hostname -F /etc/sysconfig/HOSTNAME  
  11. 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