日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

根文件系统构建(BusyBox方式)

發(fā)布時(shí)間:2023/12/10 windows 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 根文件系统构建(BusyBox方式) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 根文件系統(tǒng)簡介
  • BusyBox構(gòu)建根文件系統(tǒng)
    • BusyBox簡介
    • 編譯BusyBox構(gòu)建根文件系統(tǒng)(生成bin、sbin、usr、linuxrc)
    • 向根文件系統(tǒng)添加lib庫
    • 創(chuàng)建其他文件夾
  • 根文件系統(tǒng)初步測試
  • 完善根文件系統(tǒng)
    • 創(chuàng)建/etc/init.d/rcS文件
    • 創(chuàng)建/etc/fstab文件
    • 創(chuàng)建/etc/inittab文件
  • 根文件系統(tǒng)其他功能測試
    • 軟件運(yùn)行測試(測試庫)
    • 中文字符測試
    • 開機(jī)自啟動測試
    • 外網(wǎng)連接測試

Linux“三巨頭”已經(jīng)完成了2 個(gè)了,就剩最后一個(gè)rootfs(根文件系統(tǒng))了,本章我們就來學(xué)習(xí)一下根文件系統(tǒng)的組成以及如何構(gòu)建根文件系統(tǒng)。這是Linux 移植的最后一步,根文件系統(tǒng)構(gòu)建好以后就意味著我們已經(jīng)擁有了一個(gè)完整的、可以運(yùn)行的最小系統(tǒng)。

以后我們就在這個(gè)最小系統(tǒng)上編寫、測試Linux 驅(qū)動,移植一些第三方組件,逐步的完善這個(gè)最小系統(tǒng)。最終得到一個(gè)功能完善、驅(qū)動齊全、相對完善的操作系統(tǒng)。

根文件系統(tǒng)簡介

根文件系統(tǒng)一般也叫做rootfs,那么什么叫根文件系統(tǒng)?看到“文件系統(tǒng)”這四個(gè)字,很多人,包括我第一反應(yīng)就是FATFS、FAT、EXT4、YAFFS 和NTFS 等這樣的文件系統(tǒng)。在這里,根文件系統(tǒng)并不是FATFS 這樣的文件系統(tǒng)代碼EXT4 這樣的文件系統(tǒng)代碼屬于Linux內(nèi)核的一部分。

Linux 中的根文件系統(tǒng)更像是一個(gè)文件夾或者叫做目錄(在我看來就是一個(gè)文件夾,只不過是特殊的文件夾),在這個(gè)目錄里面會有很多的子目錄。根目錄下和子目錄中會有很多的文件,這些文件是Linux 運(yùn)行所必須的,比如庫、常用的軟件和命令、設(shè)備文件、配置文件等等。以后我們說到文件系統(tǒng),如果不特別指明,統(tǒng)一表示根文件系統(tǒng)。

對于根文件系統(tǒng)專業(yè)的解釋,百度百科上是這么說的:

  • 根文件系統(tǒng)首先是內(nèi)核啟動時(shí)所mount(掛載)的第一個(gè)文件系統(tǒng),內(nèi)核代碼映像文件保存在根文件系統(tǒng)中,而系統(tǒng)引導(dǎo)啟動程序會在根文件系統(tǒng)掛載之后從中把一些基本的初始化腳本和服務(wù)等加載到內(nèi)存中去運(yùn)行。
  • 百度百科上說內(nèi)核代碼鏡像文件保存在根文件系統(tǒng)中,但是我們嵌入式Linux并沒有將內(nèi)核代碼鏡像保存在根文件系統(tǒng)中,而是保存到了其他地方。比如NAND Flash 的指定存儲地址、EMMC 專用分區(qū)中。

根文件系統(tǒng)是Linux 內(nèi)核啟動以后掛載(mount)的第一個(gè)文件系統(tǒng),然后從根文件系統(tǒng)中讀取初始化腳本,比如rcS,inittab 等。根文件系統(tǒng)和Linux內(nèi)核是分開的,單獨(dú)的Linux 內(nèi)核是沒法正常工作的,必須要搭配根文件系統(tǒng)。如果不提供根文件系統(tǒng),Linux 內(nèi)核在啟動的時(shí)候就會提示內(nèi)核崩潰(Kernel panic)的提示,這個(gè)在37.2.4 小節(jié)已經(jīng)說過了。

根文件系統(tǒng)的這個(gè)“根”字就說明了這個(gè)文件系統(tǒng)的重要性,它是其他文件系統(tǒng)的根,沒有這個(gè)“根”,其他的文件系統(tǒng)或者軟件就別想工作。比如我們常用的ls、mv、ifconfig 等命令其實(shí)就是一個(gè)個(gè)小軟件,只是這些軟件沒有圖形界面,而且需要輸入命令來運(yùn)行。這些小軟件就保存在根文件系統(tǒng)中,這些小軟件是怎么來的呢?這個(gè)就是我們本章教程的目的,教大家來構(gòu)建自己的根文件系統(tǒng),這個(gè)根文件系統(tǒng)是滿足Linux 運(yùn)行的最小根文件系統(tǒng),后續(xù)我們可以根據(jù)自己的實(shí)際工作需求不斷的去填充這個(gè)最小根文件系統(tǒng),最終使其成為一個(gè)相對完善的根文件系統(tǒng)。

內(nèi)核Zimage總共就才6M,根文件系統(tǒng)要10幾個(gè)G,Ubuntu都要好幾個(gè)G。

在構(gòu)建根文件系統(tǒng)之前,我們先來看一下根文件系統(tǒng)里面大概都有些什么內(nèi)容,以Ubuntu為例,根文件系統(tǒng)的目錄名字為‘/’,沒看錯(cuò)就是一個(gè)斜杠,所以輸入如下命令就可以進(jìn)入根目錄中:

cd / //進(jìn)入根目錄

進(jìn)入根目錄以后輸入“l(fā)s”命令查看根目錄下的內(nèi)容都有哪些,結(jié)果如圖38.1.1 所示:

圖38.1.1 中根目錄下子目錄和文件不少,但是這些都是Ubuntu 所需要的,其中有很多子目錄和文件我們嵌入式Linux 是用不到的,所以這里就講解一些常用的子目錄:

1、/bin 目錄

看到“bin”大家應(yīng)該能想到bin 文件,bin 文件就是可執(zhí)行文件。所以此目錄下存放著系統(tǒng)需要的可執(zhí)行文件,一般都是一些命令,比如ls、mv、ping等命令。此目錄下的命令所有的客戶都可以使用。

2、/dev 目錄

