Rocky Linux 하드 용량이 /home에 몰렸을 때 root(/)로 옮기는 방법
1. 현재 LVM 및 파일 시스템 정보 확인
먼저 볼륨 그룹(VG) 이름과 논리 볼륨(LV) 경로를 확인
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 1.5G 9.1M 1.5G 1% /run
/dev/mapper/rlm-root 70G 2.2G 68G 4% /
/dev/nvme0n1p1 960M 399M 562M 42% /boot
/dev/mapper/rlm-home 945G 6.7G 939G 1% /home
tmpfs 765M 0 765M 0% /run/user/0
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home rlm -wi-ao---- <945.15g
root rlm -wi-ao---- 70.00g
swap rlm -wi-ao---- <7.85g
root 볼륨: /dev/mapper/rlm-root
home 볼륨: /dev/mapper/rlm-home
2. /home 백업 및 마운트 해제
/home 파일 시스템을 줄일 수 없으므로, 내부 데이터를 다른 곳에 임시 복사한 뒤 볼륨을 해제
이때 ssh같은 터미널을 통해 작업시 반드시 바로 root로 접속하여 작업을 진행
root 로그인 (👌)
일반 사용자 로그인 → root 로그인 (❌)
만약 아래 umount 작업시 "umount: /home: target is busy." 오류가 나면서 안되면
fuser -vmu /home 명령어 이용하여 사용중인 프로세스가 있다면 kill 또는 로그아웃 후 진행
[root@localhost ~]# umount /home
umount: /home: target is busy.
### 특정 디렉터리를 사용 중인 프로세스 확인(-v) ###
[root@localhost ~]# fuser -vmu /home
USER PID ACCESS COMMAND
/home: root kernel mount (root)/home
test 2092 ..c.. (test)bash
test 2136 ..c.. (test)bash
c: 현재 디렉터리로 사용 중 (Current directory)
e: 실행 파일로 사용 중 (Executable)
f: 열린 파일로 사용 중 (Open file)
r: 루트 디렉터리로 사용 중 (Root directory)
m: 메모리 맵 파일로 사용 중 (Mmap'ed file or shared library)
### 특정 포트를 사용하는 프로세스 확인(-n) ###
# TCP 8080 포트를 쓰고 있는 프로세스 확인
fuser -v -n tcp 8080
# 축약형으로도 사용 가능
fuser -v 8080/tcp
### 범인 찾아서 바로 강제 종료하기(-k, -i)
# 안전하게 확인하면서 종료(종료하기 전에 물어봄)
fuser -v -ki 8080/tcp
# 묻지 않고 바로 강제 종료(-k)
# 기본적으로 SIGKILL (-9) 신호를 보냄
fuser -vk 8080/tcp
-v (verbose) : 상세한 표 형태로 출력
-m (mount) : 파일 시스템/마운트 포인트 전체 지정
-u (user) : 프로세스 소유자 이름 표시
c : 현재 디렉터리로 사용 중 (Current directory)
e : 실행 파일로 사용 중 (Excutable)
f : 열린 파일로 사용 중 (Open file)
r : 루트 디렉터리로 사용 중 (Root directory)
m : 메모리 맵 파일로 사용 중 (Mmap'ed file or shared library)
[root@localhost ~]# mkdir /root/home_backup
[root@localhost ~]# rsync -avh /home/ ~/home_backup/
sending incremental file list
./
sent 49 bytes received 19 bytes 136.00 bytes/sec
total size is 0 speedup is 0.00
[root@localhost ~]# umount /home
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 1.5G 9.1M 1.5G 1% /run
/dev/mapper/rlm-root 70G 2.2G 68G 4% /
/dev/nvme0n1p1 960M 399M 562M 42% /boot
tmpfs 765M 0 765M 0% /run/user/0
3. 기존 /home 논리 볼륨(LV) 삭제
마운트가 정상적으로 해제되었다면 /home 볼륨을 제거하여 볼륨 그룹(VG)의 여유 공간으로 돌린다.
[root@localhost ~]# lvremove /dev/mapper/rlm-home
Do you really want to remove active logical volume rlm/home? [y/n]: y
Logical volume "home" successfully removed.
4. /home 볼륨 재성성
남은 여유 공간을 활용해 작은 크기의 /home 볼륨을 다시 생성
[root@localhost ~]# lvcreate -L 300G -n home rlm
WARNING: xfs signature detected on /dev/rlm/home at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/rlm/home.
Logical volume "home" created.
[root@localhost ~]# mkfs.xfs /dev/mapper/rlm-home
meta-data=/dev/mapper/rlm-home isize=512 agcount=4, agsize=19660800 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=78643200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=38400, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mount /home
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 1.5G 9.1M 1.5G 1% /run
/dev/mapper/rlm-root 70G 2.2G 68G 4% /
/dev/nvme0n1p1 960M 399M 562M 42% /boot
tmpfs 765M 0 765M 0% /run/user/0
/dev/mapper/rlm-home 300G 2.2G 298G 1% /home
-l (소문자) : PE(Physical Extent) 개수나 100%FREE 같은 비율/개수 단위로 지정할 때 사용
-L (대문자) : M, G, T 같이 직관적인 용량 크기를 지정할 때 사용
-n home : 생성할 논리 볼륨의 이름을 home 으로 지정
rlm : 볼륨 그룹(VG)의 이름
5. 백업 데이터 복구
임시로 옮겨두었던 데이터를 다시 /home 으로 복구
[root@localhost ~]# rsync -avh /root/home_backup/ /home/
sending incremental file list
./
sent 49 bytes received 19 bytes 136.00 bytes/sec
total size is 0 speedup is 0.00
6. root(/) 볼륨 확장
나머지 여유 공간을 전부 root에 몰아준다.
[root@localhost ~]# lvextend -l +100%FREE /dev/mapper/rlm-root
Size of logical volume rlm/root changed from 70.00 GiB (17920 extents) to <715.15 GiB (183078 extents).
Logical volume rlm/root successfully resized.
[root@localhost ~]# xfs_growfs /
meta-data=/dev/mapper/rlm-root isize=512 agcount=4, agsize=4587520 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=18350080, 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 18350080 to 187471872
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 1.5G 9.1M 1.5G 1% /run
/dev/mapper/rlm-root 716G 6.7G 709G 1% /
/dev/nvme0n1p1 960M 399M 562M 42% /boot
tmpfs 765M 0 765M 0% /run/user/0
/dev/mapper/rlm-home 300G 2.2G 298G 1% /home
xfs_growfs : lvextend 명령어로 논리 볼륨 크기를 늘린 후에는, 파일 시스템에도 이 변경 사항을 인식시켜 주는 명령어를 반드시 실행해야 실제로 용량이 늘어난다.
7. 기타
만약 /home을 재생성하지 않고 완전히 제거 했다면 부팅 시 오류가 발생하지 않도록
/etc/fstab 파일을 열고 /home 마운트 관련 설정을 지우거나 주석 처리(#)해야 한다.
(용량을 줄여서 재생성한 경우라면 UUID나 디바이스 경로가 그대로 유지되므로 수정하지 않아도 된다.)
왜 XFS는 줄이는 게 안될까?
리눅스 파일 시스템의 양대 산맥인 Ext4와 XFS를 비교할 때 가장 자주 언급되는 차이점인다.
- Ext4: 확장(Enlarge)과 축소(Shrink) 둘 다 가능
- XFS: 확장(Enlarge)은 가능하나, 축소(Shrink)는 설계 구조상 불가능
Rocky Linux의 기본 파일 시스템인 XFS 파일 시스템은 대용량 파일과 고성능 병렬 처리에 최적화되도록 설계되어있다. 데이터를 저장할때 할당 그룹(Allocation Groups, AG)이라는 단위로 디스크를 쪼개어 관리하는데, 이 AG의 구조와 메타데이터 위치가 파일 시스템이 생성될 때 고정된다.
이미 만들어진 AG를 뒤에서부터 잘라내거나(축소) 메타데이터의 위치를 안전하게 재배치하는 메커니즘이 XFS 소스 코드 레벨에서 구현되어 있지 않기 때문에 축소가 불가능하다. 반대로 확장은 뒤에 새로운 AG를 붙이기만 하면 되므로 쉽다.