Debian’da Disk Yönetimi ve LVM Kurulumu: Adım Adım Rehber

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 -r parametresini alışkanlık haline getirin, dosya sistemi yeniden boyutlandırmayı unutmayın
  • Büyük pvmove işlemlerini her zaman screen veya tmux iç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.

Yorum yapın