1.1在嵌入式系统中的根文件系统与桌面版的根文件系统文件基本上类似,所以用Ubuntu中根文件系统问模板,进行分析:
1.1.1、bin sbin linuxrc 是必须的,但是这三个目录以及里面的文件都是移植busybox并安装的时候由busybox生成的
1.1.2、etc 是很关键很重要的一个。目录中的文件都是运行时配置文件,都是直接或者间接的被linuxrc所调用,完成操作系统的运行时配置。Etc目录是制作rootfs的关键。
1.1.3、sys proc目录是必须的。在最小根文件系统中是不可省略的,但是这两个只要创建了空文件夹即可,里面是没有东西的,也不用有东西,当系统运行起来之后里面会有文件,是linux启动起来之后用软件虚拟出来的,这两个目录的主要目的就是让我们通过这两个目录以及目录里面的文件能够看到linux内核运时候的一些状态,里面的文件就是内核运行状态的一个展示,他并不是实实在在的文件。这两个文件也是和驱动有关的,属于linux中的虚拟文件系统
1.1.4、usr 里面就是当前用户可以装的一些东西,这个东西不用我们创建,后面busybox会自动创建
1.1.5、dev 是必须的。在Linux系统中/dev/xxx就表示一个硬件设备,我们要操作这个硬件时就是open打开这个设备文件(linux中一切皆是文件,因此一个硬件设备也被虚拟化成一个设备文件来访问),然后read/write/ioctl操作这个设备,最后close关闭这个设备,在最小跟文件系统中/dev目录是必须的,这里面有一两个设备文件是rootfs必须的。
1.1.6、lib也是rootfs中很关键的一个目录,不能省略。Lib目录下放的是当前操作系统中的动态库文件与静态链接库文件。我们主要是问了动态链接库。
2.1.1、在主机Ubuntu环境下进行开发,再通过NFS的方式进行远程挂载。主机Ubuntu中VFS服务器的具体配置,请参看《朱老师嵌入式开发环境搭建》。
2.1.2、根文件系统的存在形式有两种,一种是文件夹的形式,这种形式主要是进行开发的时候的一种存在方式。另一种方式是可烧录的形式,这种就是产品的烧录文件,这个文件就是通过根文件系统制作工具将文件夹形式的根文件系统制作成镜像的。 这里我们的开发方式就是使用文件夹的形式的,关于制作镜像的方法,后面会进行介绍。
3.1.1、在linux内核中已经集成了NFS的一套的功能,是需要通过make menuconfig进行选配一能够达到我们想要的那种效果的。具体的配置方式参看文档。
3.1.2、设置好内核以后,还需要对uboot中的对内核的传递参数进行修改将,根文件系统的挂载点修改为NFS方式。具体设置参看下面的
setenv bootargs root=/dev/nfs
nfsroot=192.168.1.141:/root/porting_x210/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off
init=/linuxrc console=ttySAC2,115200
4.1、我们这里将根文件系统的制作过程分为以下几步(自己的理解,不是固定的)
(1)、busybox的移植
(2)、在/etc目录下添加inittab文件
(3)、在/etc/init.d目录下添加rcs文件
(4)、在/etc目录下添加fstab文件
(5)、添加在/etc/fstab文件中的对应的挂载点文件夹
(6)、在/etc/init.d/rcs文件中添加有关mdev的两行配置代码
通过上面的这6步就可以实现一个简单的文件夹形式的根文件系统啦,下面对每个步骤进的解析与操作方法进行讲解
4.1.1、busybox的移植
4.1.1.1、busybox的获取
(1)、busybox是一个开源项目,所以源代码可以直接从网上下载。
(2)、busybox的版本差异不大,版本新旧无所谓。
(3)、下载busybox可以去linuxidc等镜像网站,也可以去www.busybox.net官方网站下载。
4.1.1.2、busybox的编译与安装
修改Makefile
(1)ARCH = arm
(2)CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-none-linux-gnueabi-
make menuconfig进行配置
Busybox Settings--->
Build Options--->
[*]Build BusyBox as a static binary(no shared libs)
Busybox Library Tuning--->
[*]vi-style line editing commands
[*]Fancy shell prompts
Linux Module Utilities--->
[ ]Simplified modutils
[*]insmod
[*]rmmod
[*]lsmod
[*]modprobe
[*]depmod
Linux System Utilities--->[*]mdev
[*]Support /etc/mdev.conf
[*]Support subdirs/symlinks
[*]Support regular expressions substitutions when renaming dev
[*]Support command execution at device addition/removal
[*]Support loading of firmwares
(2)make -j4
Busybox的安装
(1)在menuconfig中有对安装目录的设置,修改为我们的NFS服务器导出的rootfs的路径,也就是安装在我们的rootfs的文件夹下面
(2)make install
4.1.2、在/etc目录下添加inittab文件
(1)inittab的工作原理就是被/linuxrc(也就是busybox)执行时所调用起作用。我们知道Linux内核启动的最后是启动init进程,二init进程就是根据/etc/inittab这个文件来在不同的运行级别启动启动相应的进程或者执行相应的操作的。
(2)inittab在/etc目录下,所以属于一个运行时配置文件,是文本格式的(内容是由一系列的遵照一个格式组织的字符组成的),实际工作的时候busybox会(按照一定的格式)解析这个inittab文本文件,然后根据解析的内容来决定要怎么工作。
(3)busybox究竟如何完成解析并且解析结果如何去工作(busybox中实现/etc/inittab的原理)并不是我们的目标,我们的重点是inittab的格式究竟怎样的?我们看到一个inittab后怎么去分析这个inittab对启动的影响。
#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
4.1.3、在/etc/init.d目录下添加rcs文件
(1) /etc/init.d/rcS文件是linux的运行时配置文件中最重要的一个,其他的一些配置都是由这个文件引出来的。这个文件可以很复杂也可以很简单,里面可以有很多的配置项。
文件内容如下:
#!/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
ifconfig eth0 192.168.1.10
(2)这个文件需要详细的介绍一下
(2.1)PATh=XXX
首先从shell脚本的语法角度分析,这一行定义了一个变量PATH,值等于后面的字符串
后面用export导出了这个PATH,那么PATH就变成了一个环境变量。含义是操作系统去执行程序时会默认到PATH指定的各个目录下去寻找。如果找不到就认定这个程序不存在,如果找到了就去执行它。将一个可执行程序的目录导出到PATH,可以让我们不带路径来执行这个程序。最终的效果就是我们直接输入命令(如:ls、cd等)时不用带路径。但是这个文件中如果不写着一条语句,也是可以直接输入命令的,因为在busybox中已经硬编码的将路径赋值给了PATH,我们可以从busybox中的源代码中找到
(2.2)runlevel 表示系统的运行级别,与我们相关性不大,详细网上查找资料,这里不做赘述
(2.3)umask 表示用户默认创建的文件的权限
(2.4)mount -a 完成文件系统的挂载,在busybox中mount -a时busybox会去查找一个文件/etc/fstab文件,这个文件按照一定的格式列出来所有应该被挂载的文件系统(包括了虚拟文件系统)
(2.5)接下来的两条语句表示的
mdev是udev的嵌入式简化版本,udev/mdev是用来配合linux驱动工作的一个应用层的软件,udev/mdev的工作就是配合linux驱动生成相应的/dev目录下的设备文件。在rcS文件中没有启动mdev的时候,/dev目录下启动后是空的;在rcS文件中添加上mdev有关的2行配置项后,再次启动系统后发现/dev目录下生成了很多的设备驱动文件。/dev目录下的设备文件就是mdev生成的,这就是mdev存在的效果与意义
(2.6)hostname
hostname是linux中的一个shell命令。命令(hostname xxx)执行后可以用来设置当前系统的主机名为xxx,直接hostname不加参数可以显示当前系统的主机名。
/bin/hostname -F /etc/sysconfig/HOSTNAME -F来指定了一个主机名配置文件(这个文件一般文件名叫hostname或者HOSTNAME)。
关于这一项我们可以做下面的实验,在/etc 目录下创建文件夹sysconfig,然后在sysconfig文件夹下面创建文件HOSTNAME,在HOSTNAME文件中输入我们想要的主机名,然后重新开机启动,应该会在控制台的提示符显示我们的主机名(注意前提是在/etc目录下添加profile文件)
(2.7)ifconfig
有时候我们希望开机后进入命令行时ip地址就是一个指定的ip地址(譬如192.168.1.30),这时候就可以在rcS文件中ifconfig eth0 192.168.1.30
4.1.4、在/etc目录下添加fstab文件
该文件定义了要挂载的文件以及,文件内容如下:
# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
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.1.5、添加在/etc/fstab文件中的对应的挂载点文件夹
在执行fstab文件的时候,会在rootfs中寻找挂载点,所以现在就要在rootfs中添加挂载点,也就是添加问价夹 proc sys var tmp dev
4.1.6、在/etc/init.d/rcs文件中添加有关mdev的两行配置代码
上面已经阐述,有关mdev的两行配置代码的作用
5.1.要实现的效果就是开机时输入用户名,然后输入用户密码,匹配成功后进入系统操作界面。实现这样的效果就需要在inittab文件中做文章,在前面做的inttab文件中有一项
::askfirst:-/bin/sh
这个配置项作用就是当系统启动后就去执行/bin/sh,执行这个就会出现命令行。因此我们这样的安排就会直接进入命令行而不会出现登录界面。我们要出现登录界面,就不能直接执行/bin/sh,而应该执行一个负责出现登录界面并且负责管理用户名和密码的一个程序,busybox中也集成了这个程序(就是/bin/login和/sbin/gettty),因此我们要在inittab中用/bin/login或者/sbin/getty去替代/bin/sh。
::askfirst:-/bin/login
此时的效果就是出现登陆界面,但是不知道用户名与密码,因为我们此时根本没有添加用户名与密码。
5.2.用户名与密码的设置
用户名和密码的设置是和登录程序有关联的,但是/bin/login和/sbin/getty在用户名和密码的管理上是一样的。其实常见的所有的linux系统的用户名和密码的管理几乎都是一样的。
密码一般都是用加密文字的,而不是用明文。意思就是系统中的密码肯定是在系统中的一个专门用来存密码的文件中存储的,用明文存密码有风险,因此linux系统都是用密文来存储密码的。
添加用户名与密码的方法就是 添加passwd与shadow文件
(1)为什么用户名和密码不对?因为我们根本没有为root用户设置密码。
(2)linux系统中用来描述用户名和密码的文件是passwd和shadow文件,这两个文件都在etc目录下。passwd文件中存储的是用户的密码设置,shadow文件中存储的是加密后的密码。
(3)我们直接复制ubuntu系统中的/etc/passwd和/etc/shadow文件到当前制作的rootfs目录下,然后再做修改即可。修改方法,将除了我们想要的那个用户名,与用户名密码即可
Passwd文件的内容,注意这里执行的脚本不能是bash 而是sh ,因为在busybox中只支持sh脚本
Shadow文件内容,下main所标注的就是使用的密文的root密码。文件格式如下:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
(4)/etc/passwd和/etc/shadow修理好后,shadow中默认有一个加密的密码口令,这个口令和你拷贝的shadow本身有关,像我的ubuntu中root用户的密码就是root,因此复制过来后登陆时的密码还是root。而我们想要的最终效果是登陆系统以后我们自己设置用户名密码。busybox中因为没有普通用户,所以做法是:默认root用户如果加密口令是空的则默认无密码直接登录。等我们登陆了之后还是可以用passwd root给root用户设置密码。
所以此时要将shadow文件中的密文密码删除掉,效果就是输入 root 用户名直接进入到系统的命令行界面,此时我们可以使用passwd命令给root用户进行密码的设置
Passwd root
输入密码
确认
修改成功
再次启动时的用户名密码就是我们设置的
后面做项目会发现,inittab中最常见的用于登录的程序不是/bin/login,反而是/sbin/getty。这两个的差别不详,但是在busybox中这两个是一样的。这两个其实都是busybox的符号链接而已。因此不用严格区分这两个。我们可以在inittab中用getty替换login程序来实现同样的效果。
注明:本博客是根据朱有鹏老师的视频所作的总结