ZYNQ 文件系统生成

          做一个勤奋的人      向写本文的原作者致敬(里面我加了几句)

(原创)一步一步学ZedBoard & Zynq(七):制作ZedBoard上linux根文件系统(ramdisk)

Digilent的OOB设计给出了一个ZedBoard上完整的运行的linux系统所需要的所有文件,包括配置FPGA的bit文件、 配置ARM PS系统的First-Stage boot loader(FSBL)和引导linux需要的Second-Stage boot loader(SSBL)、Linux内核zImage、设备树文件devicetree_ramdisk.dtb 以及根文件系统ramdisk8M.image.gz。linux在运行时,加载这个ramdisk8M.image.gz镜像文件到DDR3中来执行实现根文件系统的建立,很多并不像在ubuntu中对文件系统操作那样简单。本小节介绍如何制作ZedBoard可运行的根文件系统ramdisk8M.image.gz镜像文件,参照xilinx wiki http://wiki.xilinx.com/zynq-rootfs

通过本小节的学习,在以后的开发中,可以更加顺利的修改文件系统,给设计带来方便。

更多更新请关注我的博客:@超群天晴 http://www.cnblogs.com/surpassal/

 

硬件平台:Digilent ZedBoard

开发环境:Windows XP 32 bit + Wmare 8.0 + Ubuntu 10.04 + arm-linux-xilinx-gnueabi交叉编译环境

Zedboard linux: Digilent OOB Design 

 

1、FHS(Filesystem Hierarchy Standard)标准介绍

当我们在linux下输入ls  / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统布局上都遵循FHS标准的建议规定。该标准规定了根目录下各个子目录的名称及其存放的内容:

目录名

存放的内容

/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源码,使用命令

git clone git://git.busybox.net/busybox

当然,和往常一样,为了给上不了国外网站的同学们提供便利,这里提供一个国内的下载链接:

busybox下载

下载后,切换到busybox目录,并进行默认配置

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

使用命令

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

打开可视化界面配置

ZYNQ 文件系统生成_第1张图片

逐一进入

BusyBox Settings->Installation Options->BusyBox installation prefix

ZYNQ 文件系统生成_第2张图片

将目录设置为

/home/devel/_rootfs

保存后退出,并安装busybox

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

安装好后,我们能够在/home/devel/_rootfs目录下看到生成了的bin sbin usr/bin usr/sbin 目录,其下包含了我们常用的命令,这些命令都是指向bin/busybox的软链接。

 3、安装Dropbear

我对dropbear的功能不是很明白,从百度上获取到的信息是“dropbear实现完整的SSH客户端和服务器版本2协议。它不支持SSH版本1 的向后兼容性,以节省空间和资源,并避免在SSH版本1的固有的安全漏洞。还实施了SCP的。SFTP支持依赖于一个二进制文件,可以通过提供的OpenSSH或类似的计划。”由于xilinx wiki上有这样的步骤,还是老老实实的做吧。

下载dropbear,并解压

wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.53.1.tar.gz tar xfvz dropbear-0.53.1.tar.gz

配置dropbear

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

编译

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

安装dropbear并创建符号链接

make install ln -s http://www.cnblogs.com/sbin/dropbear /home/devel/_rootfs/usr/bin/scp

4、利用交叉编译工具链,构建/lib目录


进入/home/devel/_rootfs,创建lib目录

cd /home/devel/_rootfs bash> mkdir lib

将交叉编译环境库拷贝到这个目录下

cp /opt/14.2/ISE_DS/EDK/gnu/arm/lin64/arm-xilinx-linux-gnueabi/libc/lib/* lib -r

同样,将工具链拷贝到sbin/和usr/bin/下

cp /opt/14.2/ISE_DS/EDK/gnu/arm/lin64/arm-xilinx-linux-gnueabi/libc/sbin/* sbin/ -r cp /opt/14.2/ISE_DS/EDK/gnu/arm/lin64/arm-xilinx-linux-gnueabi/libc/usr/bin/* usr/bin/ -r

注意:很多网友说,自己的电脑上没有lin64文件夹,只有nt文件夹。这个问题是由于在安装ISE版本是,操作系统32位/64位决定的。我在XP(32位)下安装时也只有nt文件夹,因而我选择一个“懒”的方法:把OOB中的lib/、sbin/bin、 usr/bin文件夹直接拷贝出来,相应替换掉。

 usr/bin目录文件下载

 sbin目录文件下载

 lib目录文件下载

 

5、创建其他目录和相应配置

至此,几个重要的目录和文件都已经创建完毕,需要安装FHS要求把其他目录和文件创建。切换到_rootfs目录下,使用命令

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

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

创建"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/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 /& echo "++ Starting dropbear (ssh) daemon" dropbear echo "rcS Complete"

复制代码

并设置其权限

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

BTW,我们的后续设计中,为了实现应用程序上电后自动启动运行,可以修改rcS文件内容,将应用程序执行命令写入到rcS文件中。

6、生成ramdisk镜像文件

至此,根文件系统所有需要的目录和文件已经准备完毕。查看_rootfs下的内容

ZYNQ 文件系统生成_第3张图片

这个根文件系统能够被执行,还需要将其制作成image镜像文件,并压缩。

接下来的操作如果和xilinx wiki上操作一致,最终的文件系统并不能被识别,所以这里介绍的和xilinx wiki有少许不同。

创建镜像文件ramdisk8M.image,并设置大小为8M,文件系统格式为ext2

cd ~ dd if=/dev/zero of=ramdisk8M.image bs=1024 count=8192 

count 如果小了会 出现:No space left on device错误 

这时可以更改 count 的值如: 16384 

 

 mke2fs -F ramdisk8M.image -L "ramdisk" -b 1024 -m 0 tune2fs ramdisk8M.image -i 0
chmod 777 ramdisk8M.image

大小可以按照需要自己调整,但是最好不要超过32M。

创建ramdisk目录,将ramdisk8M.image 挂载到该目录下,

mkdir ramdisk mount -o loop ramdisk8M.image ramdisk/ 

接下来,只需要将_rootfs目录下的内容全部拷贝到ramdisk下即可

cp -R /home/devel/_rootfs/* ramdisk 

注意,这里cp的参数一定是R而非r。

这样,这个镜像文件的内容就是_rootfs目录下的内容了。将其卸载就可

umount ramdisk/

到此,根文件系统镜像文件ramdisk8M.image 制作完成,将其压缩

gzip -9 ramdisk8M.image

生成ramdisk8M.image.gz文件,拷贝到SD上就可以了。

 

新版的U-BOOT 读取文件将提示

将提示ramdisk格式错误。

1、将uboot的tools目录下的mkimage拷贝到交叉编译器的bin目录中(相当于添加到环境变量中)

2、使用如下命令生成uramdisk.image.gz
   > mkimage -n 'uboot ext2 ramdisk' -A arm -O linux -T ramdisk -C gzip -d  ramdisk8M.image uramdisk.image.gz

生成uramdisk.image.gz文件,拷贝到SD上就可以了。

 

 

 

 

 

 

你可能感兴趣的:(ZYNQ 文件系统生成)