Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(1)

2024-01-29 06:32

本文主要是介绍Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

移植环境(红色粗字体字修改后内容,蓝色粗体字为特别注意内容)

1,主机环境:VMare下CentOS 5.5 ,1G内存。

2,集成开发环境:Elipse IDE

3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gn?i-gcc v4.5.1。

4,开发板:mini2440,2M nor flash,128M nand flash。

5,u-boot版本:u-boot-2009.08

6,linux 版本:linux-2.6.32.2

7,参考文章:

【1】嵌入式linux应用开发完全手册,韦东山,编著。

【2】Mini2440 之Linux 移植开发实战指南

【3】http://linux.chinaunix.net/techdoc/system/2009/08/24/1131864.shtml

4.1,根文件系统制作

在构建文件系统时,建议遵循FHS(Filesystem Hierarchy Standard,文件系统层次标准),它定义了文件系统中目录、文件的分类存放原则,定义了系统运行需要的最小文件目录的集合,FHS文档可以到www.pathname.com/fhs/下载。

【1】下载busybox 源代码

可以从http://www.busybox.net/downloads/,这里下载的是busybox-1.13.3.tar.bz2,友善官方也有提供直接复制过来即可:

[root@localhost linux-test]# ls
busybox-1.13.3-mini2440.tgz   linux-2.6.32.2  linux-2.6.39  yaffs2
[root@localhost linux-test]#

【2】根文件系统目录说明

嵌入式 Linux 中都需要构建根文件系统,构建根文件系统的规则在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。
目录 内容
bin    存放所有用户都可以使用的、基本的命令。
sbin   存放的是基本的系统命令,它们用于启动系统、修复系统等。
usr    里面存放的是共享、只读的程序和数据。
proc  这是个空目录,常作为proc 文件系统的挂载点。
dev   该目录存放设备文件和其它特殊文件。
etc    存放系统配置文件,包括启动文件。
lib     存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序
boot  引导加载程序使用的静态文件。
home 用户主目录,包括供服务账号锁使用的主目录,如FTP。
mnt    用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。
opt    给主机额外安装软件所摆放的目录。
root   root 用户的主目录
tmp   存放临时文件,通常是空目录。
var   存放可变的数据,如日志等。

【3】创建系统目录。操作如下:

在与linux内核相同的目录下创建一个目录,此目录名字可以自己指定,这里创建的目录名为myrootfs。

[root@localhost linux-test]# mkdir myrootfs
[root@localhost linux-test]# ls
busybox-1.18.4.tar.bz2  linux-2.6.32.2  linux-2.6.39  myrootfs  yaffs2

进入到/root/linux-test/myrootfs/rootfs 目录,新建一个建立根文件系统目录的脚本文件mkrootfs:

[root@localhost linux-test]# cd myrootfs
[root@localhost myrootfs]# vim mkrootfs

将下列内容复制其中:

#!/bin/sh
echo "------Create rootfs directons start...--------"
mkdir rootfs
cd rootfs
echo "--------Create root,dev....----------"
mkdir bin boot dev etc home lib mnt proc root sbin sys tmp usr var  www
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 666 dev/console c 5 1
mknod -m 666 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---------"

然后执行:wq保存退出。

使用命令chmod a+x mkrootfs 改变文件的可执行权限:

[root@localhost myrootfs]# chmod a+x mkrootfs

运行./mkrootfs 脚本:

[root@localhost myrootfs]# ./mkrootfs
------Create rootfs directons start...--------
--------Create root,dev....----------
make node in dev/console dev/null
-------make direction done---------
[root@localhost myrootfs]#

这样就完成了根文件系统目录的创建。在上面脚本执行过程创建的两个设备文件console 和null非常重要,这两文件和控制台设备有关,在前面提到过的在内核挂载文件系统时出现的告警“Warning: unable to open an initial console”与之有关。

其中,mknod命令格式如下:

mknod [OPTION]... NAME TYPE [MAJOR MINOR]

 参数-m, --mode=MODE,表示指定用户操作权限,console和null表示文件名,c 表示是字符设备,后面的两个数字分别表示主设备号和次设备号。

改变了tmp 目录的使用权,让它开启sticky 位,为tmp 目录的使用权开启此位,可确保tmp 目录底下建立的文件,只有建立它的用户有权删除。尽管嵌入式系统多半是单用户,不过有些嵌入式应用不一定用root 的权限来执行,因此需要遵照根文件系统权限位的基本规定来设计。

