目錄
搭建一個用於驅動開發的最小根文件系統
配置編譯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配置到安裝目錄
- —> (/home/minicoco/disk1/Dev/nanopi/rootfs) Destination path for ‘make install’
- Build Options—>
-
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配置可見我上一篇文章