img镜像的制作

initrd对于嵌入式来说就是最终的文件系统了。但是对于在桌面或服务器Linux 系统中,initrd 是一个临时的文件系统,这样的话initrd就可以引导真实的文件系统。

现在我们已经了解了如何构建并使用定制的初始 RAM磁盘,本节将探索 内核是如何识别 initrd 并将其作为 根文件系统进行挂载的。我们将介绍启动链中的几个主要函数,并解释一下到底在进行什么操作。
引导加载程序,例如 GRUB,定义了要加载的内核,并将这个内核映像以及相关的 initrd 拷贝到内存中。我们可以在 Linux内核源代码目录中的 ./init 子目录中找到很多这种功能。
在内核和 initrd映像被解压并拷贝到内存中之后,内核就会被调用了。它会执行不同的初始化操作,最终您会发现自己到了init/main.c:init()(subdir/file:function)函数中。这个函数执行了大量的子系统初始化操作。此处会执行一个对init/do_mounts.c:prepare_namespace() 的调用,这个函数用来准备 名称空间(挂载 dev 文件系统、RAID或 md、设备以及最后的 initrd)。加载 initrd 是通过调用init/do_mounts_initrd.c:initrd_load() 实现的。
initrd_load() 函数调用了init/do_mounts_rd.c:rd_load_image(),它通过调用init/do_mounts_rd.c:identify_ ramdisk_image() 来确定要加载哪个 RAM磁盘。这个函数会检查 映像文件的 magic 号来确定它是 minux、etc2、romfs、cramfs 或 gzip 格式。在返回到initrd_load_image 之前,它还会调用 init/do_mounts_rd:crd_load()。这个函数负责为 RAM磁盘分配空间,并计算 循环冗余校验码(CRC),然后对 RAM磁盘映像进行解压,并将其加载到内存中。现在,我们在一个适合挂载的 块设备中就有了这个 initrd 映像。
现在使用一个 init/do_mounts.c:mount_root()调用将这个块设备挂载到 根文件系统上。它会创建根设备,并调用 init/do_mounts.c:mount_block_root()。在这里调用init/do_mounts.c:do_mount_root(),后者又会调用 fs/namespace.c:sys_mount()来真正挂载根文件系统,然后 chdir 到这个文件系统中。这就是我们在清单 6 中所看到的熟悉消息 VFS: Mounted root(ext2 file system). 的地方。
最后,返回到 init 函数中,并调用init/main.c:run_init_process。这会导致调用 execve 来启动 init 进程(在本例中是/ linuxrc)。linuxrc 可以是一个可执行程序,也可以是一个脚本(条件是它有脚本 解释器可用)。
这些函数的调用层次结构如清单 7 所示。尽管此处并没有列出拷贝和挂载初始 RAM磁盘所涉及的所有函数,但是这足以为我们提供一个整体流程的粗略框架。
。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 是永久根文件系统


img:一般制作文件系统镜像,有四种种方式(cpio和dd if=/dev/null of=a.img bs=1024 count=4000)包括initrd(驱动,屏蔽了对不同硬件的适配,没必要把所有的驱动编译到内核中去)、和ram的文件系统制作文件系统镜像

第一种:cpio方式

解开一个cpio initrd: 
> mkdir work 
> cp /boot/initrd.img ./initrd.img.gz 
> gunzip -c initrd.img.gz 
> cpio -i --make-directories < initrd.img

生成initrd

find . | cpio -o -H newc | gzip >initrd.img
(注:-H newc 是必须的,否则内核会认为是ramdisk,而不是initramfs)区别见:Michael的文章

也可以用mkyaffs2image这个工具制作到友善之臂http://www.arm9.net/ 网站下载根文件系统制作工具mkyaffs2image.tgz。 

也可以制作img文件。使用命令mkyaffs2image rootfs rootfs.img生成根文件系统映像文件。

第二种:filesystem data 

1、dd if=/dev/zero of=/tmp/ramdisk.img bs=1024 count=4000

2、/sbin/mke2fs -F -m 0 -b 1024 /tmp/ramdisk.img 4000

3、mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop

4、制作文件的文件夹

       mkdir /mnt/initrd/bin

