OS

πŸ”Ή OS ꡬ쑰 이해

1. Linux 컀널 vs μ‚¬μš©μž 곡간 (User Space vs Kernel Space)

πŸ“Œ μ•„ν‚€ν…μ²˜

+--------------------------------------------------+
|                 μ‚¬μš©μž 곡간(User Space)          |
|  - μ‘μš© ν”„λ‘œκ·Έλž¨ (bash, python, nginx λ“±)        |
|  - 라이브러리(glibc λ“±)                          |
+--------------------------------------------------+
|                 컀널 곡간(Kernel Space)          |
|  - μ‹œμŠ€ν…œ 콜 μΈν„°νŽ˜μ΄μŠ€(syscall)                 |
|  - ν”„λ‘œμ„ΈμŠ€ 관리(Scheduler)                      |
|  - λ©”λͺ¨λ¦¬ 관리(Virtual Memory, Page Cache)       |
|  - 파일 μ‹œμŠ€ν…œ(VFS, ext4, xfs, btrfs)            |
|  - λ„€νŠΈμ›Œν¬ μŠ€νƒ(TCP/IP)                         |
|  - λ””λ°”μ΄μŠ€ λ“œλΌμ΄λ²„ (ν•˜λ“œμ›¨μ–΄ μ œμ–΄)             |
+--------------------------------------------------+
|               ν•˜λ“œμ›¨μ–΄(Hardware)                 |
|  CPU, Memory, Disk, NIC                          |
+--------------------------------------------------+




μ‚¬μš©μž 곡간 (User Space)
+---------------------------+
| modprobe / insmod / lsmod |
+---------------------------+
            |
            v
컀널 곡간 (Kernel Space)
+---------------------------+
| 컀널 λͺ¨λ“ˆ (Module)       |
| - λ„€νŠΈμ›Œν¬ λ“œλΌμ΄λ²„       |
| - 파일 μ‹œμŠ€ν…œ λ“œλΌμ΄λ²„    |
| - 가상 μž₯치 λ“œλΌμ΄λ²„      |
+---------------------------+
            |
            v
ν•˜λ“œμ›¨μ–΄ (Hardware)
+---------------------------+
| CPU, Disk, NIC, Memory   |
+---------------------------+

# λ™μž‘ μ˜ˆμ‹œ:
# 1. modprobe e1000e (Intel NIC λͺ¨λ“ˆ λ‘œλ“œ)
# 2. 컀널이 NIC μ΄ˆκΈ°ν™” β†’ μ‹œμŠ€ν…œμ— λ„€νŠΈμ›Œν¬ μ‚¬μš© κ°€λŠ₯
# 3. lsmod둜 λͺ¨λ“ˆ μƒνƒœ 확인
# 4. dmesg둜 μ΄ˆκΈ°ν™” 둜그 확인

πŸ‘‰ μ‚¬μš©μž κ³΅κ°„μ˜ ν”„λ‘œκ·Έλž¨μ€ 직접 ν•˜λ“œμ›¨μ–΄μ— μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ³ , μ‹œμŠ€ν…œ 콜(System Call) 을 톡해 컀널에 μš”μ²­.

μ‚¬μš©μž 곡간(User Space)

  • μ‚¬μš©μžκ°€ 직접 μ‹€ν–‰ν•˜λŠ” ν”„λ‘œκ·Έλž¨(bash, python, nginx λ“±)이 λŒμ•„κ°€λŠ” μ˜μ—­

  • μ œν•œλœ κΆŒν•œμ„ κ°€μ§„ κ³΅κ°„μœΌλ‘œ, μ‹€ν–‰ ν™˜κ²½λ§Œ 제곡될 뿐, CPU λ ˆμ§€μŠ€ν„°λ‚˜ λ©”λͺ¨λ¦¬, λ””μŠ€ν¬ 같은 ν•˜λ“œμ›¨μ–΄λ₯Ό 직접 μ œμ–΄λΆˆκ°€λŠ₯

    • 예: cat /etc/passwd λ₯Ό μ‹€ν–‰ν•˜λ©΄, cat λͺ…λ Ήμ–΄ μžμ²΄λŠ” μ‚¬μš©μž κ³΅κ°„μ—μ„œ λ™μž‘

컀널 곡간(Kernel Space)

  • OS의 핡심(컀널)이 μ‹€ν–‰λ˜λŠ” 특ꢌ λͺ¨λ“œ(Privileged mode)

  • 직접 ν•˜λ“œμ›¨μ–΄ μ œμ–΄κ°€ κ°€λŠ₯ (λ””μŠ€ν¬ 읽기, λ©”λͺ¨λ¦¬ 관리, λ„€νŠΈμ›Œν¬ 전솑 λ“±)

    • 예: cat λͺ…λ Ήμ–΄κ°€ νŒŒμΌμ„ 읽으렀면 open() β†’ read() 같은 μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•΄μ„œ 컀널에 “이 파일 μ’€ μ—΄μ–΄μ€˜, μ½μ–΄μ€˜” μš”μ²­

