讯为IMX6ULL-QT系统移植之busybox构建根文件系统

一、BusyBox 工具下载

BusyBox 工具我们可以在其官网下载到,官网地址为:https://busybox.net/

然后点击官网左侧“Get BusyBox”栏中的“Download Source”进入下载页面即可。

先介绍等下要使用的东西的版本:

                BusyBox :busybox-1.29.0.tar.bz2
                编译器:arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
                编译环境:Ubuntu18.04

二、 Busybox 制作最小文件系统

        2.1准备源码

                先在工作目录下创建minilinux目录,把busybox-1.29.0.tar.bz2放进来。  

                解压:tar -vxjf busybox-1.29.0.tar.bz2

                进入:cd busybox-1.29.0

        2.2编译环境

                先使用命令“apt-get install libncurses5-dev”确认是否安装ncurses库,没有安装的话后面编译会报错。

        2.3支持中文

                从busybox1.17.0以上之后,对ls命令不做修改是无法显示中文的。就算是内核设置了支持中文的话,在shell下用ls命令也是无法显示中文的,这是因为busybox1.17.0以后版本对中文的支持进行了限制。要想让busybox1.17.0以上支持中文,需做如下修改。

       首先使用命令“vim libbb/printable_string.c”,

       然后查找函数printable_string,我们可以看到在第31,32行和45行的操作,大于0x7F的字符直接被break掉,或者直接被“?”代替了。所以就算是linux内核设置了支持中文,也是无法显示出来的。所以我们对这三行进行修改,注释掉对大于0x7f字符的相关操作。如下图所示:

修改之后保存退出。

       然后使用命令“ vim libbb/unicode.c”

       打开之后查找函数unicode_conv_to_printable2,我们可以看到1022行和1030行也对大于0x7f的字符有对应操作,同样的我们这两处做修改,如下图所示:

        修改之后保存退出。

        经过以上修改之后,源码就可以支持中文字符了,但还需要配置 busybox来使能 unicode码,这个稍后会去配置。

2.4配置busybox    

        使用命令“make defconfig ”,即可配置busybox为默认配置。

        这一步结束后,将生成.config文件。我们一般使用“make menuconfig”图形化配置命令,配置“Busybox”

        接下来开始配置:

        1)交叉编译设置

下图如果使用一开始提到的编译器,就写成arm-none-linux-gnueabihf-

 

 按OK即可

        2)这个界面是设置编译完Busybox,把最终生成的二进制文件安装到哪个目录下面

        接着使用方向键下翻,在“--- Installation Options ”栏找到“(./_install) Destination path for 'make install' (NEW)”

 

         使用回车进入,将“./_install”修改为“../system

 

         然后回车选择“Ok”,回到“Settings”设置界面

        3)然后方向键下翻,空格选择“vi-style line editing commands(NEW)”选项

 

 接着使用左右方向按键,选择“Exit”,回到“Busybox Configuration”界面。如下图所示:方向键下翻找到“Linux Module Utilities  --->”

接着回车进入,空格取消选择“Simplified modutils,

 

4)然后使用左右方向按键,选择“Exit”,回到“Busybox Configuration”界面。方向键上翻找到“Settings  --->“ 

 

然后回车进入,方向键下翻找到“Support Unicod”和“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”,选中这两个选项,即使能 busybox 的 unicode 编码以支持中文。

 然后一路Exit,YES保存退出

至此,busybox 的配置就完成了,如有其他需要可以自行选择配置。如果是初学者建议按照我们的办法配置,以防出错。

 2.5编译busybox

         在/home/jdr/minilinux/busybox-1.29.0目录下执行命令:make 或者 make -j4

        make成功后如下图,

        

