新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 制作嵌入式根文件系統常見問題詳解

        制作嵌入式根文件系統常見問題詳解

        作者: 時間:2010-12-26 來源:網絡 收藏

          首先介紹點背景知識,關于inittab的:

        本文引用地址:http://www.104case.com/article/241288.htm

          init是系統中所有的父,init進程繁衍出完成通常操作所需的子進程,這些操作包括:設置機器名、檢查和安裝磁盤及文件系統、啟動系統日志、配置網絡接口并啟動網絡和郵件服務,啟動打印服務等。Solaris中init進程的主要任務是按照所提供的信息創建進程,由于進行系統的那些進程都由init創建,所以init進程也稱為系統進程。

          下面具體說明的格式。

          中每一記錄都從新的一行開始,每個記錄項最多可有512個字符,每一項的格式通常如下:id:rstate:action:process,下面分別解釋。

          1.id字段是最多4個字符的字符串,用來唯一標志表項。

          2.rstate(run state)字段定義該記錄項被調用時的運行級別,rstate可以由一個或多個運行級別構成,也可以是空,空則代表運行級別0~6。當請求init改變運行級別時,那些rstate字段中不包括新運行級別的進程將收到SIGTERM警告信號,并且最后被殺死;只有a、b、c啟動的命令外(a、b、c不是真正的運行級別)

          3.action字段告訴init執行的動作,即如何處理process字段指定的進程,action字段允許的值及對應的動作分別為:

          1)respawn:如果process字段指定的進程不存在,則啟動該進程,init不等待處理結束,而是繼續掃描inittab文件中的后續進程,當這樣的進程終止時,init會重新啟動它,如果這樣的進程已存在,則什么也不做。

          2)wait:啟動process字段指定的進程,并等到處理結束才去處理inittab中的下一記錄項。

          3)once:啟動process字段指定的進程,不等待處理結束就去處理下一記錄項。當這樣的進程終止時,也不再重新啟動它,在進入新的運行級別時,如果這樣的進程仍在運行,init也不重新啟動它。

          4)boot:只有在系統啟動時,init才處理這樣的記錄項,啟動相應進程,并不等待處理結束就去處理下一個記錄項。當這樣的進程終止時,系統也不重啟它。

          5)bootwait:系統啟動后,當第一次從單用戶模式進入多用戶模式時處理這樣的記錄項,init啟動這樣的進程,并且等待它的處理結束,然后再進行下一個記錄項的處理,當這樣的進程終止時,系統也不重啟它。

          6)powerfail:當init接到斷電的信號(SIGPWR)時,處理指定的進程。

          7)powerwait:當init接到斷電的信號(SIGPWR)時,處理指定的進程,并且等到處理結束才去檢查其他的記錄項。

          8)off:如果指定的進程正在運行,init就給它發SIGTERM警告信號,在向它發出信號SIGKILL強制其結束之前等待5秒,如果這樣的進程不存在,則忽略這一項。

          9)ondemand:功能通respawn,不同的是,與具體的運行級別無關,只用于rstate字段是a、b、c的那些記錄項。

          10)sysinit:指定的進程在訪問之前執行,這樣的記錄項僅用于對某些設備的,目的是為了使init在這樣的設備上向用戶提問有關運行級別的問題,init需要等待進程運行結束后才繼續。

          11)initdefault:指定一個默認的運行級別,只有當init一開始被調用時才掃描這一項,如果rstate字段指定了多個運行級別,其中最大的數字是默認的運行級別,如果rstate字段是空的,init認為字段是0123456,于是進入級別6,這樣便陷入了一個循環,如果 inittab文件中沒有包含initdefault的記錄項,則在系統啟動時請求用戶為它指定一個初始運行級別

          4.Process字段中進程可以是任意的守候進程、可執行腳本或程序。

          另外:在任何時候,可以在文件inittab中添加新的記錄項,級別Q/q不改變當前的運行級別,重新檢查inittab文件,可以通過命令init Q或init q使init進程立即重新讀取并處理文件inittab

          以上這些都是介紹的標準的linux System V的標準,所以對嵌入式來講有些東西并不見得有用!這里介紹點針對嵌入式的,也就是針對busybox init的:

          busybox的init

          除了基本的命令之外,BusyBox還支持init功能,如同其它的init一樣,busybox的init也是完成系統的初始化工作,關機前的工作等等,我們知道在Linux的內核被載入之后,機器就把控制權轉交給內核,linux的內核啟動之后,做了一些工作,然后找到根文件系統里面的init程序,并執行它,BusyBox的init進程會依次進行以下工作:(參考構建嵌入式LINUX系統>> p201)

          1. 為init設置信號處理過程

          2. 初始化

          3. 剖析/etc/inittab文件

          4. 執行系統初始化命令行,缺省情況下會使用/etc/init.d/rcS

          5. 執行所有導致init暫停的inittab命令(動作類型:wait)

          6. 執行所有僅執行一次的inittab(動作類型:once)

          一旦完成以上工作,init進程便會循環執行以下進程:

          1. 執行所有終止時必須重新啟動的inittab命令(動作類型:once)

          2. 執行所有終止時必須重新啟動但啟動前必須詢問用戶的inittab命令(動作類型:askfirst)

          初始化之后,BusyBox會檢查/etc/inittab文件是否存在,如果此文件不存在,BusyBox會使用缺省的inittab配置,它主要為系統重引導,系統掛起以及init重啟動設置缺省的動作,此外它還會為四個虛擬控制臺(tty1到tty4)設置啟動shell的動作。如果未建立這些設備文件,BusyBox會報錯。

          inittab文件中每一行的格式如下所示:(busybox的根目錄下的example文件夾下有詳盡的inittab文件范例)

          id:runlevel:action:process

          盡管此格式與傳統的Sytem V init類似,但是,id在BusyBox的init中具有不同的意義。對BusyBox而言,id用來指定啟動進程的控制tty。如果所啟動的進程并不是可以交互的shell,例如BusyBox的sh(ash),應該會有個控制tty,如果控制tty不存在,Busybox的sh會報錯。BusyBox將會完全忽略runlevel字段,所以空著它就行了,你也許會問既然沒用保留著它干嗎,我想大概是為了和傳統的Sytem V init保持一致的格式吧。process字段用來指定所執行程式的路徑,包括命令行選項。action字段用來指定下面表中8個可應用到process的動作之一。

          sysinit: 為init提供初始化命令行的路徑

          respawn: 每當相應的進程終止執行便會重新啟動

          askfirst: 類似respawn,不過它的主要用途是減少系統上執行的終端應用程序的數量。它將會促使init在控制臺上顯示“Please press Enter to active this console”的信息,并在重新啟動之前等待用戶按下enter鍵

          wait: 告訴init必須等到相應的進程完成之后才能繼續執行

          once:僅執行相應的進程一次,而且不會等待它完成

          ctratldel: 當按下Ctrl+Alt+Delete組合鍵時,執行相應的進程

          shutdown: 當系統關機時,執行相應的進程

          restart: 當init重新啟動時,執行相應的進程,通常此處所執行的進程就是init本身

          以下是我的usblinux的inittab文件

          ::sysinit:/etc/init.d/rcS

          ::respawn:/sbin/getty 115200 tty1

          tty2::askfirst:-/bin/sh

          tty3::askfirst:-/bin/sh

          ::restart:/sbin/init

          ::ctrlaltdel:/bin/umount -a -r

          這個inittab執行下列動作

          1. 將/etc/init.d/rcS設置成系統的初始化文件

          2. 在115200 bps的虛擬終端tty1上啟動一個登陸會話 (注意getty的用法)

          3. 在虛擬終端tty2和tty3上啟動askfirst動作的shell

          4. 如果init重新啟動,將/sbin/init設置成它會執行的程序

          5. 告訴init,在系統關機的時候執行umount命令卸載所有文件系統,并且在卸載失敗時用只讀模式沖新安裝以保護文件系統。

          1、busybox的inittab與pc使用的inittab不同,第一ID并不是隨便取名字的,這個名字要與/dev/目錄下是否有對應的文件對應

          對應錯誤

          can't open /dev/0: No such file or directory

          process '-/bin/sh' (pid 789) exited. Scheduling for restart.

          can't open /dev/0: No such file or directory

          process '-/bin/sh' (pid 793) exited. Scheduling for restart.

          2、出現下面這種錯誤:

          process '-/bin/sh' (pid 789) exited. Scheduling for restart.

          process '-/bin/sh' (pid 794) exited. Scheduling for restart.

          process '-/bin/sh' (pid 796) exited. Scheduling for restart.

          process '-/bin/sh' (pid 798) exited. Scheduling for restart.

          對應的inittab文件中有

          ttyS0::askfirst:-/bin/sh

          雖然在/dev/目錄下有ttyS0設備,但是這個設備顯然不可用,所以才會出現上面的錯誤

          3、當在inittab中同時定義的兩個在同一個串口終端登陸的語句時

          ::askfirst:-/bin/sh

          s3c2410_serial0:23456:respawn:/sbin/getty -L s3c2410_serial0 115200 vt100

          出現的情況就是被搶占,不能接收任何串口輸入

          4、bad inittab entry

          多半時因為非法字符造成的。

        [next]

          5、busybox中的字段runleve也沒有運行時的運行級別的概念

          6、分析一下啟動的過程

          1. 為init設置信號處理過程

          2. 初始化控制臺

          3. 剖析/etc/inittab文件

          4. 執行系統初始化命令行,缺省情況下會使用/etc/init.d/rcS

          5. 執行所有導致init暫停的inittab命令(動作類型:wait)

          6. 執行所有僅執行一次的inittab(動作類型:once)

          一旦完成以上工作,init進程便會循環執行以下進程:

          1. 執行所有終止時必須重新啟動的inittab命令(動作類型:once)

          2. 執行所有終止時必須重新啟動但啟動前必須詢問用戶的inittab命令(動作類型:askfirst)

          初始化控制臺之后,BusyBox會檢查/etc/inittab文件是否存在,如果此文件不存在,BusyBox會使用缺省的inittab配置,它主要為系統重引導,系統掛起以及init重啟動設置缺省的動作,此外它還會為四個虛擬控制臺(tty1到tty4)設置啟動shell的動作。如果未建立這些設備文件,BusyBox會報錯。

          7、網上有人問“-”的作用

          我很納悶:

         ?。海?respawn:-/bin/sh

          這個-是干什么的,為什么有的時候有有的時候沒有???

          還有啊,我從網上看到一個例程,如下,節選:

          ::respawn:-/bin/sh

          tty2::askfirst:-/bin/sh

          我搞不清兩個的區別,這樣控制臺就啟動了,是第一句啟動的還是第二句,那我內核啟動參數里面的console=ttyS0會自動來找這個控制臺???

          原帖由 wavezone 于 2008-8-22 16:34 發表

          我很納悶:

         ?。海?respawn:-/bin/sh

          這個-是干什么的,為什么有的時候有有的時候沒有???

          還有啊,我從網上看到一個例程,如下,節選:

          ::respawn:-/bin/sh

          tty2::askfirst:-/bin/sh

          我搞不清兩個的區別 ...

          測試的時候是這樣的,加上”-”的語句會在登陸終端之后調用/etc/目錄下的profile文件,而不加”-”的不會執行這個腳本。

          其實登陸終端的命令有幾種方便,但是標準的還是使用getty來登陸,但是直接使用如上的語句也是可以的,并且兼容性強一點,因為它不需要指定對應的串口設備。

          ::askfirst:-/bin/sh

          s3c2410_serial0::askfirst:-/bin/sh

          ::askfirst:-/bin/sh

          s3c2410_serial0:23456:respawn:/sbin/getty -L s3c2410_serial0 115200 vt100

          都是可用的。

          8./bin/sh: XXX not found

          arm-linux-readelf -d xxx

          查看你的以用程序依賴哪些庫

          一般是因為缺少libc.so.6造成的,實際還是根文件系統的問題,沒有將常用的庫文件拷貝到/lib目錄下

          常用的庫:

          [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/ld* .

          [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libc-2.3.2.so .

          [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libc.so.6 .

          [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libm * .

          [root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libcrypt* .

          9、錯誤insmod: chdir(2.6.26.6): No such file or directory

          網上有人提出這種解決方法:

          需要注意的是insmod等模塊加載命令需要從lib/modules/2.6.26.6

          的目錄下加載模塊,所以必須先建立此目錄,然后將模塊放到此目錄下面,否則將出現以下兩種情況:

          一是沒有建立lib/modules/2.6.26.6目錄,取決于內核版本號,將出現insmod: chdir(2.6.26.6): No such file or directory的錯誤

          二是只將模塊簡單地放在根目錄或其它文件夾,沒有將其拷貝到指定的lib/modules/2.6.26.6目錄,將出現

          insmod: module 'gpio_driver' not found錯誤

          不過這種方法不是很奏效

          根本原因是insmod的問題,在busybox編譯的時候參考下面的選項,不要使用

          Linux Module Utilities --->

          [ ] Simplified modutils

          //該選項不要選擇

          [*] Support version 2.6.x Linux kernels

          //此選項選上

          參考如下:

          10、不能執行”-h”命令

          在執行xxx –h時沒有任何反應。是在lib目錄下缺少常見的庫文件

          參考如下:

          [root@vm-dev rootfs]# ls lib/

          ld-2.3.6.so libc-2.3.6.so libgcc_s.so libnsl.so.1 libnss_files.so.2 libnss_nis.so.2 librt-2.3.6.so libthread_db.so.1

          ld-linux.so.2 libcrypt-2.3.6.so libgcc_s.so.1 libnss_compat-2.3.6.so libnss_hesiod-2.3.6.so libpcprofile.so librt.so.1 libutil-2.3.6.so

          libanl-2.3.6.so libcrypt.so.1 libm-2.3.6.so libnss_compat.so.2 libnss_hesiod.so.2 libpthread-0.10.so libSegFault.so libutil.so.1

          libanl.so.1 libc.so.6 libmemusage.so libnss_dns-2.3.6.so libnss_nis-2.3.6.so libpthread.so.0 libtermcap.so.2 modules

          libBrokenLocale-2.3.6.so libdl-2.3.6.so libm.so.6 libnss_dns.so.2 libnss_nisplus-2.3.6.so libresolv-2.3.6.so libtermcap.so.2.0.8

          libBrokenLocale.so.1 libdl.so.2 libnsl-2.3.6.so libnss_files-2.3.6.so libnss_nisplus.so.2 libresolv.so.2 libthread_db-1.0.so

          [root@vm-dev rootfs]#

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        pid控制相關文章:pid控制原理


        pid控制器相關文章:pid控制器原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 中江县| 保亭| 麻江县| 栾川县| 浏阳市| 珲春市| 金川县| 宜春市| 山丹县| 宁国市| 云安县| 筠连县| 莫力| 徐州市| 南平市| 靖西县| 水城县| 夹江县| 莫力| 杂多县| 贡觉县| 天全县| 商丘市| 吉林市| 花莲市| 贵州省| 石城县| 泽库县| 绵阳市| 靖江市| 开原市| 大化| 平原县| 伊吾县| 林口县| 息烽县| 外汇| 合肥市| 黄石市| 祁阳县| 永胜县|