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 λ± |
+-------------------------+
- BIOS/UEFI β λΆνΈλ‘λ(GRUB2) λ‘ μ μ΄ μ λ¬
- GRUB2: OS μ ν λ©λ΄ μ 곡 β 컀λ μ΄λ―Έμ§(
vmlinuz
)μ initramfs λ‘λ - 컀λμ΄ λ©λͺ¨λ¦¬ μ΄κΈ°ν ν 첫 λ²μ§Έ νλ‘μΈμ€
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 μ΄ν΄
-
strace
μ€μΉsudo apt install strace -y
-
μμ€ν μ½ μΆμ
strace ls
β
openat
,read
,write
κ°μ μμ€ν μ½μ΄ 컀λμ ν΅ν΄ μ€νλλ κ² νμΈ
β μλλ¦¬μ€ 2: GRUB2 λ° μ»€λ νλΌλ―Έν° μμ
-
/etc/default/grub
μμ sudo vim /etc/default/grub # GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unit=multi-user.target"
-
μ μ©
sudo update-grub sudo reboot
-
λΆν μ ν μ€νΈ λͺ¨λ(multi-user.target)λ‘ μ§μ νμΈ
β μλλ¦¬μ€ 3: Runlevel / Target μ ν
systemctl get-default
sudo systemctl set-default graphical.target
sudo reboot
β GUI λ‘κ·ΈμΈ νλ©΄ νμΈ
β μλλ¦¬μ€ 4: 컀λ λͺ¨λ μ€μ΅
-
λ‘λλ λͺ¨λ νμΈ
lsmod | head
-
κ°μ μΈν°νμ΄μ€ dummy λͺ¨λ λ‘λ
sudo modprobe dummy ip link show dummy0
-
μΈλ‘λ
sudo modprobe -r dummy
-
컀λ λ‘κ·Έ νμΈ
dmesg | tail -n 20
πΉ μν€ν μ² μ΄λ―Έμ§ μ μ
π μ½μ ν λ€μ΄μ΄κ·Έλ¨:
- Linux OS ꡬ쑰 (User space vs Kernel space vs Hardware)
- λΆν μν€ν μ² (BIOS β GRUB2 β Kernel β systemd)
- systemd target mapping (Runlevel vs Target ν)
- 컀λ λͺ¨λ λμ λ‘λ ꡬ쑰λ