|
楼主 |
发表于 2004-5-26 20:02:02
|
显示全部楼层
在http://www.augcyber.com/linux-world/nfs.htm有
好的介绍,同仁也一起试试,大家集思广益,开源项目的成功更
需要热情和奉献.
以下是原文转贴:
三、 建立基于nfs并使用BUSYBOX的根文件系统
文件系统是LINUX操作系统的重要组成部分,在启动的的最后阶段,系统将会寻找init文件,建立init进程,并按照etc目录的一些脚本文件配置系统,完成系统的最后启动。文件系统主要有下面几个目录组成;
/bin — 保存大多数象init、busybox、shell和文件管理程序等。
/dev — LINUX操作系统的所有设备文件
/etc — 系统配置文件
/lib — 包含所有系统运行所必需的库文件。
在嵌入式系统中,使用BUSYBOX是一个很好的选择,它包含了一百多种LINUX上标准的工具程序,仅需几百KBYTE空间(视所选择工具程序的数目来决定大小),BUSYBOX可在此下载,主要包含的命令如下:
adjtimex dos2unixhead makedevs readlink touch
ar dpkg hostid md5sum reboot
tr ash dpkg-deb hostname mkdir
renice traceroute basename du hush
mkfifo reset true bash dumpkmapid
mkfs.minix rm tty busybox dutmp
ifconfig mknod rmdir umount cat
echo init.busybox mkswap rmmod uname
chat ed insmod mktemp route
uniq chgrp egrep kbd modprobe
rpm2cpio unix2dos chmod env kill
more sed update chown expr
killall mount setkeycodes uptime chroot
false klogd msh sh usleep
chvt fbset lash mt sleep
uudecode clear fdflush length mv
sort uuencode cmp find llinuxrc
nc stty vi cp free
ln nslookup swapoff watchdog cpio
freeramdisk loadacm pidof swapon wc
cut fsck.minix loadfont ping sync
wget date ftp loadkmap pivot_root
syslogd which dc getopt logger
poweroff tail whoami dd getty
login printf tar xargs deallocvt
grep logname ps tee yes
df gunzip logread pwd telnet
zcat dirname gzip ls test
dmesg halt lsmod rdate tftp
BUSYBOX使用非常方便,只要建立一个符号连接即可,用户可以通过配置Config.h和Makefile文件来定制BUSYBOX。编译BUSYBOX的步骤如下:
首先需要准备一下交叉编译器的头文件,将include目录中的头文件copy到sys-include目录中(如果曾经做过这一步骤,则跳过)。
# cd /usr/local/arm/arm-linux/sys-include
# rm –rf *
# cp –rf ../include/* .
然后将busybox-0.60.5解压到/usr/src/arm目录中编译。
# cd /usr/src/arm
# tar xvzf busybux-0.60.5.tar.gz
# cd busybox-0.60.5
# make
编译完成后就得到了二进制文件busybox。
到现在为止,我们已经有了Liunx kernel及BUSYBOX,现在该到了制做根文件系统的时候了,首先建立根文件系统的目录:
# cd /usr/src/arm
# mkdir nfs
紧跟着再建立一些“标准”的目录。
# cd nfs
# mkdir dev etc bin lib proc mnt tmp var
# chmod 755 dev etc bin lib mnt tmp var
# chmod 555 proc
# ln -s bin sbin
进入dev目录下建立设备文件。
# cd dev
# mknod zero c 1 5
# mknod kmem c 1 2
# mknod mem c 1 1
# mknod null c 1 3
# mknod pt0 c 96,0
# mknod ptmx c 5 2
# mknod ptya0 c 2 176
# mknod tty c 5 0
# mknod tty0 c 4 0
# mknod tty1 c 4 1
# mknod tty2 c 4 2
# mknod tty3 c 4 3
# mknod tty4 c 4 4
# mknod tty5 c 4 5
# mknod tty6 c 4 6
# mknod tty7 c 4 7
# mknod tty8 c 4 8
# mknod tty9 c 4 9
# mknod ttyAM0 c 204 16
# mknod ttyAM1 c 204 17
# ln –s console ttyAM0
# chmod 666 *
然后再进入etc目录,建立相应的文件,为方便起见,可直接下载etc.tar.gz,并解压到etc目录中。
# cd ../etc
# tar xvzf etc.tar.gz
最后,将busybox copy到bin目录中,分别使用ln –s建立每一个命令的符号连接。至此,LINUX的根文件系统已经建立,但应该注意的是busybox需要glibc支持(如果使用静态连接则不需要glibc库文件),因此还需要将运行busybox所需的库文件copy到lib目录中,并建立符号连接。
# cd ../lib
# cp /usr/local/arm/arm-linux/lib/libc-2.1.3.so .
# cp /usr/local/arm/arm-linux/lib/ld-2.1.3.so .
# ln –s libc-2.1.3.so libc.so.6
# ln –s ld-2.1.3.so ld-linux.so.2
然后,使用ldconfig建立缓存文件/etc/ld.so.cache。
# cd ..
# ldconfig –r .
到此为止,基于nfs并使用BUSYBOX的根文件系统已经完全建立起来,并且随时可供使用,当然,为了让EVB7312目标板能够从宿主机通过以太网安装nfs根文件系统,LINUX宿主机需要启动NFS服务(注意:需要关掉防火墙,将宿主机IP设为192.168.1.9),配置etc/exports文件,在exports文件中加入如下语句:
/usr/src/arm/nfs 192.168.1.*(rw)
并执行exportfs –rv,以便etc/exports与数据库同步。
再按照上一节的描述,使用lilo重新启动LINUX for EP7312,可以看到系统已经可以完全启动,启动信息如下:
LILO>load c0028000 Image
ARP broadcast 1
eth addr: 20:39:aa:00:12:0c
TFTP from server 192.168.1.9; our IP address is 192.168.1.1
Filename 'Image'.
Load address: 0xc0028000
Loading:
########################################################################
########################################################################
########################################################################
#################################
done
Bytes transferred = 1173015 (11e617 hex)
LILO>boot
Starting kernel ...
Linux version 2.4.13-ac4-rmk1 (root@AugCyber) (gcc version 2.95.2 19991024 (release)) #1 Thu Jun 5 19:08:10 EDT 2003
Processor: ARM ARM720T revision 2
Architecture: Cirrus Logic EDB7312 (EP7312 evaluation board)
On node 0 totalpages: 4096
zone(0): 4096 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/nfs nfsroot=192.168.1.9:/usr/src/arm/nfs ip=192.168.1.1
Calibrating delay loop... 36.76 BogoMIPS
Memory: 16MB = 16MB total
Memory: 14760KB available (1042K code, 221K data, 52K init)
Dentry-cache hash table entries: 2048 (order: 2, 16384 bytes)
Inode-cache hash table entries: 1024 (order: 1, 8192 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 4096 (order: 2, 16384 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Starting kswapd v1.8
pty: 256 Unix98 ptys configured
block: queued sectors max/low 9717kB/3239kB, 64 slots per queue
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
cs89x0:cs89x0_probe(0x0)
PP_addr=0x3000
cs89x0.c: v2.4.3-pre1 Russell Nelson <[email protected]>, Andrew Morton <[email protected]>
eth0: cs8900 rev J found at 0xfc000000 [Cirrus EEPROM]
cs89x0 media RJ-45, IRQ 7, programmed I/O, MAC 01:02:03:04:05:06
cs89x0_probe1() successful
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 1024 bind 1024)
eth0: using half-duplex 10Base-T (RJ-45)
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Complete:
device=eth0, addr=192.168.1.1, mask=255.255.255.0, gw=255.255.255.255,
host=192.168.1.1, domain=, nis-domain=(none),
bootserver=255.255.255.255, rootserver=192.168.1.9, rootpath=
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com
Looking up port of RPC 100003/2 on 192.168.1.9
Looking up port of RPC 100005/1 on 192.168.1.9
VFS: Mounted root (nfs filesystem).
Freeing init memory: 52K
init started: BusyBox v0.60.5 (2003.06.11-18:11+0000) multi-call binary
mount: /etc/mtab: Permission denied
mount: /etc/mtab: Permission denied
Starting syslogd.
Please press Enter to activate this console.
BusyBox v0.60.5 (2003.06.11-18:11+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
[EP7312/]# ls
bin dev etc lib mnt proc sbin tmp var
[EP7312/]#
通过前面三节的学习,我们已经建立并启动了一个完整的嵌入式LINUX操作系统,不过我们同时也已经注意到它是通过以太网络载入并启动,对于嵌入式系统,很多场合需要直接从FLASH启动LINUX,我们将在后面的章节中学习如何制作RAMDISK,以及如何从FLASH启动嵌入式LINUX操作系统。 |
|