Powered by Drupal, an open source content management system

วิธีบูท Linux บน mini2440 จาก Network file system

ความสามารถสูงสุดของ Uboot ใน Mini2440 อีกประการนึงคือการบูท Linux ทั้งระบบจาก Network ซึ่งหมายถึง บน Mini2440 จะมีเพียงแค่ uBoot เปล่าๆอยู่บน nand แต่จะไปโหลด Kernel และ mount File system ที่จัดเก็บอยู่บน Server ทำให้การแก้ไขดัดแปลง Kernel และ program ทำได้อย่างง่ายดาย ยืดหยุ่นและรวดเร็วโดยไม่จำเป็นต้อง Flash nand หรือ ถ่ายโปรแกรมลง SD Card ก่อน

 

ขั้นตอนมีดังนี้ (ทำบน Ubuntu 8.10)

 

จัดเตรียม tftp server เพื่อจัดเก็บ kernel (uImage)

 

1. ติดตั้ง tftp

 

$ sudo apt-get install xinetd tftpd tftp

 

2. สร้าง file /etc/xinetd.d/tftp โดยมีข้อความดังนี้

 

service tftp
{
protocol        = udp
port            = 69
socket_type     = dgram
wait            = yes
user            = nobody
server          = /usr/sbin/in.tftpd
server_args     = /tftpboot
disable         = no
}

 

3. สร้าง directory สำหรับบรรจุไฟล์ของ tftp

 

$ sudo mkdir /tftpboot
$ sudo chmod -R 777 /tftpboot
$ sudo chown -R nobody /tftpboot

 

4. วิ่ง xinetd เพื่อใช้งาน tftp

 

$ sudo /etc/init.d/xinetd restart

 

จัดเตรียม Network File System เพื่อจัดเก็บ Root File System

 

5. ติดตั้ง nfs

 

$ sudo apt-get install nfs-kernel-server nfs-common portmap

 

6. สร้าง directory สำหรับ linux file system

 

$ sudo mkdir -p /nfs/home
$ sudo chown nobody:nogroup /nfs/home
$ sudo chmod 777 /nfs
$ sudo chmod 777 /nfs/home

 

7. แก้ไขไฟล์ /etc/exports เพิ่มบรรทัดข้างล่างนี้เพื่อบอกระบบว่าอนุญาติให้ใช้ directory /nfs/home ที่เราสร้างขึ้น

 

/nfs/home     192.168.1.0/255.255.255.0(rw,sync,no_root_squash,no_subtree_check)

 

โปรดสังเกตุตัวเลข 192.168.1.0 ซึ่งเป็นวงแลนภายในของผม สำหรับผู้ที่จะใช้งานต้องไปปรับให้เข้ากับระบบของตัวเองนะครับ

 

จากนั้นก็บอกให้ระบบรับรู้ถึงการแก้ไขด้วยการ

 

$ sudo exportfs -a

 

ทดสอบระบบ tftp และ nfs ก่อนใช้งาน

 

8. สร้างไฟล์ใน tftp และ nfs

 

$ echo test > /tftpboot/aaa
$ touch /nfs/home/bbb

 

9. ทดสอบ tftp (192.168.1.74 คือ ip ของ server)

 

$ tftp 192.168.1.74
tftp> get aaa
Received 6 bytes in 0.0 seconds
tftp> quit

 

จะต้องสามารถที่จะ get file aaa ได้

 

10. ทดสอบ nfs

 

$ sudo mkdir /mnt/fs
$ sudo mount -t nfs 192.168.1.74:/nfs/home /mnt/fs
$ sudo mount
192.168.1.74:/nfs/home on /mnt/fs type nfs (rw,addr=192.168.1.74)
$ ls /mnt/fs
bbb
$ sudo umount /mnt/fs

 

จะเห็นไฟล์ชื่อ bbb ในระบบ

 

เคลียร์ระบบพร้อมใช้จริง

 

11. ลบไฟล์ที่สร้างเพื่อใช้ในการทดสอบ

 

$ rm /tftpboot/aaa
$ rm /nfs/home/bbb

 

12. เตรียม kernel สำหรับระบบ

 

$ cp uImage /tftpboot

 

13. เตรียม root file system สำหรับระบบ

 

$ cd ไปยัง directory ที่จัดเก็บ root file system
$ cp -Rf * /nfs/home

 

14. แก้ไขไฟล์ interfaces ของ root fs เพื่อหยุดการทำงานของ dhcp เนื่องจากได้ทำ dhcp ไปแล้ว

 

$ vi /nfs/home/etc/network/interfaces

 

แก้ dhcp เป็น manual

 

# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.
auto eth0
#iface eth0 inet dhcp
iface eth0 inet manual

 

15. เปิด mini2440 เพื่อเข้า uboot และทำการแก้ไข bootcmd กับ bootargs ดังนี้

 

U-Boot 1.3.2-mini2440 (Jul  6 2009 - 17:02:18)

I2C:   ready
DRAM:  64 MB
Flash:  2 MB
NAND:  Bad block table not found for chip 0
Bad block table not found for chip 0
64 MiB
Found Environment offset in OOB..
USB:   S3C2410 USB Deviced
In:    serial
Out:   serial
Err:   serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot:  0

 

ใช้คำสั่ง dhcp เพื่อช่วยเซ็ทค่า ipaddress และ gateway

 

MINI2440 # dchp
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
BOOTP broadcast 1
BOOTP broadcast 2
*** Unhandled DHCP Option in OFFER/ACK: 28
*** Unhandled DHCP Option in OFFER/ACK: 28
DHCP client bound to address 192.168.1.102
TFTP from server 192.168.1.74; our IP address is 192.168.1.102

 

กด ctrl-c เพื่อหยุดการทำงานหลังจากได้ ip address แล้ว หลังจากนั้นให้ set bootcmd

 

MINI2440 # setenv bootargs 'console=ttySAC0,115200 noinitrd init=/sbin/init mini2440=0tb root=/dev/nfs rw nfsroot=192.168.1.74:/nfs/home ip=dhcp'

 

ตามด้วยการ set bootargs

 

MINI2440 # setenv bootcmd 'tftpboot 0x31000000 192.168.1.74:uImage ; bootm 0x31000000'

 

และจัดเก็บบันทึกค่าอย่างฐาวรไว้ใน nand flash

 

MINI2440 # saveenv

 

 

หลังจากนั้นเมือ reset ก็จะเกิดสิ่งมหัศจรรย์ขึ้นครับ :)

 

kernel จะถูกloadจาก tftp

 

root file system จะ mount จาก nfs