Proxmox VE: ZFS 8k ZVOL 생성 및 PostgreSQL용 VM 디스크 할당 방법
XFS 파일시스템으로 구성된 디스크에서 PostgreSQL 데이터를 관리할 때, 기존 XFS의 블록 크기(16k)와 PostgreSQL의 블록 크기(8k)가 불일치하는 문제가 있습니다. 이를 해결하고 읽기/쓰기 성능을 향상하기 위해, 8k 블록 크기의 zvol을 생성하여 VM에 추가하는 절차를 알아보겠습니다.
아래와 같은 환경입니다.
- zfs 파일시스템 이름: xfs1

- VM id: 105
- VM-105를 정지시킵니다.
$ qm stop 105
- zfs파일시스템의 Pool을 확입니다. zfs1에 생성된 디스크를 rpool 위치로 재생성할 예정입니다.
$ zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT rpool 370G 22.6G 347G - - 6% 6% 1.00x ONLINE - zfs1 1.81T 62.1G 1.75T - - 23% 3% 1.00x ONLINE -
- 기존 디스크 “vm-105-disk-1″를 분리/삭제합니다.
$ zfs list | grep vm-105 zfs1/vm-105-disk-0 3.65G 1.58T 3.65G - zfs1/vm-105-disk-1 56K 1.58T 56K - $ qm set 105 --delete scsi1 $ qm config 105 | grep unused # unused0 확인 $ qm disk unlink 105 --idlist unused0 # 실제 zvol 제거 $ zfs list | grep vm-105 # vm-105-disk-1이 사라졌는지 확인 zfs1/vm-105-disk-0 3.65G 1.58T 3.65G -
- 8K zvol 직접 생성합니다.
rpool/는 Proxmox 호스트 OS가 설치/사용하는 디렉토리입니다. Proxmox 호스트 OS를 설치한 물리 디스크가 SSD라 선택했습니다.# rpool/data 위치에 vm-105-disk-1 디스크를 생성 $ zfs create -V 120G -b 8K -s -o compression=lz4 rpool/data/vm-105-disk-1 # 8K / lz4 확인 $ zfs get volblocksize,compression rpool/data/vm-105-disk-1 NAME PROPERTY VALUE SOURCE rpool/data/vm-105-disk-1 volblocksize 8K - rpool/data/vm-105-disk-1 compression lz4 local
- 생성한 zvol을 VM-105에 부착하고 결과를 확인합니다.
$ qm set 105 --scsihw virtio-scsi-single $ qm set 105 --scsi1 local-zfs:vm-105-disk-1,iothread=1,discard=on,ssd=1,cache=none update VM 105: -scsi1 local-zfs:vm-105-disk-1,iothread=1,discard=on,ssd=1,cache=none $ zfs list | grep vm-105 rpool/data/vm-105-disk-1 56K 336G 56K - zfs1/vm-105-disk-0 3.65G 1.58T 3.65G -
- VM-105를 재기동하고, 설정값을 확인합니다.
$ qm start 105 $ qm config 105 | grep scsi1 scsi1: local-zfs:vm-105-disk-1,cache=none,discard=on,iothread=1,size=120G,ssd=1
- VM-105에 접속하여 xfs 파일시스템을 구성합니다.
# SSD드라이브의 쓰기 성능 저하를 방지하고 수명을 연장하기 위해 주기적인 TRIM 작업을 자동화 $ systemctl enable --now fstrim.timer # sdb → ROTA=0, PHY-SEC=512 확인 $ lsblk -o NAME,ROTA,PHY-SEC # 비어 있는지 먼저 확인 $ lsblk -f /dev/sdb && blkid /dev/sdb NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS sdb # xfs 파일시스템 생성 $ mkfs.xfs -f -s size=4096 -d su=8k,sw=1 /dev/sdb meta-data=/dev/sdb isize=512 agcount=16, agsize=1966080 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 nrext64=0 data = bsize=4096 blocks=31457280, imaxpct=25 = sunit=2 swidth=2 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=16384, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Discarding blocks...Done. # sectsz=4096 확인 $ xfs_info /dev/sdb | grep -E 'sectsz|bsize|sunit|swidth' = sectsz=4096 attr=2, projid32bit=1 data = bsize=4096 blocks=31457280, imaxpct=25 = sunit=2 swidth=2 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=16384, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 # PostgreSQL 데이터가 저장되는 /var/lib/pgsql 디렉토리에 파일시스템 마운팅 $ lsblk -f /dev/sdb NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS sdb xfs eb317d41-097e-4c39-ac8f-57ce3bbca41c $ UUID=$(blkid -s UUID -o value /dev/sdb) $ echo "UUID=$UUID /var/lib/pgsql xfs defaults,noatime,logbsize=256k 0 0" | tee -a /etc/fstab UUID=eb317d41-097e-4c39-ac8f-57ce3bbca41c /var/lib/pgsql xfs defaults,noatime,logbsize=256k 0 0 $ mkdir -p /var/lib/pgsql && sudo mount -a $ lsblk -f /dev/sdb NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS sdb xfs eb317d41-097e-4c39-ac8f-57ce3bbca41c 119.1G 1% /var/lib/pgsql
