프로그래밍/운영체제

리눅스 sysctl.conf와 sysctl.d 우선순위 정리

포도알77 2026. 5. 21. 10:52

리눅스 sysctl.conf와 sysctl.d 우선순위 정리

sysctl 값을 영구 적용하려고 설정 파일을 만들 때 /etc/sysctl.conf를 계속 써도 되는지, 아니면 /etc/sysctl.d/*.conf로 옮겨야 하는지 헷갈리는 경우가 많다. 2026년 5월 21일 기준 procps와 systemd 공식 문서를 보면 두 방식은 단순한 취향 차이가 아니라, 누가 설정을 읽는지와 우선순위가 다르다.

핵심은 세 가지다. 수동으로 sysctl -p를 실행하면 기본적으로 /etc/sysctl.conf를 읽고, sysctl --system은 여러 sysctl.d 디렉터리를 읽은 뒤 마지막에 /etc/sysctl.conf를 읽는다. 반면 부팅 초기에 동작하는 systemd-sysctl.servicesysctl.d(5)에 정의된 파일만 적용하고 /etc/sysctl.conf는 사용하지 않는다.

무엇이 가장 중요한 차이일까?

가장 큰 차이는 적용 주체다. sysctl.conf(5) 문서는 이 파일이 procps의 sysctl(8)가 읽는 설정 파일이라고 설명한다. 같은 문서는 systemd-sysctl(8)를 쓰는 환경에서는 /etc/sysctl.conf를 사용하지 않는다고 분명히 적고 있다.

즉 배포판이 systemd 부팅 흐름을 사용한다면, 재부팅 후에도 반드시 적용되어야 하는 값을 /etc/sysctl.conf에만 넣는 방식은 안전한 기본값이 아니다. 수동 테스트에서는 값이 들어간 것처럼 보여도, 실제 부팅 시점에는 빠질 수 있기 때문이다.

sysctl --system은 어떤 순서로 읽을까?

sysctl(8) 문서의 SYSTEM FILE PRECEDENCE 섹션에 따르면 --system 옵션은 아래 경로를 위에서 아래 순서로 읽는다.

  • /etc/sysctl.d/*.conf
  • /run/sysctl.d/*.conf
  • /usr/local/lib/sysctl.d/*.conf
  • /usr/lib/sysctl.d/*.conf
  • /lib/sysctl.d/*.conf

그다음 마지막에 /etc/sysctl.conf를 읽는다. 같은 이름의 파일이 여러 디렉터리에 있으면 우선순위가 높은 디렉터리의 파일이 뒤 경로의 같은 이름 파일을 가린다. 파일 이름이 다르면 모든 파일이 사전식 순서로 정렬되고, 나중에 읽힌 설정이 같은 키를 덮어쓴다.

그렇다면 sysctl.d는 언제 써야 할까?

sysctl.d(5)는 부팅 시 커널 파라미터를 설정하는 표준 위치로 설명된다. 문서 기준으로 패키지가 제공하는 기본 설정은 /usr/lib/sysctl.d/ 또는 /usr/local/lib/sysctl.d/에 두고, 로컬 관리자가 이를 덮어쓸 때는 /etc/sysctl.d/를 사용하는 흐름이 권장된다.

실무에서는 로컬 설정도 보통 /etc/sysctl.d/99-local.conf처럼 별도 파일로 두는 편이 관리에 유리하다. 이유는 두 가지다. 부팅 시 systemd-sysctl가 바로 읽을 수 있고, 설정 목적별로 파일을 분리해 추적하기 쉽다.

/etc/sysctl.conf는 이제 쓰면 안 될까?

완전히 금지된 파일은 아니다. procps의 sysctl -p는 기본적으로 이 파일을 읽고, sysctl --system도 마지막에 이 파일을 읽는다. 따라서 일시적으로 값을 확인하거나, 이미 이 파일 중심으로 운영 중인 레거시 환경에서는 여전히 동작할 수 있다.

다만 systemd 기반 배포판에서 재부팅 후 일관된 적용을 기대한다면, 새 설정의 기본 위치로는 /etc/sysctl.d/*.conf가 더 안전하다. 특히 자동화, 이미지 빌드, 패키지 기본값 오버라이드 같은 작업은 파일 분리 방식이 충돌 관리에 유리하다.

우선순위는 어떻게 판단하면 될까?

상황 권장 위치 이유
재부팅 후에도 일관되게 적용해야 하는 로컬 설정 /etc/sysctl.d/99-local.conf systemd-sysctl가 직접 읽고 파일 분리가 쉽다
패키지 기본값 제공 /usr/lib/sysctl.d/*.conf 로컬 관리자가 /etc에서 같은 이름 또는 더 늦은 파일명으로 덮어쓸 수 있다
수동 테스트용 단일 파일 로드 sysctl -p /path/to/file 적용 범위를 명시적으로 제한할 수 있다
레거시 환경 유지 /etc/sysctl.conf 기존 절차와 호환되지만 부팅 경로는 별도 확인이 필요하다

자주 헷갈리는 질문

Q. sysctl -psystemctl restart systemd-sysctl는 같은 동작일까?

같지 않다. 공식 문서 기준으로 sysctl -p는 기본적으로 /etc/sysctl.conf를 읽는다. 반면 systemd-sysctlsysctl.d 계열 파일만 적용한다. 따라서 두 명령을 섞어 테스트하면 재부팅 후 결과가 달라질 수 있다.

Q. 같은 키를 여러 파일에서 설정하면 무엇이 최종값이 될까?

sysctl.d(5)에 따르면 파일들은 이름 기준 사전식 순서로 정렬된다. 같은 키가 여러 번 나오면 더 나중에 처리된 항목이 우선한다. 같은 이름의 파일이 여러 디렉터리에 있으면 우선순위가 높은 디렉터리의 파일이 뒤 경로의 같은 이름 파일을 대체한다.

Q. 커널 모듈이 늦게 올라오면 sysctl.d 설정이 안 먹을 수도 있을까?

그럴 수 있다. sysctl.d(5)는 일부 파라미터가 특정 커널 모듈이 로드된 뒤에야 나타난다고 설명한다. 이런 경우 초기 부팅에서 실행되는 systemd-sysctl.service가 값을 적용하지 못할 수 있으며, 문서는 udev 규칙이나 modules-load.d를 함께 검토하라고 안내한다.

실무 기준 한 줄 정리

새로 만드는 영구 설정이라면 기본 위치를 /etc/sysctl.d/*.conf로 잡는 편이 무난하다. /etc/sysctl.conf는 여전히 읽을 수 있지만, systemd 기반 부팅 경로와 일치하지 않을 수 있어서 현재 리눅스 운영 환경에서는 기본 선택지로 보기 어렵다.

참고 자료

반응형
페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사