首页 > 代码库 > 如何创建Linux Initrd

如何创建Linux Initrd

Linux初始RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再讲这个initrd RAM磁盘卸载,并释放内存。在很多嵌入式Linux系统中,initrd就是最终的根文件系统。

创建Linux initrd的 大致流程如下:

1、格式化一个Ramdisk;

2、加载文件系统内容到Ramdisk;

3、将Ramdisk作为根文件系统。

initrd主要由两个格式:传统的Ramdisk和cpio格式,cpio格式的好处是内核原生不需要额外的文件系统支持。创建initrd的方法有:软盘制作(过时)、Ramdisk和loop设备制作(/dev/loop)。


一、通过Ramdisk制作initrd。

$ dd if=/dev/ram0 of=/myfs/initrd
$ mkfs.ext2 /dev/ram0
$ mount /dev/ram0 /mnt
$ cp -rf /myfs/rootfs/* /mnt

$ gzip -9 /myfs/initrd

注:/myfs/rootfs中包含的是定制的根文件系统的内容。

这个过程最能解释initrd的本质,对于Linux来说,Ramdisk的一个块设备,而initrd是这个块设备上所有内容的“克隆”而来的文件。内核中加载initrd的相关代码则将这个文件恢复到Ramdisk中去。


二、通过loop设备制作initrd。

$ dd if=/dev/zero of=/myfs/initrd bs=1024 count=122880 # 制作一个120M的空白文件
$ losetup /dev/loop0 /myfs/initrd                      # 映射到loop设备上;
$ mkfs.ext2 /dev/loop0                                 # 创建文件系统;
$ mount /dev/loop0 /mnt
$ cp -rf /myfs/rootfs/* /mnt                           # 复制需要的文件;
$ umount /mnt
$ losetup -d /dev/loop0
$ gzip -9 /myfs/initrd
三、通过cpio来制作initrd。
$ cd /myfs/rootfs                    # 到需要复制的文件的目录
$ find . |cpio -o -H newc |gzip -c > ../initrd.gz