制作ZedBoard上linux根文件系统(ramdisk)

在笔者所写上一篇博客OpenHW12参赛手记】Zedboard-网络配置方法详解http://www.eefocus.com/jefby1990/blog/13-04/293499_5fa3a.html中,已经成功实现了在PC机上使用FTP软件来访问Zedboard开发板,这些功能是busybox里面已经实现的了,只需要让守护进程开机自启动就可以了,但是这个系统里面没有linux下比较熟悉的ftp客户端,只有一些简单的ftpgetftpput软件,但是这个软件用起来太繁琐,不好用,故笔者就想能不能将inet-ftp移植到zedboard上呢?新的问题出现了,为了实现这个目标,就必须定制根文件系统,修改rcS文件等。

根文件系统是什么东西呢?Linux内核加载完成之后,一般情况下都需要挂在一个根文件系统以充分发挥其优势,一般使用符号/来表示。在根文件系统中,一般包含了一些应用程序和工具软件,以便linux能够方便的使用它们来完成引导系统、初始化系统服务等特殊要求。在嵌入式系统中,一般可以使用busybox来简化定制。下面详细介绍定制过程。

1、下载busyboxhttp://www.busybox.net/

下载tar.bz2版本,完成后,解压到工作目录下,cd busybox目录下,输入命令

make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig

如图1所示:

制作ZedBoard上linux根文件系统(ramdisk)_第1张图片

 

                        图1

依次进入BusyBox Settings->Installation Options->BusyBox installation prefix

把目录设置为/home/jefby/zed/rootfs_zed

保存并退出。

下一步,编译并安装busybox,输入命令

make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- install

在rootfs_zed下就生成了四个目录分别为/bin/sbin/usr/bin/usr/sbin和一个指向busybox的软链接。

2、安装dropbear

Dropbear是一个软件用以支持SSH协议,现在一般的FTP传输都需要支持SSH

在网站http://matt.ucc.asn.au/dropbear/下载dropbear-2013.58.tar.bz2包,下载完成后解压缩到工作目录下,切换到解压缩目录下,输入命令

./configure --prefix=/home/jefby/zed/rootfs_fd --host=arm-xilinx-linux-gnueabi --disable-zlib CC=arm-xilinx-linux-gnueabi-gcc LDFLAGS="-Wl,--gc-sections" CFLAGS="-ffunction-sections -fdata-sections -Os"

--prefix指定软件的优先安装目录,这里设置为笔者的根文件系统

--host指定软件的运行主机

--disable-zlib 指定不需要zlib的支持

CC设置编译器

LDFLAGS设置链接时从哪里找库文件

CFLAGS设置编译选项

-ffunction-section解释如下

Use with "-fdata-sections", place each function or data item into its own section in the output file if the target supports arbitrary sections. The name of the function or the name of the data item determines the section's name in the output file.

这个选项配合-fdata-sections告诉编译器如果目标文件支持任意部分访问的话,就将输出文件的每个函数或数据选项放到各自的节中。

-Os

针对程序空间大小优化(多用于嵌入式系统)。-Os使能-O2中除去会增加程序空间的所有优化参数。同时-Os还会执行更加优化程序空间的选项。

下一步编译生成各个可执行文件,并安装,命令如下

make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert " MULTI=1 strip

make install

3、利用交叉工具链,构建lib

切换到/home/jefby/zed/rootfs_zed目录下,输入命令建立lib目录,

mkdir lib

输入完成后,拷贝库文件到该目录下,命令如下

