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文件以及内核映像下载至目标板启动即可。
因篇幅问题不能全部显示,请点此查看更多更全内容