目前我正在使用 Linux 4.0.6。在 coredump 激活后,我观察到生成的 corefiles 被创建为稀疏文件。例如,该ls
命令显示我的核心文件的大小为 42 MB。但是,该du
命令显示它只分配了 26.3 MB。
我对此观察的问题:
- 为什么 Linux 内核会为 coredump 创建一个稀疏文件?
- 它是如何工作的?它是否取决于放置核心转储的文件系统?
- 我可以配置系统/内核以防止核心转储作为稀疏文件吗?
目前我正在使用 Linux 4.0.6。在 coredump 激活后,我观察到生成的 corefiles 被创建为稀疏文件。例如,该ls
命令显示我的核心文件的大小为 42 MB。但是,该du
命令显示它只分配了 26.3 MB。
我对此观察的问题:
你应该想想核心转储文件是什么:仅仅是对进程内存的顺序写入。在现代操作系统上,内存不是一个简单的连续字节范围,而是可以由映射在不同地址的多个段组成。这解释了如果您尝试在映射段之外的地址读取或写入,则会收到段违规信号 (SIGSEGV)。
因此,在转储时,系统按升序写入段,然后查找每个新段的开头,从而构建一个稀疏文件。
现在为您的问题:
- 为什么 Linux 内核会为 coredump 创建一个稀疏文件?
解释就在上面。
- 它是如何工作的?它是否取决于放置核心转储的文件系统?
不是真的,除非底层文件系统不允许稀疏文件。
- 我可以配置系统/内核以防止核心转储作为稀疏文件吗?
恕我直言,您不能,而且您不想这样做。该ls
命令为您提供程序使用的较高内存地址,而该du
命令为您提供程序使用的总内存大小,因为未使用的地址没有映射并且根本不消耗内存。