最小根文件系统制作实验:
1.在Ubuntu上面创建根文件系统目录mkdir rootfs
mkdir bin dev etc lib proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules
2 创建2个设备文件
cd dev/
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
(“c”是字符设备的意思,“5”主设备号,“1”次设备号)
3.安装etc/
途径1、使用网上现有的etc.tar.gz文件,在rootfs目录下面:tar xvzf etc.tar.gz
途径2、在完成了第6步的前提下,将Busybox/examples/bootfloopy/etc/下所有文件拷贝到rootfs/etc下面
cp /opt/EmbedSKy/busybox1.13.0/examples/bootfloopy/etc/ * ~/work/rootfs/etc
修改inittab文件:
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::once:/usr/sbin/telnetd -l /bin/login
::ctrlaltdel:/bin/umount -a -r
修改fstab文件:
proc /proc proc defaults 0 0
修改init.d/rcS文件:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
修改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='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
echo "Processing /etc/profile... "
echo "Done"
export USER LOGNAME PS1 PATH
cp config_EmbedSky_W35 .config
make modules
5.安装内核模块:仅仅是一种拷贝,把上一步编译好的.ko内核模块文件拷贝到rootfs/lib/modules
make modules_install INSTALL_MOD_PATH=/home/clbiao/work/rootfs/
安装完成显示:
到rootfs/lib/modules下看看变化。
6.配置编译Busybox:
make munuconfig
Busybox Settings -->
Build Option -->
[*] Build busybox as a static binary busybox的库为静态链接库,动态链接库的话要在rootfs/lib目录下面都要有
[*] Build with Large File Support (for accessing files > 2 GB)
(arm-linux-) cross compiler prefix
Installation Option -->
[*] Don not use /usr
(home/clbiao/work/rootfs)busybox installation prefix//这个是设置上面制作的文件系统的目录,用于后面安装Busybox
Busybox Library Tuning --->
[*] vi-style line editing commands
[*] Fancy shell prompts //要选择这个选项:“Fancy shell prompts”,否则挂载文件系统后,无法正常显示高端大气的命令提示符:“[\u@\h \W]#”
.......
make之后就可以生成busybox的elf可执行文件
make install就会自动安装到rootfs目录下面去
==========================================================================================================
7.制作哪一种文件系统作为根文件系统:下面涉及4种文件系统的制作(1)制作initramfs
制作过程:
内核源码顶层目录
make menuconfig->general setup
->Initial RAM filesystem and RAM disk (initramfs/initrd) support接着设置目录
建立软链接文件init:
ln -s /home/clbiao/work/rootfs/bin/busybox /home/clbiao/work/rootfs/init
修改启动命令:
CONFIG_CMDLINE=“console=ttySAC0 men=64M”
重新编译内核
设置uboot环境变量:
setenv bootargs noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
制作uImage:
mkimage工具的使用:这个工具是在编译uboot时候在tools目录下面生成的可执行文件mkimage
使用前首先要将这个elf可执行文件复制到编译好的内核zImage.bin目录下面
方法一:
./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-2.6.30.4 -d zImage uImage2.6.30.4
指定了:内核映像在内存中的加载地址+0x40=内核的入口地址
就要把内核下载到30008000的地址处才能够正常引导启动内核,且bootm 30008000
==========================================================================================================
(2)使用nfs
配置:
在内核顶层目录的.config
CONFIG_CMDLINE=“root=/dev/nfs fsroot=192.168.1.118:home/clbiao/work/rootfs ip=192.168.1.102 rw console=ttySAC0 men=64M”
后面一个ip是开发板的,前面一个是Linux的
另外还要在make munuconfig界面进行配置:
要使内核支持nfs起根文件系统,内核必须选上file system-->Network file system
如何设置uboot的环境变量???
就是下面这样配置:
setenv bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.1.106:/home/clbiao/work/rootfs ip=192.168.1.122:192.168.1.106::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M
出错情况:
EmbedSky> bootm 30008000
## Booting image at 30008000 ...
Image Name: Linux-2.6.30.4-EmbedSky
Created: 2014-10-30 11:46:07 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2305580 Bytes = 2.2 MB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
XIP Kernel Image ... OK
Starting kernel ...卡死不动
之后又多出了:
undefined instruction
pc : [<30008010>] lr : [<33d1ecc4>]
sp : 33cbda88 ip : 33cbffc0 fp : 00000002
r10: 00000001 r9 : 33bee70e r8 : 33cbffdc
r7 : 33d60888 r6 : 33cc1933 r5 : 30000124 r4 : 00000000
r3 : 30008000 r2 : 30000100 r1 : 000000a8 r0 : 33cbdcd4
Flags: nZCv IRQs off FIQs off Mode SVC_32
Resetting CPU ...
可以断定是内核编译配置出了问题:因为在开始引导内核开始阶段就挂掉了,
第二天下午,经过将近两个小时的琢磨,终于发现了问题的所在:
坑死我了!一开始做内核制作实验的时候,我是先编译好zImage映像,再独立使用mkimage工具将其转换成uImage的,实验成功之后
嫌麻烦,因为每次都要这样转换,就想编译内核的时候可以make uImage就好了,于是乎将mkimage工具复制到根目录下面的sbin目录下面
竟然可以直接编译内核的时候生成uImage,大喜!却偏偏没有将生成的uImage文件下载进开发板测试行不行,之后就是到了昨天做nfs文件系统
结果就直接这样用了,就出现了上面的问题:内核刚开始引导就挂掉了!
==========================================================================================================
(3)ramdisk制作
配置内核编译选项:启动命令
CONFIG_CMDLINE=“initrd=0x32000000,0x300000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M”
根文件系统加载的地址为0x32000000,大小为0x300000(3M)
安装linux下制作工具:http://sourceforge.net/projects/genext2fs/files/genext2fs/
解压之后进入源码目录:./configure生成Makefile文件,接着就是make生成genext2fs可执行文件
将genext2fs可执行文件复制到work目录下面
./genext2fs -b 8192 -d /home/clbiao/work/rootfs ramdisk
gzip -9 -f ramdisk
==========================
现在出现:
kernel panny,原因还未找到
==========================
原因出在了:
EmbedSky> print
bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
bootcmd=boot_zImage
bootdelay=0
baudrate=115200
ethaddr=0a:1b:2c:3d:4e:5f
ipaddr=192.168.1.6
netmask=255.255.255.0
mtdids=nand0=nandflash0
mtdparts=mtdparts=nandflash0:256k@0(bios),128k(params),128k(toc),512k(eboot),1024k(logo),3m(kernel),-(root)
serverip=192.168.1.118
stdin=serial
stdout=serial
stderr=serial
partition=nand0,0
mtddevnum=0
mtddevname=bios
问题出在了“bootargs”这个uboot的启动参数没有设置,应该改成:
bootargs=initrd=0x32000000,0x300000 root=/dev/ram init=/linuxrc console=ttySAC0
设置命令为:
setenv bootargs initrd=0x32000000,0x300000 root=/dev/ram init=/linuxrc console=ttySAC0
=================================================================================================================(4)yaffs2文件系统
先配置支持yaffs2文件系统的内核镜像
#make menuconfig
File systems --->
[*] Miscellaneous filesystems --->
<*> YAFFS2 file system support
.config文件修改:
CONFIG_CMDLINE = "noinitrd root=/dev/mtdblock2 rw rootfs type=yaffs2 init=linuxrc console=ttySAC0 mem=64M"
重新编译内核
进入之前做好的rootfs文件系统,将所有的文件复制到创建好的root_2.6.30目录下面:
cp -rf * /home/clbiao/work/root_2.6.30
再将mkyaffs2image工具复制到/usr/bin,进入/home/clbiao/work执行:
#mkyaffs2image root_2.6.30 root_2.6.30.bin
修改文件权限:就是为了将root_2.6.30.bin文件复制到另外一个目录或者window下面
chmod 777 root_2.6.30.bin
之后之后烧写方法有下面两种方法:
法一、直接将root_2.6.30.bin和zImage.bin文件通过uboot菜单下载,然后通过菜单选择启动内核(推荐使用这种方法,好操作)
法二、tftp下载到RAM再通过uboot命令转存到nand Flash中
配置uboot的环境变量:
#setenv bootargs noinitrd init=linuxrc root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
使用zImage镜像时:
先使用uboot的指令mtd查看分区情况显示:
大小: 起始地址:
0: bios 0x00040000 0x000000000
1: params 0x00020000 0x000400000
2: toc 0x00020000 0x000600000
3: eboot 0x00080000 0x000800000
4: logo 0x00100000 0x001000000
5: kernel 0x00300000 0x002000000
6: root 0x0fb00000 0x005000000
按照下载zImage镜像到nand的方式下载到开发板,步骤这里不累述
boot_zImage启动内核不成功
出错信息:
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:2.
Freeing init memory: 188K
Warning: unable to open an initial console.
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
估计是没有挂接成功文件系统,没有挂接成功会不会因为root映像文件没有下载到正确的分区??
然后我尝试查看使用菜单下载时打印的文件系统下载区域信息为:
NAND erase: device 0 offset 0x500000, size 0xfb00000
从这里看出估计是mtd显示的信息中起始地址后面多了一个0,重新下载root镜像
tftpboot 30008000 root_2.6.30.bin
nand erase 500000 fb00000
nand write 30008000 500000 fb00000
tftpboot 30008000 zImage.bin
nand erase 200000 300000
nand write 30008000 200000 300000
boot_zImage成功。
使用uImage镜像时:
照样将root下载到nand的root分区,之后
tftpboot 30008000 uImage.bin
bootm 30008000
启动成功。