如何创建Linux Initrd

2019-07-13 05:13发布

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