운영체제/리눅스

Rocky Linux 하드 용량이 /home에 몰렸을 때 root(/)로 옮기는 방법

안드레날린 2026. 6. 25. 16:15

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를 붙이기만 하면 되므로 쉽다.