嵌入式Linux根文件系統的製作以及開發板掛載

一、製作根文件系統

(1)準備材料:交叉編譯工具鏈,busybox

由於我使用的是全志的H3芯片的nanoPI,全志提供的編譯器只能編譯內核,無法編譯應用程序,所以我們從友善之臂官網下載新的編譯器:
$ git clone https://github.com/friendlyarm/prebuilts.git
$ sudo mkdir -p /opt/FriendlyARM/toolchain
$ sudo tar xf prebuilts/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz -C \\
/opt/FriendlyARM/toolchain/
但是由於國內訪問github太慢,所以根據韋東山老師(在這裏感謝)提供的鏈接進行下載:
git clone https://git.coding.net/weidongshan/nanoPI_app_toolchain.git
$ sudo mkdir -p /opt/FriendlyARM/toolchain
$ sudo tar xf \\
nanoPI_app_toolchain/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz \\
-C /opt/FriendlyARM/toolchain/
編譯前設置環境變量:
$ export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin/:$PATH
下載busybox:
wget https://busybox.net/download/busybox-1.26.2.tar.bz2

(2)編譯busybox

$ tar xjf busybox-1.26.2.tar.bz2//解壓
$ cd busybox-1.26.2/
$ make menuconfig // 設置交叉編譯工具鏈前綴爲arm-linux-, 並選擇支持mount NFS
或者找到Makefile 文件,將ARCH  和 CROSS_COMPILE改爲
ARCH  ?= arm
CROSS_COMPILE  ?= arm-linux-
$ make
$ make CONFIG_PREFIX=/work/nfs_root/fs_mini  install //安裝到指定目錄

(3)從交叉編譯工具鏈中複製lib庫

$ mkdir /work/nfs_root/fs_mini/lib
$ cd /opt/FriendlyARM/toolchain/4.9.3/arm-cortexa9-linux-gnueabihf/lib
$ cp *so* -d /work/nfs_root/fs_mini/lib

(4)構建etc目錄

需創建3個文件:etc/inittab、etc/init.d/rcS、etc/fstab
mkdir /work/nfs_root/fs_mini/etc

vi inittab
在裏面輸入如下內容:
# /etc/inittab
::sysinit:/etc/init.d/rcS
ttyS0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
具體什麼意思我一時也不是太明白,有知道的讀者可以留言區指教一下;

mkdir /work/nfs_root/fs_mini/init.d
vi rcs
在裏面輸入如下內容:
#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
還要改變一下屬性才能執行:$ chmod +x etc/init.d/rcS

vi fstab
輸入如下內容:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0

(5)構建dev目錄

$ cd /work/nfs_root/fs_mini
$ mkdir dev
$ cd dev
$ sudo mknod console c 5 1
$ sudo mknod null c 1 3

(6) 其他空目錄,比如proc、mnt、tmp、sys 等,如下創建:

$ cd /work/nfs_root/fs_mini
$ mkdir proc mnt tmp sys var

二、開機自動啓動應用程序

(1)編寫hello world

hello.c
#include <stdio.h>
int main(int argc, char **argv)
{
printf(“Hello, world!\n”);
return 0;
}
編譯:
$ gcc -o hello hello.c // 爲PC 編譯
$ ./hello // 測試一下
$ arm-linux-gcc -o hello hello.c // 爲ARM 編譯,這個程序需要放到開發板上

(2)自動運行修改文件

a). hello 程序只執行一次,修改/etc/inittab,添加這行:
::once:/bin/hello > /tmp/hello.log 2>&1
它的含義是隻執行hello 程序一次,裏面的printf 信息寫到/tmp/hello.log(文件句柄爲1);
“2>&1”表示如果有錯誤信息(文件句柄2),也打印到文件句柄1 對應的文件/tmp/hello.log
去。

b). hello 程序退出後又重新執行,修改/etc/inittab,添加這行:
::respawn:/bin/hello > /tmp/hello.log 2>&1

c). hello 程序只執行一次,修改/etc/init.d/rcS,添加這行:
/bin/hello > /tmp/hello2.log 2>&1 &
最後的“&”表示讓hello 程序在後臺運行。

三、NFS掛載

(1)主機安裝nfs服務

$sudo apt-get install nfs-kernel-server portmap
在它的配置文件/etc/exports裏面增加如下內容,以後將通過網絡文件系統訪問/work/nfs_root目錄
/work/nfs_root  *(rw,sync,no_root_squash)
$sodu /etc/init.d/nfs-kernel-server restart//重啓服務

(2)開發板安裝nfs服務

$sudo apt-get install nfs-common
如果報錯:mount: wrong fs type, bad option, bad superblock on.........輸入如上指令都能解決

(3)開發板配置裝載點

在開發板/etc/fstab目錄添加
$vi /etc/fstab
添加如下內容:
192.168.1.50:/work/nfs_root/fs_mini mnt nfs defaults 0 0
如果報錯:can’t find /mnt in /etc/fstab,一般配置好裝載點都能解決

(4)開發板掛載

輸入如下指令
$ mount 192.168.1.50:/work/nfs_root/fs_mini /mnt
其中,192.168.1.50是主機IP,/work/nfs_root/fs_mini 是主機共享目錄,/mnt表示將該共享目錄掛載到ARM開發板/mnt目錄下
如未報錯,則表示成功,可以進入到開發板/mnt目錄開到主機一樣的根文件系統

四、開發中遇到的問題

(1)掛載失敗,連接超時

用開發板ping 了一下主機發下ping不通,用開發板ping www.baidu.com正常,ping 局域網內其他windows計算機正常,所以我就使用ifconfig看了一下主機的ip信息,主機的IP信息爲192.168.106.141,而宿主計算機和局域網內其他計算機的ip都是192.168.1.xx,主機跟其他所有機器都不在一個網段上,所以我想會不會是有這個問題導致的,由此改了一下主機的網絡設置:
在這裏插入圖片描述
然後改了開發板的掛載配置ip,重新掛載,沒有報錯,也沒有超時,進入/mnt 目錄查看,掛載成功!

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