LVM - thinpool 쓰기 불가 해결하기
분류: home-server
오류 증상 확인
thinpool이 읽기만 가능하며, 쓰기 시도 시 오류가 발상하여 불가한 상태
root@pve:~# lvs
LV VG Attr LSize Pool Origin Data% Meta%
raid_thinpool hdd_vg twi-cotzM- 21.00t 47.70 0.37
vm-121-disk-0 hdd_vg Vwi-aotz-- 20.00t raid_thinpool 50.09
data pve twi-aotz-- 1.00t 28.62 1.64
root pve -wi-ao---- 96.00g
swap pve -wi-ao---- 8.00g
vm-121-disk-0 pve Vwi-aotz-- 20.00g data 43.96
vm-122-disk-0 pve Vwi-aotz-- 32.00g data 100.00
thinpool의 attr 정보에 c (thinpool check needed), M (metadata read only) 값이 확인된다. 즉 metadata data only로 인해 신규 블록 할당이 불가한 상태이다.
root@pve:~# dmesg
[ 518.928072] device-mapper: thin: Data device (dm-5) discard unsupported: Disabling discard passdown.
[ 518.928129] device-mapper: thin: 253:14: unable to switch pool to write mode until repaired.
[ 518.928151] device-mapper: thin: 253:14: switching pool to read-only mode
[ 518.928152] device-mapper: thin: 253:14: unable to grow the data device until repaired.
커널 메시지에 pool 을 수리하기 전까지 read only 모드로 전환한다는 내용이 있다.
lvs 의 결과에서 thinpool의 Meta% 사용도가 100%에 가깝다면 메타데이터 크기를 키워서 해결할 수 있다.
단 메타데이터 사이즈는 약 15.8G 를 초과할 수 없다. 증가 시키기전에 현재 사이즈를 확인해야 한다.
root@pve:~# lvs -a
LV VG Attr LSize Pool Origin Data% Meta%
raid_thinpool hdd_vg twi-cotzM- 21.00t 47.70 100
[raid_thinpool_tdata] hdd_vg Twi-ao---- 21.00t
[raid_thinpool_tmeta] hdd_vg ewi-ao---- 15.50g
raid_thinpool_tmeta 크기가 15.5g 이기 때문에 크기를 키울 수 없지만, 보통 더 작은 크기이며 아래 명령어를 키울 수 있다.
lvextend --poolmetadatasize +2G hdd_vg/raid_thinpool
실수로 메타데이터 크기를 16g 이상 키운 경우 thinpool 을 사용할 수 없게 된다. 신규 메타데이터 볼륨을 만들고 교환하여 해결할 수 있다.
실행 전 해당 thinpool의 볼륨을 활용하는 모든 vm 을 중지하고, pve 화면의 스토리지에서도 비활성화해야 한다.
# 기존 메타데이터의 블록매핑정보를 저장한다.
thin_dump /dev/mapper/hdd_vg-raid_thinpool_tmeta > meta
# 원하는 크기의 교체용 메타데이터를 생성한다.
lvcreate -n raid_thinpool_meta1 -L 15G hdd_vg
# 신규 메타데이터 볼륨에 매핑 정보를 복원한다.
thin_restore -i meta -o /dev/mapper/hdd_vg-raid_thinpool_meta1
# 신규 메타데이터 볼륨으로 교체한다. (기존 메타데이터와 신규 볼륨이 서로 교체된다.)
lvconvert --thinpool hdd_vg/raid_thinpool --poolmetadata hdd_vg/raid_thinpool_meta1
# thinpool 을 활성화 한다.
lvchange -ay hdd_vg/raid_thinpool
# 이상이 없다면 교체된 이전 메타데이터 볼륨을 삭제한다.
lvremove hdd_vg/raid_thinpool_meta1
lvconvert –repair 통한 복구 시도
LVM 기본 복구 기능을 통해 복구를 시도한다.
lvconvert --repair hdd_vg/raid_thinpool
실행 후에도 정상화 되지 않고 lvs -a
의 결과에서 tmeta 볼륨이 16G 이상으로 증가 되었다면 상단의 thin_dump~lvremove 명령어를 통해 16G 이하 볼륨을 생성하여 교체해준다.
오류 플래그 강제 수정하기
이 방법은 더 이상 시도해 볼 방법이 검색되지 않아 시도한 방법으로, 데이터 손실의 위험을 감수하고 수행해야 한다.
상단의 thin_dump 를 수행하여 생성된 meta 파일을 직접 수정 후 복원하여 정상 인식을 기대해 본다.
<superblock uuid="" time="0" transaction="1" flags="1" version="2" data_block_size="16384" nr_data_blocks="2621440">
flags=”1” 로 되어있다면 1을 0으로 수정 후에 저장한다. 해당 플래그 값으로 인해 c (thinpool check needed) 로 인식되는 것으로 추정된다.
그 후 lvcreate, thin_restore ~~ lvremove 까지의 단계를 동일하게 수행해 준다.
정상으로 돌아온 경우
root@pve:~# lvs
LV VG Attr LSize Pool Origin Data% Meta%
raid_thinpool hdd_vg twi-aotz-- 21.00t 48.45 0.37
raid_thinpool_meta0 hdd_vg -wi-a----- 160.00m
raid_thinpool_meta1 hdd_vg -wi-a----- 15.00g
vm-121-disk-0 hdd_vg Vwi-aotz-- 20.00t raid_thinpool 50.09
data pve twi-aotz-- 1.00t 28.62 1.64
root pve -wi-ao---- 96.00g
swap pve -wi-ao---- 8.00g
vm-121-disk-0 pve Vwi-aotz-- 20.00g data 43.96
vm-122-disk-0 pve Vwi-aotz-- 32.00g data 100.00
root@pve:~#
thinpool의 attr 정보에 c (thinpool check needed), M (metadata read only) 값이 사라졌으며, a (active) 상태가 되어 정상적으로 쓰기가 가능해졌다.