一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

CHANBAEK ? 來源:嵌入式攻城獅 ? 作者:安迪西 ? 2023-04-19 11:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

根文件系統(tǒng)

根文件系統(tǒng)的構(gòu)建,是 Linux移植三大組成部分的最后一步,根文件系統(tǒng)構(gòu)建好后,就構(gòu)成了一個基礎(chǔ)的、可以運行的嵌入式 Linux最小系統(tǒng)

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

Linux的根文件系統(tǒng)一般也叫做 rootfs,根文件系統(tǒng)更像是一個文件夾或者叫做目錄,在這個目錄里面會有很多的子目錄。 根目錄下和子目錄中會有很多的文件,這些文件是Linux運行所必須的,比如庫、常用的軟件和命令、設(shè)備文件、配置文件等等

根文件系統(tǒng)的“根”字就說明了該文件系統(tǒng)的重要性,它是其他文件系統(tǒng)的根,沒有這個“根” ,其他文件系統(tǒng)或者軟件就不能工作。 比如常用的 ls、mv、ifconfig 等命令其實就是一個個小軟件,只是這些軟件沒有圖形界面,且需要輸入命令來運行。 這些小軟件就保存在根文件系統(tǒng)中

在構(gòu)建根文件系統(tǒng)之前,先來看一下根文件系統(tǒng)里面都有些什么內(nèi)容,根文件系統(tǒng)的目錄名字為‘/’ ,是一個斜杠。 下面以Ubuntu為例,來看看根文件系統(tǒng)里都有些什么內(nèi)容

圖片

一些常用的子目錄介紹如下表示

/bin :此目錄下存放著系統(tǒng)需要的可執(zhí)行文件,一般都是一些命令,比如 ls、mv 等命令

/dev :device的縮寫,此目錄下的文件都是和設(shè)備有關(guān)的。 在Linux下一切皆文件,即使是硬件設(shè)備,也是以文件的形式存在的,比如/dev/ttymxc0就表示串口0

/etc :此目錄下存放著各種配置文件

/lib :library的簡稱,也就是庫,此目錄下存放著Linux所必須的庫文件

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

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

/usr :不是user的縮寫,而是Unix Software Resource的縮寫,即Unix操作系統(tǒng)軟件資源目錄。 此目錄下也存放著很多軟件,一般系統(tǒng)安裝完成以后此目錄占用的空間最多

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

/sbin :此目錄下存放一些可執(zhí)行文件,但此目錄下的文件或命令只有管理員才能使用,主要用于系統(tǒng)管理

/sys :系統(tǒng)啟動以后此目錄作為 sysfs文件系統(tǒng)的掛載點,sysfs是一個類似于 proc文件系統(tǒng)的特殊文件系統(tǒng),sysfs也是基于RAM的文件系統(tǒng),也就是說它也沒有實際的存儲設(shè)備。 此目錄是系統(tǒng)設(shè)備管理的重要目錄

/opt :可選的文件、軟件存放區(qū),由用戶選擇將哪些文件或軟件放到此目錄中

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

2.1 BusyBox簡介

BusyBox是一個集成了大量的Linux命令(如ls、mv、ifconfig 等命令)和工具的軟件。 借助BusyBox,進(jìn)行配置和編譯,就可以方便的構(gòu)建一個嵌入Linux平臺所需要的根文件系統(tǒng)

可在BusyBox官網(wǎng):https://busybox.net/ 下載源碼,如下圖

圖片

左側(cè)的“Get BusyBox”欄有一行“Download Source” ,點擊“Download Source”即可打開 BusyBox 的下載頁

圖片

目前最新版本是1.35.0,本文使用1.29.0版本(busybox-1.29.0.tar.bz2)來做講解

2.2 編譯BusyBox構(gòu)件根文件系統(tǒng)

一般在Linux驅(qū)動開發(fā)的時候都是通過NFS掛載根文件系統(tǒng)的,當(dāng)調(diào)試好之后再將根文件系統(tǒng)燒寫到 EMMC或者NAND中,因此需要先在ubuntu虛擬機(jī)中構(gòu)建NFS服務(wù)。 在nfs服務(wù)器目錄中創(chuàng)建名為rootfs的子目錄,用來存放我們的根文件系統(tǒng)

將busybox-1.29.0.tar.bz2發(fā)送到Ubuntu中的合適位置解壓:

tar -vxjf busybox-1.29.0.tar.bz2

解壓后的文件如下:

圖片

修改Makefile添加編譯器

#為了在編譯時,可以不用再指定編譯器的架構(gòu),從而縮短手動輸入指令的長度
CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
......
ARCH ?= arm
# CORSS_COMPILE使用了絕對路徑!是為了防止編譯出錯

