嵌入式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 目录查看,挂载成功!

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