Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4513308
  • 博文数量: 252
  • 博客积分: 5347
  • 博客等级: 大校
  • 技术积分: 13838
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 10:13
文章分类
文章存档

2022年(12)

2017年(11)

2016年(7)

2015年(14)

2014年(20)

2012年(9)

2011年(20)

2010年(153)

2009年(6)

分类: 嵌入式

2010-04-20 17:31:47

   上一篇文章移植的Linux内核,不过还不能正常的启动Linux操作系统,这需要根文件系统的支持。这篇文章就是关于如何制作根文件系统的。
   现在大部分开发板都可以支持yaffs2 文件系统,它是专门针对嵌入式设备,特别是使
用 nand flash作为存储器的嵌入式设备而创建的一种文件系统,早先的yaffs 仅支持小页
(512byte/page)的nand flash,,使用 yaffs2 就可以支持大页的 nand flash。
   所谓的根文件系统,就是创建各个目录,并且在里面创建各种文件,比如在/bin,/sbin/目录下存放各种可执行的程序,在/etc目录下存放配置文件,在/lib目录下存放库文件,下面就可以文件系统的移植。
一、准备工作
1、 Yaffs2源代码的获取
在 可以下载到最新的yaffs2 源代码, 如果使用git工具
,在命令行输入:

#git clone git://

就可以下载到yaffs2的源代码,到当前目录下。
2、下载Busybox-1.13.3
  可以从下载Busybox-1.13.3
3、下载Yaffs2的制作工具
    可以到友善之臂的网站下载,mkyaffs2image.tgz,其中解压出来有两个可执行的文件,一个是针对小页的,一个是针对NandFlash为128MB,大页的,其名字为mkyaffs2image-128M,一开始在这里犯了错误,我的NandFlash是128MB的,可以按照网上用的是mkyaffs2image文件,所以老是出来假坏块的提示,仔细一分析,NandFlash不可能一下子出来这么多的坏块,而且我用他们公司提供的根文件系统却没有任何的问题,所以问题处在了制作Yaffs2的工具上面。因为这两种大小NandFlash的ECC校验是不一样的,也就是spare区的大小是不一样的,造成了ECC校验出错。
4、链接库
  制作根文件系统时,要使用到链接库,这里直接使用友善之臂根文件系统中的链接库。从网站下载root_qtopia.tgz。 使用lib目录下的链接库。
5、给内核打上YAffs2补丁
    然后进入 yaffs2 源代码目录执行:

#cd yaffs2
 #./patch-ker.sh c /opt/FriendlyARM/mini2440/linux-2.6.32.2

此时进入 linux-2.6.32.2/fs 目录,可以看到已经多了一个 yaffs2 目录。
上面命令完成下面三件事情:
(1) 修改内核fs/Kconfig
    增加一行:source "fs/yaffs2/Kconfig"
(2) 修改内核fs/Kconfig
    增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/
(3) 在内核fs/目录下创建yaffs2目录
    将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;
   将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下;
    将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.
6、配置内核以支持Yaffs2文件系统
    在 Linux内核源代码根目录运行:make xconfig,找到 File Systems如图,再找到“Miscellaneous filesystems”菜单项,找到“YAFFS2 file system support” ,并选中它,这样我们就在内核中添加了yaffs2 文件系统的支持,保存退出。然后在命令行中,执行make zImage,这时不要在执行mage mini2440_defconfig 了,如果再执行的话,前面的配置就失效了,在这我也犯了一个低级的错误。


二、 构建根文件系统
  1、根文件系统的目录结构
     bin 存放所有用户都可以使用的、基本的命令。
sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。
usr 里面存放的是共享、只读的程序和数据。
proc 这是个空目录,常作为proc文件系统的挂载点。
dev 该目录存放设备文件和其它特殊文件。
etc 存放系统配置文件,包括启动文件。
lib 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序。
boot 引导加载程序使用的静态文件
home 用户主目录,包括供服务账号锁使用的主目录,如FTP
mnt 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。
opt 给主机额外安装软件所摆放的目录。
root root用户的主目录
tmp 存放临时文件,通常是空目录。
var 存放可变的数据。
2、建立根文件系统的目录,
    进入opt/kernel,创建一个shell的脚本用于构建根文件系统的各个目录。create_rootfs_bash,平且改变执行的权限。