busybox中文字符支持:若直接編譯busybox,使用串口工具時是不支持中文顯示的,會顯示為“?” ,可修改源碼,取消 busybox對中文顯示的限制

打開文件busybox-1.29.0/libbb/printable_string.c,將函數(shù)printable_string()中的部分程序注釋掉,修改后的函數(shù)內(nèi)容如下:

/********** printable_string.c代碼段 **********/
constchar* FAST_FUNC printable_string(uni_stat_t*stats,constchar*str)
{
char*dst;
constchar*s;

  s = str;
while(1){
    ......
    if(c <' ')
      break;
    /* 注釋掉下面這個兩行代碼,禁止字符大于0X7F以后 break */
    // if (c >= 0x7f)   
    //   break; 
    s++;
  }

#if ENABLE_UNICODE_SUPPORT
  dst =unicode_conv_to_printable(stats, str);
#else
  {
    char*d = dst =xstrdup(str);
    while(1){
      unsignedchar c =*d;
      if(c =='\\0')
        break;
      /* 修改下面代碼,禁止字符大于0X7F以后輸出‘?’ */
      // if (c < ' ' || c >= 0x7f) 
      if( c <' ')
        *d ='?';
      d++;
    } ......
  }
#endif
returnauto_string(dst);
}

打開文件busybox-1.29.0/libbb/unicode.c,修改如下內(nèi)容:

/********** unicode.c代碼段 **********/
staticchar* FAST_FUNC unicode_conv_to_printable2(uni_stat_t*stats,constchar*src,unsigned width,int flags)
{
char*dst;
unsigned dst_len;
unsigned uni_count;
unsigned uni_width;

if(unicode_status != UNICODE_ON){
    char*d;
    if(flags & UNI_FLAG_PAD){
      d = dst =xmalloc(width +1);
      ......
      /* 修改下面一行代碼 */
      // *d++ = (c >= ' ' && c < 0x7f) ? c : '?'; 
      *d++=(c >=' ')? c :'?';
      src++;
    }
    *d ='\\0';
}else{
    d = dst =xstrndup(src, width);
    while(*d){
      unsignedchar c =*d;
      /* 修改下面一行代碼 */
      // if (c < ' ' || c >= 0x7f) 
      if(c <' ')
        *d ='?';
      d++;
    }
}
......
return dst;
}

配置busybox:有以下幾種配置選項

  • defconfig:缺省配置,也就是默認(rèn)配置選項
  • allyesconfi:全選配置,即選中busybox所有功能
  • allnoconfig:最小配置
make defconfig  	#使用默認(rèn)配置
make menuconfig		#打開圖形化配置界面

圖片

設(shè)置Settings -> Build static binary (no shared libs),用于選擇是靜態(tài)編譯還是動態(tài)編譯,靜態(tài)編譯不需要庫文件,編譯出來的庫很大; 動態(tài)編譯要求根文件系統(tǒng)中有庫文件,編譯出來的 busybox 小很多。 這里不使用靜態(tài)編譯,保持默認(rèn)不選

圖片

設(shè)置設(shè)置 -> vi 樣式的行編輯命令

圖片

配置Linux Module Utilities -> Simplified modutils(不需選中)

圖片

配置Linux System Utilities -> mdev (16 kb)(確保全選)

圖片

設(shè)置Settings -> Support Unicode,使能busybox的unicode編碼以支持中文

圖片

編譯busybox:配置好busybox以后就可以編譯了,輸入如下命令

make
make install CONFIG_PREFIX=/home/andyxi/linux/nfs/rootfs
#CONFIG_PREFIX指定編譯結(jié)果的存放目錄

圖片

編譯完成以后,busybox的所有工具和文件會被安裝到 rootfs目錄中,如下圖示:rootfs目錄下有bin、sbin和usr三個目錄,以及l(fā)inuxrc文件。 Linux內(nèi)核 init進(jìn)程會查找用戶空間的 init程序,找到后就會運行這個用戶空間的init程序,從而切換到用戶態(tài)。 如果 bootargs設(shè)置 init=/linuxrc,那么 linuxrc就可作為用戶空間的init程序

圖片

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

busybox編譯完成后的根文件系統(tǒng)還不能使用, 還需要一些其他的文件

向rootfs/lib中添加庫文件:上面 busybox使用的動態(tài)庫編譯,所以還需要向根文件系統(tǒng)中添加動態(tài)庫

先在rootfs中創(chuàng)建一個名為“l(fā)ib”的文件夾。

