【TINY4412】LINUX移植笔记:(2)BusyBox制作最小文件系统

【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-gccarm-none-linux-gnueabi-gcc 4.5.1 编译器会出现很多问题,改用arm-none-linux-gnueabi-gcc 4.8.3 版本编译器一次编译通过。下载: arm-none-linux-gnueabi-gcc 4.8.3
  • 最小文件系统容量大约为2~3MB​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值