【4】编译并安装内核模块

首先就进入到内核顶级目录下,并确认内核顶层目录下的Makefile中的ARCH=arm,CROSS_COMPILE=arm-linux- ,然后执行编译:

[root@localhost linux-test]# cd linux-2.6.32.2
[root@localhost linux-2.6.32.2]# make modules

等到编译完成后,安装编译好的模块:

[root@localhost linux-2.6.32.2]# make modules_install ARCH=arm INSTALL_MOD_PATH=/root/linux-test/myrootfs/rootfs

等到模块安装完成后可以看到

[root@localhost linux-2.6.32.2]# cd ../myrootfs/rootfs
[root@localhost rootfs]# ls ./lib/modules
2.6.32.2 
2.6.32.2-FriendlyARM
[root@localhost rootfs]# ls ./lib/modules/2.6.32.2
build           modules.dep          modules.ofmap     modules.symbols
kernel          modules.ieee1394map  modules.order     modules.usbmap
modules.alias   modules.inputmap     modules.pcimap    source
modules.ccwmap  modules.isapnpmap    modules.seriomap

[root@localhost rootfs]# ls ./lib/modules/2.6.32.2/kernel
crypto  drivers  fs  lib  net  sound
[root@localhost rootfs]#
上面的目录中有make modules_install安装的模块。

【5】建立动态链接库

这里的动态链接库直接用友善之臂的,可以从其官方光盘映像/linux目录下rootfs_qtopia_qt4-20110304.tar.gz,先解压友善之臂的根文件包:

[root@localhost myrootfs]# cd ../
[root@localhost linux-test]# ls
busybox-1.13.3-mini2440.tgz  linux-2.6.39 
rootfs_qtopia_qt4-20110304.tar.gz
linux-2.6.32.2          myrootfs      yaffs2
[root@localhost linux-test]#
tar -zxf rootfs_qtopia_qt4-20110304.tar.gz -C ./
[root@localhost linux-test]# ls
busybox-1.13.3-mini2440.tgz  linux-2.6.39  rootfs_qtopia_qt4                  yaffs2
linux-2.6.32.2          myrootfs      rootfs_qtopia_qt4-20110304.tar.gz
[root@localhost linux-test]#

拷贝其lib 的内容到新建的根文件目录lib 内:

[root@localhost linux-test]# cp -rfd ./rootfs_qtopia_qt4/lib/* ./myrootfs/rootfs/lib/
[root@localhost linux-test]#

还有一种做法:

对于"lib"目录:这个里面放的都是库文件,直接从交叉编译器的库文件目录中拷贝过来:
#cp -f /usr/local/arm/4.4.3/arm-none-linux-gneabi/libc/armv4t/lib/*so* lib/ -a

【5】交叉编译Bosybox

Bosybox 是一个遵循GPL v2 协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和linuxrc 文件。

(1)解压busybox

[root@localhost linux-test]# ls
busybox-1.13.3-mini2440.tgz  linux-2.6.39  rootfs_qtopia_qt4                  yaffs2
linux-2.6.32.2          myrootfs      rootfs_qtopia_qt4-20110304.tar.gz
[root@localhost linux-test]#
tar -zxf busybox-1.13.3-mini2440.tgz 
[root@localhost linux-test]# ls
busybox-1.13.3          linux-2.6.39       rootfs_qtopia_qt4-20110304.tar.gz
busybox-1.13.3-mini2440.tgz    myrootfs           yaffs2
linux-2.6.32.2          rootfs_qtopia_qt4
[root@localhost linux-test]#

(2)进入busybox的顶层目录,修改Makefile

[root@localhost linux-test]# cd busybox-1.13.3
[root@localhost busybox-1.13.3]# gedit Makefile
在gedit打开的Makefile中,定位到164行附近,修改如下:

# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile

CROSS_COMPILE ?= arm-linux-
# bbox: we may have CONFIG_CROSS_COMPILER_PREFIX in .config,
# and it has not been incl? yet... thus using an awkward syntax.

... ...

定位到189行附近,修改如下:
ARCH ?= arm

# Architecture as present in compile.h
UTS_MACHINE := $(ARCH)

然后保存。

(3)配置busybox

在busybox顶层目录下执行make menconfig 进行配置

[root@localhost busybox-1.13.3]# make menconfig

