Chinaunix首页 | 论坛 | 博客
  • 博客访问: 217548
  • 博文数量: 49
  • 博客积分: 2101
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-07 10:38
文章分类

全部博文(49)

文章存档

2010年(49)

我的朋友

分类: 嵌入式

2010-09-07 15:43:06

1 前期准备

参考《基于Powerpc的嵌入式linux

2 创建ramdisk block device

2.1建立Ramdisk文件

因为4M空间太小,所以用8M空间做实验。本来我也是用4M的,现在返工用8M

[root@localhost src]# dd if=/dev/zero of=rootfs bs=1k count=8192

使用dd命令从/dev/zero设备拷贝8192kbytessrc目录下的rootfs文件。

此时,rootfs文件应该是一个block device,只是上面没有文件系统。

2.2ramdisk建立ext2文件系统

这个地方遇到一点问题,使用书上的命令会有问题,看了一下孙磊师兄的文档,发现他在mke2fs命令后面加上了-F命令,试了一下,OK了。

[root@localhost src]# mke2fs -m 0 -N 2000 ./rootfs -F

mke2fs 1.35 (28-Feb-2004)

./rootfs is mounted; mke2fs forced anyway.  Hope /etc/mtab is incorrect.

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

2000 inodes, 8192 blocks

0 blocks (0.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=8388608

1 block group

8192 blocks per group, 8192 fragments per group

2000 inodes per group

 

Writing inode tables: done                           

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 36 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

此时,rootfs就成了一个带有ext2文件系统的block设备,可以mountramdisk目录了。

[root@localhost src]# mount -o loop -t ext2 rootfs ramdisk

[root@localhost src]# cd ramdisk

[root@localhost ramdisk]# ls

lost+found

3 ramdisk内容

3.1使用mkdir建立目录

[root@localhost ramdisk]# mkdir dev

[root@localhost ramdisk]# mkdir proc

[root@localhost ramdisk]# mkdir etc

[root@localhost ramdisk]# mkdir sbin

[root@localhost ramdisk]# mkdir bin

[root@localhost ramdisk]# mkdir lib

[root@localhost ramdisk]# mkdir mnt

[root@localhost ramdisk]# mkdir usr

[root@localhost mnt.ramdisk1]# chmod 777 ./*

dev 设备文件目录,需要在此目录下建立设备节点node文件;

proc 这个目录保持空即可,linux系统运行时会把其作为linux proc文件系统的mount点;

etc 系统配置文件的存放处,包括inittab等等,里面的文件需要我们自己制作;

sbin 系统常用命令的存放处,保存为空;

bin  linux系统必须命令的存放处,我们必须在此添加这些命令

lib  linux共享库文件的存放处,必须手动添加

mnt 手动mount挂载点

usr  其它工具及用户程序的存放处

3.2 /dev目录

按照孙磊的手册,可以直接将ppc_8xx/dev目录下的node拷贝过来,注意其中的一些符号链接。

[root@localhost dev]# cp -dpR /opt/eldk2.0.2/ppc_8xx/dev/* ./

dp参数表示符号链接拷贝为符号链接,不拷贝链接的文件,并且拷贝原文件的所有属性。

3.3 /lib目录

根据书上描述,需要将ppc_8xx/lib目录下的如下库文件拷贝过来,但是在后面我使用的shellbash而不是书上的ash,需要另外一个库文件libtermcap.so.2.0.8,所以我多拷贝一个库文件过来。由于这些库文件的大小以及超过了ramdisk的大小,所以我是这么做的:

1)先在别的目录下建立lib_tmp目录,然后将库文件依次拷贝到lib_tmp中:

cp /opt/eldk2.0.2/ppc_8xx/lib/ld-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libc-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libcrypt-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libdl-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libnsl-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libnss_compat-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libnss_files-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libresolv-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libutil-2.2.5.so ./

cp /opt/eldk2.0.2/ppc_8xx/lib/libtermcap.so.2.0.8 ./

