busybox详解制作根文件系统

合集下载

使用BusyBox制作linux根文件系统

使用BusyBox制作linux根文件系统

使⽤BusyBox制作linux根⽂件系统操作系统:Ubuntu9.04内核版本:linux-2.6.24.7开发板:博创arm2410s交叉编译⼯具:arm-linux-gcc-4.1.1BusyBox:busybox-1.11.1CramFS:CramFS-1.1注意:由于要制作的根⽂件系统使⽤了mdev(BusyBox简化版的udev),因此,需要内核⽀持sysfs、procfs和ramfs(tmpfs)⽂件系统以及hotplug(uevent)事件机制。

浅蓝⾊为命令,橘红⾊为代码和脚步1、准备根⽂件系统使⽤shell脚本create_rootfs.sh,建⽴根⽂件系统的⽬录框架lingd@ubuntu:~/arm2410s$ vi create_rootfs.shcreate_rootfs.sh 内容如下:#!/bin/shecho "------Create rootfs directons......"mkdir rootfscd rootfsecho "--------Create root,dev......"mkdir root dev etc bin sbin mnt sys proc lib home tmp var usrmkdir usr/sbin usr/bin usr/lib usr/modulesmkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.dmkdir lib/moduleschmod 1777 tmpcd ..echo "-------make direction done---------"为 create_rootfs.sh添加执⾏权限lingd@ubuntu:~/arm2410s$ chmod a+x create_rootfs.sh执⾏create_rootfs.sh,建⽴根⽂件系统的⽬录框架lingd@ubuntu:~/arm2410s$ ./create_rootfs.shlingd@ubuntu:~/arm2410s$ cd rootfslingd@ubuntu:~/arm2410s/rootfs$ lsbin dev etc home lib mnt proc root sbin sys tmp usr var2、创建设备⽂件mdev 是通过 init 进程来启动的,在使⽤ mdev 构造 /dev ⽬录之前,init ⾄少要⽤到设备⽂件/dev/console、/dev/null,所以需要事先建⽴这两个设备⽂件:lingd@ubuntu:~/arm2410s/rootfs$ cd devlingd@ubuntu:~/arm2410s/rootfs/dev$ sudo mknod -m 660 console c 204 64[sudo] password for lingd:lingd@ubuntu:~/arm2410s/rootfs/dev$ sudo mknod -m 660 null c 1 3lingd@ubuntu:~/arm2410s/rootfs/dev$ ls -ltotal 0crw-rw---- 1 root root 5, 1 2010-04-02 15:49 consolecrw-rw---- 1 root root 1, 3 2010-04-02 15:50 null注意:本来console的主次设备号应为5和1.但是因为init在执⾏完/etc/init.d/rcS脚本后,就会在⼀个控制台上,按照inittab的指⽰开⼀个shell(或者是开getty+login,这样⽤户就会看到提⽰输⼊⽤户名的提⽰符)。

用Busybox制作嵌入式Linux根文件系统

用Busybox制作嵌入式Linux根文件系统

用Busybox制作嵌入式Linux根文件系统Use Busybox to Make Embedded Root Filesystem(曲阜师范大学自动化研究所)邵长彬李洪亮Shao Changbin Li Hongliang 摘要:根文件系统为Linux的运行提供最基本的工具、库、脚本和一些特殊文件的支持。

Busybox是制作嵌入式Linux文件系统的快捷工具,本文通过配置、编译、安装Busybox,以及生成根文件系统映像文件,介绍了用Busybox制作嵌入式Linux根文件系统的一般方法。

关键词:嵌入式Linux,根文件系统,Busybox中图分类号: TP316.2文献标识码:AAbstract: Root filesystem affords Linux most basic tools, lib, scripts and some special files. Busybox is a key tool to make embedded Linux filesystems. This paper, through configure, compile and install Busybox, delivers a normal method to make root filesystem.Key words: embedded Linux, root filesystem, BusyboxCLC number: TP316.2 Document code: A1 根文件系统简介根文件系统是存放Linux系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件的地方,也可以包括各种软件包。

根文件系统一般包括如下内容:1)基本的文件系统结构,包含一些必须的目录,比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp。

2)基本程序运行所需的库函数,如:Glibc/uC-libc。

移植busybox构建最小根文件系统的步骤详解

移植busybox构建最小根文件系统的步骤详解

移植busybox构建最⼩根⽂件系统的步骤详解Busybox:瑞⼠军⼑,⾥⾯装有很多⼩命令。

STEP 1:构建⽬录结构创建根⽂件系统⽬录,主要包括以下⽬录/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys#mkdir /home/rootfs#cd /home/rootfs#mkdir dev etc lib usr var proc tmp home root mnt sysSTEP 2: 使⽤busybox构建/bin /sbin linuxrc进⼊busybox-1.16.1⽬录,执⾏#make defconfig#make menuconfigBusybox Setting ----->Build Options ----->//1选择将busybox进⾏静态编译[*]Build BusyBox as a static binary (no shared libs)//2.指定交叉编译器为(/usr/local/arm/4.3.2/bin/arm-linux-)Cross Compiler prefixInstallation Options -----> (选择⽣成的⽂件存放⽬录,也可以直接放在rootfs下就不⽤拷贝了)//3.选择上 Don't use /usrBusybox Library Tuning--->[*]Username completion[*]Fancy shell prompts[*]Query cursor position from terminal//4.编译出的busybox的shell命令解释器⽀持显⽰当前路径及主机信息保存退出#make #make install在busybox⽬录下会看见 _install⽬录,⾥⾯有/bin /sbin linuxrc三个⽂件将这三个⽬录或⽂件拷到第⼀步所建的rootfs⽂件夹下。

busybox制作ramdisk全过程

busybox制作ramdisk全过程

