Search
Duplicate
📒

[Linux CLI] 07-1. 애플리케이션 서비스, 패키지 관리, systemd

상태
완료
수업
Linux
주제
연관 노트
3 more properties
참고

리눅스 애플리케이션

NOTE
리눅스 애플리케이션은 리눅스 운영체제에서 실행되는 프로그램, 바이너리, 실행 파일을 의미하며 설치는 주로 패키지 관리 시스템을 통해 이루어집니다!
애플리케이션 관리, init 시스템 등을 살펴보기 전에 관련 용어를 정리합니다.

프로그램

리눅스가 메모리에 로드하고 실행할 수 있는 파일 / 쉘 스크립트를 말합니다.

프로세스

프로세스는 실행 중인 프로그램의 인스턴스를 말합니다.
리눅스에서 프로그램이 실행되면 프로그램의 코드와 데이터를 포함하는 새로운 프로세스가 생성되며, 프로세스는 RAM에 로드되어 CPU / IO자원을 사용하여 작업을 수행합니다.

데몬(service)

데몬은 백그라운드에서 실행되는 프로세스를 말합니다.
시스템 부팅 시 자동으로 시작되며, 사용자와 직접적인 상호작용없이 서비스를 제공합니다. 대표적으로 웹 서버(Nginx)는 HTTP 요청을 처리하고, DB 데몬은(MySQL)은 데이터베이스 요청을 처리합니다.

애플리케이션

애플리케이션은 사용자가 작업을 수행할 수 있도록하는 소프트웨어이며, 프로그램과 실행에 필요한 종속성을 포함합니다.

패키지

패캐지는 특정 프로그램과 해당 프로그램을 실행하는데 필요한 파일들을 포함하는 아카이브 파일입니다.
패캐지는 프로그램의 바이너리 파일, 설정 파일, 종속성 정보를 포함할 수 있습니다.

패키지 관리자

패키지 관리자는 리눅스 시스템에서 패키지를 설치/업그레이드/제거할 수 있도록 도와주는 도구입니다.
대표적인 관리자로는 apt(Debian), yum/dnf(Red Hat)이 있습니다.

부팅

부팅은 컴퓨터 시스템이 전원을 켜는 순간부터 운영 체제가 로드되어 사용자가 시스템을 사용할 수 있는 상태가 될 때까지의 과정을 말합니다.
부팅 과정은 하드웨어 초기화, 부트로더 실행, 커널 로드, 초기화 스크립트 실행, 데몬 프로세스 시작의 단계로 구성됩니다.

리눅스 시작(부팅) 프로세스

NOTE
리눅스는 부팅프로세스(init 시스템, systemd)를 통해 시작되고 우리가 의존하는 서비스를 제공합니다.
부팅 프로세스

1. UEFI / BIOS 초기화

UEFI / BIOS는 컴퓨터가 실행될때 가장 먼서 실행되는 소프트웨어 입니다. 이 단계에서는 POST(시스템 자가진단)이 수행됩니다.
UEFI / BIOS는 부트 디바이스 목록을 확인하고, 부트 로더를 로드합니다.

2. 부트 로더 실행

부트 로더는 커널을 메모리에 로드하고 실행하는 역할을 하며 대표적으로 GRUB가 있습니다.
부트 로더는 /boot 디렉토리에 있는 커널 이미지를 메모리에 로드하며, 초기 램디스크도 로드하여 커널이 파일 시스템을 마운트할 수 있게 해줍니다.
부트 로더의 역할과 기능
운영체제 선택
커널 로드
초기 램디스크 로드
커널에 제어 넘기기

3. 커널 로드 및 초기화

커널이 메모리에 로드되면, 커널은 하드웨어를 초기화하고 루트 파일 시스템을 마운트 합니다.
커널이 초기화 작업을 마침녀, 시스템의 1번째 프로세스 init을 실행하며 PID 1을 가집니다.

4. init 시스템 초기화 & 데몬 및 서비스 시작

