리눅스

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

sundori 2025. 1. 9. 00:06

목차

    리눅스 부팅

    systemd

    타겟(target)

    타깃은 부팅 레벨, 특정 동기화 지점과 같이 유닛을 그룹화할 때 사용한다.

    'man systemd.target' 명령어를 입력해보면 타깃에 대한 설명을 볼 수 있다.

    주요 타겟 종류

    • default.target:
      • 부팅 후 진입할 기본 타겟. 보통 multi-user.target 또는 graphical.target으로 설정됨.
    • multi-user.target:
      • 그래픽 인터페이스 없이 멀티유저 텍스트 모드로 부팅.
    • graphical.target:
      • GUI 환경을 포함한 그래픽 모드로 부팅.
    • rescue.target:
      • 최소한의 서비스만 실행된 복구 모드.

    기존의 init에서는 런레벨(SysVinit) 방식으로 정수(숫자)로 표현했다. 예를들어..

     

    • 0: 시스템 종료
    • 1: 단일 사용자 모드 (복구 모드)
    • 3: 텍스트 기반 멀티유저 모드
    • 5: GUI 기반 멀티유저 모드
    • 6: 재부팅

    하지만 타겟(systemd)에서는 이름으로 상태를 정의한다. 

     

    • multi-user.target: 텍스트 기반 멀티유저 모드
    • graphical.target: GUI 기반 멀티유저 모드
    • rescue.target: 복구 모드
    • shutdown.target: 시스템 종료

    와 같이 말이다.

     

    이렇게 사용하는 이유는 무엇이냐 유연성과 확장성 등과 사용자의 정의를  위해서이다.

    '/lib/systemd/system' 경로로 접근 해보면 위 사진과 같은서비스 또는 소켓 또는 타겟들이 모여있는 것을 볼 수 있다.

     

     

     

     

     

    자 그래서 타겟이 도대체 뭔데? 궁굼할 것이다.

    systemd의 타겟은 시스템의 특정 상태를 정의하고, 이를 달성하기 위해 실행해야 할 유닛들의 그룹을 관리하는 역할을 하며, 시스템이 어떤 상태로 부팅되거나, 특정 작업 상태로 전환될 때 이를 효과적으로 조율하고 관리하기 위한 메커니즘을 말한다.

     

    소켓(socket)

    소켓 유닛은 systemd에 의해 제어되면서 소켓 기반으로 작동하는 파일 시스템 FIFO, 네트워크 소켓 등이 해당한다. 

    'man systemd.socket'에서 추가적인 정보 확인이 가능하다.

     

     

    systemd 명령어들

    systemctl은 systemd 기반의 시스템 및 서비스 관리를 제어하는 명령어로 service, chkconfig, init 등등의 기능들을 합쳐놓은 것이다.

     

    주요 옵션
    옵션 내용
    -l, --full 유닛 관련 정보를 출력할 때 긴 이름도 약어로 출력하지 않고 전체 출력.
    -t, --type=<유닛 타입> 유닛의 유형을 지정하는 옵션으로 주요 유형에는 service, target, socket 등이 있으며 사용 가능한 유형의 확인은 '-t help'와 같이 사용하면 확인이 가능하다.
    --state=<상태> 특정 상태의 유닛만 출력한다. (active, failed, inactive와 같이)
    -a, --all 비활성 유닛 포함 모두 출력
    --no-pager 출력 시 페이지네이션 없이 바로 표시
    --failed 실패한 유닛만 표시
    --reverse 유닛 목록을 역순으로 출력
    --output=<형식> 출력 형식 지정 (json, table, short 등)
    -q, --quiet  출력 최소화 (성공 및 실패 여부만 출력)
    --system 시스템 단위의 systemd의 인스턴스에서 실행.
    --user 사용자 단위의 systemd 인스턴스에서 실행.

     

    런레벨(타겟) 관련 주요 명령
       
    타겟 정보 확인 및 설정
    systemctl get-default 현재 기본 타겟(런레벨)을 확인
    systemctl set-default <타겟> 기본 타겟(런레벨)을 설정
    systemctl list-units --tpye=target 활성화된 유닛 목록을 출력.
    systemctl isolate <타겟>  시스템을 특정 타겟 상태로 즉시 전환
       
    주요 타겟
    graphical.target GUI 환경 포함 (런레벨 5와 유사).
    multi-user.target 텍스트 기반 멀티유저 모드 (런레벨 3과 유사).
    rescue.target 최소한의 서비스만 실행된 복구 모드 (런레벨 1과 유사).
    emergency.target 긴급 복구 모드, root 셸만 실행.
    shutdown.target 시스템 종료.
    reboot.target 시스템 재부팅.

     

    상태 정보 확인 명령
       
    서비스 상태 확인
    systemctl status <서비스명> 특정 서비스의 상태 확인 (활성/비활성, 로그 등).
    systemctl is-active <서비스명> 서비스가 활성화(active) 상태인지 확인.
    systemctl is-enabled <서비스명> 서비스가 부팅 시 자동 시작(enabled)인지 확인.
    systemctl is-failed <서비스명> 서비스가 실패(failed) 상태인지 확인.
       
    전체 유닛 상태 확인
    systemctl list-units 현재 활성화된 유닛 목록 확인.
    systemctl list-units --failed 실패한 유닛만 출력.
    systemctl list-units --type=service 활성화된 서비스 목록 확인.
    systemctl list-dependencies <타겟> 특정 타겟에 종속된 유닛 목록 확인.

     

    서비스 제어 명령
    systemctl start <서비스명> 서비스 시작.
    systemctl stop <서비스명> 서비스 정지.
    systemctl restart <서비스명> 서비스 재시작.
    systemctl reload <서비스명> 서비스 설정 변경 적용(재시작 없이).
    systemctl reload-or-restart <서비스명> 설정 변경이 있으면 reload, 없으면 restart.
    systemctl enable <서비스명> 서비스 부팅 시 자동 시작 설정.
    systemctl disable <서비스명> 서비스 부팅 시 자동 시작 해제.
    systemctl mask <서비스명> 서비스 실행 완전 차단 (수동 실행도 불가).
    systemctl unmask <서비스명> mask 해제.
    systemctl daemon-reload 유닛 파일 변경 사항을 systemd에 재적용.

     

    사용 예시

    1. 서비스 상태 확인
    systemctl status sshd
    
    2.서비스 시작 및 정지
    systemctl start nginx
    systemctl stop nginx
    
    3.서비스 재시작 및 설정 적용
    systemctl restart apache2
    systemctl reload apache2
    
    4.서비스 자동 시작 설정
    systemctl enable mysql
    systemctl disable mysql
    
    5.런레벨 전환(타겟 전환)
    systemctl isolate multi-user.target
    
    6.기본 타겟 설정
    systemctl set-default graphical.target
    
    7.모든 활성화된 유닛 목록 확인	
    systemctl list-units
    
    8.종속성 확인
    systemctl list-dependencies graphical.target

    systemd 로그(journalctl)

    systemd 관련 로그는 systemd-journald가 생성하고 관리한다. 관련 정보는 메타 데이터로 /run/log/journal 파일에 저장되며, 재부팅하면 관련 정보는 사라진다.

     

    journalctl [option] [항목]

     

    주요 옵션
    -e 로그의 끝부분부터 출력.
    -n <숫자> 최근 <숫자> 줄만 출력 (-n 10은 최근 10줄만 출력).
    -f 실시간으로 로그를 업데이트하며 출력(tail -f와 유사함).
    --since <시간> 특정 시간 이후의 로그만 출력.(--since "2024-12-01 11:00:00" 처럼).
    --until <시간> 특정 시간 이전의 로그만 출력.
    -p <우선순위> 로그 우선순위 필터링(info, warning, err....).
    --output <형식> 출력 형식 지정.
    --o verbose 자세한 로그 형식으로 출력.
    --no-pager 페이징 없이 출력.
    --disk-usage 로그 파일이 차지하는 디스크 용량 확인.

     

    주요 항목
    _SYSTEMD_UNIT= 특정 서비스나 유닛의 로그 확인 (예: _SYSTEMD_UNIT=nginx.service).
    _PID= 특정 프로세스 ID(PID)의 로그 확인.
    _UID= 특정 사용자 ID(UID)의 로그 확인.
    _COMM= 특정 커맨드 이름 기반 로그 확인.
    _HOSTNAME= 특정 호스트의 로그 확인 (다중 서버 환경).
    _EXE= 특정 실행 파일에 대한 로그 확인.

     

    로그 우선순위
    숫자 레벨 내용
    0 emerg 시스템 사용 불가 상태(긴급).
    1 alert 즉각 조치 필요.
    2 crit 심각한 오류.
    3 err 일반적인 오류.
    4 warning 경고 메시지.
    5 notice 중요하지 않은 정보 메시지.
    6 info 정보성 메시지.
    7 debug 디버그 메시지.

     

    1) 전체 로그 확인
    journalctl
    
    2)특정 유닛(service)의 로그
    journalctl -u nginx.service
    
    3)특정 시간 범위의 로그
    journalctl --since "1 hour ago"
    journalctl --since "2024-01-01 10:00:00" --until "2024-02-01 10:00:00"
    
    4)실시간 로그 확인
    journalctl -f
    Tip.  --output 출력 형식
    short --> 기본 출력 형식
    json --> JSON 형식으로 출력
    cat --> 순수 텍스트만 출력
    verbose --> 상세한 정보 포함
    export --> 바이너리 형식을 추출하기

    아!! 추가적으로 명령어 뒤에 붙는 ctl은 control의 약자이다.

     

    시스템 설정 주요 명령어

    timedatectl

    시스템의 시간, 날짜 및 시간대를 관리하고 NTP(Network Time Protocol) 설정을 제어하는 명령어이다. 이를 통해 시스템 시간을 설정하거나 동기화 상태를 확인할 수 있다.

    timedatectl [옵션] [명령]
    명령 내용
    status 시스템의 시간 및 RTC(Real Time Clock)의 시간 저오를 출력한다.
    set-time 시스템의 시간을 설정하는 명령으로 "2024-12-01 10:00:12"와 같은 형식으로 설정한다.
    set-timezone 타임존을 설정하는 명령으로 우리나라의 경우 'Asia/Seoul'로 지정된다.
    set-ntp <value> NTP 사용 여부를 지정하는 명령어로 1로 설정하면 사용, 0으로 설정하면 미사용으로 설정된다.

    1) 현재 시간과 날짜 확인	
    timedatectl
    
    2) 시간대 확인
    timedatectl list-timezones
    
    3) 시간대 설정
    timedatectl set-timezone <시간대>
    
    4) 시스템 시간 설정
    timedatectl set-time <시간>
    
    5) NTP 동기화 활성/비활성
    timedatectl set-ntp true
    timedatectl set-ntp false
    
    
    여기까지는 소프트웨어상의 시간이며 밑에는 하드웨어 시간 설정이다.
    
    6) RTC(하드웨어 클럭)설정
    
    RTC를 로컬 시간대 기준으로 설정:
    timedatectl set-local-rtc 1
    
    RTC를 UTC 기준으로 설정(기본):
    timedatectl set-local-rtc 0

    주요 출력 필드 설명

    • Local time: 시스템의 현재 지역 시간.
    • Universal time (UTC): 세계 표준 시간.
    • RTC time: 하드웨어 클럭(Real-Time Clock) 시간.
    • Time zone: 현재 설정된 시간대.
    • System clock synchronized: 시스템 클럭이 NTP로 동기화되어 있는지 여부.
    • NTP service: NTP 서비스 상태 (활성화 여부).'
    • RTC in local TZ : RTC가 로컬 시간대인지 여부.

    hostnamectl

    리눅스 시스템의 호스트명(hostname) 정보를 확인하고 설정하는 데 사용된다. 이 명령어는 systemd와 함께 제공되며, 단순히 호스트명뿐만 아니라 호스트 관련 메타데이터(OS 이름, 커널 버전 등)도 출력한다.

     

    hostnamectl [명령] [옵션]
       
    주요 명령
    status 현재 호스트명 정보와 시스템 관련 메타데이터 출력 (기본 명령).
    set-hostname 호스트명을 설정.
    set-chassis 시스템 섀시 유형 설정 (예: desktop, laptop 등).
    set-icon-name 시스템 아이콘 이름 설정.
    help 사용 가능한 명령어와 옵션 표시.
       
    주요 옵션
    --pretty 사람이 읽기 쉬운 호스트명을 설정.
    --static 고정 호스트명을 설정.
    --transient 임시 호스트명을 설정(재부팅 시 초기화).
    --help 사용 가능한 옵션과 명령 출력.
    1) 현재 호스트명 정보 확인
    hostnamectl, hostnamectl status
    
    2) 고정 호스트명(static hostname)설정
    hostnamectl set-hostname myserver
    
    3)읽기 쉬운 호스트명(pretty hostname)으로 설정
    hostnamectl set-hostname "My Personal Server" --pretty
    
    4) 임시 호스트명(transient hostname)설정
    hostnamectl set-hostname temp-server --transient
    
    5)섀시 유형(chassis type)설정
    hostnamectl set-chassis laptop
    
    hostnamectl 명령어는 **[명령]**과 **[옵션]**의 조합으로 이루어진다.
    명령(set-hostname, status)을 사용해 작업의 범위를 정하고, 옵션(--pretty, --transient)으로 세부 동작을 지정할 수 있다.
    이 형식은 사용이 간결하면서도 유연성을 제공하여 다양한 상황에서 호스트명을 효율적으로 관리할 수 있다.

     

    localectl

    리눅스 시스템에서 로케일(locale)과 키보드 설정을 관리하는 명령어다. 로케일은 시스템의 언어, 시간, 숫자 형식 등을 정의하며, 키보드 설정은 키보드 레이아웃이나 변환 방식을 제어한다. localectl 명령을 사용하면 이 설정을 확인하거나 변경할 수 있다.

     

    localectl [명령] [옵션]
       
    명령 내용
    status 현재 로케일 및 키보드 설정 확인.
    set-locale 시스템의 기본 로케일 설정.
    list-locales 시스템에서 지원하는 모든 로케일 목록 출력.
    set-keymap 키보드 레이아웃 설정.
    list-keymaps 시스템에서 지원하는 모든 키보드 레이아웃 출력.
       
    옵션 내용
    --no-convert 키보드 레이아웃 설정 시 기존 레이아웃과 호환성 변환을 비활성화
    --no-pager 출력 시 페이징 없이 모든 내용을 바로 표시.
    --help 명령어 및 사용 가능한 옵션에 대한 도움말 출력.
    --version localectl의 버전 출력.

    1) 현재 로케일 상태 확인
    localectl status
    
       System Locale: LANG=en_US.UTF-8
           VC Keymap: us
          X11 Layout: us
          
       System Locale: 시스템의 언어와 문자 인코딩 설정
           VC Keymap: 가상 콘솔(터미널)에서 사용하는 키보드 레이아웃
          X11 Layout: X11 GUI 환경에서 사용하는 키보드 레이아웃
    
     2) 로케일 설정 변경
     localectl set-locale LANG=<로케일>
     localectl set-locale LANG=ko_KR.UTF-8
     
     여러 로케일 동시에 설정:
     localectl set-locale LANG=fr_FR.UTF-8 LC_TIME=en_GB.UTF-8
    (기본 언어는 프랑스어, 시간 형식은 영국 형식으로)
    
    3) 사용 가능한 로케일 목록 출력
    localectl list-locales
    
    C.UTF-8
    aa_DJ.UTF-8
    aa_ER.UTF-8
    aa_ER.UTF-8@saaho
    aa_ET.UTF-8
    af_ZA.UTF-8
    agr_PE.UTF-8
    ak_GH.UTF-8
    am_ET.UTF-8
    an_ES.UTF-8
    anp_IN.UTF-8
    ar_AE.UTF-8
    ar_BH.UTF-8
    ar_DZ.UTF-8
    ar_EG.UTF-8
    
    4) 키보드 레이아웃 설정 변경
    localectl set-keymap <키보드_레이아웃>
    
    localectl set-keymap us
    
    localectl set-x11-keymap <레이아웃> [모델] [옵션]
    localectl set-x11-keymap us pc105 intl
    
    
    5) 사용 가능한 키보드 레이아웃 목록 확인
    localectl list-keymaps
    
    ANSI-dvorak
    adnw
    al
    al-plisi
    amiga-de
    amiga-us
    apple-a1048-sv
    apple-a1243-sv
    apple-a1243-sv-fn-reverse
    apple-internal-0x0253-sv
    apple-internal-0x0253-sv-fn-reverse
    applkey
    at
    at-mac

     

     

    시스템 종료(Shutdown)

    셧다운이란 시스템의 전원을 끄거나 종료하는 행위를 말한다. 일반적으로 가정에서 사용하는 윈도우 운영체제나 리눅스의 경우 빈번하게 전원을 끄고 키지만 서버로 사용하는 경우 이 빈도는 매우 드물다. 리눅스 서버의 경우 커널 패치나 업데이트, 시스템 점검, 비밀번호 분실 등의 경우에 재부팅을 하거나 종료를 한다.

     

    X-window 환경에서는 환경에서 '끄기' 메뉴를 이용해서 재부팅 또는 종료하는 방법이 있고, 터미널(Terminal) 환경에서, shutdown, halt, reboot, poweroff, systemctl 등의 명령어를 사용한다.

     

    shutdown

    초기 유닉스 시절부터 이어져온 시스템을 재시작 또는 셧다운하는 명령어로 root 권한을 가진 사용자만 가능하다.

    이 명령어의 경우 입력한 옵션 값에 따라 타깃(구 실행레벨)을 인식하고 systemd(구 init) 프로세스를 호출하여 관련 작업을 요청한다.

    shutdown [옵션] 시간 [경고메시지]
    옵션 내용
    -r 시스템을 재부팅할 때 사용.(--reboot)
    -H 시스템 동장을 멈춘다.(--halt)
    -h 시스템 동장을 멈추고 전원까지 종료. 실제로 시스템을 종료할 때 사용.
    (--power)
    -c 예약된 셧다운 명령을 취소한다.
    shutdown -r now
    -> 시스템을 즉시 재부팅.
    
    shutdown -h now
    -> 시스템을 즉시 종료.
    
    shutdown -h +10
    -> 시스템을 10분 뒤에 종료. 참고로 종료되기 10분동안 다른 작업을 수행하기 위해
       'shutdown -h +10 &'처럼 &기호를 붙여 백그라운드 프로세스로 실행하기도 했는데
       최근에는 'shutdown -h 10'이라고만 입력해도 동일한 기능을 사용할 수 있다.
       
    shutdown -c
    -> 예약된 셧다운 명령어를 취소.
    
    shutdown -h 11:11
    shutdown -h 22:22
    -> 오전 11시 11분에 시스템을 종료하도록 예약,
       오후 10시 22분에 시스템을 종료하도록 예약.

    reboot

    시스템을 재시작하는 명령어로 기본적으로 root만 사용 가능. 배포판에 따라 로컬 사용자도 이용 가능.

    reboot
    -> 시스템을 즉시 재부팅.

    halt

    시스템을 종료하는 명령어로 기본적으로 root만 사용 가능. 배포판에 따라 로컬 사용자도 이용 가능.

    halt [옵션]
    옵션 내용
    -p 시스템을 종료하고 전원까지 완전히 차단할 때 사용하는 옵션

    poweroff

    시스템 종료 및 전원을 끄는 명령.

     

    init, telinit

    모든 프로세스의 부모격인 init 프로세스(현재는 systemd)에 직접 요청하여 실행레벨(현재 잡혀있는 타깃)을 변경할 때 사용하는 명령어.

    빠르게 실행되지만, 실행중인 프로세스를 무조건적으로 종료하기에 조심히 사용하자.

     

    init 0
    -> 시스템을 즉시 종료.
    
    init 1
    -> 시스템을 즉시 단일 사용자 모드로 전환. (네트워크 서비스 비활성화됨.)
       주로 시스템 복구 작업에서 사용.
    
    init 2
    -> 시스템을 다중 사용자 모드로 전환.(네트워크 서비스 비활성화.)
       주로 네트워크가 없는 환경에서 사용.
    
    init 3
    -> 시스템을 다중 사용자 모드로 전환.(네트워크 서비흐 활성화.)
       일반적으로 CLI 기반 서버에서 사용.
    
    init 4
    -> 사용자 정의 모드로 전환.
    
    init 5
    -> 그래픽 모드로 전환.(GUI)
       데스크탑 환경에서 많이 사용.
    
    init 6
    -> 시스템을 즉시 재부팅

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

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