lib庫文件從交叉編譯器中獲取,筆者的交叉編譯器存放在“/usr/local/arm/”目錄中,進(jìn)入交叉編譯器的"libc/lib"目錄:

cd /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/andyxi/linux/nfs/rootfs/lib/ -d  #-d表示拷貝符號鏈接

### 特殊庫文件:ld-linux-armhf.so.3(軟連接文件,即快捷方式) 的處理
rm ld-linux-armhf.so.3    #先刪除rootfs/lib中的這個軟鏈接
# 然后重新拷貝ld-linux-armhf.so.3
cp /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 .

進(jìn)入交叉編譯器的"lib"目錄,將此目錄下所有的so和.a 庫文件拷貝到 rootfs/lib 目錄中

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a /home/andyxi/linux/nfs/rootfs/lib/ -d  #-d表示拷貝符號鏈接

圖片

向rootfs/usr/lib中添加庫文件

在rootfs/usr目錄下創(chuàng)建一個名為lib的目錄。

將交叉編譯器的"libc/usr/lib"目錄中的so和.a 庫文件拷貝到rootfs/usr/lib目錄中

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a /home/andyxi/linux/nfs/rootfs/usr/lib/ -d

圖片

至此,根文件系統(tǒng)的庫文件就全部添加好了,可以在rootfs目錄下使用 du 命令來查看 /lib和 /usr/lib這兩個目錄的大?。?/p>

du ./lib ./usr/lib/ -sh

圖片

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

在根文件系統(tǒng)中創(chuàng)建其他文件夾,如 dev、proc、mnt、sys、tmp 和 root 等,創(chuàng)建完后的效果:

圖片

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

使用NFS掛載的方式來測試上面創(chuàng)建好的根文件系統(tǒng)rootfs。 uboot里面的bootargs環(huán)境變量會設(shè)置root的值,需要將root的值改為NFS掛載,設(shè)置格式如為:

root=/dev/nfs nfsroot=
  • server-ip:服務(wù)器IP,存放根文件系統(tǒng)的Ubuntu的IP地址
  • root-dir:根文件系統(tǒng)的存放路徑
  • nfs-options:NFS的其他可選選項,一般不設(shè)置
  • client-ip>:客戶端IP,開發(fā)板IP地址,內(nèi)核啟動后會使用此IP地址來配置開發(fā)板
  • gw-ip:網(wǎng)關(guān)地址
  • netmask:子網(wǎng)掩碼,255.255.255.0
  • hostname:客戶機(jī)的名字,一般不設(shè)置
  • device:設(shè)備名,也就是網(wǎng)卡名,一般是 eth0,eth1….
  • autoconf:自動配置,一般不使用,設(shè)置為 off
  • dns0-ip:DNS0服務(wù)器 IP地址,不使用
  • dns1-ip:DNS1服務(wù)器 IP地址,不使用

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

root=/dev/nfs nfsroot=192.168.10.100:/home/andyxi/linux/nfs/rootfs,proto=tcp rw ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth1:off

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

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.100:/home/andyxi/linux/nfs/rootfs,proto=tcp rw ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth1:off' 
saveenv

設(shè)置好以后使用“boot”命令啟動Linux內(nèi)核,進(jìn)入根文件系統(tǒng),結(jié)果如下圖示

圖片

輸入“l(fā)s”命令進(jìn)行測試,發(fā)現(xiàn)ls命令正常工作。 但是此時rootfs并沒有制作成功,注意上圖中的錯誤提示:can't run '/etc/init.d/rcS' 這個文件,說明rootfs仍然不夠完善

