Linux 在核心生成期间压缩核心文件

Linux 在核心生成期间压缩核心文件,linux,kernel,Linux,Kernel,在核心转储生成期间,有没有压缩核心文件的方法 如果系统中的存储空间有限,在需要立即压缩生成核心转储时,是否有办法节约存储空间 理想情况下,该方法适用于较旧版本的linux,如2.6.x Linux内核/proc/sys/kernel/core_模式文件将执行您想要的操作: 将文件名设置为类似于|/bin/gzip-1>/var/crash/core-%t-%p-%u.gz的值,您的核心文件应该被压缩保存。对于嵌入式Linux系统,以下脚本更改可以通过两个步骤完美地生成压缩的核心文件 步骤1:创建

在核心转储生成期间,有没有压缩核心文件的方法

如果系统中的存储空间有限,在需要立即压缩生成核心转储时,是否有办法节约存储空间


理想情况下,该方法适用于较旧版本的linux,如2.6.x

Linux内核
/proc/sys/kernel/core_模式
文件将执行您想要的操作:


将文件名设置为类似于
|/bin/gzip-1>/var/crash/core-%t-%p-%u.gz的值,您的核心文件应该被压缩保存。

对于嵌入式Linux系统,以下脚本更改可以通过两个步骤完美地生成压缩的核心文件

步骤1:创建脚本
touch/bin/gen\u compress\u core.sh

chmod+x/bin/gen\u compress\u core.sh

cat>/bin/gen\u compress\u core.sh
#!/垃圾箱/垃圾箱
exec/bin/gzip-f->“/var/core/core-$1.$2.gz”

ctrl+d

步骤2:更新核心模式文件
cat>/proc/sys/kernel/core\u模式
|/nuova/bin/gen\u compress\u core.sh%e%p

ctrl+d

正如其他答案所建议的,Linux内核/proc/sys/kernel/core\u模式文件是一个很好的开始:

正如文档所说,您可以指定特殊字符“|”,它将告诉内核将文件输出到脚本。正如建议的那样,您可以使用|/bin/gzip-1>/var/crash/core-%t-%p-%u.gz作为名称,但是它似乎对我不起作用。我认为原因是,在我的系统内核上,不将>字符作为输出,而可能将其作为参数传递给gzip

为了避免这个问题,像其他建议的那样,您可以在我使用/home//crash/core.sh的某个位置创建文件,使用以下命令创建它,替换为您的用户。或者,您也可以明显地更改整个路径

echo -e '#!/bin/bash\nexec /bin/gzip -f - >"/home/<username>/crashes/core-$1-$2-$3-$4-$5.gz"' > ~/crashes/core.sh
编译和运行后,有两个选项,我们将看到:

分段故障(堆芯转储)

分段故障

如果我们看到后者,可能的原因就不多了

  • 未设置ulimit,ulimit-c应指定内核的限制
  • apport或您的发行版核心转储收集器未运行,应进一步调查此问题
  • 我们编写的脚本中有一个错误,我建议您检查一些基本转储路径,以检查其他内容是否不是下面应该创建/tmp/core.dump的原因:

    sudo sysctl -w kernel.core_pattern="/tmp/core.dump"
    

  • 我知道这个问题已经有了答案,但是我不清楚为什么它不能“开箱即用”,所以我想总结一下我的发现,希望它能帮助别人

    请注意,仅从2.6.19开始支持此功能。如果您有一个运行较早的嵌入式系统,它可能是升级的灵感;-)同样值得嵌入式用户注意的是,大多数direct flash文件系统(yaffs、jffs2、ubifs)对文件进行透明压缩,这将实现类似的净效果。必须使用绝对路径名指定程序。看见此外,重定向“>”在这里也不起作用,您可以将gzip命令放入一个单独的shell脚本中,如“/root/core.sh”,然后
    echo“|/root/core.sh”>/proc/sys/kernel/core\u pattern
    。@Ted,我很惊讶我忽略了完整的路径。谢谢我在busybox上也一样:应该将核心模式指定为shell脚本的参数,例如
    echo“|/root/core.sh%t%p%u”>/proc/sys/kernel/core\u模式
    ,在脚本中可以使用$1、$2、$3:
    /bin/gzip-f->/var/crash/core-$1-$2-$3.gz
    int main (){
        int * a = nullptr;
        int b = *a;
    }
    
    sudo sysctl -w kernel.core_pattern="/tmp/core.dump"