System V 스크립트를 찾기 위해 systemd가 사용하는 기본 경로는 무엇입니까?

System V 스크립트를 찾기 위해 systemd가 사용하는 기본 경로는 무엇입니까?

/etc/init.d기본 SysV 스크립트를 유닛 파일로 변환하고 해당 파일로 대체하거나 그 반대로 변환하기 위해 systemd 생성기가 사용하는 기본 검색 경로는 무엇입니까 /etc/rc?.d?

따라서답변@JdeBP 작성:

이 프로그램은 9개의 디렉터리 중 추가 3개를 포함하는 tmpfs에 서비스 단위 파일을 동적으로 생성하는 작업을 수행하는 보조 유틸리티인 생성기입니다(생성기에서만 사용됨). 다른 6개 위치에 이미 존재하는 동일한 이름의 기본 시스템 서비스 단위가 발견되지 않으면 systemd-sysv-generatorSystem V 스크립트를 실행하는 서비스 단위가 생성됩니다.rc/etc/init.d

하지만,리눅스 작동 방식이 책에서는 몇 가지 다른 내용을 언급합니다.

  1. 먼저 systemd는 runlevel<N>.target을 활성화합니다.질소실행 수준입니다.
  2. 의 모든 심볼릭 링크에 대해 /etc/rc<N>.dsystemd는 다음의 스크립트를 인식합니다./etc/init.d.
  3. systemd는 스크립트 이름을 서비스 단위와 연결합니다(예:/etc/init.d/foo~ 할 것이다foo.service).
  4. systemd는 서비스 단위를 활성화하고 .txt 파일의 이름을 기반으로 시작 또는 중지 인수를 사용하여 스크립트를 실행합니다 rc<N>.d.
  5. systemd는 스크립트의 모든 프로세스를 서비스 단위와 연결하려고 시도합니다.

내가 알 수 있는 한, 프로세스는 다음과 같이 작동합니다. systemd는 에서 SysV 스크립트를 찾고 , 실행 수준에 따라 systemd는 ( 또는 ) /etc/init.d의 심볼릭 링크 이름을 기반으로 스크립트를 시작하거나 중지하기로 결정합니다 . SysV 스크립트가 기본 시스템 단위 파일로 변환되면 .K*S*/etc/rc?.d/etc/rc?.d

$ ls -l /etc/rc5.d
lrwxrwxrwx 1 root root 15 Aug  4 00:10 S01acpid -> ../init.d/acpid
lrwxrwxrwx 1 root root 17 Aug  4 00:10 S01anacron -> ../init.d/anacron
lrwxrwxrwx 1 root root 16 Aug  4 00:10 S01apport -> ../init.d/apport
lrwxrwxrwx 1 root root 22 Aug  4 00:10 S01avahi-daemon -> ../init.d/avahi-daemon
...many more...

스크립트의 모든 심볼릭 링크는 동일한 실행 순서 01을 갖고 있음을 알 수 있습니다. 이는 systemd의 병렬성을 활용하여 종속성 순서(예: , )를 결정하기 systemd-sysv-generator위해 의도적으로 수행되었습니다 ./etc/rc?.dBeforeAfter

스크립트의 LSB 헤더는 스크립트가 실행되는 실행 수준을 결정하므로, 스크립트의 LSB 헤더에서 이를 수행할 수 있는 방법이 없는 한, 대신 어떤 스크립트가 어떤 실행 수준에서 시작되는지 결정하는 systemd-sysv-generator기본 아이디어를 선호합니다. . 내 가정이 맞나요?/etc/init.d/etc/rc?.d

systemd-sysv-생성기(8)

LSB headers[2]SysV의 init 스크립트가 해석되고, 헤더에 지정된 순서가 생성된 유닛과 다른 유닛 간의 종속성으로 변환됩니다. LSB 기능 "$remote_fs", "$network", "$named", "$portmap""$time"지원되며 특정 기본 systemd 대상에 대한 종속성으로 변환됩니다.

