Linux内核为什么以及如何为coredump创建稀疏文件?

Linux内核为什么以及如何为coredump创建稀疏文件?,linux,linux-kernel,coredump,sparse-file,Linux,Linux Kernel,Coredump,Sparse File,目前我正在Linux 4.0.6上工作。在coredump激活之后,我观察到生成的corefiles被创建为稀疏文件。 例如,ls命令显示我的corefile的大小是42MB。但是,du命令显示它只分配26.3 MB 关于这一观察,我的问题是: 为什么Linux内核为coredump创建一个稀疏文件 它是如何工作的?它是否依赖于放置coredump的文件系统 我可以配置系统/内核以防止coredump成为稀疏文件吗 您应该只考虑coredump文件是什么:进程内存的顺序写入。在现代操作系统上,内

目前我正在Linux 4.0.6上工作。在coredump激活之后,我观察到生成的corefiles被创建为稀疏文件。 例如,
ls
命令显示我的corefile的大小是42MB。但是,
du
命令显示它只分配26.3 MB

关于这一观察,我的问题是:

  • 为什么Linux内核为coredump创建一个稀疏文件
  • 它是如何工作的?它是否依赖于放置coredump的文件系统
  • 我可以配置系统/内核以防止coredump成为稀疏文件吗

  • 您应该只考虑coredump文件是什么:进程内存的顺序写入。在现代操作系统上,内存不是一个简单的顺序字节范围,而是可以由多段在不同地址映射而成。这说明,如果您尝试在映射段之外的地址读取或写入,则会收到段冲突信号(SIGGEGV)

    因此,在转储时,系统按升序写入段,并将lseek写入每个新段的开头,从而构建一个稀疏文件

    现在回答您的问题:

  • 为什么Linux内核为coredump创建一个稀疏文件
  • 解释就在上面

  • 它是如何工作的?它是否依赖于放置coredump的文件系统
  • 不是这样,除非底层文件系统不允许稀疏文件

  • 我可以配置系统/内核以防止coredump成为稀疏文件吗

  • 我知道你不能,你更不想。
    ls
    命令提供程序使用的较高内存地址,而
    du
    命令提供程序使用的总内存大小,因为未使用的地址不会被映射,也不会消耗内存。

    您应该只考虑coredump文件是什么:进程内存的顺序写入。在现代操作系统上,内存不是一个简单的顺序字节范围,而是可以由多段在不同地址映射而成。这说明,如果您尝试在映射段之外的地址读取或写入,则会收到段冲突信号(SIGGEGV)

    因此,在转储时,系统按升序写入段,并将lseek写入每个新段的开头,从而构建一个稀疏文件

    现在回答您的问题:

  • 为什么Linux内核为coredump创建一个稀疏文件
  • 解释就在上面

  • 它是如何工作的?它是否依赖于放置coredump的文件系统
  • 不是这样,除非底层文件系统不允许稀疏文件

  • 我可以配置系统/内核以防止coredump成为稀疏文件吗

  • 我知道你不能,你更不想。
    ls
    命令为您提供程序使用的较高内存地址,而
    du
    命令为您提供程序使用的总内存大小,因为未使用的地址未映射,并且根本不消耗内存。

    谢谢@SergeBallesta!但是,如果coredump大小很小,例如只有3MB,那么创建的coredump不是稀疏文件。
    ls
    du
    命令显示相同的分配和文件大小。你有什么解释吗?解释似乎表明文件大小与最高的映射地址有关,这是错误的。coredump有一个所有区域的列表。重要的是它们的数量,而不是它们在地址空间中的位置。特别是使用较小映射的程序也可能完全使用它们,因此“真实”转储大小更接近稀疏大小。真正的问题是对稀疏文件w.r.t coredumps的兴趣是什么。一个有趣的事实是,虽然您本身无法配置稀疏转储,但您可以使用转储到管道,并在管道到程序中随心所欲地写出核心。但不要这样做。请稍加澄清:wrt
    ls
    vs
    du
    du
    给出了磁盘上的大小,对于稀疏文件,该大小将更小。回答得很好。>
    ls
    命令为您提供程序使用的较高内存地址,而
    du
    命令为您提供程序使用的总内存大小,因为未使用的地址不会被映射,也不会消耗内存@bytefire是正确的。
    du
    没有给出程序使用的总内存大小,因为corefile只是一个文件,而不是二进制文件。谢谢@SergeBallesta!但是,如果coredump大小很小,例如只有3MB,那么创建的coredump不是稀疏文件。
    ls
    du
    命令显示相同的分配和文件大小。你有什么解释吗?解释似乎表明文件大小与最高的映射地址有关,这是错误的。coredump有一个所有区域的列表。重要的是它们的数量,而不是它们在地址空间中的位置。特别是使用较小映射的程序也可能完全使用它们,因此“真实”转储大小更接近稀疏大小。真正的问题是对稀疏文件w.r.t coredumps的兴趣是什么。一个有趣的事实是,虽然您本身无法配置稀疏转储,但您可以使用转储到管道,并在管道到程序中随心所欲地写出核心。但不要这样做。请稍加澄清:wrt
    ls
    vs
    du
    du
    给出了磁盘上的大小,对于稀疏文件,该大小将更小。回答得很好。>
    ls
    命令为您提供程序使用的较高内存地址,而
    du
    命令为您提供程序使用的总内存大小,因为未使用的地址不会被映射,也不会消耗内存@bytefire是正确的。
    du
    没有给出