dev 是device 的縮寫,所以此目錄下的文件都是和設(shè)備有關(guān)的,此目錄下的文件都是設(shè)備文件。在Linux 下一切皆文件,即使是硬件設(shè)備,也是以文件的形式存在的,比如/dev/ttymxc0(I.MX6ULL 根目錄會有此文件)就表示I.MX6ULL 的串口0,我們要想通過串口0發(fā)送或者接收數(shù)據(jù)就要操作文件/dev/ttymxc0,通過對文件/dev/ttymxc0 的讀寫操作來實(shí)現(xiàn)串口0 的數(shù)據(jù)收發(fā)。

3、/etc 目錄

此目錄下存放著各種配置文件,大家可以進(jìn)入U(xiǎn)buntu 的etc 目錄看一下,里面的配置文件非常多!但是在嵌入式Linux 下此目錄會很簡潔。

4、/lib 目錄

lib是library 的簡稱,也就是庫的意思,因此此目錄下存放著Linux 所必須的庫文件。這些庫文件是共享庫,命令和用戶編寫的應(yīng)用程序要使用這些庫文件。

5、/mnt 目錄

臨時(shí)掛載目錄,一般是空目錄,可以在此目錄下創(chuàng)建空的子目錄,比如/mnt/sd、/mnt/usb,這樣就可以將SD 卡或者U 盤掛載到/mnt/sd 或者/mnt/usb 目錄中。

6、/proc 目錄

此目錄一般是空的,當(dāng)Linux 系統(tǒng)啟動以后會將此目錄作為proc 文件系統(tǒng)的掛載點(diǎn),proc是個(gè)虛擬文件系統(tǒng),沒有實(shí)際的存儲設(shè)備。proc 里面的文件都是臨時(shí)存在的,一般用來存儲系統(tǒng)運(yùn)行信息文件。

7、/usr 目錄

要注意,usr 不是user 的縮寫,而是Unix Software Resource 的縮寫,也就是Unix 操作系統(tǒng)軟件資源目錄。這里有個(gè)小知識點(diǎn),那就是Linux 一般被稱為類Unix 操作系統(tǒng),蘋果的MacOS也是類Unix 操作系統(tǒng)。關(guān)于Linux 和Unix 操作系統(tǒng)的淵源大家可以直接在網(wǎng)上找Linux 的發(fā)展歷史來看。既然是軟件資源目錄,因此/usr 目錄下也存放著很多軟件,一般系統(tǒng)安裝完成以后此目錄占用的空間最多。

8、/var 目錄

此目錄存放一些可以改變的數(shù)據(jù)。

9、/sbin 目錄

此目錄頁用戶存放一些可執(zhí)行文件,但是此目錄下的文件或者說命令只有管理員才能使用,主要用戶系統(tǒng)管理。

10、/sys 目錄

系統(tǒng)啟動以后此目錄作為sysfs 文件系統(tǒng)的掛載點(diǎn),sysfs 是一個(gè)類似于proc 文件系統(tǒng)的特殊文件系統(tǒng),sysfs 也是基于ram 的文件系統(tǒng),也就是說它也沒有實(shí)際的存儲設(shè)備。此目錄是系統(tǒng)設(shè)備管理的重要目錄,此目錄通過一定的組織結(jié)構(gòu)向用戶提供詳細(xì)的內(nèi)核數(shù)據(jù)結(jié)構(gòu)信息。

11、/opt

可選的文件、軟件存放區(qū),由用戶選擇將哪些文件或軟件放到此目錄中。
關(guān)于Linux 的根目錄就介紹到這里,接下來的構(gòu)建根文件系統(tǒng)就是研究如何創(chuàng)建上面這些子目錄以及子目錄中的文件。

BusyBox構(gòu)建根文件系統(tǒng)

除了BusyBox還有buildroot和yocto這兩個(gè)更加專業(yè)的根文件構(gòu)建軟件,不過學(xué)習(xí)的話我們還是使用BusyBox更加底層的配置,后面工作的話直接使用buildroot和yocto就可以了,非常方便強(qiáng)大。

BusyBox簡介

上一小節(jié)說了,根文件系統(tǒng)里面就是一堆的可執(zhí)行文件和其他文件組成的?難道我們得一個(gè)一個(gè)的從網(wǎng)上去下載這些文件?顯然這是不現(xiàn)實(shí)的!那么有沒有人或者組織專門干這個(gè)事呢?他們負(fù)責(zé)“收集”這些文件,然后將其打包,像我們這樣的開發(fā)者可以直接拿來用。

答案是有的,它就叫做BusyBox!其名字分為“Busy”和“Box”,也就是忙碌的盒子。盒子是用來放東西的,忙碌的是因?yàn)樗峁└募到y(tǒng)所需的文件,所以忙碌。BusyBox 是一個(gè)集成了大量的Linux 命令和工具的軟件,像ls、mv、ifconfig 等命令BusyBox 都會提供。BusyBox 就是一個(gè)大的工具箱,這個(gè)工具箱里面集成了Linux 的許多工具和命令。一般下載BusyBox 的源碼,然后配置BusyBox,選擇自己想要的功能,最后編譯即可。

BusyBox 可以在其官網(wǎng)下載到,官網(wǎng)地址為:https://busybox.net/,官網(wǎng)比較簡陋,如圖38.2.1.1 所示:

在官網(wǎng)左側(cè)的“Get BusyBox”欄有一行“Download Source”,點(diǎn)擊“Download Source”即可打開BusyBox 的下載頁,如圖38.2.1.2 所示:

從圖38.2.1.2 可以看出,目前最新的BusyBox 版本是1.31.0,不過我建議大家使用我們開發(fā)板光盤里面提供的1.29.0 版本的BusyBox。因?yàn)楣P者測試1.29.0 版本目前還沒有出現(xiàn)任何問題,路徑為:1、例程源碼->6、BusyBox 源碼->busybox-1.29.0.tar.bz2,BusyBox 準(zhǔn)備好以后就可以構(gòu)建根文件系統(tǒng)了。

編譯BusyBox構(gòu)建根文件系統(tǒng)(生成bin、sbin、usr、linuxrc)

一般我們在Linux 驅(qū)動開發(fā)的時(shí)候都是通過nfs 掛載根文件系統(tǒng)的,當(dāng)產(chǎn)品最終上市開賣的時(shí)候才會將根文件系統(tǒng)燒寫到EMMC 或者NAND 中。所以要在4.2.1 小節(jié)中設(shè)置的nfs 服務(wù)器目錄中創(chuàng)建一個(gè)名為rootfs 的子目錄(名字大家可以隨意起,為了方便就用了rootfs),比如我的電腦中“/home/zuozhongkai/linux/nfs”就是我設(shè)置的NFS 服務(wù)器目錄,使用如下命令創(chuàng)建名為rootfs 的子目錄:

mkdir rootfs