그러나 매뉴얼 페이지에는 LSB 헤더가 없는 경우에 대한 언급이 없습니다. 거의 너무 복잡함:.

답변1

귀하의 질문을 중복으로 표시하겠습니다.

여기에서 JdeBP의 훌륭한 답변을 읽어보세요.systemd는 /etc/init.d 스크립트를 어떻게 사용합니까?

rc일반적으로 System V 스크립트에는 LSB 헤더가 있어야 하며 시스템이 부여한 우선순위에 관계없이 병렬로 실행되어야 한다는 것이 인정됩니다 /etc/rc?.d/. 이것은 모든 면에서 잘못된 것입니다.

실제로 LSB 헤더가 필요하지 않으며, 그렇지 않은 경우 systemd-sysv-generator는 더 제한된 이전 RedHat 주석 헤더( 등)를 인식할 수 description:있습니다 pidfile:. 또한 LSB 헤더가 없으면 /etc/rc?.d심볼릭 링크 필드의 내용으로 돌아가고 링크 이름에 인코딩된 우선 순위를 읽고 여기에서 순서 이전/이후를 빌드하여 서비스를 직렬화합니다. LSB 헤더가 필요하지 않을 뿐만 아니라 직렬화된 항목의 순서 전후에 어느 정도 인코딩되어 있을 뿐만 아니라 헤더가 전혀 없는 폴백 동작은 실제로는 분명히 비병렬 작업입니다.

/etc/rc3.d이것이 중요하지 않은 이유는 /etc/rc?.d/다른 디렉토리를 통해 스크립트를 활성화했을 수 있기 때문입니다. , 및 중 하나의 목록을 systemd-sysv-generatorsystemd와의 기본 관계로 변환합니다. 런레벨은 시스템 세계에서 "구식"이므로 잊어버릴 수 있습니다./etc/rc2.d//etc/rc3.d//etc/rc4.d/Wanted-Bymulti-user.target

실제로 검색 경로가 무엇인지에 대한 질문은 질문에 인용한 내용으로 실제로 해결됩니다.

systemd-sysv-generator다른 6개 위치에 이미 존재하는 동일한 이름의 기본 시스템 서비스 단위가 발견되지 않으면 rcSystem V 스크립트를 실행하는 서비스 단위가 생성됩니다./etc/init.d

더 자세하게:

  • 스크립트 자체의 경우:
    • systemd-sysv-generator라는 환경 변수를 찾습니다 SYSTEMD_SYSVINIT_PATH.
    • 각 디렉터리는 소유자 실행 권한 비트가 설정된 일반 파일을 검색하고, 경로의 이전 디렉터리는 나중에 디렉터리를 덮어씁니다(이 메커니즘은 기본적으로 검색 경로에 디렉터리가 하나만 있는 경우 실제로 적용되지 않습니다). 서비스 단위가 있는지 확인합니다. 동일한 이름을 사용하면 이러한 난수 생성이 금지됩니다.
  • "symlink 팜"의 경우:
    • 이라는 유사한 환경 변수가 있습니다 SYSTEMD_SYSVRCND_PATH.
    • 각 디렉터리에서 이름이 지정된 rc[2345].d하위 디렉터리를 검색합니다.차례로S두 개의 십진수로 시작하고 길이가 4자 이상인 디렉터리 항목을 검색합니다. 디렉터리 항목은 역참조되지 않습니다.

주의하시기 바랍니다 systemd-sysv-generator

  • 보이지 않는다사물 에 K*;
  • 확인하지 마세요심볼릭 링크 팜은 실제로 심볼릭 링크로 가득 차 있습니다(심볼릭 링크는 관심 있는 모든 항목에 대한 문자 특수 파일 또는 FIFO일 수 있습니다.오직보고 있다이름.);그리고
  • 진행되지 않았다LSB 주석(즉, 주석)의 Default-Start:실행 Default-Stop:수준 정보입니다 .

