Uboot和系統移植(19)------- 根文件系統構建過程詳解


一,busybox的移植實戰


1、busybox源碼下載
(1)busybox是一個開源項目,所以源代碼可以直接從網上下載。
(2)busybox的版本差異不大,版本新舊無所謂。
(3)下載busybox可以去busybox官方網站下載。

2、修改Makefile

在這裏插入圖片描述
(1) ARCH = arm
(2) CROSS_COMPILE = (安裝交叉編譯工具鏈的路徑)/arm-none-linux-gnueabi-

3、make menuconfig進行配置
配置如下:

Busybox Settings--->
	Build Options--->
		[*]Build BusyBox as a static binary(no shared libs)

Busybox Settings--->		
	Busybox Library Tuning--->
		[*]vi-style line editing commands
		[*]Fancy shell prompts
	
	
Linux Module Utilities--->
	[ ]Simplified modutils
	[*]insmod
	[*]rmmod
	[*]lsmod
	[*]modprobe
	[*]depmod

	
Linux System Utilities--->[*]mdev
	[*]Support /etc/mdev.conf
	[*]Support subdirs/symlinks
	[*]Support regular expressions substitutions when renaming dev
	[*]Support command execution at device addition/removal
	[*]Support loading of firmwares

配置完成保存退出,進行編譯。

4、make 然後 make install
(1)make編譯,如果有錯誤解決之
在這裏插入圖片描述
在這裏插入圖片描述

(2)make install執行的時候其實是在執行busybox頂層目錄下的一個目標install
(3)make install在所有的linux下的軟件中作用都是安裝軟件。在傳統的linux系統中安裝軟件時都是選擇源代碼方式安裝的。我們下載要安裝的軟件源代碼,然後配置、編譯、安裝。make install的目的就是將編譯生成的可執行程序及其依賴的庫文件、配置文件、頭文件安裝到當前系統中指定一般都可以自己指定安裝到哪個目錄下,如果不指定一般都有個默認目錄)的目錄下

在這裏插入圖片描述

5、設置bootargs掛載添加了busybox移植的rootfs
(1)之前建立了一個空的文件夾然後自己touch linuxrc隨便創建了一個不能用的/linuxrc然後去nfs掛載rootfs,實驗結果是:掛載成功,執行/linuxrc失敗。
(2)現在我們移植了busybox後/linuxrc就可以用了,然後再次去nfs掛載這個rootfs。預計看到的效果是:掛載成功,執行/linuxrc也能成功
(3)注意uboot的bootargs設置成:set bootargs root=/dev/nfs nfsroot=192.168.1.141:/x210_porting/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200

(4)實驗結果:掛載成功,執行/linuxrc(也就是busybox)成功,但是因爲找不到/etc/init.d/rcS和/dev/tty2等文件所以一直在打印錯誤提示信息,但是其實有進入命令行。

在這裏插入圖片描述

二,inittab詳解

1、添加一個典型的inittab
(1)將我提供的典型的inittab文件複製到我們製作的rootfs的根目錄下的/etc/目錄下
(2)再次啓動內核掛載這個rootfs看效果
(3)實驗現象是成功啓動並且掛載rootfs進入了控制檯命令行。當前製作的最小rootfs成功了
在這裏插入圖片描述

2、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


3、inittab格式解析
(1)inittab的工作原理就是被/linuxrc(也就是busybox)執行時所調用起作用
(2)inittab在/etc目錄下,所以屬於一個運行時配置文件,是文本格式的(內容是由一系列的遵照一個格式組織的字符組成的),實際工作的時候busybox會(按照一定的格式)解析這個inittab文本文件,然後根據解析的內容來決定要怎麼工作。
(3)busybox究竟如何完成解析並且解析結果如何去工作(busybox中實現/etc/inittab的原理)並不是我們的目標,我們的重點是inittab的格式究竟怎樣的?我們看到一個inittab後怎麼去分析這個inittab對啓動的影響。

(4)inittab的格式在busybox中定義的,網上可以搜索到詳細的格式說明,具體去參考即可:
第一個:#開始的行是註釋
第二個:冒號在裏面是分隔符,分隔開各個部分。
第三個:inittab內容是以行爲單位的,行與行之間沒有關聯,每行都是一個獨立的配置項,每一個配置項表示一個具體的含義
第四個:每一行的配置項都是由3個冒號分隔開的4個配置值共同確定的。這四個配置值就是id:runlevels:action:process。值得注意得是有些配置值可以空缺,空缺後冒號不能空缺,所以有時候會看到連續2個冒號。
第五個:每一行的配置項中4個配置值中最重要的是action和processaction是一個條件/狀態,process是一個可被執行的程序的pathname。合起來的意思就是:當滿足action的條件時就會執行process這個程序

