嵌入式Linux构建yaffs根文件系统
开发环境说明:
- ubuntu1404 i686
- 天嵌光盘里的交叉编译链(版本4.4.3)
- busybox-1.13.0(下载地址:https://busybox.net/downloads/)
(一)编译busybox
解压并进入:
tar xvf busybox-1.13.0.tar.bz2
cd busybox-1.13.0
加载默认配置:
make defconfig
打开图形配置:
make menuconfig
使用静态编译并且指明交叉编译器:
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs) # 指明使用静态编译
(arm-linux-) Cross Compiler prefix # 指明交叉编译器
Busybox Library Tuning --->
[*] Username completion # 控制台显示完整用户名
[*] Fancy shell prompts # shell信息提示
Networking Utilities --->
[ ] ip tunnel # 关闭ip隧道,要不然编译会出错
编译并安装:
make && make install
编译完成并安装后在当前目录下的_install
文件夹。
(二)构建yaffs2文件系统
创建yaffs2文件系统目录:
mkdir yaffs2
cd yaffs2
创建文件系统所需的一级目录:
mkdir dev etc home lib mnt opt proc root sys tmp var usr
创建必要的二级目录:
mkdir usr/lib usr/share etc/rc.d var/lib var/lock var/run var/tmp
拷贝busybx相关文件:
cp -rf /opt/embeded/busybox-1.13.0/_install/* ./
拷贝库文件:
cp /opt/EmbedSky/4.3.3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* ./lib/ -a
拷贝主机etc目录下的必要文件:
cp /etc/passwd /etc/group /etc/shadow ./etc
拷贝busybox的示例配置文件:
cp /opt/embeded/busybox-1.13.0/examples/bootfloppy/etc/* ./etc/ -rf
在etc目录下创建用于支持热拔插设备的节点配置文件mdev.conf
:
touch etc/mdev.conf
创建两个设备节点文件。
①由于内核执行到mdev时还没有构建dev目录,如果没有创建/dev/console就会打印警告Warning: unable to open an initial console;②内核启动过程中会将一些垃圾信息丢弃,此时就需要/dev/null设备。
mknod dev/console c 5 1
mknod dev/null c 1 3
系统启动过程中的必要配置文件修改:
系统启动过程中bootloader会传递参数 init=/linuxrc给内核main函数,所以在文件系统挂载后第一个执行的程序是linuxrc,该文件是busybox的链接文件,也就说系统启动挂载文件系统后执行的第一个程序是busybox,busybox首先解析文件/etc/inittab,这个文件指明了接下来要启动哪些程序。
修改文件etc/initab:
该文件初始内容如下:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
文件内容说明:inittab文件中每一个条目用来定义一个子进程,并确定他的启动方法。
第一条带有sysinit字段,表示系统启动后最先执行rcS文件并且只执行一次。
第二条带有respawn字段,表示直接运行-/bin/sh,无需输入用户名和密码
第三条带有askfirst字段,表示init进程先输出‘Please press Enter to actvie this console’,等待用户输入回车后在启动-/bin/sh,tty2是/dev目录下的串口设备文件,需要根据实际进行修改。
第四条表示按下快捷键ctrl+alt+delete时卸载所有设备
注意:第二条和第三条只能任选其一。
我们将该文件改为:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
# ttySAC0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
解析完毕inittcb文件后,接下来就是运行/etc/init.d/rcS这个脚本文件了,修改该文件如下:
#!/bin/sh
# shell命令的搜索路径
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 运行等级是单用户模式
runlevel=S
# 前一个等级为N表示没有前一个级别
prevlevel=N
# 权限位掩码
umask 022
# 将以上设置导出到环境中
export PATH runlevel prevlevel
# 指明了在shell中的提示符:[root@tq2440/]#
/bin/hostname tq2440
# 将文件/etc/fstab中指明的文件系统挂载到对应挂载点上
mount -a
# 如果目录pts不存在则创建
mkdir -p /dev/pts
# 从内存挂载一个虚拟的文件系统,作用是可以了解目前远程虚拟终端(telnet,ssh等)的基本情况
mount -t devpts devpts /dev/pts
# 使用mdev处理内核的热拔插事件
echo /sbin/mdev > /proc/sys/kernel/hotplug
# 建立dev目录,扫描/sys/class和/sys/block下所有块设备目录,如果在扫描到设备文件含有dev且文件中包含的时设备号,利用这些信息在/dev目录下创建设备节点文件
mdev -s
# 更新环境变量
source /etc/profile
修改/etc/mdev.conf文件内容如下:
sd[a-z]*[0-9] 0:0 0660 @(mount -t vfat -o iocharset=cp936 /dev/$MDEV /mnt/udisk)
sd[a-z]*[0-9] 0:0 0660 *(umount /mnt/udisk)
mmcblk[0-9]*p[0-9] 0:0 0660 @(mount -t vfat -o iocharset=cp936 /dev/$MDEV /mnt/sd)
mmcblk[0-9]*p[0-9] 0:0 0660 *(umount /mnt/sd)
修改/etc/fstab文件内容如下:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
修改/etc/profle文件内容如下:
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo -n "Processing /etc/profile... "
# 这条命令的意思是设置core文件大小为0,输出信息以及错误信息都不输出在显示器上。
#ulimit -S -c 0 > /dev/null 2>&1
# 获取用户名
USER="`id -un`"
# 登陆显示名
LOGNAME=$USER
# 在shell下的显示格式[root@tq2440 /]#
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "
# 加载环境变量
PATH=$PATH
# 主机名
HOSTNAME=`/bin/hostname`
# 导出到环境变量
export USER LOGNAME PS1 PATH
echo "Done"
echo
在用户登陆时系统会在/etc下寻找三个文件:passwd、shadow、group用来匹配相关信息。
修改/etc/passwd
,只保留root、daemon和bin这三行:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
修改/etc/shadow
,只保留root、daemon和bin这三行:
root:$6$EfJ5aZ0U$7GfeBkv0vfZj2pIQhoxc1HEpObTI2IA0jo57DJLIQkCNMkIsxbCKSXlr5Utnyp58uN70i.dN41J7kQb/fXsck/:17850:0:99999:7:::
daemon:*:16273:0:99999:7:::
bin:*:16273:0:99999:7:::
修改/etc/group
,只保留root、daemon和bin这三行:
root:x:0:
daemon:x:1:
bin:x:2:
到此根文件系统yaffs2制作完毕!
使用如下命令创建文件系统镜像:
mkyaffs2image yaffs2 yaffs2.bin
然后下载到NAND存放文件系统所在的分区就可以了。