[Linux] 리눅스의 부팅과 종료

IkSun·2023년 6월 1일

리눅스실습

목록 보기
8/14
post-thumbnail

00 개요
01 리눅스 시스템의 부팅
02 systemd 서비스
03 리눅스 시스템의 종료
04 데몬 프로세스
05 부트 로더
연습문제


01 리눅스 시스템의 부팅

리눅스의 부팅 과정

바이오스 단계

  • 바이오스 는 PC 에 장착된 하드웨어(키보드, 디스크 등)의 상태를 확인 한 후 부팅 장치를 선택하여 부팅 디스크 의 첫 섹터에서 512B를 로딩
  • 512B 를 마스터 부트 레코드 (MBR)라고 하며 디스크의 어느 파티션에 2차 부팅 프로그램(부트 로더 )이 있는지에 대한 정보가 저장되어있음
  • 메모리에 로딩된 MBR은 부티 로더를 찾아 메모리에 로딩하는 작업까지 수행

부트 로더 단계

  • 부트로더는 부팅을 할 운영체제를 선택할 수 있도록 메뉴 제공
  • 우분투에서는 GRUB 이라는 부트 로더 를 사용한다.
  • 부팅할 때 GRUB 메뉴를 출력하려면 /etc/default/grub 파일을 수정해야 함
    • GRUB_TIMEOUT_STYLE=hidden 앞에 "#" 을 추가, GRUB_TIMEOUT=010 으로 수정
    • /etc/default/grub 파일을 수정했다면 sudo update-grub 를 실행하여 변경된 내용을 적용
  • 우분투를 다시 시작하면 GRUB 메뉴를 출력
  • 부트 로더리눅스 커널메모리에 로딩 하는 역할을 수행
  • 리눅스 커널은 /boot 디렉토리 아래에 'vmlinux-버전명' 의 형태로 제공
  • 부트 로더 시작 화면

커널 초기화 단계

  • 부트 로더 에 의해 메모리에 로딩된 커널 은 가장 먼저 시스템에 연결된 메모리, 디스크, 키보드, 마우스 등의 장치를 검사
  • 장치 검사 등 기본적인 초기화 과정이 끝나면 커널은 프로세스와 스레드를 생성
  • 최초로 실행되는 init 프로세스 를 뒤로 계층적으로 만들어짐
  • 대괄호 : 운영체제 내부에서 동작하는 프로세스 ex) [kthreadd]

systemd 서비스 단계 : 리눅스가 본격적으로 동작

부팅 메세지 확인 : dmseg 명령, more /var/log/boot.log

  • 실제로 위 디렉토리를 가보면 부팅시 나오는 메세지들을 확인할 수 있다

1번 프로세스

  • 전통적으로 1번 프로세스 init
  • 1번 프로세스가 여전히 init 인 것 처럼 보이지만 사실은 systemd 파일의 심볼릭 링크


02. systemd 서비스

systemd 서비스 역할

  • 리눅스의 시스템과 서비스 관리자

  • 유닉스 init 프로세스가 하던 작업을 대신 수행

  • 다양한 서비스 데몬을 시작 하고, 프로세스들의 상태를 유지 하며, 시스템의 상태를 관리

    • 어떤 프로세스 구조에서 어떤 부모 프로세스가 죽어서 고아 프로세스가 되는 경우 그 고아 프로세스들의 부모는 1번 systemd 프로세스가 된다
    • 어떤 프로세스가 종료되는데 만약 고아 프로세스가 종료된다면 그 부모가 systemd 가 되어서 해당 프로세스의 exit code 는 systemd 에게 넘어가기 떄문에 이런식으로 상태 관리

init 프로세스와 런레벨

  • 현재 init 서비스는 systemd 서비스로 대체
  • man init 을 확인해보면 systemd 에 대한 설명이 출력

런레벨

  • 시스템의 상태를 구분하는 숫자/문자
  • 일반적으로는 런레벨 3번으로 정의되어있다(다중 사용자 모드)

systemd 의 장점

  • 소켓 기반으로 동작하여 inetd 와 호환성을 유지한다.
  • 셸과 독립적으로 부팅이 가능하다.
  • 마운트 제어 가 가능하다.
  • fsck 제어 가 가능하다.
  • 시스템 상태 에 대한 스냅숏을 유지한다.
  • 서비스에 시그널을 전달 할 수 있다.
  • ㅅ셧다운 전에 사용자 세션의 안전한 종료 가 가능하다