init 시스템은 초기화를 담당하던 프로세스이며, 현대적인 시스템에서는 systemd가 있습니다. systemd는 병렬 처리로 빠른 부팅을 지원하며, 더 많은 기능을 제공합니다
init 시스템은 다양한 daemon과 service를 시작합니다. 이들은 백그라운드에서 실행되며, 시스템이 동작하기 위한 서비스를 제공합니다.

5. 사용자 공간 초기화

마지막으로 사용자 공간을 초기화하며, 사용자가 로그인할 수 있는 터미널을 제공하고 쉘을 실행합니다.

systemd

NOTE
systemdinitd을 대체하기 위한 init시스템이었지만 현재는 리눅스 운영체제에서 시스템 및 서비스 관리자 역할을하는 소프트웨어 모임이며, 시스템 관리의 일관성 및 효율성 제공등 다양한 기능을 포함하고 있습니다.
# 서비스 활성화. 시작할 준비 systemctl enable [서비스 이름] # 모든 유닛 파일을 다시 로드하고 전체 종속성 트리생성 systemctl daemon-reload # 서비스 시작 systemctl start [서비스 이름] # 서비스 정지 systemctl stop [서비스 이름] # 서비스 정지 후 새로 시작 systemctl restart [서비스 이름] # 서비스에 reload 명령을 보낸다. (restart로 돌아감_ systemctl reolad [서비스 이름] # 서비스 실행 중지 systemctl kill [서비스 이름] # 일부 로그를 포함해서 서비스 요약 systemctl status [서비스 이름]
Bash
복사
systemctl 명령어
systemd는 부팅 시 커널에 의해 실행되는 1번째 프로세스로서, PID 1을 가지며 시스템의 init 프로세스 역할을 합니다. 모든 다른 프로세스는 systemd에 의해 시작됩니다.
오래전에 사용하던 initd방식은 부팅 과정에서 단계적으로 run-level을 순차적으로 실행시켜 설정이 복잡하고 느렸지만, systemd는 부팅시에 병렬로 실행되어 부팅속도가 빠릅니다.

systemd 유닛

NOTE
systemd는 프로세스들을 unit(유닛)으로 관리하며 수많은 uniut의 유형이 존재합니다.
systemd의 unit 종류

systemd 파일의 섹션

systemd를 실습하기 위해 아래와 같이 코드를 작성하자. 해당 코드는 Service를 1시간마다 실행시키는 파일 예제이다.
#!/usr/bin/env bash # set: 쉘 스크립트에서 동작방식 설정 # errexit: 실행중 에러 발생하면 즉각 종료 set -o errexit # errtrace: 함수, 서브쉘에서 발생한 에러도 트랩 set -o errtrace # pipefail: 파이프라인중 하나라도 실패하면 실패 set -o pipefail # 환경변수 l값 설정, export l="John" 과 같이 설정가능 name="${l}" if [ -z "${name}" ] then printf "You are awesome!\n" else printf "Hello %s, you are awesome!\n" ${name} fi
Bash
복사
greeting.sh
[Unit] Description=My Greeting Service [Service] Type=oneshot ExecStart=[실행 파일위치]
Bash
복사
greeter.service
[Unit] Description=Greeting service 1시간마다 실행 [Timer] OnCalendar=hourly
Bash
복사
greeter.timer
# systemd에 등록 cp greeter.service /run/systemd/system cp greeter.timer /run/systemd/system # 상태확인 systemctl status greeter.service systemctl status greeter.timer
Bash
복사
systemctl status greeter.timer # ● greeter.timer - Greeting service 1시간마다 실행 # Loaded: loaded (/run/systemd/system/greeter.timer; static) # Active: active (waiting) since Thu 2024-07-25 23:47:30 UTC; 1s ago # Trigger: Fri 2024-07-26 00:00:00 UTC; 12min left # Triggers: ● greeter.service # # Jul 25 23:47:30 k8s-master systemd[1]: Started Greeting service 1시간마다 실행. journalctl -f -u greeter.service # Jul 25 23:48:56 k8s-master systemd[1]: Starting My Greeting Service... # Jul 25 23:48:56 k8s-master greeter.sh[505424]: You are awesome! # Jul 25 23:48:56 k8s-master systemd[1]: greeter.service: Deactivated successfully. # Jul 25 23:48:56 k8s-master systemd[1]: Finished My Greeting Service.
Bash
복사
service 유닛: 서비스나 애플리케이션을 관리하는 방법
target 유닛: 종속성 캡쳐
mount 유닛: 마운트 지점 정의
timer 유닛: 크론 작업등에 대한 타이머
device: udev, sysfs 파일시스템용
swap: 스왑공간 설명

