从零开始之文件系统制作、根文件系统制作

原文链接:https://blog.csdn.net/qq_16777851/article/details/82056774

嵌入式根文件系统一般都是使用busybox

1.下载

https://busybox.net/

我没安装git工具,我就直接下载源码了

我们就下载一个19.2的版本

放入linux系统中某个目录,解压

需改顶层Makefile

nfs服务器搭建,参考我的这篇文章

https://blog.csdn.net/qq_16777851/article/details/81516978

make menuconfig

选择配置

1.指定安装路径


  
  
  1. Settings --->
  2. --- Installation Options ( "make install" behavior)
  3. (/home/run/work/rootfs/) Destination path for 'make install'

2.去掉简要安装,我们调试驱动需要详细的


  
  
  1. Linux Module Utilities --->
  2. [ ] Simplified modutils
  3. [*] depmod (26 kb)
  4. [*] insmod (22 kb)
  5. [*] lsmod (4.3 kb)
  6. [*] Pretty output (NEW)
  7. [*] modinfo (25 kb)
  8. [*] modprobe (29 kb)
  9. [*] Blacklist support (NEW)
  10. [*] rmmod (3.6 kb)

3.静态库编译busybox


  
  
  1. Settings --->
  2. [*] Build static binary (no shared libs)

4.设置,命令行风格和网络配置


  
  
  1. Settings --->
  2. --- Library Tuning
  3. [*] Support /etc/networks
  4. [*] vi-style line editing commands

5.mdev配置


  
  
  1. Linux System Utilities --->
  2. [*] mdev (16 kb)
  3. [*] Support /etc/mdev.conf
  4. [*] Support subdirs/symlinks
  5. [*] Support regular expressions substitutions when renaming device
  6. [*] Support command execution at device addition/removal
  7. [*] 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文件系统目录和上面添加的一致就可以。


  
  
  1. bootargs=root=/dev/nfs nfsroot=192.168.0.103:/home/run/work/rootfs \
  2. ip=192.168.0.20:192.168.0.103:192.168.0.1:255.255.255.0::eth0:off \
  3. 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文件里面有详细说明


  
  
  1. #first:run the system script file
  2. ::sysinit:/etc/init.d/rcS
  3. ::askfirst:-/bin/sh
  4. ::ctrlaltdel:-/sbin/reboot
  5. #umount all filesystem
  6. ::shutdown:/bin/umount -a -r
  7. #restart init process
  8. ::restart:/sbin/init

4.制作rcS文件

先创建文件夹

/rootfs/etc$ mkdir init.d

  
  

在init.d文件夹下创建rcS文件


  
  
  1. #!/bin/sh
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3. runlevel=S
  4. prevlevel=N
  5. umask 022
  6. export PATH runlevel prevlevel
  7. mount -a
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug
  9. mdev -s
  10. /bin/hostname -F /etc/sysconfig/HOSTNAME
  11. ifconfig eth0 192.168.1.10

5.添加fstab

 vi etc/fstab

  
  

  
  
  1. # /etc/fstab: static file system information.
  2. #
  3. # Use 'vol_id --uuid' to print the universally unique identifier for a
  4. # device; this may be used with UUID= as a more robust way to name devices
  5. # that works even if disks are added and removed. See fstab(5).
  6. #
  7. # <file system> <mount point> <type> <options> <dump> <pass>
  8. proc /proc proc defaults 0 0
  9. sysfs /sys sysfs defaults 0 0
  10. tmpfs /var tmpfs defaults 0 0
  11. tmpfs /tmp tmpfs defaults 0 0
  12. tmpfs /dev tmpfs defaults 0 0

6.添加profile


  
  
  1. # Ash profile
  2. # vim: syntax=sh
  3. # No core files by default
  4. ulimit -S -c 0 > /dev/null 2>&1
  5. USER= "`id -un`"
  6. LOGNAME= $USER
  7. PS1= '[\u@\h \W]\# '
  8. PATH= $PATH
  9. `hostname run`
  10. HOSTNAME=`hostname`
  11. export USER LOGNAME PS1 PATH

ok,重新启动linux

ok已经可以运行了,唯一就是rcS我们在linux系统下是普通用户作的

添加管理员权限给这个文件

顺便给其它文件也添加权限

重新启动,可看到,已经正常启动,无论是hosrname,还是网卡ip都ok

同时查看sysfs文件系统和proc文件系统

遇到的问题nfs启动时已经传过来了本机ip地址,所以rcS文件不再需要设置本机地址,否则会出现下面的情况

在非nfs启动时可以加上,用来设置默认ip,我这里因为要nfs启动就注释掉了


  
  
  1. #!/bin/sh
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3. runlevel=S
  4. prevlevel=N
  5. umask 022
  6. export PATH runlevel prevlevel
  7. mount -a
  8. echo /sbin/mdev > /proc/sys/kernel/hotplug
  9. mdev -s
  10. /bin/hostname -F /etc/sysconfig/HOSTNAME
  11. #ifconfig eth0 192.168.1.10

查看sysfs文件系统和proc文件系统。如果有内容,就可以确信网络根文件系统制作好了。

已经有内容的网络文件系统好了,制作各种格式的镜像格式就不再说了,大家可以百度,很多博客都有说的。

发布了37 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Chen_qi_hai/article/details/104550104
今日推荐