2.構建最小根文件系統(踩坑記錄)

搭建一個用於驅動開發的最小根文件系統

配置編譯busybox

busybox 官方網站:http://www.busybox.net/
我直接下載了最新的版本

1.解壓
2.修改Makefile

找到CROSS_COMPILE變量,吧自己的編譯器前綴賦值

CROSS_COMPILE ?= arm-linux-

我看ARCH變量不需要設置了,代碼中已經根據CROSS_COMPILE自動推斷平臺了,如果你的編譯器前綴不帶有平臺標誌(arm)那麼需要自己設置下

3.配置

busyboy默認安裝目錄爲_install,直接修改爲自己的rootfs目錄

make menuconfig
  • Settings—>

    • Build Options—>
      • [*]Build BusyBox as a static binary(no shared libs)
    • Library Tuning—>
      • [*]vi-style line editing commands
      • [*]Fancy shell prompts
      • — Installation Options (“make install” behavior)
        What kind of applet links to install (as hard-links)
        • —> (/home/minicoco/disk1/Dev/nanopi/rootfs) Destination path for ‘make install’
          直接將自己的rootfs配置到安裝目錄
  • Linux Module Utilities—>

    • [ ]Simplified modutils
    • [*]depmod
    • [*]insmod
    • [*]lsmod
    • [*] Pretty output
    • [*] modinfo
    • [*]modprobe
    • [*] Blacklist support
    • [*]rmmod
  • 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 -j16

編譯沒有遇到錯誤

5.安裝
make install

安裝步驟實際上就是拷貝編譯結果到指定目錄(rootfs)

6.創建常用文件夾
cd rootfs
mkdir dev mnt proc var tmp sys root lib

拷貝鏈接庫

1.在rootfs目錄下創建lib目錄
mkdir lib
2.拷貝動態庫

找到自己編譯工具的動態連接庫,一般在編譯工具的lib文件夾下面

cp ~/disk1/Dev/nanopi/prebuilts/gcc-x64/opt/FriendlyARM/toolchain/4.9.3/arm-cortexa9-linux-gnueabihf/lib* lib/
3.使用strip工具去掉庫中符號信息

動態鏈接庫so文件中包含了調試符號信息,這些符號信息在運行時是沒用的(調試時用的),這些符號會佔用一定空間。在傳統的嵌入式系統中flash空間是有限的,爲了節省空間常常把這些符號信息去掉。這樣節省空間並且不影響運行。進入rootfs/lib目錄,執行命令:

arm-none-linux-gnueabi-strip *so*

實際操作後發現庫文件由3.8M變成了3.0M,節省了0.8M的空間。

配置系統

1. 添加inittab文件到etc文件夾
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r
2. inittab格式解析
init進程啓動後最開始就是讀取inittab中的指令執行
inittab 由文本組成。
  • .# 註釋
  • .: 分隔符,每行代表一個獨立的含義 ,分隔開各個部分。
  • ./ 目錄
  • .inittab內容是以行爲單位,行與行之間沒有關聯
  • .每一行的配置項都是由3個冒號分隔開的4個配置值共同確定。這四個配置值就是id:runlevels:action:process。值得注意 得是有些配置值可以空缺,空缺後冒號不能空缺,所以有時候會看到連續2個冒號。
  • .每一行的配置項中4個配置值中最重要的是action和process,action是一個條件/狀態,process是一個可被執行的程序的pathname。合起來的意思就是:當滿足action的條件時就會執行process這個程序。理解inittab的關鍵就是明白“當滿action的條件時就會執行process這個程序。” 去分析busybox的源代碼就會發現,busybox最終會進入一個死循環,在這個死循環中去反覆檢查是否滿足各個action的條件,如果某個action的條件滿足就會去執行對應的process。

sysinit 指定的進程在訪問控制檯之前執行,這樣的條目僅用於對某些設備的初始化,目的是爲了使init在這樣的設備上向用戶提問有關運行級別的問題,init需要等待進程運行結束後才繼續

respawn 如果process字段指定的進程不存在,就啓動該進程,init不會等待處理結束,而是繼續掃描inittab文件。當該進程被終止時,init將重新啓動它。如果相應的進程已經存在,init就忽略該條目並繼續掃描inittab文件

askfirst 類似respawn,主要用途是減少系統上執行的終端應用程序的數量。它將會促使init在控制檯上顯示“Please press Enter to active this console”的信息,並在重新啓動進程之前等待用戶按下“enter”鍵
wait 告訴init必須等到相應的進程執行完成之後才能繼續執行

once 啓動進程,不會等待處理結束,而是繼續處理下一條條目。當該進程被終止時,init不會重新啓動它。從一個運行級別進入另一個運行級別時,如果相應的進程仍 在運行,init就不會重新啓動該進程

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

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

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

boot 只在系統啓動時,init才處理這條條目,啓動相應的進程,並不等待處理結束就去處理下一條條目。當這樣的進程終止時,也不會重新啓動它

bootwait 系統啓動後,當第一次從單用戶模式進入多用戶模式時才處理該條目,init啓動這樣的進程,並且等待其處理結束才處理下一條條目,當該進程被終止時,也不重新啓動它。

off 如果相應的進程正在運行,那麼就發出一個警告信號,等待數秒後,再發出信號SIGKILL強制終止該進程。如果相應的進程不存在就忽略該條目

initdefault 指定一個默認的運行級別,如果指定了多個運行級別,其中最大的數字將是默認的運行級別。如果inittab文件沒有包含該條目,在系統啓動時會請求用戶爲其指定一個默認的運行級別

powerwait 當初接接到斷電的信號時,處理指定的進程,並且等到處理結束後纔去檢查其他的條目

powerfail 當init接到斷電的信 時,處理指定的進程,但是不等待該進程處理結束。

3. 添加rcS文件

rcS文件放到etc/init.d文件夾中,是一個普通的sh腳本,做最小系統先不管裏面的內容

mkdir init.d
nano init.d/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.0.99

安裝qemu

1. 安裝qemu
sudo apt-get install qemu-user-static
2. 拷貝運行環境到rootfs
sudo cp /usr/bin/qemu-arm-static usr/bin/
sudo cp /usr/bin/qemu-aarch64-static usr/bin/
3. 在rootfs外面添加掛載腳本:mount-rootfs.sh
dir=rootfs/
sudo mount -t proc /proc ${dir}proc
sudo mount -t sysfs /sys ${dir}sys    
sudo mount -o bind /dev ${dir}dev
sudo mount -o bind /run ${dir}run 
sudo mount --bind / ${dir}host
sudo chroot ${dir} /bin/sh
4. 添加卸載腳本:umount-rootfs.sh
dir=rootfs/
sudo umount ${dir}proc
sudo umount ${dir}sys    
sudo umount ${dir}dev
sudo umount ${dir}run 
sudo umount ${dir}host
5.chroot進去先爽一把
sudo ./mount-rootfs.sh

一把過
在這裏插入圖片描述

nfs遠程掛載

nfs配置可見我上一篇文章

1.重啓開發板

在這裏插入圖片描述

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