《linux ramdisk根文件系统的移植》由会员分享,可在线阅读,更多相关《linux ramdisk根文件系统的移植(10页珍藏版)》请在金锄头文库上搜索。
1、Linux ramdisk 根文件系统的移植一、移植前准备处理器平台:powerpc交叉编译工具:powerpc64-fsl-linux-gccBusyBox 源码:busybox-1.23.2.tar.bz2ramdisk 文件系统映像生成工具:genext2fs二、构建根文件系统2.1 建立根文件系统目录架构在当前用户目录下创建所要移植的根文件系统根目录,并命名为 rootfs。在该目录下,创建 FHS 标准(Filesystem Hierarchy Standard,文件系统科学分类标准)下 Linux 根文件系统的常用子目录,诸如 dev、etc 、home、bin、sbin 、mnt
2、 、lib 等。rootfs 及其相关子目录的创建由脚本 create_rootfs.sh 完成,create_rootfs.sh 内容如下:#!/bin/shecho -Create rootfs directons.cd mkdir rootfscd rootfsecho -Create root,dev.mkdir root dev etc bin sbin mnt sys proc lib home tmp var usrmkdir usr/sbin usr/bin usr/lib usr/modulesmkdir etc/init.d#mkdir mnt/usb mnt/nfs#mk
3、dir lib/modulesecho -make direction done-2.2 构建 dev 目录建立 dev 目录有两种方法:静态构建和动态构建,其中动态构建由 mdev 设备管理工具构建。1) 静态构建所谓静态构建,就是根据预先知道的所要挂载的驱动,用 mknod 命令逐一构建各种设备节点。至于其他设备文件,则需要在系统启动后,通过 cat /proc/devices 命令查看内核中注册了那些设备,然后再一一创建相应的设备文件。使用静态创建 dev 目录的缺点:不支持热插拔设备。2) 动态构建动态构建通过 mdev 设备管理工具来对 dev 目录进行构建。mdev 是 BusyB
4、ox 自带的一个简化版的 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这样,根文
5、件系统 dev 目录的设备文件就会在系统启动时自动生成。2.3 创建 etc 目录下相关配置文件2.3.1 /etc/inittabinittab 是内核启动过程中 init 进程所要读取的一个配置文件,其本身并不可以被执行。开发者可以在里面指定用户所要执行的各项操作。说明:本设计中,根文件系统的制作基于 BusyBox 完成,启动进程为 BusyBox init/sbin/init,与发行版 Linux 的 Sys V init 不同。inittab 文件中的每一条目有如下格式::1) idid 在 BusyBox 的 init 中与发行版 Linux 的 Sys V init 具有不同的意
6、义。对 BusyBox 而言,id 用来指定启动进程的控制终端 。如果所启动的进程并不是可以交互的 shell,例如BusyBox 的 sh(ash) ,应该会有个控制终端,如果控制终端不存在,BusyBox 的 sh 会报错。2) runlevel该字段指定运行等级,BusyBox init 忽略 runlevel 字段 ,所以配置 inittab 时空着它即可。3) actionaction 指定了不同的 inittab 动作,如下图所示。4) process该字段用来指定要执行的命令(含路径) ,包括命令行选项。根据需要,所编写的 inittab 脚本文件内容如下:#/etc/initt
7、ab#!/bin/shecho enter /etc/inittab:sysinit:/etc/init.d/rcS:respawn:-/bin/sh:restart:/sbin/initconsole:askfirst:-/bin/sh:ctrlaltdel:/bin/umount -a -r:shutdown:/bin/umount -a -r:shutdown:/sbin/swapoff aecho leave /etc/inittab2.3.2 /etc/init.d/rcSrcS 文件位于/etc/init.d 子目录下,是 BusyBox 版 init 进程启动后运行的第一个脚本(
8、常见的 init 还有发行版 Linux 的 Sys V init 版,其执行的相应脚本是/etc/rc.d/rc.sysinit)。/etc/init.d/rcS 的主要工作是完成各个文件系统的 mount。/etc/init.d/rcS 脚本文件内容如下:#/etc/init.d/rcS#!/bin/shecho enter /etc/init.d/rcSecho get hostname/bin/hostname -F /etc/hostnameecho Mount all/bin/mount -aecho Start mdev.echo /sbin/mdev /proc/sys/ker
9、nel/hotplug/sbin/mdev s/bin/hotplugecho leave /etc/init.d/rcS2.3.3 /etc/hostnamehostname 文件提供主机名,其内容只有简单的一行,如下所示:#/etc/hostnamelsh2.3.4 /etc/fstabfstab 脚本文件用于指定系统中的文件系统信息。/etc/init.d/rcS 中的 mount a 命令将会加载该文件中的所有文件系统。在该文件中,每种文件系统对应一个独立的行,每行中的字段都由空格或 tab 键分开。同时,fsck、umount 等命令也都利用该程序。/etc/fstab 脚本文件内容
10、如下:#/etc/fstab: static file system information.#!/bin/sh# echo enter /etc/fstabproc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0mdev /dev ramfs defaults 0 0none /tmp ramfs defaults 0 0echo leave /etc/fstab2.3.5 /etc/mdev.confmdev 会在/etc 目录下查找 mdev 的配置文件:mdev.conf。如果该文件不存在,那么在执行 mdev s 这个命令时,
11、就会提示找不到 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
12、(int argc UNUSED_PARAM, char *argv)if (argv0 & argv00 = -)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/shech
13、o enter /etc/profileecho set user pathPATH=/bin:/sbin:/usr/bin:/usr/sbinecho set search library pathLD_LIBRARY_PATH=/lib:/usr/libHOSTNAME=/bin/hostnameecho set PS1PS1=uh:w$ #设置命令提示符为 ubuntu 风格export PATH LD_LIBRARY_PATH HOSTNAME PS1echo leave /etc/profile2.3.7 passwd、group、shadow 等配置文件passwd、group、s
14、hadow 等配置文件不需要我们自己去创建,拷贝主机 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
15、 busybox-1.23.2.tar.bz23.2 交叉编译环境配置交叉编译环境变量配置命令如下:其主要是修改了如下两个环境变量,分别指定处理器平台和交叉编译工具:ARCH=powerpcCROSS_COMPILE=powerpc64-fsl-linux-3.3 BusyBox 配置切换至解压后的 BusyBox 源码目录,在控制台终端输入 make menuconfig 命令进行BusyBox 的相关配置,配置项如下:a. 编译 BusyBox 为静态链接库。这一项将 BusyBox 编译为静态链接,可以减少启动时查找动态链接库的时间,避免相关库文件移植所带来的繁琐。此外,还需要在该配置界
16、面“Cross Compiler prefix”选项中,输入所使用的交叉编译工具链前缀,这里我们使用 B4860 SDK 提供的工具链,因此这里输入“powerpc64-fsl-linux-”即可。注意:在这里已经将 B4860 SDK 工具链的相关命令路径提交给主机 Linux 系统的PATH 环境变量(/opt/fsl-networking/QorIQ-SDK-V1.6/environment-setup-ppc64e6500-fsl-linux 脚本文件中已添加 B4860 SDK 工具链的相关命令路径) ,使其为默认路径,否则将需要在这里提供完成的交叉编译路径。b. BusyBox 指令的裁剪,其中包括对 Archival Utilies(g