nfs挂载根文件系统.docx

上传人:b****6 文档编号:8000995 上传时间:2023-01-27 格式:DOCX 页数:18 大小:27.47KB
下载 相关 举报
nfs挂载根文件系统.docx_第1页
第1页 / 共18页
nfs挂载根文件系统.docx_第2页
第2页 / 共18页
nfs挂载根文件系统.docx_第3页
第3页 / 共18页
nfs挂载根文件系统.docx_第4页
第4页 / 共18页
nfs挂载根文件系统.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

nfs挂载根文件系统.docx

《nfs挂载根文件系统.docx》由会员分享,可在线阅读,更多相关《nfs挂载根文件系统.docx(18页珍藏版)》请在冰豆网上搜索。

nfs挂载根文件系统.docx

nfs挂载根文件系统

使用NFS挂载根文件系统,在开发阶段有很多的好处,对根文件系统进行修改后不用每次都下载到NandFlash中,可以把制作的根文件系统放到主机中的NFS输出目录中,在正式成为产品以后在烧写到开发板中,这样可以方便很多,也可以把编译天生的内核也放到NFS输出目录中这样也可以引导内核,很是方便,还等什么开始吧!

  NFS服务器真个配置已经在上一篇文章中写到过了。

U-boot中使用tftp协议也在另一篇文章中。

按道理来说NFS命令也是可以是使用的,由于都是基于网卡的,只要网卡驱动移植的没有题目,NFS也就直接可以使用了,不过在我这里可是行不通,在使用NFS传输文件中,一直出现下面的错误类型,提示挂载不上:

  U-Boot@mini2440]#nfs0x10.27.10.48:

/home/ubuntu/kernel/fs/u-boot.bin

  dm9000i/o:

0x,id:

0xa46

  DM9000:

runningin16bitmode

  MAC:

08:

00:

3e:

26:

0a:

5b

  operatingat100Mfullduplexmode

  Usingdm9000device

  FiletransferviaNFSfromserver10.27.10.48;ourIPaddressis10.27.10.23

  Filename'/home/ubuntu/kernel/fs/u-boot.bin'.

  Loadaddress:

0x

  Loading:

***ERROR:

Cannotmount//仅仅提示挂载不上

  可还有下面的错误:

  [U-Boot@mini2440]#nfs0x10.27.10.48:

/home/ubuntu/kernel/fs/u-boot.bin

  dm9000i/o:

0x,id:

0xa46

  DM9000:

runningin16bitmode

  MAC:

08:

00:

3e:

26:

0a:

5b

  operatingat100Mfullduplexmode

  Usingdm9000device

  FiletransferviaNFSfromserver10.27.10.48;ourIPaddressis10.27.10.23

  Filename'/home/ubuntu/kernel/fs/u-boot.bin'.

  Loadaddress:

0x

  Loading:

***ERROR:

Cannotmount

  ***ERROR:

Cannotumount//这里还提示了不能卸载

  在网上查找资料,出现Cannotumount错误的解决方法是修改u-boot-2009.08/net/nfs.c文件,在大约453行四周的位置:

  staticintnfs_umountall_reply(uchar*pkt,unsignedlen)

  {

  structrpc_trpc_pkt;

  debug("%s\n",__func__);

  memcpy((unsignedchar*)&rpc_pkt,pkt,len);

  //if(ntohl(rpc_pkt.u.reply.id)!

=rpc_id)//原来的这一行修改成下面的一行

  if((ntohl(rpc_pkt.u.reply.id)+1)!

=rpc_id)

  return-1;

  if(rpc_pkt.u.reply.rstatus||

  ..................

  }

  可是在我这里修改完以后还是不可以使用,一样出现上面的错误。

这是就想到了是不是和tftp时出现的错误是一样的,也是由于超时的原因,固然这里面没有出现超时的提示,不管怎么样还是先改了再说;还是在/nfs.c文件中修改下面的超时的宏定义:

  #defineHASHES_PER_LINE65/*Numberof"loading"hashesperline*/

  #defineNFS_RETRY_COUNT30

  #defineNFS_TIMEOUT(30*2000UL)//把原来的2000UL改成30*2000UL,

  修改完上面的宏定义以后,再使用NFS传输文件,一开始有几次还是不成功,不过后面再使用时大部分情况下都是成功的,不再像上面一次也没有成功过:

  [U-Boot@mini2440]#nfs0x10.27.10.48:

/home/zfz/kernel/fs/u-boot.bin

  dm9000i/o:

0x,id:

0xa46

  DM9000:

runningin16bitmode

  MAC:

08:

00:

3e:

26:

0a:

5b

  operatingat100Mfullduplexmode

  Usingdm9000device

  FiletransferviaNFSfromserver10.27.10.48;ourIPaddressis10.27.10.23

  Filename'/home/zfz/kernel/fs/u-boot.bin'.

  Loadaddress:

0x

  Loading:

###############################

  done

  Bytestransferred=(25d88hex)

  既然NFS可以使用了,那就可以用NFS挂载根文件系统了。