創(chuàng)建好的rootfs 子目錄就用來存放我們的根文件系統(tǒng)了。
將busybox-1.29.0.tar.bz2 發(fā)送到Ubuntu 中,存放位置大家隨便選擇。然后使用如下命令將其解壓:

tar -vxjf busybox-1.29.0.tar.bz2

解壓完成以后進(jìn)入到busybox-1.29.0 目錄中,此目錄中的文件和文件夾如圖38.2.2.1 所示:

1、修改Makefile,添加編譯器

同Uboot和Linux 移植一樣,打開busybox 的頂層Makefile,添加ARCH 和CROSS_COMPILE的值,如下所示:

164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- ...... 190 ARCH ?= arm

在示例代碼38.2.2.1 中CORSS_COMPILE 使用了絕對路徑主要是為了防止編譯出錯(cuò)。

2、busybox 中文字符支持

如果默認(rèn)直接編譯busybox 的話,在使用SecureCRT 的時(shí)候中文字符是顯示不正常的,中文字符會顯示為“?”,比如你的中文目錄,中文文件都顯示為“?”。不知道從哪個(gè)版本開始busybox中的shell 命令對中文輸入即顯示做了限制,即使內(nèi)核支持中文但在shell 下也依然無法正確顯示。

所以我們需要修改busybox 源碼,取消busybox 對中文顯示的限制,打開文件busybox-1.29.0/libbb/printable_string.c,找到函數(shù)printable_string,縮減后的函數(shù)內(nèi)容如下:

12 const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) 13 { 14 char *dst; 15 const char *s; 16 17 s = str; 18 while (1) { 19 unsigned char c = *s; 20 if (c == '\0') { ...... 28 } 29 if (c < ' ') 30 break; 31 if (c >= 0x7f) 32 break; 33 s++; 34 } 35 36 #if ENABLE_UNICODE_SUPPORT 37 dst = unicode_conv_to_printable(stats, str); 38 #else 39 { 40 char *d = dst = xstrdup(str); 41 while (1) { 42 unsigned char c = *d; 43 if (c == '\0') 44 break; 45 if (c < ' ' || c >= 0x7f) 46 *d = '?'; 47 d++; 48 } ...... 55 #endif 56 return auto_string(dst); 57 }

第31 和32 行,當(dāng)字符大于0X7F 以后就跳出去了。
第45 和46 行,如果支持UNICODE 碼的話,當(dāng)字符大于0X7F 就直接輸出‘?’。

所以我們需要對這4 行代碼進(jìn)行修改,修改以后如下所示:

12 const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) 13 { 14 char *dst; 15 const char *s; 16 17 s = str; 18 while (1) { ...... 30 if (c < ' ') 31 break; 32 /* 注釋掉下面這個(gè)兩行代碼*/ 33 /* if (c >= 0x7f) 34 break; */ 35 s++; 36 } 37 38 #if ENABLE_UNICODE_SUPPORT 39 dst = unicode_conv_to_printable(stats, str); 40 #else 41 { 42 char *d = dst = xstrdup(str); 43 while (1) { 44 unsigned char c = *d; 45 if (c == '\0') 46 break; 47 /* 修改下面代碼*/ 48 /* if (c < ' ' || c >= 0x7f) */ 49 if( c < ' ') 50 *d = '?'; 51 d++; 52 } ...... 59 #endif 60 return auto_string(dst); 61 }

示例代碼38.2.2.3 中紅色部分的代碼就是被修改以后的,主要就是禁止字符大于0X7F 以后break 和輸出‘?’。

接著打開文件busybox-1.29.0/libbb/unicode.c,找到如下內(nèi)容:

1003 static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags) 1004 { 1005 char *dst; 1006 unsigned dst_len; 1007 unsigned uni_count; 1008 unsigned uni_width; 1009 1010 if (unicode_status != UNICODE_ON) { 1011 char *d; 1012 if (flags & UNI_FLAG_PAD) { 1013 d = dst = xmalloc(width + 1); ...... 1022 *d++ = (c >= ' ' && c < 0x7f) ? c : '?'; 1023 src++; 1024 } 1025 *d = '\0'; 1026 } else { 1027 d = dst = xstrndup(src, width); 1028 while (*d) { 1029 unsigned char c = *d; 1030 if (c < ' ' || c >= 0x7f) 1031 *d = '?'; 1032 d++; 1033 } 1034 } ...... 1040 return dst; 1041 } ...... 1130 1131 return dst; 1132 }

第1022 行,當(dāng)字符大于0X7F 以后,*d++就為‘?’。
第1030 和1031 行,當(dāng)字符大于0X7F 以后,*d 也為‘?’。

修改示例代碼38.2.2.4,修改后內(nèi)容如下所示:

1003 static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags) 1004 { 1005 char *dst; 1006 unsigned dst_len; 1007 unsigned uni_count; 1008 unsigned uni_width; 1009 1010 if (unicode_status != UNICODE_ON) { 1011 char *d; 1012 if (flags & UNI_FLAG_PAD) { 1013 d = dst = xmalloc(width + 1); ...... 1022 /* 修改下面一行代碼*/ 1023 /* *d++ = (c >= ' ' && c < 0x7f) ? c : '?'; */ 1024 *d++ = (c >= ' ') ? c : '?'; 1025 src++; 1026 } 1027 *d = '\0'; 1028 } else { 1029 d = dst = xstrndup(src, width); 1030 while (*d) { 1031 unsigned char c = *d; 1032 /* 修改下面一行代碼*/ 1033 /* if (c < ' ' || c >= 0x7f) */ 1034 if(c < ' ') 1035 *d = '?'; 1036 d++; 1037 } 1038 } ...... 1044 return dst; 1045 } ...... 1047 1048 return dst; 1049 }

示例代碼38.2.2.5 中紅色部分的代碼就是被修改以后的,同樣主要是禁止字符大于0X7F 的時(shí)候設(shè)置為‘?’。busybox 中文字符支持跟代碼修改有關(guān)的就改好了,最后還需要配置busybox來使能unicode 碼,這個(gè)稍后我們配置busybox 的時(shí)候在設(shè)置。

3、配置busybox

根我們編譯Uboot、Linux kernel 一樣,我們要先對busybox 進(jìn)行默認(rèn)的配置,有以下幾種配置選項(xiàng):

  • ①、defconfig,缺省配置,也就是默認(rèn)配置選項(xiàng)。
  • ②、allyesconfig,全選配置,也就是選中busybox 的所有功能。
  • ③、allnoconfig,最小配置。

我們一般使用默認(rèn)配置即可,因此使用如下命令先使用默認(rèn)配置來配置一下busybox:

make defconfig