出现如下图配置菜单

Linux-2.6.32.2内核在mini2440上的移植(三)---根文件系统制作 - singleboy - singleboy的博客

 

下面只列出了要注意的地方,没有列出的默认即可。  

<1>、Busybox Settings--->

    Build Options--->
[*] Build BusyBox as a static binary (no shared libs)                 
[ ] Force NOMMU build                                                  
[*] Build with Large File Support (for accessing files > 2 GB)      
(arm-linux-) Cross Compiler prefix   //指定编译前缀,按回车就可进行修改

    Installation Options  ---> 
[*] Don't use /usr  
    //选中该项可以避免buysbox被安装到宿主机系统的/usr目录下,破坏宿主机系统。 
    Applets links (as soft-links)  ---> 
(/root/linux-test/myrootfs/rootfs) BusyBox installation prefix    //这里需要指定busybox的安装路径,按回车即可输入。

    Busybox Library Tuning --->
[*] Support for /etc/networks   
[*] Command line editing  
(1024) Maximum length of input 
[*] vi-style line editing commands
(15)  History size         
 [*]   History saving            
 [*]   Tab completion    
 
[*]     Username completion     
 
[*]   Fancy shell prompts 

<2>Linux Module Utilities--->

(/lib/modules)Default directory containing modules
(modules.dep)Default name of modules.dep

下面是在busybox 中配置对dev 下设备类型的支持,dev 的创建有手动创建、使用devfs 文件系统创建和?v创建三种方法,而?v的一个简化版是busybox 自带的mdev ,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox 为基础构建嵌入式linux 的根文件系统时,使用它是最优的选择。

<3>Linux System Utilities --->
[*]Support /etc/mdev.conf
[*]Support command execution at device addition/removal

<4>Init Utilities --->

“Support reading an inittab file”应该选中,这样可以根据自己编写的inittab文件初始化;“Support running commands with a controlling-tty”应该选中,否则会提示非常困扰的“/bin/sh: can't access tty; job control turned off”的提示,尽管可以进入控制台命令行。

(4)编译busybox

编译busybox 到指定目录,在busybox-1.13.3的根目录下执行
make CONFIG_PREFIX=/root/linux-test/myrootfs/rootfs install
在rootfs 目录下会生成目录bin、sbin、usr 和文件linuxrc 的内容。

[root@localhost busybox-1.13.3]# make CONFIG_PREFIX=/root/linux-test/myrootfs/rootfs install
... ...

--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------

[root@localhost busybox-1.13.3]#

[root@localhost busybox-1.13.3]# ls ../myrootfs/rootfs
bin   dev  home  linuxrc  proc  sbin  tmp  var
boot  etc  lib   mnt      root  sys   usr  www
[root@localhost busybox-1.13.3]#

【6】建立etc 目录下的配置文件

(1) 建立/etc/group系统用户组配置文件,内容如下:

root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
news:*:9:
u p:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
s o:*:27:
a io:*:29:
ppp:x:99:
500:x:500:plg
501:x:501:fa

(2)建立passwd系统密码文件,内容如下:

root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
sky::502:502:Linux User,,,:/home/sky:/bin/sh

[root@localhost rootfs]# ls ./etc
group  init.d  passwd  rc.d   sysconfig
[root@localhost rootfs]#

(3) 在etc/sysconfig 目录下新建主机文件名HOSTNAME,内容为"mini2440"。

[root@localhost rootfs]# cat >>./etc/sysconfig/HOSTNAME
mini2440

[root@localhost rootfs]#
当录入完文件内容“mini2440”并回车后需要按下Ctrl+C组合键结束录入状态。此时该文件内容为:“mini2440",这句话就是我们在文件系统里面看到那个“[root@ mini2440 /]”。

(4)新建etc/inittab 系统init进程配置文件,将下面内容复制并粘贴其中:

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

要记住赋予其可执行属性

[root@localhost rootfs]# chmod a+x ./etc/inittab

(5)新建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 "************booting to mini2440 *****************"
echo "Kernel version:linux-2.6.32.2"
echo "the fans:singleboy"
echo "Date:2011.5.30"
echo "***********************************************"
/bin/hostname -F /etc/sysconfig/HOSTNAME

然后使用以下命令改变 rcS 的执行权限:
Chmod +x rcS

[root@localhost rootfs]# chmod +x ./etc/init.d/rcS
[root@localhost rootfs]#

