2 構建最小根檔案系統(踩坑記錄)

2021-10-06 18:24:54 字數 4328 閱讀 4904

rootfs系列文章:

構建最小根檔案系統

根檔案系統構建(2)

構建ubuntu系統

拷貝鏈結庫

配置系統

安裝qemu

nfs遠端掛載

搭建乙個用於驅動開發的最小根檔案系統

配置編譯busybox

1.解壓

2.修改makefile

找到cross_compile變數,吧自己的編譯器字首賦值

cross_compile ?= arm-linux-
我看arch變數不需要設定了,**中已經根據cross_compile自動推斷平台了,如果你的編譯器字首不帶有平台標誌(arm)那麼需要自己設定下

3.配置

busyboy預設安裝目錄為_install,直接修改為自己的rootfs目錄

make menuconfig
library tuning—>

linux module utilities—>

linux system utilities—>

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 由文字組成。

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 當初接接到斷電的訊號時,處理指定的程序,並且等到處理結束後才去檢查其他的條目

powe***il 當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

拷貝qemu

sudo

cp /usr/bin/qemu-arm-static usr/bin/

sudo

cp /usr/bin/qemu-aarch64-static usr/bin/

拷貝dns配置,不拷貝這個很有可能無法上網

sudo

cp /etc/resolv.conf etc/resolv.conf

3. 在rootfs外面新增掛載指令碼:mount-rootfs.sh
dir=rootfs/

sudo

mount -t proc /proc $proc

sudo

mount -t sysfs /sys $sys

sudo

mount -o bind /dev $dev

sudo

mount -o bind /run $run

sudo

mount --bind / $host

sudo

chroot

$ /bin/sh

4. 新增解除安裝指令碼:umount-rootfs.sh
dir=rootfs/

sudo

umount

$proc

sudo

umount

$sys

sudo

umount

$dev

sudo

umount

$run

sudo

umount

$host

5.chroot進去先爽一把
sudo ./mount-rootfs.sh
一把過

nfs遠端掛載

1.重啟開發板

構建根檔案系統2

構建最小根檔案系統 下面將繼續介紹根檔案系統的其他內容 1.proc目錄 關於linux根檔案系統 proc目錄的介紹,可以參考這個文章 下面將講解如何在最小根檔案系統的基礎上掛載proc檔案系統 workdir fstest mkdir proc workdir fstest cd etc wor...

移植busybox構建最小根檔案系統

busybox 瑞士軍刀,裡面裝有很多小命令。step 1 構建目錄結構 建立根檔案系統目錄,主要包括以下目錄 dev etc lib usr var proc tmp home root mnt bin sbin sys mkdir home rootfs cd home rootfs mkdir...

構建根檔案系統

wget make defconfig make cross compile arm linux gnueabi make install編譯完install後會預設安裝在busybox原始碼目錄下 install目錄內,但是此檔案系統並不完整,只有四個目錄 root ls bin linuxrc ...