Busybox Settings > General Configuration > [*] Support for devfs Build Options > [*] Build BusyBox as a static binary (no shared libs) /* 将busybox编译为静态连接,少了启动时找动态库的麻烦*/ [*] Do you want to build BusyBox with a Cross Compiler? (/usr/local/ arm/3.3.2/bin/armlinux) Cross Compiler prefix/* 指定交叉编译工具路径*/Init Utilities > [*] init [*] Support reading an inittab file /* 支持init读取/etc/inittab配置文件,一定要选上*/Shells > Choose your default shell (ash) > /* (X) ash 选中ash,这样生成的时候才会生成bi n/sh文件* 看看我们前头的linuxrc脚本的头一句:* #!/bin/sh 是由bin/sh来解释执行的*/ [*] ashCoreutils > [*] cp [*] cat [*] ls [*] mkdir [*] echo (basic SuSv3 version taking no opt ions) [*] env [*] mv [*] pwd [*] rm [*]touch Editors > [*] viLinux System Utilities > [*] mount [*] umount [*] Support loopback mounts [*] Supp ort for the old /etc/mtab fileNetworking Utilities > [*] inetd /* * 支持inetd超级服务器*/3.3 编译并安装Busybox(如果busybox编译不过去就换个版本的编译工具)。

如何用busybox构建一个最小根文件系统

如何用busybox构建一个最小根文件系统

用busybox构建一个最小根文件系统busybox是所有命令的集合体,是一个工具集,包括了我们常用的工具。

一、一个最小根文件系统包括:(1) /dev/console/dev/null(2) init => busybox(3) /etc/inittab(4) 配置文件指定的应用程序(5) C库二、执行步骤:(一)配置编译busybox(1)下载源码:busybox-1.7.0.tar.bz2a.创建一个文件firstfs,将该文件保存其中b.解压cd firstfstar xjf busybox-1.7.0.tar.bz2执行上述命令后,解压出来busybox-1.7.0文件夹,c.配置在busybox-1.7.0目录下执行“make menuconfig”命令即可进入配置界面。

一般选择默认配置就行,现添加一个TAB补全功能:Busybox Settings------>Busybox Library Turning------>[*]Tab completion用“+/-”选好选项,输入y ,然后按tab选exit(2)编译busyboxa.修改busybox目录下的Makefile执行命令:vi Makefile ,然后输入“/CROSS”找到(“+/-”选择行)CROSS_COMPILE ?=arm-linux-输入“:wq”保存退出b.执行“make”命令编译busybox编译完成,出现如下界面:(3)安装busybox在交叉编译环境,千万不要直接执行make install,这样会破坏我们的操系统。

创建一个新文件夹first_fsmake CONFIG_PREFIX=first_fs install就会在这个文件夹下面生成bin,sbin,usr,linuxrc四个文件目录。

(二) 创建设备文件:/dev/console 和/dev/null(查看ls /dev/console /dev/null –l)mkdir devcd dev/sudo mknod console c 5 1 (创建终端字符设备主为5 次为1)sudo mknod null c 1 3(可以查看:ls –l)(三) 创建配置文件/etc/inittab (最简单基本的配置文件:标准输入、输出和错误信息定义到console)init进程根据/etc/inittab文件来创建其他子进程,etc目录下的内容取决与要运行的程序,本次只需要创建3个文件:etc/inittab, etc/init.d/rcS, etc/fstab。

busybox制作根文件系统

busybox制作根文件系统

用Busybox制作嵌入式Linux的文件系统1 busybox简介BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。

有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。

简单的说BusyBox就好像是个大工具箱(只有一个可执行程序busybox,其他命令都是指向该可执行程序的连接),它集成压缩了 Linux 的许多工具和命令。

BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。

2编译busybox :#make3安装busybox:#make install执行 make install后,会生成一个_install文件夹。

进入_install目录,可以看到一共有3个目录和一个文件,分别是:bin、sbin和usr目录以及linuxrc文件。

这三个目录有很多快捷方式,都是指向了/bin/ busybox。

这就是busybox的特点,即可执行程序只有一个,其他的都是link。

●bin目录包含用户工具,其中,busybox可执行文件就在这个目录下。

●sbin目录包含操作系统工具,同样也指向busybox。

●linuxrc是一个链接文件,指向busybox。

4 其他目录首先,我们创建一个rootfs的目录,把_install目录下的内容复制过来。

此时,rootfs目录中包含3个目录和一个文件,分别是:bin、sbin和usr目录以及linuxrc文件。

但是,仅仅有上述目录还不足以构成一个可用的文件系统,必须还要手工加一些其他的目录及配置文件、启动脚本等。

下面是几个必须有的目录|___ etc / 配置文件|___ dev / 设备节点目录|___ lib / 库|___ modules / 驱动下面是最好有的几个目录|___ proc /|___ sys /|___ var /|___ tmp /|___ root /|___ opt /|___ mnt /4.1 创建etc目录下的文件etc目录里添加配置文件,是最主要的工作。

[实践]busybox1.16.1建立文件系统

[实践]busybox1.16.1建立文件系统

