systemd

markyang92·2021년 5월 4일
2

systemd

목록 보기
1/7
post-thumbnail
post-custom-banner


systemd의 on-demand Start-up

  • systemd의 가장 큰 특징은 유닛이 반드시 필요할 때까지 스타트업을 '지연'하는 능력이다.


1. 서비스 시작, Unit A필요한 자원 체크
2. systemd가 자원 체크용 Unit B 활성화
3. systemd가 자원을 모니터링하고, 다른 입력에 대한 자원 차단 및 버퍼링
4. Unit A를 활성화하고 자원 사용케 한다.


보조 유닛으로 부팅 최적화

  • 보조 유닛으로 부팅 최적화: 주문식(on-demand) 스타트업과 유사하다.
    • 다른 점: systemd가 보조 유닛을 활성화하자마자 곧 서비스 유닛을 시작한다.
  • syslogdbus는 부팅 타임 서비스 유닛이며, 시간이 상당히 오래 걸리고 다른 많은 유닛들이 이 유닛을 의존한다.
  • systemd는 유닛의 필수적인 자원(e.g. 소켓 유닛)을 매우 빠르게 제공할 수 있다.
    • 필수적인 유닛뿐만 아니라 필수적인 자원에 의존하는 어떤 유닛이라도 즉시 활성화 시킬 수 있다.
    • 필수 유닛이 준비가 되면 자원을 통제한다.

  • 아래는 전통적인 시스템
    • 부팅 시간표에서 서비스 E는 필수적인 자원 R을 제공한다.

    • 서비스 A,B,C는 이 자원 R에 의존하고, 서비스 E가 시작될 때까지 기다려야한다.
    • 부팅할 때, 서비스 C를 시작하기까지 상당 시간을 소비한다.

  • 아래는 systemd 부팅 설정 을 보여주고있다.
    • 유닛 R유닛 E가 제공하는 자원이다.
    • systemd는 유닛 E시작하는 동안 유닛 R을 위한 인터페이스를 제공할 수 있기 때문에 유닛 A,B,C,E는 모두 동시에 시작될 수 있다.
    • 유닛 E는 준비가 되면 유닛 R인계 받는다.
    • 이는, 유닛 A,B,C는 이들이 스타트업을 마치기 전유닛 R에 접속할 필요가 없다는 것이다.
    • 병렬적으로 실행되기 때문에, 시스템이 잠시 느려질 수 있다.
  • 중요한 점은 이 경우에 주문형 유닛 스타트업을 생성하고 있지 않더라도 주문형 스타트업과 같은 기능을 사용하게 될 것이라는 점이다. 보편적이고 실질적인 예를 원한다면, systemd를 실행하는 머신에서 syslog, D-Bus 설정 유닛을 보면된다.

소켓 유닛과 서비스에 대한 예

1. echo.socket

  • /etc/systemd/system/echo.socket
    • 이 서비스의 기본 개념은 '네트워크 클라이언트'가 이 서비스연결했을 때, 서비스클라이언트가 보내는 모든 내용을 반복한다는 것이다.
    • 유닛은 'TCP Port 22222' 를 듣게된다.
    • 우리는 이것을 서비스라고 부를 것이고, 소켓 유닛으로 시작할 것이다.

  • 이 서비스를 active 시키고, Port 22222에 대한 접속이 오면, echo@x.service 인스턴스들이 만들어진다.

2. 인스턴스와 hand-off

  • echo@.service 유닛은 동시에 여러 개의 인스턴스를 지원하기 때문에 이름에 '@'가 들어간다.
  • echo.socket의 [Socket]섹션의 Accept=yes 때문에, 서비스 유닛은 반드시 다수의 인스턴스를 지원해야한다.
    • 이 옵션은 포트를 읽고 유입되는 연결을 수용하고, 그 유입된 연결을 서비스 유닛으로 전송하도록 systemd에 지시한다.
    • 이 때, 개별적인 인스턴스를 갖게 된다.
    • 각 인스턴스는 해당 연결로부터 데이터를 읽지만, 데이터가 네트워크 연결로부터 유입되고 있다는 것을 반드시 알아야 할 필요는 없다.
    • 서비스 유닛이 연결을 'Accept'하는 것에 관한 모든 작업을 할 수는 있지만, 만약 그렇게 하면 서비스 이름에 '@'를 넣지 않고, 소켓을 완벽하게 제어할 것이다. 그리고 systemd는 서비스를 유닛이 종료될 때까지 네트워크 포트를 다시 들으려는 시도를 하지 않을 것이다.