(6)新建etc/fstab 系统挂载文件系统列表文件,将下面内容复制并粘贴其中:

#device mount-point  type       option      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

(7)新建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

修改环境变量PS1(命令行提示符),可以使用vi编辑/etc/profile文件,在最后加上:
export PS1='[\u@\h \W]\$ '
即可,其中\u显示当前用户账号,\h显示当前主机名,\W显示当前路径,\$显示'$'符号
\W 代替 \w 就可以实现绝对路径到相对路径的转换

下面简单说说环境下默认的特殊符号所代表的意义:
\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
\h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称
\v :BASH的版本信息
\w :完整的工作目录名称。家目录会以 ~代替
\W :利用basename取得工作目录名称,所以只会列出最后一个目录
\# :下达的第几个命令
\$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

(8) 建立etc/mdev.conf (mdev设备配置文件)、 net.conf (网络配置文件件),mime.types: MIME(Multipurpose Internet Mail Extensions) 内容均为空。

[root@localhost rootfs]# to h ./etc/mdev.conf
[root@localhost rootfs]# to h ./etc/net.conf
[root@localhost rootfs]# to h ./etc/mine.types

(9)建立boa WEB服务器文件配置文件

在etc/boa目录,并在boa目录中建立boa.conf文件,内容为空。

[root@localhost rootfs]# mkdir ./etc/boa
[root@localhost rootfs]#
to h ./etc/boa/boa.conf
[root@localhost rootfs]#

(10)先建立etc/rc.d/init.d目录

[root@localhost rootfs]# mkdir ./etc/rc.d/init.d

然后建立etc/rc.d/init.d/httpd文件
[root@localhost rootfs]#
gedit ./etc/rc.d/init.d/httpd
[root@localhost rootfs]#

将下面内容复制并粘贴:

#!/bin/sh

base=boa

# See how we were called.
case "$1" in
  start)
        /usr/sbin/$base
        ;;
  stop)
    pid=`/bin/pidof $base`
    if [ -n "$pid" ]; then
        kill -9 $pid
    fi
        ;;
esac

exit 0

(11)新建etc/resolv.conf,DNS配置文件,存放访问外网时需要DNS 的信息,内容如下:

nameserver 61.144.56.100

 (12)在/home/sky目录,与etc目录passwd文件中的sky相对应

[root@localhost rootfs]# mkdir ./home/sky
[root@localhost rootfs]#

3.2,根文件系统测试

将制作的文件系统通过下面三种方法测试

【1】将nfs文件系统作为根文件系统进行测试

(1) 将制作好的根文件系统rootfs复制到/nfsboot目录下作为mini2440的根文件系统

[root@localhost myrootfs]# cp -drf ./rootfs /nfsboot/
[root@localhost myrootfs]#  cd /nfsboot
[root@localhost nfsboot]#

复制时需要加上drf参数,d表示文件的链接关系不变。r表示递归复制此目录下所有的子目录和文件。

(2)确保rootfs目录可读写

[root@localhost nfsboot]# ls -l
总计 63216
drwxr-xr-x 17 root root     4096 06-01 07:14
rootfs
-rwxrw-rw-  1 root root 58487616 2009-07-18 root_qtopia-128M.img
-rw-r--r--  1 root root  2114212 05-27 11:45 uImage
[root@localhost nfsboot]#  

进入到内核目录下,执行:

[root@localhost myrootfs]# cd ../linux-2.6.32.2
[root@localhost linux-2.6.32.2]# vim .config

在打开的配置文件中在命令模式下:/CMD,会自动定位到340行,对照上面CONFIG_CMDLINE参数修改成如下:

#
# Boot options
#
CONFIG_ZBOOT_ROM_TEXT=0
CONFIG_ZBOOT_ROM_BSS=0
CONFIG_CMDLINE="root=/dev/nfs rw nfsroot=10.1.0.128:/nfsboot/rootfs ip=10.1.0.129 console=ttySAC0 mem=64M"
# CONFIG_XIP_KERNEL is not set
CONFIG_KEXEC=y
CONFIG_ATAGS_PROC=y

在内核目录下命令终端中执行

[root@localhost linux-2.6.32.2]# make men onfig
在打开的配置菜单-> Boot options --->回车可以看到刚才的修改结果,如下图:

Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作 - singleboy - singleboy的博客

 当然上图高亮的菜单选项上按回车也可以进行修改,但没有在vim编辑器中修改方便。

