재부팅 후 Ubuntu 18.04 VM에서 'kernel.core_pattern'이 적용되지 않습니다.

재부팅 후 Ubuntu 18.04 VM에서 'kernel.core_pattern'이 적용되지 않습니다.

테스트 환경

나는ubuntu/bionic64부랑자 상자내 테스트 환경으로.

전제조건

VM을 만든 후 ansible 2.9.23다음과 같이 설치했습니다.공식 문서의 지침.

모듈을 사용하고 싶기 때문에 ansible.posix컬렉션( ) 도 설치했습니다 .ansible-galaxy collection install ansible.posixansible.posix.sysctl

현재 핵심 패턴이 내가 원하는 것이 아닌지 확인합니다.

vagrant@ubuntu-bionic:~$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E

또한 /etc/sysctl.conf핵심 패턴이 없었습니다.

vagrant@ubuntu-bionic:~$ grep "core_pattern" /etc/sysctl.conf
vagrant@ubuntu-bionic:~$

나의 의도

핵심 패턴을 /var/tmp/core.%h.%e.%t.

제가 한

다음 ansible명령을 실행했습니다.

ansible -bKvvv -m "sysctl" -a "name=kernel.core_pattern state=present value='/var/tmp/core.%h.%e.%t' reload=yes" localhost

출력에 성공했습니다.

localhost | CHANGED => {
    "changed": true, 
    "invocation": {
        "module_args": {
            "ignoreerrors": false, 
            "name": "kernel.core_pattern", 
            "reload": true, 
            "state": "present", 
            "sysctl_file": "/etc/sysctl.conf", 
            "sysctl_set": false, 
            "value": "/var/tmp/core.%h.%e.%t"
        }
    }
}

또한 현재 구성을 확인했습니다.

vagrant@ubuntu-bionic:/etc$ sysctl kernel.core_pattern
kernel.core_pattern = /var/tmp/core.%h.%e.%t

core_pattern또한 이 내용이 다음과 같이 작성되었음을 확인했습니다 /etc/sysctl.conf.

vagrant@ubuntu-bionic:~$ grep "core_pattern" /etc/sysctl.conf 
kernel.core_pattern=/var/tmp/core.%h.%e.%t

그런 다음 VM을 재부팅했습니다. 재부팅 후 현재 유효한 항목이 core_pattern롤백되었습니다.

vagrant@ubuntu-bionic:~$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E

내 생각과 내가 시도한 것

이 질문첫째로 약 10년 전에 요청되었고 둘째로 Ubuntu Server 18.04가 upstart더 이상 사용되지 않는 것 같기 때문에 나에게는 해당되지 않는 것 같습니다.

다른 .conf파일을 나중에 읽을 수 있다고 생각하여 /etc/sysctl.conf어딘가에서 설정을 재정의했습니다. 하지만sysctl(8)매뉴얼 페이지.conf읽을 파일 의 순서를 나열하며 /etc/sysctl.conf다른 모든 항목보다 우선하는 마지막 순서여야 하는 것처럼 보입니다.

sysctl.conf(5)매뉴얼 페이지와 동일한 주문 목록을 제공합니다 sysctl(8).

나는 아무것도 찾지 못했습니다sysctl.d(5), 어느 하나. 실제로 "구성 디렉터리 및 우선 순위" 섹션은 내 이해를 확인시켜줍니다.

/etc/에 있는 파일은 /run/ 및 /lib/에 있는 동일한 이름의 파일을 대체합니다. /run/에 있는 파일은 /lib/에 있는 동일한 이름의 파일을 대체합니다.

kernel.core_pattern수동으로 실행하면 예상대로 설정된다는 것을 알았습니다 sudo sysctl --system. 이는 기본적으로 이러한 시스템 설정을 읽지 않는다는 의미일 수 있습니다.

답변1

추가 조사 결과 kernel.core_pattern에 의해 덮어쓰기된 것으로 나타났습니다.패키지apport시스템 부팅시.

