利用busybox制作zedboard使用的rootfs

linux 专栏收录该内容
52 篇文章 0 订阅

xilinx官方提供了预制的rootfs
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842330/Zynq2017.4+Release
下载即可。

FHS(Filesystem Hierarchy Standard)标准介绍
/bin 必备的用户命令,例如ls、cp等
/sbin 必备的系统管理员命令,例如ifconfig、reboot等
/dev 设备文件,例如mtdblock0、tty1等
/etc 系统配置文件,包括启动文件,例如inittab等
/lib 必要的链接库,例如C链接库、内核模块
/home 普通用户主目录
/root root用户主目录
/usr/bin 非必备的用户程序,例如find、du等
/usr/sbin 非必备的管理员程序,例如chroot、inetd等
/usr/lib 库文件
/var 守护程序和工具程序所存放的可变,例如日志文件
/proc 用来提供内核与进程信息的虚拟文件系统,由内核自动生成目录下的内容
/sys 用来提供内核与设备信息的虚拟文件系统,由内核自动生成目录下的内容
/mnt 文件系统挂接点,用于临时安装文件系统
/tmp 临时性的文件,重启后将自动清除

制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。其过程大体包括:

  • 编译和安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录
  • 利用交叉编译工具链,构建/lib目录
  • 手工构建/etc目录
  • 制作根文件系统的镜像文件

