转自: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编译和系统构建【转】的更多相关文章

  1. linux根文件系统制作,busybox启动流程分析

    分析 busybox-1.1.6 启动流程,并 制作一个小的根文件系统 源码百度云链接:https://pan.baidu.com/s/1tJhwctqj4VB4IpuKCA9m1g 提取码 :l10 ...

  2. linux根文件系统制作

    在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误. 那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/l ...

  3. 基于mini2440嵌入式Linux根文件系统制作(Initramfs和nfs两种跟文件系统)

    嵌入式系统由三部分构成: 1.bootoader---bootparameters---2.kernel 3.Root-filesysytem 一个内核可以挂载多个文件系统,但是有一个根文件系统所以叫 ...

  4. Linux 根文件系统制作

    1.创建根文件目录 mkdir rootfs(名字是随便取的) 2.创建子目录 cd rootfs mkdir bin dev etc lib proc sbin sys usr mnt tmp va ...

  5. 嵌入式linux根文件系统制作

    编译Busybox 从http://www.busybox.net/downloads/下载busybox工具.这里我们下载的上最新版: busybox-1.24.2.tar.bz2 解压Busybo ...

  6. 【linux】linux根文件系统制作

    欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  7. 嵌入式linux内核制作、根文件系统制作

    嵌入式系统构成: 主要由bootloader.kernel.以及根文件系统三部分组成. 内核制作步骤: 制作嵌入式平台使用的linux内核制作方法与pc平台上的linux内核基本一致 1.清除原有配置 ...

  8. 制作linux根文件系统

    转载地址:http://wenku.baidu.com/view/2cb1b4707fd5360cba1adb14.html 2011十一月 24 转 嵌入式根文件系统制作 (3985) (0) 转自 ...

  9. S5PV210的根文件系统制作

    一.移植BusyBox1.下载BusyBox的源代码下载地址:http://www.busybox.net/downloads/,此处下载busybox-1.20.2.tar.bz2.2.解压并进入目 ...

随机推荐

  1. 绘制弧形:imagearc() 说明:三点钟的位置是起点(0度

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  2. ZendFramework-2.4 源代码 - 路由(类图)

    <?php return array( // console 模式 'console'=>array( 'router' => array( //.... ), ), // http ...

  3. JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间

    5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms  Memo ...

  4. Database returned an invalid datetime value. Are time zone definitions for your database installed?

    在做文章归档的会后,打印结果时报了这个错误 ret = models.Article.objects.filter(user=user).annotate(month=TruncMonth('crea ...

  5. Ralph W. Tyler【拉尔夫·泰勒】

    Ralph W. Tyler Anyone who cares about what schools and colleges teach and how their student learn wi ...

  6. B1061 判断题 (15分)

    B1061 判断题 (15分) 判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人 ...

  7. 排列算法汇总(下一个排列,全排列,第K个排列)

    一.下一个排列 首先,STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation. next_permutation(nums.begin() ...

  8. HDU1505-City Game(记忆化搜索)

    City Game http://acm.hdu.edu.cn/showproblem.php?pid=1505 Problem Description Bob is a strategy game ...

  9. [BZOJ3625][CF438E]小朋友和二叉树

    题面 Description 我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树. 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\ldots,c_n\).如果一棵带点权的有根二叉树满足其 ...

  10. 51nod_1199 树的先跟遍历+区间更新树状数组

    题目是中文,所以不讲题意 做法顺序如下: 使用先跟遍历,把整棵树平铺到一维平面中 使用自己整的区间更新树状数组模板进行相关操作. http://www.cnblogs.com/rikka/p/7359 ...