[置顶] 从零制作文件系统到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出现错误:
方法同上,将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,115200save
说明:
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了。
完毕。
[置顶] 从零制作文件系统到JZ2440,使其支持telnet , ftp 和tftp的更多相关文章
- jquery——制作置顶菜单
置顶菜单: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- js改变数组的两个元素的位子,互换、置顶
//js数组的元素上移和下移动 var fieldData=[ {name:'id',value:'ID'} , {name:'username',value:'用户名'} , {name:'emai ...
- 窗口置顶 - 仿TopWind
前置学习:低级鼠标hook,获得鼠标状态. 这个在原来获得鼠标状态的基础上,加上一个事件处理即可. TopWind就是一个可以置顶窗口的文件,避免复制粘贴的时候的来回切换(大窗口与小窗口),算是一个实 ...
- [置顶] Android开发笔记(成长轨迹)
分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...
- 仿照 QQ 的 cell 的左滑删除、置顶、标记未读效果
侧滑删除.置顶.取消关注,在iOS8之前需要我们自定义,iOS8时苹果公司推出了新的API,UITableViewRowAction类,我们可以使用该类方便的制作出如下图的效果. 下面是实现的主要代码 ...
- 在UWP中页面滑动导航栏置顶
最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...
- WinFrom窗体始终置顶
调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...
- winform窗体置顶
winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...
- 自定义置顶TOP按钮
简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...
随机推荐
- 发现程序bug思路
大家有没有遇到过项目,程序出现个bug,但花了好久(真的是a long long time啊)才发现引发这个问题的原因,心想原来就这个原因导致的啊,要是早想到就好了! 其实我们确实的是方法,希望我的抛 ...
- 【转】jQuery对象与DOM对象之间的转换方法
刚开始学习jquery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象.至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换. 什么是jQuery对 ...
- IOS 拨打电话:4006 701 855 苹果中国
IOS 拨打电话:4006 701 855 苹果中国
- 自己动手写OpenStack的QoS功能(4)
本文地址:http://blog.csdn.net/spch2008/article/details/9283561 数据库相应操作已完成,对OVS-Plugin进行修改. 在quantum\plug ...
- 2017-03-01 Oracle10g的安装与配置使用
今天项目中又用到了Oracle,时隔三年没有碰过Oracle,之前在做某城市公共自行车管理系统时使用的是Orace10g版本,Oracle给我最大的感觉就是安装上以后,电脑就会变得很卡,所以大家当不使 ...
- Tomcat的bin目录下startup.bat、Tomcat6.exe、Tomcat6w.exe区别
从官方下载了apache-tomcat-6.0.37-windows-x64.zip安装包,解压后bin目录下的startup.bat.Tomcat6.exe.Tomcat6w.exe 3个程序有何区 ...
- Python爬虫之利用BeautifulSoup爬取豆瓣小说(二)——回车分段打印小说信息
在上一篇文章中,我主要是设置了代理IP,虽然得到了相关的信息,但是打印出来的信息量有点多,要知道每打印一页,15个小说的信息全部会显示而过,有时因为屏幕太小,无法显示全所有的小说信息,那么,在这篇文章 ...
- 安装Xcode 7 beta后Xcode 6崩溃的问题
最新解决方案:把OSX El Capitan升级到Beta 7 (15A263e),Xcode6可使用! 解决方案:http://stackoverflow.com/questions/318035 ...
- python sort() sorted() 与argsort()函数的区别
1.python的内建排序函数有 sort.sorted两个 sort函数只定义在list中,sorted函数对于所有的可迭代序列都可以定义. for example: ls = list([5, 2 ...
- 剑指offer--19.重建二叉树
先序:根>左>右 中序:左>根>右 后序:左>右>根 e.g. {1,2,4,7,3,5,6,8} {4,7,2,1,5,3,8,6} 先序第一个元素是根节点,在中 ...