(1)利用busybox生成/bin、/sbin、/usr/bin、/usr/sbin目录
首先下载BusyBox源码
https://busybox.net/downloads/
例如1.27.2版本。
下载后,切换到busybox目录,并进行默认配置
#export ARCH=arm
#export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
#make defconfig
(#make menuconfig可以进行定制裁剪)
#make install
这里会遇到错误。
1》MTD_FILE_MODE_RAW’ undeclared
首先找这个文件
#sudo locate mtd-abi.h
#cat
发现工具链路径/include/mtd/mtd-abi.h
其中有定义
/*

  • Read/write file modes for access to MTD
    */
    enum mtd_file_modes {
    MTD_MODE_NORMAL = MTD_OTP_OFF,
    MTD_MODE_OTP_FACTORY = MTD_OTP_FACTORY,
    MTD_MODE_OTP_USER = MTD_OTP_USER,
    MTD_MODE_RAW,
    };
    修改busybox nandwrite.c:151 ‘MTD_FILE_MODE_RAW’改为‘MTD_MODE_RAW’
    或者,
    MTD_FILE_MODE_RAW在$cross-compiler/usr/include/mtd/mtd-abi.h中定义。将/usr/include/mtd/mtd-abi.h拷贝到busybox的include文件中。
    然后修改c文件。
    #gedit miscutils/nandwrite.c
    修改头文件如下:
    #include “libbb.h”
    #include “mtd-abi.h”
    #include <mtd/mtd-user.h>

2》undefined reference to `setns’
是因为arm-linux-gcc 比较旧,而busybox 比较新
屏蔽该功能。
Linux System Utilities -> nsenter,取消该功能。
3》sync相关错误
进入Coreutils -> sync,取消该功能

4》error: ‘BLKSECDISCARD’ undeclared

在交叉工具链中找到multi-libs/usr/include/linux/fs.h, 把新版本添加的几个宏copy过来。
注意,BLKSECDISCARD在multi-libs/usr/include/linux/fs.h中定义,方法如上所述,将fs.h拷贝到busybox的include文件中linux下。
然后修改c文件。
#gedit util-linux/blkdiscard.c
修改内容如下:
#include <linux/fs.h>

++++++++++++++++++++++++++++++++++
注意:
旧的gcc不要编译最新的代码, 你可能得不到最新功能,而且一堆麻烦。
用高版本编译工具,无痛通过。

++++++++++++++++++++++++++++++++++
如果需要定制裁剪,逐一进入各级菜单进行定制。
常用的定制选项如下:

(2)编译dropbear,增加SSH支持。
首先下载。
http://matt.ucc.asn.au/dropbear/releases/
例如2017.75版本。
解压后,把整个文件夹复制到刚才的busybox文件夹中。
在dropbear里面可以找到一个./configure文件,这是一个脚本文件。可以执行。
# ./configure --prefix ~/work/busybox-1.27.2/_install --disable-zlib --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc LDFLAGS="-Wl,–gc-sections" CFLAGS="-ffunction-sections -fdata-sections -Os"
配置完成后,我们可以在目录下找到一个生成的makefile。
makefile变量会发生如下改变:
prefix=/home/lz/work/busybox-1.27.2/_install
CC=arm-linux-gnueabihf-gcc
AR=arm-linux-gnueabihf-ar
RANLIB=arm-linux-gnueabihf-ranlib
STRIP=arm-linux-gnueabihf-strip
INSTALL=install
CPPFLAGS=
CFLAGS+=-I. -I$(srcdir) $(CPPFLAGS) -ffunction-sections -fdata-sections -Os
LIBS+=-lutil
LDFLAGS=-Wl,–gc-sections

修改makefile。
修改prefix。注意用绝对路径。如果是我们需要的prefix路径,就不管它。
修改PROGRAMS=dropbear dbclient dropbearkey dropbearconvert scp
在文件开始位置,添加
MULTI=1
STATIC=1
SCPPROGRESS=1
配置好了makefile。就可以开始编译了
# make strip
#make install

安装好之后,将快捷方式scp从_install/bin/下面复制一份,并粘贴到_install/usr/bin/中。

(3)拷贝交叉工具链的libc
#cd _install
#mkdir lib
将交叉编译环境库拷贝到这个目录下
cp /home/milinker/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/lib/* lib -r
同样,将工具链拷贝到sbin/和usr/bin/下
cp /home/milinker/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/sbin/* sbin -r

cp /home/milinker/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/bin/* usr/bin -r

cp /home/work/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/lib/* lib/ -r

cp /home/work/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/sbin/* sbin/ -r

cp /home/work/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/bin/* usr/bin/ -r

cp
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/* root_fs/lib/* -df
使用-d选项表示链接文件按照原来的链接方式拷贝,否则链接文件拷贝过来是一个副本。

(4)目录的创建与配置
这一步是要创建文件系统下其余的目录,以及在启动系统时所需的配置文件
#mkdir dev
#mkdir etc var/www
#mkdir etc/dropbear
#mkdir etc/init.d
#mkdir mnt
#mkdir opt
#mkdir proc
#mkdir root
#mkdir sys
#mkdir tmp
#mkdir var
#mkdir var/log
#mkdir var/www

拷贝etc到安装目录xxx/rootfs【也可以自己添加修改etc】
#cp XXX/busybox-1.18.3/examples/bootfloppy/etc/ XXX/rootfs -R
把busybox源码目录下的etc的内容拷贝到rootfs目录下的etc下

# cd /home/zxx/rootfs/etc

# cp -a /home/zxx/Downloads/busybox-1.25.0/examples/bootfloppy/etc/* ./

构建dev目录下的设备文件。

由于console和null设备是init进程启动所必须的,所以要建立这两个设备文件,进入dev目录,然后执行
#cd dev
#mknod console c 5 1
#mknod null c 1 3
如果这两个设备文件没有手工mknod创建就在内核启动时会出现错误:
Warning: unable to open an initialconsole.
注意一定是在dev下创建这两个设备文件。

将ect/fstab文件改为

# device mount-point typeoptions dump fsck order

proc /proc proc defaults 00

sysfs /sys sysfs defaults 0 0

再在root_fs下新建一个sys目录。

于是我们再做成一个yaffs2镜像就可以支持自动创建设备文件了,注意上面说到的建立的console和null设备文件不能删除,因为它们在mdev工作之前就已经被使用了。

(5)创建配置文件
I) 创建配置文件etc/fstab,内容为:
LABEL=/ / tmpfs defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
none /tmp tmpfs defaults 0 0

II) 创建配置文件etc/inittab,内容为:
::sysinit:/etc/init.d/rcS
# /bin/ash

# Start an askfirst shell on the serial ports
ttyPS0::respawn:-/bin/ash
# What to do when restarting the init process
::restart:/sbin/init
# What to do before rebooting
::shutdown:/bin/umount -a -r
::sysinit:/etc/init.d/rcS
第一行是用来启动脚本文件rcS,之所以这样做,是因为我们可以利用这个文件来引导系统启动时为我们做一个工作比如说挂载文件系统或者启动一些其他的应用程序的。
后面指定系统执行特殊操作命令(shultdown、restart、ctrlaltdel)时做的附加工作。

III)/etc/passwd
可以设置无密码,在文件系统运行后用passwd命令改动想要的同户名密码,绕后将新生成的密文passwd文件重新更新到文件系统当中,密码就被固定下来)

IV)/etc/profile
export PS1=’[\u@\h \w]#’
export PS1 HOSTNAM=’/bin/hostname’

V) 创建配置文件etc/init.d/rcS,内容为:
#!/bin/sh
echo “Starting rcS…”
echo “++ Mounting filesystem”
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp
echo “++ Setting up mdev”
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /dev/pts
mkdir -p /dev/i2c
mount -t devpts devpts /dev/pts
echo “++ Starting telnet daemon”
telnetd -l /bin/sh
echo “++ Starting http daemon”
httpd -h /var/www
echo “++ Starting ftp daemon”
tcpsvd 0:21 ftpd ftpd -w /&
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 192.168.31.230 netmask 255.255.255.0 up
/bin/hostname –F /etc/hostname
echo “rcS Complete”

最后,
为rcS赋予root的执行权限
chmod 755 etc/init.d/rcS
sudo chown root:root etc/init.d/rcS

(6)制作ramdisk镜像。
利用shell 脚本制作镜像。

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值