리눅스

#5-1 리눅스 부팅과 셧다운

sundori 2024. 12. 15. 15:01

목차

     

    리눅스 부팅

    부팅은 컴퓨터의 전원이 켜진 후 운영체제가 가동되어 사용자가 컴퓨터를 사용이 가능하게 하는 과정이다.

    시스템에 장착된 하드웨어를 인식하고 점검하며 사용자가 운영체제를 사용하고 다양한 응용 프로그램을 메모리에 상주시키는 단계로 나눈다.

    리눅스 부팅 과정: 하드 디스크에 설치된 운영체제의 부팅 단계

    1.BIOS/UEFI 초기화

    • 설명:
      • 전원이 켜지면 BIOS 또는 UEFI가 실행되어 하드웨어를 초기화하고 점검한다.
      • POST(Power-On Self-Test)를 수행하여 CPU, 메모리, 저장 장치 등의 기본 하드웨어 상태를 확인한다.
    • 결과:
      • 부팅 가능한 디바이스(예: 하드 디스크, USB)를 탐색하고, 부트 로더를 실행한다.

    2.부트 로더 로딩

    • 설명:
      • BIOS/UEFI가 디스크의 부트 섹터(MBR 또는 GPT)를 읽고 부트 로더(예: GRUB)를 메모리에 로드한다.
      • 부트 로더는 사용자가 선택한 운영체제를 부팅하기 위한 정보를 관리한다.
    • 결과:
      • GRUB 메뉴에서 부팅할 커널과 옵션을 선택하거나 기본값으로 진행한다.

    3.커널 로딩

    • 설명:
      • 부트 로더가 선택한 리눅스 커널 이미지를 메모리에 로드한다.
      • 초기화 램 디스크(initrd 또는 initramfs)를 메모리에 로드하여 커널이 파일 시스템과 필요한 드라이버에 접근할 수 있도록 한다.
    • 결과:
      • 커널이 시스템 하드웨어를 초기화하고, 루트 파일 시스템을 마운트한다.

    4.init 프로세스 실행

    • 설명:
      • 커널이 초기화 완료 후, 시스템의 첫 번째 프로세스인 init(또는 systemd)를 실행한다.
      • init은 시스템을 부팅하기 위한 주요 서비스와 데몬을 관리한다.
    • 결과:
      • 런레벨 또는 타겟(Target)에 따라 다양한 서비스가 실행된다.

    5.서비스 및 데몬 시작

    • 설명:
      • init 또는 systemd는 설정된 런레벨/타겟에 따라 서비스(예: 네트워크, 로깅, 데이터베이스)를 시작한다.
      • 예: /etc/init.d 또는 /etc/systemd/system 디렉터리에 정의된 서비스 스크립트를 실행한다.
    • 결과:
      • 시스템이 정상적으로 동작할 수 있는 환경이 준비된다.

    6.사용자 로그인

    • 설명:
      • 모든 서비스가 실행되면 로그인 화면(TTY 또는 GUI)이 표시된다.
      • 사용자는 getty 또는 display manager를 통해 텍스트 또는 그래픽 환경에 로그인한다.
    • 결과:
      • 사용자는 셸 또는 데스크톱 환경을 통해 시스템을 사용할 수 있다.

    단계내용

    단계  내용
    1. BIOS/UEFI 초기화 하드웨어 초기화 및 POST 수행, 부트 디바이스 선택.
    2. 부트 로더 로딩 GRUB와 같은 부트 로더를 통해 커널 선택 및 실행.
    3. 커널 로딩 커널과 초기 램 디스크(initrd, initramfs)를 메모리에 로드.
    4. init 실행 커널이 초기화 완료 후 init 또는 systemd를 실행하여 서비스 관리.
    5. 서비스 및 데몬 시작 시스템 서비스를 시작하여 시스템을 준비.
    6. 사용자 로그인 사용자 로그인 화면을 통해 시스템 사용 가능.

    리눅스 부트 프로세스

    리눅스는 초창기 부터 유닉스부터 사용하던 init 프로세스를 사용해서 부팅을 한다.

    init은 부팅 과정에서 중요한 역할을 하지만, 부팅과 관련된 모든 작업을 직접 수행하는 것이 아니라 초기화 작업을 관리하고 조정하는 역할을 한다. init 프로세스란 부팅 과정에서 커널이 가장 먼저 실행하는 사용자 공간 프로세스로, 부팅 이후 시스템의 초기화와 서비스 관리를 담당하는 프로세스다.

     

    로그인, 로그아웃

    리눅스는 X-Window 기반의 그래픽 로그인창과 텍스트 기반의 콘솔에 로그인하는 경우로 나뉜다.

    X-Window 기반
    텍스트 기반 로그인 창

    명령어  내용
    텍스트 모드로 기본 타겟 변경(영구) sudo systemctl set-default multi-user.target
    GUI 모드로 기본 타겟 변경(영구) sudo systemctl set-default graphical.target
    터미널에 입력 후 재부팅 시 적용된다.

     

    파일명 설명
    /etc/issue 사용자가 로그인할 때 'login:'이 출력되기 전에 출력되는 내용을 적는 파일이다.
    /etc/issue.net /etc/issue 파일과 같은 역할을 하는 파일이다.
    차이점은 issue는 로컬(Local)의 터미널로 접속할 때 출력되는 메시지를 작성하고 issue.net은 텔넷(Telnet)을 통하여 접속할 때 출력되는 메시지를 작성하는 곳이다.
    /etc/motd motd(Message Of The Day)로 성공적으로 로그인이 되었을 때 출력되는 메시지를 작성하는 곳이다.

     

     

    로그아웃

    로그아웃의 경우 콘솔 모드나 터미널에서 logout 또는 exit 명령어를 입력 또는 Ctrl + D를 누루면 로그아웃이 되며 X-Window에서는 로그아웃 버튼을 찾아 누루면 된다.

     

    systemd

    systemd는 Linux 운영체제에서 시스템의 부팅 과정을 관리하고, 실행 중인 서비스(데몬)를 제어하는 시스템 및 서비스 관리자다. 기존의 SysVinitUpstart를 대체하며, 더 빠르고 강력한 기능을 제공한다.

     

    systemd의 주요 특징

    1. 병렬 처리 지원:
      • 시스템 부팅 과정에서 가능한 작업을 병렬로 실행하여 부팅 속도를 크게 향상시킨다.
      • 기존 SysVinit에서는 작업을 순차적으로 실행했다.
    2. 데몬의 On-Demand 시작:
      • 필요할 때만 데몬을 실행하여 리소스를 절약한다.
      • 예를 들어, 네트워크 요청이 있을 때만 네트워크 서비스를 시작한다.
    3. 서비스 의존성 자동 해결:
      • 각 서비스 간의 의존성을 자동으로 분석하고, 올바른 순서로 실행 및 종료를 처리한다.
      • 이를 통해 부팅 및 서비스 관리가 더 안정적으로 이루어진다.
    4. 타겟(Target) 기반 부팅:
      • SysVinit의 런레벨 개념을 대체하여 target이라는 유연한 구조를 도입.
      • 예: multi-user.target, graphical.target.
    5. 로그 관리:
      • journalctl 명령을 통해 systemd의 로깅 시스템(journald)에서 효율적인 로그 확인 가능.
    6. 범용 소켓 활성화:
      • 소켓 활성화를 통해 네트워크 서비스를 더 효율적으로 처리.
    7. cgroups 통합:
      • Linux의 cgroups(Control Groups)와 통합하여 프로세스 리소스 사용량을 더 잘 관리.
    8. 기본화된 유닛 파일:
      • 서비스, 타이머, 소켓, 스왑 등 다양한 유닛 유형을 통합 관리.
      • 유닛 파일은 /etc/systemd/system 또는 /lib/systemd/system에 위치한다.
    systemd 관련 디렉터리
    /etc/systemd/system
    • 설명:
      사용자가 직접 생성하거나 커스터마이징한 유닛 파일이 저장되는 디렉터리.

      • 시스템 관리자에 의해 설정된 유닛 파일 및 오버라이드 파일이 위치.
      • 가장 높은 우선순위를 가지며, 다른 디렉터리의 동일한 유닛 파일을 덮어쓴다.
    • 사용 목적:
      • 기본 유닛 파일을 수정하지 않고, 커스터마이징된 설정을 적용.
      • 사용자 정의 서비스나 타겟을 생성하거나 관리.
    • 예시:
      • /etc/systemd/system/my-service.service
      • /etc/systemd/system/default.target (기본 런타임 타겟 설정)
    /run/systemd/system
    • 설명:
      런타임(부팅 이후) 동안 동적으로 생성된 유닛 파일이 저장되는 디렉터리.

      • 디스크에 영구적으로 저장되지 않으며, 시스템 재부팅 시 초기화된다.
      • 소프트웨어 또는 시스템이 자동으로 유닛 파일을 생성할 때 사용.
    • 사용 목적:
      • 런타임 동안 일시적으로 필요한 유닛 파일 저장.
      • 임시로 활성화된 유닛 또는 소켓 파일 관리.
    • 예시:
      • /run/systemd/system/some-temporary-service.service
      • 시스템 시작 중 동적으로 생성된 유닛 파일.
    /usr/lib/systemd/system
    • 설명:
      배포판에서 제공하는 기본 유닛 파일이 저장되는 디렉터리.
      • 패키지 관리자가 설치한 유닛 파일이 여기에 위치.
      • 사용자가 직접 수정하지 말아야 하며, 수정이 필요할 경우 /etc/systemd/system 디렉터리에 오버라이드 파일을 생성해야 한다.
    • 사용 목적:
      • 시스템 및 소프트웨어의 기본 동작 정의.
      • 배포판 및 패키지 관리자가 관리하는 유닛 파일의 기본 위치.
    • 예시:
      • /usr/lib/systemd/system/sshd.service (OpenSSH 데몬)
      • /usr/lib/systemd/system/network.service (네트워크 서비스)

     

    유닛 파일 로드 우선순위

    systemd는 유닛 파일을 로드할 때 아래 순서대로 디렉터리를 검색하며, 먼저 발견된 파일을 사용한다:

    1. /etc/systemd/system: 사용자 정의 유닛 파일(최우선).
    2. /run/systemd/system: 런타임 유닛 파일.
    3. /usr/lib/systemd/system: 기본 유닛 파일(배포판 제공, 최하위 우선순위).

    systemd의 핵심은 유닛(unit)이라고 부르는 일종의 대상(Object) 파일고, 유닛은 service, target, socket, path 등과 같이 다양한 유형(type)을 가지고 있다.

    systemd의 핵심: 유닛(Unit)

    systemd에서 **유닛(Unit)**은 시스템의 작업이나 리소스를 관리하기 위한 "객체"라고 생각하면 된다. 유닛은 시스템의 서비스, 소켓, 경로, 타겟 등 다양한 구성 요소를 나타내며, 이를 통해 systemd가 시스템을 제어하고 관리한다.

    쉽게 말하면:

    • 유닛은 시스템에서 특정 작업을 수행하거나 리소스를 나타내는 "설정 파일"이다.
    • 각 유닛은 **유형(Type)**을 가지며, 이 유형에 따라 동작 방식이 다르다.

    유닛(Unit)의 특징

    1. 객체(Object):
      • 유닛은 시스템 내의 대상이나 리소스(서비스, 장치, 경로 등)를 나타냄.
      • 예: sshd.service는 SSH 데몬(서비스)을 나타내는 유닛.
    2. 설정 파일:
      • 유닛은 .ini 형식의 설정 파일로 정의된다.
      • 주로 /etc/systemd/system/ 또는 /usr/lib/systemd/system/에 저장된다.
    3. 유닛 이름:
      • 파일 이름은 <이름>.<유형> 형식을 가진다.
      • 예: nginx.service, local-fs.target.

    유닛(Unit)의 주요 유형

    1. Service 유닛 (.service)

    • 설명:
      • 시스템의 서비스(데몬)를 관리하는 유닛.
      • 서비스의 시작, 중지, 재시작 등을 제어한다.
    • :
      • nginx.service (NGINX 웹 서버)
      • sshd.service (SSH 데몬)

    2. Target 유닛 (.target)

    • 설명:
      • 시스템의 상태나 그룹을 나타내는 유닛.
      • SysVinit의 런레벨과 유사한 역할.
      • 여러 유닛을 그룹으로 묶어 특정 상태를 구성.
    • :
      • multi-user.target: 텍스트 기반 멀티유저 모드.
      • graphical.target: GUI 기반 모드.

    3. Socket 유닛 (.socket)

    • 설명:
      • 네트워크 소켓(예: TCP, UDP) 또는 유닉스 소켓을 나타냄.
      • 서비스와 연동되어, 요청이 있을 때만 서비스를 시작(On-Demand).
    • :
      • cups.socket: 프린터 서비스를 위한 소켓.
      • sshd.socket: SSH 접속 요청 시 sshd.service를 시작.

    4. Path 유닛 (.path)

    • 설명:
      • 특정 경로(파일 또는 디렉터리)를 모니터링.
      • 지정된 조건(파일 생성, 수정 등)이 충족되면 연결된 유닛 실행.
    • :
      • example.path: /var/log/example.log 생성 시 특정 서비스 실행.

    5. Timer 유닛 (.timer)

    • 설명:
      • 시간 기반 작업을 실행.
      • 크론(cron)과 유사하지만 더 유연한 설정 가능.
    • :
      • backup.timer: 특정 시간마다 백업 작업 실행.

    6. Mount 유닛 (.mount)

    • 설명:
      • 파일 시스템의 마운트 포인트를 관리.
      • /etc/fstab의 항목을 대체하거나 확장.
    • :
      • home.mount: /home 디렉터리 마운트.

    7. Swap 유닛 (.swap)

    • 설명:
      • 시스템의 스왑 공간을 관리.
    • :
      • swapfile.swap: 특정 스왑 파일 활성화.

    8. Device 유닛 (.device)

    • 설명:
      • 하드웨어 장치를 나타냄.
      • udev 장치 이름과 연결.
    • :
      • dev-sda1.device: 디스크 파티션 /dev/sda1.

    9. Slice 유닛 (.slice)

    • 설명:
      • 프로세스와 리소스를 그룹화하여 관리.
      • CPU, 메모리 등 리소스 제한 가능.
    • :
      • user.slice: 사용자 세션 그룹.

    10. Scope 유닛 (.scope)

    • 설명:
      • 이미 실행 중인 프로세스를 관리.
      • 주로 D-Bus를 통해 시작된 작업에 사용.

    유닛 관계 및 동작

    • 유닛은 서로 의존성(dependency)을 정의하여 동작 순서를 관리한다.
      • 예: network.service는 basic.target 이후에 실행.
    • systemd는 이러한 의존성을 분석해 필요한 유닛을 올바른 순서로 실행하거나 중지.

    서비스(service)

    시스템에서 제공하는 서비스, 즉 웹 서버나 메일 서버와 같은 데몬(daemon)을 말한다.

    **데몬(daemon)**은 리눅스와 유닉스 기반 시스템에서 백그라운드에서 실행되는 프로세스를 의미한다. 주로 시스템의 특정 기능을 관리하거나 서비스를 제공하기 위해 지속적으로 실행된다.

    systemd 체제에서 서비스들은 init 체제에서 chkconfig, service와 같이 다양한 명령으로 제어된 것과 다르게 systemctl이라는 명령어로 통합되어 제어된다.

     

    서비스가 이해가 안되는 분들을 위해 실제 프로젝트에 사용된 것을 예시로 작성해봅니다..
        프로젝트 환경


    • 서버 환경: CentOS 8이 설치된 서버용 컴퓨터.
    • 개발 환경: 인텔리제이(IntelliJ)와 이클립스(Eclipse)를 사용하여 Java 기반 애플리케이션을 개발하고 빌드.
    • 목적: Java 애플리케이션을 배포하고, 외부 사용자가 웹을 통해 접근할 수 있도록 서비스 환경 구성.
    프로젝트에서 사용된 예시
    Tomcat: 애플리케이션 서버
    • 역할:
      • 개발된 Java 프로젝트(예: 웹 애플리케이션)를 실행시키는 서버.
      • 클라이언트의 요청(예: HTTP/HTTPS)을 처리하고, 애플리케이션 로직에 따라 동작한다.
    • 프로세스:
      • Java 프로젝트를 WAR 파일로 빌드하여 Tomcat의 webapps 디렉토리에 배포.
      • Tomcat이 백그라운드에서 실행되며 애플리케이션을 구동.
    • 서비스와 관련된 데몬:
      • tomcat.service: Tomcat 서버를 백그라운드에서 실행하여 요청을 처리.
    • 실제 사용:

      sudo systemctl start tomcat

      Tomcat을 시작하여 서버를 열고, 브라우저에서 http://localhost:8080으로 접근해 애플리케이션 확인.
    httpd(Apache): 웹 서버 및 리버스 프록시
    • 역할:
      • 클라이언트와 Tomcat 간의 중계자 역할 수행.
      • HTTP 요청을 받아 클라이언트가 직접 Tomcat에 접근하지 못하도록 보호.
      • 포트 포워딩을 통해 Tomcat(8080번 포트)을 클라이언트가 접근 가능한 80번 포트로 매핑.
    • 프로세스:
      • Apache가 클라이언트 요청을 받아 처리하거나, 특정 URL 요청을 Tomcat으로 전달.
      • SSL 설정 등을 통해 클라이언트와의 연결을 안전하게 관리.
    • 서비스와 관련된 데몬:
      • httpd.service: Apache 웹 서버를 백그라운드에서 실행하여 요청 처리.
    • 실제 사용:
      sudo systemctl start httpd
      Apache를 시작하여 브라우저에서 http://mydomain.com 와 같은 주소로 접근 가능하도록 설정.
    MySQL: 데이터베이스 서버
    • 역할:
      • Java 애플리케이션에서 사용하는 데이터를 저장하고 관리.
      • 사용자 인증 정보, 게시글, 로그 등 다양한 데이터를 MySQL을 통해 저장하고 제공.
    • 프로세스:
      • Java 애플리케이션이 JDBC를 통해 MySQL에 접근.
      • 쿼리를 통해 데이터를 조회하거나 업데이트.
    • 서비스와 관련된 데몬:
      • mysqld.service: MySQL 데이터베이스 서버를 백그라운드에서 실행.
    • 실제 사용:
      sudo systemctl start mysqld
      MySQL을 시작하고, Java 애플리케이션이 데이터베이스에 접근하도록 설정.

    1. 서버 구동:
      • Java 프로젝트를 Tomcat에 배포하여 서버를 실행.
      • Tomcat은 클라이언트 요청을 처리하고 MySQL 데이터베이스와 상호작용.
    2. 포트 포워딩:
      • Tomcat은 기본적으로 8080 포트에서 동작하지만, 외부 사용자는 일반적으로 80 포트를 사용한다.
      • Apache(httpd)를 사용해 클라이언트 요청을 받아 8080 포트로 전달.
    3. 데이터 처리:
      • 클라이언트가 웹 페이지에서 데이터를 입력하거나 조회하면, Tomcat은 요청을 받아 MySQL에서 데이터를 조회하거나 저장.
    4. 결과 반환:
      • MySQL에서 가져온 데이터를 Java 애플리케이션이 처리하고, Apache가 결과를 클라이언트에게 반환.

    결론
    이 프로젝트에서 사용된 서비스는 다음과 같다:
    1. Tomcat: Java 애플리케이션을 실행하는 애플리케이션 서버.
    2. httpd(Apache): 클라이언트 요청을 받아 Tomcat으로 전달하고, 포트 포워딩 및 보안 제공.
    3. MySQL: 애플리케이션의 데이터를 저장하고 관리.
    이 세 가지 서비스는 각각 독립적으로 실행되며, 데몬으로 백그라운드에서 동작한다. 이를 통해 사용자는 안전하고 효율적으로 웹 서비스를 제공받을 수 있다.

    실제로  서비스에 등록하여 사용중인 예를 보자.

    위의 사진을 보면 서비스 상태에 대한 정보를 볼 수 있는데 그중 초록색이 눈에 보인다. 밑에 표를 보면 알 수 있다.

    상태값 내용
    loaded 유닛의 환경 설정 파일이 프로세스에 로드되었음을 나타낸다.
    enabled 유닛이 부팅 시 자동으로 활성화되도록 설정되었음을 나타낸다.
    disabled 유닛이 부팅 시 자동으로 활성화되지 않음을 나타낸다.
    active(running) 유닛이 실행 중이며, 현재 정상적으로 동작하고 있음을 나타낸다.
    active(extied) 유닛이 성공적으로 **완료(종료)**된 상태를 나타낸다. 주로 실행이 끝난 1회성 작업이나 타겟에서 확인된다.
    failed 유닛이 시작되거나 실행되는 과정에서 오류가 발생했음을 나타낸다.
    systemctl(또는 service) mysqld start
    systemctl(또는 service) mysqld stop

    **service mysqld start**와 service mysqld stop:
    • 이 명령은 전통적인 SysVinit 방식으로, systemd 이전의 리눅스에서 사용되었다.
    • CentOS 7 이상에서는 service 명령도 여전히 사용할 수 있지만, 내부적으로 systemctl을 호출한다.
      따라서 systemctl을 사용하자...

     

    다음장에 이어서..

    '리눅스' 카테고리의 다른 글

    #6-1 리눅스 파일 시스템  (0) 2025.01.09
    #5-2 리눅스 부팅과 셧다운  (0) 2025.01.09
    #4 리눅스 디렉터리  (0) 2024.12.15
    #3 리눅스의 구조  (0) 2024.12.15
    #2 리눅스 시스템  (1) 2024.12.13