精通initramfs构建stepbystepWord下载.docx
- 文档编号:13734956
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:19
- 大小:28.86KB
精通initramfs构建stepbystepWord下载.docx
《精通initramfs构建stepbystepWord下载.docx》由会员分享,可在线阅读,更多相关《精通initramfs构建stepbystepWord下载.docx(19页珍藏版)》请在冰豆网上搜索。
缺省情况下,initramfs是空的,X86架构下的文件大小是134个字节。
二、构建第一个initramfs:
helloworld
从C语言开始,学习计算机编程语言的第一个程序几乎都是helloworld,因此我们也构建一个最简单的helloworld式的initramfs,以说明initramfs的基本构建方法。
initramfs的灵魂是init文件(或者叫程序,因为它会被内核第一个执行),我们先写一个简单的init程序,它会在内核的console中打印出经典的helloworld信息。
hello.c:
#includestdio.h
#includeunistd.hintmain(intargc,charargv)
{
printf("
helloworld,frominitramfs.\n"
);
sleep(9999999);
return0;
}
其中的sleep()函数语句是为了避免执行时内核很快打出panic的信息,并非功能上的需要。
接着把hello.c编译成静态连接程序:
gcc-ohello_static-static-shello.c
命令行中的-s参数表示编译后的程序不包含调试定位信息,目的是减少编译出来的程序文件的大小。
再创建一个initramfs的构建源文件目录image,把hello_static程序拷入这个目录,并改名为init。
在image目录下,创建一个dev/console的设备文件,否init程序无法在内核console中输出信息:
mknod-m600dev/consolec51
注意,执行这个命令需要有root权限。
好了,现在可以设置内核配置参数,进行initramfs的构建了:
在generalsetup配置目录下的initramfssources配置项下输入image的路径名,比如我的路径就是/home/wyk/initramfs-test/image。
因为我们的init程序是ELF格式的,所以内核需要支持ELF的可执行文件,否则启动这个init程序会失败。
在内核的Executablefileformats配置目录下,选择kernelsupportforELFbinaries,则可使内核支持ELF格式的可执行文件。
其他内核配置参数根据实际需要设置即可,不过,为了减少内核编译时间,可参考这篇文章设置一个最简单的内核配置。
内核配置参数设置完成后,按常规的内核编译方法进行编译,initramfs就自动连接到编译好的内核映像文件中了。
三、试验环境搭建
试验initramfs需要经常重启系统,所以使用CPU模拟器是不错的选择。
我们可以选用qemu,它支持直接启动linux内核,无需在模拟器中安装OS。
从方便使用的角度考虑,我们采用qemulauncher设置qemu的各项参数,它的安装可参考。
在qemulauncher的linux配置标签中,打勾直接启动linux,然后在下面的文本框中填上刚才编译好的内核映像文件的路径名。
因为qemu的运行还需要设置硬盘映像文件,所以还需要在左边的配置标签中新建一个硬盘映像文件,但实际上我们并不使用硬盘。
配置好qemu的参数后,点击launcher按钮,内核就开始在qemu中运行了。
内核输出一堆内核运行信息后,最后打出了
helloworld,frominitramfs.
哈哈,我们构建的initramfs已经能够正常工作了~
(二)initramfs的前世今生四、什么是rootfs和ramfs
所有的2.6版本linux内核都有一个特殊的文件系统rootfs,是内核启动的初始始根文件系统,initramfs的文件会复制到rootfs。
如果把initramfs比作种子,那么rootfs就是它生长的土壤。
大部分linux系统正常运行后都会安装另外的文件系统,然后忽略rootfs。
rootfs是ramfs文件系统的一个特殊实例。
ramfs是一种非常简单的文件系统,是基于内存的文件系统。
ramfs文件系统没有容量大小的限制,它可以根据需要动态增加容量。
ramfs直接利用了内核的磁盘高速缓存机制。
所有的文件的读写数据都会在内存中做高速缓存(cache),当系统再次使用文件数据时,可以直接从内存中读写,以提供系统的I/O性能。
高速缓存中的写入数据会在适当的时候回写到
如磁盘等)中,这时它的状态就标识为clean,这样系统对应的文件系统设备(
在必要时可以释放掉这些内存。
ramfs没有对应文件系统设备,所以它的数据永远都不会回写回去,也就不会标识为clean,因此系统也永远不会释放ramfs所占用的内存。
因为ramfs直接使用了内核已有的磁盘高速缓存机制,所以它的实现代码非常小。
也由于这个原因,ramfs特性不能通过内核配置参数删除,它是内核的天然特性。
五、ramfs不是ramdiskramdisk是在一块内存区域中创建的块设备,用于存放文件系统。
ramdisk的容量是固定的,不能象ramfs一样动态增长。
ramdisk需要内核的文件系统驱动程序(如ext2)来操作其上的数据,而ramfs则是内核的天然特性,无需额外的驱动程序。
ramdisk也象其他文件系统设备一样,需要在块设备和内存中的磁盘高速缓存之间复制数据,而这种数据复制实际不必要的。
六、从ramfs派生的文件系统tmpfsramfs的一个缺点是它可能不停的动态增长直到耗尽系统的全部内存,所以只有root或授权用户允许使用ramfs。
为了解决这个问题,从ramfs派生出了tmpfs文件系统,增加了容量大小的限制,而且允许把数据写入交换分区。
由于增加了这两个特性,所以tmpfs允许普通用户使用。
关于tmpfs文件系统更多的信息,可以看内核源码中的
Documentation/filesystems/tmpfs.txt文档。
综上所述,initramfs是一种ramfs文件系统,在内核启动完成后把它复制到rootfs中,作为内核初始的根文件系统,它的任务是挂载系统真正的根文件系统。
这就是initramfs的前世今生。
(三):
busybox七、什么是busyboxbusybox号称是嵌入式Linux中的瑞士军刀--小巧、功能齐全。
它把许多常用的Linux命令都集成到一个单一的可执行程序中,只用这一个可执行程序(即busybox)加上Linux内核就可以构建一个基本的Linux系统。
busybox程序非
常小巧,包含全部命令可执行文件大小也只有750多K。
busybox是完全模块化的,可以很容易地在编译时增加、删除其中包含的命令。
由于busybox的这些特点,它广泛应用于LiveCD、应急修复盘、安装盘等系统中。
我们也是以它为基础,构建initramfs。
八、busybox的配置、编译和安装
(1)去去下载最新的源码,解压展开。
(2)用
makemenuconfig
命令启动配置界面配置,配置busybox的特性、选择要包含在busybox的命令(busybox称为applet);
也可以用
makedefconfig
命令做缺省配置,包含全部的applet。
另外两个配置命令是
makeallyesconfig--最大配置
makeallnoconfig--最小配置
它们和makedefconfig命令都可以用来作为自定义配置的初始配置,然后再用makemenuconfing命令做定制化配置。
为了简单,我们用makedefconfig做缺省配置。
(3)用
make
命令编译busybox软件。
(4)用
makeCONFIG_PREFIX=安装目录install
命令安装。
如果在命令行中省略CONFIG_PREFIX变量的赋值,则会安装缺省值./_install目录下。
CONFIG_PREFIX可以在makemenuconfig的配置界面中修改。
我们用makeCONFIG_PREFIX=~/initramfs-test/image命令把busybox安装到initramfs的构建目录中。
(5)缺省配置下,busybox动态链接到glibc,所以要把它用到的动态库复制到initramfs的构建目录中。
用ldd命令查看busybox用到了哪些动态库文件及相应的文件路径,然后把它们复制到相应的目录下即可。
我们编译的busybox需要向image/lib目录下复制
ld-linux.so.2libc.so.6libcrypt.so.1libm.so.6
动态库文件。
九、在image下创建必要的目录和设备文件
(1)在imgae目录下创建
proc,sys,etc,mnt
四个目录
(2)helloworld已经创建了console设备文件,我们再用
mknod-m600dev/nullc13
命令创建另一个基本的设备文件。
十、试验一下
busybox的构建和准备工作做完了,我们试验一下吧:
在image目录下以root用户权限--
(1)用
mount-vtprocproc=procmount-vtsysfssysfs=sys
命令安装内核虚拟文件系统
mount-v-obind/devdev
命令绑定/dev的设备文件到image/dev
chroot./bin/sh
命令进入busybox的环境。
出现shell的命令提示符,可以试着输入几个命令,看看执行结果。
例如,输入fdisk-l命令看看是否能显示硬盘的分区。
(四):
minilinux十一、自动生成/dev下的设备文件
上节用chroot方法试验busybox时,为了简单,是用"
绑定"
的方式把主机的/dev中的设备文件映射到image目录下的dev目录。
在initramfs上,这种方法显然不能使用。
生成系统的设备文件,现在通常都是用udev动态生成,而initramfs为了做到通用,动态生成的要求是必须的。
在busybox中有一个mdev命令,就是用来动态生成设备文件,填充到/dev目录的。
在系统启动时,用
mdev-s
命令可以根据内核的sysfs文件系统在/dev目录中自动生成相应的设备文件。
命令执行前,需要先挂载内核的proc和sysfs虚拟文件系统。
十二、初始身手
解决了自
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精通 initramfs 构建 stepbystep