Linux (GNU ~ 부팅)

2026. 7. 18. 05:17·시스템, 인프라

오늘은 인프라의 근본이라고 할 수 있는 Linux에 대해 알아보자

 

일을 하면서 서버 설치가 들어오는 OS 대부분이 Linux 이다

물론 Windows Server 도 들어오긴 하지만 Linux 비율이 훨씬 더 높다

EOS 된 CentOS 부터 (설치 요청은 안들어오지만 이전에 설치된 서버들이 많다) RedHat, Ubuntu 각종 버전들이 존재한다

 

이러한 OS 들은 Linux 커널을 기반으로 하기 때문에 기본적인 구조와 명령어는 비슷하다 

패키지 관리자나 네트워크 설정, 기본 파일 위치 등에서 조금씩 차이가 있다

 

Linux

서버 OS로 자주 사용하는 Rocky Linux, CentOS, Ubuntu 는 모두 Linux 기반 운영체제다

이런 OS 들을 Linux라고 부르는데, Linux 커널 기반을 의미한다

 

커널은 OS 의 중심에서 CPU, 메모리, 디스크 같은 하드웨어를 관리한다

사용자가 실행한 프로그램이 하드웨어를 직접 제어하지 않고, 안정하게 OS 기능을 사용할 수 있도록 중간에서 요청을 처리해준다

 

# cat /etc/os-release

NAME="Rocky Linux"
VERSION="9.7 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.7"

=====================================

# cat /etc/redhat-release

Rocky Linux release 9.7 (Blue Onyx)

 

이러한 명령어들을 통해 OS 버전도 확인할 수 있다 

 

 

 

나는 커널의 개념이 가장 어려운 것 같다

예시를 들어서 설명해보자

 

# ls -l /etc

total 1236
-rw-r--r--.  1 root root       16 May 27 23:37 adjtime
-rw-r--r--.  1 root root     1529 Jun 23  2020 aliases
drwxr-xr-x.  3 root root       20 May 27 23:34 alsa
...

 

사용자가 ls -l /etc 명령어를 통해서 /etc 경로에 있는 파일 목록을 요청한다

그렇게 되면 ls 프로그램이 디스크에 직접 접근해서 해당 경로에 있는 파일들을 읽는 것이 아니다. 

커널에 파일 정보를 요청하고, 커널이 파일 시스템에서 필요한 정보를 확인한 뒤 그 결과를 프로그램에 반환해준다

 

사용자
  ↓
Shell  -> 사용자가 입력한 명령어 해석, 프로그램 시랳ㅇ 
  ↓
시스템 콜
  ↓
리눅스 커널
  ↓
하드웨어

 

대부분의 Linux 배포판에서 기본 Shell로 Bash 를 사용한다

 

# echo $SHELL
/bin/bash

내 노트북 서버에 깔려 있는 Rocky 9.7 도 Bash를 사용하는 것을 확인할 수 있다

 

Bash 가 사용자 입력을 해석하고, 프로그램을 찾아서 실행한다

 

# which ls

alias ls='ls --color=auto'
        /usr/bin/ls

 

which 명령어를 통해 어느 경로에 명령어가 있는지 확인할 수 있다

결과로 나오는 /usr/bin 경로는 리눅스에서 일반 사용자가 실행할 수 있는 대부분의 명령어와 유틸 프로그램이 저장되는 디렉터리라는 사실만 알고 넘어가자

위의 사실을 알면 ls 명령어는 단순 기능이 아닌 /usr/bin/ls 위치에 설치된 하나의 실행 프로그램이고, 그 프로그램을 실행시켜서 특정 디렉터리의 파일들을 읽을 수 있다는 생각에 다다를 수 있다

 

물론 모든 명령어가 별도의 실행 파일인 것은 아니다 

cd 같은 shell 내부 기능으로 구현된 명령어들도 존재한다

 

 

GNU

Linux 를 사용하다 보면 Linux Kernel 만으로 모든 기능이 작동한다고 생각할 수도 있다

하지만 우리가 사용하는 기본 명령어 대부분은 Linux 커널이 직접 제공하는 명령이 아니다

 

ls, cp, mv, rm, cat, chmod, chown 과 같은 명령어는 대부분이 GNU라고 불리는 프로젝트에서 제공하는 프로그램이다

 

GNU는 리처드 스톨먼이 시작한 자유 소프트웨어 프로젝트다

이 프로젝트는 Unix와 비슷하게 동작하는 SW를 만드는 것을 목표로 했다

 

이 프로젝트를 통해서 Bash, GCC, GNU Coreutils, GDB, Make와 같은 다양한 프로그램들이 만들어졌다