(5)确保内核提供nfs boot支持

在刚才的配置菜单中定位到 

      Device Drivers  ---> 

    <*> Memory Technology Device (MTD) support  --->

    <*>   Caching block device access to MTD devices

      [*] Network device support  --->

      [*]   Ethernet (10 or 100Mbit)  ---> 

      <*>   DM9000 support 

     File systems  --->

     [*] Network File Systems  ---> 

     --- Network File Systems                                   
     <*>   NFS client support                                         
      [*]     NFS client support for NFS version 3                     
      [*]       NFS client support for the NFSv3 ACL protocol extension
      [*]     NFS client support for NFS version 4 (EXPERIMENTAL)      
      [ ]       NFS client support for NFSv4.1 (DEVELOPER ONLY)        
      [*]     Root file system on NFS                                  
     < >   NFS server support 

要确保上面蓝色高亮部分的选项被选上。

(6)重新编译内核,将生成的uImage和zImage文件复制到/nfsboot/目录下

[root@localhost nfsboot]# ls
rootfs  root_qtopia-128M.img  uImage  uImage_T35  zImage  zImage_T35
[root@localhost nfsboot]#
(7)给开发板上电,启动u-boot

I2C:   ready
DRAM:  64 MB
Flash:  2 MB
NAND:  128 MiB
Video: 240x320x16 20kHz 62Hz
In:    serial
Out:   serial
Err:   serial
Net:   dm9000
U-Boot 2009.08
modified by singleboy(
singleboy@163.com)
Love Linux forever!!!
Hit any key to stop autoboot:  0
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at 100M full duplex mode
Using dm9000 device
File transfer via NFS from server 10.1.0.128; our IP address is 10.1.0.129
Filename '/nfsboot/uImage'.
Load address: 0x31000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #######################
done
Bytes transferred = 2110772 (203534 hex)
## Booting kernel from Legacy Image at 31000000 ...
   Image Name:   Linux-2.6.32.2
   Created:      2011-06-01  11:10:24 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2110708 Bytes =  2 MB
   Load Address: 30008000
   Entry Point:  30008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux.............................................................
...................................................................... done, boo
ting the kernel.
Linux version 2.6.32.2 (
root@localhost.localdomain) (gcc version 4.4.3 (ctng-1.6
.1) ) #11 Wed Jun 1 19:10:07 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
CPU: VIVT data cache, VIVT instr tion cache
Machine: my mini2440 devolopment board
singleboy@163.com
... ...

Kernel command line: noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M root=
/dev/nfs rw nfsroot=10.1.0.128:/nfsboot/rootfs ip=10.1.0.129:10.1.0.128:10.1.0.1
:255.255.255.0::eth0:off
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
... ...

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: Man?turer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-bit)
Scanning device for bad blocks
Creating 5 MTD partitions on "NAND 128MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000060000 : "param"
0x000000060000-0x000000560000 : "kernel"
0x000000560000-0x000008000000 : "rootfs"
0x000000000000-0x000008000000 : "nand"
dm9000 Ethernet Driver, V1.31
eth0: dm9000e at c486e300,c4872304 IRQ 51 MAC: 08:90:90:90:90:90 (chip)
... ...

eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
IP-Config: Complete:
     device=eth0, addr=10.1.0.129, mask=255.255.255.0, gw=10.1.0.1,
     host=10.1.0.129, domain=, nis-domain=(none),
     bootserver=10.1.0.128, rootserver=10.1.0.128, rootpath=
Looking up port of RPC 100003/2 on 10.1.0.128
Looking up port of RPC 100005/1 on 10.1.0.128
VFS: Mounted root (nfs filesystem) on device 0:14.
Freeing init memory: 132K
----------munt all----------------
***********************************************
************booting to mini2440 *****************
Kernel version:linux-2.6.32.2
the fans:singelboy
Date:2011.5.30
***********************************************

Please press Enter to activate this console.
[root@mini2440 /]#ls
bin      dev      home     linuxrc  proc     sbin     tmp      var
boot     etc      lib      mnt      root     sys      usr      www
[root@mini2440 /]#

可以看到制作的根文件系统内核成功地引导起来了。