세 번째 점과 관련하여 바닐라 van Smoorenburg에서는 rcLSB 주석의 실행 수준 정보가 부팅/종료 동작을 직접 제어하지 않는다는 점을 기억하십시오. 이는 심볼릭 링크 팜 디렉터리의 책임입니다. 시스템 측면에서 van Smoorenburg rc: Symlink 팜은 서비스입니다.~할 수 있게 하다제어는 부팅 시 자동으로 시작되는 서비스를 결정하며, Default-Start:주석은 Default-Stop:(매우 대략적인) 서비스입니다.기본통제, 즉로 변환됨컨트롤을 활성화합니다.

답변2

나는 방금 Cappi의 답변에 대한 후속 조치를 배우기 위해 이것에 대해 약간의 시험을 수행했습니다.

내가 이해한 바로는 systemd-sysv-generator다음과 같은 작업을 수행합니다. /etc/init.d에 스크립트가 있으면 해당 스크립트 /etc/rc?.d/가 "모든 실행 수준"의 일부인지 확인합니다. 그렇다면 시스템 계층의 해당 런레벨에 추가됩니다. 또한 init.d 파일의 LSB 헤더에서 설명 정보를 얻습니다. 또한 LSB의 계층 구조 정보를 추가합니다.

# Required-Start: bar

행을 입력합니다.

거기에서 상황이 더 이상해집니다. 이를 실행하면 systemctl enable my_service기본적으로 chkconfig로 "파밍"하여 /etc/rc?.d 디렉토리를 조정한 다음 systemctl daemon-reload이를 실행하여 새 정보를 흡수합니다. 그러나 다음과 같이 실행됩니다 /sbin/chkconfig my_service on(후행 참고 on). 이는 실행 수준 2-5에서 열도록 지시합니다.소홀히 하다init.d 파일의 어느 위치에나 지정된 레벨입니다. 그러나 이와 같이 chkconfig를 수동으로 실행하면 chkconfig --add my_service스크립트에 지정된 수준이 적용됩니다.

또한 이상한 점은 init.d 파일에 런레벨이 지정되지 않았고 아직 심볼릭 링크되지 않은 경우입니다.어느 /etc/rc?.d폴더를 선택한 다음 systemd-sysv-generator런레벨 4와 5에서 시작한다고 가정합니다.
또한 기본 시작 런레벨이 3이더라도 이는그것은 같은4와 5. 따라서 기본적으로 rc?.d어떤 디렉토리에도 심볼릭 링크가 없더라도 어쨌든 실행하려고 한다고 가정하는 것 같습니다 .

또한 이전 버전의 systemd에서는 서비스가 "비활성화"되면 표시되지 않습니다.일반적인 목록.

또한 런레벨을 지정하는 두 가지 방법이 있다는 점에 주목할 가치가 있습니다. chkconfig와 systemctl은 "이전 스타일"보다 "LSB를 선호"하는 것 같습니다.

chkconfig 매뉴얼 페이지설명하다:

Each service which should be manageable by chkconfig needs two or more commented lines added to its init.d script. 
...
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for \
#              higher quality random number generation.
chkconfig also supports LSB-style init stanzas, and will apply them in preference to "chkconfig:" lines where available. A LSB stanza looks like:

### BEGIN INIT INFO
# Provides: foo
# Required-Start: bar
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Foo init script
### END INIT INFO

그래서 전반적으로 책의 순서가 그다지 맞지 않는 것 같습니다. 이는 systemd-sysv-generator시작 단계 초기에 실행되고 서비스를 설정하며(위에서 언급한 대로) 서비스가 자동으로 실행되어야 한다고 생각하는 경우 "실행 수준에 해당하는" 대상에서 해당 서비스를 활성화할 수도 있습니다. 그런 다음 시작이 계속되고 모든 서비스가 정상적인 순서로 시작됩니다 systemd.

etc/init.d and /etc/rc?.dsystemd따라서 이 질문에 대답하기 위해 각 로드 또는 다시 로드의 조합을 사용합니다 . 이상한 방식으로.

관련 정보