Systemd 유닛 디렉토리 구조

NOTE
systemd의 구성 파일과 유닛 파일은 다양한 위치에 저장될 수 있습니다. 각 위치는 특정한 목적과 용도를 가지고 있으며, systemd가 어떤 파일을 찾고 로드하는지 순서를 파악하는것이 중요합니다.

1. /etc/systemd/system

시스템 관리자에 의해 직접 생성된 유닛 파일과 설정이 저장됩니다.
해당 디렉토리에 있는 Unit 파일은 우선순위가 가장 높습니다.
사용자 정의 유닛 파일 및 오버라이드 파일이 주로 위치합니다.

2. /run/systemd/system

런타임 유닛 파일이 저장되며, 이 파일들을 시스템이 부팅되고 난 후에 동적으로 생성되거나 수정될 수 있습니다.
주로 시스템이 부팅된 이후에 일시적으로 생성된 유닛 파일이 위치합니다.
/run 디렉토리는 휘발성이므로 시스템이 재부팅되면 이 디렉토리의 내용이 사라집니다.

3. /lib/systemd/system

배포판에 의해 기본적으로 제공되는 파일이 저장됩니다.
패키지 설치 시 배포판의 패키지 관리자가 유닛 파일을 해당 디렉토리에 배치합니다.

4. /usr/lib/systemd/system

배포판에서 제공하는 유닛파일이 저장되며 /lib/systemd/system과 동일한 용도로 사용됩니다.
일부 배포판에서는 /lib/systemd/system 대신 사용하기도 합니다.

리눅스 애플리케이션 공급망

NOTE
리눅스 애플리케이션 공급망은 소프트웨어 개발 및 배포 과정에서 사용되는 모든 컴포넌트와 활동을 의미한다!
리눅스 앱 공급망
리눅스 패키지 관리와 종속성 관리의 세계
패키지와 종속성 관리를 위한 3가지 주요 카테고리 옵션에 대해서는 다음 사항을 참고하자.
1.
전통적인 패키지 관리자: 패키지 관리자가 종속성을 해결할 수 있고, 설치~제거를 제공하는 경우 고수준 패키지 관리자라고 한다.
2.
컨테이너 기반 솔루션: 컨테이너를 통해서 쉽게 테스트하고 배포가능한 앱을 만든다.
3.
최신 패키지 관리자: 데스크톱 환경에서 바로 설치하는 방법

Debian 패키지 시스템

NOTE
Debian 패키지 시스템은 파생 배포판(Ubuntu)에서 사용되며, 주로 .deb 형식의 패키지를 통해 소프트웨어를 설치~제거합니다.

dpkg(저수준 패키지)

dpkg는 저수준 패키지 관리자 도구로, 개별 패키지를 설치, 제거, 정보 조회하는데 사용됩니다.
# 패키지 설치 dpkg -i packgage.deb # 패키지 제거 dpkg -r package_name # 패키지 조회 dpkg -l package_name
Bash
복사

APT(Advanced Package Tool)

APT는 dpkg를 기반으로 하여 종속성 관리를 자동으로 처리하는 고수준 패키지 관리 도구입니다.
APT는 apt-get, apt, aptitude를 포함하며, 사용자에게 더 편리한 인터페이스를 제공합니다.
apt-get: 가장 오래된 명령어 도구로, 세밀한 제어가 가능합니다.
apt: apt-get, apt-cache의 기능을 통합하여 더 간단하고 사용자 친화적인 인터페이스를 제공해줍니다.
# 설치된 패키지 목록 dpkg -l # apt-get apt-get update apt-get install curl # apt apt update apt install curl apt show curl # curl 패키지 검증
Bash
복사
curl 설치 예시