CentOS 서버 이관용 Rocky Linux 9 가상화 서버 만들다가 배운 걸 정리한 글. 제대로 이해한건지 모르겠으나... 암튼 정리해봄. 😵💫
🔠 용어 설명
- LVM(Logical Volume Manager): 디스크를 논리적으로 구성하기 위한 기능
- 디스크: 데이터를 저장하는 실제 하드웨어
/dev/sda
,/dev/sdb
등의 장치 파일로 표현됨
- 파티션: 디스크를 논리적으로 나눈 구역
/dev/sda1
,/dev/sdb2
등의 장치 파일로 표현됨
- 물리볼륨(PV, Physical Volume): 디스크나 파티션을 초기화한 것
- 볼륨그룹(VG, Volume Group): 하나 또는 여러 개의 물리볼륨(PV)를 포함하는 그룹
- 논리볼륨(LV, Logical Volume): 볼륨그룹의 공간 전체 또는 일부를 분할하여 파일시스템 등으로 사용할 수 있도록 할당된 논리 공간
- 볼륨그룹과 논리볼륨을 생성하면
/dev/mapper/
경로에 파일로 표현됨
- 볼륨그룹과 논리볼륨을 생성하면
- 파일시스템: 파일들이 디스크 상에서 구성되는 방식
- RHEL 6 및 CentOS 6 버전의 기본 파일시스템은 ext4
- RHEL 7 및 CentOS 7 버전 이후의 기본 파일시스템은 xfs
- Rocky Linux 9 버전의 기본 파일시스템도 xfs
👀 디스크, 파티션 및 볼륨 정보 조회
lsblk
명령어를 사용하면 사용 중인 디스크, 파티션, 볼륨그룹(VG) 및 논리볼륨을(LV) 계층별로 조회해볼 수 있음.
[root@hostname ~] lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 200G 0 disk # 파티션 분할된 디스크
├─sda1 8:1 0 600M 0 part /boot/efi # 파티션 1 ~ 3
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 198.4G 0 part
├─rl-root 253:0 0 184.4G 0 lvm / # VG-LV(예: rl은 Volume Group 이름, root는 Logical Volume 이름)
└─rl-swap 253:1 0 14G 0 lvm [SWAP]
sdb 8:16 0 300G 0 disk # 파티션 분할 안 된 디스크
df -TH
명령어를 사용하면 사용 중인 파일시스템을 조회해볼 수 있음.
[root@hostname ~] df -TH
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.1G 0 4.1G 0% /dev
tmpfs tmpfs 4.1G 0 4.1G 0% /dev/shm
tmpfs tmpfs 4.1G 236M 3.8G 6% /run
tmpfs tmpfs 4.1G 0 4.1G 0% /sys/fs/cgroup
/dev/mapper/rl-root xfs 184G 23G 161G 13% / # /dev/mapper/볼륨그룹(VG)이름-논리볼륨(LV)이름
/dev/mapper/rl-logs xfs 22G 186M 22G 1% /logs
/dev/sda1 vfat 628M 6.0M 622M 1% /boot/efi # /dev/sdX: 디스크
/dev/sda2 xfs 1.1G 190M 875M 18% /boot # /dev/sdXx: 파티션
tmpfs tmpfs 805M 0 805M 0% /run/user/0
🛠️ 디스크 추가 후 파일시스템 마운트 해보기
과정은 다음과 같음.
fdisk
명령어로 파티션 생성pvcreate
명령어로 물리볼륨(PV) 생성vgcreate
명령어로 볼륨그룹(VG) 생성lvcreate
명령어로 논리볼륨(LV) 생성mkfs
명령어로 파일시스템 생성mount
명령어로 파일시스템 마운트
먼저 lsblk
명령어로 서버에 장착된 디스크 확인. 여기선 /dev/sdb
디스크를 xfs 파일시스템을 사용하여 마운트 해볼 것임.
[root@hostname ~] lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 116G 0 disk # 파티션(sda1, sda2, sda3) 설정 된 디스크
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 114.4G 0 part
├─rl-root 253:0 0 100.4G 0 lvm /
└─rl-swap 253:1 0 14G 0 lvm [SWAP]
sdb 8:16 0 200G 0 disk # 파티션 설정 안 된 디스크 → 이걸 마운트해볼 것임
fdisk
명령어로 Linux LVM 타입의 파티션 생성.
아래는 하나의 디스크에 파티션을 두 개 만드는 경우를 설명한 것이며, 하나의 디스크에 한 개의 파티션만 만드는 경우 파티션을 만들지 않고 바로 물리볼륨 생성 단계로 넘어가도 됨. (한 개의 파티션만 만들면 나중에 lsblk 명령어 실행 시 그래프가 지저분하게 보일 듯 😅)
# 디스크 정보 조회
[root@hostname ~] fdisk -l /dev/sdb
Disk /dev/sdb: 200 GiB, 214748364800 bytes, 419430400 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
# 디스크 파티션 설정
[root@hostname ~] fdisk /dev/sdb
Welcome to fdisk (util-linux 2.37.4).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xf0d74294.
# 첫 번째 파티션 만들기
Command (m for help): n ## n: New
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p ## 기본 파티션 만들 것임
Partition number (1-4, default 1): 1 ## 첫 번째 파티션
First sector (2048-419430399, default 2048): ## 시작 섹터. 기본 값 엔터.
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-419430399, default 419430399): +50G ## 마지막 섹터. 원하는 파티션 용량 입력.
Created a new partition 1 of type 'Linux' and of size 50 GiB.
# 두 번째 파티션 만들기
Command (m for help): n ## n: New
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p ## 기본 파티션 만들 것임
Partition number (2-4, default 2): 2 ## 두 번째 파티션
First sector (104859648-419430399, default 104859648): ## 시작 섹터. 기본 값 엔터.
Last sector, +/-sectors or +/-size{K,M,G,T,P} (104859648-419430399, default 419430399): ## 마지막 섹터. 엔터 치면 할당 가능한 최대 용량이 할당됨
Created a new partition 2 of type 'Linux' and of size 150 GiB.
# 첫 번째 파티션 타입 설정
Command (m for help): t ## t: Type
Partition number (1,2, default 2): 1 ## 첫 번째 파티션
Hex code or alias (type L to list all): L ## L: 모든 파티션 타입 출력
## 출력내용 생략...
Aliases:
linux - 83
swap - 82
extended - 05
uefi - EF
raid - FD
lvm - 8E ## 8e Linux LVM으로 설정할 거임
linuxex - 85
Hex code or alias (type L to list all): 8e ## 8e 입력
Changed type of partition 'Linux' to 'Linux LVM'.
# 두 번째 파티션 타입 설정
Command (m for help): t ## t: type
Partition number (1,2, default 2): 2 ## 두 번째 파티션
Hex code or alias (type L to list all): 8e ## 8e 입력
Changed type of partition 'Linux' to 'Linux LVM'.
# 저장
Command (m for help): w ## w: Write
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
# 파티션 잘 생성됐는지 못 믿겠으면 한번 확인
[root@hostname ~] fdisk -l /dev/sdb1
Disk /dev/sdb1: 50 GiB, 53687091200 bytes, 104857600 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
[root@hostname ~] fdisk -l /dev/sdb2
# 생략...
파티션을 생성했다면 pvcreate
명령어로 물리볼륨(PV) 생성.
# /dev/sdb1 파티션을 물리볼륨(PV)으로 초기화
[root@hostname ~] pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
# (참고) 파티션 분할하지 않은 /dev/sdb 디스크 전체를 물리볼륨(PV)으로 초기화
[root@hostname ~] pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
# 물리볼륨 잘 생성 됐는지 못 믿겠으면 pvdisplay 명령어로 확인
[root@hostname ~] pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "50.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 50.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID rOcKy-48uM-ag19-sgCU-8Iju-eFAi-lInUx9
# 적을 공간이 부족(?)하여 이제 /dev/sdb2 파티션 관련 작업 설명은 생략... 알아서 해보셈 🤗
물리볼륨(PV)을 생성했다면 vgcreate
명령어로 볼륨그룹(VG) 생성
# /dev/sdb1 물리볼륨(PV)을 포함하는 datavg 라는 이름의 볼륨그룹(VG) 생성
[root@hostname ~] vgcreate datavg /dev/sdb1
Volume group "datavg" successfully created
# (참고) 볼륨그룹은 여러 개의 물리볼륨을 포함할 수 있음
[root@hostname ~] vgcreate datavg /dev/sdb1 /dev/sdb2 /dev/sdb3
# 볼륨그룹 절 생성 됐는지 못 믿겠으면 vgdisplay 명령어로 확인
[root@hostname ~] vgdisplay datavg
--- Volume group ---
VG Name datavg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <50.00 GiB
PE Size 4.00 MiB
Total PE 12799
Alloc PE / Size 0 / 0
Free PE / Size 12799 / <50.00 GiB
VG UUID rOkCy-2N5D-gR18-Inmb-Ceoh-1MwG-lInUx
볼륨그룹(VG)을 생성했다면 lvcreate
명령어로 논리볼륨(LV) 생성.
# datavg 볼륨그룹(VG)에 data1이라는 이름의 논리볼륨(LV)을 20GB만큼 생성
[root@hostname ~] lvcreate -n data1 -L 20G datavg
Logical volume "data1" created.
# datavg 볼륨그룹(VG)에 data2이라는 이름의 논리볼륨(LV)을 남아있는 모든 공간을 사용하여 생성
[root@hostname ~] lvcreate -n data2 -l 100%FREE datavg
Logical volume "data2" created.
# (참고) datavg 볼륨그룹(VG)에 data3이라는 이름의 논리볼륨(LV)을 /dev/sdb1 물리볼륨(PV)에 남아있는 모든 공간을 사용하여 생성
# 여러 개의 물리볼륨(PV)을 갖고 있는 볼륨그룹(VG)에 논리볼륨(LV)을 만들 때 매핑용(논리볼륨 → 물리볼륨)으로 쓰면 좋을 듯
[root@hostname ~] lvcreate -n data3 -l 100%FREE datavg /dev/sdb1
Logical volume "data3" created.
# 논리볼륨 잘 생성 됐는지 못 믿겠으면 lvdisplay 명령어로 확인
[root@hostname ~] lvdisplay /dev/mapper/datavg-data1
--- Logical volume ---
LV Path /dev/datavg/data1
LV Name data1
VG Name datavg
LV UUID rOcKy-aYdk-qnEK-nHdG-f7xJ-B4uL-lInUx
LV Write Access read/write
LV Creation host, time rockyhost, 2024-09-11 17:51:50 +0900
LV Status available
# open 0
LV Size 20.00 GiB
Current LE 5120
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
논리볼륨(LV)을 생성했다면 mkfs.xfs
명령어로 xfs 파일 시스템 생성. (ext4 파일시스템을 생성하려면 mkfs.ext4
)
# datavg 볼륨그룹(VG)에 있는 data1 논리볼륨(LV)에 xfs 파일시스템 생성
[root@hostname ~] mkfs.xfs /dev/mapper/datavg-data1
meta-data=/dev/mapper/datavg-data1 isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=5242880, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
파일시스템을 생성했다면 디렉터리 생성 후 마운트.
# 디렉터리 생성
[root@hostname ~] mkdir /data1
# 논리볼륨(LV)을 디렉터리에 마운트
[root@hostname ~] mount /dev/mapper/datavg-data1 /data1
# 마운트 잘 됐는지 못 믿겠으면 df 명령어로 확인
[root@hostname ~] df -TH
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.2M 0 4.2M 0% /dev
tmpfs tmpfs 4.1G 0 4.1G 0% /dev/shm
tmpfs tmpfs 1.7G 12M 1.6G 1% /run
/dev/mapper/rl-root xfs 108G 6.6G 102G 7% /
/dev/sda2 xfs 1.1G 307M 701M 31% /boot
/dev/sda1 vfat 628M 7.4M 621M 2% /boot/efi
tmpfs tmpfs 805M 132k 805M 1% /run/user/1000
/dev/mapper/datavg-data1 xfs 22G 184M 22G 1% /data1 # 잘 마운트 됨
서버 재기동 시 파일시스템이 자동 마운트되도록 /etc/fstab
파일에 등록
# 아래와 같이 입력
/dev/mapper/datavg-data1 /data1 xfs defaults 0 0
systemctl daemon-reload
명령어로 수정된 fstab 파일을 반영하거나 재부팅하여 파일시스템이 자동으로 마운트 되는지 최종 확인.
🔍 파일시스템 용량 확장
디스크에 할당되지 않은 공간이 남아있을 때 이를 활용하는 과정은 다음과 같음.
growpart
명령어로 파티션 크기 확장pvresize
명령어로 물리볼륨(PV) 크기 조정lvextend
명령어로 논리볼륨(LV) 크기 확장xfs_growfs
명령어(또는resize2fs
명령어)로 파일시스템 크기 확장.
먼저 lsblk
, df -h
또는 fdisk -l
명령어로 용량 확장할 파일시스템 확인. 여기선 /dev/sda3 디스크 파티션의 rl-root 볼륨그룹(VG)-논리볼륨(LV)의 용량을 늘린다고 가정함.
# 파티션, VG(볼륨그룹) 및 LV(논리볼륨) 확인
[root@hostname ~] lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 200G 0 disk # /dev/sda 디스크 총 용량이 200G인데
├─sda1 8:1 0 600M 0 part /boot/efi # sda1 ~ 3 파티션 용량 모두 합치면 200GB가 안 됨
├─sda2 8:2 0 1G 0 part /boot # 즉 할당되지 않은 공간이 있음
└─sda3 8:3 0 114.4G 0 part
├─rl-root 253:0 0 100.4G 0 lvm / # 이걸 늘릴 것임
└─rl-swap 253:1 0 14G 0 lvm [SWAP]
# 파일시스템 확인
[root@hostname ~] df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 1.5G 9.4M 1.5G 1% /run
/dev/mapper/rl-root 101G 6.1G 95G 7% / # 이거 늘릴 거임
/dev/sda2 960M 293M 668M 31% /boot
/dev/sda1 599M 7.0M 592M 2% /boot/efi
tmpfs 768M 132K 768M 1% /run/user/1000
# 디스크 및 파티션 세부 정보 확인
[root@hostname ~] fdisk -l /dev/sda
GPT PMBR size mismatch (243269631 != 419430399) will be corrected by write.
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors # /dev/sda 디스크 총 용량이 200GB인데
Disk model: Virtual disk
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: gpt
Disk identifier: 8DB6ADB3-2548-4F36-9CC3-0149069BAC35
Device Start End Sectors Size Type # sda1 ~ 3 용량 모두 합치면 200GB가 안 됨
/dev/sda1 2048 1230847 1228800 600M EFI System
/dev/sda2 1230848 3327999 2097152 1G Linux filesystem
/dev/sda3 3328000 243267583 239939584 114.4G Linux LVM # 이거 늘릴 거
dnf install cloud-utils-growpart -y
명령어로 디스크 용량 할당을 간편하게 해주는 growpart 패키지를 설치한 후 growpart
명령어로 파티션 용량 확장.
# /dev/sda3 파티션에 사용 가능한 용량 할당
[root@hostname ~] growpart /dev/sda 3
CHANGED: partition=3 start=3328000 old: size=239939584 end=243267583 new: size=416102367 end=419430366
# 정말 할당됐는지 못 믿겠으면 조회
[root@hostname ~] lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 198.4G 0 part # 114.4G → 198.4G 확장됨
├─rl-root 253:0 0 100.4G 0 lvm /
└─rl-swap 253:1 0 14G 0 lvm [SWAP]
pvresize
명령어로 물리볼륨(PV) 크기 조정 후
[root@hostname ~] pvresize /dev/sda3
Physical volume "/dev/sda3" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
vgdisplay
명령어로 논리볼륨(LV)에 추가로 할당 가능한 용량 확인
[root@hostname ~] vgdisplay
--- Volume group ---
VG Name rl # Volume Group 이름 확인
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 198.41 GiB
PE Size 4.00 MiB
Total PE 50793
Alloc PE / Size 29288 / <114.41 GiB
Free PE / Size 21505 / 84.00 GiB # 84GB 추가 가능
VG UUID CHhQUT-BR0c-Ky4T-Rnjl-9Z6o-OOwP-cpfxKK
lvextend
명령어로 논리볼륨(LV) 용량을 확장한 후
# rl 볼륨그룹(VG)의 root 논리볼륨(LV) 용량 확장
[root@hostname ~] lvextend -L +84G /dev/mapper/rl-root
Size of logical volume rl/root changed from <100.41 GiB (25704 extents) to <184.41 GiB (47208 extents).
Logical volume rl/root successfully resized.
xfs_growfs
명령어로 xfs 파일시스템 크기 확장. ext4 파일시스템인 경우 resize2fs
명령어 사용.
# rl 볼륨그룹(VG)의 root 논리볼륨(LV)을 사용하는 xfs 파일시스템 크기 확장
[root@hostname ~] xfs_growfs /dev/mapper/rl-root
meta-data=/dev/mapper/rl-root isize=512 agcount=4, agsize=6580224 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=26320896, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 26320896 to 48340992
최종 확인.
[root@hostname ~] df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 1.5G 9.4M 1.5G 1% /run
/dev/mapper/rl-root 185G 6.7G 178G 4% / # 잘 늘어났음
/dev/sda2 960M 293M 668M 31% /boot
/dev/sda1 599M 7.0M 592M 2% /boot/efi
tmpfs 768M 132K 768M 1% /run/user/1000
[root@hostname ~] lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 198.4G 0 part
├─rl-root 253:0 0 184.4G 0 lvm / # 잘 늘어남
└─rl-swap 253:1 0 14G 0 lvm [SWAP]