Sunucu kurulumlarında en sık karşılaşılan sorunlardan biri disk yönetimini yanlış planlamaktır. Yıllar önce bir müşterimin sunucusunda /var bölümü doldu ve tüm uygulama çöktü. Oysa LVM kullansaydık, birkaç komutla sorunu çözebilirdik. Bu yazıda Debian üzerinde LVM kurulumunu, disk yönetimini ve gerçek dünya senaryolarını adım adım ele alacağız.
LVM Nedir ve Neden Kullanmalısınız?
LVM (Logical Volume Manager), fiziksel diskler üzerinde esnek bir soyutlama katmanı oluşturur. Klasik bölümlendirme yönteminde bir bölümün boyutunu değiştirmek büyük risk taşır ve çoğu zaman veri kaybına yol açabilir. LVM ile bu işlemi sistemi kapatmadan, çalışır durumdayken yapabilirsiniz.
LVM’nin temel avantajları şunlardır:
- Anlık boyut değiştirme: Çalışan bir sistemi durdurmadan bölüm boyutunu artırabilirsiniz
- Snapshot alma: Yedekleme öncesinde tutarlı anlık görüntü oluşturabilirsiniz
- Birden fazla disk birleştirme: Birkaç fiziksel diski tek bir mantıksal hacimde kullanabilirsiniz
- Stripe ve mirror desteği: Temel RAID işlevlerini yazılımsal olarak uygulayabilirsiniz
- Kolay yedekleme yönetimi: Snapshot’lar sayesinde sıcak yedekleme yapabilirsiniz
LVM mimarisini anlamak için üç katmanı bilmek gerekir:
- PV (Physical Volume): Fiziksel disk veya bölüm. LVM’nin çalışacağı ham depolama birimidir
- VG (Volume Group): Bir veya birden fazla PV’yi bir araya getiren sanal disk havuzudur
- LV (Logical Volume): VG içinden ayrılan, gerçekte kullandığınız mantıksal bölümdür
Gerekli Paketlerin Kurulumu
Debian’da LVM araçları genellikle minimal kurulumda gelmez. Önce sistemimizi güncelleyelim ve gerekli paketleri kuralım:
apt update && apt upgrade -y
apt install lvm2 parted gdisk -y
Kurulumun ardından LVM servisinin aktif olduğunu doğrulayın:
systemctl status lvm2-monitor
systemctl enable lvm2-monitor
Fiziksel Disklerin Tespiti
Sisteme takılı diskleri görmek için birkaç farklı yöntem kullanabiliriz:
# Tüm blok cihazlarını listele
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE
# Disk detaylarını görüntüle
fdisk -l
# Mevcut LVM yapısını kontrol et
pvs
vgs
lvs
Örnek bir lsblk çıktısı şöyle görünebilir:
NAME SIZE TYPE MOUNTPOINT
sda 100G disk
├─sda1 1G part /boot
├─sda2 2G part [SWAP]
└─sda3 97G part /
sdb 50G disk
sdc 200G disk
Bu senaryoda sdb ve sdc disklerini LVM için kullanacağız.
Yeni Disk Üzerinde LVM Kurulumu
Adım 1: Fiziksel Hacim Oluşturma
# Tek disk için PV oluşturma
pvcreate /dev/sdb
# Birden fazla disk için aynı anda PV oluşturma
pvcreate /dev/sdb /dev/sdc
# PV detaylarını görüntüle
pvdisplay /dev/sdb
pvs -v
pvcreate komutu diski LVM için hazırlar ve bir metadata alanı oluşturur. Bu komut sonrasında disk üzerindeki tüm veriler silinir, dikkatli olun.
Adım 2: Volume Group Oluşturma
# Tek diskle VG oluşturma
vgcreate vg_data /dev/sdb
# İki diskle VG oluşturma (250GB toplam)
vgcreate vg_data /dev/sdb /dev/sdc
# VG bilgilerini görüntüle
vgdisplay vg_data
vgs
VG adı olarak anlamlı isimler kullanın. Üretim ortamlarında vg_data, vg_backup, vg_apps gibi açıklayıcı isimler kullanmak yönetimi kolaylaştırır.
Adım 3: Logical Volume Oluşturma
# Sabit boyutlu LV oluşturma (50GB)
lvcreate -L 50G -n lv_mysql vg_data
# VG'nin yüzde olarak LV oluşturma (%80'i kullan)
lvcreate -l 80%VG -n lv_files vg_data
# Geri kalan alanın tamamını kullan
lvcreate -l 100%FREE -n lv_backup vg_data
# LV listesini görüntüle
lvdisplay
lvs -o +devices
Adım 4: Dosya Sistemi Oluşturma ve Bağlama
# ext4 dosya sistemi oluşturma
mkfs.ext4 /dev/vg_data/lv_mysql
# XFS dosya sistemi (büyük dosyalar için daha iyi)
mkfs.xfs /dev/vg_data/lv_files
# Bağlama noktası oluşturma
mkdir -p /var/lib/mysql
mkdir -p /data/files
# Manuel bağlama
mount /dev/vg_data/lv_mysql /var/lib/mysql
mount /dev/vg_data/lv_files /data/files
# Bağlamayı doğrula
df -h
Adım 5: Kalıcı Bağlama için fstab Düzenlemesi
Sistem yeniden başladığında disklerin otomatik bağlanması için /etc/fstab dosyasını düzenleyin:
# UUID ile bağlama (önerilen yöntem)
blkid /dev/vg_data/lv_mysql
blkid /dev/vg_data/lv_files
# fstab'a ekle
echo "UUID=xxxx-xxxx /var/lib/mysql ext4 defaults 0 2" >> /etc/fstab
echo "/dev/vg_data/lv_files /data/files xfs defaults 0 2" >> /etc/fstab
# fstab'ı test et (unmount etmeden)
mount -a
Fstab’da UUID kullanmak çok önemlidir. Disk sıraları değiştiğinde /dev/sdb gibi isimler değişebilir ama UUID her zaman sabit kalır.
Gerçek Dünya Senaryosu: MySQL Veritabanı Sunucusu
Bir e-ticaret müşterim için kurduğum MySQL sunucusunda şu yapıyı uyguladım. Sunucuda 2 adet 500GB SSD vardı ve veritabanı büyümesi öngörülüyordu:
# İki SSD'yi PV olarak tanımla
pvcreate /dev/sdb /dev/sdc
# Veritabanı için VG oluştur
vgcreate vg_mysql /dev/sdb /dev/sdc
# Ana veritabanı için 700GB LV
lvcreate -L 700G -n lv_mysql_data vg_mysql
# Binary log için ayrı 100GB LV
lvcreate -L 100G -n lv_mysql_binlog vg_mysql
# Yedekleme için kalan alan
lvcreate -l 100%FREE -n lv_mysql_backup vg_mysql
# Dosya sistemleri
mkfs.xfs /dev/vg_mysql/lv_mysql_data
mkfs.xfs /dev/vg_mysql/lv_mysql_binlog
mkfs.ext4 /dev/vg_mysql/lv_mysql_backup
# Bağlama noktaları
mkdir -p /var/lib/mysql /var/log/mysql/binlog /backup/mysql
mount /dev/vg_mysql/lv_mysql_data /var/lib/mysql
mount /dev/vg_mysql/lv_mysql_binlog /var/log/mysql/binlog
mount /dev/vg_mysql/lv_mysql_backup /backup/mysql
Bu yapı sayesinde ilerleyen aylarda veritabanı büyüyünce sadece birkaç komutla genişletebildik.
LVM Hacimlerini Genişletme
En sık kullanılan LVM özelliği budur. /var doluyor, /data yetmiyor, ne yapacaksınız?
Mevcut LV’yi Genişletme
# Mevcut boyutu kontrol et
df -h /var/lib/mysql
lvdisplay /dev/vg_mysql/lv_mysql_data
# 100GB daha ekle
lvextend -L +100G /dev/vg_mysql/lv_mysql_data
# Dosya sistemini genişlet (ext4 için)
resize2fs /dev/vg_mysql/lv_mysql_data
# XFS için (yalnızca büyütme desteklenir)
xfs_growfs /var/lib/mysql
# Tek komutla genişlet (lvextend + resize aynı anda)
lvextend -L +100G -r /dev/vg_mysql/lv_mysql_data
-r parametresi --resizefs anlamına gelir ve dosya sistemini otomatik olarak genişletir. Bu parametreyi mutlaka kullanın, aksi halde dosya sistemi eski boyutunda kalmaya devam eder.
VG’ye Yeni Disk Ekleme
VG’deki alan bitmişse yeni bir fiziksel disk ekleyebilirsiniz:
# Yeni diski sisteme tak ve tespit et
lsblk
# Yeni diski PV olarak hazırla
pvcreate /dev/sdd
# Mevcut VG'ye ekle
vgextend vg_mysql /dev/sdd
# Artık LV genişletebilirsiniz
lvextend -L +200G -r /dev/vg_mysql/lv_mysql_data
# VG durumunu doğrula
vgdisplay vg_mysql
Bu işlemi gerçekleştirirken sistemi kapatmanıza gerek yok. Canlı ortamda, sıfır kesinti süresiyle yapabilirsiniz.
LVM Snapshot Alma ve Yedekleme
Snapshot özelliği, LVM’nin en değerli yeteneklerinden biridir. Anlık görüntü alarak tutarlı yedeklemeler yapabilirsiniz:
# MySQL veritabanının snapshot'ını al (20GB metadata için)
lvcreate -L 20G -s -n lv_mysql_snap /dev/vg_mysql/lv_mysql_data
# Snapshot'ı geçici bir konuma bağla
mkdir -p /mnt/mysql_snap
mount -o ro /dev/vg_mysql/lv_mysql_snap /mnt/mysql_snap
# Yedekleme al
rsync -av /mnt/mysql_snap/ /backup/mysql_$(date +%Y%m%d)/
# Veya tar ile sıkıştırılmış yedek
tar -czf /backup/mysql_$(date +%Y%m%d).tar.gz -C /mnt/mysql_snap .
# Snapshot'ı kaldır
umount /mnt/mysql_snap
lvremove /dev/vg_mysql/lv_mysql_snap
# Snapshot durumunu takip et
lvs -o name,size,snap_percent
Snapshot boyutunu dikkatli seçin. Snapshot oluşturulduktan sonra orijinal hacimde yapılan değişiklikler snapshot alanına yazılır. Snapshot alanı dolarsa snapshot geçersiz hale gelir.
Disk Taşıma ve Veri Göçü
Bir fiziksel diski başkasına taşımak istediğinizde pvmove komutunu kullanırsınız:
# Hangi disk üzerinde hangi LV'ler var?
pvdisplay -m /dev/sdb
# Tüm verileri sdb'den sdc'ye taşı (canlı işlem)
pvmove /dev/sdb /dev/sdc
# Belirli bir LV'yi taşı
pvmove -n lv_mysql_data /dev/sdb /dev/sdc
# İşlem arka planda devam ederken durumu takip et
lvs -o name,size,copy_percent
# Taşıma tamamlandıktan sonra diski VG'den çıkar
vgreduce vg_mysql /dev/sdb
# PV etiketini kaldır
pvremove /dev/sdb
Bu işlem saatler sürebilir. screen veya tmux içinde çalıştırmanızı öneririm, aksi halde SSH bağlantısı koptuğunda ne olduğunu bilemezsiniz.
Debian Kurulumunda LVM ile Bölümlendirme
Debian kurulumu yaparken LVM seçeneğini tercih ederseniz, installer otomatik yapılandırma yapar. Ancak kurulum sonrasında önerilen yapı şudur:
# Kurulum sonrası mevcut yapıyı gör
lsblk
pvs && vgs && lvs
# Debian installer'ın oluşturduğu tipik yapı
# /dev/sda1 -> /boot (ext2, 512MB)
# /dev/sda2 -> LVM PV
# vg_debian -> VG
# lv_root -> / (ext4, 20GB)
# lv_swap -> swap (2GB)
# lv_home -> /home (ext4, kalan)
# Boş alan kontrol et
vgdisplay vg_debian | grep "Free PE"
# Yeni bir LV ekle (örnek: /opt için)
lvcreate -L 10G -n lv_opt vg_debian
mkfs.ext4 /dev/vg_debian/lv_opt
Thin Provisioning: İleri Seviye LVM Kullanımı
Thin provisioning, birden fazla LV’ye toplam kapasiteden fazla alan tahsis etmenizi sağlar. Gerçekte kullanılan alan kadar yer kaplar:
# Thin pool oluştur (100GB pool)
lvcreate -L 100G --thinpool tp_main vg_data
# Thin pool'dan LV oluştur (gerçek alan kullanmaz)
lvcreate -V 50G --thin -n lv_vm1 vg_data/tp_main
lvcreate -V 50G --thin -n lv_vm2 vg_data/tp_main
lvcreate -V 50G --thin -n lv_vm3 vg_data/tp_main
# Thin pool doluluk oranını takip et
lvs -o name,lv_attr,size,pool_lv,data_percent,metadata_percent
# Uyarı: Thin pool dolduğunda tüm thin LV'ler read-only olur!
# Monitoring eklemek kritik önem taşır
Thin provisioning’i üretim ortamında kullanıyorsanız mutlaka izleme alarmları kurun. Pool doluluk oranı %80’i geçtiğinde uyarı almalısınız.
Sorun Giderme
Sysadmin hayatında kaçınılmaz olarak LVM sorunlarıyla karşılaşırsınız.
PV metadata bozulması:
# Metadata yedeklerini listele
ls /etc/lvm/archive/
# Metadata'yı yedekten geri yükle
vgcfgrestore -f /etc/lvm/archive/vg_data_xxx.vg vg_data
# Zorla aktif et
vgchange -ay --activationmode partial vg_data
Kayıp PV durumu:
# Eksik PV ile VG'yi görüntüle
vgs --partial
# Eksik PV'yi VG'den kaldır (veri kaybı riski!)
vgreduce --removemissing --force vg_data
Disk doldu, ne yapacağım:
# Hangi LV'nin dolu olduğunu bul
df -h | sort -k5 -rh | head -10
# LV'yi genişlet (eğer VG'de boş alan varsa)
lvextend -L +20G -r /dev/vg_data/lv_mysql
# VG'de boş alan yoksa yeni disk ekle
pvcreate /dev/sdd
vgextend vg_data /dev/sdd
lvextend -L +20G -r /dev/vg_data/lv_mysql
İzleme ve Bakım Scriptleri
Günlük LVM kontrolü için basit bir script hazırlayın:
#!/bin/bash
# /usr/local/bin/lvm-check.sh
ALERT_THRESHOLD=80
echo "=== LVM Durum Raporu - $(date) ==="
echo ""
echo "--- Physical Volumes ---"
pvs
echo ""
echo "--- Volume Groups ---"
vgs
echo ""
echo "--- Logical Volumes ---"
lvs
echo ""
echo "--- Disk Kullanim ---"
df -h | grep -E "^/dev/mapper"
# VG doluluk uyarısı
vgs --noheadings -o vg_name,vg_free_count,vg_extent_count | while read vg free total; do
if [ "$total" -gt 0 ]; then
used=$((total - free))
percent=$((used * 100 / total))
if [ "$percent" -gt "$ALERT_THRESHOLD" ]; then
echo "UYARI: $vg VG dolulugu %$percent seviyesinde!"
fi
fi
done
# Script'i çalıştırılabilir yap
chmod +x /usr/local/bin/lvm-check.sh
# Cron ile her gün çalıştır
echo "0 8 * * * root /usr/local/bin/lvm-check.sh | mail -s 'LVM Raporu' [email protected]" >> /etc/crontab
LVM Metadata Yedekleme
LVM konfigürasyonunuzu düzenli olarak yedekleyin:
# Manuel metadata yedeği
vgcfgbackup -f /backup/lvm/vg_data_$(date +%Y%m%d).backup vg_data
# Tüm VG'leri yedekle
vgcfgbackup --file /backup/lvm/all_%s_$(date +%Y%m%d)
# LVM otomatik yedekleme konumu
ls /etc/lvm/backup/
ls /etc/lvm/archive/
LVM her değişiklikte /etc/lvm/backup/ altına otomatik yedek alır. Bu dosyaları düzenli olarak başka bir sunucuya kopyalamayı unutmayın.
Sonuç
LVM, modern Linux sunucu yönetiminin vazgeçilmez bir parçasıdır. Özellikle büyüyen veritabanları, log hacimleri veya kullanıcı depolama alanlarında esneklik sağlaması açısından alternatifi yoktur. Başlangıçta karmaşık görünebilir ama bir kez kurup kullandıktan sonra neden bu kadar geç öğrendiğinize şaşıracaksınız.
Pratik tavsiyelerim şunlardır:
- Her zaman VG’nin en az %20’sini boş bırakın, snapshot ve acil genişletme için hazır tutun
- Üretim ortamında PV, VG ve LV metadata yedeklerini uzak sunucuya kopyalayın
- Thin provisioning kullanıyorsanız izleme alarmları kurmak zorunludur
- LV isimlerini anlamlı seçin, üç ay sonra ne olduğunu hatırlamanız gerekecek
lvextend -rparametresini alışkanlık haline getirin, dosya sistemi yeniden boyutlandırmayı unutmayın- Büyük
pvmoveişlemlerini her zamanscreenveyatmuxiçinde yapın
Bu yapıyı doğru kurduğunuzda, gece yarısı disk doluğu alarmı aldığınızda paniklemenize gerek kalmaz. Terminal açıp iki komut yazarsınız ve sorunu çözersiniz.