1. 디스크 관리 기본 개념
1.1. 부팅 파티션 방식: MBR과 GPT
시스템 부팅에는 MBR(Master Boot Record)과 GPT(GUID Partition Table) 두 가지 파티션 방식이 사용됩니다.
- MBR 파티션: 하드디스크의 첫 섹터에 파티션 정보가 저장됩니다. 오래되고 호환성이 좋지만, 2TB 이상의 용량을 인식하지 못하며 최대 4개의 주 파티션(또는 3개의 주 파티션과 1개의 확장 파티션)만 지원한다는 제약이 있습니다.
- GPT 파티션: GUID(Globally Unique Identifier)를 기반으로 하는 최신 방식입니다. 파티션 수와 크기에 거의 제한이 없어 대용량 디스크 관리에 적합합니다.
1.2. 파일 시스템: Ext4와 XFS
리눅스 환경에서 가장 널리 사용되는 파일 시스템은 Ext4와 XFS입니다. 파일 시스템 선택 시 확장성, 안정성, 데이터 무결성 등을 고려해야 합니다.
- Ext4: 작은 파일들을 효율적으로 관리하며, 갑작스러운 전원 손실 시에도 메타데이터 무결성을 보장하는 데 강점이 있습니다. 데비안 및 우분투와 같은 배포판에서 기본 파일 시스템으로 주로 사용됩니다.
- XFS: 높은 I/O 처리량과 확장성을 제공하며, 특히 대용량 파일 처리에서 뛰어난 성능을 발휘합니다. RHEL 기반 배포판(CentOS 포함)에서 기본 파일 시스템으로 채택되고 있습니다.
1.3. 논리 볼륨 관리 (LVM)
LVM(Logical Volume Manager)은 물리적인 디스크 공간을 보다 유연하게 관리할 수 있도록 해주는 추상화 계층입니다. LVM은 여러 물리 볼륨(Physical Volume, PV)을 묶어 볼륨 그룹(Volume Group, VG)을 만들고, 이 볼륨 그룹 내에서 논리 볼륨(Logical Volume, LV)을 할당하여 사용합니다.
LVM 환경에서 디스크를 확장하는 기본 절차는 다음과 같습니다:
- 새로운 물리 디스크 또는 기존 디스크의 빈 공간에 파티션을 생성하고 물리 볼륨(PV)으로 초기화합니다.
- 이 새로운 물리 볼륨을 기존 볼륨 그룹(VG)에 추가하여 볼륨 그룹의 전체 용량을 확장합니다.
- 확장된 볼륨 그룹의 여유 공간을 필요한 논리 볼륨(LV)에 할당하여 해당 논리 볼륨의 크기를 늘립니다.
- 논리 볼륨 위에 있는 파일 시스템을 확장하여 최종적으로 사용 가능한 공간을 늘립니다.
LVM 관련 정보를 확인하는 주요 명령어는 다음과 같습니다:
# 1. 물리 볼륨(PV) 정보 확인
[root@localhost ~]# pvdisplay
# 2. 볼륨 그룹(VG) 정보 확인
[root@localhost ~]# vgdisplay
# 3. 논리 볼륨(LV) 정보 확인
[root@localhost ~]# lvdisplay
2. 기존 디스크 파티션 확장
여기서는 가상 머신(VMware Workstation)에서 CentOS 운영체제의 디스크 용량을 40GB에서 50GB로 10GB 확장하는 시나리오를 가정합니다. 먼저 가상 머신을 종료한 후 VMware 설정에서 하드디스크 용량을 늘려줍니다.
2.1. 확장 전 파티션 상태 확인
확장 작업을 시작하기 전에 현재 파티션 상태를 확인해야 합니다. df -Th 명령은 파일 시스템의 마운트 상태와 사용량을 보여주며, lsblk 명령은 블록 장치들의 계층적 구조를 시각적으로 보여줍니다.
2.1.1. 표준 파티션 환경
# 1. 표준 파티션에서 파일 시스템 사용량 확인 (swap 파티션은 표시되지 않음)
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda4 xfs 32G 3.3G 29G 11% /
/dev/sda2 xfs 507M 211M 296M 42% /boot
/dev/sda1 vfat 256M 7.3M 249M 3% /boot/efi
# 2. 표준 파티션에서 블록 장치 정보 확인 (디스크 sda가 50GB로 확장됨)
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 259:0 0 50G 0 disk # sda 디스크가 50GB로 확장되었음을 알 수 있습니다.
├─sda1 259:1 0 256M 0 part /boot/efi
├─sda2 259:2 0 512M 0 part /boot
├─sda3 259:3 0 8G 0 part [SWAP]
└─sda4 259:4 0 31.3G 0 part # / 파티션은 아직 31.3G로 남아있습니다.
2.1.2. LVM 파티션 환경
# 1. LVM 파티션에서 파일 시스템 사용량 확인 (swap 파티션은 표시되지 않음)
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 32G 3.1G 29G 8% /
/dev/sda1 xfs 507M 220M 287M 44% /boot
# 2. LVM 파티션에서 블록 장치 정보 확인 (디스크 sda가 50GB로 확장됨)
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 259:0 0 50G 0 disk # sda 디스크가 50GB로 확장되었음을 알 수 있습니다.
├─sda1 259:1 0 512M 0 part /boot
└─sda2 259:2 0 39.5G 0 part # sda2가 LVM의 물리 볼륨으로 사용되고 있습니다.
├─centos-root 253:0 0 31.5G 0 lvm / # 논리 볼륨 centos-root가 아직 31.5G입니다.
└─centos-swap 253:1 0 8G 0 lvm [SWAP]
2.2. 표준 파티션 확장
루트(/) 파티션(/dev/sda4)에 10GB를 추가로 할당하는 시나리오입니다.
주의: 이 방법은 기존 파티션을 삭제하고 다시 생성하는 방식이므로, 시작 섹터를 정확히 유지하지 않으면 데이터 손실의 위험이 매우 큽니다. 중요 데이터가 있는 경우 반드시 백업을 먼저 수행하고, 숙련된 사용자만 진행해야 합니다. 가능하면 LVM을 사용하거나 parted와 같은 도구를 사용하는 것이 안전합니다.
# 1. fdisk 유틸리티로 디스크 /dev/sda 에 접근
[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.
GPT PMBR size mismatch (83886079 != 104857599) will be corrected by write.
# 2. 'p' 명령으로 현재 파티션 테이블 정보 확인
Command (m for help)#: p
Device Start End Sectors Size Type
/dev/sda1 2048 526335 524288 256M EFI System
/dev/sda2 526336 1574911 1048576 512M Linux filesystem
/dev/sda3 1574912 18352127 16777216 8G Linux swap
/dev/sda4 18352128 83884031 65531904 31.3G Linux filesystem
# 3. 'd' 명령으로 확장할 파티션(여기서는 sda4) 삭제 (변경사항은 아직 저장되지 않음!)
Command (m for help)#: d
Partition number (1-4, default 4): 4
Partition 4 has been deleted.
# 4. 'n' 명령으로 새 파티션 생성. 파티션 번호는 기존과 동일하게 4를 입력합니다.
# 시작 섹터는 반드시 기존 sda4의 시작 섹터(18352128)와 동일하게 유지하고,
# 마지막 섹터는 기본값(디스크의 남은 모든 공간)을 사용하여 최대 크기로 확장합니다.
Command (m for help)#: n
Partition number (4-128, default 4): 4
First sector (18352128-104857566, default 18352128): # 엔터 (기존 시작 섹터 유지)
Last sector, +sectors or +size{K,M,G,T,P} (18352128-104857566, default 104857566): # 엔터 (최대 크기 사용)
Created a new partition 4 of type 'Linux filesystem' and of size 41.3 GiB.
Partition #4 contains a xfs signature.
Do you want to remove the signature? [Y]es/[N]o#: no # 기존 파일 시스템 서명을 제거하지 않습니다. (아니오 선택)
# 5. 'w' 명령으로 모든 변경사항을 디스크에 저장합니다. (이 시점에 변경사항이 실제 디스크에 적용됨)
Command (m for help): w
The partition table has been altered.
Syncing disks.
# 6. 커널에 파티션 테이블 변경사항을 알립니다.
[root@localhost ~]# partprobe /dev/sda
# 7. df -Th로 확인하면 아직 파티션 크기가 반영되지 않은 것을 볼 수 있습니다.
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda4 xfs 32G 3.2G 29G 11% /
# 8. 파일 시스템을 온라인으로 확장합니다. (XFS의 경우 xfs_growfs 사용)
# Ext2/3/4 파일 시스템은 resize2fs 명령을 사용합니다.
[root@localhost ~]# xfs_growfs /dev/sda4
meta-data=/dev/sda4 isize=512 agcount=4, agsize=2064128 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=8256512, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=4031, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 8256512 to 10876928 # 파일 시스템 블록이 성공적으로 확장됨
# 9. df -Th로 최종 확인하면 /dev/sda4의 크기가 42G로 확장된 것을 볼 수 있습니다.
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda4 xfs 42G 3.3G 38G 8% /
2.3. LVM 파티션 확장
LVM 환경에서 루트(/) 논리 볼륨(/dev/centos/root)에 10GB를 추가로 할당하는 시나리오입니다.
# 1. fdisk 유틸리티로 디스크 /dev/sda 에 접근
[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.
# 2. 'p' 명령으로 현재 파티션 테이블 정보 확인
Command (m for help)#: p
Device Boot Start End Sectors Size Id Type
/dev/sda1* 2048 1050623 1048576 512M 83 Linux
/dev/sda2 1050624 83886079 82835456 39.5G 8e Linux LVM # sda2가 LVM 파티션으로 사용 중
# 3. 'n' 명령으로 새 파티션 생성
Command (m for help)#: n
Partition type
p primary (2 primary, 0 extended, 2 free) # 남은 공간에 2개의 주 파티션 생성 가능
e extended (container for logical partitions)
Select (default p): p # 주 파티션 선택
Partition number (3,4, default 3): 3 # 파티션 번호 3번 선택
First sector (83886080-104857599, default 83886080): # 엔터 (기본 시작 섹터)
Last sector, +sectors or +size{K,M,G,T,P} (83886080-104857599, default 104857599): # 엔터 (기본 마지막 섹터, 10GB 할당)
Created a new partition 3 of type 'Linux' and of size 10 GiB.
# 4. 'w' 명령으로 변경사항을 디스크에 저장 (새 파티션 /dev/sda3 생성)
Command (m for help): w
The partition table has been altered.
Syncing disks.
# 5. 커널에 파티션 테이블 변경사항을 알립니다.
[root@localhost ~]# partprobe /dev/sda
# 6. 새로 생성된 /dev/sda3 파티션을 물리 볼륨(PV)으로 초기화합니다.
[root@localhost ~]# pvcreate /dev/sda3
Physical volume "/dev/sda3" successfully created.
# 7. 현재 볼륨 그룹 'centos'의 상태를 확인합니다.
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name centos
VG Size <39.50 GiB
# ... (생략) ...
# 8. /dev/sda3 물리 볼륨을 'centos' 볼륨 그룹에 추가하여 확장합니다.
[root@localhost ~]# vgextend centos /dev/sda3
Physical volume "/dev/sda3" successfully added to volume group "centos".
Volume group "centos" successfully extended.
# 9. 논리 볼륨 'root'의 현재 크기를 확인합니다.
[root@localhost ~]# lvdisplay /dev/centos/root
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV Size <31.50 GiB
# ... (생략) ...
# 10. 'centos' 볼륨 그룹의 모든 사용 가능한 여유 공간을 'root' 논리 볼륨에 할당하여 확장합니다.
[root@localhost ~]# lvextend -l +100%FREE /dev/centos/root
Size of logical volume centos/root changed from <31.50 GiB (8063 extents) to 41.49 GiB (10622 extents).
Logical volume centos/root successfully resized.
# 11. 논리 볼륨 위의 XFS 파일 시스템을 확장하여 변경사항을 반영합니다.
[root@localhost ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=2064128 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=8256512, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=4031, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 8256512 to 10876928 # 파일 시스템 블록이 성공적으로 확장됨
# 12. df -Th로 최종 확인하면 /dev/mapper/centos-root의 크기가 42G로 확장된 것을 볼 수 있습니다.
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 42G 3.2G 39G 8% /
/dev/sda1 xfs 507M 220M 287M 44% /boot
3. 새 디스크 추가 및 마운트
새로운 디스크(예: /dev/sdb)를 시스템에 추가하고 이를 특정 디렉터리(예: /data)에 마운트하여 사용하는 과정입니다.
3.1. 새 디스크 파티션 생성
# 1. fdisk 유틸리티로 새 디스크 /dev/sdb 에 접근
[root@localhost ~]# fdisk /dev/sdb
# 2. 'n' 명령으로 새 파티션 생성
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free) # 주 파티션 선택
e extended (container for logical partitions)
Select (default p): p # 'p' 입력 후 엔터
Partition number (1-4, default 1): # 엔터 (기본값인 1번 파티션 사용)
First sector (2048-209715199, default 2048): # 엔터 (기본 시작 섹터)
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): # 엔터 (디스크의 전체 공간 사용)
Created a new partition 1 of type 'Linux' and of size 100 GiB. # 100GB 크기의 sdb1 파티션 생성
# 3. 'w' 명령으로 변경사항을 디스크에 저장합니다.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
3.2. 파티션 포맷
새로 생성된 파티션을 XFS 파일 시스템으로 포맷합니다.
# 1. /dev/sdb1 파티션을 XFS 파일 시스템으로 포맷
[root@localhost ~]# mkfs -t xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=6553536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=26214144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=12799, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
3.3. 디렉터리 생성 및 마운트
새 디스크를 마운트할 디렉터리를 생성하고, 포맷된 파티션을 해당 디렉터리에 마운트합니다. 시스템 재부팅 시에도 자동으로 마운트되도록 /etc/fstab 파일에 설정합니다.
# 1. /data 디렉터리 생성
[root@localhost ~]# mkdir /data
# 2. /dev/sdb1 파티션을 /data 디렉터리에 마운트
[root@localhost ~]# mount /dev/sdb1 /data
# 3. lsblk -f 명령으로 /dev/sdb1의 UUID 확인 (자동 마운트 설정에 필요)
[root@localhost centos]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb
└─sdb1 xfs 516d20fa-0551-4348-a348-c81f4879b00e /data # sdb1의 UUID 확인
# 4. /etc/fstab 파일에 자동 마운트 설정 추가 (시스템 재부팅 시에도 유지)
[root@localhost ~]# vim /etc/fstab
# 파일 마지막에 다음 라인 추가:
UUID=516d20fa-0551-4348-a348-c81f4879b00e /data xfs defaults 0 0