systemd 유닛

  • systemd 는 전체 시스템을 시작 하고 관리
  • 유닛 이라 부르는 구성요소를 사용하여 관리
  • systemd 는 관리 대상의 이름을 '서비스명.유닛종류' 의 형태로 관리
    • 일반적으로 리눅스를 관리할때 가장 많이 사용하는 것은 serivce 유닛(데몬), target(런레벨 관리)이다.
    • atd 라는 데몬, crond, httpd 라는 데몬 ~ 한다.

systemctl 관련 명령

systemctl : systemd 서비스를 제어하는 기능

systemctl 					# 동작중인 유닛 출력하기
systemctl -a				# 전체 유닛 출력하기
systemctl -t service		# 특정 유닛 출력하기 : service 유닛 출력

sudo systemctl start cron	# 유닛 서비스 시작하기 (start -> cron 서비스 시작)
systemctl status cron		# 유닛의 상태 확인하기 (cron 서비스 상태 확인하기)
systemctl stop cron			# 유닛 서비스 정지하기 (cron 서비스 중지)

systemd 와 런레벨

  • 런레벨에 따라 7개의 target을 만든다.
  • systemctl 이라는 명령어를 통해 이 타겟 이름 을 통해서 런레벨 을 바꿔줄 수있다.
  • 런레벨과 target 유닛의 관계
    • 런레벨 3 : cli 프로그램이 실행되어 cli 프롬프트가 뜬다
    • 런레벨 5 : gui 프로그램이 실행되어 gui 프롬프트가 뜬다. (차이점)
# 현재 target 과 런레벨 확인하기
systemctl get-default 			# 현재 어떤 타겟 유닛, 런레벨로 동작하는지 알 수 있다.
runlevel						# > N 5 : 현재 런레벨 5로 부팅

# 기본 target 런레벨 지정하기 
#-> 런레벨이 바뀌고 그 런레벨로 부팅을 하게 된다.
sudo systemctl set-default multi-user.target		# target 을 multi-user 로 변경
ls -l /etc/systemd/system/default.target			# 런레벨 5->3 으로 변경 후 부팅

# 기본 target 을 다시 graphical.target 으로 변경
sudo systemctl set-default graphical.target

# target 변경하기 (telinit, init 과 같음)
systemctl isolate multi-user				# multi-user.target(런레벨 3)으로 변경
systemctl isolate runlevel3

systemctl isolate graphical					# graphical.target(런레벨 5)으로 변경
systemctl isolate runlevel5

# 런레벨 변경하기 : telinit, init
telinit 3
telinit 5

init 3
init 5

# 단일 사용자 모드로 전환하기 : rescure.target(런레벨 1)
# -> 시스템에 문제가 있을 경우 시스템을 rescue.target 유닛(런레벨 1, 런레벨 S)으로 변경하여 점검 
systemctl isolate rescue
systemctl isolate runlevel1
init 1
telinit S

# 단일 사용자 모드에서 다중 사용자 모드로 전환하려면 reboot 명령이나 systemctl default 명령 사용

03. 리녹스 시스템의 종료

리눅스를 종료하는 방법

  • shutdown 명령을 사용한다.
  • halt 명령을 사용한다.
  • poweroff 명령을 사용한다.
  • 런레벨을 0 이나 6 으로 전환한다.
  • reboot 명령을 사용한다.
  • 전원 을 끈다.

shutdown 명령

  • 리눅스 시스템을 가장 정상적으로 종료하는 방법
sudo shutdown -h now								# 시스템 즉시 종료하기
sudo shutdown -h +2 "System is going down in 2 min"	# 셧다운한다는 메세지를 보내고 종료하기
													# 다른 로그인한 사람들에게 메세지가 감
sudo shutdown -r +3			# 시스템 재시작하기
sudo shutdown -c 			# 이전에 내렸던 shutdown 명령 취소하기
sudo shutdown -k 2			# 실제 시스템 종료하는것이 아니라 메세지만 보내기

런레벨 변경하기

sudo init 0								# 런레벨을 0으로 바꾸면 시스템 종료
sudo init 6								# 시스템 재시작은 런레벨 6
sudo systemctl isolate poweroff.target	# systemd 로 종료하기
sudo systemctl isolate runlevel6.target	# systemd 로 재시작

