systemd로 LSB init script 실행 (작은 저항)

5038 단어 chkconfigLSBsystemd

소개



좋아하면 좋아하지 않더라도 systemd 시대 이라고 합니다. 하지만, 서비스 기동용의 스크립트는 SysV init 로 실적이 있는 것이 있으므로, 가능하면 그대로 사용하고 싶다. 그래서 시험에 사용해 보았는데, 의존 관계로 조금 곤란했기 때문에 메모. systemd 로 통일할 수 있다면 그 쪽이 혼란이 없어도 좋을 것입니다.

systemd에서 SysV init 용 스크립트 사용



systemd는 SysV init 용 스크립트를 지원합니다. 일부 제한 가 있는 것 같습니다만 , 콘솔로부터 패스워드 읽는다든가 , 부트 초기의 특수한 runlevel 로 달리고 싶다고 하는 일을 하지 않는 일반적인 서비스이면 , 특히 지장은 없다고 생각됩니다.

스크립트 설치 절차



설치는 이전과 동일한 절차를 거쳐야 합니다.

서비스 시작 스크립트 (여기서는 foobar라고 함)를 준비했다면 /etc/rc.d/init.d에 넣고 chkconfig --add foobar로 설치하십시오. runlevel 3, 4, 5 로 기동 순서는 99, 정지 순서는 10 으로 하고 싶으면, 스크립트의 헤더 코멘트에 # chkconfig: 345 99 10 라고 기술해 둡니다.

/etc/rc.d/init.d/foobar
#!/bin/sh
#
#       /etc/rc.d/init.d/foobar
#
#       Startup script for foobar
#
# chkconfig: 345 99 10
# description: foobar application
...

확인해 보겠습니다.
foo@bar$ chkconfig

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.
      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.
foobar          0:off   1:off   2:off   3:on    4:on    5:on    6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
foo@bar$

systemd의 서비스가 아니라고 하는 메시지가 나오고 있습니다만, 제대로 인식하고 있군요. runlevel의 지정도 문제 없음. 이를 위해 systemctl에서도 확인해 보겠습니다.
foo@bar$ systemctl is-enabled foobar
foobar.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig foobar --level=5
enabled
foo@bar$

자신의 수비 범위가 아닌 경우는 chkconfig에 전송하고 있습니다. 과연.

LSB 헤더로 종속성 설명



chkconfig 로 지정한 기동 순서등은, systemd 가 유효한 시스템에서는 도움이 되지 않습니다. 어쨌든/etc/rc.d/rcN.d는 거의 비어 있기 때문입니다. 따라서 systemd 아래의 서비스에 대한 종속성을 LSB 헤더로 설명합니다.

/etc/rc.d/init.d/foobar
...
# chkconfig: 345 99 10
# description: foobar application
### BEGIN INIT INFO
# Provides: foobar
# Required-Start: $remote_fs docker
### END INIT INFO
...

LSB 헤더는 ### BEGIN INIT INFO### END INIT INFO로 묶인 주석 부분입니다. Provides는 일반적으로 스크립트 이름을 지정합니다.

중요한 것은 Required-Start 입니다. 여기서 systemd 아래에서 시작하는 서비스 및 $remote_fs와 같은 가상 기능을 지정합니다.

systemd에서 어떻게 보이는지 확인하십시오.
foo@bar$ systemctl show foobar
Id=foobar.service
Names=foobar.service
Requires=basic.target
Wants=system.slice
WantedBy=multi-user.target graphical.target
Conflicts=shutdown.target
Before=shutdown.target multi-user.target graphical.target
After=remote-fs.target docker.service systemd-journald.socket basic.target system.slice netconsole.service
Description=LSB: foobar application
LoadState=loaded
ActiveState=active
SubState=exited
SourcePath=/etc/rc.d/init.d/foobar
...

이 후에도 계속해서 계속됩니다만, After=remote-fs.target docker.service ... 의 개소를 확인하면 좋네요. 제대로 인식됩니다.
systemctl list-dependencies --after <SERVICE NAME> 를 사용하면, 기동시의 종속성을 트리 표시할 수 있습니다.
foo@bar$ systemctl list-dependencies --after foobar
foobar.service
|-docker.service
|-netconsole.service
|-system.slice
|-systemd-journald.socket
|-basic.target
| |-rhel-import-state.service
| |-systemd-ask-password-plymouth.path
| |-paths.target

...

-centos\x2dswap.swap
| `-timers.target
|   `-systemd-tmpfiles-clean.timer
`-remote-fs.target
  |-mnt.mount
  `-remote-fs-pre.target

흠, 좋아 보인다. LSB 헤더를 제대로 지원하고 있는 점에 대해서는 입니다.

요약



systemd 와 SysV init 스크립트를 공존하는 방법을 정리했습니다. 그 중 싫어도 systemd에 물들어야 하는 것일지도 모릅니다만, 일단 과도적인 대응으로 도망칠 수 있었기 때문에 좋았습니다(미디어).

참고


  • systemd
  • Comment Conventions for Init Scripts - Linux Standard Base Core Specification 3.1
  • 좋은 웹페이지 즐겨찾기