【2】将制作根文件系统编译进内核,并制作成initramfs文件系统

 现在基于Linux的发行版通常采用initramfs代替initrd,架构更简单,应用也更灵活一些,不需要创建内存设备块,能根据文件的大小自动申请或释放内存。

(1) 配置linux内核,支持initramfs

在命令终端的linux-2.6.32.2内核目录下

[root@localhost ~]# cd linux-test/linux-2.6.32.2

然后执行
[root@localhost linux-2.6.32.2]# make menconfig

General setup  --->

[*] Initial RAM filesystem and RAM disk (initramfs/initrd) suppor
(/root/linux-test/myrootfs/rootfs) Initramfs source file(s) //填写你要制作成initramfs格式的根文件系统目录。

原因很简单,我们使用的是initramfs,而不是ramdisk,所以不用配置ramdisk的驱动支持项Device Drivers-->Block devices-->RAM block device support 项。相应的之后的(4096)Default RAM disk size kbytes等相关默认配置选项就不会再出现了。
另外initramfs技术和ramdisk技术的另一个重要的区别就是initramfs并不是在内存中模拟出一个磁盘,所以也就不在需要ramdisk中所需的ext2驱动支持。所以,File systems菜单下的ext2文件系统支持< > Second extended fs support选项就可以取消了。

(2) 进入制作好的根文件系统rootfs

[root@localhost linux-2.6.32.2]# cd ../myrootfs/rootfs
[root@localhost rootfs]#

因为initramfs根文件系统启动时执行的第一个程序是init,而不是linuxrc,所以在此,我们制作的根文件系统需要添加一个init文件,相应的linuxrc文件就不再需要了。于是执行

[root@localhost rootfs]# ln -s ./bin/busybox init
这样就为busybox创建了一个软链接init,这个文件就是我们要创建的init文件。

(3)修改内核的命令行参数

[root@localhost rootfs]# cd ../../linux-2.6.32.2
[root@localhost linux-2.6.32.2]# vim .config
用/CMD 定位到CONFIG_CMDLINE处,修改如下:

CONFIG_CMDLINE="console=ttySAC0 mem=64M"

(4)重新编译内核

[root@localhost linux-2.6.32.2]# make uImage

按照上面的配置,经过重新编译的内核后将initramfs根文件系统直接合并到内核镜像里边了。这样,合二为一的镜像就不再需要单独烧写根文件系统镜像了,相应的,启动内核时的参数就不需要添加initrd=……来指定initramfs的位置了。

(4)启动u-boot下载测试

Hit any key to stop autoboot:  0
[u-boot@MINI2440]# usbslave
USB host is connected. Waiting a download.

Now, Downloading [ADDRESS:31000000h,TOTAL:24052958]
RECEIVED FILE SIZE:24052958 (618KB/S, 38S)
[u-boot@MINI2440]# bootm 31000000

... ...

NET: Registered protocol family 1
RPC: Registered p transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
Kernel panic - not syncing: Out of memory and no killable processes...

... ...

发现确实是小内存的问题,参照文章

http://www.dbanotes.net/database/linux_outofmemory_oom_killer.html

这里需要将rootfs/lib/modules目录下的模块文件移除,然后重新编译

[root@localhost ~]# cd linux-test/myrootfs
[root@localhost myrootfs]# ls
mkrootfs  rootfs
[root@localhost myrootfs]# mv ./rootfs/lib/modules/* ./
[root@localhost myrootfs]# cd ../linux-2.6.32.2
[root@localhost linux-2.6.32.2]# make uImage

编译完成后生成uImage文件,启动u-boot下载

[u-boot@MINI2440]# tftp 31000000 uImage
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 10.1.0.128; our IP address is 10.1.0.129
Filename 'uImage'.
Load address: 0x31000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ###############
done
Bytes transferred = 6895692 (69384c hex)
[u-boot@MINI2440]# bootm 31000000
## Booting kernel from Legacy Image at 31000000 ...
   Image Name:   Linux-2.6.32.2
   Created:      2011-06-07   7:00:10 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    6895628 Bytes = 
6.6 MB
   Load Address: 30008000
   Entry Point:  30008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux.............................................................
