카테고리 보관물: Common

리눅스 VM Disk 증설 후 Partition 확장 및 LV 확장

개요

VMware, KVM 등 리눅스 VM Disk 증설 후 OS에서 파티션과 논리 볼륨(LV)을 확장하지 않으면 실제 파일시스템에서 늘어난 용량을 사용할 수 없습니다. Ubuntu LVM 환경에서는 hypervisor에서 디스크를 확장한 뒤 parted로 파티션을 늘리고, pvresizelvextendresize2fs 순서로 실제 마운트 포인트까지 용량을 반영해야 합니다. 이 글에서는 VM 디스크 16G → 30G 증설 후 전체 확장 절차를 단계별로 정리합니다.

LVM 기반 디스크 확장 절차 이해

Ubuntu Server의 기본 설치는 LVM(Logical Volume Manager) 구조를 사용합니다. 하이퍼바이저(VMware, KVM 등)에서 VM 디스크 크기를 늘려도 OS는 즉시 인식하지 못합니다. LVM 환경에서는 물리 디스크 → 파티션 → Physical Volume → Volume Group → Logical Volume → 파일시스템의 순서로 각 계층을 순차적으로 확장해야 합니다.

구체적인 확장 순서는 다음과 같습니다: parted로 파티션을 디스크 끝까지 확장 → pvresize로 Physical Volume이 새 파티션 크기를 인식 → lvextend로 Logical Volume에 여유 공간 추가 → resize2fs로 파일시스템이 새 LV 크기를 인식. 이 절차는 온라인 상태(마운트 해제 없이)에서 진행 가능하여 서비스 중단 없이 디스크를 확장할 수 있습니다.

0단계 — 파일시스템 현재 상태 확인

@:~$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              794M   14M  781M   2% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  9.8G  8.2G  1.1G  89% /
tmpfs                              3.9G   84K  3.9G   1% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          1.7G  242M  1.4G  15% /boot
tmpfs                              794M  4.0K  794M   1% /run/user/1000

1단계 — VM 디스크 증설 후 lsblk 확인

VM의 디스크를 16G에서 30G로 증설하면 lsblk에서 sda는 30G로 표시되지만, 실제 파티션 sda3와 LV는 아직 이전 크기(14.2G)를 유지합니다.

@:~$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0  63.4M  1 loop /snap/core20/1974
loop1                       7:1    0  63.7M  1 loop /snap/core20/2434
loop2                       7:2    0 111.9M  1 loop /snap/lxd/24322
loop3                       7:3    0  89.4M  1 loop /snap/lxd/31333
loop4                       7:4    0  53.3M  1 loop /snap/snapd/19457
loop5                       7:5    0  44.3M  1 loop /snap/snapd/23258
sda                         8:0    0    30G  0 disk
├─sda1                      8:1    0     1M  0 part
├─sda2                      8:2    0   1.8G  0 part /boot
└─sda3                      8:3    0  14.2G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0    10G  0 lvm  /
sdb                         8:16   0    50G  0 disk
sr0                        11:0    1  1024M  0 rom

2단계 — parted로 파티션 확장

@:~$ sudo parted
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 32.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  1881MB  1879MB  ext4
 3      1881MB  17.2GB  15.3GB