4、inittab源碼解析
::sysinit:/etc/init.d/rcS :當系統初始化,只有系統開機或重新啓動的時候/etc/init.d/rcS纔會被執行一次
::askfirst:-/bin/sh:當系統初始化,直接進入命令行,不需要登錄
s3c2410_serial2::sysinit:/bin/login:當系統初始化,只有系統開機或重新啓動的時候,/bin/login纔會被執行一次,然後登錄用戶名和密碼(與上面的方式兩者2選一)。
::ctrlaltdel:-/sbin/reboot:當按住ctrl+alt+delate時,系統執行/sbin/reboot。
::shutdown:/bin/umount -a -r:當關機時,執行/bin/umount -a -r,將所有的文件夾和文件都卸載
::restart:/sbin/init:重啓時,執行/sbin/init

注意:理解inittab的關鍵就是明白“當滿足action的條件時就會執行process這個程序。” 你去分析busybox的源代碼就會發現,busybox最終會進入一個死循環,在這個死循環中去反覆檢查是否滿足各個action的條件,如果某個action的條件滿足就會去執行對應的process


三,busybox源碼的簡單分析


1、整個程序入口確認
(1)分析一個程序,不管多龐大還是小,最好的路線都是按照程序運行時的邏輯順序來。所以找到一個程序的入口至關重要。
(2)學C語言的時候都知道程序的主函數main函數就是整個程序的入口這種情況適應於操作系統下工作的應用程序的情況
(3)在uboot和linux kernel這兩個大的C語言的項目中,main函數都沒有,都不是入口。在我們這種裸機程序中入口不是main函數,而是由連接腳本來指定的
(4)busybox是linux啓動起來後工作的一個應用程序,因此其中必然有main函數,而且main就是入口

2、busybox的工作原理
(1)busybox入口就是main函數,其中有很多個main但是隻有一個起作用了,其他的是沒起作用的。真正的busybox工作時的入口是libbb/appletlib.c中的main函數
(2)busubox中有很多xxx_main函數,這些main函數每一個都是busybox支持的一個命令的真正入口譬如ls_main函數就是busybox當作ls函數使用時的入口程序。
(3)ls或者cd等命令其實都是busybox一個程序,都是busybox的符號鏈接。但是實際執行時的效果卻是各自的效果。busybox是如何實現一個程序化身萬千還能各自工作的?答案就是main轉xxx_main。也就是說busybox每次執行時都是先執行其main,在main函數中識別(靠main函數的傳參argv[0]來識別)我們真正要執行的函數(譬如ls)然後去調用相應的xxx_main(譬如ls_main)來具體實現這個命令。

在這裏插入圖片描述

3、inittab解析與執行
(1)inittab的解析是在busybox/init/init.c/init_main函數中
(2)執行邏輯是:先通過parse_inittab函數解析/etc/inittab(解析的重點是將inittab中的各個action和process解析出來),然後後面先直接執行sysinit和wait和once(注意這裏只執行一遍),然後在while(1)死循環中去執行respwan和askfirst

在這裏插入圖片描述

4、busybox的體積優勢原理

(1)busybox實際上就是把ls、cd、mkdir等很多個linux中常用的shell命令集成在一起了。集成在一起後有一個體積優勢:就是busybox程序的大小比busybox中實現的那些命令的大小加起來要小很多。
(2)busybox體系變小的原因主要有2個:第一個是busybox本身提供的shell命令是閹割版的(busybox中的命令支持的參數選項比發行版中要少,譬如ls在發行版中可以有幾十個-x,但是在busybox中只保留了幾個常用的選項,不常用的都刪除掉了);第二個是busybox中因爲所有的命令的實現代碼都在一個程序中實現,而各個命令中有很多代碼函數都是通用的(譬如ls和cd、mkdir等命令都會需要去操作目錄,因此在busybox中實現目錄操作的函數就可以被這些命令共用),共用會降低重複代碼出現的次數,從而減少總的代碼量和體積。
(3)busybox的體積優勢是嵌入式系統本身的要求和特點造成的。


四,rcS文件的添加與解析


1.rcS文件引入

1、rcS文件源碼

#!/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

