Image:是在Linux内核编译时,使用objcopy去掉vmlinux中的一些符号表等信息后,生成的仅包含可执行二进制数据的内核镜像。
Image是一个可引导的内核镜像文件,它包含了Linux内核和一些启动参数,所以可直接引导Linux
启动。不过Image没有经过压缩(it is Uncompressed kernel image)因此也比较大
在很多下,我们需要构造自定义的Linux内核镜像,当我们编译自定义内核时,可以将其生成为以下内核镜像之一:vmlinux,vmlinuz,vmlinux.bin,zimage和bzimage。 内核镜像是包含内核代码和其他组件的二进制表示形式的文件。内核镜像格式因压缩、体系结构和特定用例而异。
在Linux中,通常使用工具如dd
或cpio
来创建镜像文件。以下是使用dd
命令创建一个简单Linux镜像文件的例子:
假设你有一个ext4文件系统的目录/path/to/rootfs
,你想要创建一个1GB大小的镜像文件my_image.img
。
dd if=/dev/zero of=my_image.img bs=1M count=1024
mkfs.ext4 my_image.img
sudo mount -o loop my_image.img /mnt
sudo cp -a /path/to/rootfs/* /mnt/
sudo umount /mnt
原始的、未压缩的 Linux 内核镜像称为 vmlinux。vmlinux 是未压缩且不可引导形式的内核。这是生产vmlinuz的中间步骤。它包含调试符号以及完整且未修改的内核代码。
在大多数情况下,vmlinux 用于开发内核、调试和分析它们。vmlinux 镜像在加载到操作系统内核之前应该是可引导的。为了使它可引导,我们添加了一个多引导标头、引导扇区并设置例程。
Linux 前面的“vm”代表虚拟内存。在Linux中,我们可以使用一部分硬盘空间作为虚拟内存,因此得名“vm”。
Linux内核的编译过程,首先会将各个模块单独编译,然后链接并最终生成一个很大的文件,这个文件就是vmlinux.。其中当然包括初始化的代码,而整个Linux系统的起始地址这一重要信息在vmlinux.lds内(此文件是体系结构相关的)。以ARM为例,该文件是由arch/am/kerne/vmlinux.lds.S在编译链接时生成。下面先看看DM3730编译链接生成的该文件的部分内容。
vmlinuz是一个压缩的Linux内核镜像文件,用于引导Linux操作系统。当我们压缩vmlinux文件时,就创建了vmlinuz,压缩使用 gzip 算法,可减小文件大小,优化启动效率和启动期间的内存使用。当我们引导系统时,引导加载程序会从引导设备读取 vmlinuz 文件并将其解压缩到内存中,解压缩的内核镜像从内存运行。
vmlinux.bin 文件是在 Linux 内核源代码编译过程中生成的未压缩的二进制镜像。它包括整个编译的内核代码,以及调试符号和用于调试和分析的附加信息。
vmlinux.bin 镜像文件不能直接执行,并且太大而无法实际使用。因此,开发人员使用它来理解和分析 Linux 内核行为。VMLinux.bin 提供了更高的灵活性,允许根据特定要求进行定制。
zimage 是指一种独特的压缩内核镜像文件格式。zImage是vmlinux经过的gzip 压缩算法压缩后的文件,该镜像一般作为uboot的引导镜像文件,它支持32位和64位CPU,但是它只能被加载到内存地址低于16MB的位置。
我们必须注意,zimage 格式是典型的 x86 架构,其他架构可能不支持它。
bzImage即big Image,格式与zImage类似,它是通过Linux内核源码编译得到的vmlinux文件使用xz压缩算法得到的。它支持32位和64位CPU,而且可以被加载到内存地址高于16M的位置,相比于zImage,bzImage可以支持更大的内核。同样需要注意的是,bzImage只是一个可引导的内
核镜像,如果要运行完整的Liux系统,还需要加载文件系统、设备树等组件。
通常来讲,uImage:是较老版本uboot用的引导镜像文件,它是使用mkimage工具得到的,是在zImage前增加了一个64字节的头,这个头里面描述了内核版本号、编译时间、镜像文件类型、加载位置等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。现在的ubooti都已经支持了zImagel的启动,所以逐
渐很少使用到uImage了。既然它是基于zImage:生成的,那么它如果要运行完整的Linux系统,还需要加载文件系统、设备树等组件。
我们看到了内核映像格式,它们为我们提供了部署和引导 Linux 内核的不同选项。vmlinux 是未压缩的内核代码,Image是去除其中的符号和重定位信息等等,生成一个完全的二进制文件。vmlinuz 和 vmlinux.bin 是用于引导的压缩版本。zimage 是一种较旧的压缩格式,bzImage 是改进版本,uImage 则是与uboot结合的版本。
除了上述常见的镜像类型外,根据不同的应用场景和需求,还可以产生其他的镜像类型,比如,Docker镜像、虚拟机镜像、Live CD镜像等等。
最后,选择正确的内核映像格式取决于多种因素,例如用例、硬件架构、引导加载程序兼容性和压缩/优化要求。
参考:
Linux内核常用的几种镜像文件-电子发烧友网
https://www.zhihu.com/question/503003703/answer/3128562671