................................................................................
................................................................................
........................................................ done, booting the kernel.
Linux version 2.6.32.2 (
root@localhost.localdomain) (gcc version 4.4.3 (ctng-1.6
.1) ) #16 T Jun 7 14:59:55 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
CPU: VIVT data cache, VIVT instr tion cache
Machine: my mini2440 devolopment board
singleboy@163.com
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 console=ttySAC0,115200 init=/linuxrc mem=64M root=
/dev/nfs rw nfsroot=10.1.0.128:/nfsboot/rootfs ip=10.1.0.129:10.1.0.128:10.1.0.1
:255.255.255.0::eth0:off
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: 55836KB available (3680K code, 418K data, 4828K init, 0K highmem)
SL : Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Hierarchical RCU implementation.
NR_IRQS:85
irq: clearing s pending status 00000003
irq: clearing s pending status 00000002
Console: colour dummy device 80x30
console [ttySAC0] enabled
Calibrating delay loop... 50.38 BogoMIPS (lpj=125952)
Mount-cache hash table entries: 512
CPU: Testing write b?r 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 h
usbcore: registered new device driver usb
s3c-i2c s3c2440-i2c: slave address 0x10
s3c-i2c s3c2440-i2c: bus freqncy 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 p transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
JFFS2 version 2.2. (NAND) 漏 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat, Inc.
msgmni has been set to 109
alg: No test for stdrng (krng)
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
Console: switching to colour frame b?r device 60x53
fb0: s3c2410fb frame b?r device
s3c2440- rt.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440- rt.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440- rt.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: Man?turer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-bit)
Scanning device for bad blocks
Creating 5 MTD partitions on "NAND 128MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000060000 : "param"
0x000000060000-0x000000560000 : "kernel"
0x000000560000-0x000008000000 : "rootfs"
0x000000000000-0x000008000000 : "nand"
dm9000 Ethernet Driver, V1.31
eth0: dm9000e at c486e300,c4872304 IRQ 51 MAC: 08:90:90:90:90:90 (chip)
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
h 1-0:1.0: USB h found
h 1-0:1.0: 2 ports detected
usbcore: registered new interface driver libus l
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 A134X
No device for DAI s3c24xx-i2s
ALSA device list:
  No soundcards found.
TCP c ic registered
NET: Registered protocol family 17
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
IP-Config: Complete:
     device=eth0, addr=10.1.0.129, mask=255.255.255.0, gw=10.1.0.1,
     host=10.1.0.129, domain=, nis-domain=(none),
     bootserver=10.1.0.128, rootserver=10.1.0.128, rootpath=
Freeing init memory: 4828K
----------munt all----------------
***********************************************
************booting to mini2440 *****************
Kernel version:linux-2.6.32.2
the fans:singleboy
Date:2011.5.30
***********************************************

Please press Enter to activate this console.

为了与后续生成的uImage文件区别,将这次生成的uImage文件备份到myrootfs目录下,重命名为uImag_initramfs

[root@localhost linux-2.6.32.2]# cp ./arch/arm/boot/uImage ../myrootfs/uImage_initramfs
[root@localhost linux-2.6.32.2]# ls ../myrootfs
2.6.32.2  2.6.32.2-FriendlyARM  mkrootfs  rootfs 
uImage_initramfs
为了方便后面的操作,现将之前移除的rootfs/lib/modules目录下的文件还原

[root@localhost myrootfs]# ls
2.6.32.2  2.6.32.2-FriendlyARM  mkrootfs  rootfs  uImage_initramfs
[root@localhost myrootfs]# mv 2.6.32.2 ./rootfs/lib/modules/2.6.32.2
[root@localhost myrootfs]# mv 2.6.32.2-FriendlyARM ./rootfs/lib/modules/2.6.32.2-FriendlyARM
[root@localhost myrootfs]#

然后需要执行
[root@localhost linux-2.6.32.2]# make menconfig

General setup  --->

[*] Initial RAM filesystem and RAM disk (initramfs/initrd) suppor
按空格键将“[*] Initial RAM filesystem and RAM disk (initramfs/initrd) suppor”选项关闭。

[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) suppor
然后重新编译。

【3】将制作根文件系统通过mkyaffs2image工具制作成yaffs文件系统映像文件,然后烧录到nand flash中。

(1) 将友善提供的mkyaffs2image.tgz包进行解压,即可使用:

[root@localhost linux-test]# ls
busybox-1.13.3          linux-2.6.39       rootfs_qtopia_qt4
busybox-1.18.4.tar.bz2  mkyaffs2image.tgz  rootfs_qtopia_qt4-20110304.tar.gz
linux-2.6.32.2          myrootfs           yaffs2
然后在myrootfs 目录下,使用命令mkyaffs2image rootfs rootfs.img 生成根文件系统映像文件。

