nfs根文件系统问题

来源:互联网 发布:windows 文件夹 密码 编辑:程序博客网 时间:2024/05/16 04:44
1.IP-Config: Complete:
    device=eth0, addr=192.168.0.110,mask=255.255.255.0, gw=192.168.0.110,
    host=SKY2440, domain=,nis-domain=embedsky.net,
    bootserver=192.168.0.104,rootserver=192.168.0.104, rootpath=
VFS: Cannot open root device "nfs" orunknown-block(0,255)
Please append a correct "root=" boot option; here are theavailable partitions:
1f00           1024mtdblock0 (driver?)
1f01           4096mtdblock1 (driver?)
1f02         257024 mtdblock2(driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs onunknown-block(0,255)

解答:编译内核时:
[*] Root file system on NFS 必须选上

更改nfs要重启nfs服务:
  sudo /etc/init.d/nfs-kernel-serverrestart 
 sudo /etc/init.d/portmaprestart 

使用showmount -e查看挂载的nfs目录是否正确!




2.nfs: server 192.168.0.104 not responding, still trying
nfs: server 192.168.0.104 OK
nfs: server 192.168.0.104 OK
根据linux doc下的nfsroot.txt:
nfsroot=[:][,]

  If the `nfsroot' parameter is NOT given onthe command line,
  the default "/tftpboot/%s" will beused.

  Specifies the IP address of the NFSserver.
The default address is determined by the `ip' parameter
(see below). This parameter allows the use of different
servers for IP autoconfiguration and NFS.

  Name of the directory on the server tomount as root.
If there is a "%s" token in the string, it will be
replaced by the ASCII-representation of the client's
IP address.

  Standard NFS options. All options areseparated by commas.
The following defaults are used:
port = as given by server portmap daemon
rsize = 4096
wsize = 4096
timeo = 7
retrans = 3
acregmin = 3
acregmax = 60
acdirmin = 30
acdirmax = 60
flags = hard, nointr, noposix, cto, ac
设置ubboot参数bootargs=console=ttySAC0 root=/dev/nfsnfsroot=192.168.1.101:/home/csb/code/rootfs,rsize=512,wsize=512ip=192.168.1.110:192.168.1.101:192.168.1.1:255.255.255.0:xxx:eth0:off
#mount -t nfs -o intr,nolock,rsize=1024,wsize=1024host:/path/to/export /client/to/mount
方法不成功!
目前所知道只有使用交叉线开发板连接电脑。



3.mount: RPC: Authentication error; why = Failed (unspecifiederror)
查看/etc/hosts.allow里面,nfs相关服务你板子的IP是否有权访问。
自己当时的问题如nfsd192.168.0.101/255.255.255.0,不晓得为什么加了这个掩码就不是,按理说都是在一个网段内,总之,直接用nfsd192.168.0.101即可
感谢http://blog.sina.com.cn/s/blog_6634dffb0100m29c.html


4.Looking up port of RPC 100005/1 on 192.168.1.101
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 240K
Kernel panic - not syncing: No init found. Try passing init= option to kernel.

使用file /bin/busybox 发现
/bin/busybox: ELF 32-bit LSB executable, Intel 80386, version1 (SYSV), statically linked, for GNU/Linux 2.6.24,BuildID[sha1]=0xb63ac5ddfa302e77851860471656cde35091312e,stripped
oh shit!!!怎么80386都出来了。重新拷贝tq的rootfs
成功后出现
Try to bring eth0 interface up ...
把/etc/init.d/rcS 
里面的net_set &注释掉
自此成功在tq原厂的bin文件下建立nfs成功!!
Loading OV9650 driver.........
OV9650 address 0x60, manufacture ID 0xFFFF, expect0x7FA2
OV9650 address 0x60, manufacture ID 0xFFFF, expect0x7FA2
No OV9650 found!!!
[01/Apr/2009:01:36:02 +0000] boa: server versionBoa/0.94.13
[01/Apr/2009:01:36:02 +0000] boa: server built Jul 29 2009 at14:27:34.
[01/Apr/2009:01:36:02 +0000] boa: starting server pid=624,port 80

Please press Enter to activate this console.


下一步尝试在自己编译的linux内核下构建nfs
使用自己编译的linux内核下出现:
VFS: Mounted root (nfs filesystem) on device 0:12.
Freeing init memory: 140K
nfs: server 192.168.1.101 not responding, still trying
nfs: server 192.168.1.101 OK

怀疑是rc.S没有编辑好,使用tq内核+自己做的文件系统可以正确启动。内核的dm9000驱动有问题!
根据http://hi.baidu.com/andio/item/f6072b29d9e3bdf850fd8785
--------------------------------------------------------------------------------------------------------------------
一、DM9000驱动移植
主要修改俩个文件,一是mach-smdk2440.c,一是dm9000.c
1.1 mach-smdk2440.c
#vi arch/arm/mach-s3c2440/mach-smdk2440.c
修改mach-smdk2440.c,在其中添加如下红色所示的代码,注意gcc中#include是可以随处摆放的的,
因此只需要把如下红色代码copy 就可以了
 
#include
#define MACH_SMDK2440_DM9K_BASE (S3C2410_CS4 + 0x300)
static struct resource smdk2440_dm9k_resource[] = {
       [0] = {
              .start =MACH_SMDK2440_DM9K_BASE,
              .end   =MACH_SMDK2440_DM9K_BASE + 3,
              .flags = IORESOURCE_MEM
       },
       [1] = {
              .start =MACH_SMDK2440_DM9K_BASE + 4,
              .end   =MACH_SMDK2440_DM9K_BASE + 7,
              .flags = IORESOURCE_MEM
       },
       [2] = {
              .start = IRQ_EINT7,
              .end   =IRQ_EINT7,
              .flags = IORESOURCE_IRQ |IORESOURCE_IRQ_HIGHEDGE,
       }
};
static struct dm9000_plat_data smdk2440_dm9k_pdata = {
       .flags         =(DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};
static struct platform_device s3c_device_eth = {
       .name          ="dm9000",
       .id           = -1,
       .num_resources  =ARRAY_SIZE(smdk2440_dm9k_resource),
       .resource      = smdk2440_dm9k_resource,
       .dev          = {
              .platform_data = &smdk2440_dm9k_pdata,
       },
};
//如上代码置于smdk2440_devices[] 数组前
static struct platform_device *smdk2440_devices[] __initdata ={
 &s3c_device_usb,
 &s3c_device_lcd,
 &s3c_device_wdt,
 &s3c_device_i2c0,
 &s3c_device_iis,
 &s3c_device_eth
};
1.2 dm9000.c
#vi  driver/net/dm9000.c
在头文件处添加如下红色的代码
#include "dm9000.h"
#if defined(CONFIG_ARCH_S3C2410)
#include
#endif
 
修改static int __devinit dm9000_probe(struct platform_device*pdev)函数如下所示,
该函数大概位置1276行,需要修改的大概位置为1460行
 db->mii.reg_num_mask = 0x1f;
 db->mii.force_media  =0;
 db->mii.full_duplex  =0;
 db->mii.dev     = ndev;
 db->mii.mdio_read   = dm9000_phy_read;
 db->mii.mdio_write   =dm9000_phy_write;
 #if defined(CONFIG_ARCH_S3C2410)
     printk("Now use the default MAC address:10:23:45:67:89:ab\n");
          mac_src ="tq2440";
        ndev->dev_addr[0] =0x10;
            ndev->dev_addr[1] = 0x23;
          ndev->dev_addr[2] = 0x45;
         ndev->dev_addr[3] =0x67;
             ndev->dev_addr[4] =0x89;
           ndev->dev_addr[5] = 0xab;
 #else
mac_src = "eeprom";
 
 for (i = 0; i < 6; i += 2)
  dm9000_read_eeprom(db, i / 2,ndev->dev_addr+i);
 if (!is_valid_ether_addr(ndev->dev_addr)&& pdata != NULL) {
  mac_src = "platform data";
  memcpy(ndev->dev_addr,pdata->dev_addr, 6);
 }

 if (!is_valid_ether_addr(ndev->dev_addr)){
 
  
  mac_src = "chip";
  for (i = 0; i < 6; i++)
   ndev->dev_addr[i] =ior(db, i+DM9000_PAR);

 }
 if(!is_valid_ether_addr(ndev->dev_addr))
  dev_warn(db->dev, "%s: Invalid ethernetMAC address. Please "
    "set using ifconfig\n",ndev->name);
#endif

修改dm9000_init(void)函数如下所示,大概位置1590行
static int __init
dm9000_init(void)
{
 #if defined(CONFIG_ARCH_S3C2410)
 unsigned int oldval_bwscon = *(volatileunsigned int *)S3C2410_BWSCON;
 unsigned int oldval_bankcon4 = *(volatileunsigned int *)S3C2410_BANKCON4;
 *((volatile unsigned int *)S3C2410_BWSCON)=
   (oldval_bwscon &~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 |S3C2410_BWSCON_ST4;
 *((volatile unsigned int *)S3C2410_BANKCON4)= 0x1f7c;
#endif
 printk(KERN_INFO "%s Ethernet Driver,V%s\n", CARDNAME, DRV_VERSION);
 returnplatform_driver_register(&dm9000_driver);
}
编译download后成功出现Please press Enter to activate thisconsole. 

-----------------------------------------------------------------------------------------------------------------------------------------------
下面分析一下:
------------------------------------------------------------------------------------------------------------
 //mach-smdk2440.c中定义一个platform_device结构的数组,数组内容为各个设备结构的地址。
static struct platform_device *smdk2440_devices[] __initdata ={  
 &s3c_device_usb,
 &s3c_device_lcd,
 &s3c_device_wdt,
 &s3c_device_i2c0,
 &s3c_device_iis,
 &s3c_device_eth
};
//struct platform_device结构的定义在/include/linux/platform_device.h 中。
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;

struct platform_device_id *id_entry;

struct pdev_archdata archdata;
};


--------------------------------------------------------------------------------------------------------------
lcd driver 分析:
struct s3c2410fb_info {
struct device *dev;
struct clk *clk;

struct resource *mem;
void __iomem *io;
void __iomem *irq_base;

enum s3c_drv_type drv_type;
struct s3c2410fb_hw regs;

unsigned long clk_rate;
unsigned int palette_ready;

#ifdef CONFIG_CPU_FREQ
struct notifier_block freq_transition;
#endif

u32 palette_buffer[256];
u32 pseudo_pal[16];
};



------------------------------------------------------------------------------------------------------------
重新编译内核,理解下make menuconfig中M和*的区别http://hi.baidu.com/iris_chow/item/609a27d7118ef0362b35c7b1
要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module),动态调用。
1.选项*(编译到内核)
如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。
2.选项M(编译到模块)
如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。




原创粉丝点击