systemd의 Sys V 호환성

  • systemd는 System V 호환 init 스크립트를 통해, 더 완벽한 서비스 추적 작업을 시도한다.
    • System V 호환성 스크립트를 통해 systemd를 돌리는 모드는 여전히 순차적으로 init 스크립트를 실행
  1. systemd는 runlevel<N>.target을 활성화 시킨다.
  2. /etc/rc<N>.d의 각 심볼릭 링크에 대하여 systemd는 /etc/init.d의 스크립트를 확인한다.
    /etc/rc<N>.d
    /etc/rc5.d/의 sym link들. /etc/init.d에 연결되어 있다.
  3. systemd는 스크립트 명과 서비스 유닛을 결부 시킨다.
    3.1. 예: /etc/init.d/foofoo.service가 될 것이다.
  4. systemd는 서비스 유닛을 활성화시키고 rc<N>.d의 이름을 근거로 startstop을 인수로하여 스크립트를 실행한다.
  5. systemd는 스크립트의 프로세스들을 서비스 유닛과 연결시키려는 시도를한다.

systemd 종류

  1. systemd --system (default)
  2. systemd --user

로 분류할 수 있음


systemd (system)

  • systemd
    • 부팅 시, init system(PID 1)


systemd --user

  • systemd --user 프로세스
  • user가 login할 때 pam_systemd 모듈이 systemd --user 인스턴스를 launch

    $USER: dhyang, PID: 1068, /lib/systemd/systemd --user
  • systemd user instance는 User Service를 관리한다.
  • systemd user instance는 per user target으로 하는 default.target으로 bring up
    • 다른 유닛은 systemctl --user로 manually 컨트롤할 수 있다.

주의!!
1. systemd --user 인스턴스는 per-user process이지 per-session 프로세스는 아니다!
2. systemd --usersystemd --system프로세스와 별도의 프로세스이다.
2-1. User unit은 system unit이나 다른 user의 unit을 참조/depend on (X)


Unit 파일

  • Unit파일은 XDG 데스크톱 엔트리 사양에서 유래되었다. (.desktop 파일들의 경우 MS에서는 .ini 파일과 유사하다.)
  • 대괄호 ([ ])로 섹션 이름들을 넣고 각 섹션에 변수와 값(옵션)을 할당하게 되어 있다.
  • (fedora 기준)/usr/lib/systemd/system의 유닛 파일 /media.mount를 보면 /media tmpfs 파일 시스템을 나타낸다.
    • 이는 이동식 미디어를 마운트하는 '컨테이너 디렉토리'이다.
[Unit]
Description=Media Directory
Before=local-fs.target

[Mount]
What=tmpfs
Where=/media
Type=tmpfs
Options=mode=755,nosuid,nodev,noexec

systemd 위치

system unit dir(전역)

  • systemd의 system unit directory는 systemd의 전역 설정에 관련된 파일들이 존재하는 곳
    • 건드리지 않는편이 좋다.
  • /usr/lib/systemd/system

system configure dir(지역)

  • systemd의 system configure directory는 systemd의 지역 설정에 관련된 파일들이 존재
    • 이 곳을 수정하는 편이 낫다.
  • /etc/systemd/system

  • systemd --system 관련 위치
systemd locationdescription
/usr/lib/systemd/systemsystem unit directory. systemd의 전역 설정에 관련된 파일 존재
/usr/lib/systemd/user설치된 패키지 소속 Unit
/etc/systemd/systemsystem configure directory. systemd의 지역 설정에 관련 파일 존재
/etc/systemd/usersystem administrator에 의해 설치된 system-wide user unit
/etc/systemd/system/<service,timer>여기에 제작한 service, timer를 둬야 systemd --system이 알아먹음

  • systemd --user 관련 위치
systemd locationdescription
~/.local/share/systemd/userhome direcoty에서 속하여 설치된 패키지
~/.config/systemd/usersystemd --user의 Unit

systemd-[Component]

  • /etc/systemd/에 존재한다.
    • 그냥 이런게 있다고 생각하자
systemdDescription필수 유무
systemdinit daemon (PID: 1)O
systemd-journald다른 대몬프로세스들 출력(syslog, 표준 출력, 표준 에러 출력), 로그 저장 대몬O
systemd-logind사용자 로그인, 세션 등 관리 대몬O
systemd-udevd장치 관리자 대몬O
systemd-networkd네트워크 관리 대몬, DHCP 및 Virtual LAN 설정 가능X
systemd-resolvedDNS 해석 대몬X
systemd-timesyncdNTP로 컴퓨터 시간 동기화 대몬X
systemd-bootUEFI 부트로더X


