根文件系统制作

最小根文件系统制作实验:

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


4.编译内核模块:进入到内核源码的顶层目录:
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
  启动成功。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值