原文链接:https://blog.csdn.net/qq_16777851/article/details/82056774
嵌入式根文件系统一般都是使用busybox
1.下载
我没安装git工具,我就直接下载源码了
我们就下载一个19.2的版本
放入linux系统中某个目录,解压
需改顶层Makefile
nfs服务器搭建,参考我的这篇文章
https://blog.csdn.net/qq_16777851/article/details/81516978
make menuconfig
选择配置
1.指定安装路径
-
Settings --->
-
--- Installation Options (
"make install" behavior)
-
(/home/run/work/rootfs/) Destination path
for
'make install'
2.去掉简要安装,我们调试驱动需要详细的
Linux Module Utilities ---> [ ] Simplified modutils [*] depmod (26 kb) [*] insmod (22 kb) [*] lsmod (4.3 kb) [*] Pretty output (NEW) [*] modinfo (25 kb) [*] modprobe (29 kb) [*] Blacklist support (NEW) [*] rmmod (3.6 kb)
3.静态库编译busybox
Settings ---> [*] Build static binary (no shared libs)
4.设置,命令行风格和网络配置
Settings ---> --- Library Tuning [*] Support /etc/networks [*] vi-style line editing commands
5.mdev配置
-
Linux System Utilities --->
-
[*] mdev (16 kb)
-
[*] Support /etc/mdev.conf
-
[*] Support subdirs/symlinks
-
[*] Support regular expressions substitutions when renaming device
-
[*] Support
command execution at device addition/removal
-
[*] Support loading of firmware
上面的好多都是选中的,这里只是确认一下,宁可多选,不要少选。
编译
出现了一系列错误,找不到头文件
后来换了一个编译器就可以了
红框框起来的就是she生成的可执行文件
make install
会安装到我们前面指定的文件夹中
可以看到已经有了
把该目录导出到nfs服务器的目录下
打开,添加,重启nfs服务器
sudo vi /etc/exports
/home/run/work/rootfs *(rw,sync,no_root_squash,no_subtree_check)
sudo /etc/init.d/nfs-kernel-server restart
这个是我重新搭建的一个虚拟机上做了所以ip地址有了小改变
其中从机地址是192.168.0.103,nfs文件系统目录和上面添加的一致就可以。
bootargs=root=/dev/nfs nfsroot=192.168.0.103:/home/run/work/rootfs \ ip=192.168.0.20:192.168.0.103:192.168.0.1:255.255.255.0::eth0:off \ init=/linuxrc console=ttySAC2,115200
tfttp下载uImage ,bootm启动
发现已经可以启动了,命令行也能敲,就是不听的打印open /dev/tty信息,主要是我们还没增加rcS文件
1.在rootfs中添加常用的目录
mkdir dev mnt proc var tmp sys root lib
2.拷贝动态链接库
从你的交叉编译工具链的lib目录下
先通过find命令找到.so文件的目录
cp /usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/libc/lib/ lib/ -a
lib文件的大小5.2M
去掉库文件的符号信息
如果构建最简单的文件系统可以直接拷贝,busybox的如下目录
examples/bootfloppy/etc
我为了今后开发方便就多添加一些内容
3.制作inittab文件
inittab的规则和作用在busybox/example/inittab文件里面有详细说明
-
#first:run the system script file
-
::sysinit:/etc/init.d/rcS
-
::askfirst:-/bin/sh
-
::ctrlaltdel:-/sbin/reboot
-
#umount all filesystem
-
::shutdown:/bin/umount -a -r
-
#restart init process
-
::restart:/sbin/init
4.制作rcS文件
先创建文件夹
/rootfs/etc$ mkdir init.d
在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.1.10
5.添加fstab
vi etc/fstab
-
# /etc/fstab: static file system information.
-
#
-
# Use 'vol_id --uuid' to print the universally unique identifier for a
-
# device; this may be used with UUID= as a more robust way to name devices
-
# that works even if disks are added and removed. See fstab(5).
-
#
-
# <file system> <mount point> <type> <options> <dump> <pass>
-
proc /proc proc defaults 0 0
-
sysfs /sys sysfs defaults 0 0
-
tmpfs /var tmpfs defaults 0 0
-
tmpfs /tmp tmpfs defaults 0 0
-
tmpfs /dev tmpfs defaults 0 0
-
6.添加profile
-
# Ash profile
-
# vim: syntax=sh
-
-
# No core files by default
-
ulimit -S -c 0 > /dev/null 2>&1
-
-
USER=
"`id -un`"
-
LOGNAME=
$USER
-
PS1=
'[\u@\h \W]\# '
-
PATH=
$PATH
-
`hostname run`
-
HOSTNAME=`hostname`
-
-
export USER LOGNAME PS1 PATH
-
ok,重新启动linux
ok已经可以运行了,唯一就是rcS我们在linux系统下是普通用户作的
添加管理员权限给这个文件
顺便给其它文件也添加权限
重新启动,可看到,已经正常启动,无论是hosrname,还是网卡ip都ok
同时查看sysfs文件系统和proc文件系统
遇到的问题nfs启动时已经传过来了本机ip地址,所以rcS文件不再需要设置本机地址,否则会出现下面的情况
在非nfs启动时可以加上,用来设置默认ip,我这里因为要nfs启动就注释掉了
-
#!/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.1.10
-
查看sysfs文件系统和proc文件系统。如果有内容,就可以确信网络根文件系统制作好了。
已经有内容的网络文件系统好了,制作各种格式的镜像格式就不再说了,大家可以百度,很多博客都有说的。