最简单linux-3.5.4搭建nfs文件系统

传统的移植内核都有搞什么nand分区,yaffs2文件系统,由于此内核是最简单的,纯净的内核,本人的意图是动手写每一行驱动,所以就不按照传统的方法走了。

1,添加网络驱动,在 gedit arch/arm/mach-s3c64xx/mach-my6410.c添加以下代码:

#define S3C64XX_PA_DM9000	(0x18000000)
#define S3C64XX_SZ_DM9000	SZ_1M
static struct resource dm9000_resources[] = {
	[0] = {
		.start		= S3C64XX_PA_DM9000,
		.end		= S3C64XX_PA_DM9000 + 3,
		.flags		= IORESOURCE_MEM,
	},
	[1] = {
		.start		= S3C64XX_PA_DM9000 + 4,
		.end		= S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,
		.flags		= IORESOURCE_MEM,
	},
	[2] = {
		.start		= IRQ_EINT(7),
		.end		= IRQ_EINT(7),
		.flags		= IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,
	},
};

static struct dm9000_plat_data dm9000_setup = {
	.flags			= DM9000_PLATF_16BITONLY,
	.dev_addr		= { 0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 },
};

static struct platform_device s3c_device_dm9000 = {
	.name			= "dm9000",
	.id				= 0,
	.num_resources	= ARRAY_SIZE(dm9000_resources),
	.resource		= dm9000_resources,
	.dev			= {
		.platform_data = &dm9000_setup,
	}
};
static struct platform_device *my6410_devices[] __initdata = {
	&s3c_device_dm9000,
};
退出后配置内核,关于配置内网络请参照我另一个博客 http://www.cnblogs.com/zuobaozhu/archive/2012/05/13/2498092.html#2380678 配置完后直接编译,然后用tftp下载到板子就会打印以下信息:

s3c6400-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 70) is a S3C6400/10
s3c6400-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 71) is a S3C6400/10
s3c6400-uart.3: ttySAC3 at MMIO 0x7f005c00 (irq = 72) is a S3C6400/10
brd: module loaded
loop: module loaded
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
dm9000 Ethernet Driver, V1.31
eth0: dm9000a at d0814000,d0a00004 IRQ 108 MAC: 08:90:00:a0:90:90 (platform data)
PPP generic driver version 2.4.2
PPP BSD Compression module registered
PPP Deflate Compression module registered
PPP MPPE Compression module registered
NET: Registered protocol family 24


可以看出DM9000驱动已经OK了。

2.构建NFS文件系统。

2.1.        制作文件系统的工具就是传说中的瑞士军刀busybox在他的官网http://www.busybox.net 下载最新的版本为busybox-1.20.0

2.2.        修改busybox的makefile:

CROSS_COMPILE  ?=arm-linux-

ARCH  ?= arm

2.3.        Make menuconfig配置busybox

Busybox Settings ---> 

         BuildOptions  --->   

最简单linux-3.5.4搭建nfs文件系统_第1张图片最简单linux-3.5.4搭建nfs文件系统_第2张图片最简单linux-3.5.4搭建nfs文件系统_第3张图片

2.4.        编译busybox执行

Make  install

这时候会提示一个错误提示说:

miscutils/ubi_tools.c:63:26: error: mtd/ubi-user.h: No suchfile or directory
miscutils/ubi_tools.c: In function 'ubi_tools_main':
miscutils/ubi_tools.c:133: error: 'UBI_DEV_NUM_AUTO' undeclared (first use inthis function)
miscutils/ubi_tools.c:133: error: (Each undeclared identifier is reported onlyonce
miscutils/ubi_tools.c:133: error: for each function it appears in.)
miscutils/ubi_tools.c:134: error: 'UBI_VOL_NUM_AUTO' undeclared (first use inthis function)
miscutils/ubi_tools.c:153: error: storage size of 'req' isn't known
miscutils/ubi_tools.c:161: error: 'UBI_IOCATT' undeclared (first use in thisfunction)
miscutils/ubi_tools.c:153: warning: unused variable 'req'

make[1]: ***[miscutils/ubi_tools.o] 错误 1
make: *** [miscutils] 错误 2

出现这么多的错误,核心问题就是出现在miscutils/ubi_tools.c:63:26:error: mtd/ubi-user.h: No such file or directory这个上面,无法找到mtd/ubi-user.h头文件,查阅了相关资料后,原来这是一个Linux下新支持的UBI文件系统,需要手工加入。从Linux3.3.5的include\mtd\ubi-user.h拷贝到busybox下的include\mtd下,如果 busybox下的include没有mtd文件夹,那就先建立一个mtd文件夹,然后复制了。这样做了之后,编译就OK了。出现下面的信息就说明编译成功了。

2.5.        建立根目录,这里我们直接写一个脚本程序运create_rootfs.sh行就可以了,脚本的内容如下:

#!/bin/sh
echo "------Create rootfs directons start...--------"
mkdir  rootfs
cd   rootfs
echo "--------Create root,dev....----------"
mkdir root dev etc boot tmp var sys proc lib mnt home usr
mkdir etc/init.d etc/rc.d etc/sysconfig
mkdir usr/sbin usr/bin usr/lib usr/modules
echo "make node in dev/console dev/null"
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 777 tmp
chmod 777 var/tmp
echo "-------make direction done---------"

运行脚本执行:

./ create_rootfs.sh

ls  rootfs

boot  dev  etc  home  lib mnt  proc  root  sys  tmp  usr  var

