用的目标板是ARM-Tiny6410,制作根文件系统所用的源码包是:busybox-1.22.1.tar.bz2
第一步:配置、编译Busybox
建立交叉编译环境和安装图形化配置的依赖工具Ncurses可参考龙芯1B开发板文档(在百度直接输入龙芯1B开发板文档即可)
图形化配置
首先把busybox-1.22.1.tar.bz2解压出来
#cd busybox-1.22.1
#make menuconfig
配置选择为:
Busybox Setings--->
General Configuration ---> (默认)
Build Options--->
[ ] Build Busybox as a static binary (no shared libs)
[*] Build shared libbusybox
(/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-)Cross Compiler prefix (需要编辑)
Installation Options("make install"behavior)---> (默认)
Busybox Library Turning--->
[*] vi-style line editing commands(NEW)
[*] Fancy shell prompts(NEW)
Init Utilities---> (默认)
[*]init
[*]Suport reading an inittab file
[*]Run commands with leading dash with controlling tty
[*]Support running init from within an initrd (not initramfs)
Miscellaneous Utilities-->
[ ] inoice
[ ] ubiattach
[ ] ubidetach
[ ] ubimkvol
[ ] ubirmvol
[ ] ubirsvol
[ ] ubiupdatevol
编译Busybox
配置完成后,编译Busybox:
# make clean all
安装到目录:
# make install
第二步:构建根文件系统
构建根文件目录:
# mkdir /root/rootfs
# cd /root/rootfs
#mkdir dev home proc tmp var etc lib mnt sys usr etc/rc.d
构建系统配置文件:
(在这里,我们需要注意的是以下的配置文件不是在Ubuntu操作系统的根目录下创建的。)
(1)etc/inittab文件
说明:inittab 文件是init进程的配置文件,系统启动后所访问的第一个脚本文件,后续启动的文件都由它指定。
# cd /root/ rootfs
# vi etc/inittab
添加如下内容:
::sysinit:/etc/rc.d/rc.sysinit //指定系统启动后首先执行的文件
#Example of how to put a getty on a seria line(for a terminal)
::respawn:-/bin/sh #no login(启动后进入shell环境)
#::respawn:/sbin/getty -L ttyS2 115200 vt100 #use login
#tty::respawn:-/bin/sh
#Stuff to do when restarting the init porcess
::restart:/sbin/init
#Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot //捕捉ctrl+alt+del键,重启文件系统
::shutdown:/bin/umount -a –r //当关机时卸载所有文件系统
::shutdown:/sbin/swapoff –a
(2)etc/rc.d/rc.sysinit文件
说明:这是一个脚本文件,可以在里面添加想自动执行的命令。以下命令配置环境变量、主机名、dev目录环境、挂接/etc/fstab指定的文件系统、建立设备节点与设置IP。
#vi etc/rc.d/rc.sysinit
添加如下内容
#!/bin/sh
#Set binary path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
#Config dev enviornment
mount -t tmpfs -o size=64k,mode=0755 tmpfs /dev
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
#mount all filesystem defined in /etc/fstab
echo "#mount all....."
/bin/mount -a
echo "#Starting mdev....."
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
#Set hostname
/bin/hostname "Loongson-gz"
export LAGNAME=root
#Set ip
#ifconfig eth0 192.168.3.123 up(根据自己的服务器的IP来修改即可)
ifconfig lo 127.0.0.1
(3)etc/fstab文件
说明:执行mount –a时挂接/etc/fstab指定的文件系统。
#vi etc/fstab
添加如下内容
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
tmpfs /mnt tmpfs defaults 0 0
tmpfs /root tmpfs defaults 0 0
tmpfs /var/log tmpfs defaults 0 0
(4)etc/profile文件
说明:inittab中执行了这样一个语句“::respawn:-/bin/sh”。
启动/bin/sh程序时会启动ash的配置信息,而它就是/etc/profile,sh会把profile的所有配置全部都运行一遍,因此用户可以把自己的启动程序放在这里。
#vi etc/profile
添加如下内容
#!/bin/sh
#/etc/profile:system-wide .profile file for the Bourne shells
echo "Processing /etc/profile....."
#set search library path
export LD_LIBRARY_PATH=/lib:/usr/lib:/qte/lib
#set user path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/exe/
#Set PS1
export PS1='[\u@\h:\w]\$'
alias ll="ls -l"
echo "Done!"
(5)修改系统配置文件权限
#chmod 755 etc/*
#chmod 755 etc/rc.d/rc.sysinit
(6)拷贝Busybox文件
将安装好的Busybox文件拷贝到/root/rootfs/目录:
#cp ./busybox、busybox-1.22.1/_install/_install/* /root/rootfs -rf
第三步:拷贝库文件(配置Busybox若选择静态编译则省略此步骤)
x86系统中,动态编译Busybox制作文件系统,需将下列几个必须库从工具链gcc-3.4.6-2f/mipsel-linux/lib拷贝到lib目录。
ld.so.1, ld-2.3.6.so, libcrypt.so.1, libc.so.6, libdl.so.2, libgcc_s.so.1, libm.so.6, libpthread.so.0, libstdc++.so.6(小编在操作过程中并没有前面两个文件,但不影响最后的结果)
#cp /opt/FriendlyARM/toolschain/4.5.1/arm-none_linux_gnueabi/sys-root/lib/* /root/rootfs/lib/
第四步:镜像文件制作工具
(1) cramfs-1.1.tar.gz (制作cramfs 文件系统工具 )
(2) mtd-utils-1.0.0.tar.gz (制作jffs2文件系统工具)
(3) yaffs2-d43e901.tar.gz (制作yaffs2 文件系统工具)这里我用的是mkyaffs2image-128M
(4) zlib-1.2.3.tar.gz (依赖工具)
镜像文件制作工具本机安装
(1)安装依赖工具zlib:
#tar zxf zlib-1.2.3.tar.gz
#cd zlib-1.2.3
#./configure && make && make install
(2)制作cramfs 文件系统工具mkcramfs:
#tar zxf cramfs-1.1.tar.gz
#cd cramfs-1.1
#make
当前目录生成mkcramfs,可以拷贝到/usr/bin:
#cp mkcramfs /usr/bin
(3)制作jffs2文件系统工具mkfs.jffs2
#tar zxf mtd-utils-1.0.0.tar.gz
#cd mtd-utils-1.0.0
#make
当前目录下生成mkfs.jffs2,可以拷贝到/usr/bin:
#cp mkfs.jffs2 /usr/bin
(4)制作yaffs2 文件系统工具mkyaffs2image
#tar zxf yaffs2-d43e901.tar.gz
#cd yaffs2-d43e901/utils
#make
在当前目录yaffs2-d43e901/utils下生成mkyaffs2image,可以拷贝到/usr/bin:
#cp mkyaffs2image /usr/bin
制作文件系统镜像文件
(1)Cramfs:
#mkcramfs /root/rootfs rootfs-cramfs.img
#chmod 777 rootfs-cramfs.img //修改文件系统权限,防止出现无法烧写的情况
或者使用自带的工具:
#mkfs.cramfs /root/rootfs rootfs-cramfs.img
#chmod 777 rootfs-cramfs.img //修改文件系统权限,防止出现无法烧写的情况
(2)Jffs2:
#mkfs.jffs2 -r /root/rootfs -o rootfs-jffs2.img -e 0x20000 --pad=0x2000000 -n
#chmod 777 rootfs-jffs2.img //修改文件系统权限,防止出现无法烧写的情况
mkfs.jffs2各参数的意义:
-r:指定要生成image的目录名。
-o:指定输出image的文件名。
-e:每一块要擦除的block size,不同的flash,其block size会不一样。这里为128KB。
--pad:用16进制来表示所要输出文件的大小,也就是rootfs-jffs2.img的大小,如果实际大小不足此设定的大小,则用0xFF补足。
-n,-no-cleanmarkers:指明不添加清楚标记(nandflash有自己的校检块,存放相关的信息)。
(3)Yaffs2:
#mkyaffs2image /root/rootfs rootfs-yaffs2.img
#chmod 777 rootfs-yaffs2.img //修改文件系统权限,防止出现无法烧写的情况
第五步:进行烧写
在Linux环境中打开两个终端A和B,目标板Tiny6410上电。
终端A:
# sudo minicom
目标板复位
按y键(如果之前还没有进行内核的烧写,需要在这之前按k键)
终端B:
# sudo ./dnw rootfs-yaffs2.img 0
终端A:
按b键
复位
小编在进行这些编译,是在龙芯1B开发板文档加以修改得到最后的成功的,大家有空也可以百度查看一下这份文档。祝大家学习愉快