根文件系统的制作在另一篇文章中也已经写了,这里就还是使用上次的根文件系统,只是不再用工具制作成Yaffs2的镜像了,直接使用Busybox,制作成功的noot_nfs目录下的各个文件就可以了,假如要下载到NandFlash中,再使用Yaffs2格式的镜像文件。

  可以先用NFS把Linux内核下载到内存中,然后设置传递给内核的参数,在u-boot-2009.08/include/configs/mini2440.h文件中,修改原来使用nandread方式,修改成使用NFS方式的;

  //#defineCONFIG_BOOTCOMMAND"nandread0x0x0x;bootm0x"

  //把上面的注释掉,修改成下面的方式

  #defineCONFIG_BOOTCOMMAND"nfs0x10.27.10.48:

/home/zfz/kernel/fs/uImage.img;bootm"

  这样,在用U-boot引导时就可以把Linux的内核首先复制到内存中了,这样也不用把Linux内核下载到开发板中了。

然后在修改传递给内核的参数,修改为下面的:

  //#defineCONFIG_BOOTARGS"noinitrdroot=/dev/mtdblock3init=/linuxrcconsole=ttySAC0,mem=64M"

  //把上面的修改成下面的这句

  #defineCONFIG_BOOTARGS"noinitrdroot=/dev/nfsrwnfsroot=10.27.10.48:

/home/ubuntu/kernel/fs/root_nfsip=10.27.10.23:

10.27.10.48:

:

255.255.255.0console=ttySAC0,init=/linuxrcmem=64M"

  可不要忘记把你的Linux内核的镜像文件和你制作的根文件系统的放到NFS的输出目录中;在配置内核中要选中支持NFS文件系统:

支持网卡驱动,还用NetWorkingSupport如下图所示:

  NetworkFileSystem的支持

  这样内核配置完以后启动U-boot出现下面的错误:

...........

  NodeviceforDAIUDA134X

  NodeviceforDAIs3c24xx-i2s

  ALSAdevicelist:

  Nosoundcardsfound.

  TCPcubicregistered

  NET:

Registeredprotocolfamily17

  drivers/rtc/hctosys.c:

unabletoopenrtcdevice(rtc0)

  IP-Config:

Nonetworkdevicesavailable.//这里没有找到网卡的驱动

  LookingupportofRPC/2on10.27.10.48

  rpcbind:

server10.27.10.48notresponding,timedout

  Root-NFS:

Unabletogetnfsdportnumberfromserver,usingdefault

  LookingupportofRPC/1on10.27.10.48

  rpcbind:

server10.27.10.48notresponding,timedout

  Root-NFS:

Unabletogetmountdportnumberfromserver,usingdefault

  Root-NFS:

Serverreturnederror-5whilemounting/home/zfz/kernel/fs/root_nfs

  VFS:

UnabletomountrootfsviaNFS,tryingfloppy.

  VFS:

