카테고리 없음

리눅스 부팅시 서비스 자동기동

필유아사 2022. 6. 22. 00:47

리눅스 서버 재부팅 시 Linux 서비스 자동 기동 설정 방법

많은 방식이 있지만 주로 사용되는 2가지 방식 중 최신에 많이 사용되는 설정 방법을 설명합니다.

 

자동기동 방법

1) init 데몬 및 런레벨로 설정

2) systemd의 서비스로 설정

최신 Linux init 데몬은 systemd입니다. systemd는 현대 Linux 시스템의 많은 구성 요소를 포함하는 프레임워크입니다.
그 기능 중 하나는 Linux용 시스템 및 서비스 관리자로 작동하는 것입니다.
systemd는 System V 명령 및 초기화 스크립트와 역호환됩니다. 이는 모든 System V 서비스가 systemd에서도 실행됨을 의미합니다. 이는 대부분의 Upstart 및 System V 관리 명령이 systemd에서 작동하도록 수정되었기 때문에 가능합니다.

 

systemd Configuration Files: Unit Files

systemd의 핵심은 단위 파일입니다. 각 단위 파일은 특정 시스템 리소스를 나타냅니다. 리소스에 대한 정보는 단위 파일에서 추적됩니다. 서비스 단위 파일은 선언적 구문이 있는 단순한 텍스트 파일(Upstart .conf 파일과 같은)입니다.
systemd와 init 방법의 주요 차이점은 systemd는 서비스 데몬 및 장치 운영 체제 경로, 마운트 지점, 소켓 등과 같은 다른 유형의 리소스 초기화를 담당한다는 것입니다. 단위 파일의 이름 지정은 service_name.unit_type 형식입니다.

dbus.service, sshd.socket 또는 home.mount와 같은 형식의 파일입니다.

 

Directory Structure

CentOS와 같은 Red Hat 기반 시스템에는 단위 파일은 두 위치에 있습니다. 기본 위치는 /lib/systemd/system/입니다. 시스템 관리자가 수정한 사용자 지정 단위 파일 또는 기존 단위 파일은 /etc/systemd/system 아래에 있습니다.

동일한 이름의 단위 파일이 두 위치에 모두 존재하는 경우 systemd는 /etc 아래에 있는 파일을 사용합니다. 서비스가 부팅 시 또는 다른 대상/런레벨에서 시작되도록 활성화되어 있다고 가정합니다. 이 경우 /etc/systemd/system의 해당 디렉토리 아래에 해당 서비스 단위 파일에 대한 심볼릭 링크가 생성됩니다. /etc/systemd/system 아래에 있는 단위 파일은 실제로 /lib/systemd/system 아래에 같은 이름을 가진 파일에 대한 심볼릭 링크입니다.

 

systemd init Sequence: Target Units

단위 파일의 특별 유형은 target unit입니다.
대상 단위 파일 이름에는 .target이 접미사로 붙습니다. 대상 단위는 하나의 특정 리소스를 나타내지 않기 때문에 다른 단위 파일과 다릅니다. 대상 단위는 특정 시정의 시스템 상태를 나타냅니다. 

 

각 대상에는 번호 대신 이름이 있습니다. 예를 들어, runlevel 3 대신 multi-user.target이 있거나 runlevel 6 대신 reboot.target이 있습니다. Linux 서버가 multi-user.target으로 부팅할 때 본질적으로 서버를 실행 수준 2, 3 또는 4로 가져옵니다. 네트워킹이 활성화된 다중 사용자 텍스트 모드입니다.

 

Runlevel (System V init)Target Units (Systemd)

runlevel 0 poweroff.target
runlevel 1 resuce.target
runlevel 2, 3, 4 multi-user.target
runlevel 5 graphical.target
runlevel 6 reboot.target

systemd default.target

systemd default.target은 System V 기본 실행 수준과 동일합니다.

System V에는 inittab이라는 파일에 정의된 기본 실행 수준이 있습니다. systemd에서 해당 파일은 default.target으로 대체됩니다. 기본 대상 단위 파일은 /etc/systemd/system 디렉토리에 있습니다. /lib/systemd/system 아래의 대상 단위 파일 중 하나에 대한 심볼릭 링크입니다.

 

systemd Dependencies: Wants and Requires

systemd Wants and Requires는 서비스 데몬 간의 종속성을 제어합니다.