mkdir /mnt/initrd/sys
mkdir /mnt/initrd/dev
mkdir /mnt/initrd/proc
# Grab busyboxand create the symbolic links
pushd /mnt/initrd/bin
cp /usr/local/src/busybox-1.1.1/busybox.
ln -sbusybox ash
ln -sbusybox mount
ln -sbusybox echo
ln -sbusybox ls
ln -sbusybox cat
ln -sbusybox ps
ln -s busybox dmesg
ln -sbusybox sysctl
popd
# Grab the necessary dev files
cp -a /dev/console /mnt/initrd/dev
cp -a /dev/ ramdisk /mnt/initrd/dev
cp -a /dev/ram0 /mnt/initrd/dev
cp -a /dev/null /mnt/initrd/dev
cp -a /dev/tty1 /mnt/initrd/dev
cp -a /dev/tty2 /mnt/initrd/dev
# Equate sbin with bin
pushd /mnt/initrd
ln -s bin sbin
popd
# Create the init file
cat >> /mnt/initrd/ linuxrc << EOF  //这个是第一个进程,当init进程不存在就会执行 inux rc文件
#!/bin/ash
echo
echo "Simple initrd is active"
echo
mount -t proc /proc /proc
mount -t sysfs none /sys
/bin/ash --login
EOF
chmod +x /mnt/initrd/linuxrc
# Finish up...
umount /mnt/initrd
5、做成gzip格式
gzip -9 /tmp/ ram disk.img
6、拷贝到boot下面就可以使用了
cp /tmp/ramdisk.img.gz  /boot/ramdisk.img.gz

第三种:mkinitrd工具

1、建立要载入ramdisk的映像文件。mkinitrd(make initial ramdisk images)

2、语法:mkinitrd [-fv][--omit-scsi-modules][--version][--preload=<模块名称>][--with=<模块名称>][映像文件][Kernel 版本]
3、mkinitrd可建立映像文件,以供Linux开机时载入ramdisk。
4、参数说明:

-f 若指定的映像问家名称与现有文件重复,则覆盖现有的文件。
-v  执行时显示详细的信息。
--omit-scsi-modules 不要载入SCSI模块。
--preload=<模块名称> 指定要载入的模块。
--with=<模块名称> 指定要载入的模块。
--version 显示版本信息。

第四种工具: mkinitcpio
详细见archwikiArchWiki


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
制作Ubuntu的img镜像文件可以通过使用Ubuntu Live CD或者命令行来完成。下面是一个基本的步骤示例来制作Ubuntu的img镜像文件: 1. 首先,你需要一台运行着Ubuntu操作系统的电脑,可以是物理机或者虚拟机。 2. 使用Ubuntu Live CD引导电脑进入Ubuntu Live环境。确保您有足够的存储空间来创建和存放镜像文件。 3. 打开终端,使用命令行执行以下命令来创建一个img文件,其中“/path/to/your/folder”是你想要保存镜像文件的文件夹的路径,而“ubuntu.img”是你想要给镜像文件的名称: ``` sudo dd if=/dev/zero of=/path/to/your/folder/ubuntu.img bs=1M count=5000 ``` 这个命令将创建一个5000MB大小的img文件。你可以根据需要调整大小。 4. 创建文件系统并将其挂载到一个临时目录中。使用以下命令: ``` sudo mkfs.ext4 /path/to/your/folder/ubuntu.img sudo mkdir /tmp/img_mount sudo mount /path/to/your/folder/ubuntu.img /tmp/img_mount ``` 5. 下一步是从您的Ubuntu Live环境中复制文件系统。使用以下命令来复制系统文件: ``` sudo rsync --progress -aAXv --exclude="/tmp/*" --exclude="/var/tmp/*" --exclude="/proc/*" --exclude="/sys/*" --exclude="/mnt/*" --exclude="/media/*" --exclude="/dev/*" --exclude="/lost+found" --exclude="/home/*/.gvfs" --exclude="/home/*/.cache" --exclude="/home/*/.thumbnails" --exclude="/home/*/.config/chromium" --exclude="/home/*/.local/share/Trash" / /tmp/img_mount ``` 这个命令将复制整个文件系统到你的img镜像文件中。 6. 复制完成后,可能需要更新fstab文件,以确保镜像文件在启动时正确挂载。在终端中执行以下命令: ``` sudo nano /tmp/img_mount/etc/fstab ``` 检查fstab文件的内容并进行必要的更改。 7. 现在,卸载临时目录中的镜像文件系统并关闭终端。使用以下命令来卸载: ``` sudo umount /tmp/img_mount ``` 8. 至此,你已经成功制作了Ubuntu的img镜像文件。你可以将它转移到其他设备上并使用工具写入到USB驱动器或SD卡中进行引导。 请注意,在制作img镜像文件时需要小心,确保您选择了正确的目标设备,并备份重要数据,以防止意外数据丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值