systemd-resolved


systemd 설정

system, user 別 서비스,타이머

  1. systemd --system, root로 소유 및 실행할 서비스/타이머 위치

    • /etc/systemd/system/<SERVICE>.service
    • /etc/systemd/system/<TIMER>.timer
  2. systemd --user, $USER로 소유 및 실행할 서비스/타이머의 위치

    • /home/$USER/.config/systemd/user/<SERVICE>.service
    • /home/$USER/.config/systemd/user/<TIMER>.timer

Environment variables

  • systemd --user~/.bashrc 같은 환경 변수를 inherit 하지 않는다.
  • systemd --user 인스턴스에 대한 다양한 방법의 환경 변수 셋팅 법이 있다.
  1. $HOME/.config/environment.d/ 디렉토리에 NAME=VAL form으로 작성한다. environment.d 참고
  2. 모든 유저 유닛에게 영향을 미치는 /etc/systemd/user.conf 파일에 DefaultEnvironment 옵션을 사용한다.
  3. /etc/systemd/system/user@.service.d/에 config file(.conf, e.g local.conf)을 추가한다.
# ====== /etc/systemd/system/user@.service.d/local.conf ====== #
[Service]
Environment="PATH=/usr/lib/ccache/bin:/usr/local/bin:/usr/bin:/bin"
Environment="EDITOR=nano -c"
Environment="BROWSER=firefox"
Environment="NO_AT_BRIDGE=1"
  1. $ systemctl --user set-environment, $ systemctl --user import-environment명령
    running 중이 아닌, 앞으로 실행할 유저 유닛에게 환경 변수 설정
  2. $ dbus-update-activation-environment -systemd --all
    5-1. dbug에 의해 제공된다.
    5-2. $ systemctl --user import-environment과 같은 효과를 가지면서, D-BUS에게도 영향을 미친다.
    5-3. 이 명령을 shell initialization file의 끝에 추가하면된다.
  3. $ systemctl --user show-environment현재 설정된 환경 변수를 볼 수 있다.

PATH

  • ~/.bash_profilePATH를 가져와 set한다고 가정하자.
  • systemd가 수정된 PATH를 알게하고 싶다면, ~/.bash_profilePATH를 inherit하게 등록하면된다.
# ====== ~/.bash_profile ======= #
systemctl --user import-environment PATH

PATH가 import되기 전, 시작한 systemd service에는 영향을 끼치지 않는다!


pam_environment


systemd --user 항상 시작

  • systemd --user는 유저의 첫 로그인 때 시작, user의 last session close 이후 종료된다.
  • 서버 같은 경우엔 로그인 없이도 boot 이후 실행되고 user의 last session이 close되거나 해도 항상 실행되게 할 필요가 있다.
    • 오픈된 session 없이 user process running을 필요로한다면, Lingering이 사용된다.
    • 아래의 명령을 사용해 lingering을 specific user에게 enable 하자.
    • 서비스가 서버가 켜졌을 때 항상 시작되게 할 수 있다.
# loginctl enable-linger <username>

systemd service는 세션이 아니다!. logind의 외부에서 실행한다. lingering을 사용하여 automatic login 활성화를 하지마라. 이는 세션을 break 시킨다. session-permission 참고


systemd dependency

  • 부트 타임과 운영 중에 dependency는 매우 복잡하다.
  • UNIX 부트 타임 작업은 상당한 fault tolerant를 가지고 있고 종종 실패할 수도 있지만 표준 서비스에 대해서는 심각한 문제를 일으키지 않는다.
    • 예: 시스템의 디스크가 삭제되었지만, /etc/fstab에 아직 남아 있다면, 초기 파일 시스템 마운트는 실패하지만 운영에는 심각한 영향을 미치지 않는다.

$ systemd-analyze dot

  • 종속성 트리 그래프(dependency tree diagram)를 만들 수 있음
    그래프의 유닛 아래 모든 유닛들이 활성화된다.

$ systemd-analyze dot 'ssh*' > ssh.svg

$ systemctl-analyze dot 'ssh*' > ssh.svg
   Color legend: black     = Requires
                 dark blue = Requisite
                 dark grey = Wants
                 red       = Conflicts
                 green     = After
  • 'ssh*' service에 대한 dependency를 dot file로 출력
$ xdot ./ssh.svg
  • prerequisit tool: xdot ($ sudo apt install xdot)


profile
pllpokko@alumni.kaist.ac.kr
post-custom-banner

0개의 댓글