篇幅所限,關(guān)于 rootfs根文件系統(tǒng)的完善將會在后續(xù)文章中介紹!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213837
  • Ubuntu
    +關(guān)注

    關(guān)注

    5

    文章

    592

    瀏覽量

    31254
  • busybox
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    11504
  • 根文件系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    12284
  • rootfs
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    4812
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux文件系統(tǒng)的組成及構(gòu)建方案

    Linux“三巨頭”已經(jīng)完成了 2 個了,就剩最后一個 rootfs(文件系統(tǒng))了,本章就來學(xué)習(xí)一下文件系統(tǒng)的組成以及如何構(gòu)建
    發(fā)表于 10-13 14:21 ?1285次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-busybox構(gòu)建文件系統(tǒng)之添加必要目錄和庫

    、添加啟動文件在/busybox/examples/etc文件夾中存在有啟動相關(guān)的文件,我們將該etc文件夾復(fù)制到我們創(chuàng)建的
    發(fā)表于 06-19 17:20

    飛凌嵌入式ElfBoard ELF 1板卡-busybox構(gòu)建文件系統(tǒng)Busybox編譯

    下載進(jìn)入busybox網(wǎng)址https://busybox.net/,下載最新版本busybox1.32.1。本人沒有測試過該版本的穩(wěn)定性,本教程主要講解如何使用busybox
    發(fā)表于 06-19 17:23

    飛凌嵌入式ElfBoard ELF 1板卡-busybox構(gòu)建文件系統(tǒng)文件系統(tǒng)驗證

    至此,我們已經(jīng)完成了一個最小文件系統(tǒng)構(gòu)建,現(xiàn)在我們使用nfs將其掛載為網(wǎng)絡(luò)文件系統(tǒng),進(jìn)行測試。開發(fā)板啟動之后,在uboot階段,修改bootargs環(huán)境變量。在mmcargs中進(jìn)行修改:=&
    發(fā)表于 06-23 16:10

    【OK210試用體驗】構(gòu)建文件系統(tǒng)

    的/image目錄下并命名為kernel.bin,由bootloader從sd卡加載內(nèi)核啟動。 圖2-2 bootloader從sd卡啟動linux內(nèi)核3. Busybox構(gòu)建文件系統(tǒng)
    發(fā)表于 01-10 16:01

    【NanoPi NEO2試用體驗】構(gòu)建文件系統(tǒng)

    的boot.img,上電啟動。 3. Busybox構(gòu)建文件系統(tǒng)3.1. Busybox概述對于linux
    發(fā)表于 06-29 09:28

    NXP-I.MX6UL開發(fā)板inux文件系統(tǒng)定制資料分享(一)

    想使用uClibc的時候,你需要一個編譯工具鏈?zhǔn)褂盟鳛殒溄訋飚a(chǎn)生目標(biāo)代碼。Buildroot可以為你做到這一點。Buildroot自動使用所用可能用到的工具(比如busybox構(gòu)建文件系
    發(fā)表于 07-26 15:11

    怎樣使用buildroot構(gòu)建文件系統(tǒng)

    使用buildroot構(gòu)建文件系統(tǒng)一、buildroot介紹使用busybox 構(gòu)建文件系統(tǒng)的時候,b
    發(fā)表于 11-05 08:13

    使用Buildroot構(gòu)建文件系統(tǒng)的方法簡析

    1、怎么使用Buildroot構(gòu)建文件系統(tǒng)?  制作文件系統(tǒng)有歸多種方法:  使用Busybox
    發(fā)表于 11-04 15:41

    Busybox制作嵌入式Linux文件系統(tǒng)

    文件系統(tǒng)為Linux 的運行提供最基本的工具、庫、腳本和一些特殊文件的支持Busybox 是制作嵌入式Linux 文件系統(tǒng)的快捷工具,本文
    發(fā)表于 06-12 16:05 ?22次下載

    實驗五 基于busybox文件系統(tǒng)制作實驗-2016

    基于busybox文件系統(tǒng)制作實驗-2016
    發(fā)表于 09-15 08:52 ?10次下載

    嵌入式Linux學(xué)習(xí)之旅(10)— 使用buildroot構(gòu)建文件系統(tǒng)

    使用buildroot構(gòu)建文件系統(tǒng)一、buildroot介紹使用busybox 構(gòu)建文件系統(tǒng)的時候,b
    發(fā)表于 11-02 14:36 ?10次下載
    嵌入式Linux學(xué)習(xí)之旅(10)— 使用buildroot<b class='flag-5'>構(gòu)建</b><b class='flag-5'>根</b><b class='flag-5'>文件系統(tǒng)</b>

    i.MX6ULL嵌入式Linux開發(fā)4-文件系統(tǒng)構(gòu)建

    本篇使用BusyBox構(gòu)建文件系統(tǒng),并通過NFS網(wǎng)絡(luò)調(diào)試的方式實現(xiàn)文件系統(tǒng)掛載測試,實測時
    的頭像 發(fā)表于 03-14 08:41 ?2685次閱讀
    i.MX6ULL嵌入式Linux開發(fā)4-<b class='flag-5'>根</b><b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>構(gòu)建</b>

    rootfs文件系統(tǒng)制作

    本文記錄了文件系統(tǒng)的一些知識點,Busybox 工具的使用和 最小文件系統(tǒng)的制作。
    發(fā)表于 10-31 11:56 ?2次下載

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

    在用 BusyBox 構(gòu)建文件系統(tǒng)一文中介紹了文件系統(tǒng)的制作,rootfs制作完成后測試時,
    的頭像 發(fā)表于 04-18 15:26 ?1502次閱讀
    如何完善根<b class='flag-5'>文件系統(tǒng)</b>