[实践]busybox1.16.1建立文件系统[实践]busybox1.16.1建立文件系统(未完成)#1建立根文件系统目录#!/bin/shecho “——Create rootfs_new directons start…”mkdir rootfs_newcd rootfs_newecho “——Create root,dev…”mkdir bin sbin lib dev etc mnt usrmkdir root home sys proc bootmkdir tmp vartouch linuxrcmkdir etc/init.d etc/rc.d etc/sysconfigmkdir usr/bin usr/sbin usr/lib usr/modulesmkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/log var/run var/tmpchmod 1777 tmpchmod 1777 var/tmpecho “——Create dir done…”#2创建设备文件echo “——Make node in dev…”mknod -m 600 mem c 1 1mknod -m 600 dev/console c 5 1mknod -m 600 dev/null c 1 3mknod -m 644 dev/random c 1 8mknod -m 644 dev/urandom c 1 9mknod -m 660 dev/mtd0 c 90 0mknod -m 660 dev/mtd1 c 90 2mknod -m 660 dev/mtd2 c 90 4mknod -m 660 dev/mtd3 c 90 6mknod -m 660 dev/mtdblock0 b 31 0mknod -m 660 dev/mtdblock1 b 31 1mknod -m 660 dev/mtdblock2 b 31 2mknod -m 660 dev/mtdblock3 b 31 3mknod -m 660 dev/ttySAC0 c 204 64mknod -m 666 dev/tty c 5 0mknod -m 600 dev/tty0 c 4 0mknod -m 600 dev/tty1 c 4 1mknod -m 600 dev/tty2 c 4 2mknod -m 600 dev/tty3 c 4 3mknod -m 600 dev/ttyS0 c 4 64mknod -m 600 dev/ttyS1 c 4 65mknod -m 600 dev/ttyS2 c 4 66mknod -m 600 dev/ttyS3 c 4 67mknod -m 600 dev/ttyUSB0 c 188 0mknod -m 600 dev/ttyUSB1 c 188 1mknod -m 600 dev/ttyUSB2 c 188 2mknod -m 600 dev/ttyUSB3 c 188 3mknod -m 600 dev/ppp c 108 0echo “——Make node done…”echo “——Cp lib…”#3建立动态链接库cp /usr/local/arm/3.4.1/arm-linux/lib/*.so* ./lib -d echo “——Cp lib done”4、交叉编译BosyboxA.修改Makefile交叉器vim MakefileCROSS_COMPILE =arm-linux- //第164 行ARCH =arm //第189行B.修改交叉编译器路径make menuconfigBusybox Settings —>Build Options —>修改[*] Build BusyBox as a static binary (no shared libs)修改Cross Compiler prefix为/usr/local/arm/3.4.1/bin/arm-linux-C.修改安装地址make TARGET_ARCH=arm PREFIX=/source/tmp1/rootfs_new/错误1:miscutils/flash_eraseall.c:14:26: mtd/mtd-user.h: No such file or directoryfind / -name “mtd-user.h”/opt/linuxcore/linux-2.6.33.3/include/mtd/mtd-user.h/usr/include/mtd/mtd-user.h/usr/src/linux-headers-2.6.32-21/include/mtd/mtd-user.h原因:找不到mtd-user.h解决:cp /usr/include/mtd/ ./include/mtd/ -a错误2:miscutils/inotifyd.c:31:25: sys/inotify.h: No such file or directoryfind / -name “inotify.h”/opt/linuxcore/linux-2.6.33.3/include/config/inotify.h/opt/linuxcore/linux-2.6.33.3/include/linux/inotify.h/opt/linuxcore/linux-2.6.33.3/fs/notify/inotify/inotify.h/usr/include/linux/inotify.h/usr/include/sys/inotify.h/usr/src/linux-headers-2.6.32-21/include/linux/inotify.h/usr/src/linux-headers-2.6.32-21-generic/include/config/inotify.h/usr/src/linux-headers-2.6.32-21-generic/include/linux/inotify.h原因:据说是busybox中ionice的bug解决:Miscellaneous Utilities->关闭ionice关闭inotifyd关闭taskset错误3:networking/interface.c:818: error: `ARPHRD_INFINIBAND’ undeclared here (not in a function)修改networking/interface.cvim networking/interface.c添加define ARPHRD_INFINIBAND 32 /* InfiniBand */错误4:util-linux/acpid.c: In function `acpid_main’:util-linux/acpid.c:146: error: `EV_SW’ undeclared (first use in this function)util-linux/acpid.c:146: error: (Each undeclared identifier is reported only onceutil-linux/acpid.c:146: error: for each function it appears in.) util-lin ux/acpid.c:147: error: `SW_LID’ undeclared (first use in this function)原因:可能input.h太陈旧,没有EV_SW的定义解决:cp /opt/linuxcore/linux-2.6.33.3/include/linux/ ./include/ -a5.在Linux内核中把module安装到文件系统目录,[疑问:是否是必须的?]make modules_installINSTALL_MOD_PATH=/source/tmp1/rootfs_new/5、建立etc目录下的配置文件A/etc/inittab #重要#指定初始化文件::sysinit:/etc/init.d/rcS#启动时执行的shell::respawn:/bin/shttyS0::askfirst:-/bin/sh#重启时动作::restart:/sbin/init::ctrlaltdel:/sbin/reboot#关机时动作,卸载所有文件系统::shutdown:/bin/umount -a –rB/etc/init.d/rcS #重要C/etc/fstab #重要proc /proc proc defaults 1 1none /dev/pts devpts gid=5,mode=620 0 0proc /proc proc defaults 0 0none /tmp ramfs defaults 0 0mdev /dev ramfs defaults 0 0sysfs /sys sysfs defaults 0 0D/etc/profile #重要#例子1#!/bin/shecho “profile processing”export LD_LIBRARY_PATH=/lib:/usr/libHOSTNAME=’bin/hostname’export HOSTNAMEPATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATH#例子2# Set search library path# 这条语句设置动态库的搜索路径,极其重要echo “Set search library path int /etc/profile”export LD_LIBRARY_PATH=/lib:/usr/lib# Set user pathecho “Set user path in /etc/profile”PATH=/bin:/sbin:/usr/bin:/usr/sbinexport PATH6、制作根文件系统映像文件参考资料:<<制作嵌入式根文件系统常见问题详解>>使用Busybox制作Cramfs根文件系统.pdf天嵌Linux移植.pdf。

busybox制作根文件系统

busybox制作根文件系统

使用Busybox制作CRAMFS文件系统成功来源: ChinaUnix博客日期:2008.08.20 16:16(共有条评论) 我要评论这几天在使用Busybox制作FS2410开发板的CRAMFS文件系统,由于开始下载的是Busybox1.10,每次下载到开发板中,然后启动总是出现”Failed to execute /linuxrc.Attempting defaults...“的错误。

到网上查了大量的资料,并做了大量的实验,发现都不能成功。

今天下午突然发现一个能够仿真arm的软件qemu,在Ubuntu中的安装方法:sudo apt-get install qemu,Busybox编译后,可以通过arm仿真来测试:qemu-arm ./busybox ls,如果成功,则会显示当前目录下的文件列表。