(parted) resizepart 3
End?  [17.2GB]? 32.2GB
(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 32.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  1881MB  1879MB  ext4
 3      1881MB  32.2GB  30.3GB

(parted) q
Information: You may need to update /etc/fstab.

3단계 — 파티션 확장 확인

@:~$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0  63.4M  1 loop /snap/core20/1974
loop1                       7:1    0  63.7M  1 loop /snap/core20/2434
loop2                       7:2    0 111.9M  1 loop /snap/lxd/24322
loop3                       7:3    0  89.4M  1 loop /snap/lxd/31333
loop4                       7:4    0  53.3M  1 loop /snap/snapd/19457
loop5                       7:5    0  44.3M  1 loop /snap/snapd/23258
sda                         8:0    0    30G  0 disk
├─sda1                      8:1    0     1M  0 part
├─sda2                      8:2    0   1.8G  0 part /boot
└─sda3                      8:3    0  28.2G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0    10G  0 lvm  /
sdb                         8:16   0    50G  0 disk
sr0                        11:0    1  1024M  0 rom

3단계 결과 확인 후 주의사항

lsblk에서 sda3 크기가 28.2G로 늘어난 것을 확인했지만, LVM은 아직 이전 크기를 기억하고 있습니다. pvdisplay 실행 시 PV Size: <14.25 GiB로 표시됩니다. 이는 PV 메타데이터가 파티션 확장 사실을 모르기 때문입니다. pvresize 명령으로 PV 메타데이터를 갱신해야 VG에 여유 공간이 생깁니다.

4단계 — Physical Volume 확장 (pvresize)

@:~$ sudo pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               ubuntu-vg
  PV Size               <14.25 GiB / not usable 0
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              3647
  Free PE               1087
  Allocated PE          2560
  PV UUID               O2p8iY-2Jpm-WNGJ-viUf-nIt6-iw0x-rVgXAo

@:~$ sudo pvscan
  PV /dev/sda3   VG ubuntu-vg       lvm2 [<14.25 GiB / <4.25 GiB free]
  Total: 1 [<14.25 GiB] / in use: 1 [<14.25 GiB] / in no VG: 0 [0   ]

@:~$ sudo pvresize /dev/sda3
  Physical volume "/dev/sda3" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
@:~$ sudo pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               ubuntu-vg
  PV Size               <28.24 GiB / not usable 1.31 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              7228
  Free PE               4668
  Allocated PE          2560
  PV UUID               O2p8iY-2Jpm-WNGJ-viUf-nIt6-iw0x-rVgXAo

5단계 — Logical Volume 확장 (lvextend)

@:~$ sudo vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               28.23 GiB
  PE Size               4.00 MiB
  Total PE              7228
  Alloc PE / Size       2560 / 10.00 GiB
  Free  PE / Size       4668 / 18.23 GiB
  VG UUID               aUI3qM-tbml-FpOz-ccxw-1yk3-4hCo-a35uCK

@:~$ sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                gFcvA9-fkuH-rNy8-wVka-93Th-r8X0-FB8giN
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2023-12-05 01:04:17 +0000
  LV Status              available
  # open                 1
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

@:~$ sudo lvextend -l +100%FREE -n /dev/ubuntu-vg/ubuntu-lv
  Size of logical volume ubuntu-vg/ubuntu-lv changed from 10.00 GiB (2560 extents) to 28.23 GiB (7228 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.
@:~$ sudo vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               28.23 GiB
  PE Size               4.00 MiB
  Total PE              7228
  Alloc PE / Size       7228 / 28.23 GiB
  Free  PE / Size       0 / 0
  VG UUID               aUI3qM-tbml-FpOz-ccxw-1yk3-4hCo-a35uCK

@:~$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0  63.4M  1 loop /snap/core20/1974
loop1                       7:1    0  63.7M  1 loop /snap/core20/2434
loop2                       7:2    0 111.9M  1 loop /snap/lxd/24322
loop3                       7:3    0  89.4M  1 loop /snap/lxd/31333
loop4                       7:4    0  53.3M  1 loop /snap/snapd/19457
loop5                       7:5    0  44.3M  1 loop /snap/snapd/23258
sda                         8:0    0    30G  0 disk
├─sda1                      8:1    0     1M  0 part
├─sda2                      8:2    0   1.8G  0 part /boot
└─sda3                      8:3    0  28.2G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0  28.2G  0 lvm  /
sdb                         8:16   0    50G  0 disk
sr0                        11:0    1  1024M  0 rom

6단계 — 파일시스템 확장 및 확인 (resize2fs)

@:~$ sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 7401472 (4k) blocks long.

@:~$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              794M   14M  781M   2% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   28G  8.2G   19G  31% /
tmpfs                              3.9G   84K  3.9G   1% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          1.7G  242M  1.4G  15% /boot
tmpfs                              794M  4.0K  794M   1% /run/user/1000

XFS 파일시스템 환경에서의 차이

위 절차는 ext4 파일시스템 기준입니다. RHEL/Rocky Linux의 기본 파일시스템인 XFS를 사용하는 경우 마지막 단계의 resize2fs 대신 xfs_growfs /를 사용합니다. XFS는 ext4와 달리 마운트된 상태에서만 확장 가능하므로 마운트 해제 후에는 확장할 수 없습니다. LVM과 parted를 이용한 파티션 확장 절차(1~5단계)는 동일하고 마지막 파일시스템 확장 명령만 다릅니다.

또한 lvextend -r 옵션을 사용하면 lvextend와 파일시스템 확장(resize2fs 또는 xfs_growfs)을 한 번에 처리할 수 있습니다. 단, 이 옵션은 파일시스템 타입을 자동 감지하므로 마운트된 상태에서만 정상 동작합니다.

참고

관련 포스트:

참고 문서: parted(8) man page · lvextend(8) man page

vi editor 텍스트 밀림 현상

개요

Unix / Linux 환경에서 vi editor 텍스트 밀림 현상은 OS 언어 설정이 한글인 환경에서 자주 발생합니다. SSH 클라이언트의 인코딩 설정과 서버의 LANG 환경변수가 불일치할 때 vi로 파일을 편집하면 한글이 깨지거나 입력한 텍스트가 밀려서 표시됩니다. 이 글에서는 원인 분석과 해결 방법, 재발 방지 설정을 정리합니다.

증상

vi editor 실행 중 아래와 같은 현상이 나타납니다.

  • 한글 입력 시 글자가 밀려서 표시되거나 커서 위치가 어긋남
  • 화면이 깨져 기존 내용이 뭉개져 보임
  • 특정 계정에서만 발생하고 다른 계정에서는 정상 동작
  • 스크립트 파일 편집 시 들여쓰기가 흐트러짐

원인

주요 원인은 SSH 터미널의 인코딩 설정과 서버 LANG 환경변수의 불일치입니다. OS를 한글로 설치하면 LANG=ko_KR.UTF-8로 설정되는데, SSH 클라이언트(PuTTY, MobaXterm, SecureCRT 등)의 문자 집합이 UTF-8이 아닌 경우 vi가 멀티바이트 문자를 잘못 처리하여 텍스트 밀림이 발생합니다. 간헐적으로는 홈 디렉토리의 환경설정 파일(.bashrc, .bash_profile)이 누락된 경우에도 동일한 현상이 발생할 수 있습니다.

# 현재 서버 로케일 확인
$ locale
LANG=ko_KR.UTF-8
LC_CTYPE="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_ALL=

해결 방법 1 — SSH 터미널 인코딩 설정 변경

SSH 클라이언트의 Character encoding(문자 집합) 설정을 서버 LANG과 일치하도록 변경합니다. 현재 설정이 Default이면 UTF-8로, UTF-8이면 Default로 변경하여 재연결합니다.

  • PuTTY: Configuration → Window → Translation → Remote character set
  • MobaXterm: Settings → Terminal → Default character set
  • SecureCRT: Session Options → Terminal → Emulation → Character Encoding

설정 변경 후 SSH 세션을 재연결하여 vi를 실행하면 대부분의 경우 정상 동작합니다.

해결 방법 2 — TERM 환경변수 설정

터미널 인코딩 변경 후에도 화면이 깨지는 현상이 남아 있다면 TERM 환경변수를 vt100으로 변경한 뒤 vi를 실행합니다.

# 현재 세션에만 적용 (임시)
$ export TERM=vt100
$ vi <파일명>

# 영구 적용 — .bashrc 또는 .bash_profile에 추가
$ echo 'export TERM=vt100' >> ~/.bashrc
$ source ~/.bashrc

재발 방지 — .vimrc 인코딩 설정

사전에 ~/.vimrc에 인코딩을 명시해 두면 SSH 클라이언트 설정과 무관하게 vi가 항상 UTF-8로 동작하므로 vi editor 텍스트 밀림 현상을 예방할 수 있습니다.

" ~/.vimrc
set encoding=utf-8
set fileencodings=utf-8,euc-kr,cp949
set termencoding=utf-8

파일이 없는 경우 vi ~/.vimrc로 새로 생성합니다. 저장 후 vi를 재실행하면 설정이 적용됩니다.

참고

관련 포스트:

참고 문서: Vim encoding 옵션 공식 문서 · Linux locale(7) man page

vi editor

개요

vi editor 명령어는 Unix / Linux 시스템 관리자가 반드시 숙지해야 하는 기본 텍스트 편집기 조작법입니다. vi는 모든 Linux/Unix 배포판에 기본 포함되어 있어 GUI가 없는 서버 환경에서도 파일 편집이 가능하며, Command Mode / Insert Mode / Last Line Mode 세 가지 모드로 동작합니다. 각 모드의 전환 방법과 커서 이동, 삭제, 복사, 검색·치환 명령어를 정리합니다.

What is vi?

  • Unix 계열에서 사용되는 text 편집기
  • 최근의 Redhat 계열 Linux에서는 vim을 vi로 alias 처리(vim 패키지 미설치시 미적용)
  • UNIX와 Linux의 Terminal CLI 환경에서는 가장 기본적인 편집기이기 때문에 기본적인 사용키 정도는 익혀두는 것이 좋습니다.

3 modes of vi

  • Command Mode(명령) : esc 입력 상태, 기본값
  • Insert Mode(입력) : 편집 상태
  • Last Line Mode(명령) : Command Mode상 : “shift + ;” 입력 상태, 파일 또는 vi 상태 제어

Commande Mode Control

Input Function
h 왼쪽 이동
j 위로 이동
k 아래로 이동
l 오른쪽 이동
^ or 0 행의 가장 처음으로 이동
$ 행의 가장 끝으로 이동
gg 제일 첫 행으로 이동
G 제일 끝 행으로 이동
b 왼쪽 특수문자 혹은 한단어의 처음으로 이동
B 왼쪽 한단어의 처음으로 이동
x 현재 커서 위치 삭제
X 현재 커서가 위치한 앞 글자 삭제
dw 현재 커서 위치 한단어 삭제
d$ 현재 커서 위치 행 삭제
dd 현재 커서부터 마지막 행까지 삭제
CTRL+b 한페이지 위로 이동
CTRL+f 한 페이지 아래로 이동
숫자+G 해당 숫자의 행으로 이동
w 오른쪽 특수문자 혹은 한단어의 처음으로 이동
W 오른쪽 한단어의 처음으로 이동
i 현재 커서 앞쪽에 입력
I 현재 커서 행의 맨 앞에서 입력
a 현재 커서 뒤쪽에 입력
A 현재 커서 행의 마지막에 입력
o 현재 커서 행의 아래 줄에 입력
O 현재 커서 행의 위쪽 줄에 입력현재 커서 행의 위쪽 줄에 입력
s 현재 커서의 한 글자를 지우고 입력
S 현재 커서의 행을 지우고 입력
r 현재 커서의 한 글자를 교체
cw 현재 커서의 한 단어 교체
u Undo(입력시 마다 이전 작업으로 이동)
숫자+yy 현재 커서부터 숫자만큼의 행을 복사(1은 생략 가능)
yw 현재 커서의 한 단어 복사
Y$ 현재 커서부터 마지막 행까지 복사
숫자+p 복사한 내용을 현재 커서 다음에 붙여넣기(숫자 횟수 만큼)
숫자+P 복사한 내용을 현재 커서 전에 붙여넣기(숫자 횟수 만큼)
/ 커서의 위치에서 아래로 검색
? 커서의 위치에서 위로 검색
n 검색 결과에서 아래 행 이동
N 검색 결과에서 위 행 이동
모든 제어는 커서의 위치 기준

Insert Mode Control

  • i, a등의 Command Mode 제어키를 통해 입력 모드로 전환
  • 문서의 작성 또는 편집이 가능한 상태

Last Line Mode Control

Input Function
:s/찾는문자열/치환문자열 현재 커서 행에서 검색, 치환
:1,10s/찾는문자열/치환문자열 1행에서 10행까지 검색, 치환
:%s/찾는문자열/치환문자열 전체 행에서 검색, 치환
\+/ 특수문자를 검색하려면 해석방지를 위해 그 앞에 \를입력
:nohl 검색등을 통해 하이라이트(Highlight)처리된 블럭을 해제
:set number 행 번호 표시
:set nonumber 행 번호 표시 취소
:set autoindent 들여쓰기 설정
:set noautoindent 들여쓰기 제거
:set list 문단,조판부호 보기
:set nolist 문단,조판부호 안보이게
:set ignorecase 검색시 대소문자 구별 제거
:set noignorecase 검색시 대소문자 구별
:set window=30 한 화면당 행의 갯수 30개로 지정
:set all 현재 설정된 vi 모든 설정값 보기
:q 저장하지 않고 vi 종료
:q! 읽기전용인 파일을 수정후 강제로 저장할때
:w 현재내용을 저장
:w! 읽기전용인 파일을 수정후 강제로 저장할때
:wq 저장하고 종료
:wq! 읽기전용인 파일을 수정후 강제로 저장하고 종료하기
:w “filename” 새로운 파일명으로 저장
모든 제어는 커서의 위치 기준

참고

참고 문서: Vim 공식 사용자 매뉴얼 — 처음 파일 편집하기 · vi(1) POSIX man page