2.6.        etc/inittab 系统init进程配置文件,并更改权限chmod +x inittab

::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh #没有这就不行,就不能打开console控制台。
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a

2.7        etc/init.d/rcS系统启动加载项文件,并更改权限chmod +x etc/init.d/rcS

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts #用于telnet登录时使用

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME

2.8.        etc/fstab 系统挂载文件系统列表文件

#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
none /var ramfs defaults 0 0
none /tmp ramfs defaults 0 0

2.9        etc/profile用户环境配置文件

# Ash profile
# vim: syntax= sh
# No core file by defaults
# ulimit - S - c 0> / dev/ null 2> & 1

USER="id -un"
LOGNAME=$USER
PS1="[\u@\h \w]#"  #\w 目录将显示全路径
PATH=$PATH
HOSTNAME= '/bin/hostname'
alias cls="clear"
export USER LOGNAME PS1 PATH 

2.10.        /etc/passwd shadow 用户文件以及密码

把主机的passwd shadow 文件拷贝到/etc下

# cp /etc/passwd  rootfs/etc
# cp /etc/group  rootfs/etc
# cp /etc/shadow  rootfs/etc

2.11.        etc/sysconfig/HOSTNAME的内容为你自己的名字即可,内容为"Pillar"

gedit /etc/sysconfig/HOSTNAME  然后键入 Pillar

2.12.        在busybox目录下会看见 _install目录,里面有/bin/sbin l inuxr三个文件
将这三个目录或文件拷到第一步所建的rootfs文件夹下。

#cp bin/ sbin/ linuxrc /home/rootfs -ra 

在把_install目录的usr里面的bin,sbin也按照刚才的方法拷贝到rootfs目录下

切记一定要带上-a的参数,因为bin目录里大部分都是链接,如果不带-a的参数,拷过去之后会做相应的复制,不再是链接的形式

将交叉编译器下的lib下的库拷贝到lib文件夹下
cp /usr/local/arm/4.2.2-eabi/lib/* 

2.11.        修改uboot的bootargs为下面内容:

setenv bootargs noinitrd root=/dev/nfs ip=192.168.1.101:192.168.1.103:196.168.1.1:255.255.255.0::eth0:off nfsroot=192.168.1.103:/home/pillar/WORK/fs/rootfs,nolock,proto=tcp console=ttySAC0,115200

其中192.168.1.101为开发板的IP地址(用print命令可以查看)

192.168.1.103为虚拟机的IP地址

192.168.1.1为路由器的网关,在电脑上可以用ipconfig  /all命令查看

255.255.255.0为子网掩码,在电脑上可以用ipconfig  /all命令查看

先备份一下之前用yaffs2的启动

noinitrdroot=/dev/mtdblock3 rootfstype=yaffs2 console=ttySAC0 init=/linuxrcvideo=fb:AT070TN83

用cramfs启动

bootargs=root=/dev/mtdblock2 rootfstype=cramfs console=ttySAC0,115200

3.搭建NFS服务器

安装nfs:

  #sudo apt-get install nfs-kernel-server 
  打开/etc/exports文件,在末尾加入:
 /home/pillar/WORK/fs/rootfs *(rw,sync,no_root_squash)
  注:nfs允许挂载的目录及权限,在文件/etc/exports中进行定义,各字段含义如下:
  /home/pillar/WORK/fs/rootfs :要共享的目录
  * :允许所有的网段访问
  rw :读写权限
  sync:资料同步写入内在和硬盘
  no_root_squash:nfs客户端共享目录使用者权限
  重启服务:
  #sudo /etc/init.d/portmap restart <---重启portmap,很重要
  #sudo /etc/init.d/nfs-kernel-server restart <---重启nfs服务
  #showmount -e <---显示共享出的目录
  注:nfs是一个RPC程序,使用它前,需要映射好端口,通过portmap设
  命令执行情况如下:
  xgc@xgc-VirtualBox:~$ sudo /etc/init.d/portmap restar
  Rather than invoking init scripts through /etc/init.d, use the service(8)
  utility, e.g. service portmap restart
  Since the script you are attempting to invoke has been converted to an
  Upstart job, you may also use the restart(8) utility, e.g. restart portmap
  portmap start/running, process 474
  xgc@xgc-VirtualBox:~$ sudo /etc/init.d/nfs-kernel-server restart
  * Stopping NFS kernel daemon [ OK ]
  * Unexporting directories for NFS kernel daemon... [ OK ]
  * Exporting directories for NFS kernel daemon...
  exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/home/xgc".
  Assuming default behaviour ('no_subtree_check').
  NOTE: this default has changed since nfs-utils version 1.0.x
  [ OK ]
  * Starting NFS kernel daemon [ OK ]
  xgc@xgc-VirtualBox:~$ showmount -e
  Export list for xgc-VirtualBox:
  /home/xgc *
  现在可以在本机上试一下:
  #sudo mount -t nfs localhost:/home/xgc /mnt
  注:localhost为本机linux的IP地址
  这样就把共享目录挂到了/mnt目录,取消挂载用:
  #sudo umount /mnt
  如果用在嵌入式设备上挂载,要加上参数-o nolock

启动内核:

就可以看到以下内容

Please press Enter to activate this console. 
Pillar
[root@Pillar /]#ls
bin      dev      home     linuxrc  proc     sbin     tmp      var
boot     etc      lib      mnt      root     sys      usr
[root@Pillar /]#cd b



你可能感兴趣的:(function,struct,Module,include,resources,compression)