[Linux] 리눅스의 부팅 시스템, 암호 복구

JIWON·2025년 5월 22일

Linux

목록 보기
11/20
post-thumbnail

🔌 리눅스의 부팅과 종료

1️⃣ 리눅스의 부팅

💠 부팅과정

전원 → BIOS 단계 → Boot Loader → Kernel Init → Systemd → Login Prompt


🔸 BIOS 단계

  • 전원을 켜면 BIOS(Basic Input/Output System) 가 동작

  • 기본적인 하드웨어(키보드, 디스크 등)의 상태를 확인하고 부팅 장치를 선택해서 부팅 디스크의 첫 섹터에서 512B를 로딩

  • 첫 섹터의 512B를 MBR(Master Boot Record) 라고 하며 디스크의 어느 파티션에 2차 부팅 프로그램(Boot Loader)이 있는지에 대한 정보가 저장되어 있다

  • MBR은 부트 로더를 찾아 메모리에 로딩하는 작업까지 수행


🔸 Boot Loader 단계

  • 부트 로더는 일반적으로 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공

  • 우분투에서는 부트 로더로 GRUB 사용하는데 기본적으로 멀티 부팅이 아닐 경우 GRUB 메뉴를 출력하지 않고 바로 부팅 작업을 진행

  • 부팅할 GRUB 메뉴를 출력하려면 /etc/default/grub 파일을 수정

    • GRUB_TIMEOUT_STYLE=hidden 부분을 삭제 ( # 으로 주석처리)
    • GRUB_TIMEOUT=0 부분의 숫자를 다른 숫자로 변환(메뉴가 화면에 나왔을 때 얼마동안 동작이 없으면 기본으로 넘어갈 것인지의 설정)
    • sudo update-grub 명령 수행

🔍 GRUB 메뉴 출력 실습

  1. sudo vi /etc/default/grub 파일 수정

  2. sudo update-grub 명령 수행

  • 설정파일을 바꾸면 다시 적용해야한다.
  1. reboot : 재부팅
  • GRUB 메뉴가 출력되는것을 확인할 수 있다

  • 부트로더리눅스 커널을 메모리에 로딩하는 역할을 수행
    • 리눅스 커널/boot 디렉토리 아래에 vmlinuz-버전명의 형태로 존재
    • 우분투를 처음 설치한 후 업데이트를 하면 커널이 추가로 생성
    • ls /boot/vm* : 버전명 찾기

🔸 커널 초기화 단계

  • 시스템에 연결된 메모리, 디스크, 키보드, 마우스 등의 장치를 검사

  • 사용가능한 하드웨어의 정보를 미리 확인했다가 부팅할 때 이러한 장치들이 사용가능한 상태로 유지되고 있는지 확인

  • 기존적인 초기화 과정이 끝나면 일반적으로 프로세스를 만드는 방식인 fork 를 사용하지 않고 프로세스와 스레드를 생성

  • 이 프로세스와 스레드는 메모리 관리 같은 커널의 여러가지 동작을 수행

  • 커널 프로세스의 개수는 버전에 따라 달라짐

  • 이런 프로세스들은 다른 프로세스와 구분하기 위해서 [] 로 표시되고 PID가 낮게 배정

  • ps -ef 명령으로 확인

  • ps -A

  • ps -ef

대괄호가 있는 프로세스는 건들이면 안됨

  • 커널프로세스가 생성되면 커널이 수행할 작업이 끝나고 systemd 서비스를 동작

🔸 systemd 서비스 단계

  • 리눅스가 본격적으로 동작하기 시작한 단계

  • 우분투에서는 기존의 init 스크립트를 대체

  • 각 서비스가 시작되는 과정을 메시지로 출력

  • 우분투에서 GUI를 설치하게 되면 메시지가 전부 출력되지는 않고 Splash 이미지가 출력됨


🔍 GUI가 설치된 환경에서 Splash 이미지 말고 systemd 메시지를 출력하도록 설정

  1. /etc/default/grub 파일의 GRUB_CMDLINE_ LINUX_DEFAULT=“quiet splash”에서 quiet 를 삭제

  2. sudo update-grub 를 실행하여 변경내용 적용


  • 메시지는 부팅 후 dmesg 명령이나 more /var/log/boot.log 명령으로 확인할 수 있음

  • dmesg 명령으로 출력되는 메시지에는 데몬의 시작과 관련된 것뿐만 아니라 하드웨어 검사와 관련된 것도 모두 포함되어 있음

  • sudo dmesg | moreless 또는 cat

  • systemd 서비스는 데몬을 모두 실행한 뒤 로그인 시스템을 출력

  • GUI를 설치한 경우는 GDM(Gnome Display Manager)를 출력


2️⃣ systemd service

  • 기존에는 init 프로세스가 스크립트를 순차적으로 실행하여 다른 프로세스를 동작시켰음
  • 현재는 init 서비스는 systemd 서비스로 대체되고 심볼릭 링크로 변경됨

💠 Run Level

  • init 프로세스는 없어졌지만 전통적으로 사용해온 init 프로세스의 run level 개념은 이해할 필요가 있다

  • run level : unix의 상태를 7가지로 구분하고 각 경우에 따라 스크립트 파일을 실행

    런레벨이름의미
    0runlevel0.target - poweroff.target시스템 종료
    1runlevel1.target - rescue.target응급복구모드(단일 사용자 모드)
    2runlevel2.target - multi-user.target다중사용자 모드
    3runlevel3.target - multi-user.target다중사용자 모드
    4runlevel4.target - multi-user.target다중사용자 모드
    5runlevel5.target - graphical.target그래피컬 다중 사용자 모드
    6runlevel6.target - reboot.target재시작

🔸 1 - 단일 사용자 모드

: 시스템에 문제가 발생한 경우 이 모드로 런레벨을 변경해서 다른 유저가 사용을 못하도록 하고 관리자가 수정을 할 수 있도록 한다.

이때 다른 모든 유저는 로그아웃을 해야 한다.

💠 systemd의 init에 대비한 장점

  • 소켓 기반으로 동작하여 inetd와 호환성을 유지

  • 셸과 독립적으로 부팅이 가능

  • 마운트 제어가 가능

  • fsck 제어가 가능

  • 시스템 상태에 대한 스냅샷(현재상태)을 유지

  • 서비스에 시그널을 전달할 수 있음

  • 셧다운 전에 사용자 세션의 안전한 종료가 가능

💠 systemd unit

  • service : 시스템 서비스 유닛으로 데몬을 시작하고 종료하고 재시작하고 로드 ✅
  • target : 유닛을 그루핑
  • automount : 디렉토리 계층 구조에서 자동 마운트 포인트를 관리
  • device : 리눅스 장치 트리에 있는 장치를 관리
  • mount : 디렉토리 계층 구조의 마운트 포인트를 관리
  • path : 파일 사스템의 파일이나 디렉토리 등 경로를 관리
  • scope : 외부에서 생성된 프로세스를 관리
  • slice : 시스템의 프로세스를 계층적으로 관리
  • socket : 소켓을 관리하는 유닛으로 AF_INET, AF_INET6, AF_UNIX Socket Stream, Datagram, FIFO 지원
  • swap : 스왑 장치 관리
  • timer : 타이머 와 관련된 기능을 관리

💠 systemd 관련 명령

  • systemctl

    • systemd 기반으로 서비스를 시작하거나 종료할 때 사용하는 명령어

    • systemctl 명령에서는 유닛을 지정할 때 유닛의 종류는 생략가능하다

    • sshd.service 를 사용할 때는 sshd 라고만 해도 된다

  • 형식 : systemctl [옵션] [명령] [유닛명]

  • 옵션 :

    • -a : 상태와 상관없이 유닛 전체를 출력
    • -t 유닛 종류 : 지정한 종류의 유닛만 출력
  • 명령 :

    • start : 유닛을 시작
    • stop : 유닛을 정지
    • reload : 유닛의 설정 파일을 다시 읽어옴
    • restart : 유닛을 재시작
    • status : 유닛 상태를 출력
    • enable : 부팅 시 유닛이 시작되도록 설정
    • disable : 부팅 시 유닛이 시작하지 않도록 설정
    • is-active : 유닛이 동작하고 있는지 확인
    • is-enabled : 유닛이 시작되었는지 확인
    • isolate : 지정한 유닛 및 이와 관련된 유닛만 시작하고 나머지는 정지
    • kill :유닛에 시그널을 전송

🔍 systemctl 실습

1. 동작중인 유닛을 출력
systemctl

2. 특정 유닛 출력
systemctl -t service

3. cron 서비스 시작하기
sudo systemctl start cron

4. 유닛 상태 확인
systemctl status cron

Active : active 상태

5. 서비스 중지
systemctl stop cron
다시 유닛 상태를 확인해보면

Active : inactive 상태

6. 현재 타겟과 런레벨 확인
systemctl get-default

7. 런레벨 변경
systemctl isolate 런레벨

  • 런레벨 : 이름으로 작성 또는 runlevel 숫자 로 작성
    • sudo systemctl isolate rescue
    • sudo systemctl runlever 1

9. 기본타겟 설정
systemctl set-default <name of target>.target

10. 현재 target 변경
systemctl isolate multi-user


🔸 telinit과 init을 이용한 런레벨 변경

init --help : 런레벨 확인

init 런레벨 : 런레벨 수정

telinit은 systemctl 의 심볼릭링크 : ls -l /sbin/telinit

telinit --help


💡 연습문제

  • colord.service가 동작 중인지 is-active 명령으로 확인
    systemctl is-active colord

  • colord.service 를 정지
    systemctl stop colord

  • colord.service의 상태를 확인
    systemctl status colord

  • colord.service를 다시 시작
    systemctl start colord

  • colord.service의 상태에서 PID를 확인
    ps -ef


3️⃣ 리눅스 시스템의 종료

💠 종료 방법

  • shutdown
  • halt
  • poweroff
  • runlevel0 으로 전환
  • runlevel6 으로 전환
  • reboot
  • 전원차단

🔸 shutdown

  • 리눅스 시스템을 가장 정상적으로 종료하는 방법은 shutdown 명령을 사용하는 것

  • 시스템을 종료하는 다른 명령들과 달리 shutdown 명령은 다양한 종료 방법을 제공

  • 시스템 종료 외에 런레벨을 바꿀 때도 사용할 수 있음

  • 기본형식 : shutdown [옵션] [시간] [메시지]

  • 옵션 :

    • -k : 실제로 종료를 수행하는 것이 아니고 메시지만 전달
    • -r : 종료한 후 재시작
    • -h : 종료하고 halt 상태로 이동
    • -f : 빠른 재시작으로 fsck(파일 시스템 검사)를 생략 할 수 있음
    • -c : 이전에 내렸던 shutdown 명령을 취소
  • 시간 : 종료할 시간(hh:mm, +m, now)

  • 메시지 : 모든 사용자에게 보낼 메시지

🔍 shutdown 예시

  • 즉시종료
    shutdown -h now

  • 3분 후에 셧다운 한다는 메시지를 보내고 종료 후 재시작
    shutdown -r +3 "System is going down"

  • 종료 취소
    shutdown -c

🔸 halt, poweroff, reboot

  • systemctl 명령은 심볼릭 링크
  • 3개의 명령은 전부 /sbin 디렉토리에 존재
  • 심볼릭 링크인지 확인

4️⃣ Daemon Process

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

  • 웹 서버나 데이터베이스 서버,원격접속 서버 등 각종 서비스를 제공하는 프로세스가 데몬

💠 데몬의 동작 방식

  • 데몬 혼자서 스스로 동작하는 독자형(standalone)

    • 시스템의 백그라운드에서 항상 동작하고 있는 방식
  • 데몬을 관리하는 슈퍼 데몬에 의해 동작하는 방식

    • 평소에는 슈퍼 데몬만 동작하다가 서비스 요청이 오면 슈퍼 데몬이 해당 데몬을 동작시키는 것
    • 독자형보다는 서비스에 응답하는 데 시간이 좀 더 걸릴 수 있지만 자원을 효율적으로 사용한다는 장점이 있음

💠 super daemon

  • 데몬의 개수가 늘어나면 이를 관리하기 위한 목적으로 탄생
  • 유닉스에서는 inetd 였으나 리눅스에서는 보안 기능을 강화한 xinetd를 사용
  • super daemon은 네트워크 서비스를 이용하는 데몬만 관리

💠 조상 데몬

  • systemd daemonkernel thread daemon

🔸 systemd daemon

  • init을 대체한 데몬
  • 1번 프로세스
  • pstree 명령을 이용하면 조상 데몬이라는 것이 확인됨

🔸 kernel thread daemon

  • 커널 일부분을 프로세스처럼 관리하는 데몬
  • ps 명령으로 확인했을 때 []에 있는 프로세스들이 여기에 해당
  • 대부분 메모리 관리, 입출력, 디스크 동기화 등을 수행

💠 주요 데몬

데몬기능데몬기능
atd특정시간에 예약한 명령을 실행 (at 명령)popd기본 편지함 서비스
cron주기적으로 실행하도록 예약한 명령 실행routed자동 ip 라우터 테이블 서비스 제공
dhcpd동적으로 IP 주소를 배정smb삼바 서비스 제공
httpd웹 서비스 제공syslogd로그기록 서비스 제공
nfs네트워크 파일 시스템 서비스 제공sshd원격 보안 접속 서비스
namedDNS서비스 제공in.telnetd원격 접속 서비스
smtpd메일 전송 데몬ftpd파일 송수신 서비스
sendmail이메일 서비스 제공ntpd시간 동기화 서비스

5️⃣ 부트로더 - GRUB

  • 부트로더는 커널을 메모리에 로드하는 역할을 수행
  • Linux에서는 LILOGRUB를 지원하는데 ubuntu 에서는 GRUB를 기본으로 지원
  • GRUBgrand unified bootloader의 약자

💠 GRUB의 장점

  • LILO는 리눅스에서만 사용이 가능하지만 GRUB는 윈도우에서 가능
  • LILO에 비해 설정과 사용이 편리
  • 부팅할 때 명령을 사용하여 수정할 수 있음
  • 멀티 부팅 기능을 지원

💠 GRUB 관련 디렉토리와 파일

  • /boot/grub/grub.cfg 파일

    • 기본 설정 파일이지만 직접 수정 안됨
    • 이 파일은 /etc/default/grub 파일과 /etc/grub.d 디렉터리 아래에 있는 스크립트를 읽어서 생성
    • 파일의 내용을 수정하려면 /etc/default/grub 파일과 /etc/grub.d 디렉터리 아래에 있는 스크립트를 수정해야 함
  • /etc/grub.d 디렉터리

    • 스크립트들은 GRUB의 명령이 실행될 때 순서대로 실행되어 grub.cfg 파일을 생성
  • /etc/default/grub 파일

    • 이 파일에는 GRUB 메뉴 설정 내용이 저장되어 있으며 GRUB 스크립트가 이 파일을 읽어서 grub.cfg에 기록
    • menu.lst 파일과 비슷한 역할을 수행

💠 암호 복구

  • root 사용자의 암호를 잊어버린 경우
  • 시스템을 재시작해서 GRUB 메뉴 초기 화면을 출력
  • 재시작
  • 메뉴 초기 화면에서 E를 눌러서 편집 모드로 전환한 후 커서를 아래로 내려서 수정 ro splash $vt_handoffrw init=/bin/bash 로 수정
  • F10 을 눌러서 재부팅
  • root 계정으로 접속되므로 이 상태에서 원하는 작업을 수행

💠 복구모드로 부팅하기

  • 가장 기본적인 서비스만 제공하고 명령 모드로 작업
  • 복구 모드 에서는 root 계정으로 로그인해서 시스템의 복구에 필요한 작업을 수행한다
  • 부팅 과정
    • 재부팅해서 GRUB 선택화면에 두번째 메뉴로 부팅
    • 부팅과정이 진행되다가 복구 메뉴 화면이 출력
    • root 로 로그인
    • 마운트 : mount -o remount.rw /

0개의 댓글