[root@localhost linux-test]# tar -vxzf mkyaffs2image.tgz -C /
usr/sbin/mkyaffs2image
usr/sbin/mkyaffs2image-128M
[root@localhost linux-test]#
[root@localhost myrootfs]#
cd myrootfs
[root@localhost myrootfs]# mkyaffs2image-128M rootfs rootfs-128M

[root@localhost myrootfs]# ls
mkrootfs  rootfs  rootfs-128M  uImage_initramfs
[root@localhost myrootfs]#
其中mkyaffs2image-128M是用于128M及以上的nand flash。

(2)确认其是否有执行权限

[root@localhost myrootfs]# ll
总计 62760
-rwxr-xr-x  1 root root      554 05-30 14:40 mkrootfs
drwxr-xr-x 17 root root     4096 06-02 10:41 rootfs
-rw-------  1 root root 57285888 06-07 16:32 rootfs-128M
-rw-r--r--  1 root root  6895692 06-07 16:07 uImage_initramfs
赋予其执行权限

[root@localhost myrootfs]# chmod a+rwx rootfs-128M
[root@localhost myrootfs]# ll
总计 62760
-rwxr-xr-x  1 root root      554 05-30 14:40 mkrootfs
drwxr-xr-x 17 root root     4096 06-02 10:41 rootfs
-rwxrwxrwx  1 root root 57285888 06-07 16:32 rootfs-128M
-rw-r--r--  1 root root  6895692 06-07 16:07 uImage_initramfs
[root@localhost myrootfs]#

否则会产生'Permission denied' (0) 错误。

(2) 下载测试

将生成的rootfs.img文件复制到主机的/tftpboot目录下

[root@localhost myrootfs]# cp -drf rootfs-128M /tftpboot/
[root@localhost myrootfs]#

参数d表示保持与库文件的链接关系

(3) 给开发板上电,启动u-boot后用tftp下载rootfs根文件系统

U-Boot 2009.08

 modified by singleboy (singleboy@163.com)
 Love Linux forever!!

I2C:   ready
DRAM:  64 MB
Flash:  2 MB
NAND:  128 MiB
Video: 240x320x16 20kHz 62Hz
In:    serial
Out:   serial
Err:   serial
Net:   dm9000
U-Boot 2009.08
modified by singleboy(
singleboy@163.com)
Love Linux forever!!!
Hit any key to stop autoboot:  0
[u-boot@MINI2440]# tftp 30008000 rootfs-128M
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 10.1.0.128; our IP address is 10.1.0.129
Filename 'rootfs-128M'.
Load address: 0x30008000
Loading: #################################################################
              #################################################################         

              ......        

               #################################################################
              #######################################################
done
Bytes transferred = 55678656 (35196c0 hex)
[u-boot@MINI2440]#

OK!下载成功。将其烧录到nand flash,注意,nand flash分区表

Creating 5 MTD partitions on "NAND 128MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000060000 : "param"
0x000000060000-0x000000560000 : "kernel"
0x000000560000-0x000008000000 : "rootfs"
0x000000000000-0x000008000000 : "nand"
rootfs起始地址是560000。

[u-boot@MINI2440]# nand erase 0x560000 0x3600000

NAND erase: device 0 offset 0x560000, size 0x3600000
Erasing at 0x3b4000000000000 --   0% complete.
OK

[u-boot@MINI2440]# nand write 0x30008000 0x560000 0x3600000

NAND write: device 0 offset 0x560000, size 0x3600000
Writing at 0x3b4000000020000 -- 100% is complete. 56623104 bytes written: OK

 重启开发板

... ...

VFS: Mounted root (yaffs filesystem) on device 31:3.
Freeing init memory: 132K
Warning: unable to open an initial console.
Failed to execute /linuxrc.
  Attempting defaults...
Kernel panic - not syncing: No init found. 

问题分析:rootfs能够在nfs根文件系统中启动,nfs只能验证文件系统本身,而不能验证yaffs2格式的支持,重新设定引导参数从nfs启动,然后进入控制台将分别挂载/dev/mtdbolck0~3分区。

接下来,要解决nand flash 的mtd 分区的操作工具问题

这篇关于Linux-2.6.32.2内核在mini2440上的移植(四)---根文件系统制作(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656027

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。