μ‹œμŠ€ν…œ 콜(System Call)

  • μ‚¬μš©μž κ³΅κ°„μ—μ„œ ν•˜λ“œμ›¨μ–΄ μžμ›μ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ μœ μΌν•œ 창ꡬ(게이트)
    • 예λ₯Ό λ“€μ–΄,
fd = open("/etc/passwd", O_RDONLY);
read(fd, buffer, 100);

β†’ open()κ³Ό read()λŠ” μ‹œμŠ€ν…œ 콜이며, μ‹€μ œ ν•˜λ“œμ›¨μ–΄ 접근은 컀널이 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

ν•˜λ“œμ›¨μ–΄(Hardware)

  • CPU, λ©”λͺ¨λ¦¬, λ””μŠ€ν¬, λ„€νŠΈμ›Œν¬ μΉ΄λ“œ λ“± μ‹€μ œ 물리 μž₯μΉ˜λ“€.

  • 컀널이 λ“œλΌμ΄λ²„λ₯Ό 톡해 μ œμ–΄ν•˜λ©°, μ‚¬μš©μž κ³΅κ°„μ—μ„œλŠ” 직접 μ ‘κ·Ό λΆˆκ°€.


2. λΆ€νŠΈλ‘œλ” (GRUB2 κΈ°λ³Έ ꡬ쑰, 컀널 νŒŒλΌλ―Έν„°)

πŸ“Œ λΆ€νŒ… κ³Όμ •

+-------------------------+
|        BIOS/UEFI        |
| - POST, ν•˜λ“œμ›¨μ–΄ μ΄ˆκΈ°ν™”  |
| - λΆ€νŠΈ μž₯치 선택        |
+-----------+-------------+
            |
            v
+-------------------------+
|         GRUB2           |
| - λΆ€νŠΈ 메뉴 ν‘œμ‹œ         |
| - 컀널 선택 및 컀널 νŒŒλΌλ―Έν„° 전달 |
+-----------+-------------+
            |
            v
+-------------------------+
|       Linux Kernel      |
| - ν•˜λ“œμ›¨μ–΄ μ΄ˆκΈ°ν™”        |
| - initramfs 마운트      |
| - κΈ°λ³Έ λ””λ°”μ΄μŠ€ λ“œλΌμ΄λ²„ λ‘œλ“œ |
+-----------+-------------+
            |
            v
+-------------------------+
|        systemd          |
| - μ„œλΉ„μŠ€ 관리 (Unit)    |
| - 런레벨/Target μ§„μž…     |
| - Multi-user, GUI λ“±    |
+-------------------------+
  1. BIOS/UEFI β†’ λΆ€νŠΈλ‘œλ”(GRUB2) 둜 μ œμ–΄ 전달
  2. GRUB2: OS 선택 메뉴 제곡 β†’ 컀널 이미지(vmlinuz)와 initramfs λ‘œλ“œ
  3. 컀널이 λ©”λͺ¨λ¦¬ μ΄ˆκΈ°ν™” ν›„ 첫 번째 ν”„λ‘œμ„ΈμŠ€ systemd μ‹€ν–‰

πŸ“Œ GRUB2 κΈ°λ³Έ ꡬ쑰

  • /boot/grub/grub.cfg : GRUB μ„€μ • 파일
  • 메뉴 ν•­λͺ© μ˜ˆμ‹œ:
menuentry 'Ubuntu 22.04 LTS' {
    linux   /boot/vmlinuz-5.15.0-52-generic root=UUID=xxxx ro quiet splash
    initrd  /boot/initrd.img-5.15.0-52-generic
}

πŸ“Œ 컀널 νŒŒλΌλ―Έν„°

  • root=UUID=xxx β†’ 루트 νŒŒμΌμ‹œμŠ€ν…œ μ§€μ •
  • ro β†’ 읽기 μ „μš©μœΌλ‘œ 마운트 ν›„ initμ—μ„œ rw μ „ν™˜
  • quiet splash β†’ λΆ€νŒ… λ©”μ‹œμ§€ μ΅œμ†Œν™”

3. Runlevel / systemd Target

πŸ“Œ 전톡적 SysV init (Runlevel)

  • Runlevel 0 : Halt (μ’…λ£Œ)
  • Runlevel 1 : Single user mode
  • Runlevel 3 : Multi-user, text mode
  • Runlevel 5 : Multi-user, GUI
  • Runlevel 6 : Reboot

πŸ“Œ systemd Target (Ubuntu 22 κΈ°λ³Έ ꡬ쑰)

  • poweroff.target (Runlevel 0)
  • rescue.target (Runlevel 1)
  • multi-user.target (Runlevel 3)
  • graphical.target (Runlevel 5)
  • reboot.target (Runlevel 6)

