systemd에 관한 수많은 게시물, Youtube 비디오 및 "문서"를 검색한 후에도 여전히 헤매고 있습니다.
링크(https://wiki.archlinux.org/index.php/systemd#Create_custom_target) 유망해 보이지만 (나에게는) 약간 모호합니다.
질문
선택한 .service 단위로 시작할 수 있도록 사용자 정의 systemd 대상(예: foo.target )을 어떻게 생성합니까?
예
- 시스템이 default.target("foo.target"에 대한 심볼릭 링크)을 시작합니다.
- "foo.target"은 베어본 X 서버와 "gvim"과 같은 GUI 프로그램만 시작합니다.
이유
X 프로그램을 빠르게 시작하기 위해 사용자 정의 대상을 만들고 싶습니다. 필요하지 않은 모든 서비스를 제외하게 되어 기쁩니다.
미리 감사드립니다!
답변1
유닛 파일은 systemd의 대상과 그 밖의 모든 것을 정의하는 데 사용된다는 점을 읽어보고 man 5 systemd.unit
알려 주십시오. man 5 systemd.target
만드는 방법에 대한 구체적인 문서는 없습니다.표적, 그래서 어떻게 해야 할지 파악하기 어렵지만, 서비스를 만드는 것과 크게 다르지 않습니다.
목표를 만들 때 필요한 것은심볼릭 링크target.wants
systemd 서비스 디렉터리에서 이 디렉터리로 이동합니다. 그런 다음 목표를 설정/실행할 수 있습니다. 귀하의 예에 따라 다음과 같이 보일 수 있습니다.
/etc/systemd/system/foo.target
이것은 타겟의 유닛 파일입니다. graphic.target을 예로 들면 이를 기반으로 사용하여 자체 대상을 만들 수 있습니다.
[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes
systemd 맨페이지의 옵션을 설명하세요.
Description
- 목표를 설명해주세요. 당신은 이해해야Requires
-- 대상의 강한 종속성. 자신의 서비스를 시작하기 전에 기본 시스템을 시작해야 합니다.Wants
——소프트 종속성. 대상은 아님필요하다그것이 시작하는 데 필요한 전부입니다.Conflicts
-- 한 장치에 다른 장치와 설정이 충돌하는 경우 전자를 시작하면 후자도 중지되고 그 반대의 경우도 마찬가지입니다.After
-- 이 서비스 후에 시작하세요.AllowIsolate
-- 그것은 모두 당신과 당신의 상황에 달려 있습니다. 자세한 내용은 맨페이지에서 확인할 수 있습니다.systemd.unit(5)
/etc/systemd/system/foo.target.wants/
이 디렉터리에서는 대상에 대해 생성/필요한 서비스를 연결합니다. Wants=
단위 파일의 옵션 과 동일합니다 . 이 디렉토리를 생성한 다음 다음과 같은 심볼릭 링크를 생성합니다 ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service
. 그러면 시스템 디렉터리의 bar.service에서 foo.target.wants 디렉터리로의 심볼릭 링크가 생성됩니다.
서비스에 대한 단위 파일을 생성하는 것은 이 답변의 범위를 약간 벗어나는 것으로 생각되며 질문은 확실히 더 문서화되어 있으므로 지금은 그대로 두겠습니다. 유닛 파일을 생성할 때 간단히 target.wants 디렉터리에 심볼릭 링크를 걸거나 Wants=
지시문에 추가하세요.
답변2
이전 답변에서 언급되지 않은 것은 사용자 정의 systemd 대상이 시작 시 multi-user.target처럼 작동하려면 이를 시작 프로세스의 일부로 지정해야 한다는 것입니다.
기본적으로 당신이 원하는 것은 현재 기본값이 무엇인지 확인하는 것입니다: systemctl get-default
. graphical.target
또는 중 하나일 가능성이 높습니다 multi-user.target
.
그런 다음 /etc/systemd/system
새 기본 대상에 심볼릭 링크를 생성하고 대상이 부팅 프로세스의 확장인지 확인해야 합니다.
ln -s /etc/systemd/system/foo.target /etc/systemd/system/default.target
조사하다:
systemctl daemon-reload
systemctl get-default
이전 기본값인 경우 multi-user.target
m32에서 언급한 대로 사용자 정의 단위에서 다음과 같이 구성해야 합니다.
[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes
여기서 중요한 점은 multi-user.target이 Requires로 지정되어 있다는 것입니다. 모든 의미에 대한 자세한 내용은 @m32의 답변을 참조하세요.
여기서 수행하는 작업은 사용자 정의 단위를 사용하여 시작 프로세스를 확장하는 것입니다. 이것을 systemd의 기본값으로 설정하면 systemd가 시작 시 장치를 로드하도록 지시합니다. 그런 다음 해당 목표의 구성은 가장 기본적인 목표에 도달할 때까지 다른 목표를 가져옵니다. 적어도 지금은 그렇게 이해한다.
그런 다음 다른 답변에서 언급했듯이 Wants=
지시문에 장치를 지정 하고 장치의 설치 섹션에 foo.target
추가할 수 있습니다. WantedBy=foo.target
실행 시 사용하려는 유닛은 여전히 활성화해야 합니다 systemd enable foobar.service
.
결론적으로:
- 기존 목표의 확장으로 목표 만들기
- 기본 대상으로 만들기 위해 심볼릭 링크를 만듭니다.
- 시작하려는 모든 단위에 이 목표를 지정하십시오.
- 이 방법으로 부팅 시 시작하려는 모든 장치를 활성화합니다.
런레벨에 대한 이 문서에는 자세한 내용이 있습니다.https://www.landoflinux.com/linux_runlevels_systemd.html
답변3
이 작업을 완료하기 전에 다음 예제를 살펴보는 것이 좋습니다.
vim /lib/systemd/system/*.target
자신만의 타겟을 생성하는 경우 수동으로 연결할 필요가 없습니다.
서비스를 추가 /etc/systemd/system
하고 실행하기 만 하면 됩니다 systemctl enable
. 그냥 그것 WantedBy
또는 RequiredBy
systemd가 당신을 위해 모든 작업을 수행할 것입니다.