tiny4412 busybox制作根文件系统rootfs nfs 挂载 ubuntu 14.04
http://blog.csdn.net/liudijiang/article/details/50555429(转)
首先得要有制作好的uboot和linux内核镜像zImage,先烧录到sd卡里,这个是已经做好了的工作。
一,ubuntu上先设置好nfs服务
1.新建一个要挂载的文件
liudijiang@ubuntu:~/share$ pwd
/home/liudijiang/share
我已经建好了,这是我的路径
2.安装nfs服务
liudijiang@ubuntu:~/share$ sudo apt-getinstall nfs-kernel-server
3.修改/etc/exports文件
liudijiang@ubuntu:~/share$ sudo vim/etc/exports
在文件最后添加如下内容
/home/liudijiang/share *(rw,sync,no_root_squash,no_subtree_check)
*:允许所有的网段访问,也可以使用具体的IP
rw:挂接此目录的客户端对该共享目录具有读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限。
no_subtree_check:不检查父目录的权限。
注意,*和后面的括号不能出现空格。
然后保存退出。
4. 重启rpcbind 服务,(14.04版本是rpcbind,较老的版本好像是portmap)
liudijiang@ubuntu:~/share$ sudo/etc/init.d/rpcbind restart
5.重启nfs-kernel-server
liudijiang@ubuntu:~/share$ sudo /etc/init.d/nfs-kernel-serverrestart
*Stopping NFS kernel daemon [OK ]
*Unexporting directories for NFS kernel daemon... [ OK ]
*Exporting directories for NFS kernel daemon... [ OK ]
*Starting NFS kernel daemon [OK ]
6.测试nfs服务是否成功
liudijiang@ubuntu:~/share$ sudo mount -tnfs localhost:/home/liudijiang/share /mnt
把本地的/home/liudijiang/share文件夹挂载到/mnt上
在share文件新建和修改的东西就出现在了/mnt上了
取消挂载,sudo umount /mnt
注意,在/mnt下时,执行取消挂载不能成功的,得不在这个路径下才可以取消挂载
到这一步就已经设置好了nfs服务了,一旦开发板能和ubuntu的ip地址ping通,就可以挂载ubuntu的文件夹了。
二,制作busybox
busybox官网
1.找到busybox-1.23.2.tar.bz2并下载下来,解压
liudijiang@ubuntu:~/work$ tar xfbusybox-1.23.2.tar.bz2
2.配置busybox
liudijiang@ubuntu:~/work/busybox-1.23.2$make menuconfig
1)配置动态链接库和设置编译器前缀
进入Busybox Setting菜单后进入Build Options菜单
这里编译器是arm-linux-gcc,所以前缀填arm-linux-,这里选择动态链接库,链接的是arm-linux-gcc的库,后面要从安装arm-linux-gcc的地方考出要用到的库。
2)安装路径
进入Installation Options
3)配置模块命令
进入Linux Module Utilities
pretty output、blacklist support、depmod选进去也行。
4)保存配置
进入Save Configuration to an Alternate File菜单
直接ok就行
3.编译,安装
liudijiang@ubuntu:~/work/busybox-1.23.2$make -j16;make install -j16
liudijiang@ubuntu:~/work$ ls rootfs/
bin linuxrc sbin usr
bin sbin usr三个文件夹存放各种命令
linuxrc是一个软连接文件,连接到bin/busybox程序
4.检测busybox是否成功
liudijiang@ubuntu:~/work/rootfs$ filebin/busybox
bin/busybox: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV),dynamically linked (uses shared libs), stripped
上面显示ARM平台运行,说明安装成功了。
5.完善动态链接库
我们在busybox设置的是动态链接库,而且编译器是arm-linux-gcc,找到安装arm-linux-gcc的安装路径
liudijiang@ubuntu:~/work/rootfs$ which arm-linux-gcc
/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc
上面是我的路径,/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib,这个就是要复制出来的动态库的路径,把里面的动态链接文件复制到rootfs文件夹下
先在rootfs文件下创建其他文件夹,模仿ubuntu系统,看看他的根目录下有哪些文件夹
liudijiang@ubuntu:~/work/rootfs$ mkdiretc/init.d dev home proc tmp var mnt root sys opt lib –p
复制动态链接文件
liudijiang@ubuntu:~/work/rootfs$ cp/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/*.so* lib/ -rap
6.创建控制台设备文件
liudijiang@ubuntu:~/work/rootfs$ sudo mknoddev/console c 5 1
这个文件是字符设备,主设备号是5,次设备号是1,只能用mknod命令创建
7.创建etc/下必要文件
liudijiang@ubuntu:~/work/rootfs/etc$ tree./
./
├── fstab 必要文件,挂着文件中指定的所有文件系统
├── group 不是必要文件,要设置密码时需要
├── init.d 必要的文件夹
│ ├── rcS 必要文件
│ └── rcS.bak 必要文件
├── inittab 从busybox的example文件下复制
├──passwd 不是必要文件,要设置密码时需要
├── profile 不是必要文件,可以创建来支持命令提示格式配置,配置系统环境变量
└── shadow 不是必要文件,要设置密码时需要
1)创建etc/inittab文件
我们可以用busybox提供的示例文件复制过来
liudijiang@ubuntu:~/work/busybox-1.23.2/examples$ls
inittab …
将以下内容(59行左右)
# Start an "askfirst" shell onthe console (whatever that may be)
::askfirst:-/bin/sh
# Start an "askfirst" shell on/dev/tty2-4
tty2::askfirst:-/bin/sh add "console" in line 60, commentline 62 - 64
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
修改为
# Start an "askfirst" shell onthe console (whatever that may be)
console::askfirst:-/bin/sh #这里加上console,也就是前面在dev文件夹下创建的控制台
# Start an "askfirst" shell on/dev/tty2-4
#tty2::askfirst:-/bin/sh add "console" in line 60, commentline 62 - 64
#tty3::askfirst:-/bin/sh
#tty4::askfirst:-/bin/sh
2)fstab文件
手动创建一个fstab文件,添加以下内容
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts defaults 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
第一列是挂载设备,第二列是挂载目录,第三列是挂载文件系统类型,第四列是挂载选项分别有
auto:系统自动挂载,fstab默认就是这个选项
ro:read-only
rw:read-write
defaults:rw,suid,dev,exec,auto,nouser,and async
第五列为dump选项,设置是否让备份程序dump备份文件系统,0为忽略,1为备份
第六列为fsck选项,告诉fsck程序以什么顺序检查文件系统,0为忽略
3)rcS文件
在init.d文件夹下创建,添加以下内容
#!/bin/sh
mount –a #挂载fstab文件中所有指定的文件系统
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev >/proc/sys/kernel/hotplug
mdev –s #创建控制台
/bin/hostname ubuntu #这里修改hostname
注意,查看一下rcS文件的权限,如果没有执行权限的话,开发板的linux内核不能运行这个文件
sudo chmod +x rcS 添加权限
4)profile文件
添加以下内容
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
#导出环境变量
export USER LOGNAME PS1 PATH
5)group、passwd、shadow三个文件是要用密码登陆的时候才用到的,可以从linux系统的/etc/group、/etc/passwd 、/etc/shadow 拷贝过来
然后修改inittab文件,原来修改的地方改成:
# Start an "askfirst" shell on the console (whatever that may be)
#console::askfirst:-/bin/sh
::respawn:-/sbin/getty 115200 ttySAC0
# Start an "askfirst" shell on /dev/tty2-4
#tty2::askfirst:-/bin/sh add "console" in line 60, commentline 62 - 64
#tty3::askfirst:-/bin/sh
#tty4::askfirst:-/bin/sh
这里用的账号密码时原来ubuntu linux上已有的账号密码
这里还要修改passwd文件的内容,将所有”/bin/bash“ 改成“/bin/sh”
这是修改shell脚本的类型,PC上linux运行的是bash shell脚本,开发板linux运行的是sh shell脚本。
不用这个也可以,不用的时候开发板开机运行直接进入命令行了,加上这些的时候,开机运行后要登陆的账号密码才能进入开发板的linux系统,纯粹是为了好玩的。。。
小结一下这部分:
1. inittab,rcS,fstab关系
系统启动挂载文件系统--->
--->读取/etc/inittab文件,解析其中定义的动作
--->根据sysinit定义的process执行/etc/init.d/rcS
--->/etc/init.d/rcS中第一条命令 mount -a
--->读取/etc/fstab文件
--->根据文件列表内容逐个挂载其中的设备到指定地
2.profile文件
设置环境变量,根据这里设置命令提示符号相关的环境变量
用户可以根据自己需要添加环境变量
3./etc/init.d/rcS执行系统初始化时候,想开机启动的程序都可以写在这个文件中
4.group存放用户ID信息,命令提示符号格式配置需要使用这个文件
5.passwd和用户相关的密码
等会设置好电脑、ubuntu、开发板的ip后,开发板uboot设置好启动后挂载ubuntu的这个rootfs,就能够在电脑和Xshell上通用rootfs这个文件夹了。开发板linux运行起来也就是读取rootfs里面这些文件,运行这些文件的内容了。
三,设置电脑主机、虚拟机、开发板的ip地址
先把开发板和电脑网线连接起来,让开发板跑起来,虽然这时候什么也没动,但应该能看到开发板和电脑的网口的指示灯都是亮的
设置电脑的ip
为了开发方便,手动设置成静态ip
保存即可
liudijiang@ubuntu:~/work/rootfs$ ifconfig
eth0 Link encap:以太网 硬件地址00:0c:29:29:30:8a
inet 地址:192.168.3.27 广播:192.168.3.255 掩码:255.255.255.0
inet6 地址: fe80::20c:29ff:fe29:308a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:2421 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2849 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:335705 (335.7 KB) 发送字节:2430579(2.4 MB)
中断:19 基本地址:0x2000
lo Link encap:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 跃点数:1
接收数据包:506 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:506 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:48008 (48.0 KB) 发送字节:48008(48.0 KB)
设置电脑的以太网网卡,设置成静态ip
现在就可以用虚拟机和电脑主机互ping一下,看看通不通
liudijiang@ubuntu:~/work/rootfs$ ping192.168.3.30
PING 192.168.3.30 (192.168.3.30) 56(84)bytes of data.
64 bytes from 192.168.3.30: icmp_seq=1ttl=64 time=5.70 ms
64 bytes from 192.168.3.30: icmp_seq=2ttl=64 time=0.448 ms
64 bytes from 192.168.3.30: icmp_seq=3ttl=64 time=0.474 ms
我已经将电脑主机的防火墙都关掉了,不关掉的时候我也能ping通,如果没ping通就把电脑防火墙关掉再试试吧。
接下来是设置开发板的ip,复位开发板,进入uboot命令行模式下
设置的参数的命令
liudijiang # setenv gatewayip 192.168.3.1
还有ip地址,掩码也是一样设置,服务器ip设不设置都行
设置bootargs
liudijiang # setenv bootargs root=/dev/nfs nfsroot=192.168.3.27:/home/liudijiang/work/rootfs/ ip=192.168.3.123:192.168.3.27:192.168.3.1:255.255.255.0::eth0:off init=/linuxrcconsole=ttySAC0 lcd=S70
设置bootcmd
setenv bootcmd ‘movi read kernel 040008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000’
查看结果
liudijiang # pri
baudrate=115200
bootargs=noinitrd root=/dev/nfs nfsroot=192.168.3.27:/home/liudijiang/work/rootfs/ ip=192.168.3.123:192.168.3.27:192.168.3.1:255.255.255.0::eth0:off init=/linuxrcconsole=ttySAC0 lcd=S70
bootcmd=movi read kernel 0 40008000;moviread rootfs 0 41000000 100000;bootm 40008000 41000000
bootdelay=3
ethaddr=00:40:5c:26:0a:5b
gatewayip=192.168.3.1
ipaddr=192.168.3.123
netmask=255.255.255.0
serverip=192.168.3.30
和NFS有关的选项:
root=/dev/nfs --使用NFS这个设备
NFS文件夹具体的路径
nfsroot=192.168.3.27:/home/liudijiang/work/rootfs ip=192.168.3.123:192.168.3.27:192.168.3.1:255.255.255.0::eth0:off
格式说明:
nfsroot=虚拟机Linux系统IP:根文件系统绝对路径 ip=开发板IP:虚拟机Linux系统IP:网关:子网掩码::开发板的网卡设备名(一般是eth0,不是虚拟机):off
以上配置的结果,电脑主机、虚拟机、开发板都在192.168.3这个网段,其他网段也行。。。重新启动后会发现已经挂载到ubuntu的那个目录下了,而且ping一下。。。能挂载上,肯定能ping通了。。。
而且我在Xshell里已经能进入开发板linux的命令行了
在tmp目录下新建个hello.c,这个当然是在ubuntu上用vim方便啦,然后顺便编译一下。我已经写好了,内容如下
liudijiang@ubuntu:~/work/rootfs/tmp$ cat hello.c
#include <stdio.h>
void main(void)
{
printf("hellolinux!\r\n");
}
liudijiang@ubuntu:~/work/rootfs/tmp$arm-linux-gcc -o hello hello.c
liudijiang@ubuntu:~/work/rootfs/tmp$ ls
hello hello.c
因为是要在开发板上运行,所以是arm-linux-gcc
已经ok了。。。
然而在ubuntu下运行这个hello是不可执行的,因为ubuntu是x86,得gcc编译才可以运行。
tiny4412 busybox制作根文件系统rootfs nfs 挂载 ubuntu 14.04的更多相关文章
- 通过busybox制作根文件系统详细过程
我在之前的uboot通过NFS挂载ubuntu根文件系统中也有实现过根文件系统的制作,那只是在ubuntu官网已经做好的根文件基础上安装一些自己所需的软解而已.而使用busybox制作根文件系统可以自 ...
- 通过busybox制作根文件系统
通过busybox制作根文件系统可以自定义选项,在制作的根文件系统中添加需要的命令,指定生成的根文件系统到相应的目录下. 一. 根文件系统的获取方式--->官网: https://busybox ...
- 利用busybox制作根文件系统
实际项目中可以使用Buildroot制作根文件系统 1.busybox源码下载及配置 https://busybox.net/downloads/ 1.1.修改Makefile (1) ARCH = ...
- zju(4)使用busybox制作根文件系统
1.实验目的 1.学习和掌握busybox相关知识及应用: 2.学会使用交叉编译器定制一个busybox: 3.利用该busybox制作一个文件系统: 4.熟悉根文件系统组织结构: 5.定制.编译ra ...
- 使用BusyBox制作根文件系统【转】
本文转载自:http://www.cnblogs.com/lidabo/p/5300180.html 1.BusyBox简介 BusyBox 是很多标准 Linux 工具的一个单个可执行实现.Busy ...
- 使用BusyBox制作根文件系统
1.BusyBox简介 BusyBox 是很多标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大.更复杂的工具,例如 gre ...
- Linux 利用busybox制作根文件系统
busybox版本:1.17.3 官网下载路径:https://busybox.net/downloads/ 网盘下载路径:https://pan.baidu.com/s/1nvrEa73 密码:7y ...
- mkyaffs2image制作根文件系统、使用NFS挂载虚拟机目录(2)
1.制作根文件系统及nfs烧写 1.1 先解压文件系统,/wok/nfs_root 目录下是已经构造好的各种文件系统:① fs_mini.tar.bz2 是最小的根文件系统,里面的设备节点是事先建立好 ...
- 第4阶段——制作根文件系统之分析init进程(2)
本节目标: (1) 了解busybox(init进程和命令都放在busybox中) (2) 创建SI工程,分析busybox源码来知道init进程做了哪些事情 (3) 分析busybox中init进 ...
随机推荐
- 问题: 查看某个文件的修改记录| git log 高级用法
参考文章: git查看某个文件的修改历史 5.3 Git log 高级用法 基本步骤 git log --pretty=oneline [文件名] git show [节点] git log 两周高级 ...
- [已读]悟透JavaScript
这本书出的特别早,就第一部分内容还行,第一次看得时候觉得蛮有意思,讲禅的方式来讲javascript,作者造了一个"甘露模型"来实现继承,不过今天整理的时候,发现那些笔记都没多少可 ...
- B. Hierarchy
http://codeforces.com/problemset/problem/17/B 用邻接矩阵建图后, 设cost[v]表示去到顶点v的最小值. 很多个人去顶点v的话,就选最小的那个就OK 然 ...
- 第八章 设计用户界面 之 给Web程序应用用户界面设计
1. 概述 本章内容包括: 使用CSS创建和应用样式.使用HTML构架用户界面的层次 以及 根据需求实现动态页面内容. 2. 主要内容 2.1 使用CSS创建和应用样式 Razor程序的模板是_Lay ...
- user-select详解
语法: user-select:none | text | all | element 默认值:text 适用于:除替换元素外的所有元素 继承性:无 动画性:否 计算值:指定值 取值: none: 文 ...
- mongodb主从配置信息查看与确认
在local库中不仅有主从日志 oplog集合,还有一个集合用于记录主从配置信息 system.replset: > use local > show collections > d ...
- 动手使用ABAP Channel开发一些小工具,提升日常工作效率
今天的故事要从ABAP小游戏说起. 中国的ABAP从业者们手头或多或少都搜集了一些ABAP小游戏,比如下面这些. 消灭星星: 扫雷: 来自我的朋友刘梦,公众号"SAP干货铺"里的俄 ...
- 集成iAd广告
在iPhone程序中集成广告,管他能不能赚钱,不放上一个iAd就心有不甘. 参考了下面这篇文章: http://bees4honey.com/blog/tutorial/how-to-add-iad- ...
- layui模块规范
刚入公司不久,就开始做项目了,最后还是选择用layui来做前端的页面,一来是可以自适应,二来是用框架比较方便,简洁. 先看下Layui的介绍: layui 是一款采用自身模块规范编写的情怀级前端UI框 ...
- Easier Done Than Said?(应用到的知识)
memset(b,0,sizeof(b)) 对于大块儿内存的分配,例如int arr[100];定义了数组arr,包含100个元素,如果你写成int arr[100]=0;想将数组全部内容初始化为0, ...