关键词:
根文件系统制作过程大致分为两步:
1)用busybox构建基本的框架
2)添加必要目录及文件,比如etc目录及目录中的配置文件
内核挂载根文件系统到进入命令行的过程:
1)内核找到根文件系统路径后,首先加载运行init参数指定的进程1,如init=/linuxrc,运行根文件系统中的/linuxrc,使得内核转到用户态;
2)然后linuxrc会解析/etc/inittab文件,inittab文件中是一些条目,这些条目指明了在某种状态下会执行哪些操作,比如一个简单的inttab文件如下,其中sysinit指明系统启动或重新启动时会执行脚本文件/etc/init.d/rcS文件、shutdown指明系统关机时会卸载之前挂载的文件系统
inittab文件 |
#first:run the system script file ::sysinit:/etc/init.d/rcS ::askfirst:-/bin/sh -->打印Please press Enter to activate this console. ::ctrlaltdel:-/sbin/reboot #umount all filesystem /* 在关机的时候,执行/bin/umount -a -r 也就是关机之前卸载之前挂载的文件系统 */ ::shutdown:/bin/umount -a -r #restart init process ::restart:/sbin/init |
3)linuxrc解析完inittab文件后,会执行sysinit指定的操作,即执行脚本文件/etc/init.d/rcS,如下是一个rcS文件,这个rcS文件大致做的工作是:导出几个环境变量、挂载/etc/fstab文件中所列出的文件系统、获取用户登入名,设置网口ip地址等;
/etc/init.d/rcS文件 |
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S prevlevel=N umask 022 //导出环境变量 export PATH runlevel prevlevel //挂载/etc/fstab文件中所列出的文件系统 mount -a echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s // /etc/sysconfig/HOSTNAME文件中保存了用户登入名 /bin/hostname -F /etc/sysconfig/HOSTNAME ifconfig eth0 192.168.1.10 |
/etc/fstab文件,这个文件指明将具体文件系统挂载在哪个目录下,这些挂载目录需要我们手动创建 |
# <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 |
4)登入用户名密码设置
linuxrc执行完/etc/init.d/rcS脚本文件后,就会去执行inittab文件中respwan和askfirst字段指定的操作,如上inittab文件中askfirst指定的操作是执行/bin/sh(::askfirst:-/bin/sh),这个程序是跳过用户登入步骤,直接进入命令行,因此需要修改/bin/sh为/bin/login或者/sbin/gettty;然后添加/etc/passwd和/etc/shadow,这两个文件可以直接从ubuntu拷贝,在开发板启动后,通过passwd root去修改登入密码;
5)拷贝用户空间应用程序运行时所需的动态库文件到lib目录下,这些文件在交叉编译工具链目录下/usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/lib。
至此,一个简单的根文件系统构建完成,可以被内核挂载并启动进入命令行。
根据挂载根文件系统时的执行过程,大概清楚构建根文件系统大概需要做如下工作:
1)我们需要用busybox构建出根文件系统的原始模板,内核可以挂载这个原始模板,并运行/linuxrc程序;
2)创建/etc/inittab文件、/etc/init.d/rcS文件;
3)创建用户登入所需文件/etc/passwd和/etc/shadow;
4)创建文件系统挂载目录/proc、/sys、/var、/tmp、/dev;
5)创建lib目录,从交叉编译工具链目录/usr/local/arm-2009q3/arm-none-linux-gnueabi/libc/lib拷贝动态库文件到lib目录下
一、用busybox构建根文件系统的原始模板
具体过程参考https://blog.csdn.net/Jason_416/article/details/105802347博客
1、需要选择上静态编译,不然内核运行/linuxrc时会报错。
2、编译busybox
Make -j4
如下,busybox编译成功
3、将编译好的busybox安装到指定的目录(根文件系统目录)
Make install
安装后,安装目录内容如下
4、将busybos的安装目录添加到/etc/exports文件中,以使得开发板内核启动时可以通过nfs挂载这个根文件系统
添加完后,重启nfs
/etc/init.d/nfs-kernel-server restart
5、配置uboot的bootargs,使得kernel启动时到上述安装目录挂载根文件系统
启动后,效果如下
出现上述错误,是由于根目录下还没有创建一些必要的文件
6、在根文件目录下添加必要的目录和文件
1)创建并完善etc目录
添加/etc/inittab文件
#first:run the system script file ::sysinit:/etc/init.d/rcS #::askfirst:-/bin/sh #ttySAC2::sysinit:/bin/login ttySAC2::respawn:/sbin/getty -L ttySAC2 115200 vt100 ::ctrlaltdel:-/sbin/reboot #umount all filesystem ::shutdown:/bin/umount -a -r #restart init process ::restart:/sbin/init |
添加/etc/fstab文件
# <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 |
创建/etc/init.d目录并添加/etc/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 |
添加用户名密码相关文件/etc/sysconfig/HOSTNAME,文件中保存用户登入名
/etc/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=‘[$USER@$HOSTNAME]# ‘ PATH=$PATH
HOSTNAME=`/bin/hostname` export USER LOGNAME PS1 PATH |
/etc/ passwd文件
root:x:0:0:root:/root:/bin/sh |
/etc/shadow文件
root:N06xh3ETHkhFE:10957:0:99999:7::: //加密的密码,明文密码是123456 |
2)创建目录/proc、/sys、/var、/tmp、/dev、/lib
3)从交叉编译工具链拷贝库文件到/lib目录,如下
至此,可以登入进入命令行
本文仅是本人在熟悉根文件系统框架过程中的记录,分析总结出来以便自己更好的理解,大家勿喷哈。参考了网上的博客没有一一列出。如有侵权,请联系删除。
参考博客:
https://blog.csdn.net/Jason_416/article/details/105802347
朱有鹏老师视频:http://t.elecfans.com/topic/8.html
构建根文件系统之根文件系统
在构建根文件系统之busybox中,我们已经实现了配置,编译,安装busybox。即那个init程序的来源。首先在pc看一下,/dev/console 和/dev/null的具体信息:执行ls/dev/console /dev/nullcrw-------1rootroot5,16月2708:06/dev/console //字符设... 查看详情
根文件系统笔记(代码片段)
《2.uboot和系统移植-第19部分-2.19.根文件系统构建实验及过程详解》 欢迎访问《朱老师物联网大讲堂》官方网站 www.zhulaoshi.org 以获取本课程更多信息第一部分、章节目录2.19.1.根文件系统的构建路线2.19.2.busybox的移植实战2.19.3... 查看详情
根文件系统构建
...ux“三巨头”已经完成了2个了,就剩最后一个rootfs(根文件系统)了,本章我们就来学习一下根文件系统的组成以及如何构建根文件系统。这是Linux移植的最后一步,根文件系统构建好以后就意味着我们已经拥有了一个... 查看详情
根文件系统构建(yocto方式)
本章有独立的教程,请参考《【正点原子】I.MX6UYocto构建根文件系统V1.0.pdf》! 查看详情
linux基于busybox移植rootfs根文件系统(代码片段)
文章目录1.前言2.下载Busybox3.编译Busybox4.向rootfs根文件系统添加lib库5.根文件系统初步测试6.完善rootfs根文件系统7.根文件系统最终测试8.移植过程错误汇总1.前言我们所熟悉的Linux主要由三部分组成:uboot、LinuxKernel、rootfs(根文... 查看详情
busybox构建根文件系统和制作ramdisk
定制根文件系统的方法很多,最常用的是使用BusyBox来构建定制根文件系统。它集成压缩了Linux的许多工具和命令,可以使用户迅速方便地建立一套相对完整、功能丰富的文件系统,其中包括大... 查看详情
linux系统移植:根文件系统构建(代码片段)
文章目录Linux系统移植:根文件系统构建一、什么是根文件系统二、根文件系统目录2.1子目录bin2.2子目录dev2.3子目录etc2.4子目录lib2.5子目录mnt2.6子目录proc2.7子目录usr2.8子目录var2.9子目录sbin2.10子目录sys2.11子目录opt三、BusyBox创... 查看详情
linux系统移植:根文件系统构建(代码片段)
文章目录Linux系统移植:根文件系统构建一、什么是根文件系统二、根文件系统目录2.1子目录bin2.2子目录dev2.3子目录etc2.4子目录lib2.5子目录mnt2.6子目录proc2.7子目录usr2.8子目录var2.9子目录sbin2.10子目录sys2.11子目录opt三、BusyBox创... 查看详情
busybox最小根文件系统(代码片段)
目录busybox(三)最小根文件系统引入构建终端构造inittab配置应用程序构建C库制作映像文件yaffstitle:busybox(三)最小根文件系统tag:armdate:2018-11-1417:57:08---busybox(三)最小根文件系统引入在busybox(一)浅析中,得出结论,一个最小的根文件系统... 查看详情
构建根文件系统之启动第一个程序(韦大仙)
...启动内核内核的目的:启动应用程序,而应用程序位于根文件系统上面。因此,需要构建根文件系统。只需完成以上几步,就可以在单板上搭建出一个linux系统来。问题:有那么多应用程序,内核启动后首相打开哪一个?内核启... 查看详情
rk3399系统移植|基于ubuntucore20.04构建根文件系统(代码片段)
...一、准备工作1.安装qemu2.下载ubuntu-corearm64版本二、修改根文件系统1.准备工作2.挂载根文件系统到主机3.更新4.安装语言包5.安装基本软件6.安装开发常用软件7.用户设置8.退出三、制作根文件系统镜像四、启动测试1.串口登录测试2.... 查看详情
rk3399系统移植|基于ubuntucore20.04构建根文件系统(代码片段)
...一、准备工作1.安装qemu2.下载ubuntu-corearm64版本二、修改根文件系统1.准备工作2.挂载根文件系统到主机3.更新4.安装语言包5.安装基本软件6.安装开发常用软件7.用户设置8.退出三、制作根文件系统镜像四、启动测试1.串口登录测试2.... 查看详情
正点原子i.mx6u-mini移植篇ubuntu-base根文件系统移植构建过程详解(代码片段)
...tu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上。一、ubuntu-base获取Ubuntu的移植非 查看详情
buildroot构建指南——根文件系统(rootfs)
...得转载。 目录(?)[+] Buildroot构建指南——根文件系统(Rootfs) Buildroot的Rootfs构建流程有一个大框架,有些部分是Buildroot系统做好的,有些细节需要自己来实现,Rootfs也是Buildroot中最为复杂的部分。Rootfs的构建... 查看详情
根文件系统制作过程(代码片段)
1.顶层Makefile中有根文件系统目标$(ROOTFS):$(ROOTFSDIR)#生成ROOTFS之前需要生成依赖ROOTFSDIR#使用脚本rootfsimg.sh来生成根文件系统的image $(HIDE)$(shell$(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsimg.sh$(ROOTFS_DIR)$(FSTYPE)$ROOTFS_ 查看详情
根文件系统挂载过程
目录注册挂载rootfs文件系统解压initramfs到rootfs中prepare_namespace挂载磁盘上的文件系统注册挂载rootfs文件系统首先是rootfs的注册和挂载,rootfs作为一切后续文件操作的基石。start_kernel vfs_caches_init mnt_init init_... 查看详情
buildroot构建指南——根文件系统(rootfs)
Buildroot构建指南——根文件系统(Rootfs) Buildroot的Rootfs构建流程有一个大框架,有些部分是Buildroot系统做好的,有些细节需要自己来实现,Rootfs也是Buildroot中最为复杂的部分。Rootfs的构建流程概述Rootfs的构建流程如图1所示... 查看详情
正点原子i.mx6u-mini移植篇ubuntu-base根文件系统移植构建过程详解(代码片段)
...tu是Linux系统的一种,可以简单的将Ubuntu理解为一个根文件系统,和我们用busybox、buildroot制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上。一、ubuntu-base获取Ubuntu的移植非常简单,... 查看详情