配置完會生成config文件,表示配置好了。busybox 也支持圖形化配置,通過圖形化配置我們可以進(jìn)一步選擇自己想要的功能,輸入如下命令打開圖形化配置界面:

make menuconfig

打開以后如圖38.2.2.2 所示:

配置路徑如下:

Location:-> Settings-> Build static binary (no shared libs)

選項(xiàng)“Build static binary (no shared libs)”用來決定是靜態(tài)編譯busybox 還是動態(tài)編譯,靜態(tài)編譯的話就不需要庫文件,但是編譯出來的庫會很大。動態(tài)編譯的話要求根文件系統(tǒng)中有庫文件,但是編譯出來的busybox 會小很多。

這里我們不能采用靜態(tài)編譯!因?yàn)椴捎渺o態(tài)編譯的話DNS會出問題!無法進(jìn)行域名解析(左老師自己測試發(fā)現(xiàn)的),配置如圖38.2.2.3 所示:

繼續(xù)配置如下路徑配置項(xiàng):

Location:-> Settings-> vi-style line editing commands

結(jié)果如圖38.2.2.4 所示:

繼續(xù)配置如下路徑配置項(xiàng):

Location:-> Linux Module Utilities-> Simplified modutils

默認(rèn)會選中“Simplified modutils”,這里我們要取消勾選!!結(jié)果如圖38.2.2.5 所示:

繼續(xù)配置如下路徑配置項(xiàng):

Location:-> Linux System Utilities-> mdev (16 kb) //確保下面的全部選中,默認(rèn)都是選中的

結(jié)果如圖38.2.2.6 所示:

最后就是使能busybox 的unicode 編碼以支持中文,配置路徑如下:

Location:-> Settings-> Support Unicode //選中-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //選中

結(jié)果如圖38.2.2.7 所示:

busybox 的配置就到此結(jié)束了,大家也可以根據(jù)自己的實(shí)際需求選擇配置其他的選項(xiàng),不過對于初學(xué)者筆者不建議再做其他的修改,可能會出現(xiàn)編譯出錯(cuò)的情況發(fā)生。

4、編譯busybox

配置好busybox 以后就可以編譯了,我們可以指定編譯結(jié)果的存放目錄,我們肯定要將編譯結(jié)果存放到前面創(chuàng)建的rootfs 目錄中,輸入如下命令:

make install CONFIG_PREFIX=/home/zuozhongkai/linux/nfs/rootfs

COFIG_PREFIX 指定編譯結(jié)果的存放目錄,比如我存放到
“/home/zuozhongkai/linux/nfs/rootfs”目錄中,等待編譯完成。編譯完成以后如圖38.2.2.8 所示:

編譯完成以后會在busybox 的所有工具和文件就會被安裝到rootfs 目錄中,rootfs 目錄內(nèi)容如圖38.2.2.9 所示:

從圖38.2.2.9 可以看出,rootfs 目錄下有bin(常用命令)、sbin 和usr 這三個(gè)目錄,以及l(fā)inuxrc 這個(gè)文件。

前面說過Linux 內(nèi)核init 進(jìn)程最后會查找用戶空間的init 程序,找到以后就會運(yùn)行這個(gè)用戶空間的init 程序,從而切換到用戶態(tài)。如果bootargs 設(shè)置init=/linuxrc,那么linuxrc 就是可以作為用戶空間的init 程序,所以用戶態(tài)空間的init 程序是busybox 來生成的。

busybox 的工作就完成了,但是此時(shí)的根文件系統(tǒng)還不能使用,還需要一些其他的文件,我們繼續(xù)來完善rootfs。

向根文件系統(tǒng)添加lib庫

1、向rootfs 的“/lib”目錄添加庫文件

Linux 中的應(yīng)用程序一般都是需要?jiǎng)討B(tài)庫的,當(dāng)然你也可以編譯成靜態(tài)的,但是靜態(tài)的可執(zhí)行文件會很大。如果編譯為動態(tài)的話就需要?jiǎng)討B(tài)庫,所以我們需要向根文件系統(tǒng)中添加動態(tài)庫。在rootfs 中創(chuàng)建一個(gè)名為“l(fā)ib”的文件夾,命令如下:

mkdir lib

lib 文件夾創(chuàng)建好了,庫文件從哪里來呢?lib 庫文件從交叉編譯器中獲取,前面我們搭建交叉編譯環(huán)境的時(shí)候?qū)⒔徊婢幾g器存放到了“/usr/local/arm/”目錄中。

交叉編譯器里面有很多的庫文件,這些庫文件具體是做什么的我們作為初學(xué)者肯定不知道,既然我不知道那就簡單粗暴的把所有的庫文件都放到我們的根文件系統(tǒng)中。這樣做出來的根文件系統(tǒng)肯定很大,但是我們現(xiàn)在是學(xué)習(xí)階段,還做不了裁剪。這就是為什么我們推薦大家購買512MB+8GB 版本的EMMC核心版,如果后面要學(xué)習(xí)QT 的話那占用的空間將更大,不裁剪的話512MB 的NAND 完全不夠用的!而裁剪又是需要經(jīng)驗(yàn)的,我們都是初學(xué)者,哪里來的經(jīng)驗(yàn)啊。所以我們推薦初學(xué)者購買EMMC 版核心板并不是說為了多賺大家的錢,而是從實(shí)際角度考慮的。

進(jìn)入如下路徑對應(yīng)的目錄:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

此目錄下有很多的 * so * ( * 是通配符)和.a 文件,這些就是庫文件,將此目錄下所有的so和.a文件都拷貝到rootfs/lib 目錄中,拷貝命令如下:

cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/lib/ -d

后面的“-d”表示拷貝符號鏈接,這里有個(gè)比較特殊的庫文件:ld-linux-armhf.so.3,此庫文件也是個(gè)符號鏈接,相當(dāng)于Windows 下的快捷方式。會鏈接到庫ld-2.19-2014.08-1-git.so 上,輸入命令“l(fā)s ld-linux-armhf.so.3 -l”查看此文件詳細(xì)信息,如圖38.2.3.1 所示:


從圖38.2.3.1 可以看出,ld-linux-armhf.so.3 后面有個(gè)“->”,表示其是個(gè)軟連接文件,鏈接到文件ld-2.19-2014.08-1-git.so,因?yàn)槠涫且粋€(gè)“快捷方式”,因此大小只有24B。但是,ld-linux-armhf.so.3 不能作為符號鏈接,否則的話在根文件系統(tǒng)中執(zhí)行程序無法執(zhí)行!

我們需要ld-linux-armhf.so.3 完成逆襲,由“快捷方式”變?yōu)椤氨咀稹?#xff0c;方法很簡單,那就是重新復(fù)制ld-linux-armhf.so.3,不要復(fù)制軟鏈接。先將rootfs/lib 中的ld-linux-armhf.so.3 文件刪除掉,命令如下:

