從零製作文件系統到JZ2440,使其支持telnet , ftp 和tftp

轉自:http://mp.weixin.qq.com/s?__biz=MzAxNTAyOTczMw==&mid=2649328515&idx=1&sn=5849fba4b44ec28a15217edaf629bc34&chksm=83976f09b4e0e61ff356124dd8a4befd126d213f15a769afc067db2aa3391e452fd8a5b65b1f&mpshare=1&scene=23&srcid=0612S5eJpICGarjpiL39WbUo#rd


該教程參考了<<嵌入式Linux應用開發完全手冊>>構建文件系統章節和<<jz2440v2_v3開發板(4.3寸LCD)使用手冊>>編譯內核章節,篇幅較長,建議轉發收藏觀看。


開發板:JZ2440

主機linux:Ubuntu 9.10(資料光盤配的那個)

內核:Linux 2.6.22.6

交叉編譯器:arm-linux-gcc 3.4.5(也可以用畢業班4.3.2編譯器,不過筆者沒找對lib,失敗了,先不深究)

busybox:busybox-1.21.0.tar.bz2

(本想用韋老師視頻用的busybox -1.17.0,後來發現其不支持ftp和tftp,遂放棄)

 

1,下載busybox 1.21.0: https://busybox.net/downloads/

2,藉助filezilla把文件上傳到ubuntu

3,解壓busybox

$tar jxf busybox-1.21.0.tar.bz2

$cd busybox-1.21.0/

先添加比較好用的tab工具(默認已經添加):

make menuconfig

BusyboxSettings  --->

    Busybox Library Tuning  --->

        [*]  Tab completion


4,  編譯和安裝busybox

編譯前先修改busybox根目錄的Makefile,使用交叉編譯器:

ARCH           ?= $(SUBARCH)

CROSS_COMPILE   ?=

改爲:

ARCH            ?= arm

CROSS_COMPILE   ?= arm-linux-

make

出現錯誤:

解決方法:
配置busybox去掉 ionice 選項

$  makemeunconfig


選擇下面的菜單:
Miscellaneous Utilities  --->    
[ *]
ionice                                    
按空格去掉這個選項。改成下面這樣。
[ ]ionice         

保存退出

繼續make出現錯誤:

方法同上,nandwritenanddump選項去掉。

繼續make又出現錯誤:

方法同上,ubi開頭的選項都去掉

繼續make,又出現錯誤:

方法同上:

Networking Utilities  --->    

[*] udhcp server (udhcpd)

改爲:

[] udhcp server (udhcpd)

終於make成功

最後執行“make CONFIG_PREFIX=DIR install”將busybox安裝到DIR指定的目錄下。

$ make CONFIG_PREFIX = /work/busybox-1.21.0/rootfs install

 

一切完成後將在/work/busybox-1.21.0/rootfs 生成如下文件、目錄:

drwxr-xr-x 2 book book 40962017-05-28 04:59 bin

lrwxrwxrwx 1 book book 11 2017-05-28 04:59 linuxrc ->bin/busybox

drwxr-xr-x 2 book book 40962017-05-28 04:59 sbin

drwxr-xr-x 4 book book 40962017-05-28 04:59 usr


5.安裝glibc庫

在開發板上只需要加載器和動態庫,假設要構建的根文件系統目錄爲/work/busybox-1.21.0/rootfs,如下操作即可:

$ cd /work/busybox-1.21.0/rootfs

$ mkdir  lib

$ cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib

$ cp*.so* –d /work/busybox-1.21.0/rootfs/lib


6.構建etc目錄

① 創建etc/inittab文件

$ cd /work/busybox-1.21.0/rootfs

$ mkdir etc

$ cd etc

$ touch inittab

$ sudo chmod 777 inittab

$ vi inittab,內容爲:

#/etc/inittab

::sysinit:/etc/init.d/rcS

ttySAC0::askfirst:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a –r


②創建etc/init.d/rcS文件:

$mkdir init.d

$cd init.d

$touch rcS

$sudo chmod 777 rcS

$ vi rcS, 內容爲:

mount   -a

mkdir  /dev/pts

mount-t devpts devpts /dev/pts

echo/sbin/mdev > /proc/sys/kernel/hotplug

ifconfig  eth0 192.168.1.100

mdev -s

 

 創建etc/fstab文件

$cd ..

$touch fstab

$sudo chmod 777 fstab

$vi fstab, 內容爲:

# device    mount-point    type   options        dump fsck order

proc          /proc        proc   defaults        0    0

tmpfs         /tmp         tmpfs  defaults        0    0

sysfs         /sys         sysfs  defaults           0    0

tmpfs         /dev         tmpfs  defaults        0    0


   構建dev目錄

$ mkdir –p /work/busybox-1.21.0/rootfs/dev

$ cd /work/busybox-1.21.0/rootfs/dev

$ sudo mknod console c 5 1

$ sudo mknod null c 1 3

$ sudo mknod ttySAC0 c 204 64

$ sudo mknod mtdblock0 b 31 0

$ sudo mknod mtdblock1 b 31 1

$ sudo mknod mtdblock2 b 31 2


   構建其他目錄

其他目錄可以是空目錄,比如proc、mnt、tmp、sys、root等,如下創建:

$ cd /work/busybox-1.21.0/rootfs

$mkdir proc mnt tmp sys root


   啓動板子必須要有內核,我們先編譯uImage