apport"/usr/share/apport/apport"라는 문자열을 봤을 때 확인해 볼 생각을 했어야 했어요 . apport실제로 덮어쓰는 것인지 확실하지 않아서 kernel.core_pattern소스 코드를 살펴보기로 결정했습니다.

을 실행하여 apt-cache policy apport내가 사용하고 있는 버전이 다음과 같다는 것을 알았습니다 2.20.9-0ubuntu7.24.

vagrant@ubuntu-bionic:~$ apt-cache policy apport
apport:
  Installed: 2.20.9-0ubuntu7.24
  Candidate: 2.20.9-0ubuntu7.24
  Version table:
 *** 2.20.9-0ubuntu7.24 500
        500 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.20.9-0ubuntu7 500
        500 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages
vagrant@ubuntu-bionic:~$

그럼 apport~에런치패드 페이지, 다운로드 링크를 찾았습니다.appport_2.20.9-0ubuntu7.tar.gz.

소스코드를 검색해 보니 파일 debian/apport.init내용이 다음과 같았습니다.

do_start()
{
    ...
    ...
    echo "|$AGENT %p %s %c %d %P" > /proc/sys/kernel/core_pattern
    echo 2 > /proc/sys/fs/suid_dumpable
}

그래서 dpkg -L apport내 VM을 실행하여 다음 파일이 있는지 확인했습니다.

vagrant@ubuntu-bionic:~$ dpkg -L apport | grep init
/etc/init.d
/etc/init.d/apport

정확히 일치하는 파일 이름을 가진 파일이 없었지만 살펴보기로 결정 /etc/init.d/apport하고 이것이 내가 찾고 있던 파일이라는 것을 알았습니다.

do_start()
{
        ...
        ...
        echo "|$AGENT %p %s %c %d %P %E" > /proc/sys/kernel/core_pattern
        echo 2 > /proc/sys/fs/suid_dumpable
}

나는 그것이 /etc/sysctl.conf서비스에 의해 읽힌다는 것을 알고 있었기 systemd-sysctl때문에 다음으로 확인하고 싶은 것은 서비스가 systemd-sysctl이전에 시작되었는지 여부였습니다 apport.

관련 서비스 가 있는지 검색하여 apport찾았습니다.

vagrant@ubuntu-bionic:~$ systemctl list-units | grep apport
apport.service                                                                      loaded active exited    LSB: automatic crash report generation

그런 다음 상호 종속성을 확인하고 apport.service다음 이후에 시작됨을 발견했습니다 systemd-sysctl.service.

vagrant@ubuntu-bionic:~$ systemctl list-dependencies apport.service
apport.service
● ├─system.slice
● └─sysinit.target
...
●   ├─systemd-sysctl.service
...
...
vagrant@ubuntu-bionic:~$

즉, in systemd-sysctl.service의 설정을 올바르게 읽었 지만 설정이 즉시 에 의해 덮어쓰여진다는 뜻입니다 .kernel.core_pattern/etc/sysctl.confapport.service

이를 확인하기 위해 다음 두 줄을 추가했습니다 /etc/init.d/apport.

do_start()
{
        ...
        ...
        # NOTE(ywen): Write the current value to a file.
        sysctl kernel.core_pattern > /home/vagrant/sysctl.kernel.core_pattern.txt

        echo "|$AGENT %p %s %c %d %P %E" > /proc/sys/kernel/core_pattern
        echo 2 > /proc/sys/fs/suid_dumpable

        # NOTE(ywen): Append the current value to the file.
        sysctl kernel.core_pattern >> /home/vagrant/sysctl.kernel.core_pattern.txt
}

그런 다음 VM을 재부팅했습니다. VM이 다시 가동되었을 때 파일에 /home/vagrant/sysctl.kernel.core_pattern.txt다음 내용이 포함되어 있음을 발견했습니다.

vagrant@ubuntu-bionic:~$ cat sysctl.kernel.core_pattern.txt 
kernel.core_pattern = /var/tmp/core.%h.%e.%t
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E
vagrant@ubuntu-bionic:~$

실제로 내 설정은 올바르게 읽혀졌지만 apport.

관련 정보