分析:
0、/etc/init.d/rcS文件是linux的運行時配置文件中最重要的一個,其他的一些配置都是由這個文件引出來的。這個文件可以很複雜也可以很簡單,裏面可以有很多的配置項。

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=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、fstab文件源碼

# /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


2.添加rcS文件部分內容實戰

1、實驗步驟1
在這裏插入圖片描述
2、實驗步驟2
在這裏插入圖片描述

3、PATH&runlevel
(1)我們實戰發現rcS文件明明存在但是卻提示不存在,問題原因就是rcS文件在windows下創建的,行尾換行符爲’\r\n’,多了點東西。但是因爲ubuntu中的vi對行尾做了優化,所以在ubuntu中是看不出來多了東西的。但是在securecrt下一看就發現每一行末尾多出來了一個^M。
(2)擴展:有時候一個應用程序執行時也會提示文件不存在,問題可能是這個程序所調用的一個動態鏈接庫找不到
(4)測試結果:PATH本來在busybox中就已經用代碼導出過了,所以rcS中再次導出沒有任何明顯的現象,因此看不出什麼差別;runlevel實際執行結果一直是unknown,問題在於busybox並不支持runlevel這個特性。

4、umask測試

在這裏插入圖片描述

(1)umask是022的時候,默認touch創建一個文件的權限是644
(2)umask是044的時候,默認touch創建一個文件的權限是622
(3)umask是444的時候,默認touch創建一個文件的權限是222
總結:umask的規律就是:umask值和默認創建文件的權限值加起來是666。umask設置值只會影響設置後的文件權限值,設置前的文件權限值還是跟umask值相匹配的。

5、mount測試
(1)掛載時全部出錯:

在這裏插入圖片描述
(2)原因是因爲根文件系統中找不到掛載點。所謂掛載點就是我們要將目標文件系統(當然這裏都是虛擬文件系統)掛載到當前文件系統中的某一個目錄中,這個目錄就是掛載點。
(3)解決方案就是自己在製作的rootfs根目錄下創建這些掛載點目錄即可
(4)驗證是否掛載成功,可以看掛載時輸出信息;還可以啓動後去看proc和sys文件夾,如果有文件出現則證明掛載成功了,如果沒東西就證明失敗了。在這裏插入圖片描述

3.完善rcS文件

在這裏插入圖片描述

1、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的效果和意義。

2、hostname
(1)hostname是linux中的一個shell命令。命令(hostname xxx)執行後可以用來設置當前系統的主機名爲xxx,直接hostname不加參數可以顯示當前系統的主機名。
(2)/bin/hostname -F /etc/sysconfig/HOSTNAME -F來指定了一個主機名配置文件(這個文件一般文件名叫hostname或者HOSTNAME)

在這裏插入圖片描述

3、ifconfig
(1)有時候我們希望開機後進入命令行時ip地址就是一個指定的ip地址(譬如192.168.1.10),這時候就可以在rcS文件中ifconfig eth0 192.168.1.10。


五,profile文件和用戶登錄理論


1、profile文件添加

(1)之前添加了/bin/hostname在/etc/sysconfig/HOSTNAME文件中定義了一個hostname(hqsx210),實際效果是:命令行下hostname命令查到的host名字確實是hqsx210。但是問題就是命令行的提示符是沒有顯示的。
(2)這個問題的解決就要靠profile文件。將提供的profile文件放入/etc/目錄下即可
(3)添加了之後的實驗現象:命令行提示符前面顯示:[@aston210 ]#
結論是:第一,profile文件起了作用,hostname顯示出來了。第二,還有個問題,登錄用戶名沒顯示出來。原因就是我們直接進入了命令行而沒有做登錄。等我們添加了用戶登錄功能,並且成功登陸後這個問題就能解決。
(4)profile文件工作原理是:profile文件也是被busybox(init進程)自動調用的,所以是認名字的。

在這裏插入圖片描述

2、如何看到用戶登錄界面
(1)linux中有一個原則就是用一個小程序來完成一個功能。如果我們產品確實需要很複雜的綜合型的功能,我們傾向於先使用很多個小程序完成其中的一個功能,然後再將這些小程序集成起來完成整個大功能的產品。
(2)這種集成很多個小程序來完成一個大的功能,有很多種技術實現。譬如shell腳本,還有一些別的技術,譬如linux啓動中的inittab。
(3)因爲我們之前intttab中有一個配置項 ::askfirst:-/bin/sh,這個配置項作用就是當系統啓動後就去執行/bin/sh,執行這個就會出現命令行。因此我們這樣的安排就會直接進入命令行而不會出現登錄界面。
(4)我們要出現登錄界面,就不能直接執行/bin/sh,而應該執行一個負責出現登錄界面並且負責管理用戶名和密碼的一個程序,busybox中也集成了這個程序(就是/bin/login和/sbin/gettty),因此我們要在inittab中用/bin/login或者/sbin/getty去替代/bin/sh

