linux内核的文件都在哪儿

说实话,Linux内核文件还是挺有趣的。
我在摆弄系统时也昏迷了一会儿。
首先,我们来谈谈存储位置。
/boot 目录中的文件是标准文件,例如 vmlinuz 或 vmlinux。
/usr/src 中的内核源代码是您可以真正看到“内核是什么样子”的地方。
一眼就能看出是哪个版本编译的。

我们以vmlinux和zImage为例。
这两种现象尤其密切相关。
vmlinux 是一个已编译但未压缩的源内核,大小可达数十 MB。
当使用直接内存和CPU时,这是不够的。
zImage 是 vmlinux 的 gzip 压缩版本。
压缩比可以达到大约2 :1 文件大小只有一半,但解压需要一些时间。
我曾经在一台旧台式电脑上安装系统,硬盘速度很慢。
安装zImage比直接使用vmlinux更容易。

bzImage 和 zImage 之间的主要区别在于加载内存的位置。
bzImage是一个“大zImage”,名称中带有“b”,但它没有使用bzip2 压缩,很容易混淆。
区别在于解包方式:zImage被扔到低性能内存(前6 4 0KB)中解包,bzImage被扔到高性能内存(1 MB以上)中解包。
当时有一天我安装了内核,系统就卡在启动画面了。
后来发现是内存冲突,所以就用了bzImage。
当内核较大时,使用bzImage更稳定,无需争夺解压位置。

uImage 专门用于 U-Boot 引导加载程序。
它在 zImage 之前添加了一个 4 0 字节的 header,它就像一个 ID,清楚地指示了文件类型、下载位置、生成时间等。
U-Boot 看到这个 header 就知道要做什么,而不需要手动设置一堆参数。
当我做嵌入式开发时,直接使用uImage比zImage容易得多。
事实上,如果去掉 header,uImage 和 zImage 没有什么区别。
直接从0x4 0位置开始执行,效果是一样的。

vmlinuz - 最常见的事情。
这实际上是 bzImage 或 zImage 的软链接或硬拷贝。
首次启动系统时 initramfs将挂载文件系统,然后将控制权传递给 vmlinuz,然后 vmlinuz 将接管控制权。
我之前尝试过这个并卸载了vmlinuz,以为我仍然拥有原始内核,但最终启动时出现蓝屏。

initrd 是“初始内存磁盘”,通常大小为数百 KB。
它就像一个临时保姆,接管硬件的控制权,直到内核正式启动,比如加载FAT驱动程序、扫描SCSI设备等。
我曾经安装过一个旧系统,但在光驱中找不到启动盘。
我使用 initrd 挂载 CD 驱动器,系统启动正常。
Initrd消失了,很多系统根本无法登录。

我记得vmlinux的数据大约是1 0MB,zImage压缩后可以达到5 MB。
由于bzImage处理高性能内存,因此压缩比略低于zImage,但绝对值仍小于vmlinux。
然而,我自己并没有这样做。
建议你用工具压缩一下看一下。

当前linux所使用的内核在哪个文件夹,如何看当前使用的内核版本情况。

显然,对于Linux内核文件,在/boot下查找img文件,对于版本信息,查看/proc/version或使用uname -a命令。
这三件事其实很简单。

我们先来说说最重要的事情。
内核文件通常称为 vmlinuz-xxx.img。
比如我们去年跑的一个项目,系统直接挂载/boot/vmlinuz-5 .4 .0-4 2 -generic.img并启动。
还有就是/proc/version信息不完整,只显示主版本号和编译参数。
去年我发现客户端系统显示的是4 .1 5 .0,但/boot下的实际文件是4 .1 5 .2 目前,uname -a 是正确的。
还有一个更重要的细节。
uname -a 可以显示所有内核参数,例如内存大小和CPU型号。
去年,我调试了内存泄漏。
当我看到MemTotal 1 6 G时我才知道问题出在物理内存上,而不是虚拟内存上。
说实话,有点混乱。
/proc/version 不容易看到,关键时刻很容易迷惑人。

我一开始以为内核文件只有两种格式,后来发现现在很多系统都使用zImage的压缩版本,比如vmlinuz-5 .1 0.0-1 0-generic.img.gz,可以用zcat /boot/vmlinuz-5 .1 0.0-1 0-generic.img直接解压启动。
等等,还有一件事。
uname -a 输出的顺序在不同系统上可能不同。
有的说CPU优先,有的说内核版本优先。

建议您下次安装系统时不要只关注/proc/version。
最好同时检查/boot下的文件名和uname -a的完整输出,避免发现问题时混乱。