04. systemd - 이론

prana·2023년 3월 6일
0

Linux

목록 보기
17/28

출처 : 유튜브 따라하면서 배우는 it - 리눅스 고급

목차

  1. systemd란?
  • init의 세대 교체
  1. systemd 유닛
  • 유닛의 종류
  1. systemd 관련 명령어
  • systemctl 명령어
  1. 따라학IT
  • systemctl 명령어 사용해보기

systemd란? - init의 세대교체

init 뿐만 아니라 다른 기능들도 대체한 systemd

  • PID : Process ID , 운영체제에서 프로세스를 식별하기 위해 부여하는 번호.
  • 프로세스는 실행중인 프로그램을 의미한다. 메모리에 적재, 프로세스의 상태 정보, PCB를 포함한 개념이다.

  • PPID : 커널(운영체제)가 실행시키는 애 0번.

  • Parent Process ID 의 줄임말로, 부모 프로세스의 PID를 의미한다.

  • 부모 프로세스는 현재 실행중인 프로세스(자식 프로세스)를 시스템 콜을 호출하여 생성한 프로세스를 의미한다.

init 프로세스는 PID 1을 갖는 최초 프로세스이다. 부팅 시 운영체제가 생성하는 프로세스이다.

  • 프로세스는 다른 프로세스로부터 생성되는데, 이 때 생성된 프로세스가 자식이 ㅗ디고, 이를 생성한 프로세스가 부모 프로세스가 된다.

  • 리눅스를 부팅하면 커널이 가장 먼저 실행시키는 프로세스

  • 기존의 리눅스는 가장 먼저 init 프로세스를 실행하고, 👍init 프로세스가 필요한 다른 프로세스를 실행

    (부팅 과정 중: 앞에는 같음. post -> 부팅 장치 찾고 -> mbr 부트 코드 실행 -> 부트 로더 -> 커널 선택 -> 커널 메모리로 올라옴 -> init이나 systemd 등 실행 시키게 함 )

  • init이란 ls /etc/ | grep rc.

  • rc 숫자 디렉토리 안에 있는 여러 가지 스크립트를 실행/종료 등 내용을 수행.

  • 예전에는 열 몇개 등 많이 있었음.

  • (이제는 X) 기존의 init 프로세스는 단계적으로 런 레벨을 올려가며 해당 런 레벨의 rc(Run command) 스크립트를 차례대로 실행
    -🌟 각 런레벨의 상태를 만들어주는 것이 init 프로세스가 실행해주었다. 엄청 오래됨.

  • 하지만 init은 아주 오래전 리눅스에서부터 사용하던 아주 오래된 프로세스였고,
    이에 계속해서 기능이 추가되면서 프로그램들이 복잡해지다보니 👎효율 또한 떨어지게 되었다.

  • 이에 systemdinit의 단점을 보완하며 기존 리눅스의 의존성을 해치지 않도록 개발되었다.

    • systemd는 가능한 한 병렬로 시작 프로그램들을 실행시키는 것으로 부팅 속도를 끌어올리고,
      프로그램 실행을 위한 파일로는 쉘 스크립트가 아니라,
      service라는 systemd만의 unit을 통해 체계적이면서 가독성이 좋도록 개발👍되었다.
  • systemd는 단지 init뿐만 아니라, 다른 프로그램들의 기능마저 대체

  • 네임서버 주소를 설정하는 resolv.conf의 자리를 systemd-resolved가 대체, DHCP 서버에서 IP를 받아와 네트워크 인터페이스에 설정하는 dhcpcd의 자리를 systemd-networkd 가 대체

  • 예전의 init 디렉토리에서. (K : 해당 런레벨에서 실행하지 않음. S: 실행시킴)

systemd 유닛 - 유닛의 종류

🤔 systemd 무슨 기능을 수행?

  • 시스템 부팅 관련 프로세스를 실행
  • 서비스 관리(리눅스에서는 데몬 프로세스,백 그라운드 : ex) 웹 서버, DNS, FTP, SSH 서버 등을 관리)

    ex) 웹 서버 구축: 설치하고 실행시킬 때 systemd로 실행 (얘가 관리하기 때문)
  • systemd 는 전체 시스템을 시작하고 관리하는 데 유닛(units)이라 부르는 구성 요소를 사용

  • systemd는 관리 대상의 이름을 서비스 이름.유닛 종류의 형태로 관리

  • 유닛은 같은 이름과 종류로 구성된 설정 파일과 동일한 이름을 사용