sudo chmod +x create_rootfs_bash

在kernel目录下,运行./create_rootfs_bash,其脚本的内容如下:

#!/bin/sh

echo "------Create rootfs directons start...--------"

mkdir rootfs

cd rootfs

echo "--------Create root,dev....----------"

mkdir root dev etc boot tmp var sys proc lib mnt home

mkdir etc/init.d etc/rc.d etc/sysconfig

mkdir usr/sbin usr/bin usr/lib usr/modules

echo "make node in dev/console dev/null"

mknod -m 600 dev/console c 5 1

mknod -m 600 dev/null c 1 3

mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp

mkdir var/lib var/lock var/run var/tmp

chmod 1777 tmp

chmod 1777 var/tmp

echo "-------make direction done---------"

改变了tmp目录的使用权,让它开启sticky位,为tmp目录的使用权开启此位,可确保tmp目录底下建立的文件,,只有建立它的用户有权删除。
3、建立动态的链接库
    动态链接库直接使用友善之臂的,首先,下载友善之臂的根文件系统解压后得到root_qtopia,把该文件下的Lib下的文件全部复制到我们自己建立的lib/文件夹下。
4、编译和安装Busybox
   Bosybox 是一个遵循 GPL v2协议的开源项目,它在编写过程总对文件大小进行优化,
并考虑了系统资源有限(比如内存等)的情况,使用 Busybox 可以自动生成根文件系统所需的
bin、sbin、usr 目录和 linuxrc 文件。 
解压Busybox,然后

cd busybox-1.13.3

//修改该目录下的makefile文件,修改平台为arm平台,修改编译器为默认的交叉编译器

CROSS_COMPILE ?=arm-linux-   //大约在164行

ARCH ?=arm               //大约在189行

配置busybox,在busybox-1.13.3目录下,这里我们只关心改动的地方。执行make xconfig,其各个选项的配置界面如下。

 

下图配置Linux Modeul Utilities

3、在busybox中配置对dev下设备类型的支持
dev的创建有三种方法:
(1)手动创建:在制作根文件系统的时候,就在 dev目录下创建好要使用的设备文件,系统
挂接根文件系统后,就可以使用 dev目录下的设备文件了。 
(2)使用 devfs 文件系统:这种方法已经过时,具有不确定的设备映射、没有足够的主/次设备号、devfs 消耗大量的内存。 
(3)udev:它是个用户程序,(u是指user space ,dev 是指device)能根据系统中硬件设备的状态动态的更新设备文件,包括设备文件的创建、删除等。使用udev机制也不需要/dev目录下创建设备节点,它需要一些用户程序的支持,并且内核要支持sysfs文件系统。它的操作相对复杂,但灵活性很高 
   mdev 是 busybox 自带的一个简化版的 udev,适合于嵌入式的应用埸合。其具有使用简
单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所
需的节点文件。在以busybox 为基础构建嵌入式linux 的根文件系统时,使用它是最优的选择。
下面的选项将增加对 mdev的支持。 
4、编译busybox 
  编译 busybox 到指定目录: 
cd /opt/kernel/busybox-1.13.3 
make CONFIG_PREFIX=/opt/kernel/rootfs install 
在 rootfs 目录下会生成目录 bin、sbin、usr 和文件 linuxrc 的内容。
5、 建立etc目录
 init进程根据/etc/inittab文件来创建其他的子进程,比如调用脚本文件配置IP地址,挂载其他的文件系统,最后启动shell等。
(1)、拷贝主机 etc 目录下的passwd、group、shadow文件到 rootfs/etc目录下。
(2) etc/sysconfig目录下新建文件HOSTNAME,内容为”frank” 。 
(3) etc/inittab文件: 
  仿照Busybox的examples/inittab文件,在etc/目录下创建一个inittab文件.开发板上通过mdev生成胡/dev目录中,S3C2440的串口名是
