【TINY4412】LINUX移植笔记:(2)BusyBox制作最小文件系统
宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64
目标板[底板]: Tiny4412SDK - 1506
目标板[核心板]: Tiny4412 - 1412
LINUX内核: 4.12.0
交叉编译器: arm-none-linux-gnueabi-gcc
日期: 2017-7-8 15:11:53
作者: SY
下载
- 下载制作工具:BusyBox
- 版本:
1.27.0
编译Busybox[编译器 arm-none-linux-gnueabi-gcc 4.5.1(友善之臂)]
- 添加 ARCH
root@ubuntu:/opt# cd busybox-1.27.0/
root@ubuntu:/opt/busybox-1.27.0# vim Makefile
189
190 ARCH ?= arm
191 ARCH ?= $(SUBARCH)
192
- 进入
menuconfig
root@ubuntu:/opt/busybox-1.27.0# make menuconfig
Busybox Settings --->
[*] Don't use /usr
[*] Build BusyBox as a static binary (no shared libs)
(arm-none-linux-gnueabi-) Cross Compiler prefix
- 编译
root@ubuntu:/opt/busybox-1.27.0# make install
miscutils/nandwrite.c: In function 'nandwrite_main':
miscutils/nandwrite.c:151:3: error: 'MTD_FILE_MODE_RAW' undeclared (first use in this function)
miscutils/nandwrite.c:151:3: note: each undeclared identifier is reported only once for each function it appears in
scripts/Makefile.build:197: recipe for target 'miscutils/nandwrite.o' failed
make[1]: *** [miscutils/nandwrite.o] Error 1
Makefile:742: recipe for target 'miscutils' failed
make: *** [miscutils] Error 2
- 提示找不到
MTD_FILE_MODE_RAW
定义
root@ubuntu:/opt/busybox-1.27.0# grep -r MTD_FILE_MODE_RAW /usr/include/
/usr/include/mtd/mtd-abi.h: * %MTD_FILE_MODE_RAW.
/usr/include/mtd/mtd-abi.h: * @MTD_FILE_MODE_RAW: OTP disabled, ECC disabled
/usr/include/mtd/mtd-abi.h: * Note: %MTD_FILE_MODE_RAW provides the same functionality as %MTD_OPS_RAW -
/usr/include/mtd/mtd-abi.h: MTD_FILE_MODE_RAW,
root@ubuntu:/opt/busybox-1.27.0# cp /usr/include/mtd/mtd-abi.h include
root@ubuntu:/opt/busybox-1.27.0# vim miscutils/nandwrite.c
54 #include "libbb.h"
55 #include "mtd-abi.h"
56 #include <mtd/mtd-user.h>
root@ubuntu:/opt/busybox-1.27.0# make install
util-linux/blkdiscard.c: In function 'blkdiscard_main':
util-linux/blkdiscard.c:71:26: error: 'BLKSECDISCARD' undeclared (first use in this function)
util-linux/blkdiscard.c:71:26: note: each undeclared identifier is reported only once for each function it appears in
scripts/Makefile.build:197: recipe for target 'util-linux/blkdiscard.o' failed
make[1]: *** [util-linux/blkdiscard.o] Error 1
Makefile:742: recipe for target 'util-linux' failed
make: *** [util-linux] Error 2
- 提示缺少
BLKSECDISCARD
root@ubuntu:/opt/busybox-1.27.0# grep -r "BLKSECDISCARD" /usr/include/
/usr/include/linux/fs.h:#define BLKSECDISCARD _IO(0x12,125)
root@ubuntu:/opt/busybox-1.27.0# cp /usr/include/linux/fs.h include/
root@ubuntu:/opt/busybox-1.27.0# vim util-linux/blkdiscard.c
28 #include "libbb.h"
29 #include "fs.h"
30 #include <linux/fs.h>
root@ubuntu:/opt/busybox-1.27.0# make install
coreutils/lib.a(sync.o): In function `sync_main':
sync.c:(.text.sync_main+0x7c): undefined reference to `syncfs'
collect2: ld returned 1 exit status
- 连接失败,中断在
syncfs
root@ubuntu:/opt/busybox-1.27.0# make menuconfig
Coreutils --->
[ ] sync
root@ubuntu:/opt/busybox-1.27.0# make install
util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x1a0): undefined reference to `setns'
- 连接失败,中断在
setns
root@ubuntu:/opt/busybox-1.27.0# make menuconfig
Linux System Utilities --->
[ ] nsenter
- 连接成功!
编译Busybox[编译器 arm-none-linux-gnueabi-gcc 4.8.3]
root@ubuntu:/opt/busybox-1.27.0# make ARCH=arm menuconfig
Busybox Settings --->
[*] Don't use /usr
[*] Build BusyBox as a static binary (no shared libs)
(arm-none-linux-gnueabi-) Cross Compiler prefix
root@ubuntu:/opt/busybox-1.27.0# make ARCH=arm install
- 一次编译成功!
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
最小文件系统
- 观察生成文件
root@ubuntu:/opt/busybox-1.27.0# cd _install/
root@ubuntu:/opt/busybox-1.27.0/_install# ls
bin linuxrc sbin
root@ubuntu:/opt/busybox-1.27.0/_install# cd bin/
root@ubuntu:/opt/busybox-1.27.0/_install/bin# ls -l
total 1984
lrwxrwxrwx 1 root root 7 Jul 8 20:18 [ -> busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 [[ -> busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 ash -> busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 awk -> busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 base64 -> busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 basename -> busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 beep -> busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 blkdiscard -> busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 bunzip2 -> busybox
-rwxr-xr-x 1 root root 2028052 Jul 8 20:18 busybox
lrwxrwxrwx 1 root root 7 Jul 8 20:18 bzcat -> busybox
...
root@ubuntu:/opt/busybox-1.27.0/_install# cd sbin/
root@ubuntu:/opt/busybox-1.27.0/_install/sbin# ls -l
total 0
lrwxrwxrwx 1 root root 14 Jul 8 20:18 acpid -> ../bin/busybox
lrwxrwxrwx 1 root root 14 Jul 8 20:18 addgroup -> ../bin/busybox
lrwxrwxrwx 1 root root 14 Jul 8 20:18 add-shell -> ../bin/busybox
lrwxrwxrwx 1 root root 14 Jul 8 20:18 adduser -> ../bin/busybox
lrwxrwxrwx 1 root root 14 Jul 8 20:18 adjtimex -> ../bin/busybox
...
root@ubuntu:/opt/busybox-1.27.0/_install# ls -l bin/busybox
-rwxr-xr-x 1 root root 2028052 Jul 8 20:18 bin/busybox
- 所有的命令全部指向
/bin/busybox
文件,这个文件大小约2MB
。这样,最小命令构建完毕,下面构建其他文件。 - 添加
etc
目录
root@ubuntu:/opt/busybox-1.27.0/_install# cp -a ../examples/bootfloppy/etc/ ./
root@ubuntu:/opt/busybox-1.27.0/_install# ls
bin etc linuxrc sbin
root@ubuntu:/opt/busybox-1.27.0/_install# cd etc/
fstab init.d/ inittab profile
root@ubuntu:/opt/busybox-1.27.0/_install/etc# vim inittab
# 指定系统的启动脚本为/etc/init.d/rcS
1 ::sysinit:/etc/init.d/rcS
# 打开一个登录会话
2 ::respawn:-/bin/sh
# 在第三个虚拟终端打开一个无须登录验证的Shell,注意这个tty2,tty2是个设备,所以,我们后边还需要把这个设备创建出来,否则没有这个设备的话在未来启动系统后不停的报”Can’t open /dev/tty2″的警告3 tty2::askfirst:-/bin/sh
# 当按下ctrl+alt+del组合键时的执行命令
4 ::ctrlaltdel:/bin/umount -a -r
root@ubuntu:/opt/busybox-1.27.0/_install/etc# vim fstab
1 proc /proc proc defaults 0 0
# 定义文件系统的挂载点
根据开发板使用的串口,修改:
root@ubuntu:/opt/initramfs# cat etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
tty0::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
- 添加
dev
目录
root@ubuntu:/opt/busybox-1.27.0# mv _install/ rootfs
root@ubuntu:/opt/busybox-1.27.0# cd rootfs/
root@ubuntu:/opt/busybox-1.27.0/rootfs# ls
bin etc linuxrc sbin
root@ubuntu:/opt/busybox-1.27.0/rootfs# mkdir dev
root@ubuntu:/opt/busybox-1.27.0/rootfs# ls
bin dev etc linuxrc sbin
root@ubuntu:/opt/busybox-1.27.0/rootfs# cd dev/
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# ls -l /dev
total 0
crw------- 1 root root 10, 175 Jul 8 15:09 agpgart
crw------- 1 root root 10, 235 Jul 8 15:09 autofs
drwxr-xr-x 2 root root 380 Jul 8 15:09 block
drwxr-xr-x 2 root root 160 Jul 8 15:09 bsg
crw------- 1 root root 10, 234 Jul 8 15:09 btrfs-control
drwxr-xr-x 3 root root 60 Jul 8 15:09 bus
lrwxrwxrwx 1 root root 3 Jul 8 15:09 cdrom -> sr0
lrwxrwxrwx 1 root root 3 Jul 8 15:09 cdrw -> sr0
drwxr-xr-x 2 root root 3900 Jul 8 15:09 char
crw------- 1 root root 5, 1 Jul 8 15:09 console
lrwxrwxrwx 1 root root 11 Jul 8 15:09 core -> /proc/kcore
drwxr-xr-x 2 root root 60 Jul 8 15:09 cpu
crw------- 1 root root 10, 59 Jul 8 15:09 cpu_dma_latency
crw------- 1 root root 10, 203 Jul 8 15:09 cuse
drwxr-xr-x 5 root root 100 Jul 8 15:09 disk
crw-rw----+ 1 root audio 14, 9 Jul 8 15:09 dmmidi
drwxr-xr-x 2 root root 100 Jul 8 15:09 dri
...
# 查看电脑端设备的major和minor,模仿创建字符设备
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# mknod console c 5 1
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# mknod null c 1 3
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# mknod ttySAC0 c 204 64
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# mknod tty0 c 204 65
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# mknod mtdblock0 b 31 0
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# mknod mtdblock1 b 31 1
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# mknod mtdblock2 b 31 2
root@ubuntu:/opt/busybox-1.27.0/rootfs/dev# ls
console mtdblock0 mtdblock1 mtdblock2 null tty0 ttySAC0
- 创建其他目录
root@ubuntu:/opt/busybox-1.27.0/rootfs# mkdir proc mnt tmp sys root
root@ubuntu:/opt/busybox-1.27.0/rootfs# ls
bin dev etc linuxrc mnt proc root sbin sys tmp
- 写一个脚本批量处理
root@ubuntu:/opt/busybox-1.27.0# vim rootfs.sh
1 #!/bin/bash
2
3 # Batch create rootfs
4
5 echo "-----------------------------"
6 echo "make"
7 make ARCH=arm install
8 echo "-----------------------------"
9
10 echo "Create rootfs"
11 cp -a _install/ rootfs/
12
13 echo "Create etc"
14 cp -a ./examples/bootfloppy/etc/ ./rootfs/
15
16 echo "Create dev"
17 cd rootfs
18 mkdir dev
19
20 cd dev
21 mknod console c 5 1
22 mknod null c 1 3
23 mknod ttySAC0 c 204 64
24 mknod tty0 c 204 65
25 mknod mtdblock0 b 31 0
26 mknod mtdblock1 b 31 1
27 mknod mtdblock2 b 31 2
28
29 echo "Create Other"
30 cd ../
31 mkdir proc mnt tmp sys root
32
33 echo "Over!"
34 echo "-----------------------------"
35
root@ubuntu:/opt/busybox-1.27.0# chmod 755 rootfs.sh
- 运行脚本
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
-----------------------------
Create rootfs
Create etc
Create dev
Create Other
Over!
-----------------------------
root@ubuntu:/opt/busybox-1.27.0# cd rootfs
root@ubuntu:/opt/busybox-1.27.0/rootfs# ls
bin dev etc linuxrc mnt proc root sbin sys tmp
root@ubuntu:/opt/busybox-1.27.0/rootfs# vim etc/inittab
1 ::sysinit:/etc/init.d/rcS
2 ::respawn:-/bin/sh
3 tty0::askfirst:-/bin/sh
4 ::ctrlaltdel:/bin/umount -a -r
动态编译
root@ubuntu:/opt/gcc-arm-none-eabi-5_4-2016q3# cd /opt/fs/busybox-1.27.0/
root@ubuntu:/opt/fs/busybox-1.27.0# make menuconfig
Busybox Settings --->
(arm-none-linux-gnueabi-) Cross Compiler prefix
[ ] Build BusyBox as a static binary (no shared libs)
不要选择静态编译!
root@ubuntu:/opt/fs/busybox-1.27.0# make
root@ubuntu:/opt/fs/busybox-1.27.0# make install
生成_install
文件夹
root@ubuntu:/opt/fs/busybox-1.27.0# cd _install/
root@ubuntu:/opt/fs/busybox-1.27.0/_install# ls
bin linuxrc sbin
root@ubuntu:/opt/fs/busybox-1.27.0/_install# mkdir lib
root@ubuntu:/opt/fs/busybox-1.27.0/_install# cd lib/
root@ubuntu:/opt/fs/busybox-1.27.0/_install/lib# cp /opt/arm-2014.05/arm-none-linux-gnueabi/libc/lib/* ./
root@ubuntu:/opt/fs/busybox-1.27.0/_install/lib# ls
ld-2.18.so libcrypt.so.1 libnsl.so.1 libnss_hesiod.so.2 librt-2.18.so
ld-linux.so.3 libc.so.6 libnss_compat-2.18.so libnss_nis-2.18.so librt.so.1
libanl-2.18.so libdl-2.18.so libnss_compat.so.2 libnss_nisplus-2.18.so libSegFault.so
libanl.so.1 libdl.so.2 libnss_db-2.18.so libnss_nisplus.so.2 libthread_db-1.0.so
libBrokenLocale-2.18.so libgcc_s.so libnss_db.so.2 libnss_nis.so.2 libthread_db.so.1
libBrokenLocale.so.1 libgcc_s.so.1 libnss_dns-2.18.so libpcprofile.so libutil-2.18.so
libc-2.18.so libm-2.18.so libnss_dns.so.2 libpthread-2.18.so libutil.so.1
libcidn-2.18.so libmemusage.so libnss_files-2.18.so libpthread.so.0
libcidn.so.1 libm.so.6 libnss_files.so.2 libresolv-2.18.so
libcrypt-2.18.so libnsl-2.18.so libnss_hesiod-2.18.so libresolv.so.2
从交叉编译器lib
目录拷贝动态链接库,搞定!
总结
- 选择一个对的编译器很重要,不然出现很多莫名其妙的错误!
- 使用
arm-none-eabi-gcc
和arm-none-linux-gnueabi-gcc 4.5.1
编译器会出现很多问题,改用arm-none-linux-gnueabi-gcc 4.8.3
版本编译器一次编译通过。下载: arm-none-linux-gnueabi-gcc 4.8.3 - 最小文件系统容量大约为
2~3
MB