2)用strip命令去掉调试信息,减小体积

ppc_8xx-strip --remove-section=.note --remove-section=.comment *

3)拷贝到ramdisk/lib目录

cp ./* ../ramdisk/lib

4) ln命令做软链接

进入ramdisk/lib目录

ln -s ld-2.2.5.so ld.so.1

ln -s libc-2.2.5.so libc.so.6

ln -s libcrypt-2.2.5.so libcrypt.so.1

ln -s libdl-2.2.5.so libdl.so.2

ln -s libnsl-2.2.5.so libnsl.so.1

ln -s libnss_compat-2.2.5.so libnss_compat.so.2

ln -s libnss_files-2.2.5.so libnss_files.so.2

ln -s libresolv-2.2.5.so libresolv.so.2

ln -s libutil-2.2.5.so libutil.so.1

ln -s libtermcap.so.2.0.8 libtermcap.so.2

 

3.4 /etc目录

/etc目录包含了Linux的配置文件,它们决定Linux引导、运行的特性。

3.4.1 Linux在引导时必需的:

1inittab

init进程的配置文件内容:

si::sysinit:/etc/rc.sysinit

 

::respawn:/bin/sh

Inittab的思路是跳过getty->login->shell过程,直接启动shell

2rc.sysinit 

系统初始化脚本:

#!/bin/sh

 

/bin/echo "> execute rc.sysinit"

 

/bin/mount -a             

[root@localhost etc]# chmod 555 rc.sysinit

3fstab 

需要mount的文件系统。

proc                    /proc                   proc    defaults        0 0

3.4.2 用户名与密码

1)添加passwd文件

root:x:0:0:root:/root:/bin/sh

2)添加shadow文件

root::0:0:99999:7:::

此时,密码为空

3)添加group文件

root:x:0:

4)在根目录下建立root目录

mkdir root

5)在根目录下建立home目录

mkdir home

6)配置inittab如下

si::sysinit:/etc/rc.sysinit

#::respawn:/bin/sh

:3:respawn:/sbin/getty 115200 ttyCPM0

7)启动后,以root登录

passwd rootroot添加密码;

adduser xxx 添加用户;

要点:

1)添加用户的问题

adduser ocean命令没有新建用户目录,所以必须自己手动添加,在home目录下

mkdir ocean

chown ocean /home/ocean

3.4.3 运行时需要的:

1inetd.conf 

Inetd守护进程的配置文件。(我没做)

2nsswitch.conf 

GlibcNSS配置文件:

psswd: files

shadow: files

group: files

hosts: files

ethers: files

netmasks: files

networks: files

protocols: files

services: files

3.5 /bin/sbin目录

3.5.1 不使用busybox

这两个目录里面的命令均从eldk2.0.2/ppc_8xx对应目录拷贝

/bin目录命令如下,并注意这里我用的是bash而不是书上说的ash,因为ppc_8xx/bin目录下无ash命令。另外sh符号链接必须自己做,直接拷贝没有用。

[root@localhost bin]# cp /opt/eldk2.0.2/ppc_8xx/bin/bash ./

[root@localhost bin]# cp /opt/eldk2.0.2/ppc_8xx/bin/echo ./

[root@localhost bin]# cp /opt/eldk2.0.2/ppc_8xx/bin/ls ./

[root@localhost bin]# cp /opt/eldk2.0.2/ppc_8xx/bin/mount ./

[root@localhost bin]# ln -s bash sh

 

/sbin目录下只需要如下一个命令:

[root@localhost sbin]# cp /opt/eldk2.0.2/ppc_8xx/sbin/init ./

Linux启动后会调用/sbin/initinit将会寻找/etc/inittab文件并按照内容执行。

另外,后来发现insmodrmmod命令用模块添加和删除,所以也复制到sbin目录。

[root@localhost sbin]# cp /opt/eldk2.0.2/ppc_8xx/sbin/insmod ./

[root@localhost sbin]# cp /opt/eldk2.0.2/ppc_8xx/sbin/rmmod ./

3.5.2 使用busybox

busybox.net网站上下载最新的busybox包,我下载的是1.15.2

1)修改makefile中的ARCHCROSS_COMPILE

2make menuconfig,修改配置(参考孙磊师兄的总结)

3make

4make install,这一步要注意,在配置时要设定install的路径,不确定当前路径就不要运作这个命令,否则可能linux server挂掉。

Install出来一个linuxrc文件,另个目录binsbin,将它们拷贝到ramdisk根目录即可。

要点:

1chmod 4777 bin/busybox

用来设置linux文件的权限,至于为什么是48进制数,参考相关文献。如果不这样有些命令无法正常运行,必然在普通用户下运行su.

4 测试ramdisk

使用nfs文件系统来测试ramdisk

1)在nfs服务中添加ramdisk目录

2)将rootfs挂载到ramdiks目录

3)在ubootbootargs中配置root=/dev/nfs,并把将ramdisk所在目录做为根目录

这时候遇到一个问题,当TC505重启后,想要umount ramdisk目录,则有device busy的错误。最后发现可以用umount –l ramdisk来解决。

5 生成ramdisk image

#gzip -v9 rootfs

5.1 如何使用ramdisk img

关于如何使用ramdisk image,在uboot引导环境下,有如下两种方法:

1)  linux内核和ramdisk img分开,使用bootm krenel_addr ramdisk_addr格式

#mkimage -T ramdisk -C gzip -n 'Test Ramdisk Image' -d rootfs.gz uRamdisk

内核当然也是需要加上uboot的头部信息,ramdisk同样需要,否则uboot不认识会报错。

2)  linux 内核imgramdisk img和在一起

mkimage -A ppc -O linux -T multi -C gzip -a 0 -e 0 -n 'linux_ramdisk' -d ./vmlinux.gz:./rootfs.gz linux_ramdisk.img

bootm linux_ramdisk_addr

5.2 错误解决

但是,出现错误

 

1)  console问题是因为dev目录下没有consolenull设备

虽然在mount的目录下已经修改了,不知道怎么回事rootfsdev目录并没有这些设备节点

2) attempt to access beyond end of device

这个问题一直找不到原因,网络上还有师兄我都问了,都没有结果。

原先我是在自己装的redhat linux 4.7服务器上作的,然后我在公司的.21服务器上做了一遍又可以了。具体原因不明。难道因为我装了中文的redhat4.7系统?

 

问题解决后,能够正却启动了,部分打印如下:

INIT: version 2.78 booting

execute rc.sysinit

INIT: Entering runlevel: 3

sh-2.05#

3)出现Please press Enter to activate this console.

这是因为inittab

::respawn:/bin/sh

曾经被我改成

::askfirst:/bin/sh

 

 

附录

1 内核支持

内核对ramdisk的大小是有设定的,比如我现在做了8Mramdisk,那么内核对ramdisk的支持部分应该设定8192或更大。

2 库文件

使用ldd 命令能看到可执行文件使用的库。

2.6内核

ln -s ld-2.6.so ld.so.1

ln -s libc-2.6.so libc.so.6

ln -s libcrypt-2.6.so libcrypt.so.1

ln -s libdl-2.6.so libdl.so.2

ln -s libnsl-2.6.so libnsl.so.1

ln -s libnss_compat-2.6.so libnss_compat.so.2

ln -s libnss_files-2.6.so libnss_files.so.2

ln -s libresolv-2.6.so libresolv.so.2

ln -s libutil-2.6.so libutil.so.1

ln -s libtermcap.so.2.0.8 libtermcap.so.2

ln -s librt-2.6.so librt.so.1

 

 

3 2.6.31

Mknod –m 777 ttyCPM0 204 46 c

阅读(2175) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~