s3c2410_serial0s3c2410_serial1s3c2410_serial2,而不是ttySAC0 ttySAC1 ttySAC2.

#etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

6、创建etc/init.d/rcS文件:
这是一个脚本文件,可以在里面添加自动执行的命令,

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S      //运行的级别
prevlevel=N
umask 022   //文件夹的掩码
export PATH runlevel prevlevel
echo"--------- munt all--------"
mount -a     //挂载/etc/fstab/文件指定的所有的文件系统
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
echo "*************************"
echo "**********************frank ARM**************"
echo "Kernel version:linux-2.32.2"
echo "Author:frank"
echo "Data:2010,4,19"
echo "***********************"
/bin/hostname -F /etc/sysconfig/HOSTNAME //主机的名字

最后,还要改变它的属性,使它能够运行

sudo chmod +x etc/init.d/rcS

7、创建etc/fstab文件:
  内容如下,表示执行完,“mount -a”命令后将挂载proc,tmpfs 等包含在该文件中的所有的文件系统。

#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0

/etc/fstab/文件被用来定义文件系统的“静态信息”,这些信息被用来控制mount命令的行为,各个字段的寒酸以如下:
device: 要挂载的设备
   比如/dev/hda2 /dev/mtdblock1 等设备文件,也可以是其他格式的,比如对于proc文件系统这个字段就没有意义,可以就任意的值,对于NFS文件系统,这个字段是,:
.
mount-point: 挂载点
type 文件系统类型
   比如 proc,jffs2,yaffs,ext2 ,nfs等,也可以是auto,表示自动检测文件系统类型
options: 挂接参数,以逗号隔开
/etc/fstab的作用不仅仅是用来控制'mount -a'的行为,即使是一般的mount命令,也受它的控制,常用的取值还有 auto noauto user 只允许普通用户挂载设备 nouser exec 允许运行所挂载设备上的程序 noexec Ro 只读方式 rw 以读写的方式 sync 修改文件是,它会同步写入设备中 async 不同步
  defaults rw suid dev exec auto nouser async 等的组合。
  dump 和fsck order:用来控制dump fsck程序的行为
dump是一个用来备份的文件的程序,fsck是一个用来检查磁盘的程序,
8、 创建etc/profile文件:

#Ash profile
#vim:syntax=sh
#No core file by defaults
#ulimit -S -c 0>/dev/null 2>&1
USER="id -un"
LOGNAME=$USER
PS1='[\u@\h=W]#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH

三、 制作根文件系统映像文件
    在前面也已经讲过,我的NandFlash是128MB的,所以要使用,友善之臂的mkyaffs2image-128这个可执行的文件生成映像文件 使用命令mkyaffs2image rootfs rootfs.img生成根文件系统映像文件。
把生成的rootsfs.img文件下载到nandFlash中的根文件系统区。然后从NANDFlash启动可以看到的信息如下:


