linux根文件系统制作之busybox编译和系统构建【转】
转自:http://blog.chinaunix.net/uid-29401328-id-5019660.html
介绍完相关文件后我们开始构建文件系统,涉及到的文件等到具体用到的时候再讲。
一、编译busybox
首先下载busybox源码,编译busybox,得到一些初始化文件及我们需要的各种命令。关于busybox的作用请百度,这里不详细讲。
我下载的是busybox-1.23.1,解压之后进入到顶层目录。
1.修改顶层Makefile
把CROSS_COMPILE和ARCH修改成你自己的交叉编译器和硬件平台,如:
CROSS_COMPILE = arm-none-linux-gnueabi-
ARCH = arm
2.make menuconfig,修改下面的选项,不然会编译出错
Busybox Settings --->
Build Options --->
[*]Build shared libbusybox
[ ] Produce a binary for each applet, linked against libbusybox
[ ] Produce additional busybox binary linked against libbusybox
Busybox Settings --->
Installation Options ("make install" behavior) --->
(/nfsdir/tools/rootfs) BusyBox installation prefix // 编译生成文件的存放路径
其他都保持默认
关于需要注意的一些选项说明如下:
Busybox Settings --->
Build Options --->
[ ] Build BusyBox as a static binary (no shared libs) (NEW)
这个意思是运行busybox才动态链接库,busybox需要的库要我们提供
Busybox Settings --->
Installation Options ("make install" behavior) --->
What kind of applet links to install (as soft-links) --->
设置busybox生成后各种命令均为指向busybox主程序的软链接
Busybox Settings --->
Busybox Library Tuning --->
(255) History size
[*] History saving (NEW) // 支持历史记录
[*] Tab completion (NEW) // 支持Tab补全操作
选项Applets就是将busybox支持的几百个命令分门别类,我们可以在各个门类下选择想要的命令。
3.make
最后出现下面的信息,make成功
CC util-linux/volume_id/xfs.o
AR util-linux/volume_id/lib.a
LINK busybox_unstripped
Trying libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it (yet)
Final link with: m
libbusybox: 0_lib/libbusybox.so.1.23.1
DOC busybox.pod
DOC BusyBox.txt
DOC busybox.1
DOC BusyBox.html
4.make install
出现下面的信息安装成功
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
至此busubox的安装就完成了,现在查看/nfsdir/tools/rootfs文件夹,会发现多了下面几个文件:
bin linuxrc sbin usr
可以在bin目录查看,busybox只有970K
二、正式构建根文件系统
1.创建所需文件夹(根据FHS标准)
mkdir dev etc home lib media mnt opt proc sys tmp var root
2.添加相应的库
需要添加的库是从编译busybox所使用的交叉编译工具里拷贝的,但交叉编译工具里的库文件很多,不必全部拷贝。
那么我们怎么知道哪些库是需要的呢?
可以用一下方法确定
[root@localhost bin]# arm-linux-readelf -d busybox
Dynamic section at offset 0xf16b4 contains 25 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]
而ld-linux.so.3属于固有需要的库,所以busybox至少需要三个库:ld-linux.so.3、libm.so.6、libc.so.6
下面要睁大眼睛了,上面的库都是链接文件,不要把链接文件拷进去了,真正的文件没拷贝
[root@localhost lib]# ls -l libc.so.6
lrwxrwxrwx 1 root root 11 Apr 23 21:13 libc.so.6 -> libc-2.8.so
[root@localhost lib]# ls -l libm.so.6
lrwxrwxrwx 1 root root 11 Apr 23 21:13 libm.so.6 -> libm-2.8.so
[root@localhost lib]# ls -l ld-linux.so.3
lrwxrwxrwx 1 root root 9 Apr 23 21:13 ld-linux.so.3 -> ld-2.8.so
所以要把ld-linux.so.3、libm.so.6、libc.so.6和libc-2.8.so、libm-2.8.so、ld-2.8.so都拷贝到/lib下。
但是上面的这几个库只是busybox运行所需要的库,这个时候系统虽然可以启动,但会出现下面的打印信息:
feed_wdg: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory
这个意思是由于缺少libgcc_s.so.1库,导致看门狗程序启动不了,然后看到开发板过以后重启了,所以要想正常运行还需要拷贝libgcc_s.so和libgcc_s.so.1
但是实际使用的时候要一个一个去查看嘛,这样太麻烦了,所以一般把正常需要的库都拷贝到/lib下,这样也不会太大,包括:
ld-linux:动态链接库,必需
libc: 标准c函数库,必需
libm: 数学库,一般需要
libdl: 用于动态装载共享库,较少用到
libcrypt: 加密附加库,需要认证的程序用到,较少用
libpthread: POSIX线程库,一般需要
3.添加配置文件(即/etc下的文件)
这里对照我们之前的分析步骤
a.首先是inittab文件,内容如下:
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::once:/usr/sbin/telnetd -l /bin/login
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
b.添加init.d/rcS文件,内容如下:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
hwclock -s
feed_wdg &
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.2.99
/bin/hostname -F /etc/HOSTNAME
c.添加HOSTNAME文件,内容就是代表主机名,可以随意定,如:
Blue
d.添加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
var /dev tmpfs defaults 0 0
ramfs /dev ramfs defaults 0 0
e.根据inittab文件的内容console::askfirst:-/bin/sh,
在启动脚本etc/init.d/rcS执行完后将在终端启动一个shell。Shell启动过程中会根据文件/etc/profile配置登陆环境。
所以需要添加profile文件,内容如下:
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# ' # 这个显示的是命令行下的主机名和用户名格式,如:[root@Blue etc]#
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
f.如果要配置正确的用户,必须具有两个文件:group和passwd
group内容如下:
root:x:0:root
passwd内容如下:
root::0:0:root:/:/bin/sh
具体什么意义请百度
到此/etc配置完毕,包含如下:
HOSTNAME fstab group init.d inittab passwd profile
4.在/dev/下创建设备节点:
mknod console c 5 1
mknod null c 1 3
对于我的系统不创建也可以,原因参见上篇博文
三、制作yaffs2文件系统
进入到/nfsdir/tools/(根文件系统的上次目录)
[root@localhost tools]# mkyaffs2image rootfs root.bin // mkyaffs2image工具是交叉编译工具自带的
生成的root.bin镜像可直接拷贝到nand flash的文件系统分区,接下来就可以直接启动了
上面只是制作了一个最简单的文件系统,实际可以根据自己的需要添加启动程序、丰富自己的配置及功能等
linux根文件系统制作之busybox编译和系统构建【转】的更多相关文章
- linux根文件系统制作,busybox启动流程分析
分析 busybox-1.1.6 启动流程,并 制作一个小的根文件系统 源码百度云链接:https://pan.baidu.com/s/1tJhwctqj4VB4IpuKCA9m1g 提取码 :l10 ...
- linux根文件系统制作
在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误. 那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/l ...
- 基于mini2440嵌入式Linux根文件系统制作(Initramfs和nfs两种跟文件系统)
嵌入式系统由三部分构成: 1.bootoader---bootparameters---2.kernel 3.Root-filesysytem 一个内核可以挂载多个文件系统,但是有一个根文件系统所以叫 ...
- Linux 根文件系统制作
1.创建根文件目录 mkdir rootfs(名字是随便取的) 2.创建子目录 cd rootfs mkdir bin dev etc lib proc sbin sys usr mnt tmp va ...
- 嵌入式linux根文件系统制作
编译Busybox 从http://www.busybox.net/downloads/下载busybox工具.这里我们下载的上最新版: busybox-1.24.2.tar.bz2 解压Busybo ...
- 【linux】linux根文件系统制作
欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...
- 嵌入式linux内核制作、根文件系统制作
嵌入式系统构成: 主要由bootloader.kernel.以及根文件系统三部分组成. 内核制作步骤: 制作嵌入式平台使用的linux内核制作方法与pc平台上的linux内核基本一致 1.清除原有配置 ...
- 制作linux根文件系统
转载地址:http://wenku.baidu.com/view/2cb1b4707fd5360cba1adb14.html 2011十一月 24 转 嵌入式根文件系统制作 (3985) (0) 转自 ...
- S5PV210的根文件系统制作
一.移植BusyBox1.下载BusyBox的源代码下载地址:http://www.busybox.net/downloads/,此处下载busybox-1.20.2.tar.bz2.2.解压并进入目 ...
随机推荐
- php同一个用户同时只能登陆一个, 后登陆者踢掉前登陆者(排他登陆)
通常用户登陆,如果没有特别的限定, 同一个用户可以同时登陆, 今天搞了一个东西限定一个用户不能同时登陆到一个系统上, 后登陆者会把前面登陆的踢出来.(有点像QQ,同个帐号不能在多个地方同时在线, 后面 ...
- GNU中的关键字typeof
如果你是 C++ 程序员,应该接触过 C++11 里的 decltype 操作符,它的作用是自动推导表达式的数据类型,以解决泛型编程中有些类型由模板参数决定而难以(甚至不可能)表示的问题.其实这个特性 ...
- 排序算法C语言实现——插入排序(优于冒泡)
为什么插入排序要优于冒泡? 插入排序在于向已排序序列中插入新元素,主要的动作是移动元素,涉及1次赋值,即data[j] = data[j-1]; 而冒泡排序在于相邻元素交换位置,涉及3条赋值,即iTm ...
- mysql破解密码安装与基本管理
一.MySQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...
- python并发编程相关概念总结
1.简述计算机操作系统中的“中断”的作用? 中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序.待处理完毕后又返回 ...
- lambda表达式与函数接口的关系以及使用案例
lambda表达式与函数式接口是结合使用的. 函数式接口:接口中只有一个抽象方法的接口,其中可以包括default修饰,static 修饰的实例方法.函数式接口可以在接口上添加@FuncationIn ...
- Careercup - Microsoft面试题 - 24313662
2014-05-12 07:27 题目链接 原题: Convert a number to a number 题目:把二进制数转化成四进制数. 解法:四是二的倍数,所以两位变一位就可以了. 代码: / ...
- IOS开发---菜鸟学习之路--(八)-实现新闻页面
本章将具体讲述如何结合前两张的内容最终实现一个新闻页面的雏形 之所以称之为雏形,是因为本章实现的内容只是实现了最基础的效果 还有很多其他诸如下拉刷新 页面导航等效果都需要投入一些时间进行研究 好了直接 ...
- C++ map 的用法归纳2
[尊重原著: http://blog.csdn.net/zcf1002797280/article/details/7847819] Map是c++的一个标准容器,它提供了很好一对一的关系,在一些程序 ...
- flask url_for()和redirect的区别
一. 两者用来重定向的时候,被操作的对象不同. redirect直接是url,就是app.route的路径参数. url_for()是对函数进行操作. from flask import Flask, ...