rm ld-linux-armhf.so.3

然后重新進(jìn)入到/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib 目錄中,重新拷貝ld-linux-armhf.so.3,命令如下:

cp ld-linux-armhf.so.3 /home/zuozhongkai/linux/nfs/rootfs/lib/

拷貝完成以后再到rootfs/lib 目錄下查看ld-linux-armhf.so.3 文件詳細(xì)信息,如圖38.2.3.2 所示:

從圖38.2.3.2 可以看出,此時(shí)ld-linux-armhf.so.3 已經(jīng)不是軟連接了,而是實(shí)實(shí)在在的一個(gè)庫文件,而且文件大小為724392B。繼續(xù)進(jìn)入如下目錄中:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib

此目錄下也有很多的的so和.a 庫文件,我們將其也拷貝到rootfs/lib 目錄中,命令如下:

cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/lib/ -d

rootfs/lib 目錄的庫文件就這些了,完成以后的rootfs/lib 目錄如圖38.2.3.3 所示:

2、向rootfs 的“usr/lib”目錄添加庫文件(和上面不是一個(gè)目錄)

在rootfs 的usr 目錄下創(chuàng)建一個(gè)名為lib 的目錄,將如下目錄中的庫文件拷貝到rootfs/usr/lib目錄下:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib

將此目錄下的so 和.a 庫文件都拷貝到rootfs/usr/lib 目錄中,命令如下:

cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/usr/lib/ -d

完成以后的rootfs/usr/lib 目錄如圖38.2.3.4 所示:

至此,根文件系統(tǒng)的庫文件就全部添加好了,可以使用“du”命令來查看一下rootfs/lib 和rootfs/usr/lib 這兩個(gè)目錄的大小,命令如下:

cd rootfs //進(jìn)入根文件系統(tǒng)目錄 du ./lib ./usr/lib/ -sh //查看lib 和usr/lib 這兩個(gè)目錄的總和大小

結(jié)果如圖38.2.3.5 所示:

可以看出lib 和usr/lib 這兩個(gè)文件的大小分別為57MB 和67MB,加起來就是57+67=124MB。非常大!

所以正點(diǎn)原子的256MB 和512MB 的NAND 核心版就不是給初學(xué)者準(zhǔn)備的,而是給大批量采購的企業(yè)準(zhǔn)備的,還是那句話,初學(xué)者選擇EMMC 版本的。

創(chuàng)建其他文件夾

在根文件系統(tǒng)中創(chuàng)建其他文件夾,如dev、proc、mnt、sys、tmp 和root 等,創(chuàng)建完成以后如圖38.2.4.1 所示:

目前來看,這個(gè)根文件系統(tǒng)好像已經(jīng)準(zhǔn)備好了,究竟有沒有準(zhǔn)備好,直接測一下就知道了!

根文件系統(tǒng)初步測試

接下來我們使用測試一下前面創(chuàng)建好的根文件系統(tǒng)rootfs。

由于燒寫一次所有內(nèi)核、根文件系統(tǒng)到板子里是很浪費(fèi)時(shí)間的,為了方便測試,方法就是使用NFS 掛載,uboot 里面的bootargs環(huán)境變量會設(shè)置“root”的值,所以我們將root 的值改為NFS 的掛載路徑即可,也就是板子上直接加載Ubuntu下的根文件。


uboot、zimage、dtb前面已經(jīng)燒寫到EMMC里面了,這里需要將其運(yùn)行加載到Ubuntu的/home/zuozhongkai/linux/nfs/rootfs上。

在Linux 內(nèi)核源碼里面有相應(yīng)的文檔講解如何設(shè)置,文檔為Documentation/filesystems/nfs/nfsroot.txt,格式如下:

root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

< server-ip>:服務(wù)器IP 地址,也就是存放根文件系統(tǒng)主機(jī)的IP 地址,那就是Ubuntu 的IP地址,比如我的Ubuntu 主機(jī)IP 地址為192.168.1.250。
< root-dir>:根文件系統(tǒng)的存放路徑,比如我的就是/home/zuozhongkai/linux/nfs/rootfs。
< nfs-options>:NFS 的其他可選選項(xiàng),一般不設(shè)置。
< client-ip>:客戶端IP 地址,也就是我們開發(fā)板的IP 地址,Linux 內(nèi)核啟動以后就會使用此IP 地址來配置開發(fā)板。此地址一定要和Ubuntu 主機(jī)在同一個(gè)網(wǎng)段內(nèi),并且沒有被其他的設(shè)備使用,在Ubuntu 中使用ping 命令ping 一下就知道要設(shè)置的IP 地址有沒有被使用,如果不能ping 通就說明沒有被使用,那么就可以設(shè)置為開發(fā)板的IP 地址,比如我就可以設(shè)置為
192.168.1.251。
< server-ip>:服務(wù)器IP 地址,前面已經(jīng)說了。
< gw-ip>:網(wǎng)關(guān)地址,我的就是192.168.1.1。
< netmask>:子網(wǎng)掩碼,我的就是255.255.255.0。
< hostname>:客戶機(jī)的名字,一般不設(shè)置,此值可以空著。
< device>:設(shè)備名,也就是網(wǎng)卡名,一般是eth0,eth1….,正點(diǎn)原子的I.MX6U-ALPHA 開發(fā)板的ENET2 為eth0,ENET1 為eth1。如果你的電腦只有一個(gè)網(wǎng)卡,那么基本只能是eth0。這里我們使用ENET2,所以網(wǎng)卡名就是eth0。
< autoconf>:自動配置,一般不使用,所以設(shè)置為off。
< dns0-ip>:DNS0 服務(wù)器IP 地址,不使用。
< dns1-ip>:DNS1 服務(wù)器IP 地址,不使用。

根據(jù)上面的格式bootargs 環(huán)境變量的root 值如下:

root=/dev/nfs nfsroot=192.168.1.250:/home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off

“proto=tcp”表示使用TCP 協(xié)議,“rw”表示nfs 掛載的根文件系統(tǒng)為可讀可寫。

啟動開發(fā)板,進(jìn)入uboot 命令行模式,然后重新設(shè)置bootargs 環(huán)境變量,命令如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250: /home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1: 255.255.255.0::eth0:off' //設(shè)置bootargs saveenv //保存環(huán)境變量

設(shè)置好以后使用“boot”命令啟動Linux 內(nèi)核,結(jié)果如圖38.3.1 所示:


從圖38.3.1 可以看出,我們進(jìn)入了根文件系統(tǒng),說明我們的根文件系統(tǒng)工作了!如果沒有啟動進(jìn)入根文件系統(tǒng)的話可以重啟一次開發(fā)板試試。我們可以輸入“l(fā)s”命令測試一下,結(jié)果如圖38.3.2 所示:

可以看出ls 命令工作正常!那么是不是說明我們的rootfs 就制作成功了呢?

大家注意,在進(jìn)入根文件系統(tǒng)的時(shí)候會有下面這一行錯(cuò)誤提示:

can't run '/etc/init.d/rcS': No such file or directory

提示很簡單,說是無法運(yùn)行“/etc/init.d/rcS”這個(gè)文件,因?yàn)檫@個(gè)文件不存在。如圖38.3.3所示

看來我們的rootfs 還是缺文件啊,沒什么說的,一步一步的完善吧。

完善根文件系統(tǒng)

創(chuàng)建/etc/init.d/rcS文件

rcS 是個(gè)shell 腳本,Linux內(nèi)核啟動以后需要啟動一些服務(wù),而rcS 就是規(guī)定啟動哪些文件的腳本文件。在rootfs 中創(chuàng)建/etc/init.d/rcS 文件,然后在rcS 中輸入如下所示內(nèi)容:

1 #!/bin/sh 2 3 PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH 4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib 5 export PATH LD_LIBRARY_PATH 6 7 mount -a 8 mkdir /dev/pts 9 mount -t devpts devpts /dev/pts 10 11 echo /sbin/mdev > /proc/sys/kernel/hotplug 12 mdev -s
  • 第1 行,表示這是一個(gè)shell 腳本。
  • 第3 行,PATH 環(huán)境變量保存著可執(zhí)行文件可能存在的目錄,這樣我們在執(zhí)行一些命令或者可執(zhí)行文件的時(shí)候就不會提示找不到文件這樣的錯(cuò)誤。
  • 第4 行,LD_LIBRARY_PATH 環(huán)境變量保存著庫文件所在的目錄。
  • 第5 行,使用export 來導(dǎo)出上面這些環(huán)境變量,相當(dāng)于聲明一些“全局變量”。
  • 第7 行,使用mount 命令來掛載所有的文件系統(tǒng),這些文件系統(tǒng)由文件/etc/fstab 來指定,所以我們一會還要?jiǎng)?chuàng)建/etc/fstab 文件。
  • 第8 和9 行,創(chuàng)建目錄/dev/pts,然后將devpts 掛載到/dev/pts 目錄中。
  • 第11 和12 行,使用mdev 來管理熱插拔設(shè)備,通過這兩行,Linux 內(nèi)核就可以在/dev 目錄下自動創(chuàng)建設(shè)備節(jié)點(diǎn)。關(guān)于mdev 的詳細(xì)內(nèi)容可以參考busybox 中的docs/mdev.txt 文檔。

示例代碼38.4.1.1 中的rcS 文件內(nèi)容是最精簡的,大家如果去看Ubuntu 或者其他大型Linux操作系統(tǒng)中的rcS 文件,就會發(fā)現(xiàn)其非常復(fù)雜。因?yàn)槲覀兪浅醮螌W(xué)習(xí),所以不用搞這么復(fù)雜的,而且這么復(fù)雜的rcS 文件也是借助其他工具創(chuàng)建的,比如buildroot 等。

創(chuàng)建好文件/etc/init.d/rcS 以后一定要給其可執(zhí)行權(quán)限,使用如下命令給予/ec/init.d/rcS 可執(zhí)行權(quán)限:

chmod 777 rcS

設(shè)置好以后就重新啟動Linux 內(nèi)核,啟動以后如圖38.4.1.1 所示:

從圖38.4.1.1 可以看到,提示找不到/etc/fstab 文件,還有一些其他的錯(cuò)誤,我們先把/etc/fstab這個(gè)錯(cuò)誤解決了。說不定把這個(gè)問題解決以后其他的錯(cuò)誤也就解決了。前面我們說了“mount -a”掛載所有根文件系統(tǒng)的時(shí)候需要讀取/etc/fstab,因?yàn)?etc、fstab 里面定義了該掛載哪些文件,好了,接下來就是創(chuàng)建/etc/fstab 文件。

創(chuàng)建/etc/fstab文件

在rootfs 中創(chuàng)建/etc/fstab 文件,fstab 在Linux 開機(jī)以后自動配置哪些需要自動掛載的分區(qū),格式如下:

<file system> <mount point> <type> <options> <dump> <pass>
  • < file system>:要掛載的特殊的設(shè)備,也可以是塊設(shè)備,比如/dev/sda 等等,SD卡。
  • < mount point>:掛載點(diǎn)。
  • < type>:文件系統(tǒng)類型,比如ext2、ext3、proc、romfs、tmpfs 等等。
  • < options>:掛載選項(xiàng),在Ubuntu 中輸入“man mount”命令可以查看具體的選項(xiàng)。一般使用defaults,也就是默認(rèn)選項(xiàng),defaults 包含了rw、suid、dev、exec、auto、nouser 和async。
  • < dump>:為1 的話表示允許備份,為0 不備份,一般不備份,因此設(shè)置為0。
  • < pass>:磁盤檢查設(shè)置,為0 表示不檢查。根目錄‘/’設(shè)置為1,其他的都不能設(shè)置為1,其他的分區(qū)從2 開始。一般不在fstab 中掛載根目錄,因此這里一般設(shè)置為0。

按照上述格式,在fstab 文件中輸入如下內(nèi)容:

1 #<file system> <mount point> <type> <options> <dump> <pass> 2 proc /proc proc defaults 0 0//這是個(gè)偽文件系統(tǒng) 3 tmpfs /tmp tmpfs defaults 0 0 4 sysfs /sys sysfs defaults 0 0

fstab 文件創(chuàng)建完成以后重新啟動Linux,結(jié)果如圖38.4.2.1 所示:

從圖38.4.2.1 可以看出,啟動成功,而且沒有任何錯(cuò)誤提示。但是我們要還需要?jiǎng)?chuàng)建一個(gè)文件/etc/inittab。

創(chuàng)建/etc/inittab文件

inittab 的詳細(xì)內(nèi)容可以參考busybox 下的文件examples/inittab。init 程序會讀取/etc/inittab這個(gè)文件,inittab 由若干條指令組成。每條指令的結(jié)構(gòu)都是一樣的,由以“:”分隔的4 個(gè)段組成,格式如下:

<id>:<runlevels>:<action>:<process>

< id>:每個(gè)指令的標(biāo)識符,不能重復(fù)。但是對于busybox 的init 來說,有著特殊意義。
對于busybox 而言用來指定啟動進(jìn)程的控制tty,一般我們將串口或者LCD 屏幕設(shè)置為控制tty。
< runlevels>:對busybox 來說此項(xiàng)完全沒用,所以空著。
< action>:動作,用于指定可能用到的動作。busybox 支持的動作如表38.4.3.1 所示:

