[Linux Storage] 리눅스 시스템 디스크 파티션 및 관련 개념 정리
blog post
이번 포스트에서는 리눅스 시스템 관리에 있어 중요한 부분을 차지하는 디스크 파티셔닝 개념에 대해 다뤄볼까 합니다. 디스크 파티셔닝을 다루는 과정에서 필요한 용어들에 대해 알아보고, 특히 리눅스 시스템에 초점을 두고 포스팅해 보도록 하겠습니다.
우선 파티셔닝은 하나의 물리 저장장치를 시스템 내부에서 여러 디스크 공간으로 나누는 작업을 일컫습니다. 이때 이 공간은 물리적으로 나뉠 수도 있고, 논리적으로 나뉠 수도 있습니다. 물리적으로 나뉜 공간을 프라이머리(Primary), 논리적으로 나뉜 공간을 익스텐디드(Extended)라고 부릅니다.
프라이머리 공간의 경우, 리눅스에서 최대 4개의 공간으로 나눌 수 있습니다. 따라서 더 많은 파티셔닝이 필요한 경우, 익스텐디드 공간으로 논리적으로 확장하면 됩니다. 일반적으로 익스텐디드 공간으로 확장해서 많이 씁니다. 혹은 LVM이라고 부르는 파일 시스템을 통해 하나의 물리 공간을 논리적으로 쪼개어 사용하기도 합니다.
이렇게 나뉜 각각의 저장공간을 파티션(Partition)이라고 부릅니다.
리눅스 디스크 관리 체계에서 파티션과 함께 많이 쓰이는 용어가 바로 볼륨(Volume)입니다.
볼륨은 하드디스크나 SSD, 혹은 RAID 같은 물리적인 공간을 의미합니다. 일반적으로 하나의 하드웨어를 볼륨으로 일컫지만, RAID와 같이 여러 디스크가 복합적으로 구성된 경우에도 볼륨이라고 부르기도 합니다.
또한 많이들 파티션과 볼륨을 혼용하곤 합니다. 사실 엄밀하게 말하면, 파티션과 볼륨은 구분되어야 합니다. 물론 이 둘을 구분짓는 기준은 사용자들마다 조금씩 다를 수 있습니다. 일반적으로 파티션의 경우, 하나의 디스크에서 나뉜 공간을 의미하는 반면, 볼륨의 경우 앞서 언급한 바와 같이 디스크나 SSD, DVD 등의 물리 저장공간까지 포괄적으로 볼륨이라고 불립니다. 또한 각각의 파티션 자체가 곧 볼륨이기도 합니다.
정리하자면 파티션은 물리 공간에서 나뉜 각각의 저장공간인 반면, 볼륨의 경우 파티션을 포함한 물리 저장공간까지 모두 아우르는 개념이라고 볼 수 있습니다.
파티셔닝 작업은 단순히 디스크 공간을 나누는 작업 뿐만 아니라, 그 나뉜 공간의 파일 시스템을 지정하는 것도 포함합니다. 여기에서 파일 시스템이란, 물리 혹은 논리적으로 나뉜 공간의 파일(데이터)을 어떻게 배치하고 관리할 것인가를 정의한 시스템을 의미합니다.
리눅스에서는 다양한 파일 시스템을 지원하고 있습니다. 앞서 포스트에서 루트 파티션(/)의 경우 xfs, /boot 디렉토리는 ext4, 그리고 swap 메모리 공간으로 리눅스 파티셔닝을 진행한 바 있습니다. 이러한 xfs, ext4, swap 등이 파일 시스템을 의미합니다. 이 밖에도 ext2,3, FAT32, LVM 등 다양한 파일 시스템들이 존재합니다. 리스트는 fdisk 명령을 사용하여 아래와 같이 확인할 수 있습니다.
[root@localhost ~]# fdisk /dev/sda
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): l
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT-
4 FAT16 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 Hidden FAT16 61 SpeedStor ab Darwin boot f4 SpeedStor
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto
1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
파티셔닝 된 물리 혹은 논리 공간이 실제 리눅스 시스템 상에서는 어떻게 보일까요? 특정 디렉토리에 연결되어 보입니다. 흔히 이를 마운트 되었다고 표현합니다. 즉, 특정 파일 시스템으로 마운트 된 파티션이 특정 디렉토리에 마운트 됨으로써, 사용자는 그 디렉토리를 통해 디스크의 파티션과 상호작용할 수 있게 되는 것이죠.
리눅스 시스템에서 가장 자주 쓰는 df 명령을 통해서 이를 확인해 볼 수 있습니다. 아래는 이전 포스트에서 설치했던 리눅스 시스템의 파티션 내역 입니다.
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 382M 0 382M 0% /dev
tmpfs tmpfs 399M 0 399M 0% /dev/shm
tmpfs tmpfs 399M 11M 388M 3% /run
tmpfs tmpfs 399M 0 399M 0% /sys/fs/cgroup
/dev/mapper/cl-root xfs 17G 2.0G 15G 12% /
/dev/sda1 ext4 976M 175M 734M 20% /boot
tmpfs tmpfs 80M 0 80M 0% /run/user/0
보시다시피 LVM으로 파티셔닝 된 cl-root의 경우, 루트 디렉토리(/)에 마운트 된 것을 볼 수 있습니다. /dev/sda1의 경우 물리 파티션으로, /boot 디렉토리에 마운트 된 것을 볼 수 있습니다.
이처럼, 최종적으로 파티셔닝 된 디스크 공간은 특정 디렉토리에 마운트 되어야 사용자와 상호작용 할 수 있습니다.
LVM은 Logical Volume Manager의 약자로, 말 그대로 논리 볼륨 생성부터 관리까지 도와주는 파티셔닝 도구입니다. 리눅스 파티션 시스템에 있어서 빼놓을 수 없는 존재입니다. 또한 LVM은 논리 파티셔닝을 지원하는 시스템입니다. 앞서 파일 시스템 리스트를 확인해보면 "8e Linux LVM"을 통해 이를 알 수 있습니다.
LVM을 사용하는 이유는 리눅스 시스템에서 파티션을 물리적으로 분할할 경우, 최대 4개까지 밖에 지원되지 않는다는 문제와 관련이 있습니다. 이러한 문제를 LVM을 통해 해결할 수 있습니다. 즉, 파티션을 논리적으로 구성함으로써, 물리적 한계에 제약받지 않고 디스크를 효율적으로 분할하여 사용할 수 있다는 점에서 LVM이 유용하게 사용됩니다.
물론 "Linux Extended" 방식으로 물리 파티션을 말 그대로 확장하여 사용할 수 있습니다. 하지만 LVM 파일 시스템은 이보다 더 강력한 논리 파티셔닝 기능을 제공하고 있습니다. 여러 파티션 구성 상황에서 유연하게 동작할 수 있고 자체 명령어를 통해 좀 더 관리하기 수월하다는 장점을 지니고 있습니다.
LVM은 크게 세 가지 영역으로 구분됩니다.
- Physical Volume (PV): 리눅스 시스템에 존재하는 물리 파티션 공간입니다. LVM의 PV로 귀속되면 해당 공간에 여유 공간이 충분해도 물리적으로 파티셔닝할 수 없습니다.
- Volume Group (VG): PV로 등록된 파티션을 다시 하나의 그룹으로 묶을 수 있습니다. 이 그룹이 바로 VG입니다. VG로 묶인 PV 파티션은 동일 VG 내에서 모든 용량이 통합됩니다. 또 다시 논리 파티션으로 나눌 때에는 VG에서 전체 가용 공간을 판단하여 할당하게 됩니다.
- Logical Volume (LG): VG는 다시 자신이 관리중인 PV에서 논리적으로 공간을 분할할 수 있습니다. 이렇게 분할된 파티션을 LV라고 합니다.
이렇게 LV로 나뉜 파티션은 최종적으로 파일 시스템을 할당받고 특정 디렉토리에 마운트 될 수 있습니다. 이러한 전체 볼륨 구조를 구성해보면 아래 그림과 같습니다.
위 그림은 실제 리눅스 시스템에서 구성된 전체 볼륨 구조를 이미지로 재구성해 본 것입니다. 보시는 것과 같이 실제 물리 디스크 (/dev/sda, sdb)가 파티셔닝 된 볼륨(/dev/sda2, sdb1, sdb2)이 볼륨 그룹 (cl)에 묶인 것을 확인할 수 있습니다. 따라서 /dev/sda2, sdb1, sdb2의 타입은 이제 Linux LVM입니다.
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8cb24ec7
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 20973567 20971520 10G 8e Linux LVM
/dev/sdb2 20973568 41943039 20969472 10G 8e Linux LVM
하지만 VG로 묶인 sda2, sdb1, sdb2는 다시 논리 볼륨 (/dev/cl/root, user1, user2, user3)으로 나뉘었고 이 논리 파티션들은 각각 리눅스 시스템의 디렉토리 (/, /boot, /home/user1,2,3)로 마운트 되기 위해 다시 ext4와 xfs 파일 시스템으로 포맷된 것을 볼 수 있습니다.
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 383M 0 383M 0% /dev
tmpfs 399M 0 399M 0% /dev/shm
tmpfs 399M 5.8M 393M 2% /run
tmpfs 399M 0 399M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.0G 16G 12% /
/dev/mapper/cl-user3 4.0G 61M 4.0G 2% /home/user3
/dev/mapper/cl-user1 9.8G 37M 9.3G 1% /home/user1
/dev/sda1 976M 194M 716M 22% /boot
/dev/mapper/cl-user2 3.9G 16M 3.7G 1% /home/user2
tmpfs 80M 0 80M 0% /run/user/0
또한 2GB는 Swap 메모리 할당을 위해 파티셔닝 된 것을 볼 수 있습니다. 물론 LV로 swap 메모리에 할당할 수도 있죠.
파티셔닝 내용은 여기까지 입니다. 이 정도 선에서 파티션에 대한 이해를 하실 수 있다면, 실제 리눅스 시스템에서 파티셔닝 작업 진행에는 무리가 없을 것으로 예상됩니다.
실제 파티션을 구성하는 과정은 별도 포스트에서 또 다루도록 하겠습니다.