最近学习自己建立文件系统,遇到很多问题,同一个方法并不是对每个人都可用的,下面把我移植的过程记录下来,希望对大家有所帮助。
其中主要涉及到的主要部分:
1,文件系统启动过程分析
2,busybox移植
3,文件系统建立和使用mdev创建设备文件
开发环境:ubuntu系统,busybox版本:busybox-1.17.2-20101120.tgz 编译环境:gcc-4.4.4 平台:飞思卡尔imx53 arm cortex a8内核
1,文件系统启动过程
在内核启动的最后过程就是把控制权转移到文件系统,文件系统说白了就是一个循环执行的应用程序,这个应用程序就是我们所要移植的busybox。
内核启动最后要启动init进程,init进程在内核源码中的init/Main.c中定义
执行顺序是:kernel_init()-------->init_post()------->run_init_process("/sbin/init");
这里需要注意,在韦东山那本书中的open console实在init post中定义的,在我用的内核中在kernel_init中定义的,其实执行顺序是一样的。
系统最后执行的是run init process 这个进程创建成功后将不会返回,将控制权交给文件系统了,这个进程创建的进程是/sbin目录下的init,
init是个连接文件,连接到bin/busybox,实际运行的是busybox的init,关于busybox的init可以参考韦东山书中的部分学习,
运行busybox的init时,系统会读取etc下的配置文件inittab,这个配置文件中的内容如下:
#/etc/inittab
::sysinit:/etc/init.d/rcS //这一个是系统第一次运行时会运行位于init.d下的rcS脚本对系统进行初始化设置,包括设置ip,加载mdev等
::askfirst:-/bin/sh //这个是系统运行的主要程序,即运行/bin目录下的shell,不断循环运行,
::ctrlaltdel:/sbin/reboot //这是系统检测到ctrl alt del信号时,重启
::shutdown:/bin/umount -a -r//关机操作,卸载所有文件系统
注:有的书中这里写的是console::askfirst:。。。。我在运行的时候出现can not open console。。。。我怀疑可能是dev下面的console没有挂载上,或者系统的dev
目录又被重新挂载,导致console文件找不到造成,最后将console去掉即可
2,busybox移植:
1、修改Makefile
进入busybox的解压目录,
vim Makefile,将
ARCH ?= $(SUBARCH) 改为
ARCH ?= arm
CROSS_COMPILE ?=改为
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-(根据你自己的路径定义)
2、配置busybox的相关工具
执行 make menuconfig,进入配置菜
- Busybox Settings --->
- Build Options --->
- [*] Build BusyBox as a static binary (no shared libs) //这里编译为静态库
- [ ] Build with Large File Support //这里要去掉这一项
- () Cross Compiler perfix //设置交叉编译器路径
- Installation Options --->
- [*] Don't use /usr //不安装到系统的usr目录下,以解压目录下的_install来代替
- Linux System Utilities --->
- [ ] mkfs_ext2
- [ ] mkfs_vfat //这两项不选,否则编译会报错
- 别的选项工具自己需要进行选择
- Miscellaneous Utilities --->
- [ ] ionice //去掉,否则编译报错
- 其他选项根据个人需要
- Networking Utilities --->
- 可以去除一些不必要的选项
3、编译
我的直接一遍编译通过了,有问题大家可以百度,一般busybox配置默认就可以了
4,安装busybox
在根目录下创建myrootfs目录
在busybox目录下运行 make CONFIG_PREFIX=/myrootfs install
执行完后就在myrootfs目录下面生成bin,sbin usr linuxrc等,你可以查看sbin目录下的文件 ls -l,可以看出所有的命令都是连接到bin目录下的busybox文件,busybox为主要的应用程序
3,创立文件系统
可以先创建一个工作目录,如myroot,在工作目录下 创建以下目录:bin sbin dev etc lib home root usr var proc mnt tmp sys
执行 mkdir bin sbin dev etc lib home root usr var proc mnt tmp sys
在etc下面要写两个文件fstab inittab 和一个文件夹init.d
(a) fstab的内容是:
- proc /proc proc defaults 0 0
- tmpfs /tmp tmpfs defaults 0 0
- sysfs /sys sysfs defaults 0 0
- tmpfs /dev tmpfs defaults 0 0
(b) fstab文件的作用
文 件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount /directoryname"命令来加载一个文 件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mount、umount的等命令都利用该程序。
inittab的内容是:
- #/etc/inittab
- ::sysinit:/etc/init.d/rcS
- ::askfirst:-/bin/sh
- ::ctrlaltdel:/sbin/reboot
- ::shutdown:/bin/umount -a -r utdown:/bin/umount -a -r
(c) init.d/rcS文件的内容:
- #!/bin/sh
- ifconfig eth0 192.168.1.17
- mount -t tmpfs mdev /dev
- mkdir /dev/pts
- mount -t devpts devpts /dev/pts
- mount -t sysfs sysfs /sys
- mount -a
- echo /sbin/mdev > /proc/sys/kernel/hotplug
- mdev -s //扫描系统中设备,在dev下面创建设备节点,这个命令也可以自己手动输入
- echo yuhaibin168_busybox
(d)在/dev下建立设备节点:Console null
- mknod dev/console c 5 1
- mknod dev/null c 1 3
-
(e)mdev.conf文件,这里包括系统mdev中配置,不过可有可无
- # Note: the first field is a regex matcher
# Syntax: %s %d:%d %s
# devices user:group mode
null 0:0 666
zero 0:0 666
grsec 0:0 660
urandom 0:0 444
console 0:5 600
fd0 0:11 660
hdc 0:6 660
kmem 0:9 640
mem 0:9 640
port 0:9 640
ptmx 0:5 660
sda[0-9] 0:6 660
sdb[0-9] 0:6 660
hda[0-9] 0:6 660
ttyS[0-9] 0:14 640
tty[0-9] 0:0 660
tty.+ 0:5 660
-
(f),还需要创建动态库,将交叉编译环境中gcc中的glibc库移植到开发板
只需要进入arm-linux/lib ,执行cp *.so* /myrootfs -d 其中-d是将连接文件指向文件也复制过去就可以
我的开发板中glibc库是/opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi/multi-libs/armv7-a/lib (g),一些脚本命令,比如ldd ldconfig命令可以通过复制到相应的目录下执行,网上都有教程,每个人需求不同,按自己需求可以添加.
上面就是文件系统创建个一个完整过程,在我这个开发板只需要将所有的文件打包成rootfs.tar.bz2 然后就可以烧写进入系统,运行没有问题.
经过这两天的学习linux文件系统,学到很多东西,同时也参照了很多博友的文章,在此表示感谢。