我对Busybox1.10编译后的结果进行测试,发现出现错误:qemu: unhandled CPU exception 0x8 - abortingR00=001c596c R01=00000000 R02=001c5960 R03=00000001R04=000cbf94 R05=00000000 R06=00000000 R07=00000000R08=000cbfdc R09=000cbf94 R10=00000000 R11=00000000R12=ffff0fff R13=b7d6c470 R14=000d4588 R15=ffff0fa0PSR=20000010 --C- A usr32 ffff0fa0s00=00000000( 0) s01=00000000( 0) d00=0000000000000000( 0)s02=00000000( 0) s03=00000000( 0) d01=0000000000000000( 0)s04=00000000( 0) s05=00000000( 0) d02=0000000000000000( 0)s06=00000000( 0) s07=00000000( 0) d03=0000000000000000( 0)s08=00000000( 0) s09=00000000( 0) d04=0000000000000000( 0)s10=00000000( 0) s11=00000000( 0) d05=0000000000000000( 0)s12=00000000( 0) s13=00000000( 0) d06=0000000000000000( 0)s14=00000000( 0) s15=00000000( 0) d07=0000000000000000( 0)s16=00000000( 0) s17=00000000( 0) d08=0000000000000000( 0)s18=00000000( 0) s19=00000000( 0) d09=0000000000000000( 0)s20=00000000( 0) s21=00000000( 0) d10=0000000000000000( 0)s22=00000000( 0) s23=00000000( 0) d11=0000000000000000( 0)s24=00000000( 0) s25=00000000( 0) d12=0000000000000000( 0)s26=00000000( 0) s27=00000000( 0) d13=0000000000000000( 0)s28=00000000( 0) s29=00000000( 0) d14=0000000000000000( 0)s30=00000000( 0) s31=00000000( 0) d15=0000000000000000( 0)FPSCR: 00000000qemu: uncaught target signal 6 (Aborted) - exiting说明,所编译得到的busybox不能使用在arm处理器,由于时间关系就放弃了使用Buxybox1.10版本。

通过busybox制作根文件系统详细过程

通过busybox制作根文件系统详细过程

通过busybox制作根⽂件系统详细过程我在之前的中也有实现过根⽂件系统的制作,那只是在ubuntu官⽹已经做好的根⽂件基础上安装⼀些⾃⼰所需的软解⽽已。

⽽使⽤busybox 制作根⽂件系统可以⾃定义选项,加深⾃⼰对linux的系统理解,⽅便后期学习根⽂件系统的裁剪。

⼀、下载busybox制作制作⼯具⼆、编译链配置将下载的⽂件放⼊linux开发环境中进⾏解压,⽬录如下图所⽰为了以后使⽤⽅便,修改交叉⼯具链,进⼊“Makefile”⽂件sudo vim Makefile进⼊⽂件后修改“ARCH”和“CROSS_COMPILE”变量,如下图所⽰:注意:交叉编译链⼀定要是⾃⼰安装的全路径三、busybox中⽂⽀持1.修改“printable_string.c”⽂件sudo vim libbb/printable_string.c进⼊⽂件后修改内容如下图所⽰:2.修改“unicode.c”⽂件sudo vim libbb/unicode.c进⼊⽂件后修改内容如下图所⽰:四、配置busybox1.设置配置项defconfig:缺项配置,也就是默认配置选项。

allyesconfig:全选配置,也就是说选中busybox的所有功能。

allnoconfig:最⼩配置。

可以根据⾃⼰需要选择配置命令,这⾥我选⽤的是最下配置命令如下sudo make defconfig配置完成后可通过查看是否有.config⽂件,如果存在则说明配置成功,如下图所⽰:2.进⼊图形配置sudo make menuconfig进⼊图形配置界⾯后,配置库⽂件来源,配置路径如下所⽰-> Settings-> Build static binary使⽤静态库时,编译出来的⽂件很⼤,然后编译出来的DNS会出问题,所以我这⾥选⽤的是动态库,配置如下图所⽰:勾选“vi-style line editing commands”,配置路径如下-> Settings-> vi-style line editing commands取消“Simplified modutils”的勾选,配置路径如下-> Linux Module Utilities-> Simplified modutils勾选“mdev”,配置路径如下-> Linux System Utilities-> mdev如下图所⽰:勾选“Support Unicode”及其⼦选项“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”-> Settings-> Support Unicode-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables到此busybox的配置基本完成,如果需要其他配置项的内容可根据⾃⼰的需求选择。

BUSYBOX

BUSYBOX
ARM Linux 根文件系统(Root Filesystem)的制作
关于根文件系统的制作,网络上有很多文章,大多数 都只讲到建几个目 录,然后用 Busybox 做个 Shell,有很多关键的东西没有说。经过很长 时间的摸爬滚打,我终于能够白手起家建立一个根文件系统了。 其实我 也不懂得原理,只是告诉大家我的作法,其中也不免有错误,欢迎大家 指正。 首先介绍根文件系统的组成:目录、Shell、库、脚本,一个个 来。 目录 根文件系统要包含这些必须有的目录:/dev、/bin、/usr、/sbin、/lib、 /etc、/proc、/sys /dev 是 devfs(设备文件系统)或者 udev 的挂在点所在。在使用 devfs 的内核里如果没有/dev,根本见不到 Shell 启动的信息,因为内核找不 到 /dev/console;在使用 udev 的系统里,也事先需要在/dev 下建立 console 和 null 这两个节点。关于 devfs 和 udev 的区别, 网上很多文 章说。当然如果你的内核已经不支持 devfs 了(2.6.12 以后),可以使 用纯纯的静态节点。也就是用 mknod 人工生成。 /bin、 /usr/bin、/usr/sbin、/sbin 是编译 Busybox 这个 Shell 时候 就有的,用于存放二进制可执行文件,就不多解释了。 /lib 用于存放动态链接库。网上很多文章都说静态编译 Busybox,可以 省去建库的麻烦过程。这样做只能让 Busybox 启动,我们自己写的,或 者是编译的软 件包还是需要动态库的。 除非全部静态编译, 你可以试试, 一个 Hello world 就要几百 k。关于库的内容后面仔细说。 /etc 是用来存放初始 化脚本和其他配置文件的。关于初始化脚本的内 容后面仔细说。 /proc 是用来挂载存放系统信息虚拟文件系统——“proc 文件系统”, “proc 文件系统”在内核里面可以选。如果没有“proc 文件系统”, 很多 Shell 自己的命令就没有办法运行,比如 ifconfig。“proc 文件系 统”不像 devfs 可以自动挂载, 它需要使用初始化脚本挂载。 另外, udev 也需要“proc 文件系统”的支持。 /sys 用于挂载“sysfs 文件系 统”,“sysfs 文件系统”在内核里面可 以选。 目前我认为它就是给 udev 提供支持的, 呵呵。 “sysfs 文件系统” 也需要使用初始化脚本挂载。 另 外还可以有/tmp、/mnt、/swp、/var 这样的不是嵌入式系统必须的 目录,在说完 Shell 的制作之后,我再谈建立目录的事情。 Shell Shell 很简单,就是 Busybox,上网下载一个来: /downloads/。说 Busybox 和 arm- linux-gcc 有兼容性问题, 不过我觉得那是比较低版本的时代问题了, 我用 Busybox 1.8.2 和 arm-linux-gcc 3.4.1/3.3.2 都可以。 解压缩以后找到 Makefile 里面的 ARCH 和 CROSS_COMPILE,改成: ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-