如果make出现下面的错误试试下面的方法:
util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x184): undefined reference to `setns'
coreutils/lib.a(sync.o): In function `sync_main':
sync.c:(.text.sync_main+0x8c): undefined reference to `syncfs'
collect2: error: ld returned 1 exit status
Note: if build needs additional libraries, put them in CONFIG_EXTRA_LDLIBS.
Example: CONFIG_EXTRA_LDLIBS="pthread dl tirpc audit pam"
Makefile:718: recipe for target 'busybox_unstripped' failed
make: *** [busybox_unstripped] Error 1

1)make menuconfig
2)找到Linux System Utilities--->nsenter,去掉该选项
3)找到Coreutils--->sync选项去掉

        接着执行:make install

        cd  ../system 进入到安装好的目录

2.6整理最小文件系统

上一节通过编译busybox生成了bin、sbin和usr这三个目录,以及 linuxrc 这个文件。busybox 的工作就完成了,还需要一些其他的文件完善文件系统。

最后确认下是否是arm的:
    cd  /minilinux/system/bin
    file busybox

如果显示arm那就没问题,如果显示x86,说明前面交叉配置出问题,那就这样解决:
    1)删除刚刚编译的/minilinux/system/下的文件,rm -rf   ./bin  sbin  usr  linuxrc
    2)在此终端上执行以下命令(第二个命令的路径是解压arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2的地方):
        export ARCH=arm
        export CROSS_COMPILE=/home/jdr/IMX6ULL/arm-2014.05/bin/arm-none-linux-gnueabi-
    3)再次执行make 和 make install ,再次检查

(1)制作的文件系统还需要新建“dev,etc,lib,mnt,proc,sys,tmp,var”文件夹,使用命令“mkdir dev etc lib mnt proc sys tmp var”,如下

 

(2)然后使用“cd etc”命令进入到刚才创建的“etc”文件夹

3)然后命令建立“eth0-setting”文件,并在“eth0-setting”文件里输入下面的内容:

IP=192.168.1.230
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90

补充说明:这个文件里配置信息可以在开发板上再次修改,主要修改下IP、Gateway、DNS

 记得修改完重启,命令:/etc/init.d/ifconfig-eth0                         

(4)然后保存并退出“eth0-setting”文件,使用“chmod 755 eth0-setting”命令修改文件的权限

 (5)接着在etc目录下用“mkdir init.d”命令建立“init.d”文件夹

(6)然后使用“cd init.d”命令进入到“init.d”文件夹

(7)然后在“init.d”文件夹下面使用“vi ifconfig-eth0”命令建立“ifconfig-eth0”文件

(8)然后在“ifconfig-eth0”文件中输入下面的内容

#!/bin/sh
echo -n Try to bring eth0 interface up......>/dev/ttymxc0
if [ -f /etc/eth0-setting ] ; then
      source /etc/eth0-setting
         if grep -q "^/dev/root / nfs " /etc/mtab ; then
                 echo -n NFS root ... > /dev/ttymxc0
         else
                 ifconfig eth0 down
                 ifconfig eth0 hw ether $MAC
                 ifconfig eth0 $IP netmask $Mask up
                 route add default gw $Gateway
         fi
         echo nameserver $DNS > /etc/resolv.conf
 
 else
         if grep -q "^/dev/root / nfs " /etc/mtab ; then
                 echo -n NFS root ... > /dev/ttymxc0
         else
                 /sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up
         fi
fi
 echo Done > /dev/ttymxc0

 (9)然后保存并退出“ifconfig-eth0”文件,使用“chmod 755 ifconfig-eth0”命令修改权限

 (10)接下来在“init.d”文件夹下使用“vi rcS”命令建立“rcS”文件

 (11)然后在“rcS”文件输入下面的内容

#! /bin/sh
 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
 runlevel=S
 prevlevel=N
 umask 022
 export PATH runlevel prevlevel

#       Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
 /bin/hostname iTOP-iMX6UL
 #/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
#/bin/hotplug
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
#/bin/mount -n -t ramfs none /tmp
#/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
#ln -sf /dev/ttyS2 /dev/tty2
#ln -sf /dev/ttyS2 /dev/tty3
#ln -sf /dev/ttyS2 /dev/tty4
syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/tty1
echo "Starting networking..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo " " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo " " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo " "
#sleep 1
#echo "*************************************" > /dev/ttySAC2
#echo " http://www.topeet.com.cn " > /dev/ttySAC2
#echo "*************************************" > /dev/ttySAC2
#echo "*************************************"
#echo " http://www.topeet.com.cn "
#echo "*************************************"
mkdir /mnt/disk
sleep 1
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0

 (12)然后保存并退出“rcS”文件,使用“chmod 755 rcS”命令修改“rcS”文件的权限

 (13)接下来使用“cd ..”命令返回到“init.d”文件夹的上一级目录“etc”

 (14)接下来在“etc”目录下使用“vi passwd”命令建立文件“passwd”

(15)然后在新建立的“passwd”文件中输入下面的内容

root::0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:

 (16)添加之后保存并退出“passwd”文件,使用“chmod 755 passwd”命令修改“passwd”文件的权限

 (17)然后使用“vi profile”命令在“etc”目录建立“profile”文件

(18)然后在“profile”文件中输入下面的内容

# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[$USER@$HOSTNAME]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH

(19)然后保存并退出“profile”文件,使用“chmod 755 profile”命令修改“profile”文件的权限

(20)接下来使用“mkdir rc.d”命令在“etc”目录建立文件夹“rc.d”

(21)使用“cd rc.d”命令进入到刚才建立的“rc.d”文件夹

(22)接下来在“rc.d”目录下使用“mkdir init.d”命令建立“init.d”文件夹

(23)然后使用“cd init.d”命令进入到刚才建立的“init.d”文件夹

(24)接着在“init.d”文件夹,使用“vi netd”命令建立“netd”文件

(25)然后在“netd”文件里面输入下面的内容

#!/bin/sh
base=inetd
# See how we were called.
case "$1" in
        start)
                /usr/sbin/$base
       ;;
        stop)
               pid=`/bin/pidof $base`
               if [ -n "$pid" ]; then
                      kill -9 $pid
              fi
        ;;
esac
exit 0

(26)然后保存并退出“netd”文件,使用“chmod 755 netd”命令修改“netd”文件的权限

(27)接着使用“cd ../../../”命令返回到“system”目录

(28)接着使用“cd lib”命令进入到“lib”目录

(29)Busybox 编译生成的二进制文件是以动态链接库的形式运行,所以我们需要拷贝编译器里面的库文件到“lib”目录(自己)

            路径是解压arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2的地方

            我的是把/IMX6ULL/arm-2014.05/arm-none-linux-gnueabi/libc/lib   里面的东西拷贝到minilinux/system/lib里

/IMX6ULL/arm-2014.05/arm-none-linux-gnueabi/libc/lib里如下图

(30)然后可以使用“ls”命令查看一下拷贝过来的库文件

(31)库文件拷贝完成后,使用“cd ..”命令返回到“system”目录

(32)接下来使用“cd var”命令进入到“var”目录

(33)然后使用“mkdir lib lock log run tmp”命令在“var”目录下建立“lib,lock,log,run,tmp”五个目录,可使用命令“ls”查看

(34)至此,文件系统所需要的文件都已经创建好了,使用“cd ../../”命令返回到“system”文件夹

2.6制作文件系统镜像及测试

        使用压缩命令将文件系统打包,生成 rootfs.tar.bz2 文件:

                tar -cjf rootfs.tar.bz2 bin dev etc lib linuxrc mnt proc sbin sys tmp usr var

​​​​​​        可以看到“rootfs.tar.bz2”压缩包,这个就是制作好的最小 linux 系统镜像

2.7开始烧写进IMX6ULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值