유닛기능
service데몬의 시작, 종료, 재시작 담당atd.service
socket소켓을 관리하는 유닛dbus.socket
device리눅스의 여러 장치들을 관리dev-sda.device
mount마운트 포인트 관리boot.mount
automount자동 마운트 포인트 관리proc-sys-fs-binfmt_misc.automount
  • mount : 디스크 관리할 때 배움.
  • service 중요.

systemd 관련 명령어 - systemctl 명령어

systemd를 제어하는 systemctl 명령어
⭐systemctl [옵션][명령] [유닛이름]

  • 옵션
    -a: 상태와 관계없이 유닛 전체를 출력한다
    -t [유닛의 종류] : 지정한 종류의 유닛만 출력한다.

  • 명령
    start: 유닛을 시작한다.
    stop: 유닛을 정지한다.
    reload: 유닛의 설정 파일을 다시 읽어온다.
    restart: 유닛을 재시작한다.
    status: 유닛이 현재 상태를 확인한다.
    enable: 부팅 시 유닛이 자동으로 시작되도록 설정한다.
    disable: 부팅 시 유닛이 자동으로 시작되지 않도록 설정한다.

훨씬 더 많음...


실습

  1. systemctl 명령어 사용해보기 - 여러 서비스들 제어해보기
  • 지금은 스크립트 파일이 없어졌다...!
  • 2020년 버전

    이것도 다른 위치로 간 것 같다.

  • 이제는 /etc/systemd에 있다. 설정 파일들이. logind.conf 를 본다면,
  • 내용이 훨씬 간단해짐.
  • systemctl 하면 엄청 많은 유닛들이 나온다.
  • .device, .mout 등 해당 유닛의 종류들이 나온다.
  • .service 유닛들을 중요하게 생각해야 한다.

서비스 타입들의 유닛들을 확인하는 법

  • systemctl list-unit-files --type service
  • atd.service : 예약작업 해주는 것. ex) 딱 한 번, 일회성 수행 /
  • systemctl status service atd.service

  • daemon 프로세스로 동작.
  • ppid : 1번. -> systemd 가 /usr/sbin/atd -f 실행파일을 실행시킨 것임.
  • ① 상태확인(active인지)
  • ② 프로세스 확인
  • 종료 : systemctl stop atd.service

  • 프로세스는 종료가 되어서, 따로 보이지는 않음
  • 좀비 프로세스라면, kill로 없애면 됨

  • 다시 시작 (start해도 되는데, ps 명령어에서 다시 확인하려고 restart 해봄)

  • 부팅 되었을 때, 해당 서비스가 바로 실행이 안 되고 수동으로 실행시켜야 함.

  • enable로 실행시켜야함.

  • 유닛파일이 등록되어 있으면 자동으로 실행 됨 -> ls -l /usr/lib/systemd/system.atd.service

  • atd의 유닛의 설정파일임.
  • 설정파일을 만들어두면, 따로 설치한 프로세스(프로그램)가 systemd로 사용 가능.
  • ~.target : 런 레벨이 init에서 쓰던 것. -> systemd에서 target으로 씀. 런레벨 3에 해당.
    graphical target: 5, rescue target : 1

  • 런레벨 몇 번으로 부팅 돼라. 5번이랑 같음.

ls -l /usr/lib/systemd/system/runlevel*.target

  • 런 레벨에 해당하는 것을 이름을 다르게 붙여놨을 뿐!

실습2. systemd- systemd에 서비스 등록 실습

  1. vi /etc/sysconfig/network-scripts/ifcfg-ens33(다름) 열어서,
    맨 밑의 ONBOOT=yes
  2. 완료한 다음, systemctl restart network.service -> 안되면
  • systemctl restart NetworkManager.service
  • systemctl status NetworkManager.service

이렇게 실행!

  • 설치하면 자동으로 systemctl에 등록되는 것을 해볼 것
  • yum install httpd (패키지 관리 시)

