roofs 根文件系统简介制作(下)
1.根文件系统简介
根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。文件系统是对一个存储设备上的数据和元数据进行组织的机制。这种机制有利于用户和操作系统的交互。文件是用户和操作系统之间交互的主要工具。
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。
接下来以busybox-1.30.1版本为例实现根文件系统制作。
2.根文件系统制作
开发平台:ubuntu18.04.6 开发板:Cortex-A9 tiny4412 BusyBox版本:1.30.1 交叉编译器:arm-linux-gcc |
2.1 现在busybox源码,配置环境,编译源码
(1)下载busybox源码,解压到用户目录下。
[wbyq@wbyq src_pack]$ tar xvf /mnt/hgfs/ubuntu/software_pack/busybox-1.30.1.tar.bz2
(2)配置编译环境
[wbyq@wbyq src_pack]$ cd busybox-1.30.1/ [wbyq@wbyq busybox-1.30.1]$ make menuconfig Settings ---> (arm-linx-) Cross compiler prefix (NEW) (/home/wbyq/src_pack/rootfs) Destination path for 'make install'
配置好后保存退出,make编译。
2.2 编码源码
[wbyq@wbyq busybox-1.30.1]$ make
2.2.1 编译错误1
编译过程中若出现以下错误,则重新打开配置菜单,将syncfs屏蔽即可。
[wbyq@wbyq busybox-1.30.1]$ make menuconfig
修改完成后保存退出,再次重新编译。
2.2.2 编译错误2
编译过程中若出现以下错误,则重新打开配置菜单,将setns屏蔽即可。
[wbyq@wbyq busybox-1.30.1]$ make menuconfig
解决错误后重新编译安装。
[wbyq@wbyq busybox-1.30.1]$ make && make install -j8
编译安装成功。
2.3 完善根文件系统
进入到rootfs安装目录下,进行根文件系统完善。
[wbyq@wbyq busybox-1.30.1]$ cd /home/wbyq/src_pack/rootfs/ [wbyq@wbyq rootfs]$ ls bin linuxrc sbin usr
2.3.1 参考ubuntu根目录,创建必要目录
[wbyq@wbyq rootfs]$ mkdir etc lib lost+found proc snap tmp boot home media root srv cdrom mnt run dev opt sys
2.3.2 创建必要文件
创建 etc/profile 文件、 etc/init.d 目 录、 etc/init.d/rcS 文件
[wbyq@wbyq rootfs]$ touch etc/profile [wbyq@wbyq rootfs]$ mkdir etc/init.d [wbyq@wbyq rootfs]$ touch etc/init.d/rcS [wbyq@wbyq init.d]$ chmod +x rcS
2.3.3 完善etc目录
[wbyq@wbyq rootfs]$ cp /etc/passwd etc/ [wbyq@wbyq rootfs]$ cp /etc/group etc/ [wbyq@wbyq rootfs]$ cp /etc/fstab etc/ [wbyq@wbyq rootfs]$ cp ../busybox-1.30.1/examples/inittab etc/
2.3.4 修改 inittab 文件
修改 etc/inittab文件,只保留下面内容:
::sysinit:/etc/init.d/rcS #设置初始化执行的文件 #需要加上 console askfirst 表示需要按下回车才可以进入系统 #respawn 表示开机直接进入系统 console::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot #指定重启命令 ::shutdown:/bin/umount -a -r #指定关机时执行的命令
2.3.5 编写/etc/init.d/rcS启动脚本文件
mount -a mkdir /dev/pts mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s /bin/hostname wbyq #设置主机名称
rcS文件相关命令介绍
mount -a
mkdir /dev/pts
/dev/pts 是远程登陆(telnet,ssh 等)后创建的控制台设备文件所在的目录。由于可能有好几千个用户登陆,所以/dev/pts 其实是动态生成的, 不象其他设备文件是构建系统时就已经产生的硬盘节点.
mount -t devpts devpts /dev/pts
内核虚拟文件。和 proc 一样,Linux 提供给管理员通过文件系统和内核进行沟通( 读\写)的一种渠道。 pts 是远程虚拟终端。 devpts 即远程虚拟终端文件设备。 通过/dev/pts 可以了解目前远程虚拟终端的基本情况。
echo /sbin/mdev > /proc/sys/kernel/hotplug
linux系统对于热插拔事件的产生默认都是调用 /sbin/hotplug, 该程序通过加载驱动程序, 创建设备节点,挂载分区等。 如果系统中不是/sbin/hotplug 来执行,而是 mdev,那么用户应当在早期启 动的时候将改执行档( 包含绝对位置)设置进去,于是有了上面的echo/sbin/mdev> /proc/sys/kernel/hotplug 我们可以在脚本中注释掉该命令行,重新开机后 cat/proc/sys/kernel/hotplug 就会发现返回来的是/sbin/hotplug 说明系统默认都是调用这个。 这个配置在内核编译的时候写好的在内核 目录下的.config可以看到有个配置叫做 CONFIG_UEVENT_HELPER_PATH=“/sbin/hotplug”
mdev -s #生成设备节点
/bin/hostname wbyq #设置主机名称
2.3.6 编写 profile 文件 gedit etc/profile
USER="id-un" #id -un 是获得当前登陆的用户名称,USER="`id -un`" 则是将 id -un 的返回值赋值给变量 USER LOGNAME=$USER #用于显示用户名称 PS1='[\u@\h \W]\$ ' #命令行样式环境变量, 查看系统命令行样式 echo $PS1 PATH=$PATH HOSTNAME='/bin/hostname' export USER LOGNAME PS1 PATH HOSTNAME
2.3.7 拷贝必要动态库文件
[wbyq@wbyq rootfs]$ cp ../arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/* ./lib/ -rfdv [wbyq@wbyq rootfs]$ cp ../arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/lib/* ./lib/ -rfdv [wbyq@wbyq rootfs]$ cp ../arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/* ./lib/ -rfdv
2.3.8 完善dev目录,创建设备节点
[wbyq@wbyq rootfs]$ sudo mknod dev/null c 1 3
2.4 设置NFS共享
添加NFS共享目录
[wbyq@wbyq rootfs]$ sudo vim /etc/exports /home/wbyq/src_pack/rootfs *(rw,no_root_squash,sync,insecure)
2.5 配置网络
2.6 IP设置
若开发板和电脑直连,则可设置为静态IP方式,若是经过路由器,则可使用动态IP方式。
3.配置开发板环境变量
setenv bootargs root=/dev/nfs nfsroot=192.168.10.123:/home/wbyq/src_pack/rootfs ip=192.168.10.106:192.168.10.123:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=S702
192.168.1.123:/home/xsw/linux_work/rootfs —服务器 IP 与共享目 录
192.168.1.106 —开发板 IP 地址
192.168.1.123:192.168.1.1:255.255.255.0 —主机 IP、 子网掩码、 网关
在uboot命令行执行,配置完后重启开发板。
3.1 开发板启动挂载NFS失败问题
若开发板引导内核后出现无法通过NFS挂载rootfs,则是由于开发板nfs版本协议和ubuntu的nfs协议不兼容。
解决办法:修改/etc/default/nfs-kernel-server 文件,添加协议版本支持。
[wbyq@wbyq rootfs]$ sudo vim /etc/default/nfs-kernel-server RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
保存后重启NFS服务,重启开发板。
3.2开发板启动挂载进入命令行报错
原因:主要是etc/fstab文件格式不对,fstab文件报错磁盘挂载信息。
解决办法:修改rootfs下的/etc/fstab文件
[wbyq@wbyq rootfs]$ gedit etc/fstab /dev/mapper/vg_wbyq-lv_swap swap swap defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
启动成功
至此,根文件系统制作完成,开发板启动成功。接下来将正式进入驱动开发之旅。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !