busybo详解制作根文件系统

上传人:时****我 文档编号:229903708 上传时间:2023-08-22 格式:DOCX 页数:13 大小:195.22KB
收藏 版权申诉 举报 下载
busybo详解制作根文件系统_第1页
第1页 / 共13页
busybo详解制作根文件系统_第2页
第2页 / 共13页
busybo详解制作根文件系统_第3页
第3页 / 共13页
资源描述:

《busybo详解制作根文件系统》由会员分享,可在线阅读,更多相关《busybo详解制作根文件系统(13页珍藏版)》请在装配图网上搜索。

1、详解制作根文件系统单击,返回主页,查看更多内容一、FHSFilesystem Hierarchy Standard标准介绍当我们在 linux 下输入 ls / 的时候,见到的名目构造以及这些名目下的内容都大同小异,这是由于全部的 linux 发行版在对根文件系统布局上都遵循 FHS 标准的建议规定。该标准规定了根名目下各个子名目的名称及其存放的内容:名目名/bin/sbin/dev/etc/lib/home/root/usr/bin/usr/sbin/usr/lib/var/proc/sys/mnt/tmp存放的内容必备的用户命令,例如 ls、cp 等必备的系统治理员命令,例如 ifconf

2、ig、reboot 等设备文件,例如 mtdblock0、tty1 等系统配置文件,包括启动文件,例如 inittab 等必要的链接库,例如 C 链接库、内核模块一般用户主名目root 用户主名目非必备的用户程序,例如 find、du 等非必备的治理员程序,例如 chroot、inetd 等库文件守护程序和工具程序所存放的可变,例如日志文件用来供给内核与进程信息的虚拟文件系统,由内核自动生成名目下的内容用来供给内核与设备信息的虚拟文件系统,由内核自动生成名目下的内容文件系统挂接点,用于临时安装文件系统临时性的文件,重启后将自动去除制作根文件系统就是要建立以上的名目,并在其中建立完整名目内容。其

3、过程大体包括: 编译安装 busybox,生成/bin、/sbin、/usr/bin、/usr/sbin 名目 利用穿插编译工具链,构建/lib 名目 手工构建/etc 名目 手工构建最简化的/dev 名目 创立其它空名目 配置系统自动生成/proc 名目 利用 udev 构建完整的/dev 名目 制作根文件系统的 jffs2 映像文件下面就来具体介绍这个过程。二、编译安装 busybox,生成/bin、/sbin、/usr/bin、/usr/sbin 名目这些名目下存储的主要是常用命令的二进制文件。假设要自己编写这几百个常用命令的源程序,my god, 这简直是一个噩梦!好在我们有嵌入式 L

4、inux 系统的瑞士军刀busybox,事情就简洁很多。1、从 :/ 下载 busybox-1.7.0.tar.bz2 2、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

5、 binary (no shared libs),表示编译 busybox 时, 是否静态链接 C 库。我们选择动态链接 C 库。2) 、Installation Options - Applets links (as soft-links) - (X) as soft-link,s 表示安装 busybox时,将各个命令安装为指向 busybox 的软链接还是硬链接。我们选择软链接。3) 、Installation Options - (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox 的安装位置。我们选择/work

6、/nfs_root/fs_mini34) Busybox Library Tuning。保存 Command line editing 以支持命令行编辑;保存 History size 以支持记忆历史命令;选中 Tab completion 和 Username completion 以支持命令自动补全其次局部是 Applets,他将 busybox 的支持的几百个命令分门别类。我们只要在各个门类下选择想要的命令即可。这里我们根本保持默认设置。1选中 Networking Utilities - d 下的 Enable -u option,以启用 效劳器的功能allows the server

7、 to run as a specific user5、编译 busybox make6、安装 busybox make install安装完成后,可以看到在/work/nfs_root/fs_mini3 名目下生成了 binsbinusr/binusr/sbin 名目,其下包含了我们常用的命令,这些命令都是指向 bin/busybox 的软链接,而 busybox 本身的大小不到 800K:dennisdennis-desktop:/work/nfs_root/fs_mini3$ ls bin linuxrc sbin usrdennisdennis-desktop:/work/nfs_ro

8、ot/fs_mini3$ ls -l bin total 740lrwxrwxrwx 1 dennis dennis7 2023-04-03 23:57 addgroup - busyboxlrwxrwxrwx 1 dennis dennis7 2023-04-03 23:57 adduser - busyboxlrwxrwxrwx 1 dennis dennis7 2023-04-03 23:57 ash - busybox-rwxr-xr-x 1 dennis dennis 749632 2023-04-03 23:57 busyboxlrwxrwxrwx 1 dennis dennis7

9、 2023-04-03 23:57 cat busybox而一般 PC 机上的 ls 命令就有差不多 80K 的大小:dennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l /bin/ls-rwxr-xr-x 1 root root 78004 2023-09-29 20:51 /bin/lsbusybox 以它娇小的身躯容纳了数以百计的命令代码,实在是让人佩服不已,其不愧嵌入式系统瑞士军刀之美誉。据说,busybox 的作者身患绝症,这更让人鄙视 GNU 开源软件的作者们。三、利用穿插编译工具链,构建/lib 名目光有应用程序命令是不够的,由于

10、应用程序本身需要使用C 库的库函数,因此还必需制作for ARM 的C 库,并将其放置于/lib 名目。my god,要自己写 C 库的源代码吗?不用!还记得穿插编译工具链的 3个组成局部吗?穿插编译器、for ARM 的 C 库和二进制工具。哈哈,for ARM 的 C 库是现成的,我们只需要拷贝过来就可以了。圆满的是:整个 C 库名目下的文件总大小有 26M。而我们根文件系统所在分区不过区区 16M 而已,根本放不下。怎么办呢?dennisdennis-desktop:/work/nfs_root/fs_mini3$ du -s -si/work/tools/gcc-3.4.5-glibc

11、-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,例

12、如 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 类文件的大小也相当大。dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ du -c -si *

13、.so* 7.2Mtotal需要全部拷贝吗?非也,非也!其实,需要哪些库完全取决于要运行的应用程序使用了哪些库函数。假设我们只制作最简洁的系统,那么我们只需要运行 busybox 这一个应用程序即可。通过执行dennisdennis-desktop:/work/nfs_root/fs_mini3$ arm-linux-readelf -a bin/busybox | grep ”Shared”0x00000001 (NEEDED)Shared library: libcrypt.so.10x00000001 (NEEDED)Shared library: libm.so.60x00000001

14、 (NEEDED)Shared library: libc.so.6可知:busybox 只用到了 3 个库:通用C 库libc、数学库libm、加密库libcrypt,因此我们只需要拷贝这 3 个库的库文件即可。但是每个库都有 4 个文件,4 个文件都要拷贝吗?固然不是。dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt.-*-rwxr-xr-x 1 dennis dennis 30700 2023-01-22 05:32 libcrypt-2.3.6.so-rw-r-r-

15、1 dennis dennis 23118 2023-01-22 05:32 libcrypt.alrwxrwxrwx 1 dennis dennis13 2023-12-22 15:38 libcrypt.so - libcrypt.so.1lrwxrwxrwx 1 dennis dennis17 2023-12-22 15:38 libcrypt.so.1 - libcrypt-2.3.6.so dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libm.-*-rwxr-xr-x 1 de

16、nnis dennis 779096 2023-01-22 05:31 libm-2.3.6.so-rw-r-r- 1 dennis dennis 1134282 2023-01-22 05:32 libm.alrwxrwxrwx 1 dennis dennis9 2023-12-22 15:38 libm.so - libm.so.6lrwxrwxrwx 1 dennis dennis13 2023-12-22 15:38 libm.so.6 - libm-2.3.6.so dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-

17、linux/lib$ ls -l libc.-*-rwxr-xr-x 1 dennis dennis 1435660 2023-01-22 05:48 libc-2.3.6.so-rw-r-r- 1 dennis dennis 2768280 2023-01-22 05:31 libc.a-rw-r-r- 1 dennis dennis195 2023-01-22 05:34 libc.solrwxrwxrwx 1 dennis dennis13 2023-12-22 15:38 libc.so.6 - libc-2.3.6.so4 个文件中的.a 文件是静态库文件,是不需要拷贝的。另外 3

18、个文件是: 实际的共享链接库:libLIBRARY_NAME-GLIBC_VERSION.so。固然需要拷贝。 主本的符号链接,指向实际的共享链接库:libLIBRARY_NAME.so.MAJOR_REVISION_VERSION,程序一旦链接了特定的链接库,将会参用该符号链接。程序启动时,加载器在加载程序前,会检索该文件。所以需要拷贝。 与版本无关的符号链接,指向主本的符号连接libc.so 是唯一的例外,他是一个链接命令行:libLIBRARY_NAME.so,是为编译程序时供给一个通用条目。这些文件在程序被编译时会被用到,但在程序运行时不会被用到,所以不必拷贝它。关于共享库的 2 个符

19、号链接的作用的特别说明:当我们使用 gcchello.c-ohello-lm 编译程序时,gcc 会依据-lm 的指示,加头lib添尾.so得到 libm.so,从而沿着与版本无关的符号链接libm.so - libm.so.6找到 libm.so.6 并记录在案hello 的 ELF 头中,表示 hello 需要使用 libm.so.6 这个库文件所代表的数学库中的库函数。而当 hello 被执行的时候,动态链接库加载器会从 hello 的 ELF 头中找到 libm.so.6 这个记录,然后沿着主本的符号链接libm.so.6 - libm-2.3.6.so找到实际的共享链接库 libm-

20、2.3.6.so,从而将其与 hello 作动态链接。可见,与版本无关的符号链接是供编译器使用的,主本的符号链接是供动态链接库加载器使用的,而实际的共享链接库则是供给用程序使用的。通过以上分析,我们只需要拷贝 3 个库每个库各 1 个主本的符号链接和 1 个实际的共享链接库 以及动态链接库加载器1 个符号链接和 1 个实体文件。步骤如下:dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ mkdir/work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/t

21、ools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libcrypt-*/work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libcrypt.so.*/work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libm-*/work/nfs_root/fs_mini3

22、/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libm.so.*/work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libc-*/work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l li

23、bc.so.*/work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l ld-*/work/nfs_root/fs_mini3/lib四、手工构建/etc 名目/etc 名目存放的是系统程序的主配置文件,因此需要哪些配置文件取决于要运行哪些系统程序。即使最小的系统也确定会运行 1 号用户进程 init,所以我们至少要手工编写 init 的主配置文件 inittab。busybox 的 inittab 文件的语法、语义与传统的 SYSV 的 init

24、tab 有所不同。inittab 文件中每个条目用来定义一个需要 init 启动的子进程,并确定它的启动方式,格式为:。例如:ttySAC0:askfirst:-/bin/sh 表示子进程要使用的把握台,假设省略则使用与 init 进程一样的把握台 表示运行级别,busybox init 程序这个字段没有意义 表示 init 进程如何把握这个子进程 sysinit:系统启动后最先执行,只执行一次,init 进程等待它完毕后才连续执行其它动作 wait:系统执行完 sysinit 条目后执行,只执行一次,init 进程等待它完毕后才连续执行其它动作once:系统执行完 wait 条目后执行,只执

25、行一次,init 进程不等待它完毕respawn:启动完 once 进程后,init 进程监测觉察子进程退出时,重启动它askfirst:启动完 respawn 进程后,与 respawn 类似,不过 init 进程先输出” Pleasepress Enter to activate this console“,等用户输入回车后才启动子进程 shutdown:当系统关机时 restart:Busybox 中配置了 CONFIG_FEATURE_USE_INITAB,并且 init 进程接收到 SIGUP 信号时执行,先重读取、解析/etc/inittab 文件,再执行 restart 程序 c

26、trlaltdel:按下 ctrl+alt+del 键时执行,不过在串口把握台中无法输入它表示进程对应的二进制文件。假设前面有-号,表示该程序是“可以与用户进展交互的”我们制作最简洁的/etc/inittab 文件,其内容如下::sysinit:/etc/init.d/rcS:askfirst:-/bin/sh:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a r制作最简洁的脚本程序文件/etc/init.d/rcS,其内容如下:#!/bin/shifconfig eth0 192.168.2.17修改 shell 脚本文件/etc/init.d/

27、rcS 的权限,以使其可被执行:# chmod a+x /etc/init.d/rcS五、手工构建最简化的/dev 名目在 linux 机器上,执行ls/dev 可看到几百个设备文件,我需要手工创立它们吗?maybe,我只需要手工创立几个设备文件!我怎么知道我应当创立哪几个设备文件呢?管它呢,先看看开发板上得意的 linux 的反响再说。启动 Linux 操作系统,显示:VFS: Mounted root (nfs filesystem). Freeing init memory: 112KWarning: unable to open an initial console.这说明,内核已经成

28、功挂载根文件系统,但却未能成功启动第 1 个用户进程 init。通过错误消息“unable to open an initial console”搜寻内核源代码,找到 init/main.c 文件。748 static int noinline init_post(void) 749 750free_initmem;751unlock_kernel;752mark_rodata_ro;753system_state = SYSTEM_RUNNING; 754numa_default_policy;755756if (sys_open(const charuser *) “/dev/consol

29、e“, O_RDWR, 0) 0)757printk(KERN_WARNING “Warning: unable to open an initial console.n“); 758759(void) sys_dup(0);760(void) sys_dup(0);761762if (ramdisk_execute_command) 763run_init_process(ramdisk_execute_command); 764printk(KERN_WARNING “Failed to execute %sn“, 765ramdisk_execute_command);766767768

30、/*769* We try each of these until one succeeds. 770*771* The Bourne shell can be used instead of init if we are 772* trying to recover a really broken machine.773*/774if (execute_command) 775run_init_process(execute_command);776printk(KERN_WARNING “Failed to execute %s.Attempting “ 777“defaults.n“,

31、execute_command);778779run_init_process(“/sbin/init“);780run_init_process(“/etc/init“);781run_init_process(“/bin/init“);782run_init_process(“/bin/sh“);783784panic(“No init found. Try passing init= option to kernel.“); 785 明显,内核错误是由 175 行不能翻开/dev/console 所致。通过查看已经安装好的 linux 机器的/dev/console 设备文件,可知其是字

32、符设备文件,主设备号为 5,次设备号为 1:dennisdennis-desktop:/work/nfs_root/fs_mini3/etc$ ls -l /dev/console crw- 1 root root 5, 1 2023-04-08 08:40 /dev/console因此,我们使用下面的命令创立它:dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ sudo mknod console c 5 1还需要创立其它设备文件吗?只有天知道!再看看 linux 的反响。VFS: Mounted root (nfs filesystem).

33、Freeing init memory: 112Kinit: can”t open ”/dev/null”: No such file or directory这次我们有阅历了,如法炮制,创立/dev/null 设备文件:dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ sudo mknod null c 1 3再次重启开发板上的 linux,显示VFS: Mounted root (nfs filesystem).Freeing init memory: 112Kinit started: BusyBox v1.7.0 (2023-04-03

34、 23:53:55 CST) starting pid 229, tty ”: ”/etc/init.d/rcS”Please press Enter to activate this console. starting pid 231, tty ”: ”/bin/sh”#哈哈,我们成功了,最终可以 K 歌去了。六、创立其它空名目K 完歌回来,连续战斗。dennisdennis-desktop:/work/nfs_root/fs_mini3$ mkdir home root proc sys tmp mnt var再次重启动开发板上的 linux。咦,似乎有些问题。VFS: Mounted r

