10.6. systemd 장치 파일 생성 및 수정
유닛 파일에는 단위를 설명하고 해당 동작을 정의하는 구성 지시문이 포함되어 있습니다. 백그라운드에서 여러 개의 systemctl
명령이 유닛 파일을 사용하여 작동합니다. 보다 세밀하게 조정하려면 시스템 관리자가 수동으로 장치 파일을 편집하거나 생성해야 합니다. 표 10.2. “systemd 장치 파일 위치” 은 시스템에 장치 파일이 저장되는 세 가지 기본 디렉토리를 나열하며, /etc/systemd/system/
디렉터리는 시스템 관리자가 만들거나 사용자 지정할 수 있도록 /etc/systemd/system/ 디렉터리가 예약되어 있습니다.
단위 파일 이름은 다음과 같습니다.
unit_name.type_extension
여기서 unit_name 은 단위 이름을 나타내고 type_extension 은 단위 유형을 식별하며, 전체 단위 유형 목록은 표 10.1. “사용 가능한 systemd 장치 유형” 을 참조하십시오. 예를 들어 일반적으로 시스템에 sshd.service
및 sshd.socket
장치가 있습니다.
추가 구성 파일을 위해 디렉터리로 장치 파일을 추가할 수 있습니다. 예를 들어 sshd.service
에 사용자 지정 구성 옵션을 추가하려면 sshd.service.d/custom.conf
파일을 생성하고 추가 지시문을 삽입합니다. 구성 디렉터리에 대한 자세한 내용은 10.6.4절. “기존 장치 파일 수정” 을 참조하십시오.
또한 sshd.service.wants/
및 sshd.service.requires/
디렉터리를 생성할 수 있습니다. 이러한 디렉터리에는 sshd
서비스의 종속 항목인 단위 파일에 대한 심볼릭 링크가 포함되어 있습니다. 심볼릭 링크는 [Install] 유닛 파일 옵션 또는 [Unit] 옵션 기반 런타임에 따라 설치 중에 자동으로 생성됩니다( 표 10.11. “중요 [설치] 섹션 옵션”참조하십시오. 표 10.9. “중요 [Unit] 섹션 옵션” 이러한 디렉터리와 심볼릭 링크를 수동으로 생성할 수도 있습니다.
많은 단위 파일 옵션은 장치 파일이 로드될 때 장치 매개 변수로 동적으로 대체되는 와일드카드 문자열이라는 so called 단위 쿼리자를 사용하여 설정할 수 있습니다. 이렇게 하면 인스턴스화된 단위를 생성하기 위한 템플릿으로 사용되는 일반 장치 파일을 생성할 수 있습니다. 자세한 내용은 10.6.5절. “인스턴스화된 유닛으로 작업” 을 참조하십시오.
10.6.1. 단위 파일 구조 이해
단위 파일은 일반적으로 다음 세 섹션으로 구성됩니다.
- [unit] - 단위 유형에 의존하지 않는 일반 옵션이 포함되어 있습니다. 이러한 옵션은 단위 설명을 제공하고, 단위의 동작을 지정하고, 종속성을 다른 단위로 설정합니다. 가장 자주 사용되는 [Unit] 옵션의 목록은 표 10.9. “중요 [Unit] 섹션 옵션” 을 참조하십시오.
- [단위 유형] - 단위에 유형별 지시문이 있는 경우 단위 유형 뒤에 이름이 지정된 섹션 아래에 그룹화됩니다. 예를 들어, 서비스 유닛 파일에 [Service] 섹션이 포함되어 있으며, 가장 자주 사용되는 [Service] 옵션은 표 10.10. “중요 [Service] 섹션 옵션” 을 참조하십시오.
-
[install] -
systemctl enable
및disable
명령에 사용되는 유닛 설치에 대한 정보가 포함되어 있습니다. [Install] 옵션 목록은 표 10.11. “중요 [설치] 섹션 옵션” 을 참조하십시오.
옵션[a] 섹션은 systemd.unit(5) 매뉴얼 페이지를 참조하십시오. | 설명 |
---|---|
|
단위에 대한 의미 있는 설명입니다. 이 텍스트는 예를 들어 |
| 단위에 대한 URI 참조 설명서 목록을 제공합니다. |
|
유닛이 시작되는 순서를 정의합니다. 이 단위는 |
|
다른 유닛에 대한 종속성을 구성합니다. |
|
|
|
|
[a]
[Unit]에서 설정할 수 있는 전체 옵션 목록을 보려면
[b]
대부분의 경우 After 및 Before 단위 파일 옵션을 사용하여 순서가 지정된 종속성만 설정하는 것으로 충분합니다. 또한 Wants (recommended) 또는 Requires 를 사용하여 요구 종속성을 설정하는 경우에도 순서 종속성을 지정해야 합니다. 이는 순서 및 요구 사항 종속성이 서로 독립적으로 작동하기 때문입니다.
|
옵션[a] 섹션은 systemd.service(5) 매뉴얼 페이지를 참조하십시오.] | 설명 |
---|---|
|
*
*
*
*
* |
|
단위가 시작될 때 실행할 명령 또는 스크립트를 지정합니다. |
| 장치가 중지될 때 실행할 명령 또는 스크립트를 지정합니다. |
| 장치가 다시 로드될 때 실행할 명령 또는 스크립트를 지정합니다. |
|
이 옵션을 활성화하면 |
|
True로 설정하면 모든 프로세스가 종료된 경우에도 서비스가 활성 상태로 간주됩니다. 기본값은 False입니다. 이 옵션은 |
[a]
[Service에서 구성 가능한 전체 옵션 목록을 보려면
|
옵션[a] 섹션은 systemd.unit(5) 매뉴얼 페이지를 참조하십시오. | 설명 |
---|---|
|
은 단원에 대해 공백으로 구분된 추가 이름 목록을 제공합니다. |
|
단위에 종속된 유닛 목록입니다. 이 유닛을 활성화하면 |
|
장치가 약하게 의존하는 단위 목록입니다. 이 유닛을 활성화하면 |
| 유닛을 설치하거나 제거할 유닛 목록을 지정합니다. |
| 인스턴스화 단위로 제한되는 이 옵션은 장치가 활성화된 기본 인스턴스를 지정합니다. 보기 10.6.5절. “인스턴스화된 유닛으로 작업” |
[a]
[Install에서 구성 가능한 전체 옵션 목록을 보려면
|
단위 구성을 미세 조정하는 데 사용할 수 있는 전체 옵션인 예 10.17. “redfish.service 단위 파일” 은 시스템에 설치된 서비스 단위의 예를 보여줍니다. 또한 단위 파일 옵션은 10.6.5절. “인스턴스화된 유닛으로 작업” 에 설명된 대로 장치를 동적으로 생성하는 방식으로 정의할 수 있습니다.
예 10.17. redfish.service 단위 파일
다음은 postfix 패키지에서 현재 제공하는 /usr/lib/systemd/system/hiera.service
유닛 파일의 내용입니다.
[Unit] Description=Postfix Mail Transport Agent After=syslog.target network.target Conflicts=sendmail.service exim.service [Service] Type=forking PIDFile=/var/spool/postfix/pid/master.pid EnvironmentFile=-/etc/sysconfig/network ExecStartPre=-/usr/libexec/postfix/aliasesdb ExecStartPre=-/usr/libexec/postfix/chroot-update ExecStart=/usr/sbin/postfix start ExecReload=/usr/sbin/postfix reload ExecStop=/usr/sbin/postfix stop [Install] WantedBy=multi-user.target
[Unit] 섹션은 서비스를 설명하고, 정렬 종속성과 충돌하는 단위를 지정합니다. [Service]에서 사용자 지정 스크립트의 순서는 장치 활성화, 중지 및 다시 로드 중에 실행되도록 지정됩니다. EnvironmentFile
은 서비스의 환경 변수가 정의된 위치를 가리킵니다. PIDFile
은 서비스의 기본 프로세스에 대한 안정적인 PID를 지정합니다. 마지막으로 [Install] 섹션에는 서비스를 사용하는 장치가 나열됩니다.
10.6.2. 사용자 지정 유닛 파일 생성
장치 파일을 처음부터 생성하는 몇 가지 사용 사례가 있습니다. 사용자 정의 데몬을 실행하거나, 기존 서비스의 두 번째 인스턴스를 생성( 예 10.19. “sshd 서비스의 두 번째 인스턴스 생성”), SysV init 스크립트( 10.6.3절. “SysV Init 스크립트를 유닛 파일로 변환”참조)를 가져올 수 있습니다. 반면 기존 유닛의 동작을 수정하거나 확장하려는 경우 10.6.4절. “기존 장치 파일 수정” 의 지침을 사용합니다. 다음 절차에서는 사용자 지정 서비스를 생성하는 일반적인 프로세스를 설명합니다.
-
사용자 지정 서비스로 실행 파일을 준비합니다. 사용자 지정 스크립트 또는 소프트웨어 공급자가 제공하는 실행 파일일 수 있습니다. 필요한 경우 사용자 지정 서비스의 기본 프로세스에 대해 상수 PID를 유지하도록 PID 파일을 준비합니다. 서비스에 대한 쉘 변수를 저장할 환경 파일을 포함할 수도 있습니다. 소스 스크립트가 실행 가능하고(
chmod a+x
) 대화형이 아닌지 확인합니다. /etc/systemd/system/
디렉터리에 유닛 파일을 만들고 올바른 파일 권한이 있는지 확인합니다.root
로 실행:touch /etc/systemd/system/name.service
chmod 664 /etc/systemd/system/name.service
name 을 생성할 서비스 이름으로 바꿉니다. 파일은 실행 파일일 필요가 없습니다.
이전 단계에서
만든이름.service
파일을 열고 서비스 구성 옵션을 추가합니다. 생성하려는 서비스 유형에 따라 사용할 수 있는 다양한 옵션이 있습니다. 10.6.1절. “단위 파일 구조 이해” 다음은 네트워크 관련 서비스의 유닛 구성 예입니다.[Unit] Description=service_description After=network.target [Service] ExecStart=path_to_executable Type=forking PIDFile=path_to_pidfile [Install] WantedBy=default.target
다음과 같습니다.
-
service_description 은 저널 로그 파일과
systemctl status
명령의 출력에 표시되는 정보적 설명입니다. -
after
설정
은 네트워크가 실행된 후에만 서비스가 시작되는지 확인합니다. 다른 관련 서비스 또는 대상의 공백으로 구분된 목록을 추가합니다. - path_to_executable 은 실제 실행 파일의 경로를 나타냅니다.
-
type=forking
은 fork 시스템 호출을 수행하는 데몬에 사용됩니다. 서비스의 기본 프로세스는 path_to_pidfile 에 지정된 PID를 사용하여 생성됩니다. 표 10.10. “중요 [Service] 섹션 옵션” 에서 다른 시작 유형을 찾습니다. -
WantedBy
는 서비스를 시작해야 하는 대상 또는 대상을 지정합니다. 이러한 대상을 실행 수준의 이전 개념을 대체하는 대상으로 간주하면 자세한 내용은 10.3절. “systemd 대상 작업” 을 참조하십시오.
-
service_description 은 저널 로그 파일과
root
로 다음 명령을 실행하여새이름.service
파일이 있음을 systemd에 알립니다.systemctl daemon-reload
systemctl start name.service
주의새 장치 파일을 생성하거나 기존 유닛 파일을 수정한 후 항상
systemctl daemon-reload
명령을 실행합니다. 그렇지 않으면 디스크의 systemd 및 실제 서비스 유닛 파일의 상태가 일치하지 않아systemctl start
또는systemctl enable
명령이 실패할 수 있었습니다.이제 10.2절. “시스템 서비스 관리” 에 설명된 명령을 사용하여 다른 시스템 서비스로 .service 이름을 관리할 수 있습니다.
예 10.18. emacs.service 파일 생성
EgressIP 텍스트 편집기를 사용할 때 파일을 편집할 때마다 프로그램의 새 인스턴스를 시작하는 대신 백그라운드에서 실행하는 것이 더 빠르고 편리합니다. 다음 단계는 서비스처럼 처리할 수 있도록 SMT용 유닛 파일을 생성하는 방법을 보여줍니다.
/etc/systemd/system/
디렉터리에 유닛 파일을 만들고 올바른 파일 권한이 있는지 확인합니다.root
로 실행:~]# touch /etc/systemd/system/emacs.service ~]# chmod 664 /etc/systemd/system/emacs.service
파일에 다음 내용을 추가합니다.
[Unit] Description=Emacs: the extensible, self-documenting text editor [Service] Type=forking ExecStart=/usr/bin/emacs --daemon ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)" Environment=SSH_AUTH_SOCK=%t/keyring/ssh Restart=always [Install] WantedBy=default.target
위의 구성을 사용하면 서비스 시작 시
/usr/bin/emacs
실행 파일이 데몬 모드에서 시작됩니다. SSH_AUTH_SOCK 환경 변수는 런타임 디렉터리를 나타내는 "%t" 장치 지정자를 사용하여 설정됩니다. 또한 이 서비스는 예기치 않게 종료되면 emacs 프로세스를 다시 시작합니다.다음 명령을 실행하여 구성을 다시 로드하고 사용자 지정 서비스를 시작합니다.
~]# systemctl daemon-reload ~]# systemctl start emacs.service
편집기가 이제 systemd 서비스로 등록되었으므로 모든 표준 systemctl
명령을 사용할 수 있습니다. 예를 들어 systemctl status emacs
를 실행하여 편집기의 상태를 표시하거나 systemctl enable emacs
를 실행하여 시스템 부팅 시 편집기가 자동으로 시작되도록 합니다.
예 10.19. sshd 서비스의 두 번째 인스턴스 생성
시스템 관리자는 서비스 인스턴스를 여러 개 구성하고 실행해야 하는 경우가 많습니다. 이 작업은 원래 서비스 구성 파일의 사본을 생성하고 서비스의 기본 인스턴스와 충돌하지 않도록 특정 매개 변수를 수정하여 수행됩니다. 다음 절차에서는 sshd
서비스의 두 번째 인스턴스를 생성하는 방법을 보여줍니다.
두 번째 데몬에서 사용할
sshd_config
파일의 사본을 만듭니다.~]# cp /etc/ssh/sshd{,-second}_config
이전 단계에서 생성한
sshd-second_config
파일을 편집하여 다른 포트 번호 및 PID 파일을 두 번째 데몬에 할당합니다.Port 22220 PidFile /var/run/sshd-second.pid
Port
및PidFile
옵션에 대한 자세한 내용은sshd_config
(5) 매뉴얼 페이지를 참조하십시오. 선택한 포트가 다른 서비스에서 사용되지 않는지 확인합니다. PID 파일은 서비스를 실행하기 전에 존재할 필요가 없으며, 서비스 시작 시 자동으로 생성됩니다.sshd
서비스에 대한 systemd 장치 파일의 사본을 생성합니다.~]# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshd-second.service
이전 단계에서 생성한
sshd-second.service
를 다음과 같이 변경합니다.Description
옵션을 수정합니다.Description=OpenSSH server second instance daemon
첫 번째 인스턴스가 이미 시작된 후에만 시작하도록
After
옵션에 지정된 서비스에 sshd.service를 추가합니다.After=syslog.target network.target auditd.service sshd.service
- sshd의 첫 번째 인스턴스에는 키 생성이 포함되어 있으므로 ExecStartPre=/usr/sbin/sshd-keygen 행을 제거합니다.
대체 구성 파일을 사용하도록
-f /etc/ssh/sshd-second_config
매개변수를sshd
명령에 추가합니다.ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
위의 수정 후 sshd-second.service는 다음과 같이 표시됩니다.
[Unit] Description=OpenSSH server second instance daemon After=syslog.target network.target auditd.service sshd.service [Service] EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
SELinux를 사용하는 경우 sshd의 두 번째 인스턴스에 대한 포트를 SSH 포트에 추가합니다. 그렇지 않으면 sshd의 두 번째 인스턴스가 포트에 바인딩하도록 거부됩니다.
~]# semanage port -a -t ssh_port_t -p tcp 22220
부팅 시 자동으로 시작되도록 sshd-second.service를 활성화합니다.
~]# systemctl enable sshd-second.service
systemctl status
명령을 사용하여 sshd-second.service가 실행 중인지 확인합니다. 또한 서비스에 연결하여 포트가 올바르게 활성화되어 있는지 확인합니다.~]$
ssh -p 22220 user@server
방화벽이 사용 중인 경우 sshd의 두 번째 인스턴스에 대한 연결을 허용하도록 적절하게 구성되었는지 확인합니다.
- 사용자 지정 단위 파일의 순서 및 종속 항목에 대한 대상을 선택하는 방법을 알아보려면 다음 문서를 참조하십시오.
단위 파일의 순서 및 종속 항목에 의해 트리거되는 몇 가지 실제 사례 예제가 있는 추가 정보는 다음 문서에서 확인할 수 있습니다. 유닛 파일 작성에 대한 유용한 정보가 있습니까?
systemd
에 의해 시작된 서비스에 대한 제한을 설정하려면 RHEL 7 및 systemd에서 서비스 제한을 설정하는 방법을 참조하십시오. 이러한 제한은 서비스의 유닛 파일에 설정해야 합니다. systemd
는 /etc/security/limits.conf
및 /etc/security/limits.d/*.conf
구성 파일에 설정된 제한을 무시합니다. 이러한 파일에 정의된 제한은 로그인 세션을 시작할 때 PAM에 의해 설정되지만 systemd
에서 시작한 데몬은 PAM 로그인 세션을 사용하지 않습니다.
10.6.3. SysV Init 스크립트를 유닛 파일로 변환
SysV init 스크립트를 유닛 파일로 변환하는 데 시간이 걸리기 전에 변환이 아직 다른 곳에서 수행되지 않았는지 확인하십시오. Red Hat Enterprise Linux 7에 설치된 모든 핵심 서비스는 기본 장치 파일과 함께 제공되며 여러 타사 소프트웨어 패키지에 동일하게 적용됩니다.
init 스크립트를 유닛 파일로 변환하려면 스크립트를 분석하고 필요한 정보를 추출해야 합니다. 이 데이터를 기반으로 10.6.2절. “사용자 지정 유닛 파일 생성” 에 설명된 대로 단위 파일을 생성할 수 있습니다. init 스크립트는 서비스 유형에 따라 크게 달라질 수 있으므로 이 장에 설명된 것보다 번역에 더 많은 구성 옵션을 사용해야 할 수 있습니다. init 스크립트에서 사용할 수 있는 일부 수준의 사용자 지정은 더 이상 systemd 장치에서 지원되지 않습니다. 10.1.2절. “호환성 변경”
변환에 필요한 대부분의 정보는 스크립트의 헤더에 제공됩니다. 다음 예제에서는 Red Hat Enterprise Linux 6에서 postfix
서비스를 시작하는 데 사용되는 init 스크립트의 열기 섹션을 보여줍니다.
#!/bin/bash # # postfix Postfix Mail Transfer Agent # # chkconfig: 2345 80 30 # description: Postfix is a Mail Transport Agent, which is the program \ # that moves mail from one machine to another. # processname: master # pidfile: /var/spool/postfix/pid/master.pid # config: /etc/postfix/main.cf # config: /etc/postfix/master.cf ### BEGIN INIT INFO # Provides: postfix MTA # Required-Start: $local_fs $network $remote_fs # Required-Stop: $local_fs $network $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: start and stop postfix # Description: Postfix is a Mail Transport Agent, which is the program that # moves mail from one machine to another. ### END INIT INFO
위의 예에서 # chkconfig 및 # 설명으로 시작하는 행만 필수이므로 다른 init 파일에서 나머지를 찾지 못할 수 있습니다. # BEGIN INIT INFO 및 # END INIT INFO 행 사이에 있는 텍스트는 Linux Standard Base(LSB) 헤더 라고 합니다. 지정된 경우 LSB 헤더에는 서비스 설명, 종속 항목 및 기본 실행 수준을 정의하는 지시문이 포함됩니다. 다음은 새 단위 파일에 필요한 데이터를 수집하는 분석 작업의 개요입니다. postfix init 스크립트는 예제로 사용되며 예 10.17. “redfish.service 단위 파일” 에서 결과 postfix 단위 파일을 참조하십시오.
서비스 설명 찾기
#description.로 시작하는 줄에서 스크립트에 대한 설명 정보를 찾을 수 있습니다. 이 설명은 단위 파일의 [Unit] 섹션에 있는 Description
옵션에 있는 서비스 이름과 함께 사용합니다. LSB 헤더는 #Short-Description 및 #Description 행에 유사한 데이터를 포함할 수 있습니다.
서비스 종속성 검색
LSB 헤더에는 서비스 간 종속성을 형성하는 여러 지시문이 포함될 수 있습니다. 대부분의 systemd 장치 옵션은 다음과 같습니다. 표 10.12. “LSB 헤더의 종속성 옵션”
LSB 옵션 | 설명 | 단위 파일 Equivalent |
---|---|---|
| 다른 init 스크립트 ($" 접두사 사용)에서 참조할 수 있는 서비스의 부팅 기능 이름을 지정합니다. 유닛 파일이 파일 이름별로 다른 유닛을 참조하면 이 작업이 더 이상 필요하지 않습니다. | – |
|
필요한 서비스의 부팅 기능 이름이 포함되어 있습니다. 이는 순서 종속성으로 변환되며 부팅 기능 이름은 해당 서비스 또는 해당 서비스의 유닛 파일 이름으로 교체됩니다. 예를 들어 |
|
| Required-Start보다 약한 종속성을 구성합니다. Should-Start 종속성은 서비스 시작에 영향을 미치지 않습니다. |
|
| 음수 종속성을 구성합니다. |
|
서비스의 기본 대상 검색
#chkconfig 로 시작하는 줄에는 세 개의 숫자 값이 포함되어 있습니다. 가장 중요한 것은 서비스가 시작되는 기본 실행 수준을 나타내는 첫 번째 번호입니다. 표 10.6. “systemd 대상과 SysV Runlevels 비교” 을 사용하여 이러한 실행 수준을 동등한 systemd 대상에 매핑합니다. 그런 다음 장치 파일의 [Install] 섹션에 있는 WantedBy
옵션에 이러한 대상을 나열합니다. 예를 들어 postfix
는 이전에 Red Hat Enterprise Linux 7의 multi-user.target 및 graphical.target으로 변환되는 실행 수준 2, 3, 4 및 5에서 시작되었습니다. graphical.target은 drives.target에 따라 달라지므로 예 10.17. “redfish.service 단위 파일” 에서와 같이 둘 다 지정할 필요는 없습니다. 또한 LSB 헤더에서 #Default-Start 및 #Default-Stop 행에 default 및 금지된 실행 수준 정보에 대한 정보를 찾을 수 있습니다.
#chkconfig 행에 지정된 다른 두 값은 init 스크립트의 시작 및 종료 우선 순위를 나타냅니다. 이러한 값은 init 스크립트를 로드하는 경우 systemd에 의해 해석되지만, 이와 동등한 유닛 파일은 없습니다.
서비스에서 사용하는 파일 찾기
init 스크립트는 전용 디렉터리에서 함수 라이브러리를 로드해야 하며 구성, 환경 및 PID 파일을 가져올 수 있습니다. 환경 변수는 init 스크립트 헤더에서 #config 로 시작하는 행에서 지정되며 EnvironmentFile
장치 파일 옵션으로 변환됩니다. #pidfile init 스크립트 행에 지정된 PID 파일은 PIDFile
옵션을 사용하여 유닛 파일로 가져옵니다.
init 스크립트 헤더에 포함되지 않은 주요 정보는 서비스 실행 파일의 경로이며 서비스에 필요할 가능성이 있는 기타 파일입니다. 이전 버전의 Red Hat Enterprise Linux에서 init 스크립트는 Bash case 문을 사용하여 start,stop, 또는 restart 와 같은 기본 작업에서 서비스 동작을 정의했습니다. postfix
init 스크립트에서 발췌한 내용은 service start에서 실행할 코드 블록을 보여줍니다.
conf_check() { [ -x /usr/sbin/postfix ] || exit 5 [ -d /etc/postfix ] || exit 6 [ -d /var/spool/postfix ] || exit 5 } make_aliasesdb() { if [ "$(/usr/sbin/postconf -h alias_database)" == "hash:/etc/aliases" ] then # /etc/aliases.db might be used by other MTA, make sure nothing # has touched it since our last newaliases call [ /etc/aliases -nt /etc/aliases.db ] || [ "$ALIASESDB_STAMP" -nt /etc/aliases.db ] || [ "$ALIASESDB_STAMP" -ot /etc/aliases.db ] || return /usr/bin/newaliases touch -r /etc/aliases.db "$ALIASESDB_STAMP" else /usr/bin/newaliases fi } start() { [ "$EUID" != "0" ] && exit 4 # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 1 conf_check # Start daemons. echo -n $"Starting postfix: " make_aliasesdb >/dev/null 2>&1 [ -x $CHROOT_UPDATE ] && $CHROOT_UPDATE /usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start" RETVAL=$? [ $RETVAL -eq 0 ] && touch $lockfile echo return $RETVAL }
init 스크립트의 확장성을 통해 start()
함수에서 호출되는 conf_check()
및 make_aliasesdb()
를 지정할 수 있습니다. 더 자세히 살펴보면 기본 서비스 실행 /usr/sbin/journal , /
디렉토리 등 여러 외부 파일과 디렉터리가 언급됩니다.
etc/journal/ and /
구성 디렉토리 및 var/
spool/ avoided//usr/sbin/
postconf/
systemd는 사전 정의된 작업만 지원하지만 ExecStart ,ExecStartPre
,
,ExecStart
PostExecStop
및 ExecReload
옵션을 사용하여 사용자 지정 실행 파일을 실행할 수 있습니다. Red Hat Enterprise Linux 7에서 postfix
의 경우 /usr/sbin/
hiera와 지원 스크립트가 함께 서비스 시작 시 실행됩니다. 예 10.17. “redfish.service 단위 파일” 에서 postfix
유닛 파일을 참조하십시오.
복잡한 init 스크립트를 변환하려면 스크립트의 모든 문 용도를 이해해야 합니다. 일부 설명은 운영 체제 버전에 고유하므로 번역할 필요가 없습니다. 반면, 새로운 환경에서는 물론 서비스 실행 파일 및 지원 파일에서도 일부 조정이 필요할 수 있습니다.
10.6.4. 기존 장치 파일 수정
시스템에 설치된 서비스는 /usr/lib/systemd/system/
디렉터리에 저장된 기본 장치 파일과 함께 제공됩니다. 시스템 관리자는 이러한 파일을 직접 수정하지 않아야 하므로 사용자 지정을 /etc/systemd/system/
디렉터리의 구성 파일로 제한해야 합니다. 필요한 변경의 범위에 따라 다음 방법 중 하나를 선택합니다.
-
/etc/systemd/system/단위.d/
에 보조 구성 파일의 디렉터리를 만듭니다. 이 방법은 대부분의 사용 사례에 권장됩니다. 원래 장치 파일을 참조하는 동안 추가 기능을 사용하여 기본 구성을 확장할 수 있습니다. 따라서 패키지 업그레이드에 도입된 기본 단위의 변경 사항은 자동으로 적용됩니다. 자세한 내용은 “기본 장치 구성 확장”를 참조하십시오. -
/etc/systemd/system/
에서 원래 장치 파일/usr/lib/systemd/system/
의 복사본을 만들고 변경합니다. 복사는 원본 파일을 덮어쓰므로 패키지 업데이트로 인한 변경 사항은 적용되지 않습니다. 이 방법은 패키지 업데이트에 관계없이 유지되어야 하는 중요한 단위 변경을 수행하는 데 유용합니다. 자세한 내용은 “기본 장치 구성 덮어쓰기” 을 참조하십시오.
단위의 기본 구성으로 돌아가려면 /etc/systemd/system/
.에서 사용자 지정 생성 구성 파일을 삭제하면 됩니다. 시스템을 재부팅하지 않고 장치 파일에 변경 사항을 적용하려면 다음을 실행합니다.
systemctl daemon-reload
daemon-reload
옵션은 모든 유닛 파일을 다시 로드하고 전체 종속성 트리를 다시 생성합니다. 이 트리는 유닛 파일에 변경 사항을 즉시 적용하는 데 필요합니다. 또는 다음 명령을 사용하여 동일한 결과를 얻을 수 있습니다.
init q
또한 수정된 유닛 파일이 실행 중인 서비스에 속하는 경우 새 설정을 수락하려면 이 서비스를 다시 시작해야 합니다.
systemctl restart name.service
SysV initscript에서 처리하는 서비스의 종속성 또는 시간 초과와 같은 속성을 수정하려면 initscript 자체를 수정하지 마십시오. 대신 “기본 장치 구성 확장” 및 “기본 장치 구성 덮어쓰기” 에 설명된 대로 서비스에 대한 systemd
드롭인 구성 파일을 생성합니다. 그런 다음 일반 systemd
서비스와 동일한 방식으로 이 서비스를 관리합니다.
예를 들어 네트워크
서비스 구성을 확장하려면 /etc/rc.d/init.d/network
initscript 파일을 수정하지 마십시오. 대신 새 디렉토리 /etc/systemd/system/network.service.d/
및 systemd
드롭인 파일 /etc/systemd/system/network.service.d/my_config.conf
를 생성합니다. 그런 다음 수정된 값을 드롭인 파일에 배치합니다. 참고: systemd
는
로 네트워크 서비스를 알고 있으므로 생성된 디렉토리를 network
.servicenetwork.service.d
라고 지정해야 합니다.
기본 장치 구성 확장
추가 구성 옵션을 사용하여 기본 유닛 파일을 확장하려면 먼저 /etc/systemd/system/
.에 구성 디렉터리를 만듭니다. 서비스 장치를 확장하는 경우 root
로 다음 명령을 실행합니다.
mkdir /etc/systemd/system/name.service.d/
name 을 확장할 서비스의 이름으로 변경합니다. 위의 구문은 모든 유닛 유형에 적용됩니다.
이전 단계에서 만든 디렉터리에 구성 파일을 생성합니다. 파일 이름은 .conf 접미사로 끝나야 합니다. 유형:
touch /etc/systemd/system/name.service.d/config_name.conf
config_name 을 구성 파일의 이름으로 바꿉니다. 이 파일은 일반 단위 파일 구조를 준수하므로 모든 지시문을 해당 섹션에서 지정해야 합니다. 10.6.1절. “단위 파일 구조 이해”
예를 들어 사용자 지정 종속성을 추가하려면 다음 콘텐츠를 사용하여 구성 파일을 생성합니다.
[Unit] Requires=new_dependency After=new_dependency
여기서 new_dependency 는 유닛이 종속성으로 표시됨을 나타냅니다. 또 다른 예로는 기본 프로세스가 종료된 후 서비스를 다시 시작하는 구성 파일이 30초로 지연됩니다.
[Service] Restart=always RestartSec=30
하나의 작업에만 중점을 둔 작은 구성 파일을 생성하는 것이 좋습니다. 이러한 파일은 쉽게 이동하거나 다른 서비스의 구성 디렉토리에 연결할 수 있습니다.
단위에 대한 변경 사항을 적용하려면 root
로 실행합니다.
systemctl daemon-reload
systemctl restart name.service
예 10.20. httpd.service 구성 확장
Apache 서비스를 시작할 때 사용자 정의 쉘 스크립트가 자동으로 실행되도록 httpd.service 유닛을 수정하려면 다음 단계를 수행합니다. 먼저 디렉터리와 사용자 지정 구성 파일을 생성합니다.
~]# mkdir /etc/systemd/system/httpd.service.d/ ~]# touch /etc/systemd/system/httpd.service.d/custom_script.conf
Apache를 사용하여 자동으로 시작하려는 스크립트가 /usr/local/bin/custom.sh
에 있는 경우 custom_script.conf
파일에 다음 텍스트를 삽입합니다.
[Service] ExecStartPost=/usr/local/bin/custom.sh
단위 변경 사항을 적용하려면 다음을 실행합니다.
~]# systemctl daemon-reload ~]# systemctl restart httpd.service
/etc/systemd/system/
의 구성 파일은 /usr/lib/systemd/system/
의 장치 파일보다 우선합니다. 따라서 구성 파일에 Description
또는 ExecStart
와 같이 한 번만 지정할 수 있는 옵션이 포함된 경우 이 옵션의 기본값이 재정의됩니다. “Monitoring Overriden Units” 에 설명된 systemd-delta
명령의 출력에서는 합계에 있어도 특정 옵션이 실제로 재정의되어도 항상 [EXTENDED]로 표시됩니다.
기본 장치 구성 덮어쓰기
장치 파일을 제공하는 패키지를 업데이트한 후 계속 변경하려면 먼저 파일을 /etc/systemd/system/
디렉터리에 복사합니다. 이렇게 하려면 root
로 다음 명령을 실행하십시오.
cp /usr/lib/systemd/system/name.service /etc/systemd/system/name.service
여기서 name 은 수정할 서비스 유닛의 이름을 나타냅니다. 위의 구문은 모든 유닛 유형에 적용됩니다.
텍스트 편집기로 복사된 파일을 열고 원하는 대로 변경합니다. 단위 변경 사항을 적용하려면 root
로 실행합니다.
systemctl daemon-reload
systemctl restart name.service
예 10.21. 제한 시간 제한 변경
서비스당 시간 제한 값을 지정하여 시스템 중단 서비스가 중단되는 것을 방지할 수 있습니다. 그렇지 않으면 표준 서비스의 경우 시간 초과가 기본적으로 90초로 설정되고 SysV 호환 서비스의 경우 300초로 설정됩니다.
예를 들어 httpd
서비스의 시간 제한 제한을 확장하려면 다음을 수행합니다.
httpd
장치 파일을/etc/systemd/system/
디렉터리에 복사합니다.cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/httpd.service
/etc/systemd/system/httpd.service
파일을 열고[Service]
섹션에서TimeoutStartSec
값을 지정합니다.... [Service] ... PrivateTmp=true TimeoutStartSec=10 [Install] WantedBy=multi-user.target ...
systemd
데몬을 다시 로드합니다.systemctl daemon-reload
선택 사항: 새 시간 초과 값을 확인합니다.
systemctl show httpd -p TimeoutStartUSec
제한 시간 제한을 전역적으로 변경하려면 /etc/systemd/system.conf
파일에 DefaultTimeoutStartSec
를 입력합니다. 10.1절. “systemd 소개”을 참조하십시오.
Monitoring Overriden Units
재정의 또는 수정된 단위 파일의 개요를 표시하려면 다음 명령을 사용합니다.
systemd-delta
예를 들어 위 명령의 출력은 다음과 같습니다.
[EQUIVALENT] /etc/systemd/system/default.target/usr/lib/systemd/system/default.target [OVERRIDDEN] /etc/systemd/system/autofs.service /usr/lib/systemd/system/autofs.service --- /usr/lib/systemd/system/autofs.service 2014-10-16 21:30:39.000000000 -0400 +++ /etc/systemd/system/autofs.service 2014-11-21 10:00:58.513568275 -0500 @@ -8,7 +8,8 @@ EnvironmentFile=-/etc/sysconfig/autofs ExecStart=/usr/sbin/automount $OPTIONS --pid-file /run/autofs.pid ExecReload=/usr/bin/kill -HUP $MAINPID -TimeoutSec=180 +TimeoutSec=240 +Restart=Always [Install] WantedBy=multi-user.target [MASKED] /etc/systemd/system/cups.service /usr/lib/systemd/system/cups.service [EXTENDED] /usr/lib/systemd/system/sssd.service /etc/systemd/system/sssd.service.d/journal.conf 4 overridden configuration files found.
표 10.13. “systemd-delta Difference Types” systemd-delta
의 출력에 표시될 수 있는 덮어쓰기 유형을 나열합니다. 파일을 재정의하는 경우 기본적으로 systemd-delta
는 diff
명령의 출력과 유사한 변경 사항에 대한 요약을 표시합니다.
유형 | 설명 |
---|---|
[MASKED] | 마스킹된 유닛 파일, 단위 마스킹에 대한 설명은 10.2.7절. “서비스 비활성화” 을 참조하십시오. |
[EQUIVALENT] | 원본 파일을 재정의하지만 콘텐츠, 일반적으로 심볼릭 링크와 일치하지 않는 수정되지 않은 복사본입니다. |
[DIRECTED] | 다른 파일로 리디렉션되는 파일 |
[OVERRIDEN] | 재정의 및 변경된 파일. |
[EXTENDED] |
|
[UNCHANGED] |
수정되지 않은 파일은 |
시스템 업데이트 후에 systemd-delta
를 실행하여 현재 사용자 지정 구성으로 재정의된 기본 유닛에 대한 업데이트가 있는지 확인하는 것이 좋습니다. 출력을 특정 차이 유형으로만 제한할 수도 있습니다. 예를 들어 재정의된 장치만 보려면 다음을 실행합니다.
systemd-delta --type=overridden
10.6.5. 인스턴스화된 유닛으로 작업
런타임 시 단일 템플릿 구성 파일에서 여러 단위를 인스턴스화할 수 있습니다. "@" 문자는 템플릿을 표시하고 장치와 장치를 연결하는 데 사용됩니다. 인스턴스화된 단위는 다른 유닛 파일( Requires
또는 Wants
옵션 사용) 또는 systemctl start
명령으로 시작할 수 있습니다. 인스턴스화된 서비스 유닛의 이름은 다음과 같습니다.
template_name@instance_name.service
여기서 template_name 은 템플릿 구성 파일의 이름을 나타냅니다. instance_name 을 유닛 인스턴스의 이름으로 바꿉니다. 여러 인스턴스는 장치의 모든 인스턴스에 공통된 구성 옵션을 사용하여 동일한 템플릿 파일을 가리킬 수 있습니다. 템플릿 단위 이름에는 다음과 같은 형식이 있습니다.
unit_name@.service
예를 들어, 단위 파일의 다음 Wants
설정:
Wants=getty@ttyA.service,getty@ttyB.service
먼저 systemd가 지정된 서비스 장치를 검색합니다. 이러한 유닛을 찾을 수 없는 경우 "@"과 유형 접미사 사이의 일부가 무시되고, systemd는 getty@.service
파일을 검색하고, 해당 파일에서 구성을 읽고, 서비스를 시작합니다.
단위 지정자 라고 하는 와일드카드 문자를 모든 단위 구성 파일에 사용할 수 있습니다. 단위 지정자는 특정 단위 매개 변수를 대체하고 런타임 시 해석됩니다. 표 10.14. “중요 단위 지정기” 템플릿 단위에 특히 유용한 단위 연산자를 나열합니다.
단위 지정기 | meaning | 설명 |
---|---|---|
| 전체 단위 이름 |
은 유형 접미사를 포함하여 전체 단위 이름을 나타냅니다. |
| 접두사 이름 | 은 유형 접미사가 제거된 단위 이름입니다. 인스턴스화된 단위 %p는 "@" 문자 앞에 있는 단위 이름의 일부를 나타냅니다. |
| 인스턴스 이름 |
"@" 문자와 유형 접미사 사이의 인스턴스화된 단위 이름의 일부입니다. |
| 호스트 이름 | 는 장치 구성이 로드될 때 실행 중인 시스템의 호스트 이름을 나타냅니다. |
| 런타임 디렉터리 |
|
단위 연산자의 전체 목록은 systemd.unit(5)
매뉴얼 페이지를 참조하십시오.
예를 들어 getty@.service
템플릿에는 다음 지시문이 포함되어 있습니다.
[Unit] Description=Getty on %I ... [Service] ExecStart=-/sbin/agetty --noclear %I $TERM ...
getty@ttyA.service 및 getty@ttyB.service가 인스턴스화되면 위의 템플릿이 Description
=은 ttyA 및 Getty on tty B 로 확인됩니다.