3、用戶名和密碼的設置
(1)用戶名和密碼的設置是和登錄程序有關聯的,但是/bin/login和/sbin/getty在用戶名和密碼的管理上是一樣的。其實常見的所有的linux系統的用戶名和密碼的管理幾乎都是一樣的。
(2)密碼一般都是用加密文字的,而不是用明文。意思就是系統中的密碼肯定是在系統中的一個專門用來存密碼的文件中存儲的,用明文存密碼有風險,因此linux系統都是用密文來存儲密碼的

4、添加/bin/login到sysinit
(1)在inittab中修改,去掉/bin/sh,換上/bin/login,則系統啓動後出現登錄界面。可以輸入用戶名和密碼。
(2)實驗現象:成功出現用戶登錄界面,但是死活密碼不對。

在這裏插入圖片描述

5、添加passwd和shadow文件
(1)爲什麼用戶名和密碼不對?因爲我們根本沒有爲root用戶設置密碼。
(2)linux系統中用來描述用戶名和密碼的文件是passwd和shadow文件,這兩個文件都在etc目錄下。passwd文件中存儲的是用戶的密碼設置,shadow文件中存儲的是加密後的密碼
(3)我們直接複製ubuntu系統中的/etc/passwd和/etc/shadow文件到當前製作的rootfs目錄下,然後再做修改即可
(4)/etc/passwd和/etc/shadow修理好後,shadow中默認有一個加密的密碼口令,這個口令和你拷貝的shadow本身有關,像我的ubuntu中root用戶的密碼就是root,因此複製過來後登陸時的密碼還是root。

在這裏插入圖片描述

6、重置密碼實踐
(1)ubuntu剛裝好的時候默認登錄是用普通用戶登錄的,默認root用戶是關閉的。普通用戶的密碼是在裝系統的時候設置的,普通用戶登陸後可以使用su passwd root給root用戶設置密碼,設置了密碼後root用戶纔可以登錄。
(2)其實這個原因就是root用戶在/etc/shadow文件中加密口令是空白的。所以是不能登錄的。
(3)busybox中因爲沒有普通用戶,所以做法是:默認root用戶如果加密口令是空的則默認無密碼直接登錄。等我們登陸了之後還是可以用passwd root給root用戶設置密碼。

在這裏插入圖片描述

(4)平時有時候我們忘記了自己的操作系統的密碼,怎麼辦?有一種解決方法就是用其他系統(WindowsPE系統或者ubuntu的單用戶模式等···)來引導啓動,啓動後掛載到我們的硬盤上,然後找到/etc/shadow文件,去掉密文密碼後保存。然後再重啓系統後密碼就沒了。

7、getty實戰
(1)大家後面做項目會發現,inittab中最常見的用於登錄的程序不是/bin/login,反而是/sbin/getty。
(2)這兩個在busybox中這兩個是一樣的。這兩個其實都是busybox的符號鏈接而已。因此不用嚴格區分這兩個
(3)我們可以在inittab中用getty替換login程序來實現同樣的效果。

在這裏插入圖片描述


六,動態鏈接庫的拷貝


1、靜態編譯鏈接helloworld程序並執行
(1)任務:自己寫一個helloworld程序,然後交叉編譯連接,然後丟到開發板根文件系統中,開機後去運行
(2)C程序如果使用gcc來編譯則可以在主機ubuntu中運行,但是不能在開發板運行;要在開發板運行需要用arm-linux-gcc來交叉編譯,但是這時候就不能在主機ubuntu中運行了。我們可以用file xx命令來查看一個elf可執行程序是哪個架構的
(3)靜態鏈接:arm-linux-gcc hello.c -o hello_satic -static(前提是交叉編譯工具鏈要製作符號鏈接arm-linux-gcc)
(4)實驗結果:靜態編譯連接後生成的hello_satic已經可以成功運行。

在這裏插入圖片描述

