您的当前位置:首页正文

Linuxramdisk根文件系统的移植

来源:九壹网


Linuxramdisk根文件系统的移植

Linux ramdisk根文件系统的移植

一、移植前准备

处理器平台:powerpc

交叉编译工具:powerpc64-fsl-linux-gcc

BusyBox源码:busybox-1.23.2.tar.bz2

ramdisk文件系统映像生成工具:genext2fs

二、构建根文件系统

2.1 建立根文件系统目录架构

在当前用户目录下创建所要移植的根文件系统根目录,并命名为rootfs。在该目录下,创建FHS标准(Filesystem Hierarchy Standard,文件系统科学分类标准)下Linux根文件系统的常用子目录,诸如dev、etc、home、bin、sbin、mnt、lib等。

rootfs及其相关子目录的创建由脚本create_rootfs.sh完成,create_rootfs.sh内容如下:#!/bin/sh

echo \"------Create rootfs directons......\"

cd ~

mkdir rootfs

cd rootfs

echo \"--------Create root,dev......\"

mkdir root dev etc bin sbin mnt sys proc lib home tmp var usr

mkdir usr/sbin usr/bin usr/lib usr/modules

mkdir etc/init.d

#mkdir mnt/usb mnt/nfs

#mkdir lib/modules

echo \"-------make direction done---------\"

2.2 构建dev目录

建立dev目录有两种方法:静态构建和动态构建,其中动态构建由mdev设备管理工具构建。

1)静态构建

所谓静态构建,就是根据预先知道的所要挂载的驱动,用mknod命令逐一构建各种设备节点。至于其他设备文件,则需要在系统启动后,通过cat /proc/devices命令查看内核中注册了那些设备,然后再一一创建相应的设备文件。

使用静态创建dev目录的缺点:不支持热插拔设备。

2)动态构建

动态构建通过mdev设备管理工具来对dev目录进行构建。mdev是BusyBox自带的一个简化版的udev,其具有使用简单、适合于嵌入式应用场合的特点。mdev可在系统启动或动态加载驱动程序时,通过读取内核相应信息来动态创建设备文件或设备节点。

在本设计中,对于dev目录的构建我们采用动态构建的方式进行。需要说明的是,mdev 是由init 进程来启动的,在使用mdev 构建dev目录前,init 进程需要用到/dev/console 和/dev/null 这两个设备文件。因此,我们需要事先静态创建console与null这两个设备文件。

# sudo mknod console c 5 1

# sudo mknod null c 1 3

这样,根文件系统dev目录的设备文件就会在系统启动时自动生成。

2.3 创建etc目录下相关配置文件

2.3.1 /etc/inittab

inittab是内核启动过程中init进程所要读取的一个配置文件,其本身并不可以被执行。开发者可以在里面指定用户所要执行的各项操作。

说明:本设计中,根文件系统的制作基于BusyBox完成,启动进程为BusyBox init——/sbin/init,与发行版Linux的Sys V init不同。

inittab文件中的每一条目有如下格式:

:::

1)id

id在BusyBox的init中与发行版Linux的Sys V init具有不同的意义。对BusyBox而言,id用来指定启动进程的控制终端。如果所启动的进程并不是可以交互的shell,例如BusyBox 的sh(ash),应该会有个控制终端,如果控制终端不存在,BusyBox的sh会报错。

2)runlevel

该字段指定运行等级,BusyBox init忽略runlevel字段,所以配置inittab时空着它即可。

3)action

action指定了不同的inittab动作,如下图所示。

4)process

该字段用来指定要执行的命令(含路径),包括命令行选项。

根据需要,所编写的inittab脚本文件内容如下:

#/etc/inittab

#!/bin/sh

echo \"enter /etc/inittab\"

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::restart:/sbin/init

console::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount -a -r

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff –a

echo \"leave /etc/inittab\"

2.3.2 /etc/init.d/rcS