動作描述
sysinit在系統(tǒng)初始化的時(shí)候process 才會執(zhí)行一次。
respawn當(dāng)process 終止以后馬上啟動一個(gè)新的。
askfirst和respawn 類似,在運(yùn)行process 之前在控制臺上顯示“Please press Enter to activate this console.(串口作為控制臺)”。只要用戶按下“Enter”鍵以后才會執(zhí)行process。
wait告訴init,要等待相應(yīng)的進(jìn)程執(zhí)行完以后才能繼續(xù)執(zhí)行。
once僅執(zhí)行一次,而且不會等待process 執(zhí)行完成。
restart當(dāng)init 重啟的時(shí)候才會執(zhí)行procee。
ctrlaltdel當(dāng)按下ctrl+alt+del 組合鍵才會執(zhí)行process。
shutdown關(guān)機(jī)的時(shí)候執(zhí)行process。

< process>:具體的動作,比如程序、腳本或命令等。

參考busybox 的examples/inittab 文件,我們也創(chuàng)建一個(gè)/etc/inittab,在里面輸入如下內(nèi)容:

1 #etc/inittab 2 ::sysinit:/etc/init.d/rcS 3 console::askfirst:-/bin/sh 4 ::restart:/sbin/init 5 ::ctrlaltdel:/sbin/reboot 6 ::shutdown:/bin/umount -a -r 7 ::shutdown:/sbin/swapoff -a
  • 第2 行,系統(tǒng)啟動以后運(yùn)行/etc/init.d/rcS 這個(gè)腳本文件。
  • 第3 行,將console 作為控制臺終端,也就是ttymxc0。
  • 第4 行,重啟的話運(yùn)行/sbin/init。
  • 第5 行,按下ctrl+alt+del 組合鍵的話就運(yùn)行/sbin/reboot,看來ctrl+alt+del 組合鍵用于重啟系統(tǒng)。
  • 第6 行,關(guān)機(jī)的時(shí)候執(zhí)行/bin/umount,也就是卸載各個(gè)文件系統(tǒng)。
  • 第7 行,關(guān)機(jī)的時(shí)候執(zhí)行/sbin/swapoff,也就是關(guān)閉交換分區(qū)。

/etc/inittab 文件創(chuàng)建好以后就可以重啟開發(fā)板即可,至此,根文件系統(tǒng)要?jiǎng)?chuàng)建的文件就已經(jīng)全部完成了。

接下來就要對根文件系統(tǒng)進(jìn)行其他的測試,比如我們自己編寫的軟件運(yùn)行是否正常、是否支持軟件開機(jī)自啟動、中文支持是否正常以及能不能鏈接等。

根文件系統(tǒng)其他功能測試

軟件運(yùn)行測試(測試庫)

我們使用Linux的目的就是運(yùn)行我們自己的軟件,我們編譯的應(yīng)用軟件一般都使用動態(tài)庫,使用動態(tài)庫的話應(yīng)用軟件體積就很小,但是得提供庫文件,庫文件我們已經(jīng)添加到了根文件系統(tǒng)中。我們編寫一個(gè)小小的測試軟件來測試一下庫文件是否工作正常,在根文件系統(tǒng)下創(chuàng)建一個(gè)名為“drivers”的文件夾,以后我們學(xué)習(xí)Linux 驅(qū)動的時(shí)候就把所有的實(shí)驗(yàn)文件放到這個(gè)文件夾里面。

在ubuntu 下使用vim 編輯器新建一個(gè)hello.c 文件,在hello.c 里面輸入如下內(nèi)容:

1 #include <stdio.h> 2 3 int main(void) 4 { 5 while(1) { 6 printf("hello world!\r\n"); 7 sleep(2); 8 } 9 return 0; 10 }

hello.c 內(nèi)容很簡單,就是循環(huán)輸出“hello world”,sleep 相當(dāng)于Linux 的延時(shí)函數(shù),單位為秒,所以sleep(2)就是延時(shí)2 秒。編寫好以后就是編譯,因?yàn)槲覀兪且贏RM 芯片上運(yùn)行的,所以要用交叉編譯器去編譯,也就是使用arm-linux-gnueabihf-gcc 編譯,命令如下:

arm-linux-gnueabihf-gcc hello.c -o hello

使用arm-linux-gnueabihf-gcc 將hello.c 編譯為hello 可執(zhí)行文件。這個(gè)hello 可執(zhí)行文件究竟是不是ARM 使用的呢?使用“file”命令查看文件類型以及編碼格式:

file hello //查看hello 的文件類型以及編碼格式

結(jié)果如圖38.5.1.1 所示:

從圖38.5.1.1 可以看出,輸入“file hello”輸入了如下所示信息:

hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked……

hello 是個(gè)32 位的LSB 可執(zhí)行文件,ARM 架構(gòu)的,并且是動態(tài)鏈接的。所以我們編譯出來的hello 文件沒有問題。將其拷貝到rootfs/drivers 目錄下,在開發(fā)板中輸入如下命令來執(zhí)行這個(gè)可執(zhí)行文件:

cd /drivers //進(jìn)入drivers 目錄 ./hello //執(zhí)行hello

結(jié)果如圖38.5.1.2 所示:

可以看出,hello 這個(gè)軟件運(yùn)行正常,說明我們的根文件系統(tǒng)中的共享庫是沒問題的,要想終止hello 的運(yùn)行,按下“ctrl+c”組合鍵即可。

此時(shí)大家應(yīng)該能感覺到,hello 執(zhí)行的時(shí)候終端是沒法用的,除非使用“ctrl+c”來關(guān)閉hello,那么有沒有辦法既能讓hello 正常運(yùn)行,而且終端能夠正常使用?那肯定是有的,讓hello 進(jìn)入后臺運(yùn)行就行了,讓一個(gè)軟件進(jìn)入后臺運(yùn)行的方法很簡單,運(yùn)行軟件的時(shí)候加上“&”即可,比如

./hello &

就是讓hello 在后臺運(yùn)行。在后臺運(yùn)行的軟件可以使用“kill -9 pid(進(jìn)程ID)”命令來關(guān)閉掉,首先使用“ps”命令查看要關(guān)閉的軟件PID 是多少,ps 命令用于查看所有當(dāng)前正在運(yùn)行的進(jìn)程,并且會給出進(jìn)程的PID。輸入“ps”命令,結(jié)果如圖38.5.1.3 所示:

從圖38.5.1.3 可以看出hello 對應(yīng)的PID 為166,因此我們使用如下命令關(guān)閉在后臺運(yùn)行的hello 軟件:

kill -9 166

