디스크와 파일시스템
PV, VG, LV와 파일시스템의 관계, loop 장치 기반 LVM 구성과 XFS 및 루트 LV 확장 실습
#핵심 요약
일반 파티션은 크기가 정해진 물통이라 차면 늘리기 어렵고, LVM은 여러 디스크(PV)를 하나의 풀(VG)로 묶어 필요한 만큼 논리 볼륨(LV)을 떼어 쓰므로 디스크를 더해 용량을 늘릴 수 있음
사용 순서는 새 디스크 확인 → 파티션 → PV → VG → LV → 파일시스템 → 마운트이며, 늘릴 때는 VG(vgextend) → LV(lvextend) → 파일시스템(xfs_growfs)을 각각 키워야 df에 반영됨
XFS는 마운트된 상태로 늘릴 수 있어 /u01 같은 경로를 내리지 않고 확장함
작업 대상이 새 디스크인지 반드시 확인하고, OS가 설치된 디스크(/dev/sda)는 건드리지 않음
#개념과 동작 원리
| 계층 | 의미 | 확인 |
|---|---|---|
| 디스크 | OS가 인식한 장치 전체(/dev/sdb, /dev/loop0) |
lsblk, fdisk -l |
| 파티션 | 디스크 안의 구역(/dev/sdb1, /dev/loop0p1) |
lsblk의 part |
| PV | LVM이 관리하도록 등록한 디스크, 파티션 | pvs |
| VG | PV를 모은 저장 공간 풀 | vgs의 VSize, VFree |
| LV | VG에서 떼어 낸 논리 디스크, 파일시스템을 만드는 대상 | lvs의 LSize |
| 파일시스템, 마운트 | LV 위의 XFS 등과 접근 경로 | df -h |
vgs의 #PV, #LV는 포함된 PV, LV 수, Attr의 wz--n-는 쓰기 가능, 크기 조정 가능, 정상, VFree는 아직 LV에 주지 않은 여유임
VFree가 0이면 VG 공간을 LV가 모두 쓰고 있는 것이라, LV를 키우려면 먼저 PV를 더해야 함
#필수 명령어 또는 SQL
#새 디스크 확인과 가짜 디스크 만들기
lsblk
fdisk -l
dd if=/dev/zero of=/lvmdisk.img bs=1M count=3072
losetup -fP /lvmdisk.img
losetup -a
lsblk결과 해석:
실습 기록: 기존 sda(80G) 아래 sda1(/boot)과 sda2의 ol-root, ol-swap LV가 있고, 새 loop0(3G)은 TYPE loop로 파티션 없이 보임
losetup -fP는 비어 있는 loop 번호를 골라 파일을 붙이고 파티션도 인식하게 함
loop 장치는 재부팅하면 풀리므로 실습용으로만 쓰고, 실제 서버는 새로 추가한 디스크(/dev/sdb 등)로 같은 순서를 밟음
#파티션 → PV → VG → LV → XFS → 마운트
n
p
1
(Enter)
(Enter)
wpartprobe /dev/loop0
lsblk
pvcreate /dev/loop0p1
pvs
vgcreate vgdata /dev/loop0p1
lvcreate -l 100%FREE -n lvdata vgdata
mkfs.xfs /dev/vgdata/lvdata
mkdir /u04
mount /dev/vgdata/lvdata /u04
df -h /u04
vgs결과 해석:
fdisk의 n은 새 파티션, p는 주 파티션, Enter 두 번은 처음부터 끝까지, w는 저장하고 종료이며 q는 저장하지 않고 나감
loop 장치는 파티션을 만든 뒤 partprobe를 해야 loop0p1이 보임
-l 100%FREE는 VG의 남은 공간 전부를 LV에 줌
실습 기록: vgs에 vgdata 1 1 0 wz--n- <3.00g 0
mount만으로는 재부팅 뒤 사라지므로 계속 쓸 경로는 /etc/fstab에 등록함
수업 실습은 일시 마운트까지만 다룸
#마운트한 경로에 테이블스페이스 두기
chown -R oracle:oinstall /u04
chmod 750 /u04CREATE TABLESPACE <TS_NAME> DATAFILE '/u04/<ts_name>01.dbf' SIZE 100M;결과 해석:
새 파일 시스템은 root 소유로 만들어지므로 oracle 계정이 데이터 파일을 만들 수 있게 소유자를 바꿈
실습 기록: 테이블스페이스가 생성되었습니다
loop 장치 위의 데이터 파일은 재부팅 뒤 장치가 풀리면 열리지 않으므로 실습이 끝나면 테이블스페이스를 지우고 정리함
#새 PV로 VG, LV, 파일시스템 온라인 확장
dd if=/dev/zero of=/lvmdisk2.img bs=1M count=2048
losetup -fP /lvmdisk2.img
fdisk /dev/loop1
partprobe /dev/loop1
pvcreate /dev/loop1p1
vgextend vgdata /dev/loop1p1
vgs
lvextend -l +100%FREE /dev/vgdata/lvdata
lvs
df -h /u04
xfs_growfs /u04
df -h /u04결과 해석:
실습 기록: vgextend 뒤 vgdata 2 1 0 wz--n- <5.00g <2.00g로 PV가 2개, 여유 2GB가 생기고, lvextend 뒤 LSize가 <5.00g가 됨
lvextend까지 해도 df는 이전 크기이며, xfs_growfs 마운트경로로 파일시스템을 늘려야 df가 약 5GB로 바뀜
이 과정 동안 경로는 한 번도 umount되지 않음
lvextend -r을 쓰면 LV와 파일시스템을 한 번에 늘림
수업 자료는 확장 단계의 마운트 경로를 /u01과 /u04로 섞어 적었으며, 같은 LV를 마운트한 경로 하나로 맞춰야 함
같은 loop1p1을 새 VG(vgdata2, /u05)를 만드는 과제에도 다시 쓰는데, 한 PV는 한 VG에만 속하므로 다른 이미지 파일(/lvmdisk3.img)로 새 장치를 만들어 씀
#가상 디스크를 키운 뒤 루트 LV 늘리기 (VirtualBox, Grid 단일 서버)
cd "C:\Program Files\Oracle\VirtualBox"
VBoxManage.exe modifyhd "<VDI 경로>\<이름>.vdi" --resize 122880df -h
lsblk
parted /dev/sda print free
su - oracle -c "srvctl stop database -d <DB_NAME>"
crsctl stop has
yum install -y cloud-utils-growpart
growpart /dev/sda 2
lsblk /dev/sda
pvresize /dev/sda2
vgs
lvextend -r -L +40G /dev/mapper/ol-root
df -h
crsctl start has
su - oracle -c "srvctl start database -d <DB_NAME>"결과 해석:
--resize는 MB 단위라 120GB는 120 × 1024 = 122880임
VM을 끄고, 스냅샷이 있으면 정리한 뒤에 함(스냅샷이 남아 있으면 크기를 바꾸지 못하는 경우가 있음)
부팅 뒤 lsblk의 sda는 120G로 보이지만 df는 그대로이고, parted ... print free에 끝부분 53.7GB가 Free Space로 나옴
growpart /dev/sda 2로 LVM이 든 2번 파티션을 디스크 끝까지 늘리고(CHANGED: partition=2 ...), pvresize로 PV에 알린 뒤 lvextend -r로 루트 LV와 파일시스템을 함께 키움
실습 기록: /가 82G로 늘어남
growpart가 없으면 cloud-utils-growpart 패키지를 설치하며, 파티션이 바로 커져 보이지 않으면 재부팅 뒤 pvresize부터 이어 감
실습은 안전을 위해 DB와 Grid(HAS)를 내린 뒤 했고, 끝나고 다시 올려 asmcmd lsdg로 디스크 그룹을 확인함
ASM 디스크(sdb~`sdf`)는 이 작업과 관계없이 그대로 둠
#사용 조건과 주의사항
LVM 확장은 실습 구성에서 무중단으로 동작했지만, 파일시스템 종류(XFS는 줄이기 불가)와 OS 버전, 스토리지에 따라 절차와 중단 여부가 달라짐
DB 데이터 파일이 있는 볼륨은 확장 중 I/O 지연이 생길 수 있어 작업 시간과 되돌리는 방법을 정하고 함