Cannotopenrootdevice"nfs"orunknown-block(2,0)

  Pleaseappendacorrect"root="bootoption;herearetheavailablepartitions:

  1f00256mtdblock0(driver?

  1f01128mtdblock1(driver?

  1f025120mtdblock2(driver?

  1f03mtdblock3(driver?

  1f04mtdblock4(driver?

  Kernelpanic-notsyncing:

VFS:

Unabletomountrootfsonunknown-block(2,0)

  [](unwind_backtrace+0x0/0xdc)from[](panic+0x40/0x120)

  [](panic+0x40/0x120)from[](mount_block_root+0x1d0/0x210)

  [](mount_block_root+0x1d0/0x210)from[](prepare_namespac)

  [](prepare_namespace+0x164/0x1bc)from[](kernel_init+0xd)

  [](kernel_init+0xd8/0x10c)from[](kernel_thread_exit+0x0)

  在使用NFS挂载根文件系统时,需要在系统启动到后面时,使用NFS传送根文件系统,这是需要了DM9000网卡的驱动,固然我们在u-boot中移植了DM9000网卡的驱动,不过现在已经进进到了Linux中,在配置Linux内核中固然我们也选择了支持DM9000网卡的驱动,不过还是需要在Linux内核中改动才能适应开发板上的网卡,下面就要在Linux中移植DM9000网卡的驱动程序。

  Linux2.6.32已经对DM9000网卡有着比较完善的支持了,在:

linux-2.6.32.2/

  drivers/net/dm9000.c文件中,只需要在目标平台初始化代码中,填写完相应的结构表就可以了,在另一篇文章中,Linux2.6.32.2移植到MINI2440中,我们在linux-2.6.32.2/arch/arm/mach-s3c2440目录下建立了我们自己的文件mach-mini2440.c,主要在这个文件下添加修改;首先添加驱动所需要的头文件:

  #include

  然后定义DM9000网卡的物理基地址

  #defineMACH_MINI2440_DM9K_BASE(S3C2410_CS4+0x300)

  再填写该平台设备的资源设置,以便和DM9000网卡驱动接口配合起来;

  staticstructresourcemini2440_dm9k_resource[]={

  [0]={

  .start=MACH_MINI2440_DM9K_BASE,

  .end=MACH_MINI2440_DM9K_BASE+3,

  .flags=IORESOURCE_MEM

  },

  [1]={

  .start=MACH_MINI2440_DM9K_BASE+4,

  .end=MACH_MINI2440_DM9K_BASE+7,

  .flags=IORESOURCE_MEM

  },

  [2]={

  .start=IRQ_EINT7,

  .end=IRQ_EINT7,

  .flags=IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHEDGE,

  }

  };

  /*

  ***TheDM9000hasnoeeprom,andit'sMACaddressissetby

  ***thebootloaderbeforestartingthekernel.

  ***/

  staticstructdm9000_plat_datamini2440_dm9k_pdata={

  .flags=(DM9000_PLATF_16BITONLY|DM9000_PLATF_NO_EEPROM),

  };

  staticstructplatform_devicemini2440_device_eth={

  .name="dm9000",

  .id=-1,

  .num_resources=ARRAY_SIZE(mini2440_dm9k_resource),

  .resource=mini2440_dm9k_resource,

  .dev={

  .platform_data=&mini2440_dm9k_pdata,

  },

  };

  然后在mini2440设备集中添加上面做好的网卡平台设备,如下红色部分

  staticstructplatform_device*mini2440_devices[]__initdata={

  &s3c_device_usb,

  &s3c_device_lcd,

  &s3c_device_wdt,

  &s3c_device_i2c0,

  &s3c_device_iis,

  &mini2440_device_eth,

  &s3c_device_nand,

  };

  由于Linux-2.6.32.2中固然有DM9000网卡驱动,但并不是完全的适合mini2440,所以还是需要修改,修改DM9000所用的位宽寄存器,在linux-2.6.32.2/drivers/net/dm9000.c,添加下面的头文件

  #ifdefined(CONFIG_ARCH_S3C2410)

  #include

  #endif

  在dm9000设备的初始化函数中添加如下红色部分,这里是配置DM9000所用片选总线的时序,大约在1557行四周的位置,

  staticint__init

  dm9000_init(void)

  {

  #ifdefined(CONFIG_ARCH_S3C2410)

  unsignedintoldval_bwscon=*(volatileunsignedint*)S3C2410_BWSCON;

  unsignedintoldval_bankcon4=*(volatileunsignedint*)S3C2410_BANKCON4;

  *((volatileunsignedint*)S3C2410_BWSCON)=

  (oldval_bwscon&~(3<<16))|S3C2410_BWSCON_DW4_16|

  S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4;

  oldval_bankcon4=0x1f7c;

  #endif

  printk(KERN_INFO"%sEthernetDriver,V%s\n",CARDNAME,DRV_VERSION);

  returnplatform_driver_register(&dm9000_driver);

  }

  在配置Linux内核中,魅族商城加进对DM9000网卡的支持如下图;

  这样DM9000网卡的驱动就基本已经移植完成了,这样就可以使用NFS挂载根文件系统了,启动的信息如下:

  U-Boot2009.08(4?

?

月302010-20:

01:

00)

  DRAM:

64MB

  Flash:

2MB

  NANDDevice:

ManufacturerID:

0xec,ChipID:

0xf1(SamsungNAND128MiB3,3V8-b)

  NAND:

128MiB

  ***Warning-badCRCorNAND,usingdefaultenvironment

  In:

serial

  Out:

serial

  Err:

serial

  Net:

dm9000

  Hitanykeytostopautoboot:

0

  dm9000i/o:

0x,id:

0xa46

  DM9000:

runningin16bitmode

  MAC:

08:

00:

3e:

26:

0a:

5b

  operatingat100Mfullduplexmode

  Usingdm9000device

  FiletransferviaNFSfromserver10.27.10.48;ourIPaddressis10.27.10.23

  Filename'/home/zfz/kernel/fs/uImage.img'.

  Loadaddress:

0x

  Loading:

#################################################################

  #################################################################

  #################################################################

  #################################################################

  #################################################################

  #################################################################

  #####################

  done

  Bytestransferred=(201bachex)

  ##BootingkernelfromLegacyImageat...

  ImageName:

linux-2.6.32.2

  Created:

2010-04-3015:

40:

47UTC

  ImageType:

ARMLinuxKernelImage(uncompressed)

  DataSize:

Bytes=2MB

  LoadAddress:

  EntryPoint:

  VerifyingChecksum...OK

  LoadingKernelImage...OK

  OK

  Startingkernel...

  UncompressingLinux.............................................................

  Linuxversion2.6.32.2(zfz@zfz)(gccversion4.3.2(SourceryG++Lite2008q3-70

  CPU:

ARM920T[]revision0(ARMv4T),cr=c0007177

  CPU:

VIVTdatacache,VIVTinstructioncache

  Machine:

FriendlyARMMINI2440developmentboard

  Memorypolicy:

ECCdisabled,Datacachewriteback

  CPUS3C2440A(id0x)

  S3C24XXClocks,(c)2004SimtecElectronics

  S3C244X:

core405.000MHz,memory101.250MHz,peripheral50.625MHz

  CLOCK:

Slowmode(1.500MHz),fast,MPLLon,UPLLon

  Built1zonelistsinZoneorder,mobilitygrouping

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1