超级详细讲解根文件系统rootfs的制作

?1 下载工具

busybox-1.21.1:或选用其他版本的 busybox,大同小异
下载地址:工具链接

☕2 构建目录

创建根文件系统目录,主要包括以下目录
/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin
/sbin /opt /sys /media
命令如下:

mkdir  ~/rootfs
cd  ~/rootfs
mkdir dev etc lib usr var proc tmp home root mnt bin sbin opt sys media

?3 使用busybox

解压 busubox
进入 busybox 目录,执行

make defconfig //使用默认配置 busybox,大部分的命令都会被选中 #
进入图形化配置页面,把下面的选项都勾上
make menuconfig
Busybox Setting ----->
Build Options ----->//选择将 busybox 进行静态编译,这样编译出来的 busybox 可以不依赖动态库
Busybox Library Tuning—>
[]Username completion
[
]Fancy shell prompts
[*]Query cursor position from terminal
保存退出

回到busybox目录下执行下面语句

make
make install
cp * ~/rootfs/ -arf

在 busybox 目录下cd 进入 _install 目录,里面有 bin sbin usr linuxrc 四个文件
将这三个目录或文件拷到第一步所建的 rootfs 文件夹下。

cp bin sbin usr linuxrc $HOME/rootfs -rfa

4 ?补全lib库

找到你工具链中的lib目录拷贝到你的根文件目录中,我用的是arm-linux-gcc的lib
在这里插入图片描述

5 ?生成etc配置文件

进入到 busybox-1.21.1下查找etc,并复制到你的根文件目录下
在这里插入图片描述
进入到etc/的inittab 删除第三行代码:tty2::askfirst:-/bin/sh

6 ?修改 etc/init.d/rcS 文件

init 进程通过 inittab 启动的第一个进程为此脚本,我们需要做以下修改#!/bin/sh

?6.1.根据 fstab 配置文件挂载相应的文件系统

/bin/mount -a

?6.2.配置 telnetd 服务器的时候需要以下文件夹及文件系统

/bin/mkdir -p /dev/pts
/bin/mkdir -p /dev/shm
/bin/mount -t devpts devpts /dev/pts
/bin/mount -t tmpfs tmpfs /dev/shm

?6.3.启动需要以下文件夹

/bin/mkdir /var/tmp
/bin/mkdir /var/modules
/bin/mkdir /var/run
/bin/mkdir /var/log

?6.4.在 lib 下创建相应文件夹(与当前内核版本相同),为驱动模块加载作准备

if ! [ -d /lib/modules ]; then
mkdir /lib/modules
fi
if ! [ -d /lib/modules/

(

u

n

a

m

e

r

)

]

;

t

h

e

n

m

k

d

i

r

/

l

i

b

/

m

o

d

u

l

e

s

/

(uname -r) ]; then mkdir /lib/modules/

(unamer)];thenmkdir/lib/modules/(uname -r)
fi

?6.5.自动在/dev 下创建设备节点

/sbin/mdev -s

init.d/rsc文件下的编写

#! /bin/sh
/bin/mount-a

/bin/mkdir -p /dev/pts
/bin/mkdir -p /dev/shm
/bin/mount -t devpts devpts /dev/pts
/bin/mount -t tmpfs tmpfs /dev/shm
/bin/mkdir /var/tmp
/bin/mkdir /var/modules
/bin/mkdir /var/run
/bin/mkdir /var/log

if ! [ -d /lib/modules ]; then
mkdir /lib/modules
fi
if ! [ -d /lib/modules/$(uname -r) ]; then
mkdir /lib/modules/$(uname -r)
fi

/sbin/mdev -s

?7 修改 etc/fstab 文件,填充以下内容

#device mount-point type options dump fask order
proc /proc proc defaults 0 0
ramfs /var ramfs defaults 0 0
ramfs /tmp ramfs defaults 0 0
none /sys sysfs defaults 0 0
none /dev ramfs defaults 0 0

?8 修改 profile

#1.初始化 PATH 环境变量及动态链接库路径
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
#2.初始化主机名以及当前工作路径
/bin/hostname qfedu
USER="`id -un`"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
PS1='[u@h W]#

☕9 用户名、密码文件创建

拷贝虚拟机上的/etc/passwd, /etc/group, /etc/shadow 到 rootfs/etc 下。

#cp /etc/passwd $HOME/rootfs/etc
#cp /etc/group $HOME/rootfs/etc
#cp /etc/shadow $HOME/ rootfs/etc

对以下三个文件修改,只保存与 root 相关的项(每个文件的第一行)只保留 passwd 第一行,为:

root:x:0:0:root:/root:/bin/sh

最后改成/bin/ash,PC 使用 bash 作为默认 shell,嵌入式系统不支持 bash,这里改为 sh 或 ash

只保留 group 第一行,为:
root:x:0:root

只保留 shadow 第一行,为:
root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::
(注意这个值不一定一样,各人密码不一样,这个值也不一样,这个的密码是六个1:
111111)这个文件在本地登录或者 ftp、telnet 登录时起作用

打开/etc/inittab
把第二行:::respawn:-/bin/sh
改为::respawn:-/bin/login //登录时需要用户名、密码验证
这样,以后登陆开发板时需输入用户名密码,同虚拟机相同
登陆后可以通过 passwd 命令修改密码或通过 adduser 增加新用户

这时我配置的结果
在这里插入图片描述

?10 根文件系统的烧写与验证

根文件系统的挂载通常有两种方式,一种是直接烧尽Emmc里面,一种是通过NFS网络文件系统远程挂载,这里采用NFS挂载的方式进行验证
首先在Ubuntu下配置rootfs远程挂载
sudo gedit /etc/exports

输入/home/edu/rootfs *(rw,sync,no_root_squash,no_subtree_check)在这里插入图片描述
重启NFS服务器:sudo /etc/init.d/nfs-kernel-server restart

11 使用uboot挂载根文件系统

启动开发板的uboot
执行以下命令:提供一个模板
模板:
setenv bootargs root=/dev/nfs nfsroot=(虚拟机路径),rsize=1024,wsize=1024 ip=(开发板 iP):(服务器 ip):(网关):255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200

执行后用:saveenv保存,重新启动开发板查看是否进入你的根文件系统

这是我的挂载场景:在这里插入图片描述

12 还原原始的根文件系统

执行下面两条语句并重启开发板

setenv bootargs root=/dev/mmcblk0p8 rw rootfstype=ext4 init=/linuxrc lcd=wy070ml tp=gslx680
saveenv

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>