SKYEYE上的UCLINUX從主機NFS目錄啓動根文件系統



 

SKYEYE上的UCLINUX從主機NFS目錄啓動根文件系統

By HC 06/04/2006

經過一段時間艱苦的工作,我找到了一個可以讓SKYEYE上的UCLINUX從主機NFS目錄啓動根文件系統的方法。詳細步驟如下:

    首先,介紹一下我的軟件環境:
   主機操作系統:帶有NFS服務的FEDORA CORE 1 或RED HAT 9
    SKYEYE:0.8.0.0.
    交叉編譯器:arm-elf-tools-20030314.sh
    UCLINUXuClinux-dist-20030522.tar
    根文件系統:./skyeye-binary-testutils-.0.7/at91/uclinux3/boot.rom
    SKYEYE NET DRIVER: uclinux4skyeye-v0.2.3.tgz

   經過多次的實驗,我發現如果主機用2.6.X核心,在SKYEYE上的uclinux不能正常使用NFS的client,這是我在主機上使用FEDORA CORE 1或RED HAT 9 的原因。而且,由於我發現SKYEYE0.8網絡部分比1.0的要快,也沒有經常出現發送超時的告警,所以我選擇SKYEYE0.8。

1.        在主機上根據安裝說明,解壓或安裝SKYEYE,SKYEYE—BINARY—TESTUTILES:SKYEYE網絡驅動,交叉編譯器和UCLINUX。下面是一些簡單的例子:

/* Install Skyeye0.8*/
   #tar jxfv skyeye-0.8.0.tar.bz2
   #./configure --target=arm-elf --prefix=/usr/local
   #make
#make install

   /* uncompress skyeye-binary-testutils */
   #tar jxfv skyeye-binary-testutils-1.0.7.1.tar.bz2

   /* Install a cross complier */
   #sh arm-elf-tools-20030314.sh

   /* uncompress uclinux resource code */
#tar zxf uClinux-dist-20030522.tar.gz

/* uncompress and install Skyeye net drivers */
#tar zxf uclinux4skyeye-v0.2.3.tgz
#cd uclinux4skyeye

#cp example/uclinux-dist-20030522/vendor__GDB_ARMulator/* ../uClinux-dist/vendors/GDB/ARMulator/

#cp example/uclinux-dist-20030522/linux-2.4.x__drivers__net/* ../uClinux-dist/drivers/net/

2 在主機建立Uclinux根文件系統的NFS目錄和配置NFS服務器;
2.1 將BOOT.IMG中根文件系統複製到一個NFS目錄在主機上;

#mount -o loop boot.img /mnt/tmp  /*加載根文件系統到一個臨時目錄 */
#cd /mnt/tmp
#cp . /tmp/nfs –r   /* /tmp/nfs 將是uclinux根文件系統的NFS目錄 */

注意:爲了避免啓動衝突和節約啓動時間,請刪除下面這一行,
“/bin/ifconfig eth0 up 10.0.0.2” in /tmp/nfs/etc/rc.

2.2 在主機上配置NFS服務,然後重啓服務器。
   用菜單就可以完成:
System Settings->Server settings->NFS->Add button:
   Directory: /tmp/nfs
   Host(s): *
   Basic permissions : Read/Write
   System Settings->Server settings->Services->nfs(click mouse right button)->restart


3 修改uclinux的相關原代碼,使uclinux可以從主機NFS目錄啓動根文件系統。一共有兩個c語言文件的四個地方需要修改。這兩個c語言文件是:
/uClinux-dist/linux-2.4.x/init/do_mounts.c  /uClinux-dist/linux-2.4.x/arch/armnommu/kernel/stup.c

3.1 在DO.MOUNTS.C文件中只需要修改一個地方,因爲這裏有一個BUG。