35、oot (nfs filesystem).Freeing init memory: 112Kinit started: BusyBox v1.7.0 (2023-04-03 23:53:55 CST) starting pid 229, tty ”: ”/etc/init.d/rcS”Please press Enter to activate this console. starting pid 231, tty ”: ”/bin/sh”# psPID UidVSZ Stat Command#ps 竟然看不到任何进程的存在!让我想想。对了,ps 的机制是通过查看/proc 中的内容来获得进程

36、信息的。那么,目前/proc 里有哪些内容呢?# ls /proc #竟然空空如野!这可如何是好? 七、配置系统自动生成/proc 名目其实/proc 是用来供给内核与进程信息的虚拟文件系统,由内核自动生成名目下的内容。不过需要我们设置一下,将/etc/init.d/rcS 修改为:#!/bin/shifconfig eth0 192.168.2.17 mount -t proc none /proc对于 mount -t proc none /proc 的解释:通常状况下 mount 命令应当写为 mount t ext2 /dev/hdb1/proc。但由于现在挂载的/proc 是虚拟文件

37、系统,它不与任何物理硬盘分区相对应,因此在表示物理硬盘分区的位置用占位符 none 来表示。重启开发板上的 linux,显示成功了:Please press Enter to activate this console. starting pid 232, tty ”: ”/bin/sh”# psPID UidVSZ Stat Command 1 03088 Sinit2 0SW kthreadd3 0SWN ksoftirqd/04 0SW events/05 0SW khelper41 0SW kblockd/042 0SW ksuspend_usbd45 0SW khubd47 0SW

38、kseriod59 0SW pdflush60 0SW pdflush61 0SW kswapd062 0SW aio/0177 0SW mtdblockd226 0SW /proc/sys/kernel/hotplug将上述工作放到 rcS 中:#!/bin/shifconfig eth0 192.168.2.17 mount -t proc none /proc mount -t sysfs none /sysecho /sbin/mdev /proc/sys/kernel/hotplug mdev -s九、使用 tmpfs 挂载/dev、/tmp、/var 名目似乎我们的根文件系统已经相

39、当完善了。但认真想一想 Nand flash 的擦写寿命是有限的这个事实,我们就应当明白,我们应当将/dev、/tmp、/var 三个名目挂载为 tmpfs 文件系统。修改 rcS 如下:#!/bin/shifconfig eth0 192.168.2.17 mount -t proc none /proc mount -t sysfs none /sys mount -t tmpfs none /dev mount -t tmpfs none /var mount -t tmpfs none /tmpecho /sbin/mdev /proc/sys/kernel/hotplug mdev

40、-s十、制作根文件系统的 jffs2 映像文件根文件系统已经制作完毕,最终一个步骤是将其打包为 jffs2 映像文件,以供 bootloader 将其烧录到 nand flash 上。这只需要执行命令:dennisdennis-desktop:/work/nfs_root$ mkfs.jffs2 -n -s 512 -e 16KiB -d fs_mini3 -o fs_mini3.jffs2这其中: -n 表示不要在每个擦除块上都加上去除标记 -s 512 指明一页大小为 512 字节 -e 16KiB 指明一个擦除块大小为 16KB -d fs_mini3 指明要打包的名目 -o fs_mi

41、ni3.jffs2 指明最终的映像文件名但由于 jffs2 映像文件制作工具程序 mkfs.jffs2 尚未安装,另外该程序需要用到 zlib 库,因此我们必需先安装它们:安装 zlib(编译 MTD 设备工具包需要它) tar xzvf zlib-1.2.3.tar.gz cd zlib-1.2.3 ./configure shared prefix=/usr make sudo make install安装 MTD 工具包其中含有 jffs2 映像文件制作工具 tar xjvf mtd-utils-05.07.23.tar.bz2 cd mtd-utils-05.07.23/util make sudo make install

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!