LVM Genişletme: Çevrimiçi Disk Boyutu Artırma

Prodüksiyon ortamında disk doluyor ve uygulaman çökmek üzere. Gece yarısı alarm geliyor, SSH’a bağlanıyorsun ve önünde iki seçenek var: ya sunucuyu kapatıp disk ekleyeceksin ya da LVM’in sihirli dünyasına dalacaksın. İşte tam bu noktada LVM’in neden icat edildiğini anlıyorsun. Bu yazıda, çalışan bir sistemi durdurmadan disk alanını nasıl genişleteceğini adım adım anlatacağım. Gerçek senaryolar, gerçek komutlar ve “işte tam burada dikkat et” uyarılarıyla.

LVM Nedir ve Neden Kullanıyoruz

LVM (Logical Volume Manager), Linux’ta disk yönetimini soyutlayan bir katmandır. Geleneksel disk bölümleme yaklaşımında, bir partition oluşturduktan sonra boyutunu değiştirmek ciddi bir iş haline gelir. LVM bu sorunu çözmek için araya girer.

Üç temel kavramı anlamak şart:

  • PV (Physical Volume): Gerçek fiziksel diskler veya partition’lar. /dev/sdb, /dev/sdc gibi.
  • VG (Volume Group): Bir veya daha fazla PV’nin bir araya gelerek oluşturduğu havuz. Buradan alan alırsın.
  • LV (Logical Volume): VG içinden kesilen ve üzerine dosya sistemi kurduğun mantıksal birim. Sistemin /dev/mapper/vg_data-lv_data gibi görür.

Bu katmanlı yapı sayesinde, altta yatan fiziksel diski değiştirirken üstteki uygulamalar hiçbir şey fark etmez. Bir veya birden fazla disk ekleyip mevcut logical volume’ü genişletebilirsin. Hatta RAID benzeri yapılar kurabilirsin ama bugünkü konumuz bu değil.

Senaryo: Veritabanı Sunucusunda Disk Doldu

Diyelim ki PostgreSQL çalıştıran bir sunucun var. /var/lib/postgresql dizini dolmak üzere. VMware veya AWS ortamında çalışıyorsun, hypervisor seviyesinde diski büyüttün ya da yeni bir disk ekledin. Şimdi bu alanı aktif sisteme yansıtman gerekiyor.

Önce mevcut durumu görelim:

# Genel disk durumu
df -hT

# LVM yapısını görmek için
pvs
vgs
lvs

# Daha detaylı bilgi için
pvdisplay
vgdisplay
lvdisplay

Tipik bir çıktı şöyle görünür:

[root@dbserver ~]# vgs
  VG       #PV #LV #SN Attr   VSize   VFree
  vg_data    1   2   0 wz--n- 99.99g  1.00g
  vg_system  1   1   0 wz--n- 49.99g  5.00g

VFree kolonunda 1GB kalmış durumda, bu tehlikeli bir seviye. Hemen aksiyon almak gerekiyor.

Yöntem 1: Mevcut Diski Büyütme (VM veya Bulut Ortamı)

Bu yöntem özellikle sanal makinelerde çok kullanışlıdır. VMware, KVM veya AWS EBS diskini hypervisor/konsol üzerinden büyüttükten sonra Linux’a bu değişikliği yansıtman gerekir.

Adım 1: Kernel’ın Diski Yeniden Tanımasını Sağla

Diski büyüttükten sonra kernel hala eski boyutu görüyor olabilir. Yeniden başlatmadan taramak için:

# Hangi disk üzerinde çalıştığını bul
lsblk

# SCSI diskini yeniden tara (örneğin /dev/sda için)
echo 1 > /sys/class/block/sda/device/rescan

# Veya tüm SCSI host'ları tara
for host in /sys/class/scsi_host/host*/scan; do
    echo "- - -" > $host
done

# Sonucu doğrula
lsblk
fdisk -l /dev/sda

Adım 2: Partition’ı Genişlet