上傳linux 2.6.22.6到ubuntu,解壓打補丁編譯:


$ tar xjf linux-2.6.22.6.tar.bz2
$ cd linux-2.6.22.6
$ patch -p1 < ../linux-2.6.22.6_jz2440.patch
$ mv ../4.3寸LCD_mach-smdk2440.carch/arm/mach-s3c2440/mach-smdk2440.c // 替換4.3寸LCD驅動
$ cp config_ok .config
$ make uImage


   進入uboot,tftp下載uImage到jz2440,並燒寫

先設置網絡

set gatewayip 192.168.1.1   //設置網關

set netmask 255.255.255.0 //設置子網掩碼

set ipaddr 192.168.1.111    //設置uboot階段的開發板ip

set serverip 192.168.1.170 //設置服務器ip

ping 192.168.1.17             

通了


tftp 30000000 uImage //必須先PING通windows

nand erase kernel

nand write.jffs2 30000000 kernel

設置boot命令用到的bootcmd

set bootcmd nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0

save

   NFS啓動jz2440 //把文件系統先放到NFS目錄上測試

a.先設置nfs目錄:

sudo vi /etc/exports

追加一行:/work/busybox-1.21.0/rootfs   *(rw,sync,no_root_squash)

 

b. 設置bootargs

set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.199:/work/busybox-1.21.0/rootfs ip=192.168.1.100:192.168.1.199:192.168.1.255:255.255.255.0::eth0 init=/linuxrc console=ttySAC0,115200

save

說明:

192.168.1.100是linux系統起來後的開發板ip

192.168.1.199是作爲NFS服務器的ubuntu ip

192.168.1.255是ubuntu 網關

/work/busybox-1.21.0/rootfs是ubuntu /etc/exports設置的nfs目錄

255.255.255.0是ubuntu子網掩碼


boot卡在

解決方法:

先在ubuntu上測試NFS

sudo mount -t nfs -o nolock 192.168.1.199: /work/busybox-1.21.0/rootfs/mnt

出現錯誤:

解決方法:

把所有讀寫這個NFS文件的進程都kill

sudo fuser -k /mnt

掛載成功:

重啓開發板啓動成功:

7. 在etc目錄下增加passwd、group


$ cd /work/busybox-1.21.0/rootfs/etc

$ touch passwd

$ touch group

$ sudo chmod 777passwd

$ sudo chmod 777 group

$ vi passwd ,內容爲:

root:x:0:0:root:/root:/bin/sh

$ vi group,內容爲:

root:x:0:

若一個用戶沒有密碼,它在linux系統中就是不存在的用戶,無法用這個用戶登錄。現在已經使用NFS啓動成功,順便設置一下root用戶密碼(本操作在開發板上完成)

添加終端登錄用戶驗證功能

筆者設的root密碼是123456


8. 添加telnetd功能

busybox默認已經支持telnetd和telnet,開發板只要啓動telnet服務

#telnetd

securecrt快速連接選擇Telnet協議、主機名、端口:

輸入用戶名root,密碼123456即可登錄開發板:

酷斃了有木有?!


9. 添加ftp功能

製作文件系統時新建/etc/inetd.conf

cd /work/busybox-1.21.0/rootfs/etc

$touch inetd.conf

$chmod 777 inetd.conf

$vi inetd.conf,內容如下

21 stream tcpnowait root ftpd ftpd -w /


開發板開啓ftpd

$inetd 

便可以用filezilla輸入主機用戶名密碼端口(默認21),開發板window之間互傳文件了


10. 添加tftp功能

跟ftp類似,也是把配置信息寫入腳本。

$vi inetd.conf,追加一行:

69 dgram udpnowait  root  /usr/sbin/tftpd  tftpd -l

測試tftp

window打開tftpd32(資料光盤有此軟件),選擇Tftp Client,如圖輸入Host ,Port和Local File(筆者的是tftp軟件所在目錄)

開發板執行tftp -g -r 1.docx 192.168.1.170 把window Local File下的1.docx文件

傳到開發板:

當然也可以把開發板上的文件上傳到windows,如圖把開發板etc目錄下的fstab文件上傳到 window Local File目錄



至此,該文件系統已經支持telnet ftp tftp,再用NFS啓動一下,確保沒問題後再燒到開發板

//當然也可以一直用NFS,文件系統不燒進開發板。


燒到開發板步驟如下:

1.把畢業班的yaffs2源碼上傳到ubuntu解壓後,進入utils目錄

$ cd Development_util_ok/

$ cd yaffs2/

$ cd utils/

$ make

$ sudo cp mkyaffsimage /usr/local/bin

$ cd /work/busybox-1.21.0/

$ mkyaffs2image rootfs 20170607.yaffs2  


2. 把20170607.yaffs2 拷貝到window tftp軟件所在目錄,設置bootargs:

setenv bootargs 'root=/dev/mtdblock3 noinitrd init=/linuxrc console=ttySAC0,115200 '

save


3.下載文件系統 //前提是開發板能PING window

$ tftp 30000000 20170607.yaffs2

$ nand erase root

$ nand write.yaffs 30000000 0x00260000 $(filesize)


4. 啓動Linux

$ boot

只要開發板啓動並做了相關設置後,便可以使用telnet ftp tftp了。


完畢。



發佈了191 篇原創文章 · 獲贊 363 · 訪問量 124萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章