因?yàn)閔ello 在不斷的輸出“hello world”所以我們的輸入看起來會被打斷,其實(shí)是沒有的,因?yàn)槲覀兪禽斎?#xff0c;而hello 是輸出。在數(shù)據(jù)流上是沒有打斷的,只是顯示在SecureCRT 上就好像被打斷了,所以只管輸入“kill -9 166”即可。hello 被kill 以后會有提示,如圖38.5.1.4 所示:

再去用ps 命令查看一下當(dāng)前的進(jìn)程,發(fā)現(xiàn)沒有hello 了。這個(gè)就是Linux 下的軟件后臺運(yùn)行以及如何關(guān)閉軟件的方法,重點(diǎn)就是3 個(gè)操作:軟件后面加“&”、使用ps 查看要關(guān)閉的軟件PID、使用“kill -9 pid”來關(guān)閉指定的軟件。

中文字符測試

1、設(shè)置SecureCRT 使用UTF-8 編碼

因?yàn)長inux 使用的編碼格式為UTF-8,因此要先設(shè)置SecureCRT 的編碼格式。打開Options->Session Options…,打開“Session Options”對話框,選擇左側(cè)的“Appearance”,然后在右側(cè)的“Character encoding:”欄選擇UTF-8 編碼,如圖38.5.2.1 所示:


設(shè)置好以后點(diǎn)擊下方的“Ok”按鈕即可,SecureCRT 我們就設(shè)置好了。

2、創(chuàng)建中文文件

在ubuntu 中向在rootfs 目錄新建一個(gè)名為“中文測試”的文件夾,然后在SecureCRT 下查看中文名能不能顯示正確。輸入“l(fā)s”命令,結(jié)果如圖38.5.2.2 所示:

可以看出“中文測試”這個(gè)文件夾顯示正常,接著“touch”命令在“中文測試”文件夾中新建一個(gè)名為“測試文檔.txt”的文件,并且使用vim 編輯器在其中輸入“這是一個(gè)中文測試文件”,借此來測試一下中文文件名和中文內(nèi)容顯示是否正常。在SecureCRT 中使用“cat”命令來查看“測試文檔.txt”中的內(nèi)容,結(jié)果如圖38.5.2.3 所示:

從圖38.5.2.3 可以看出,“測試文檔.txt”的中文內(nèi)容顯示正確,而且中文路徑也完全正常,說明我們的根文件系統(tǒng)已經(jīng)完美支持中文了!

開機(jī)自啟動測試

在38.5.1 小節(jié)測試hello 軟件的時(shí)候都是等Linux 啟動進(jìn)入根文件系統(tǒng)以后手動輸入命令“./hello”來完成的。我們一般做好產(chǎn)品以后都是需要開機(jī)自動啟動相應(yīng)的軟件,本節(jié)我們就以hello 這個(gè)軟件為例,講解一下如何實(shí)現(xiàn)開機(jī)自啟動。前面我們說過了,進(jìn)入根文件系統(tǒng)的時(shí)候會運(yùn)行/etc/init.d/rcS 這個(gè)shell 腳本,因此我們可以在這個(gè)腳本里面添加自啟動相關(guān)內(nèi)容。添加完成以后的/etc/init.d/rcS 文件內(nèi)容如下:

1 #!/bin/sh 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin 3 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib 4 runlevel=S 5 umask 022 6 export PATH LD_LIBRARY_PATH runlevel 7 8 mount -a 9 mkdir /dev/pts 10 mount -t devpts devpts /dev/pts 11 12 echo /sbin/mdev > /proc/sys/kernel/hotplug 13 mdev -s 14 15 #開機(jī)自啟動 16 cd /drivers 17 ./hello & 18 cd /
  • 第16 行,進(jìn)入drivers 目錄,因?yàn)橐獑拥能浖娣旁赿rivers 目錄下。
  • 第17 行,以后臺方式執(zhí)行hello 這個(gè)軟件。
  • 第18 行,退出drivers 目錄,進(jìn)入到根目錄下。

自啟動代碼添加完成以后就可以重啟開發(fā)板,看看hello 這個(gè)軟件會不會自動運(yùn)行。結(jié)果如圖38.5.3.1 所示:

從圖38.5.3.1 可以看出,hello 開機(jī)自動運(yùn)行了,說明開機(jī)自啟動成功。

外網(wǎng)連接測試

通過ping 命令來ping 一下百度的官網(wǎng):www.baidu.com。輸入如下命令:

ping www.baidu.com

結(jié)果如圖38.5.4.1 所示:

可以看出,測試失敗,提示www.baidu.com 是個(gè)“bad address”,也就是地址不對,顯然我們的地址是正確的。之所以出現(xiàn)這個(gè)錯(cuò)誤提示是因?yàn)閣ww.baidu.com 的地址解析失敗了,并沒有解析出其對應(yīng)的IP 地址。

我們需要配置域名解析服務(wù)器的IP地址,一般域名解析地址可以設(shè)置為所處網(wǎng)絡(luò)的網(wǎng)關(guān)地址,比如192.168.1.1。也可以設(shè)置為114.114.114.114,這個(gè)是運(yùn)營商(好像是電信的)的域名解析服務(wù)器地址。

在rootfs 中新建文件/etc/resolv.conf,然后在里面輸入如下內(nèi)容:

1 nameserver 114.114.114.114 2 nameserver 192.168.1.1

設(shè)置很簡單,nameserver 表示這是個(gè)域名服務(wù)器,設(shè)置了兩個(gè)域名服務(wù)器地址:114.114.114.114 和192.168.1.1,大家也可以改為其他的域名服務(wù)器試試。如果使用“udhcpc”命令自動獲取IP 地址,“udhcpc”命令會修改nameserver 的值,一般是將其設(shè)置為對應(yīng)的網(wǎng)關(guān)地址。修改好以后保存退出,重啟開發(fā)板!重啟以后重新ping 一下百度官網(wǎng),結(jié)果如圖38.5.4.2
所示:

可以看出ping 百度官網(wǎng)成功了!域名也成功的解析了,至此!我們的根文件系統(tǒng)就徹底的制作完成,這個(gè)根文件系統(tǒng)最好打包保存一下,防止以后做實(shí)驗(yàn)不小心破壞了根文件系統(tǒng)而功虧一簣,又得從頭制作根文件系統(tǒng)。uboot、Linux kernel、rootfs 這三個(gè)共同構(gòu)成了一個(gè)完整的Linux 系統(tǒng),現(xiàn)在的系統(tǒng)至少是一個(gè)可以正常運(yùn)行的系統(tǒng),后面我們就可以在這個(gè)系統(tǒng)上完成Linux 驅(qū)動開發(fā)的學(xué)習(xí)。

總結(jié)

以上是生活随笔為你收集整理的根文件系统构建(BusyBox方式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。