Eğer diskin kendisi büyüdüyse ve üzerinde bir partition varsa, önce partition’ı büyütmen gerekir. growpart kullanmak en temiz yol:

# growpart kurulu değilse
yum install cloud-utils-growpart  # RHEL/CentOS
apt install cloud-guest-utils     # Debian/Ubuntu

# /dev/sda diskindeki 2. partition'ı genişlet
growpart /dev/sda 2

# Sonucu kontrol et
lsblk

Eğer growpart yoksa fdisk veya parted ile manuel yapabilirsin ama bu daha riskli. growpart bunu güvenli şekilde halleder.

Adım 3: PV’yi Genişlet

Partition büyüdükten sonra LVM’e bu değişikliği söylememiz gerekiyor:

# PV'yi mevcut partition'ın tüm boyutuna genişlet
pvresize /dev/sda2

# Doğrula
pvs
pvdisplay /dev/sda2

Bu komut çalışır durumdayken bile sorunsuz çalışır. PV’nin boyutu güncellenir ve VG’ye yeni alan eklenir.

Yöntem 2: Yeni Fiziksel Disk Ekleme

Bazen mevcut diski büyütmek yerine yeni bir disk ekliyorsun. Bu senaryoda adımlar biraz farklı.

# Yeni diski tespit et
lsblk
fdisk -l

# Yeni disk /dev/sdb olarak göründü, PV olarak işaretle
pvcreate /dev/sdb

# Mevcut VG'ye bu PV'yi ekle
vgextend vg_data /dev/sdb

# Durumu kontrol et
vgs
pvs

Çıktıda VFree değerinin arttığını göreceksin. VG artık daha büyük, ama LV henüz büyümedi.

Birden fazla disk ekliyorsan hepsini aynı anda ekleyebilirsin:

# Önce hepsini PV yap
pvcreate /dev/sdb /dev/sdc /dev/sdd

# Tek komutla VG'ye ekle
vgextend vg_data /dev/sdb /dev/sdc /dev/sdd

Logical Volume’ü Genişletme

VG’de yeterli boş alan oluştuktan sonra sıra LV’yi büyütmeye geldi. Burada iki yaklaşım var: sabit boyut eklemek ya da belirli bir boyuta getirmek.

# Mevcut LV boyutuna 10GB ekle
lvextend -L +10G /dev/vg_data/lv_postgresql

# LV'yi belirli bir boyuta getir (örneğin 50GB)
lvextend -L 50G /dev/vg_data/lv_postgresql

# VG'deki tüm boş alanı LV'ye ver
lvextend -l +100%FREE /dev/vg_data/lv_postgresql

# Yüzde olarak genişlet (VG'nin %20'si kadar ekle)
lvextend -l +20%VG /dev/vg_data/lv_postgresql

LV büyüdü ama henüz işimiz bitmedi! Dosya sistemi hala eski boyutu biliyor.

Dosya Sistemini Genişletme

Bu adım kritik ve dosya sistemi türüne göre değişiyor.

ext4 için:

# Çevrimiçi resize (mount edilmişken çalışır)
resize2fs /dev/vg_data/lv_postgresql

# Veya device mapper yolunu kullan
resize2fs /dev/mapper/vg_data-lv_postgresql

# Belirli bir boyuta getirmek için (genellikle gerek yok)
resize2fs /dev/vg_data/lv_postgresql 45G

XFS için:

XFS biraz farklı davranır. Sadece büyüme desteklenir, küçültme yoktur. Mount noktasını kullanman gerekir:

# XFS için mount noktasını kullan
xfs_growfs /var/lib/postgresql

# Veya device ile
xfs_growfs /dev/vg_data/lv_postgresql

Hepsini Tek Komutla: lvresize -r

Bu çok işe yarar bir kısayol, hem LV’yi büyütür hem de dosya sistemini resize eder:

# -r veya --resizefs bayrağı ile her ikisini birden yap
lvresize -r -L +10G /dev/vg_data/lv_postgresql