2、動態編譯連接helloworld程序並執行
(1)動態鏈接:arm-linux-gcc hello.c -o hello_dynamic
(2)實驗結果:-sh: ./hello_dynamic: not found運行時提示找不到程序
(3)錯誤分析:動態連接的hello程序中調用到了printf函數,而printf函數在動態連接時要在運行時環境(開發板的rootfs)中去尋找對應的庫文件(開發板rootfs中部署的動態鏈接庫中包含了printf函數的那個庫文件)。如果找到了則printf函數就會被成功解析,然後hello_dynamic程序就會被執行;如果找不到則程序就不能被執行,命令行會提示錯誤信息-sh: ./hello_dynamic: not found
(4)解決方案:將arm-linux-gcc的動態鏈接庫文件複製到開發板rootfs的/lib目錄下即可解決

3、找到並複製動態鏈接庫文件到rootfs中
(1)我們用的arm-2009q3這個交叉編譯工具鏈的動態鏈接庫在==/home/gec/Documents/mydocuments/arm-2009q3/arm-none-linux-gnueabi/libc/lib==目錄下。其他的一些交叉編譯工具鏈中動態鏈接庫的目錄不一定在這裏,要去找一下。找的方法就是find。
(2)複製動態鏈接庫到roots/lib目錄下。複製時要注意參數用-rdf,主要目的就是符號鏈接複製過來還是符號鏈接
複製命令:cp ./* so * /x210_porting/rootfs/rootfs/lib/ -rdf
(3)現在再去測試./hello_dynamic看看是否可以運行,實驗結果是可以運行。

4、使用strip工具去掉庫中符號信息
動態鏈接庫so文件中包含了調試符號信息,這些符號信息在運行時是沒用的(調試時用的),這些符號會佔用一定空間。在傳統的嵌入式系統中flash空間是有限的,爲了節省空間常常把這些符號信息去掉。這樣節省空間並且不影響運行。
去掉符號命令:arm-linux-strip * so *
實際操作後發現庫文件由3.8M變成了3.0M,節省了0.8M的空間。

在這裏插入圖片描述


七,開機自啓動與主流rcS格式介紹


1、修改rcS實現開機自啓動
(1)開機自啓動指的是讓一些應用程序能夠開機後自動執行
(2)開機自啓動的實現原理就是在開機會自動執行的腳本rcS中添加上執行某個程序的語句代碼即可

2、前臺運行與後臺運行
(1)程序運行時佔用了當前的控制檯,因此這個程序不結束我們都無法使用控制檯,這就叫前臺運行。默認執行程序就是前臺運行的。
(2)後臺運行就是讓這個程序運行,並且同時讓出控制檯。這時候運行的程序還能照常運行而且還能夠不影響當前控制檯的使用。
(3)讓一個程序後臺運行的方法就是 ./xxx &

3、實際開發中rootfs的rcS是怎樣的
(1)我們以X210開發板九鼎科技做的rootfs中rcS部分來分析
(2)分析inittab發現:sysinit執行rcS,shutdown時執行rcK
(3)分析/etc/init.d/rcS和rcK文件發現,rcS和rcK都是去遍歷執行/etc/init.d/目錄下的S開頭的腳本文件,區別是rcS傳參是start,rcK傳參是stop
(4)由此可以分析出來,正式產品中的rcS和rcK都是一個引入,而不是真正幹活的。真正幹活的配置腳本是/etc/init.d/S??*。這些文件中肯定有一個判斷參數是start還是stop,然後start時去做一些初始化,stop時做一些清理工作


八,製作ext2格式的鏡像並燒錄啓動


1、確定文件夾格式的rootfs可用
(1)設置bootargs爲nfs啓動方式,然後從主機ubuntu中做好的文件夾格式的rootfs去啓動,然後看啓動效果,作爲將來的參照物。
2、動手製作ext2格式的鏡像

(1)
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=10240
losetup  /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 10240
mount -t ext2 /dev/loop1 ./ext2_rootfs/
(2)向./rootfs中複製內容,用cp ../rootfs/* ./ -rf
(3)umount /dev/loop1
losetup -d /dev/loop1

(4)完成後得到的rootfs.ext2就是我們做好的rootfs鏡像。拿去燒錄即可。

3、燒錄鏡像並設置合適的bootargs
(1)使用fastboot燒錄製作好的rootfs.ext2到開發板inand中
fastboot flash system rootfs.ext2
燒錄完成後重啓系統
(2)設置bootargs爲:set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext2
(3)啓動後發現現象和之前nfs方式啓動掛載rootfs後一樣的,至此rootfs製作實驗圓滿完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章