实验7 busybox 的移植与根文件系统的构建

实验7 busybox 的移植与根文件系统的构建

实验 7 busybox 的移植与根文件系统构建实验【实验目的】了解嵌入式操作系统中文件系统的类型和作用。

了解JFFS2 文件系统的优点及其在嵌入式系统中的作用。

掌握利用BusyBox 软件制作嵌入式文件系统的方法。

掌握嵌入式Linux 文件系统的的挂载过程。

【实验步骤】交叉编译工具的安装第一步:利用which命令查看交叉编译工具的位置。

【图6-1-1】第二步:如果没有安装,则将光盘中的Toolchain目录下的xscalev1_010001.tar.gz 文件复制到/usr/local目录下(具体目录可以自行指定)。

【图6-1-2】第三步:利用tar命令对xscalev1_010001.tar.gz进行解压。

【图6-1-3】第四步:利用export命令将交叉编译工具的路径加入到系统PATH环境变量中。

然后利用which命令查看交叉编译工具是否已在系统搜索路径中。

【图6-1-4】busybox 的交叉编译第五步:从网上下载BusyBox 软件包,这里下载的是busybox-1.00-pre05.tar.bz2。

首先把它放在/root/Xsbase270_Linux/Filesystem 目录下并进行解压缩。

【图6-1-5】在busybox 的顶层目录下的Makefile 中包含一些选项来控制BusyBox 的创建。

其中大部分选项是在开发busybox 时为了调试而使用的。

下图是BusyBox 的配置界面。

【图6-1-6】第六步:在Build Option 菜单下,可以选择静态库编译方式,设置如下:[*] Build BusyBox as a static binary (no shared libs)由于为ARM 系统制作文件系统,所以在交叉编译选项中需要使用带glibc 库的支持的交叉编译器arm-linux-gcc,具体配置如图5-2 所示:(假设ARM 交叉编译工具所在的目录为:/opt/xscalev1/bin)【图6-1-7】busybox 默认的安装路径为_install,用户可以根据需要在Installation Options 配置中输入自定义路径。

基于busybox制作mini2440根文件系统及使用nfs挂载

基于busybox制作mini2440根文件系统及使用nfs挂载

常见的文件系统有yaffs2, jffs2,他们是适用于根文件系统镜像存在于NAND Flash上的情况。

而传统的Linux EXT2/EXT3文件系统格式适用于传统的block设备,比如SD卡或者硬盘。

cramfs同时适用于以上两种情况。

其不管采用哪种格式,内核都必须支持它,这是根文件系统正确挂载的前提条件。

其内核支持它是指:在对内核进行编译的时候必须加入对相应文件系统的支持。

由于在内核没有加入对yaffs2的支持,因此在最后根据mkyaffs2image制作yaffs2类型的根文件系统,在加载之前,必须要对linux内核进行打yaffs2的补丁。

将yaffs文件系统编译进内核。

之后在启动linux内核时候才能识别yaffs2文件系统。

我在自己的mini2440开发板上面通过nfs来加载制作好的"根文件系统",这里的"根文件系统"指的是:没有经过像mkyaffs2image工具转化的原始的类linux目录结构的文件。

其文件包括Linux启动时所必须的目录和关键性的文件。

nfs便于加载及验证我们制作的文件系统的正确性。

其加载时文件系统不用读写flash。

*******************************第一步:下载busybox并编译********************************下载busybox-1.19.2.tar.bz2/downloads/解压并进入目录# tar jxvf busybox-1.19.2.tar.bz2# cd busybox-1.19.2修改Makefile# gedit Makefile &把164 行修改为:CROSS_COMPILE = arm-linux-把190 行修改为:ARCH = arm配置# make menuconfig 或者make xconfig(为图形化界面)在Busybox Settings->Build Options之下选择Build BusyBox as a static binary (no shared libs) (STATIC)以静态的方式来编译busybox。

使用Busybox制作根文件系统

使用Busybox制作根文件系统

使用Busybox制作根文件系统1、BusyBox简介BusyBox 是很多标准 Linux 工具的一个单个可执行实现。

BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet;有些人将 BusyBox 称为 Linux 工具里的“瑞士军刀”。

BusyBox 揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素。

例如,很多基于文件的工具(比如 grep 和 find)都需要在目录中搜索文件的代码。

当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。

实际上,BusyBox 可以将大约 3.5MB 的工具包装成大约 200KB 大小。

这就为可引导的磁盘和使用 Linux 的嵌入式设备提供了更多功能。

我们可以对 2.4 和 2.6 版本的 Linux 内核使用 BusyBox。

我们平时用的那些Linux命令就好比是分立式的电子元件,而BusyBox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,BusyBox有非常广的应用。

2、BusyBox的用法可以这样用BusyBox#busybox ls他的功能就相当运行ls命令最常用的用法是建立指向BusyBox的链接,不同的链接名完成不同的功能.#ln -s busybox ls#ln -s busybox rm#ln -s busybox mkdir然后分别运行这三个链接:#./ls#./rm#./mkdir就可以分别完成了ls、rm和mkdir命令的功能.虽然他们都指向同一个可执行程序BusyBox,但是只要链接名不同,完成的功能就不同, BusyBox就是这么的神奇。

3、配置编译BusyBox下载首先需要下载BusyBox源代码。

用busybox做一个简单的文件系统

用busybox做一个简单的文件系统

用busybox做一个简单的文件系统利用BusyBox做一个简单的根文件系统1、下载BusyBox源代码包 /2、找个地方解压缩包,例如tar -xjvf busybox-1.00.tar.bz23、进入busybox的文件夹,使用make menuconfig进入设置[attach]244[/attach]4、在build options中有一些选项要注意Build BusyBox as a static binary (no shared libs):如果选择了这个选项,那么BusyBox 将被静态编译,也就是不需要动态链接库的支持就能运行,但是这样会使编译后文件的体积增大。