# Tüm boş alanı kullan ve dosya sistemini de genişlet
lvresize -r -l +100%FREE /dev/vg_data/lv_postgresql

Bu komutu seviyorum çünkü iki adımı birleştiriyor ve hem ext4 hem XFS’i otomatik algılıyor. Prodüksiyonda zaman baskısı altındayken tek komutla halletmek çok değerli.

Doğrulama: Her Şey Yolunda mı?

İşlem sonrasında mutlaka doğrulama yapmalısın:

# Dosya sistemi boyutunu kontrol et
df -hT /var/lib/postgresql

# LVM yapısını kontrol et
lvs -o +devices
pvs
vgs

# Detaylı bilgi
lvdisplay /dev/vg_data/lv_postgresql

# Dosya sistemi bütünlüğü (unmount gerektirmez, sadece bilgi verir)
dumpe2fs -h /dev/vg_data/lv_postgresql | grep -i "block count"

Başarılı bir genişletme sonrası df -h çıktısında yeni boyutu görmelisin:

[root@dbserver ~]# df -hT /var/lib/postgresql
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_postgresql ext4   49G   38G   9G   81% /var/lib/postgresql

Gerçek Dünya Senaryosu: AWS EC2 EBS Genişletme

AWS üzerinde çalışıyorsun diyelim. EBS volume’ü AWS Console veya CLI ile büyüttükten sonra şunları yapman gerekiyor:

# 1. Disk durumunu kontrol et
lsblk
# Çıktıda nvme0n1 veya xvda gibi bir disk göreceksin

# 2. Partition'ı büyüt (AWS'de genellikle nvme0n1p1 gibi)
growpart /dev/nvme0n1 1

# 3. LVM PV'yi yeniden boyutlandır
pvresize /dev/nvme0n1p1

# 4. LV'yi ve dosya sistemini genişlet
lvresize -r -l +100%FREE /dev/rootvg/rootlv

# 5. Doğrula
df -hT /

Amazon Linux 2 ve RHEL AMI’larında root volume genişletmek için bu akış standart hale geldi. Özellikle uygulamanı kapatmadan yapabilmek büyük avantaj.

Snapshot ile Güvenli Genişletme

Prodüksiyon ortamında kritik veriler varsa, genişletme öncesi snapshot almak iyi bir alışkanlık:

# Snapshot oluştur (VG'de boş alan olması gerekir)
lvcreate -L 5G -s -n lv_postgresql_snap /dev/vg_data/lv_postgresql

# Snapshot durumunu kontrol et
lvs -a

# İşlem başarılıysa snapshot'ı sil
lvremove /dev/vg_data/lv_postgresql_snap

# Bir şeyler ters gittiyse geri al
lvconvert --merge /dev/vg_data/lv_postgresql_snap

Snapshot’ın boyutunu, genişletme sürecinde dosya sisteminde yapılacak değişiklikleri kapsayacak şekilde belirlemelisin. Snapshot dolduğunda geçersiz hale gelir.

Sık Karşılaşılan Hatalar ve Çözümleri

“Insufficient free space” Hatası

[root@server ~]# lvextend -L +10G /dev/vg_data/lv_data
  Insufficient free space: 2560 extents needed, but only 256 available

VG’de yeterli alan yok. Önce vgs ile kontrol et, gerekirse yeni disk ekle.

“Can’t deactivate volume group” Hatası

Root partition’ı genişletmeye çalışırken bu hatayı alabilirsin. Root çevrimiçiyken LV’yi deaktive edemezsin, ama büyütebilirsin. lvresize -r komutunu doğrudan kullan.

XFS Küçültme Denemesi

# BU HATA VERECEK
lvresize -r -L 20G /dev/vg_data/lv_data
  # fsadm: XFS filesystem shrinking is not supported.

XFS küçültülemez. Küçültmek zorundaysan verini backup alıp yeni LV oluşturmak zorundasın.