: 인터넷 저장소에서 뒤에서 지정한 프로그램을 자동으로 다운받아서 설치해주는 것.

  • redhat에서는 yum, 우분투는 apt-get
  • 나는 초기 설치 시 설치 이미 해둬서 그런 것 같다.
  • 유닛파일 같이 설치 되어있음. 내용 보면.
  • 이 파일이 있으면, systemctl 명령어로 실행, 종료를 할 수 있다는 말.
  • 설치만 되면, 유닛파일이 생성되어 쉽게 관리를 할 수 있다.

수동으로 systemd에 등록하는 방법은?

🤩 유닛 파일을 직접 만들어줘야 한다.

  • netcat : 리눅스에도 같은 버전이 있다. 유명한 애가 아님. 자동으로 systemd에 등록되지 않는다. 설치를 하고, 서버로서 동작을 시킬 때, 어떻게 systemd에 등록하는지

  • 나는 파일이 안받아져서(바이러스 발견) 캡쳐로 같이 진행하는 것으로..

  • tar zxvf로 한번에 풀기

  • directory 로 들어가면, 소스코드 여러개

  • c언어로 되어있는 파일. 프로그램으로 만들려면, 컴파일이라는 과정이 필요하다.

  • 컴파일 수행하려면 특정 프로그램이 필요한데, 그걸 설치하기로 한다.

  • rpm: 설치 실행 파일

  • yum 을 이용해서 설치하는 것이 가장 깔끔한 방법.
    ./configure -> 여러분 환경에 맞게 생성
    make -> compile 하는 것
    make install -> 컴파일 해서 나온 실행파일을 명령어 있는 곳에 복사 등

  • 에러가 없어야 제대로 설치됨.

  • nc라고 쳤을 때, Cmd line이 뜬다.

  • 이것이 가장 기본적인 형태.

🖥️ 프로그램을 설치하는 방법
1. httpd처럼 인터넷 저장소에서 자동으로 설치
2. 설치 실행파일이 있어서 그걸 다운받기
3. 소스코드로 되어 있는 파일을 직접 다운 받음

  • 서버로서 등록시키려고 하는데, nc -l -p 1000 명령어를 쳐야함.

  • systemd로 관리시키고 싶은데 -> 유닛파일 생성해주어야 함.

  • 유닛파일이 어디에? cd /usr/lib/systemd/system (버전별로 다름)

유닛 파일 만드는 방법
1. 이 파일을 vi/nano로 수동으로 만듦

  • vi nc.service
    1) 세 군데 영역 : [Unit] / [Service] / [Install] 세 가지로 나눔
    - Unit : 얘에 대한 설명, 후속조치, 동작하는 데 필요한 다른 프로그램 등의 것들을 지정
    - ⭐Service : 실행파일 위치, 설정파일 위치 지정하는 곳
    - Install : 어떤 런레벨에서 실행되게 할 것인가.

  • 내용이 정말 많음..

vi nc.service
[Unit]
Description=NETCST Server 설명 적어줌

[Service]
ExecStart=/usr/local/bin/nc -l -p 9999 : 서버처럼 동작하게 할 거면, l, p 설정
실행파일의 위치. 실행시켜라.
찾는법-> which nc
-> /usr/local/bin/nc
[Install]
WantedBy=multi-user.target : 어떤 런레벨에서 실행할 것인지.

-> systemd에 등록할 수 있음.

  • 유닛을 만들어주면 이렇게 관리를 할 수 있다.
  • 어떤 프로그램이든 systemd로 등록 안되면, 만들어주면 된다.
  • unit에 등록시켜주면 잘 되기 때문에, 추가 옵션도 가능.
  • 특정 프로그램에는 단순 이름만 써서 되는 것이 아닌 애들도 있다.
  • find / -name network.service
  • init 스크립트. systemd로 이전 호환성 때문에 못 넘어온.
    나중에 tomcat 설치해보면,
  • sh : 리눅스 쉘 스크립트 파일.
  • bat : 윈도우에서 실행하는 스크립트 파일
  • 톰캣 같은 경우에는 systemd에 등록이 안돼서, startup.sh를 실행하는 유닛 파일을 생성해 줘야 한다.

  1. 비어있는 파일을 만들고 (touch nc.service) / systemctl edit nc.service 로 수정하는 방법

0개의 댓글