概 述
本文是linux开发的一个入门文档,介绍了从nfs启动android操作系统的相关步骤。
1. 开发环境
虚拟机:ubuntu8.10
虚拟机IP:172.16.10.73 网关:172.16.10.1 子网掩码:255.255.255.0 广播地址:172.16.1.255
开发板IP:172.16.10.211 广播地址:172.16.10.255 子网掩码 255.255.255.0
建立Linux虚拟机
关键设置:在虚拟机里一定要选上Bridged:connected directly to the physical network。
2.建立NFS服务
1.安装NFS
Ubuntu上默认是没有安装NFS服务器的,首先要安装NFS服务程序:
$ sudo apt-get install nfs-kernel-server
安装nfs-kernel-server时,apt会自动安装nfs-common和portmap
这样,宿主机就相当于NFS Server
2.配置NFS
(1)配置portmap
方法1: 编辑/etc/default/portmap, 将 -i 127.0.0.1 去掉.
方法2: $ sudo dpkg-reconfigure portmap , 对Should portmap be bound to the loopback address? 选N.
(2)配置/etc/hosts.deny
禁止任何host(主机)能和你的NFS服务器进行NFS连接,加入:
### NFS DAEMONS
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
(3)配 置/etc/hosts.allow
允许那些你想要的主机和你的NFS服务器建立连接。下列步骤将允许任何IP地址以172.16.10开头的主机(连 接到NFS服务器上),也可以指定
特定的IP地址,加入:
### NFS DAEMONS
portmap: 172.16.8. *
lockd: 172.16.8.*
rquotad: 172.16.8.*
mountd: 172.16.8.*
statd: 172.16.8. *
/etc/hosts.deny 和 /etc/hosts.allow 设置对portmap的访问. 采用这两个配置文件有点类似"mask"的意思. 现在/etc/hosts.deny中禁止所有用 户对portmap的访问. 再在/etc/hosts.allow 中允许某些用户对portmap的访问.
$sudo /etc/init.d/portmap restart
重启portmap daemon.
(4)配置/etc/exports
NFS挂载目录及权限由/etc/exports文件定义
比如我要将将我的/home/android/nfsroot目录让所有的IP共享, 则在该文件末尾添加下列语句:
/root/share/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
若更改了/etc/exports, 运行$sudo exportfs -r 更新 运行
$ sudo /etc/init.d/nfs-kernel-server restart 重启nfs服务
(5)测试NFS
可以尝试一下挂载本地磁盘
我前面开始时已经提到了我的虚拟机IP172.16.10.73
#sudo mkdir nfsroot
将原来的文件系统的内容拷贝到这个目录。
#sudo mount –o loop ramdisk /mnt (注:这里有ramdisk文件系统由陈美友提供)
#sudo cp –rf /mnt /home/android/nfsroot
#sudo umount /mnt
我现在试把/home/android/nfsroot目录挂载到/mnt目录下
#mount -t nfs 172.16.8.67:/root/share/nfsroot /mnt
成功的挂载上的话你会在/mnt目录下看到nfsroot这个文件夹下的内容
sudo gedit /rootfs/etc/init.d/rcS
#! /bin/sh
mount –o remount,rw/
/sbin/ifconfig eth0 172.16.10.211
3.建立tftp服务
由于在uboot执行tftp命令时选用的是虚拟机里的文件,所以建立了tftp服务。
sudo apt-get install tftp tftpd xinetd tftp-hpa tftpd-hpa
cd /etc/xinetd.d/
sudo vim tftp
更改后如下:
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/android/tftpboot -c
per_source = 11
cps = 100 2
flags = IPv4
}
建立tftp服务文件目录
在/home/android/下建立sudo mkdir /tftpboot
sudo chmod 777 /tftpboot -R
重新启动服务
sudo /etc/init.d/xinetd restart
测试:
cd /home
(/tftpboot 下存放文件zImage)
sudo tftp 192.16.10.211
tftp> get zImage
如果在home目录下看到zImage说明配置正确。
4.内核配置
用了最新的dm9000.c文件(由陈美友提供),替换driver/net/dm9000.c文件.
在执行make menuconfig命令后,
在boot options里写入(如图所示)
noinitrd root=/dev/nfs rw nfsroot=172.16.10.73:/home/android/nfsroot ip=172.16.10.73:172.16.10.211:255.255.255.0 console=ttyS0,115200 init=/linuxrc mem=64M
在NetworkingàNetworking optionsà选上以下选项:
在Device DriversàNetwork device supportàEthernet(10 or 100Mbit)里选上:
在File systemsàNetwork File Systems里选上:
注:以上在make menuconfig中有些选项可能不是必须的,待进一步研究!
5.通过NFS启动开发板
当NFS 服务设置好并启动后,我们就可以把NFS 作为根文件系统来启动开发板了 通过使用NFS 作为根文件系统,开发板的“硬盘”就可以变得很大,因为您使用的是主机的硬盘 。这个时候把已有的文件系统
这是使用linux 作为开发经常使用的方法 ,打开串口终端,进入Uboot,设置虚拟机的IP
Ø setenv serverip 172.16.10.73
设置开发板的IP :
Ø setenv ipaddr 172.16.10.211
Ø 设置启动参数:
Ø setenv bootargs console=ttyS0 root=/dev/nfs nfsroot=172.16.10.73:/home/android/nfsroot ip=172.16.10.211:172.16.10.73:172.16.10.1:255.255.255.0:www.cn-emb.cn:eth0:off
这里解释下这条命令里面的意思:
1)nfsroot=172.16.10.73这个是我的虚拟机IP
2)ip=172.16.10.211:172.16.10.73:172.16.10.1:255.255.255.0
第一个IP是开发板的IP(开发板的IP不要与局域网内其它IP冲突),第二个是虚拟机的IP,第三个也是虚拟机的IP,第四个是开发板的子网掩码
执行完这条命令后再继续执行
>boot tftp 20400000 androidimg;bootm 20400000
如果一切顺利的话将会进入到开发板上去
进入到开发板后你就可以去mount你主机的共享目录了
下面是启动时的信息。
……
Looking up port of RPC 100005/1 on 172.16.10.73
VFS: Mounted root (nfs filesystem).
Freeing init memory: 124K
init started: BusyBox v1.11.1 (2009-03-04 14:12:26 CST)
starting pid 221, tty '': '/etc/init.d/rcS'
Processing etc/init.d/rc.S
Mount all
Start mdev....
Start network...
starting pid 227, tty '': '-/bin/sh'
Processing /etc/profile... Set search library path
Set user path
Done
# ls
bin etc home lost+found root tmp
boot gdbserver lib mnt sbin usr
dev hello linuxrc proc sys var