resize2fs “bad magic number” Hatası

Bu genellikle dosya sistemi türü uyuşmazlığından kaynaklanır. XFS için resize2fs kullanmaya çalışıyorsundur. blkid ile dosya sistemi türünü kontrol et:

blkid /dev/vg_data/lv_data

Thin Provisioning ile Dinamik Yönetim

Çok sayıda LV yönetiyorsan thin provisioning ilginç bir alternatif. Gerçek alan kullanıma göre allocate edilir:

# Thin pool oluştur
lvcreate -L 80G --thinpool tp_pool vg_data

# Thin volume oluştur (100GB gösterir ama fiziksel alan ayırmaz)
lvcreate -V 100G --thin -n lv_app vg_data/tp_pool

# Durumu izle
lvs -a vg_data

Bu yaklaşım dikkatli izleme gerektirir. Pool dolarsa tüm thin volume’ler sorun yaşar. Monitoring’i mutlaka kur.

İzleme ve Proaktif Yaklaşım

Disk dolmadan önce uyarı almak için basit bir script:

#!/bin/bash
# /usr/local/bin/lvm_monitor.sh

THRESHOLD=85
ALERT_EMAIL="[email protected]"

while IFS= read -r line; do
    LV=$(echo "$line" | awk '{print $1}')
    VG=$(echo "$line" | awk '{print $2}')
    PERCENT=$(echo "$line" | awk '{print $5}' | tr -d '%')
    
    if [ -n "$PERCENT" ] && [ "$PERCENT" -ge "$THRESHOLD" ]; then
        echo "UYARI: $VG/$LV doluluk orani: %$PERCENT" | 
        mail -s "[ALARM] LVM Disk Dolulugu" "$ALERT_EMAIL"
    fi
done < <(lvs --noheadings -o lv_name,vg_name,lv_size,lv_used,data_percent 2>/dev/null | grep -v "^$")

Bunu cron’a ekle:

# Her 15 dakikada bir kontrol et
*/15 * * * * /usr/local/bin/lvm_monitor.sh

Prometheus kullananlar için node_exporter ile LVM metrikleri otomatik toplanır. Grafana’da node_filesystem_avail_bytes metriğiyle threshold alert kurabilirsin.

Tüm Süreci Özetleyen Komut Akışı

Hızlı referans olarak, yeni disk ekleme senaryosunun tam akışı:

# 1. Yeni diski PV yap
pvcreate /dev/sdb

# 2. VG'ye ekle
vgextend vg_data /dev/sdb

# 3. LV'yi genişlet ve dosya sistemini resize et
lvresize -r -l +100%FREE /dev/vg_data/lv_postgresql

# 4. Doğrula
df -hT /var/lib/postgresql
lvs
vgs

Dört komut, sıfır downtime, iş tamamdır.

Sonuç

LVM, Linux disk yönetiminin en güçlü araçlarından biri. Çevrimiçi genişletme özelliği sayesinde prodüksiyon ortamlarında disk sorunlarını hizmet kesintisi olmadan çözebiliyorsun. Ancak güç, sorumluluk gerektirir.

Akılda tutulması gerekenler:

  • Snapshot al, sonra genişlet. Kritik veriler için bu zorunlu bir alışkanlık olmalı.
  • lvresize -r komutunu tercih et. Hem LV hem de dosya sistemi aynı anda büyür, insan hatası riski azalır.
  • XFS küçültülemez, ext4 küçültülebilir. Hangi dosya sistemini kullandığını her zaman bil.
  • VFree değerini izle. %85 dolulukta uyarı almalı, %95’te panik yapmadan müdahale edebilmelisin.
  • Thin provisioning cazip görünür ama titiz izleme gerektirmediği zaman tuzak haline gelir.

Gece yarısı alarm almak yerine proaktif izleme kurmak, iyi bir sysadmin’i ortalama birinden ayıran şeydir. LVM bu araçları sana veriyor, kullanmak sende.

Yorum yapın