static void __init mount_root(void)
{
#ifdef CONFIG_ROOT_NFS

ROOT_DEV =MKDEV(UNNAMED_MAJOR,0);
/* 你只要在這裏加這一行代碼*/

        if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {
                if (mount_nfs_root()) { ……}
    }
#endif

     “在DO.MOUNTS.C文件中,有一個叫mount-root的子程序,它依靠根文件系統配置,掛載一個特定文件系統作爲系統根文件系統。對於加載NFS文件系統,它會通過比較該設備的主值(MAJOR VALUE)檢查根設備,MAJOR(ROOT_DEV)== UNNAMED_MAJOR當其值(UNNAMED.MAJOR)爲0,我們將不能使用該設備。

      我發現ROOT-DEV的值在setup-arch()或mount-root()中被改變爲31,這不是一個被期望的值。對於這個問題,我的解決方法是,將這一行註釋掉。雖然這不是一個好方法,但它依然有效。或者爲NFS 追蹤一個ROOT-DEV正確的值。

我加了一行代碼ROOT_DEV =MKDEV(UNNAMED_MAJOR,0),這時因爲在mount-root中首先檢查MAJOR(ROOT-DEV)是否與UNNAMED-MAJOR相等。如果不是,它將跳過NFS掛載。所以我增加這行,一切都工作得很好,在這些修改後我也成功的從NFS加載了根文件系統。”
(Reference 1: http://marc.10east.com/?l=uclinux-dev&m=109360277632198&w=4)


3.2 剩下的三個地方需要在set-up.c中修改。這是爲了配置啓動命令行。在這個例子中,主機IP設爲10.0.0.1而模擬器IP設爲10.0.0.2。關於啓動命令行的說明指導可以看:/uClinux_dist/linux_2.4.x/Document/nfsroot.txt。

3.2.1 修改CONFIG_CMDLINE:

#ifndef CONFIG_CMDLINE

//#define CONFIG_CMDLINE "root=/dev/rom0"

#define CONFIG_CMDLINE "root=/dev/nfs rootfstype=nfs ip=10.0.0.2 / nfsroot=10.0.0.1:/tmp/nfs rw / nfsaddrs=10.0.0.2:10.0.0.1:10.0.0.1:255.0.0.0:skyeye:eth0:none" #endif

3.2.2 修改command_line變量:

//static char command_line[COMMAND_LINE_SIZE] = "root=/dev/rom0";
static char command_line[COMMAND_LINE_SIZE] = "root=/dev/nfs rootfstype=nfs /
ip=10.0.0.2 /
nfsroot=10.0.0.1:/tmp/nfs rw / nfsaddrs=10.0.0.2:10.0.0.1:10.0.0.1:255.0.0.0:skyeye:eth0:none";


3.2.3 “如果你對於分析啓動命令行有任何問題,你可以直接通過在setup-arch()中增加下列代碼在“memcpy(saved_cammand_line,from,COMMAND_LINE_SIZE)”之前,傳遞啓動命令行參數。下列是你原代碼應有的樣子:”

(Reference 2: http://marc.10east.com/?l=uclinux-dev&m=109360277632198&w=4)

#ifdef CONFIG_ROOT_NFS
strcpy(from,"root=/dev/nfs rootfstype=nfs ip=10.0.0.2 " "nfsroot=10.0.0.1:/tmp/nfs rw / nfsaddrs=10.0.0.2:10.0.0.1:10.0.0.1:255.0.0.0:skyeye:eth0:none"); #endif

memcpy(saved_command_line, from, COMMAND_LINE_SIZE);

4, 在主機上編譯Uclinux的核心。

4.1 確認定製核心配置;

#cd / uClinux-dist
#make menuconfig
Target Platform Selection-> (GDB/Armulator) Vendor/Product
                       (Linux-2.4.x) Kernel Version
                       (uClibc) Libc Version
                        Customize Kernel Settings (new)
Exit
Do you wish to save your new kernel configuration [Yes]


4.2 兩個必要的核心配置選項;

Networking options-> IP: kernel level autoconfiguration

File systems->Network File Systems-> NFS file system support
                                     Provide NFSv3 client support
                                     Root file system on NFS  
Exit
Do you wish to save your new kernel configuration [Yes]

#make dep
#make
#ls /uClinux-dist/linux-2.4.x/linux

如果一切OK,可以看到一個名爲linux的文件。這就是新編譯的核心。
注意不要使用“File systems-> /dev file system support”選項,否則當啓動和展開ramfs.img時有衝突。

5,配置skyeye.conf;
   下面是我的配置文件skyeye.conf的內容:

#kyeye config file sample
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R,  addr=0x01400000, size=0x00400000
#, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
#set nic info state=on/off  mac=xxxxxxx  ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1


它看起來很象/skyeye-binary-testutils-1.0.7/at91/uclinux3/skyeye.conf,只是修改了一行,而且這個配置文件應該放在與新編譯的核心同一目錄下。

6,現在可以嘗試在skyeye上運行新內核了;
   在這個階段,當“VFS: Mounted root (nfs filesystem).”出現在後,需要爲下一個啓動信息的出現等七、八分鐘,而且在這之後一直需要耐心。因爲啓動過程很慢。雖然在這個過程中有四個告警信息“write data to nic is bigger than 256”會出現,這是由於一個skyeye的BUG引起的,不必理會。好,至此任務完成了。

另外,我發現新核心很大,27M,很嚇人。不知如何縮小它?請各位多提意見。
謝謝!


# skyeye linux
***************************************************************
****                                                       ****
****   SkyEye  Simulator Ver 0.8.0 with  GDB 5.3 Interface ****
****                                                       ****
***************************************************************
GNU gdb 5.3
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This SkyEye was configured as "--host=i686-pc-linux-gnu --target=arm-elf"...
(SkyEye) targ sim
cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0
mach info: name at91, mach_init addr 0x813e02c
nic[0] info: state=1, ethmod num=1, mac addr=0:4:3:2:1:f, hostip=10.0.0.1
nic_init_begin
tapif_init begin
tapif_init: fd 6
tapif_init: system("ifconfig tap0 inet 10.0.0.1");
tapif_init end
nic_init_end
SKYEYE: use arm7100 mmu ops
Connected to the simulator.
(SkyEye) load
Loading section .init, size 0xc000 vma 0x1000000
Loading section .text, size 0xd0920 vma 0x100c000
Loading section .data, size 0x91f0 vma 0x10de000
Start address 0x1000000
Transfer rate: 7526528 bits in <1 sec.
(SkyEye) run
Starting program: /mnt/kernel_nfs/linux
Linux version 2.4.20-uc0 ([email protected]) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #18 Mon Mar 13 16:29:39 GMT 2006
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
On node 0 totalpages: 1024
zone(0): 0 pages.
zone(1): 1024 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/nfs rootfstype=nfs ip=10.0.0.2 nfsroot=10.0.0.1:/tmp/nfs rw
nfsaddrs=10.0.0.2:10.0.0.1:10.0.0.1:255.0.0.0:skyeye:eth0:none
Calibrating delay loop... 12.97 BogoMIPS
Memory: 4MB = 4MB total
Memory: 2976KB available (834K code, 180K data, 48K init)
Dentry cache hash table entries: 512 (order: 0, 4096 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 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: 1024 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
Atmel USART driver version 0.99
ttyS0 at 0xfffd0000 (irq = 2) is a builtin Atmel APB USART
ttyS1 at 0xfffcc000 (irq = 3) is a builtin Atmel APB USART
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: 1400000-13FFFFF [VIRTUAL 1400000-13FFFFF] (RO)
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
SkyEye NE2k Ethernet driver version 0.2 (2003-04-27)
sene2k dev name: eth0: <6>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 512 bind 512)
IP-Config: Guessing netmask 255.0.0.0
IP-Config: Complete:
      device=eth0, addr=10.0.0.2, mask=255.0.0.0, gw=255.255.255.255,
     host=10.0.0.2, domain=, nis-domain=(none),
     bootserver=255.255.255.255, rootserver=10.0.0.1, rootpath=
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
Looking up port of RPC 100003/2 on 10.0.0.1
Looking up port of RPC 100005/1 on 10.0.0.1
VFS: Mounted root (nfs filesystem).
Shell invoked to run file: /etc/rc
Command: hostname GDB-ARMulator
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: mount -t proc proc /proc
skyeye: write data to nic is bigger than 256
R ff000040,fffa002f,1a,22,fffa0024,fffa0020,40,fffa0000,fffa001f,11263a0,136,11cbbdc,fffa003f,11cbbb0,fffa0028,1077514,C 20000013,S 0,0,20000093,20000000,0,0,0,M 13,B 3,E 0,I 0,P 13d1ae0,T 0,L e3740a01,D e1a04000,skyeye: write data to nic is bigger than 256
R fffa0014,fffa0018,40,fffa001f,fffa0fff,fffa0020,40,fffa0000,fffa001f,11263a0,136,11cbbdc,fffa0000,11cbbb0,fffa0010,1077590,C 20000013,S 0,0,20000093,20000000,0,0,0,M 13,B 3,E 0,I 0,P 13d1ae0,T 0,L e3740a01,D e1a04000,Command: mount -t ext2 /dev/ram0 /var
skyeye: write data to nic is bigger than 256
R ff000040,fffa002f,1a,22,fffa0024,fffa0020,40,fffa0000,fffa001f,11263a0,132,11cbbdc,fffa003f,11cbbb0,fffa0028,1077514,C 20000013,S 0,0,60000093,20000000,0,0,0,M 13,B 3,E 0,I 0,P 13d1ae0,T 0,L e3740a01,D e1a04000,skyeye: write data to nic is bigger than 256
R fffa0014,fffa0018,40,fffa001f,fffa0fff,fffa0020,40,fffa0000,fffa001f,11263a0,132,11cbbdc,fffa0000,11cbbb0,fffa0010,1077590,C 20000013,S 0,0,60000093,20000000,0,0,0,M 13,B 3,E 0,I 0,P 13d1ae0,T 0,L e3740a01,D e1a04000,Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: cat /etc/motd
Welcome to
          ____ _  _
         /  __| ||_|
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ /| | | |/ // /
   | |_| | |__| || | | | | |_| |/    /
   |  ___/____|_||_|_| |_|/____|/_//_/
   | |
   |_|

GDB/ARMulator support by <[email protected]>
For further information check:
http://www.uclinux.org/

Execution Finished, Exiting

Sash command shell (version 1.1.1)
/> ping 10.0.0.1 -c 4
PING 10.0.0.1 (10.0.0.1): 56 data bytes
64 bytes from 10.0.0.1: icmp_seq=0 ttl=64 time=0.-7 ms
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.-7 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.-7 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.-8 ms

--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.-8/107374181.6/0.0 ms
/>
發佈了35 篇原創文章 · 獲贊 7 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章