πŸ‘‰ 확인 λͺ…λ Ήμ–΄:

systemctl get-default      # ν˜„μž¬ κΈ°λ³Έ target 확인
systemctl set-default multi-user.target
systemctl isolate rescue.target

4. 컀널 λͺ¨λ“ˆ (lsmod, modprobe, dmesg)

πŸ“Œ 컀널 λͺ¨λ“ˆμ΄λž€?

  • 컀널에 λ™μ μœΌλ‘œ λ‘œλ“œ/μ–Έλ‘œλ“œ κ°€λŠ₯ν•œ λ“œλΌμ΄λ²„λ‚˜ κΈ°λŠ₯ ν™•μž₯ μ½”λ“œ
  • 예: 파일 μ‹œμŠ€ν…œ λ“œλΌμ΄λ²„, λ„€νŠΈμ›Œν¬ μΉ΄λ“œ λ“œλΌμ΄λ²„

πŸ“Œ κ΄€λ ¨ λͺ…λ Ήμ–΄

lsmod                      # ν˜„μž¬ λ‘œλ“œλœ λͺ¨λ“ˆ 확인
modprobe <module>          # λͺ¨λ“ˆ λ‘œλ“œ
modprobe -r <module>       # λͺ¨λ“ˆ μ–Έλ‘œλ“œ
dmesg | tail -n 20         # 컀널 둜그 확인

πŸ“Œ μ˜ˆμ‹œ

lsmod | grep ext4          # ext4 νŒŒμΌμ‹œμŠ€ν…œ λͺ¨λ“ˆ 확인
sudo modprobe dummy        # 가상 λ„€νŠΈμ›Œν¬ μΈν„°νŽ˜μ΄μŠ€ λͺ¨λ“ˆ λ‘œλ“œ
ip link show dummy0        # μΈν„°νŽ˜μ΄μŠ€ 생성 확인

πŸ”Ή Ubuntu 22.04 μ‹€μŠ΅ μ‹œλ‚˜λ¦¬μ˜€

πŸ“˜ μ‹€μŠ΅ ν™˜κ²½ : Ubuntu 22.04 (VM λ˜λŠ” 물리 μ„œλ²„)


βœ… μ‹œλ‚˜λ¦¬μ˜€ 1: User Space vs Kernel Space 이해

  1. strace μ„€μΉ˜

    sudo apt install strace -y
  2. μ‹œμŠ€ν…œ 콜 좔적

    strace ls

    β†’ openat, read, write 같은 μ‹œμŠ€ν…œ 콜이 컀널을 톡해 μ‹€ν–‰λ˜λŠ” 것 확인


βœ… μ‹œλ‚˜λ¦¬μ˜€ 2: GRUB2 및 컀널 νŒŒλΌλ―Έν„° μˆ˜μ •

  1. /etc/default/grub μˆ˜μ •

    sudo vim /etc/default/grub
    # GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unit=multi-user.target"
  2. 적용

    sudo update-grub
    sudo reboot
  3. λΆ€νŒ… μ‹œ ν…μŠ€νŠΈ λͺ¨λ“œ(multi-user.target)둜 μ§„μž… 확인


βœ… μ‹œλ‚˜λ¦¬μ˜€ 3: Runlevel / Target μ „ν™˜

systemctl get-default
sudo systemctl set-default graphical.target
sudo reboot

β†’ GUI 둜그인 ν™”λ©΄ 확인


βœ… μ‹œλ‚˜λ¦¬μ˜€ 4: 컀널 λͺ¨λ“ˆ μ‹€μŠ΅

  1. λ‘œλ“œλœ λͺ¨λ“ˆ 확인

    lsmod | head
  2. 가상 μΈν„°νŽ˜μ΄μŠ€ dummy λͺ¨λ“ˆ λ‘œλ“œ

    sudo modprobe dummy
    ip link show dummy0
  3. μ–Έλ‘œλ“œ

    sudo modprobe -r dummy
  4. 컀널 둜그 확인

    dmesg | tail -n 20

πŸ”Ή μ•„ν‚€ν…μ²˜ 이미지 μ œμ•ˆ

πŸ“Œ μ‚½μž…ν•  λ‹€μ΄μ–΄κ·Έλž¨:

  1. Linux OS ꡬ쑰 (User space vs Kernel space vs Hardware)
  2. λΆ€νŒ… μ•„ν‚€ν…μ²˜ (BIOS β†’ GRUB2 β†’ Kernel β†’ systemd)
  3. systemd target mapping (Runlevel vs Target ν‘œ)
  4. 컀널 λͺ¨λ“ˆ 동적 λ‘œλ“œ ꡬ쑰도

λ§ˆμ§€λ§‰ μˆ˜μ •μΌμž