Do you want to build BusyBox with a Cross Compiler:如果你的busybox将要运行机器与编译主机的体系结构不同,比如s3c2410是ARM,与我们的X86主机芯片系统结构不一样,那么这个一定要选上,并且在 Cross Compiler prefix中写上交叉编译器的名字,比如ARM 用arm-linux-[attach]245[/attach]5、在Installation Options中 BusyBox installation prefix就是在编译完后运行make install 时,busybox将被安装的地址。

[attach]246[/attach]6、其它的选项按照默认选项就行,当然自己也可以看看有没有需要,把其它一些命令加入到编译选项中来7、完成后保存,然后运行make8、编译没有问题后运行make install这样编译好的busybox就会自动安装到BusyBox installation prefix中,一般是三个文件夹bin sbin usr和一个文件linuxrc。

这样busybox 的编译就完成了9、准备一个空文件夹将BusyBox installation prefix中的东西拷过来,另外再建几个linux 需要的文件夹libdevetchomeprocroottmpvarmnt10、在etc文件夹下建一个目录init.d,并且在其中建立一个空文件rcS,在rcS中加上以下内容#! /bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel## Trap CTRL-C &c only in this shell so we can interrupt subprocesses.#trap ":" INT QUIT TSTP/bin/mount -t proc none /proc11、如果你的busybox是静态编译的,那么一个简单的能使用的根文件系统就这样完成了,但是这个文件系统中没有glibc的动态链接库,除了busybox以外的软件,如果对glibc 有依赖,但是又没有静态编译的的话就无法运行。

根文件系统的制作

根文件系统的制作

根文件系统的制作文件系统的制作其实并没有想像中那么难。

一个基本的文件系统应该包括:busybox (提供 shell 命令集)、配置文件(用来初始化和布局你的文件系统)、设备文件(如果是用 devfs 的话这个就免了)、必要的库文件系统(如果 busybox 是静态编译的话,那根本不用为 busybox 用到的库文件而烦。

在我制作的文件系统里,只是为了用户程序和 qt 的运行才放置了一些库文件)。

正文一、首先说一下 busybox 的配置和编译问题其实搞好 busybox 后,可以说你的文件系统已经完成了一半了。

Busybox 之所以比较难编译,主要是 busybox 和交叉编译工具的版本搭配问题。

在文坛上不乏因为 busybox 某些命令不能编译通过而烦的人,在这里我推荐一个搭配:busybox-1.1.3+arm-linux-gcc-3.3.2 (在文坛上看到过有人说busybox-1.0.1+arm-linux-gcc-3.4.1 也可以正常编译通过,你自己看着办吧)。

Busybox 的配置很简单,详细过程可以参考《基于 S3C2410 的 Linux 全线移植文档》的文件系统部分,我刚开始的时候就是按照这个来做出一个很简单的文件系统的。

不过有一点要特别注意的 (shell 的配置问题 ) :1、要这样配置:│ │ Shells --->│ Choose your default shell (ash) --->2、如果是这样配置的话,虽然可以生成ash,但不能生成sh:│ │ Choose your default shell(none) ---> │ ││ │ [*] ash另外,按照他的这种方法做出来的文件系统,运行的时候 shell 并不好有,没有历史记录、自动补全、删除字符的功能,下面介绍如何为它添加这些功能:Shells --->--- Bourne Shell Options │ │[ ] Hide message on interactive shell startup │ │[ ] Standaloneshell │ │[*] command lineediting │ │[*] vi-style line editingcommands │ │(15) historysize │ │[*] historysaving │ │[*] tabcompletion │ │[*] usernamecompletion │ │[ ] Fancy shell prompts这是我自己试验出来的,网上没有看到过这方面的介绍,在此奉献给大家。

busybox详解制作根文件系统

busybox详解制作根文件系统

详解制作根文件系统单击,返回主页,查看更多内容一、FHS(Filesystem Hierarchy Standard)标准介绍当我们在linux下输入ls / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统布局上都遵循FHS标准的建议规定。

该标准规定了根目录下各个子目录的名称及其存放的内容:制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。

其过程大体包括:•编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录•利用交叉编译工具链,构建/lib目录•手工构建/etc目录•手工构建最简化的/dev目录•创建其它空目录•配置系统自动生成/proc目录•利用udev构建完整的/dev目录•制作根文件系统的jffs2映像文件下面就来详细介绍这个过程。

二、编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录这些目录下存储的主要是常用命令的二进制文件。

如果要自己编写这几百个常用命令的源程序,my god,这简直是一个噩梦!好在我们有嵌入式Linux系统的瑞士军刀——busybox,事情就简单很多。

1、从/下载busybox-1.7.0.tar.bz22、tar xjvf busybox-1.7.0.tar.bz2解包3、修改Makefile文件175 ARCH ?= arm176 CROSS_COMPILE ?= arm-linux-4、make menuconfig配置busyboxbusybox配置主要分两部分。

第一部分是Busybox Settings,主要编译和安装busybox的一些选项。

这里主要需要配置:1)、Build Options -- Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。

《构建根文件系统(二)分析busybox源码》

《构建根文件系统(二)分析busybox源码》

《构建根⽂件系统(⼆)分析busybox源码》1.busybox 平时我们在开发板中输⼊ls、cp、mv等命令,都是在/bin⽂件中。

⽽通过ls -l就可以发现 这些命令都是放在busybox中的。

并且在内核启动后,通过ps命令,可以看到有⼀个init进程正在运⾏。

因此就先来分析⼀下,这个第⼀个运⾏的进程init。

