시스템 수준 systemd Target을 사용자 인스턴스로 연결하기
Source: Dev.to
위에 제공된 Source 라인 외에 번역할 텍스트가 포함되어 있지 않습니다. 번역이 필요한 전체 내용(마크다운 형식 포함)을 제공해 주시면, 요청하신 대로 한국어로 번역해 드리겠습니다.
개요
systemd를 사용할 때, 많은 서비스가 네트워크가 완전히 활성화된 후에 시작되도록 network-online.target에 의존합니다.
network-online.target은 시스템 수준에 존재하지만, 최신 워크플로에서는 종종 장기 실행 서비스를 user systemd 인스턴스에서 실행합니다(예: 사용자‑관리 데몬, 개발 도구, per‑user 에이전트).
여기서 설명하는 브리지는 시스템이 “network online” 상태에 도달하자마자 특정 사용자의 systemd 인스턴스 내부에 마커 타깃을 트리거하여, 부팅 시 사용자 서비스가 network-online.target에 안정적으로 의존할 수 있게 합니다.
구성 요소
- 설치 스크립트 (
install.sh) – 필요한 시스템 및 사용자 유닛을 설정합니다. - 사용자 수준 마커 유닛 (
network-online.target) – 사용자 인스턴스 내부에서 “네트워크 온라인” 상태를 나타냅니다. - 시스템 수준 템플릿 서비스 (
user‑network‑online@.service) – 시스템의 네트워크가 온라인이 될 때까지 대기한 뒤, 지정된 UID에 대해 사용자 수준 타깃을 시작합니다.
이 세 가지가 함께 작동하여 실제 네트워크 준비 신호가 시스템 수준에서 발생하더라도 사용자 서비스가 network-online.target에 대한 의존성을 선언할 수 있도록 합니다.
사용자 Systemd 라이프사이클 처리
기본적으로 사용자의 systemd 인스턴스는 인터랙티브 로그인에 연결되어 있습니다; 사용자가 로그인하지 않으면 인스턴스가 존재하지 않을 수 있어 부팅 시 사용자 서비스가 시작되지 못합니다.
설치 스크립트는 linger를 활성화합니다:
loginctl enable-linger $USER
linger가 활성화되면 사용자의 systemd 인스턴스가 세션이 없을 때도 실행될 수 있으며, 이는 부팅 과정에서 사용자 서비스를 시작하기 위한 전제 조건입니다.
사용자 수준 마커 유닛
다음 파일을 ~/.config/systemd/user/network-online.target에 배치하십시오:
[Unit]
Description=User-level Network is Online (marker only)
Documentation=man:systemd.special(7)
이 유닛은 의도적으로 단순하게 설계되었습니다—네트워크 검사를 수행하지 않습니다. 그 유일한 목적은 사용자 서비스가 다음과 같이 선언할 수 있도록 동기화 지점을 제공하는 것입니다:
After=network-online.target
Wants=network-online.target
시스템‑레벨 서비스 템플릿
/etc/systemd/system/user-network-online@.service 파일을 다음 내용으로 생성합니다:
[Unit]
Description=Trigger user-level network-online.target for %i
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=%i
Environment=XDG_RUNTIME_DIR=/run/user/%i
ExecStart=/usr/bin/systemctl --user start network-online.target
[Install]
WantedBy=multi-user.target
- 서비스는 시스템의
network-online.target이후에 실행되어, 시스템이 네트워킹이 준비되었다고 판단한 후에만 트리거됩니다. - 사용자 수준
network-online.target을 시작하는 일회성 명령을 실행합니다. XDG_RUNTIME_DIR을 설정하면systemctl --user가 대상 사용자 인스턴스의 올바른 런타임 디렉터리를 가리키게 됩니다.
설치 스크립트
#!/bin/sh
# Enable linger for the current user
loginctl enable-linger $USER
# Install the system unit
sudo cp -t /etc/systemd/system/ user-network-online@.service
sudo systemctl daemon-reload
# Install the user target
USER_SYSTEMD_PATH="$HOME/.config/systemd/user"
mkdir -p "$USER_SYSTEMD_PATH"
cp -t "$USER_SYSTEMD_PATH" network-online.target
systemctl --user daemon-reload
# Enable and start the templated service for the current UID
sudo systemctl enable --now user-network-online@$(id -u).service
스크립트는 다음 작업을 수행합니다:
- 현재 사용자에 대해 linger를 활성화합니다.
- 시스템 유닛을
/etc/systemd/system/에 복사하고 시스템 데몬을 다시 로드합니다. - 사용자 타깃을
~/.config/systemd/user/에 설치하고 사용자 데몬을 다시 로드합니다. user-network-online@.service를 활성화하고 시작합니다. 이 유닛은WantedBy=multi-user.target을 가지고 있기 때문에 일반 부팅 과정에서 자동으로 실행됩니다. 시스템이network-online.target에 도달하면 사용자의network-online.target을 트리거하여, 종속된 사용자 서비스가 순차적이고 의존성 기반으로 시작될 수 있게 합니다.
결과 워크플로우
- System이 네트워킹이 “온라인”인지 판단합니다.
- 시스템‑레벨 서비스(
user-network-online@.service)가 **사용자‑레벨 마커**(network-online.target`)를 시작합니다. After=network-online.target(또는Wants=network-online.target)을 선언한 사용자 서비스는 네트워크가 준비되었음을 알고 안전하게 시작될 수 있습니다.- linger 덕분에 사용자가 로그인하지 않아도 부팅 시 자동으로 모든 것이 실행됩니다.
이 가벼운 패턴은 systemd의 의존성 모델과 일치하며, 신뢰할 수 있는 네트워크 가용성을 기다려야 하는 사용자‑관리 백그라운드 서비스에 견고한 기반을 제공합니다.