2010年(49)
分类: 嵌入式
2010-09-07 15:43:06
参考《基于Powerpc的嵌入式linux》。
因为
[root@localhost src]# dd
if=/dev/zero of=rootfs bs=1k count=8192
使用dd命令从/dev/zero设备拷贝8192kbytes到src目录下的rootfs文件。
此时,rootfs文件应该是一个block device,只是上面没有文件系统。
这个地方遇到一点问题,使用书上的命令会有问题,看了一下孙磊师兄的文档,发现他在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设备,可以mount到ramdisk目录了。
[root@localhost src]#
mount -o loop -t ext2 rootfs ramdisk
[root@localhost src]# cd
ramdisk
[root@localhost ramdisk]#
ls
lost+found
[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 其它工具及用户程序的存放处
按照孙磊的手册,可以直接将ppc_8xx/dev目录下的node拷贝过来,注意其中的一些符号链接。
[root@localhost dev]# cp -dpR /opt/eldk
dp参数表示符号链接拷贝为符号链接,不拷贝链接的文件,并且拷贝原文件的所有属性。
根据书上描述,需要将ppc_8xx/lib目录下的如下库文件拷贝过来,但是在后面我使用的shell是bash而不是书上的ash,需要另外一个库文件libtermcap.so.
1)先在别的目录下建立lib_tmp目录,然后将库文件依次拷贝到lib_tmp中:
cp /opt/eldk
cp /opt/eldk
cp /opt/eldk
cp /opt/eldk
cp /opt/eldk
cp /opt/eldk
cp /opt/eldk
cp /opt/eldk
cp /opt/eldk
cp /opt/eldk
2)用strip命令去掉调试信息,减小体积
ppc_8xx-strip --remove-section=.note --remove-section=.comment *
3)拷贝到ramdisk/lib目录
cp ./* ../ramdisk/lib
4) 用ln命令做软链接
进入ramdisk/lib目录
ln -s ld-
ln -s libc-
ln -s libcrypt-
ln -s libdl-
ln -s libnsl-
ln -s libnss_compat-
ln -s libnss_files-
ln -s libresolv-
ln -s libutil-
ln -s libtermcap.so.
/etc目录包含了Linux的配置文件,它们决定Linux引导、运行的特性。
1)inittab
init进程的配置文件内容:
si::sysinit:/etc/rc.sysinit
::respawn:/bin/sh
Inittab的思路是跳过getty->login->shell过程,直接启动shell。
2)rc.sysinit
系统初始化脚本:
#!/bin/sh
/bin/echo ">
execute rc.sysinit"
/bin/mount -a
[root@localhost etc]# chmod 555 rc.sysinit
3)fstab
需要mount的文件系统。
proc /proc proc defaults 0 0
(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 root为root添加密码;
adduser xxx 添加用户;
要点:
(1)添加用户的问题
adduser ocean命令没有新建用户目录,所以必须自己手动添加,在home目录下
mkdir ocean
chown ocean /home/ocean
1)inetd.conf
Inetd守护进程的配置文件。(我没做)
2)nsswitch.conf
Glibc的NSS配置文件:
psswd: files
shadow: files
group: files
hosts: files
ethers: files
netmasks: files
networks: files
protocols: files
services: files
这两个目录里面的命令均从eldk
/bin目录命令如下,并注意这里我用的是bash而不是书上说的ash,因为ppc_8xx/bin目录下无ash命令。另外sh符号链接必须自己做,直接拷贝没有用。
[root@localhost bin]# cp
/opt/eldk
[root@localhost bin]# cp
/opt/eldk
[root@localhost bin]# cp
/opt/eldk
[root@localhost bin]# cp
/opt/eldk
[root@localhost bin]# ln
-s bash sh
/sbin目录下只需要如下一个命令:
[root@localhost sbin]# cp
/opt/eldk
Linux启动后会调用/sbin/init,init将会寻找/etc/inittab文件并按照内容执行。
另外,后来发现insmod和rmmod命令用模块添加和删除,所以也复制到sbin目录。
[root@localhost sbin]# cp
/opt/eldk
[root@localhost sbin]# cp
/opt/eldk
在busybox.net网站上下载最新的busybox包,我下载的是
(1)修改makefile中的ARCH和CROSS_COMPILE
(2)make menuconfig,修改配置(参考孙磊师兄的总结)
(3)make
(4)make install,这一步要注意,在配置时要设定install的路径,不确定当前路径就不要运作这个命令,否则可能linux server挂掉。
Install出来一个linuxrc文件,另个目录bin和sbin,将它们拷贝到ramdisk根目录即可。
要点:
(1)chmod 4777 bin/busybox
用来设置linux文件的权限,至于为什么是4个8进制数,参考相关文献。如果不这样有些命令无法正常运行,必然在普通用户下运行su.
使用nfs文件系统来测试ramdisk
1)在nfs服务中添加ramdisk目录
2)将rootfs挂载到ramdiks目录
3)在uboot的bootargs中配置root=/dev/nfs,并把将ramdisk所在目录做为根目录
这时候遇到一个问题,当TC505重启后,想要umount ramdisk目录,则有device busy的错误。最后发现可以用umount –l ramdisk来解决。
#gzip -v9 rootfs
关于如何使用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 内核img和ramdisk 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
但是,出现错误
1) console问题是因为dev目录下没有console和null设备
虽然在mount的目录下已经修改了,不知道怎么回事rootfs的dev目录并没有这些设备节点
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
内核对ramdisk的大小是有设定的,比如我现在做了
使用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.
ln -s librt-2.6.so librt.so.1
Mknod –m 777 ttyCPM0 204