2.init进程分析init_main函数:int init_main(int argc, char **argv){... ...console_init(); //初始化控制台,在init_post()中只是打开了控制台设备... ...if (argc > 1//在init_post()中执⾏的”_init_process("/sbin/init");”,所以argc=1, argv=/sbin/init&& (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || LONE_CHAR(argv[1], '1'))){... ...} //此处省略,因为不执⾏else {parse_inittab(); //argc==1,执⾏else,读取解析init 表(解析配置⽂件)}.... ... //运⾏应⽤程序} 因为argc=1,所以直接跳转到parse_inittab。

parse_inittab函数:#if ENABLE_FEATURE_USE_INITTABchar *token[4];parser_t *parser = config_open2("/etc/inittab", fopen_for_read);if (parser == NULL)#endif ⾸先如果定义了ENABLE_FEATURE_USE_INITTAB的话,就会去读取/etc/inittab的内容。

制作根文件系统之Busyboxinit进程的启动过程分析

制作根文件系统之Busyboxinit进程的启动过程分析

制作根⽂件系统之Busyboxinit进程的启动过程分析先来介绍⼀下什么是Busybox:它是将众多的UNIX命令集合进⼀个很⼩的可执⾏程序中。

在中遗留了⼀个问题是/linuxrc是内核启动的第⼀个应⽤程序,那么它是什么?我们看到移植好的根⽂件系统环境,输⼊ls -al /linuxrc。

可以看到:lrwxrwxrwx 11000100011 Jul 262018 linuxrc -> bin/busybox/linuxrc其实是指向Busybox的,它其实是Busybox下的⼀个程序,所以我们需要分析Busybox的源码来研究/linuxrc这个程序做的事情,当在移植好的根⽂件系统环境下输⼊/linuxrc可以看到:# busybox linuxrcinit started: BusyBox v1.7.0 (2018-07-2612:50:40 CST)starting pid 796, tty '': '/etc/init.d/rcS'Please press Enter to activate this console.这就是执⾏linuxrc程序之后出现的界⾯,现在还不确定/linuxrc是Busybox下哪个⽂件,我们搜索“init started”,在busybox-1.7.0\init\Init.c中找到了它935 message(MAYBE_CONSOLE | L_LOG, "init started: %s", bb_banner);我们看到调⽤它的是init_main函数,接下去就是分析这个函数,init_main函数的功能⼤概可以概括为1、设置处理信号函数2、读取配置⽂件、解析配置⽂件3、根据配置⽂件执⾏⽤户的程序或脚本下⾯分别介绍1、设置处理信号函数,restart, ctrlaltdel, and shutdown是⼀些按键事件,这些处理函数在接收到按下相关按键的信号后,进⾏处理905 signal(SIGHUP, exec_signal);906 signal(SIGQUIT, exec_signal);907 signal(SIGUSR1, shutdown_signal);908 signal(SIGUSR2, shutdown_signal);909 signal(SIGINT, ctrlaltdel_signal);910 signal(SIGTERM, shutdown_signal);911 signal(SIGCONT, cont_handler);912 signal(SIGSTOP, stop_handler);913 signal(SIGTSTP, stop_handler);2、读取和解析配置⽂件,先看⼀下配置⽂件的格式,⽂档位于example/inittab中# inittab的格式为:# <id>:<runlevels>:<action>:<process># id => /dev/id,⽤作终端:stdin、stdout、stderr:printf、scanf、err# runlevels:忽略# action :执⾏时机Valid actions include: sysinit, respawn, askfirst, wait, once,restart, ctrlaltdel, and shutdown.# process :应⽤程序或脚本接着回到init_main函数,看到967 parse_inittab();//解析inittab参数找到parse_inittab函数,位于busybox-1.7.0\init\Init.c中755static void parse_inittab(void)756 {......764 file = fopen(INITTAB, "r");//以只读⽅式打开/etc/inittab...788while (fgets(buf, INIT_BUFFS_SIZE, file) != NULL) {...836for (a = actions; a->name != 0; a++) {837if (strcmp(a->name, action) == 0) {838if (*id != '\0') {839if (strncmp(id, "/dev/", 5) == 0)//去掉开头的/dev/840 id += 5;841 strcpy(tmpConsole, "/dev/");842 safe_strncpy(tmpConsole + 5, id,843sizeof(tmpConsole) - 5);844 id = tmpConsole;845 }846 new_init_action(a->action, command, id);//创建⼀个init_action结构,以解析出来的参数填充它,然后将这个结构放⼊init_action_list链表847break;848 }849 }...}857 }这个函数的功能解释为打开/etc/inittab⽂件然后处理它,这个⽂件是以配置⽂件的格式存放的。

busybox制作支持共享库的根文件系统

busybox制作支持共享库的根文件系统

busybox制作支持共享库的根文件系统选定busybox-1.9.2.tar.bz2 这个版本, 以静态方式编译, 即生成的busybox 不需要共享库的支持就能运行。

这样做我们就不需要布署程序库了。

缺点是自己写的arm-linux 程序在这个根文件系统中是不能运行的,因为缺少共享程序库的支持。

不过不用担心,通过在目标机里以挂接NFS 的方式, 将宿主机的arm-linux-gcc 编译器的库文件挂到arm-linux 的/lib 下, 就可完美的运行我们自己的程序了。

现在开始制作静态链接库的根文件系统。

1、准备根文件系统首先准备制作工具BusyBox1.9.2。

准备交叉编译工具arm-linux-gcc 3.3.2。

在机器上建立rootfs的文件夹#mkdir rootfs在rootfs中建立linux系统中典型的文件夹#cd rootfs#mkdir root home bin sbin etc dev usr lib tmp mnt sys proc#mkdir usr/lib usr/bin#pwd/home/su/rootfs2、解压源码包#tar xjf busybox-1.9.2.tar.bz2#cd busybox-1.9.23、修改Makefile,#vi Makefile将Makefile中的CROSS_COMPILE ?=改为CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-注:这个版本的busybox 用3.4.1 的arm-linux-gcc 编译有些问题, 用3.3.2 版则可顺利编译。

4、定制busybox选择busybox下全部的可执行程序#make defconfig进到配置选项#make menuconfig设置静态编译方式Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)Busybox Settings ---> Install Options ---> 中输入建立根文件系统的文件所在的路径/home/su/rootfs。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

详解制作根文件系统单击,返回主页,查看更多内容一、FHS(Filesystem Hierarchy Standard)标准介绍当我们在linux下输入ls / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统布局上都遵循FHS标准的建议规定。

该标准规定了根目录下各个子目录的名称及其存放的内容:制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。

其过程大体包括:•编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录•利用交叉编译工具链,构建/lib目录•手工构建/etc目录•手工构建最简化的/dev目录•创建其它空目录•配置系统自动生成/proc目录•利用udev构建完整的/dev目录•制作根文件系统的jffs2映像文件下面就来详细介绍这个过程。

二、编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录这些目录下存储的主要是常用命令的二进制文件。

如果要自己编写这几百个常用命令的源程序,my god,这简直是一个噩梦!好在我们有嵌入式Linux系统的瑞士军刀——busybox,事情就简单很多。

1、从/下载busybox-1.7.0.tar.bz22、tar xjvf busybox-1.7.0.tar.bz2解包3、修改Makefile文件175 ARCH ?= arm176 CROSS_COMPILE ?= arm-linux-4、make menuconfig配置busyboxbusybox配置主要分两部分。

第一部分是Busybox Settings,主要编译和安装busybox的一些选项。

这里主要需要配置:1)、Build Options -- Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。