cp lib_jefby/* lib/

拷贝工具链到我们的文件系统的usr/binusr/sbin目录下:

我的目录是:

/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/sbin

/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/arm-xilinx-linux-gnueabi/libc/usr/bin

具体方法

cp    /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/

arm-xilinx-linux-gnueabi/libc/sbin/* usr/sbin

cp  /root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/

arm-xilinx-linux-gnueabi/libc/usr/bin/* usr/bin

        lib_jefby库文件链接地址:

        pan.baidu.com/share/link

4、创建其他所需的目录

根据FHS标准还需要建立一些其他的目录,具体命令如下

切换到/home/jefby/zed/rootfs_zed目录下,

mkdir dev etc etc/dropbear etc/init.d mnt opt proc root sys tmp var var/log var/www

创建fstab,该文件描述各种文件系统的信息,并编辑如图2所示:

                                              图2

创建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

创建etc/passwd文件,并编辑如下:

  root:$1$qC.CEbjC$SVJyqm.IG.gkElhaeM.FD0:0:0:root:/root:/bin/sh

编辑etc/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 /&

echo "++ Starting dropbear (ssh) daemon"

dropbear

echo "rcS Complete"

这个文件设置开机启动文件,如果想要将我们的应用程序设置成开机启动,移植完软件后,可以将其配置到该文件中。

最后一步,设置文件的权限

chmod 755 etc/init.d/rcS

sudo chown root:root etc/init.d/rcS

5、生成镜像文件

使用dd软件制作镜像文件并将上述我们制作的rootfs_zed中的内容拷贝到镜像文件中,具体命令如下:

sudo -s

切换到root

cd

进入/home/jefby文件夹下

dd if=/dev/zero of=ramdisk8M.image bs=1024 count=16384

笔者在此设置镜像大小为16M,方便后面放ftp客户端所需的库文件

下面是笔者在网上找的有关dd使用说明

dd作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换

主要选项:

If=file

输入文件名,默认为标准输入

Of=file

输出文件名,默认为标准输出

Ibs=bytes

一次读入bytes个字节(即一个块大小为bytes个字节)

Obs=bytes

一次写入bytes个字节

Bs=bytes

同时设置读和写的块大小为bytes

Cbs=bytes

一次转换bytes个字节

Skip=blocks

从输入文件开头跳过blocks个块后再开始复制

Seek=blocks

从输出文件开头跳过blocks个块后再开始复制

Count=blocks

仅仅拷贝blocks个块,块大小等于ibs指定的字节数

接着将镜像文件制作成ext2格式的文件系统。命令如下:

mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0

mke2fs

建立ext2fs文件系统

一般用法:

Mke2fs -F 设备 -L 标签名称 -m xx% -b 区块大小

-F 不管指定的设备为何,强制执行mke2fs

-L 设置文件系统的标签

-m 指定给管理员保留区块的比例,预设为5%

-v 执行时显示详细信息

 

下一步使用tune2fs调整生成的文件系统的参数。

命令如下

tune2fs ramdisk8M.image -i 0

即不进行自检

tune2fs调整和查看ext2/ext3文件系统的文件系统参数

tune2fs -l 查看文件系统信息

-i 设置[d|m|w] 设置强制自检的时间间隔

即制作完成了,下一步,将我们生成的rootfs_zed拷贝到该image文件中

方法:

mkdir zed_ram

mount -o loop ~/ramdisk8M.image zed_ram

这一步将ramdisk8M.image挂载到zed_ram下,对其的修改也就是对镜像文件的修改

cp ~/zed/rootfs_zed/* zed_ram

拷贝完成后,卸载镜像文件,

cd 

umount zed_ram

将其压缩成gz格式

gzip -9 ramdisk8M.image

6、启动调试

将上一步生成的文件ramdisk8M.image.gz拷贝到SD卡中,替换掉以前的同名文件,将SD卡插入zedboard插槽,打开串口终端,打开电源,就可以看到我们自己的启动界面了,部分截图如图3所示:

制作ZedBoard上linux根文件系统(ramdisk)_第2张图片

                                                   图3

 

可以看到我们定制的根文件系统已经成功了,当然,这只是基本功能,如果想要什么应用只需要交叉编译并拷贝到bin目录下即可,另外,还有一个问题是根文件系统的大小限制,只有16M,而且最好不超过32M,在这样的情况下,我们可以将我们制作的比较大的文件系统镜像挂载上,并使用busybox里面集成的switch_root切换根目录,这样应该就可以满足大部分要求了!在下一篇博客中将详述!

 

本文参考自http://wiki.xilinx.com/和http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_lab7.html

你可能感兴趣的:(制作ZedBoard上linux根文件系统(ramdisk))