Features/Core

Материал из ALT Linux Wiki

Файлы core

По умолчанию в ALT Linux механизм coredump отключен для уменьшения уязвимости обычных систем (по причине неоднократных серьёзных проблем с ним; см. тж. altbug #9780).

Предпринятые меры:

  • kernel.core_pattern = / в /etc/sysctl.conf см. тж. altbug #32029
  • soft core 0 в /etc/security/limits.d/50-defaults.conf
  • limited в ряде инитскриптов
  • ulimit -Sc 0 >/dev/null 2>&1 в /etc/rc.d/rc.sysinit
  • ulimit -Sc 0 >/dev/null 2>&1 в /etc/profile

Теперь осталось убрать лишние места выключения, чтобы была возможность включить.

Для появления корок (в процессах-наследниках того, в котором вызывается ulimit) надо как минимум:

  • sysctl -w kernel.core_pattern=core
  • ulimit -Sc unlimited

и, возможно, посмотреть /etc/sysconfig/limits да создать нужный /etc/sysconfig/limits.d/* (см. тж. это письмо насчёт apache2[1]).

Как включить сохранение coredump с systemd

Установить пакет systemd-coredump:

# apt-get install systemd-coredump

Включить coredump:

# systemctl start systemd-coredump.socket

Отключить soft limit на core dump size: закомментировать следующую строку в /etc/profile: 'ulimit -Sc 0 >/dev/null 2>&1'

Перелогиниться, чтобы новый core limit вступил в силу для всех приложений по мере их запуска. ulimit -c должен после этого выдавать не 0, а unlimited. Для неграфической сессии можно вместо этого выполнить "ulimit -c unlimited".

После этого coredump-ы можно смотреть с помощью утилиты coredumpctl

$ coredumpctl list
$ coredumpctl info

и сохранять с помощью

$ coredumpctl dump -o filename

Стоит учитывать, что coredump - это снимок всей доступной памяти процесса на момент его падения. Если в памяти приложения есть важная информация (например, пароли), то эта информация будет присутствовать и в coredump-файле.

Проверить, что всё настроено правильно, можно, например, с помощью следующей программы:

int main(int argc, char **argv)
{
   char *r;
   do
   {
       r = *argv;
   } while (++argv);
   return 0;
}

Собрав её

$ gcc segfault.c -g -o segfault

и запустив

$ ./segfault

В итоге, в coredumpctl должна появиться информация о сегфолте с доступным coredump'ом.

Пример вывода

$ coredumpctl 
TIME                            PID   UID   GID SIG COREFILE  EXE
Mon 2018-10-15 18:53:41 MSK   26285   500   500  11 present   /home/test/segfault
$ coredumpctl info 26285
          PID: 26285 (segfault)
          UID: 500 (test)
          GID: 500 (test)
       Signal: 11 (SEGV)
    Timestamp: Mon 2018-10-15 18:53:40 MSK (8s ago)
 Command Line: ./segfault
   Executable: /home/test/segfault
Control Group: /user.slice/user-500.slice/session-4.scope
         Unit: session-4.scope
        Slice: user-500.slice
      Session: 4
    Owner UID: 500 (test)
      Boot ID: d93a5fb5f9f44f25838f9d6d4e9486dc
   Machine ID: 30878809ed378edf3a2b36e25ad5fa70
     Hostname: kwork-x86-64.localdomain
      Storage: /var/lib/systemd/coredump/core.segfault.500.d93a5fb5f9f44f25838f9d6d4e9486dc.26285.1539618820000000.lz4
      Message: Process 26285 (segfault) of user 500 dumped core.
               Stack trace of thread 26285:
               #0  0x00000000004004e5 n/a (/home/test/segfault)


Примечания