위에 있는 프로그램들 중에서 GNU Coreutils 안에 ls, cp, mv, rm, cat, chmod, chown 과 같은 다양한 기본 명령어들이 포함되어 있다 

 

# ls --version
ls (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Richard M. Stallman and David MacKenzie.

============================================================================

# cp --version
cp (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjorn Granlund, David MacKenzie, and Jim Meyering.

 

이렇게 --version 명령어를 붙이면 GNU coreutils 가 같이 나오는 것을 볼 수 있다 

 

  • GNU
    • Shell
    • 기본 명령어
    • 컴파일러
    • 라이브러리
    • 개발 도구
  • Linux
    • 프로세스 관리
    • 메모리 관리
    • 파일 시스템
    • 장치 드라이버
    • 네트워크
    • 시스템 콜

이렇게 나뉘어진게 합쳐져 있다고 보면 될 것 같다

 

내 서버의 커널을 확인하는 방법은 간단하다

 

# uname -r

5.14.0-611.55.1.el9_7.x86_64

 

uname -r 만 쳐보면 된다

 

# hostnamectl

   Static hostname: (unset)
Transient hostname: localhost
         Icon name: computer-laptop
           Chassis: laptop 💻
        Machine ID: 74897ba0d1994d31bd46eae982ac3a71
           Boot ID: 043ba14dc3f14f64a35a70ece09d8d9c
  Operating System: Rocky Linux 9.7 (Blue Onyx)
       CPE OS Name: cpe:/o:rocky:rocky:9::baseos
            Kernel: Linux 5.14.0-611.55.1.el9_7.x86_64
      Architecture: x86-64
   Hardware Vendor: Micro-Star International Co., Ltd.
    Hardware Model: GP63 Leopard 8RD
  Firmware Version: E16P6IMS.107

 

hostnamectl 만 치면 대부분을 확인할 수 있긴 하다

 

 

 

Linux 부팅 과정 (journalctl -b)

다음으로는 Linux의 부팅 과정을 살펴보자

 

서버 전원을 누른다고 바로 Linux와 같은 OS가 뜨는 것은 아니다

여러 단계를 거친 후에 사용자가 로그인할 수 있는 상태가 되는 것이다

 

journalctl 명령어를 통해 그 과정을 간단하게 알아보자

 

전원 
  ↓
BIOS/UEFI
  ↓
부트로더
  ↓
Linux Kernel
  ↓
initramfs
  ↓
Root FS
  ↓
systemd
  ↓
서비스 실행
  ↓
로그인

 

크게 보면 이 과정을 거친다

 

# journalctl -b
May 28 00:23:35 localhost kernel: Linux version 5.14.0-611.55.1.el9_7.x86_64 (mockbuild@iad1-prod-build001.bld.equ.rock>
May 28 00:23:35 localhost kernel: The list of certified hardware and cloud instances for Enterprise Linux 9 can be view>
May 28 00:23:35 localhost kernel: Command line: BOOT_IMAGE=(hd0,gpt1)/vmlinuz-5.14.0-611.55.1.el9_7.x86_64 root=UUID=74>
May 28 00:23:35 localhost kernel: BIOS-provided physical RAM map:
May 28 00:23:35 localhost kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000005efff] usable

...

May 28 00:23:35 localhost kernel: NX (Execute Disable) protection: active
May 28 00:23:35 localhost kernel: APIC: Static calls initialized
May 28 00:23:35 localhost kernel: e820: update [mem 0x6a4dc018-0x6a505657] usable ==> usable
May 28 00:23:35 localhost kernel: e820: update [mem 0x6a4cb018-0x6a4db057] usable ==> usable
May 28 00:23:35 localhost kernel: extended physical RAM map:
May 28 00:23:35 localhost kernel: reserve setup_data: [mem 0x0000000000000000-0x000000000005efff] usable
May 28 00:23:35 localhost kernel: reserve setup_data: [mem 0x000000000005f000-0x000000000005ffff] reserved

...

 

이게 journalctl -b의 로그다. 너무 많아서 전체 첨부는 못한다.. 

-b는 아마 boot의 약자일 것이다

서버가 가장 최근 부팅 시점에 발생한 커널 메시지와 서비스 로그를 확인할 수 있다 

로그를 보면 나는 5월 28일에 서버를 부팅해서 지금까지 사용하는 것을 볼 수 있다

대충 그때 기존 OS 밀어버리고 한것 같긴 하다

 

로그는 너무 기니까 흐름을 살펴보기로 하자

 

1. BIOS/UEFI

  • 서버 부팅 시 가장 먼저 실행
  • 하드웨어 초기화, 부팅 가능 장치 찾기
  • 요즘 장비는 거의 UEFI를 사용하고, 구형은 BIOS(Legacy) 방식을 사용

 

2. GRUB

  • 부팅할 OS 선택
  • 사용할 Linux Kernel 선택
  • 커널에 부팅 옵션 전달
  • initramfs 이미지 메모리에 적재
# cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt1)/vmlinuz-5.14.0-611.55.1.el9_7.x86_64 root=UUID=74fd0dd8-8821-4763-b4ab-c920a9bdc39c ro crashkernel=1G-2G:192M,2G-64G:256M,64G-:512M resume=UUID=ae85ad81-e873-4597-afd0-bd813693a179 rhgb quiet

# blkid
/dev/sdb1: LABEL="/data" UUID="214f5bbf-cdf3-4ffe-8d91-21c8cfbe6be4" TYPE="xfs" PARTUUID="4389bba6-96a3-384b-b4ad-f705b5ac2be6"
/dev/sda4: LABEL="/var" UUID="826f1e79-c1e9-485d-bbbf-23ce5a7f9224" TYPE="xfs" PARTUUID="018e809b-824f-2a46-b747-030a8cbed4f1"
/dev/sda2: SEC_TYPE="msdos" UUID="0335-52D0" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="b8b5ae73-67b2-bb4e-bac7-b6cb04b53100"
/dev/sda5: LABEL="swap" UUID="ae85ad81-e873-4597-afd0-bd813693a179" TYPE="swap" PARTUUID="be75e5ba-f87c-dc4f-aa40-fe7ae3d5ba3a"
/dev/sda3: LABEL="/" UUID="74fd0dd8-8821-4763-b4ab-c920a9bdc39c" TYPE="xfs" PARTUUID="4dbd6003-6f67-2b44-b7fa-9b9839d104ce"
/dev/sda1: LABEL="/boot" UUID="3ca4ecc2-3ac8-4df5-bf18-d17bd4d0a347" TYPE="xfs" PARTUUID="819e7bbc-0cd0-b641-8d91-58f9156969c0"
/dev/sda6: LABEL="/home" UUID="4d05e80a-b3b6-4309-8114-1167520b56c5" TYPE="xfs" PARTUUID="6e1a96a5-a4fd-9d46-b44a-30fac5bada4a"

 

cat /proc/cmdline 명령어를 통해서 어떤 이미지가 들어가는지 확인할 수 있다 

blkid 를 통해 나온 UUID 와 비교해봤을 때 root 파티션이 전달되는 것을 확인할 수 있다 -> 루트 파일 시스템으로 사용할 장치

 

 

3. Linux Kernel

 

  • Grub이 커널과 initramfs를 메모리에 올린 뒤에 Linux Kernel 을 실행
  • CPU 초기화, 메모리 탐색, 장치 드라이버 초기화, 디스크/파티션 인식, 파일 시스템 준비, 네트워크 장치 인식, initramfs 실행

 

4. initframs

 

  • 2번에서 말한 이미지
  • 커널이 실행된 직후 실제 루트 파일 시스템을 바로 사용할 수 없는 경우가 있음
    • LVM
    • RAID
    • 암호화 디스크
    • NVMe 장치
    • 특정 FS
    • 별도 스토리지
    • 루트 파일 시스템이 위와 같은 환경에 존재할 때 인식하기 위해서 관련 드라이버와 도구 필요
  • 이를 위해 사용하는 임시 루트 파일 시스템
  • 메모리에 올라가 임시로 동작, 실제 루트 디스크를 찾고 마운트할 수 있도록 준비
  • Rocky에서는 주로 dracut 사용
# ls -lh /boot/initramfs-5.14.0-611.55.1.el9_7.x86_64.img

-rw-------. 1 root root 79M May 27 23:55 /boot/initramfs-5.14.0-611.55.1.el9_7.x86_64.img

 

루트 디스크를 찾지 못하거나 LVM 활성화에 실패하면 이 단계에서 부팅 중단될 수 있음

 

 

5. Root FS

  • initramfs 가 루트 파일 시스템을 찾으면 "/" 경로에 마운트
# findmnt /

TARGET SOURCE    FSTYPE OPTIONS
/      /dev/sda3 xfs    rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota
  • blkid, lsblk 같은 명령어로 확인할 수 잇다

 

 

6. systemd

 

  • Root FS 가 준비되면 커널이 사용자 공간의 첫 번째 프로세스인 systemd 실행
  • /usr/lib/systemd/systemd 가 실행되며 PID 1을 가지고 많은 프로세스들의 부모 프로세스가 된다
    • 많은 사용자 공간 프로세스의 부모지만 모든 프로세스의 부모는 아님
    • 부모 프로세스가 먼저 종료되서 고아 프로세스가 되면 PID 1인 systemd가 프로세스를 넘겨받아 관리할 수 있다
# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 May28 ?        00:03:31 /usr/lib/systemd/systemd rhgb --switched-root --system --deserialize
root           2       0  0 May28 ?        00:00:01 [kthreadd]
root           3       2  0 May28 ?        00:00:00 [pool_workqueue_]
root           4       2  0 May28 ?        00:00:00 [kworker/R-rcu_g]

...

 

  • ps -ef 명령어로 PID 1번인 프로세스를 확인할 수 있다 PPID는 부모 프로세스의 아이디인데 최상위 프로세스인 만큼 부모 프로세스가 존재하지 않는다
  • PID 1번과 비슷한 PID 2번인 kthreadd 도 있는데 이건 커널 스레드 관리 프로세스를 의미하고, 많은 커널 프로세스의 부모가 된다
    • 많은 커널 스레드는 kthreadd에 의해 생성되지만 모든 커널 스레드가 자식인 것은 아님

 

7. 서비스 시작

 

  • systemd 실행 이후 설정된 의존 관계에 따라 다양한 ㅅ ㅓ비스가 시작된다
    • NetworkManager, firewalld, sshd, chronyd, rsyslog, crond 등

 

# systemctl list-unit-files --type=service --state=enabled
UNIT FILE                          STATE   PRESET
atd.service                        enabled enabled
auditd.service                     enabled enabled
bluetooth.service                  enabled enabled
cloudflared.service                enabled disabled
crond.service                      enabled enabled
dbus-broker.service                enabled enabled
firewalld.service                  enabled enabled
getty@.service                     enabled enabled
irqbalance.service                 enabled enabled
iscsi-onboot.service               enabled enabled
iscsi-starter.service              enabled disabled
kdump.service                      enabled enabled
libstoragemgmt.service             enabled enabled
low-memory-monitor.service         enabled enabled
lvm2-monitor.service               enabled enabled
mcelog.service                     enabled enabled
mdmonitor.service                  enabled enabled
microcode.service                  enabled enabled
multipathd.service                 enabled enabled
NetworkManager-dispatcher.service  enabled enabled
NetworkManager-wait-online.service enabled disabled
NetworkManager.service             enabled enabled
nis-domainname.service             enabled enabled
nvmefc-boot-connections.service    enabled enabled
rsyslog.service                    enabled enabled
rtkit-daemon.service               enabled enabled
selinux-autorelabel-mark.service   enabled enabled
smartd.service                     enabled enabled
sshd.service                       enabled enabled
sssd.service                       enabled enabled
systemd-boot-update.service        enabled enabled
systemd-network-generator.service  enabled enabled
systemd-pstore.service             enabled enabled
tuned.service                      enabled enabled
udisks2.service                    enabled enabled
upower.service                     enabled enabled

 

  • 부팅 시에 자동 실행되는 서비스 확인도 할 수 있다 
    • 보통 systemctl enable 처리된거

 

8. 부팅 완료

 

  • 위의 과정들이 모두 정상적으로 완료됐다면 사용자가 로그인할 수 있게 된다

 

 

마무리

 

더 쓸려고 했지만 너무 길어지는 것 같아 다음글에 이어서 써야겠다

다음 글은 서버 설치, 관리, 트러블 슈팅을 하면서 자주 사용하는 명령어로 돌아오겠다

'시스템, 인프라' 카테고리의 다른 글

Apache  (0) 2026.07.13
Inode  (1) 2026.06.28
IP (Internet Protocol)  (0) 2026.06.14
fstab  (1) 2026.06.03
RAID  (2) 2026.05.31
'시스템, 인프라' 카테고리의 다른 글
  • Apache
  • Inode
  • IP (Internet Protocol)
  • fstab
나는 허준기
나는 허준기
  • 나는 허준기
    공부
    나는 허준기
  • 전체
    오늘
    어제
    • 분류 전체보기 (17) N
      • 자바 공부 (2)
      • 알고리즘 공부 (1)
      • 일기 (0)
      • Git (2)
      • 클라우드 (3)
      • 시스템, 인프라 (9) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DNS
    TLS
    RAID
    Naver Cloud
    inode
    최대힙
    IaC
    로드밸런싱
    NCP
    네이버클라우드
    SSL
    fstab
    IP
    terraform
    클라우드
    Linux
    apache
    힙정렬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
나는 허준기
Linux (GNU ~ 부팅)
상단으로

티스토리툴바