嵌入式根文件系统一般都是使用busybox
1.下载
https://busybox.net/
我没安装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).
#
#
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文件系统。如果有内容,就可以确信网络根文件系统制作好了。
已经有内容的网络文件系统好了,制作各种格式的镜像格式就不再说了,大家可以百度,很多博客都有说的。