System V에서 서비스는 특정 실행 수준에서 시작될 수 있지만 다른 서비스나 리소스를 사용할 수 있을 때까지 기다리도록 만들 수도 있습니다. 비슷한 방식으로 systemd 서비스는 하나 이상의 대상에 로드하거나 다른 서비스나 리소스가 활성화될 때까지 기다릴 수 있습니다.

 

systemd에서 다른 장치가 필요한 장치는 필요한 장치가 로드되고 활성화될 때까지 시작되지 않습니다. 첫 번째 장치가 활성화된 동안 필요한 장치가 어떤 이유로 실패하면 첫 번째 장치도 중지됩니다.

이것은 시스템 안정성을 보장합니다. 따라서 특정 디렉토리가 있어야 하는 서비스는 해당 디렉토리에 대한 마운트 지점이 활성화될 때까지 대기하도록 만들 수 있습니다. 

 

Practical Example: Understanding the systemd Startup Sequence

아래 명령을 실행하여 기본 대상 단위 파일을 나열합니다.

sudo ls -l /etc/systemd/system/default.target

기본 대상은 /lib/systemd/system/ 아래의 다중 사용자 대상 파일에 대한 심볼릭 링크입니다. 따라서 시스템은 System V init의 런레벨 3과 유사한 multi-user.target에서 부팅됩니다.

multi-user.target.wants

Next, let’s run the following command to check all the services the multi-user.target file wants:

모든 서비스의 multi-user.target wants를 확인하기 위해 다음 명령을 실행합니다.

sudo ls -l /etc/systemd/system/multi-user.target.wants/*.service

/usr/lib/systemd/system/ 아래의 실제 유닛 파일을 가리키는 심볼릭 링크 파일 목록을 보여줍니다.

multi-user.target 외에도 system-update.target 또는 basic.target과 같은 다양한 유형의 대상이 있습니다.

다중 사용자 대상이 의존하는 대상을 보려면 다음 명령을 실행합니다.

sudo systemctl show --property "Requires" multi-user.target | fmt -10

basic.target

다음 명령을 실행하여 basic.target에 필요한 단위가 있는지 확인할 수 있습니다.

sudo systemctl show --property "Requires" basic.target | fmt -10

그리고 몇 가지 targets 을 필요로 합니다.

sudo systemctl show --property "Wants" basic.target | fmt -10

 

재귀적으로 진행하면 sysinit.target이 다른 대상도 실행해야 하는지 확인할 수 있습니다.

sudo systemctl show --property "Requires" sysinit.target | fmt -10

sysinit.target이 원하는 다른 타겟이 있을 수 있습니다.

systemctl show --property "Wants" sysinit.target | fmt -10

Examining a systemd Unit File

sshd용 서비스 단위 파일을 살펴보겠습니다.

sudo vi /etc/systemd/system/multi-user.target.wants/sshd.service

## sshd.service 파일 내용
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

첫 번째 부분은 [Unit] 섹션의 After 절입니다. 이것은 network.target 및 sshd-keygen.target이 로드된 후 sshd 서비스를 로드해야 한다는 것을 의미합니다.

[Install] 섹션은 multi-user.target이 원하는 서비스를 보여줍니다. 이것은 multi-user.target이 sshd 데몬을 로드하지만 로드하는 동안 sshd가 실패하면 종료되거나 충돌하지 않는다는 것을 의미합니다.

multi-user.target이 기본 대상이므로 sshd 데몬은 부팅 시 시작되어야 합니다. [Service] 섹션에서 Restart 매개변수에는 on-failure 값이 있는데 이 설정을 사용하면 sshd 데몬이 충돌하거나 비정상 종료가 있는 경우 다시 시작할 수 있습니다.

 

서비스 자동기동 설정 예제

특정 작업을 하는 쉘 프로그램을 서비스로 등록하여 자동 기동되도록 설정해 보겠습니다.

  1. 실행가는한 쉘 프로그램(예: myservice.sh)
  2. 스크립트를 실행하는 명령이 포함된 644 권한이 있는 /etc/systemd/system의 ".service" 확장자가 있는 단위 파일(예: myservice.service)

: myservice.sh

echo "Service starting time is : " `date` >> myservice_start.log

 

 

: myservice.service

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /home/user/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Run the command sudo systemctl enable myservice to enable it to start on boot.

 

sudo systemctl daemon-reload

sudo systemctl enable myservice
sudo systemctl start myservice
cs

 

  서비스가 제대로 실행이 되었는지 상태를 확인하기 위해선 아래처럼 실행한다.

1
sudo systemctl status myservice