rcS 文件位于/etc/init.d子目录下,是BusyBox版init进程启动后运行的第一个脚本(常见的init还有发行版Linux的Sys V init版,其执行的相应脚本是/etc/rc.d/rc.sysinit)。/etc/init.d/rcS 的主要工作是完成各个文件系统的mount。

/etc/init.d/rcS脚本文件内容如下:

#/etc/init.d/rcS

#!/bin/sh

echo \"enter /etc/init.d/rcS\"

echo \"get hostname\"

/bin/hostname -F /etc/hostname

echo \" Mount all\"

/bin/mount -a

echo \" Start mdev....\"

echo /sbin/mdev > /proc/sys/kernel/hotplug

/sbin/mdev –s

/bin/hotplug

echo \"leave /etc/init.d/rcS\"

2.3.3 /etc/hostname

hostname文件提供主机名,其内容只有简单的一行,如下所示:

#/etc/hostname

lsh

2.3.4 /etc/fstab

fstab 脚本文件用于指定系统中的文件系统信息。/etc/init.d/rcS中的mount –a命令将会加载该文件中的所有文件系统。在该文件中,每种文件系统对应一个独立的行,每

行中的字段都由空格或tab键分开。同时,fsck、umount等命令也都利用该程序。

/etc/fstab脚本文件内容如下:

#/etc/fstab: static file system information.

#!/bin/sh

#

echo \"enter /etc/fstab\"

proc /proc proc defaults 0 0

sysfs /sys sysfs defaults 0 0

mdev /dev ramfs defaults 0 0

none /tmp ramfs defaults 0 0

echo \"leave /etc/fstab\"

2.3.5 /etc/mdev.conf

mdev 会在/etc目录下查找mdev的配置文件:mdev.conf。如果该文件不存在,那么在执行mdev –s这个命令时,就会提示找不到mdev.conf。我们并不需要mdev规则,

所以使用touch命令生成一个空文件就好。当然也可以根据mdev的规则来编写mdev.conf。

2.3.6 /etc/profile

/etc/inittab文件中的“::respawn:-/bin/sh”和“console::askfirst:-/bin/sh”中的“-”表示的是让BusyBox开启一个登录(login)shell,login shell在执行前都会读取配置文件/etc/profile或者.profile。由BusyBox源码的shell/ash.c文件可知这一点:

int ash_main(int argc UNUSED_PARAM, char **argv)