load Image of Linux...Uncompressing Linux.................
Linux version 2.6.32.2 (zfz@zfz) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-70
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: FriendlyARM MINI2440 development board
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60500KB available (3672K code, 418K data, 132K init, 0K highmem)
SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Hierarchical RCU implementation.
NR_IRQS:85
irq: clearing subpending status 00000002
Console: colour dummy device 80x30
console [ttySAC0] enabled
Calibrating delay loop... 201.93 BogoMIPS (lpj=504832)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C24XX DMA Driver, (c) 2003-2004,2006 Simtec Electronics
DMA channel 0 at c4808000, irq 33
DMA channel 1 at c4808040, irq 34
DMA channel 2 at c4808080, irq 35
DMA channel 3 at c48080c0, irq 36
S3C244X: Clock Support, DVS off
bio: create slab <bio-0> at 0
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
s3c-i2c s3c2440-i2c: slave address 0x10
s3c-i2c s3c2440-i2c: bus frequency set to 98 KHz
s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
JFFS2 version 2.2. (NAND) ?&#169; 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat, Inc.
yaffs Apr 20 2010 11:10:26 Installing.
msgmni has been set to 118
alg: No test for stdrng (krng)
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
s3c2410-lcd s3c2410-lcd: no platform data for lcd, cannot attach
s3c2410-lcd: probe of s3c2410-lcd failed with error -22
s3c2440-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand: Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns
s3c24xx-nand s3c2440-nand: NAND soft ECC
NAND device: Manufacturer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-b)
Scanning device for bad blocks
Creating 5 MTD partitions on "NAND 128MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "U-boot"
0x000000040000-0x000000060000 : "param"
ftl_cs: FTL header not found.
0x000000060000-0x000000560000 : "Kernel"
uncorrectable error :
0x000000560000-0x000040560000 : "root"
mtd: partition "root" extends beyond the end of device "NAND 128MiB 3,3V 8-bit"0
ftl_cs: FTL header not found.
0x000000000000-0x000040000000 : "nand"
mtd: partition "nand" extends beyond the end of device "NAND 128MiB 3,3V 8-bit"0
dm9000 Ethernet Driver, V1.31
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
usbcore: registered new interface driver libusual
mice: PS/2 mouse device common for all mice
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
i2c /dev entries driver
S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled
cpuidle: using governor ladder
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
usbcore: registered new interface driver hiddev
usbcore: registered new interface driver usbhid
usbhid: v2.6:USB HID core driver
Advanced Linux Sound Architecture Driver Version 1.0.21.
No device for DAI UDA134X
No device for DAI s3c24xx-i2s
ALSA device list:
  No soundcards found.
TCP cubic registered
NET: Registered protocol family 17
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
yaffs: auto selecting yaffs2
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:3.
Freeing init memory: 132K
/etc/init.d/rcS: line 7: echo--------- munt all--------: not found
*************************
**********************Frankzfz ARM**************
Kernel version:linux-2.32.2
Student:zfz
Data:2010,4,19
***********************
                                                                                
Please press Enter to activate this console.
[root@"Frankzfz"=W]#

现在终于可以看到激动人心的下面这句话了,表明你有Linux系统已经可以正常的启动了。

Please press Enter to activate this console.

 不过现在只是一个最基本的Linux系统,里面的驱动程序还没有,网上驱动,LCD驱动等等,所以还有很多的东西要移植呢。这也是下一步的任务。
阅读(11841) | 评论(5) | 转发(9) |
给主人留下些什么吧!~~

chinaunix网友2011-01-05 21:48:19

友善之臂的那个文件系统是如何制作的呢

chinaunix网友2011-01-04 16:34:20

你好,高手能告诉你的QQ号吗?我的是554126057,谢谢啊,

chinaunix网友2011-01-04 16:31:29

你好,我现在可以挂载根文件系统,我想把Ubuntu中的文件使用ftp传输到mini2440中的某个文件目录中,可是我在mini2440的命令行中输入ftp,提示找不到该命令,是不是我的根文件系统没有加入ftp这个命令的相关文件啊?,如何修改,请高手帮忙?

chinaunix网友2010-12-29 12:24:19

我内核移植参考的你的博文,yaffs2根文件系统也是参考你这篇博文,但是出现问题是:Warning: unable to open an initial console. Failed to execute /linuxrc. Attempting defaults 我的板子是mini2440 128M的,我用的Ubuntu10.04 ,交叉编译工具为arm-linux-gcc-4.3.2 yaffs制作工具是mkyaffsimage-128M的,我的uboot分区为: 0-0x60000 为u-boot 0x60000-0x80000为参数 0x80000-0x580000 为内核0x580000以后为rootfs,我的内核nand分区跟这个一致, 请高手帮忙分析一下吧,我困扰了好长时间了

chinaunix网友2010-04-25 20:37:46

(3) 在内核fs/目录下创建yaffs2目录 将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie; 将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下; 将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下. 請問你這裡的~ 在fs 目录,看到已经了一个yaffs2 目录了~ 為什麼要再fs/目录下创建yaffs2目录~ 你的(3)不懂~