轉自: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出現錯誤:
方法同上,將nandwrite,nanddump選項去掉。
繼續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了。
完畢。