标签:总结 框架 restart 基本 启动 内容 路径 命令行 oca
根文件系统制作过程大致分为两步:
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
标签:总结 框架 restart 基本 启动 内容 路径 命令行 oca
原文地址:https://www.cnblogs.com/lztutumo/p/13336364.html