Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78043
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 31
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-14 23:13
文章分类

全部博文(66)

文章存档

2015年(38)

2014年(28)

分类: LINUX

2014-11-04 09:16:37

为ARM嵌入式系统Linux制作根文件系统(一)
 
1.
ARM 嵌入式系统Linux的根文件系的组成:目录、Shell、库、脚本。

(1)目录

   根文件系统要包含的目录:/dev /lib /etc、/proc

   /dev:设备文件系统的挂接点

   /lib:用于存放动态链接库

   /etc:用来存放初始化脚本和其他配置文件的

   /proc:用来挂载存放系统信息虚拟文件系统

(2)Shell

   Shell 就是 Busybox,从网上下载来 busybox-1.9.1.tar.gz

   解压缩以后找到 Makefile 里面的 ARCH 和 CROSS_COMPILE,改成:

   ARCH   ?= arm

   CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-

本文关键词:嵌入式系统嵌入式开发 ARM学习 ARM嵌入式 Linux

   当然 CROSS_COMPILE 由你自己的编译器位置决定,然后:

   # make menuconfig

   # make

   # make install



   默认是安装在 Busybox 下的 _install 目录里,然后我们就可以在 Busybox

   生成的 Shell 基础上建根文件系统了, 以命令示之,如下:

   # mkdir /home/jianbw/rootfs

   # cd /home/jianbw/busybox/_install

   # cp -r ./ /home/jianbw/rootfs



   # cd /home/jianbw/rootfs

   # mkdir dev

   # mkdir etc

   # mkdir lib

   # mkdir proc

   # mkdir sys

   # mkdir tmp



   以 root 身份执行(可通过 su 切换):

   # cd dev

   # mknod -m 660 console c 5 1

   # mknod -m 660 null c 1 3

(3)库

   可拷贝开发板自带的文件系统的库,如果开发板的文件系统是映像,只需把映像挂载

   在某个目录下访问即可。假设映像为 demo.cramfs,以命令示之,如下:

   # mkdir /home/jianbw/demo

   # mount -o loop demo.cramfs /home/jianbw/demo

   # cd /home/jianbw/demo/lib

   # cp -r ./ /home/jianbw/rootfs/lib

(4)脚本

   要使 Shell 正常工作, 还要设置初始化脚本。

   首先是 /etc/inittab:

   # Startup the system

   null::sysinit:/bin/mount -o remount,rw /

   null::sysinit:/bin/mount -t proc proc /proc

   null::sysinit:/bin/mount -a

   null::sysinit:/bin/hostname -F /etc/hostname# Now run any rc scripts

   ::sysinit:/etc/init.d/rcS                   # Now invoke shell

   ::askfirst:/bin/ash                         # Logging junk

   null::sysinit:/bin/touch /var/log/messages

   null::respawn:/sbin/syslogd -n -m 0

   null::respawn:/sbin/klogd -n                # Stuff to do for the 3-finger salute

   ::ctrlaltdel:/sbin/reboot                        # Stuff to do before rebooting

   null::shutdown:/usr/bin/killall klogd

   null::shutdown:/usr/bin/killall syslogd

   null::shutdown:/bin/umount -a -r

   null::shutdown:/sbin/swapoff -a



   其次设置文件系统的挂载表 /etc/fstab:

   #                       
   /dev/root          /                  ext2      rw,noauto                           0      1
   proc                 /proc           proc     defaults                               0      0
   devpts              /dev/pts       devpts  defaults,gid=5,mode=620      0      0
   tmpfs                /tmp            tmpfs    defaults                             0      0
   sysfs                 /sys             sysfs     defaults                             0      0
  
   再设置 /etc/init.d/rcS:
   # Start udev
   /bin/mount -t tmpfs tmpfs /dev
   /sbin/udevd --daemon
   /sbin/udevstart  # Configure net interface
   /sbin/ifconfig lo 127.0.0.1 up
   /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo
   /sbin/ifconfig eth0 192.168.2.25 netmask 255.255.255.0
   /sbin/route add default gw 192.168.2.1
(5)生成根文件系统映像
   # mkcramfs rootfs rootfs.cramfs
龙人计算机嵌入式研发中心是国内最早进入嵌入式技术研发和应用推广的技术型企业之一,成立以来在专注于嵌入式底层应用技术的研究和开发的同时为广大客户提供嵌入式系统开发技术、嵌入式解决方案和嵌入式产品(嵌入式开发板、ARM开发板、ARM9开发板、ARM开发工具、ARM仿真器和ARM工控板、ARM实验仪等)。


2.
一、内核启动完之后,首先运行/linuxrc。

/linuxrc内容:

#!/bin/sh

echo "mount /etc as ramfs"

/bin/mount -n -t ramfs ramfs /etc      

/bin/cp -a /mnt/yaffs/etc/* /etc //关机的时候我们会保存/etc的内容到/mnt/yaffs/etc.



echo "re-create the /etc/mtab entries"

# re-create the /etc/mtab entries

/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/2 /

/bin/mount -f -t ramfs ramfs /etc



exec /sbin/init

首先你要看懂这个linuxrc,

1. /bin/mount -n -t ramfs ramfs /etc  



这句话的作用加载一个ramfs作为/etc目录。这样/etc就是一个可写目录。

看这个脚本,得出你的根文件系统是一个cramfs,是一个只读文件系统中,而/etc作为系统运行配置文件的存放地点,可能会写一些运行状

态在这里, linuxrc第一件事情就是将一个ramfs mount 到/etc只读目录中,使得/etc/目录可写,指定参数

-n的目的是告诉mount不要写/etc/mtab, 这个文件存放当前系统mount了的所有文件系统中。

因为现在/etc/目录还是只读,所以这次mount不要写这个文件,否则会失败。



而你问到的 ramfs在哪里,这个在你的 /etc/fstab文件中应该有ramfs一项, mount 会去找这项,如果没有,mount会失败。后面就执行不下去。



2. /bin/cp -a /mnt/yaffs/etc/* /etc

/etc成为可写目录后,将所有/mnt/yaffs/etc中的配置文件拷贝到/etc/中,这说明你的ramfs可能是一个空的ramfs,没有配置文件,或者配置文件比较老。同时也说明你这个系统是一个只读系统,每次系统运行中写入的配置不会保留。



将以前mount的那些信息重新写到/etc/mtab中,命令就是下面这些。

3. /bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/2 /

/bin/mount -f -t ramfs ramfs /etc



这些命令只是将这些mount信息写到/etc/mtab中,不会实际去mount这些block device,说明你的根文件系统依然是以前的那个/dev/bon/2



4. exec /sbin/init

执行根文件系统中的init执行程序,使其成为1号进程。shell正式运行。

###################################################################################

/etc/mtab介绍:

    mtab同/etc/fstab的格式一样,它用于记录已经挂载的分区信息。

注意:

    如果没有/linuxrc这个文件,系统默认首先运行/sbin/init。
阅读(813) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~