{

…………

if (argv[0] && argv[0][0] == '-')

isloginsh = 1;

if (isloginsh) {

const char *hp;

state = 1;

read_profile(\"/etc/profile\");

state1:

state = 2;

hp = lookupvar(“HOME”);

if(hp){

hp = concat_path_file(hp, “.profile”);read_profile(hp);

free((char *)hp)

}

}

…………

}

/etc/profile文件内容如下:#/etc/profile

#!/bin/sh

echo \"enter /etc/profile\"

echo \"set user path\"

PATH=/bin:/sbin:/usr/bin:/usr/sbin

echo \"set search library path\"

LD_LIBRARY_PA TH=/lib:/usr/lib

HOSTNAME='/bin/hostname'

echo \"set PS1\"

PS1='\:\\w\\$' #设置命令提示符为ubuntu风格

export PATH LD_LIBRARY_PA TH HOSTNAME PS1

echo \"leave /etc/profile\"

2.3.7 passwd、group、shadow等配置文件

passwd、group、shadow等配置文件不需要我们自己去创建,拷贝主机etc目录下的passwd、group、shadow文件到/rootfs/etc目录下即可。

2.4 构建lib目录

若BusyBox配置为静态链接库,在主机上配置好交叉编译环境后,将主机交叉编译环境相关lib库文件根据需求拷贝到根文件系统/rootfs/lib目录下即可。

至此,已完成了Linux根文件系统目录架构的构建。

三、使用BusyBox制作Linux命令工具集

3.1 解压BusyBox

将所下载的BusyBox压缩包拷贝至当前用户家目录下,进行解压缩。

$ cd ~/my_folder

$ tar xvf busybox-1.23.2.tar.bz2

3.2 交叉编译环境配置

交叉编译环境变量配置命令如下:

其主要是修改了如下两个环境变量,分别指定处理器平台和交叉编译工具:

ARCH=powerpc

CROSS_COMPILE=powerpc64-fsl-linux-

3.3 BusyBox配置

切换至解压后的BusyBox源码目录,在控制台终端输入make menuconfig命令进行BusyBox的相关配置,配置项如下:

a. 编译BusyBox为静态链接库。这一项将BusyBox编译为静态链接,可以减少启动时查找动态链接库的时间,避免相关库文件移植所带来的繁琐。

此外,还需要在该配置界面“Cross Compiler prefix”选项中,输入所使用的交叉编译工

具链前缀,这里我们使用B4860 SDK提供的工具链,因此这里输入“powerpc64-fsl-linux-”即可。

注意:在这里已经将B4860 SDK工具链的相关命令路径提交给主机Linux系统的PA TH 环境变量(/opt/fsl-networking/QorIQ-SDK-V1.6/environment-setup-ppc64e6500-fsl-linux脚本文件中已添加B4860 SDK工具链的相关命令路径),使其为默认路径,否则将需要在这里提供完成的交叉编译路径。

b. BusyBox指令的裁剪,其中包括对Archival Utilies(gzip、tar等文件压缩解压指令集)以及Coreutils(常用指令集)指令集的裁剪。

c. 设置Linux System Utilities选项,增加对mdev的支持;

3.4 BusyBox编译

在BusyBox目录下,执行make命令即可进行BusyBox的编译操作。在编译完成后,输入命令“make install”,将会把所编译生成的所有命令目录输出到./_install目录中(该目录可配置)。

在编译过程中,出现以下错误:

解决方法是,进入BusyBox配置菜单,去掉如下选项:

Networking Utilities -> [] inetd(Internet超级服务器);

3.5 BusyBox安装

接着运行命令“make install”进行安装。安装完毕后会在BusyBox的根目录下生成一个_install目录。在_install目录下有bin、sbin和usr目录以及一个linuxrc链接文件。bin和sbin 目录中全是指向BusyBox命令文件的链接文件。如下所示。

linuxrc也是一个指向busybox命令文件的链接文件,linuxrc是BusyBox提供的init程序,和/sbin/init程序的作用是相同的。如果要使用linuxrc程序,只需要在内核的启动命令参数中通过“init=linuxrc”进行设定。

3.6 命令工具集拷贝

将_install目录下生成的bin、sbin、usr目录拷贝至rootfs目录下。至此,已完成了使用BusyBox制作Linux命令工具集的整个过程。

四、制作ramdisk根文件系统映像文件

4.1 ramdisk文件系统映像制作工具genext2fs

ramdisk文件系统映像制作工具genext2fs可以通过下载genext2fs源码包,然后依次执行以下命令生成:

$ ./configure --host=powerpc

$ make

$ make install

上述配置、编译以及安装步骤皆是在交叉编译开发环境下进行的,因此需要事先进行交叉编译环境的配置,配置方法已在前面的叙述中进行阐述。默认情况下,所生成的命令以及相关库文件被安装到目录/usr/local下,该安装目录可通过./configure –prefix=***来进行指定。

4.2 使用genext2fs生成ramdisk文件系统映像

使用genext2fs生成ramdisk文件系统映像的命令如下:

$ genext2fs –b 7168–d ~/my_folder/rootfs ramdisk

其中,-b指定所生成的映像文件的大小,以Kbyte为单位(可通过命令du –h ~/my_folder/rootfs计算出来);-d指定要制作的根文件系统目录;最后的ramdisk指定生成的映像文件的名字。

接下来,需要将所生成的ramdisk文件系统映像文件进行压缩,命令如下:

$ gip -9 –f ramdisk

该命令将ramdisk文件系统映像文件以最优方式压缩为ramdisk.gz。最后,把生成

的ramdisk.gz文件以及内核映像下载至目标板启动即可。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top