我们选择动态链接C库。

2)、Installation Options -- Applets links (as soft-links) -- (X) as soft-links,表示安装busybox 时,将各个命令安装为指向busybox的软链接还是硬链接。

我们选择软链接。

3)、Installation Options -- (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安装位置。

我们选择/work/nfs_root/fs_mini34)Busybox Library Tuning。

保留Command line editing以支持命令行编辑;保留History size以支持记忆历史命令;选中Tab completion和Username completion以支持命令自动补全第二部分是Applets,他将busybox的支持的几百个命令分门别类。

我们只要在各个门类下选择想要的命令即可。

这里我们基本保持默认设置。

1)选中Networking Utilities -- httpd下的Enable -u <user> option,以启用http服务器的功能allows the server to run as a specific user5、编译busyboxmake6、安装busyboxmake install安装完成后,可以看到在/work/nfs_root/fs_mini3目录下生成了binsbinusr/binusr/sbin目录,其下包含了我们常用的命令,这些命令都是指向bin/busybox的软链接,而busybox本身的大小不到800K:dennis@dennis-desktop:/work/nfs_root/fs_mini3$ lsbin linuxrc sbin usrdennis@dennis-desktop:/work/nfs_root/fs_mini3$ ls -l bintotal 740lrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 addgroup -> busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 adduser -> busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 ash -> busybox-rwxr-xr-x 1 dennis dennis 749632 2010-04-03 23:57 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 cat –> busybox而普通PC机上的ls命令就有差不多80K的大小:dennis@dennis-desktop:/work/nfs_root/fs_mini3$ ls -l /bin/ls-rwxr-xr-x 1 root root 78004 2007-09-29 20:51 /bin/lsbusybox以它娇小的身躯容纳了数以百计的命令代码,实在是让人佩服不已,其不愧嵌入式系统瑞士军刀之美誉。

据说,busybox的作者身患绝症,这更让人钦佩GNU开源软件的作者们。

三、利用交叉编译工具链,构建/lib目录光有应用程序(命令)是不够的,因为应用程序本身需要使用C库的库函数,因此还必需制作for ARM的C库,并将其放置于/lib目录。

my god,要自己写C库的源代码吗?不用!还记得交叉编译工具链的3个组成部分吗?交叉编译器、for ARM的C库和二进制工具。

哈哈,for ARM的C库是现成的,我们只需要拷贝过来就可以了。

遗憾的是:整个C库目录下的文件总大小有26M。

而我们根文件系统所在分区不过区区16M而已,根本放不下。

怎么办呢?dennis@dennis-desktop:/work/nfs_root/fs_mini3$ du -s --si/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib26M /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib需要C库目录下所有的文件吗?no,absolutely no! 让我们来分析一下glibc库目录下内容的组成。

该目录下的子目录和文件共分8类:•目标文件,如crtn.o,用于gcc链接可执行文件•libtool库文件(.la),在链接库文件时这些文件会被用到,比如他们列出了当前库文件所依赖的其它库文件,程序运行时无需这些文件•gconv目录,里面是各种链接脚本,在编译应用程序时,他们用于指定程序的运行地址,各段的位置等•静态库文件(.a),例如libm.a,libc.a•动态库文件(.so、.so.[0-9]*)•动态链接库加载器ld-2.3.6.so、ld-linux.so.2•其它目录及文件很显然,第1、2、3、4、7类文件和目录是不需要拷贝的。

由于动态链接的应用程序本身并不含有它所调用的C库函数的代码,因此执行时需要动态链接库加载器来为它加载相应的C库文件,所以第6类文件是需要拷贝的。

除此之外,第5类文件当然要拷贝。

但第5类文件的大小也相当大。

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ du -c --si *.so* 7.2M total需要全部拷贝吗?非也,非也!其实,需要哪些库完全取决于要运行的应用程序使用了哪些库函数。

如果我们只制作最简单的系统,那么我们只需要运行busybox这一个应用程序即可。

通过执行dennis@dennis-desktop:/work/nfs_root/fs_mini3$ arm-linux-readelf -a bin/busybox | grep 'Shared'0x00000001 (NEEDED) Shared library: [libcrypt.so.1]0x00000001 (NEEDED) Shared library: [libm.so.6]0x00000001 (NEEDED) Shared library: [libc.so.6]可知:busybox只用到了3个库:通用C库(libc)、数学库(libm)、加密库(libcrypt),因此我们只需要拷贝这3个库的库文件即可。

但是每个库都有4个文件,4个文件都要拷贝吗?当然不是。

dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt[.-]* -rwxr-xr-x 1 dennis dennis 30700 2008-01-22 05:32 libcrypt-2.3.6.so-rw-r--r-- 1 dennis dennis 23118 2008-01-22 05:32 libcrypt.alrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libcrypt.so -> libcrypt.so.1 lrwxrwxrwx 1 dennis dennis 17 2008-12-22 15:38 libcrypt.so.1 -> libcrypt-2.3.6.so dennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libm[.-]*-rwxr-xr-x 1 dennis dennis 779096 2008-01-22 05:31 libm-2.3.6.so-rw-r--r-- 1 dennis dennis 1134282 2008-01-22 05:32 libm.alrwxrwxrwx 1 dennis dennis 9 2008-12-22 15:38 libm.so -> libm.so.6lrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libm.so.6 -> libm-2.3.6.sodennis@dennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libc[.-]*-rwxr-xr-x 1 dennis dennis 1435660 2008-01-22 05:48 libc-2.3.6.so-rw-r--r-- 1 dennis dennis 2768280 2008-01-22 05:31 libc.a-rw-r--r-- 1 dennis dennis 195 2008-01-22 05:34 libc.solrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libc.so.6 -> libc-2.3.6.so4个文件中的.a文件是静态库文件,是不需要拷贝的。

相关文档
最新文档