기타 시스템 종료 명령 : halt, poweroff, reboot

  • halt, poweroff, reboot 모두 systemctl 명령의 심볼릭 링크

04. 데몬 프로세스

데몬

  • 리눅스의 백그라운드 에서 동작하며 특정한 서비스를 제공 하는 프로세스

데몬의 동작방식

  • 독자형 데몬 (stand-alone daemon)
    • 항상 실행이 되어야하므로 시스템의 자원을 많이 작아먹는 독자형 데몬을 많이 사용
  • 슈퍼데몬을 통한 동작
    • 슈퍼 데몬 xinetd 로 atd (at 데몬) 실행시키기 -> 가끔씩 오는 애들의 경우 이방식 사용

슈퍼 데몬

  • 데몬들을 관리하는 데몬
  • 사용자가 네트워크 세비스를 요청하면 슈퍼데몬 이 받아서 해당하는 서비스 데몬 을 동작시킴
  • 유닉스의 슈퍼데몬은 inetd 였으나 우분투 에서는 보안 기능이 포함된 xinetd 를 사용

데몬의 조상

  • systemd 데몬
    • 대부분의 조상 프로세스
    • 시스템의 상태를 종합적으로 관리하는 역할을 수행
  • 커널 스레드 데몬
    • 커널 기능 의 일부분을 프로세스 처럼 관리하는 데몬
    • ps 명령으로 확인했을 떄 대괄호([]) 에 들어있는 프로세스들임
    • 커널 데몬은 대부분 입출력 이나 메모리 관리, 디스크 동기화 등을 수행
      중괄호는 {} : 스레드를 의미 -> {ModemManager}
  • 주요 데몬

05. 부트 로더

부트 로더

  • 커널을 메모리에 로딩하는 역할을 수행
  • 우분투에서는 GRUB 를 기본으로 지원

GRUB의 개요

  • GRUB 는 윈도우에서도 사용가능
  • 부팅할떄 명령을 사용하여 수정 가능
  • 멀티 부팅 기능 지원
  • GRUB 의 최신버전은 GRUB2
    • GRUB에 비해 GRUB2 는 이식성과 모듈화가 더 좋아져서 동적으로 모듈을 로딩
    • 우분투 는 GRUB2 를 기본 부트 로더로 사용

GRUB2 관련 디렉토리와 파일

  • /boot/grub/grub.cfg 파일
    • GRUB2 의 기본 설정 파일로 사용자가 직접 수정 불가
      • grup-mkconfig, update-grub 명령을 통해서 가능
    • /etc/default/grub 파일과 /etc/grub.d 디렉토리 아래에 있는 스크립트를 읽어서 자동 생성
  • /etc/grub.d 디렉토리
    • GRUB 스크립트를 가지고 있는 디렉토리
    • 이 스크립트들은 GRUB의 명령이 실행될 때 순서대로 실행되어 grub.cfg 파일을 생성
  • /etc/default/grub 파일
    • GRUB 메뉴 설정 내용이 저장되어 있음
    • GRUB 스크립트가 이 파일을 읽어서 grub.cfg 에 기록

암호 복구하기

  • 1) 시스템 재시작하기
  • 2) GRUb 편집 모드로 전환하기
    - GRUB Boot Menu 가 출력될 때 재빨리 E 를 눌러 편집 모드 로 전환
  • 3) 단일 사용자 모드 로 수정하기
    - 리눅스 커널 정보가 있는 행에서 ‘ro splash $vt_handoff’를 ‘rw init=/bin/bash’로 수정
  • 4) 재시작 하기 : root 계정으로 동작
  • 5) 암호 변경 : # passwd root
  • 6) 작업 완료 후 재부팅 : reboot -f

복구모드로 부팅하기

  • 복구 모드는 가장 기본적인 서비스만 제공하여 명령 모드 로 작업 가능
  • 1) 복구 모드 선택하기
    • GRUB 메뉴 초기 화면에서 'Ubuntu용 고급 설정'을 선택
    • 메뉴가 출력되면 recovery mode 선택
  • 2) 복구 메뉴 항목에서 root 항목 선택하기
  • 3) root 항목을 선택하면 바로 root 프롬프트가 출력됨
  • 4) 읽기/쓰기 모드로 다시 마운트하기 : mount -o remount, rw /
  • 5) 복구 작업 수행 후 재시작하기 : reboot -f
profile
공부한 것 기록용

0개의 댓글