Sunucu kurulumu sırasında disk bölümlendirme kararları, sonradan pişman olacağınız türden hatalar yapabileceğiniz en kritik adımlardan biridir. “Yeter bu kadar alan” diyerek küçük bıraktığınız /var bölümü, birkaç ay sonra dolup sistemi felç edebilir. İşte tam bu noktada LVM devreye giriyor ve hayatınızı kurtarıyor. Bu yazıda Ubuntu sunucularda disk bölümlendirmeyi ve LVM yönetimini baştan sona ele alacağız.
Temel Kavramlar: Neden LVM?
Geleneksel disk bölümlendirmede bir bölüm oluşturduktan sonra boyutunu değiştirmek ciddi bir iştir. Sistemi kapatmanız, live medyadan boot etmeniz, partition’ı yeniden boyutlandırmanız ve belki de veri kaybı riskiyle uğraşmanız gerekir. LVM (Logical Volume Manager) bu sorunu ortadan kaldırır.
LVM’nin katmanlı yapısı şu şekilde çalışır:
- Physical Volume (PV): Gerçek disk veya bölüm. LVM’nin üzerine inşa edildiği fiziksel katman
- Volume Group (VG): Bir veya birden fazla PV’yi bir araya getiren havuz. Tüm depolama alanınız burada toplanır
- Logical Volume (LV): VG içinden ihtiyacınıza göre ayırdığınız mantıksal disk bölümleri. Üzerine dosya sistemi kurarsınız
Bu yapı sayesinde diskler arasında alanı esnek biçimde yönetebilir, anlık snapshot alabilir, hatta RAID benzeri özellikler uygulayabilirsiniz.
Mevcut Disk Durumunu Görmek
Herhangi bir işlem yapmadan önce sisteminizin mevcut durumunu iyice anlamak gerekiyor. Aşağıdaki komutlarla başlayalım:
# Tüm blok cihazlarını listele
lsblk -f
# Disk ve bölüm bilgilerini göster
fdisk -l
# Bağlı dosya sistemlerini ve kullanım oranlarını göster
df -hT
# Mevcut LVM yapısını göster
pvs && vgs && lvs
lsblk -f komutu size disk yapısını ağaç formatında gösterir ve hangi bölümlerin hangi dosya sistemiyle formatlandığını, UUID bilgilerini ve nereye mount edildiğini bir arada sunar. Yeni bir sunucuya bağlandığınızda ilk çalıştırmanız gereken komutlardan biridir.
Yeni Disk Ekleme ve Bölümlendirme
Diyelim ki sunucunuza yeni bir disk eklediniz veya bulut ortamında yeni bir volume attach ettiniz. Sistemi yeniden başlatmadan diski tanıtmak için:
# SCSI bus'ı yeniden tara (fiziksel sunucular için)
echo "- - -" > /sys/class/scsi_host/host0/scan
# Yeni diski kontrol et
lsblk
# Genellikle /dev/sdb veya /dev/nvme0n1 gibi görünür
fdisk /dev/sdb
fdisk ile interaktif bölüm oluşturma süreci şu adımları izler: n ile yeni bölüm, p ile primary, bölüm numarası ve boyut girişi. LVM kullanacaksanız bölüm tipini 8e (Linux LVM) olarak ayarlamak iyi bir pratiktir, ancak zorunlu değildir. w ile değişiklikleri yazıp çıkın.
Modern sistemlerde parted veya gdisk kullanmak daha mantıklıdır çünkü GPT (GUID Partition Table) desteği sunarlar ve 2TB üzeri disklerle çalışabilirsiniz:
# GPT ile yeni bölüm oluşturma
parted /dev/sdb --script
mklabel gpt
mkpart primary 0% 100%
set 1 lvm on
# Değişikliği kernel'a bildir
partprobe /dev/sdb
# Yeni bölümü kontrol et
lsblk /dev/sdb
LVM Yapısını Oluşturma
Disk bölümünüzü hazırladıktan sonra LVM katmanlarını oluşturma zamanı geldi. Bir production senaryosu düşünelim: Yeni bir web sunucusu kuruyorsunuz ve /var/www için ayrı, büyütülebilir bir alan istiyorsunuz.
# Physical Volume oluştur
pvcreate /dev/sdb1
# Volume Group oluştur (birden fazla PV ekleyebilirsiniz)
vgcreate vg_data /dev/sdb1
# Eğer ikinci bir disk de varsa aynı VG'ye ekleyin
# vgextend vg_data /dev/sdc1
# Volume Group detaylarını kontrol et
vgdisplay vg_data
# Logical Volume oluştur (10GB)
lvcreate -L 10G -n lv_www vg_data
# Ya da VG'nin tamamını kullan
lvcreate -l 100%FREE -n lv_www vg_data
# Dosya sistemi oluştur
mkfs.ext4 /dev/vg_data/lv_www
# Mount noktası oluştur ve bağla
mkdir -p /var/www
mount /dev/vg_data/lv_www /var/www
lvcreate komutundaki -L parametresi kesin boyut belirtmek için kullanılır (10G, 500M gibi). -l parametresi ise PE (Physical Extent) sayısı veya yüzde cinsinden belirtmek için kullanılır. İkisi farklı şeyler, karıştırmamak lazım.
Kalıcı Mount Ayarları
Mount ettiğiniz volume’u her yeniden başlatmada otomatik bağlanacak şekilde ayarlamak için /etc/fstab dosyasını düzenlemeniz gerekiyor:
# UUID'yi öğren
blkid /dev/vg_data/lv_www
# fstab'a ekle (UUID kullanmak daha güvenli)
echo "UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /var/www ext4 defaults 0 2" >> /etc/fstab
# Ya da device path ile (LVM için bu da güvenilirdir)
echo "/dev/vg_data/lv_www /var/www ext4 defaults 0 2" >> /etc/fstab
# fstab'ı test et (sistemi yeniden başlatmadan)
mount -a
# Hata yoksa devam et
df -h /var/www
fstab’daki son iki sayının ne anlama geldiğini bilmek önemli: beşinci alan dump için (çoğunlukla 0), altıncı alan fsck sırası için. Root bölümü için 1, diğerleri için 2, swap ve tmpfs için 0 kullanın.
Logical Volume Boyutunu Artırma
İşte LVM’nin en sevdiğim özelliği: çalışan sistemi durdurmadan disk alanı ekleyebilirsiniz. /var/www dolmaya başladı diyelim:
# Mevcut durumu kontrol et
df -h /var/www
lvdisplay /dev/vg_data/lv_www
# VG'de boş alan var mı kontrol et
vgdisplay vg_data | grep "Free PE"
# 5GB daha ekle
lvextend -L +5G /dev/vg_data/lv_www
# Ya da toplam boyutu belirt
lvextend -L 15G /dev/vg_data/lv_www
# Dosya sistemini de genişlet (ext4 için, mount'luyken bile çalışır)
resize2fs /dev/vg_data/lv_www
# XFS kullanıyorsanız
# xfs_growfs /var/www
# Sonucu kontrol et
df -h /var/www
lvextend -r parametresini kullanırsanız dosya sistemini de otomatik olarak genişletir, ayrıca resize2fs çalıştırmanıza gerek kalmaz. Ama ben adımları ayrı atmayı tercih ederim, neyin ne yaptığını görmek için.
Volume Group’a Yeni Disk Ekleme
VG’nizde boş alan kalmadı ve yeni disk eklediniz. Bu senaryo production ortamlarında çok sık karşılaşılan bir durum:
# Yeni diski hazırla
pvcreate /dev/sdc1
# Mevcut VG'ye ekle
vgextend vg_data /dev/sdc1
# VG'nin yeni kapasitesini kontrol et
vgs vg_data
# Artık LV'yi genişletebilirsiniz
lvextend -L +20G -r /dev/vg_data/lv_www
Bu işlemin güzelliği, dosya sisteminin bu geçişten tamamen habersiz olması. Sizin için tamamen şeffaf bir katman oluşturuyor.
LVM Snapshot ile Güvenli Yedekleme
LVM snapshot özelliği, özellikle veritabanı yedeklemelerinde çok değerli. Consistent bir yedek almak için normalde servisi durdurmanız gerekirdi. Snapshot ile bu süreyi minimuma indirebilirsiniz:
# Snapshot oluştur (2GB snapshot alanı ayır)
lvcreate -L 2G -s -n lv_www_snap /dev/vg_data/lv_www
# Snapshot'ı geçici bir noktaya mount et
mkdir -p /mnt/snap_backup
mount -o ro /dev/vg_data/lv_www_snap /mnt/snap_backup
# Yedek al
rsync -av /mnt/snap_backup/ /backup/www_$(date +%Y%m%d)/
# İşiniz bitince unmount et ve snapshot'ı sil
umount /mnt/snap_backup
lvremove /dev/vg_data/lv_www_snap
Snapshot çalışma prensibi “copy-on-write” yöntemiyle işler. Snapshot oluşturulduğu anda ek alan kullanmaz. Orijinal volume’da bir blok değiştirildiğinde, o bloğun eski hali snapshot alanına kopyalanır. Bu yüzden snapshot için ayırdığınız alan, yedekleme süresince yapılacak değişiklikleri karşılayacak kadar büyük olmalı.
Thin Provisioning ile Akıllı Alan Yönetimi
Birden fazla müşteriye hizmet veren bir hosting ortamınız varsa thin provisioning çok işinize yarar. Her müşteriye 50GB alan tanımlarsınız ama aslında o alanı gerçekte kullanana kadar fiziksel disk tahsis etmezsiniz:
# Thin pool oluştur
lvcreate -L 100G --thinpool tp_pool vg_data
# Thin volume oluştur (100GB olarak görünür ama gerçek alan yok)
lvcreate -V 50G --thin -n lv_musteri1 vg_data/tp_pool
lvcreate -V 50G --thin -n lv_musteri2 vg_data/tp_pool
# Thin pool kullanımını izle
lvs -a vg_data
Tabii bu yaklaşımda dikkatli olmak gerekiyor: Gerçek kullanım toplam fiziksel alanı aşarsa sorun yaşarsınız. Monitoring kurmanız şart.
Gerçek Dünya Senaryosu: Root Bölümü Dolduğunda
En stresli sysadmin anlarından biri budur: Gece 2’de alarm geliyor, root bölümü %100 dolu, servisler düşmeye başlıyor. Sistemi LVM ile kurduysanız kurtarma planınız var:
# Acil durum: Hangi bölüm doldu?
df -h
# Root bölümü doluysa önce geçici alan aç
# Log dosyalarını temizle
journalctl --vacuum-time=3d
# Büyük dosyaları bul
find / -xdev -size +100M -ls 2>/dev/null | sort -k7 -rn | head -20
# VG'de boş alan varsa hemen genişlet
vgs
lvextend -L +5G -r /dev/ubuntu-vg/ubuntu-lv
# VG'de boş alan yoksa başka LV'den küçült (dikkatli ol!)
# Önce ilgili LV'yi unmount et
umount /var/www
e2fsck -f /dev/vg_data/lv_www
resize2fs /dev/vg_data/lv_www 8G
lvreduce -L 8G /dev/vg_data/lv_www
# Küçülttüğün alanı root'a ekle
lvextend -L +2G -r /dev/ubuntu-vg/ubuntu-lv
Uyarı: LV küçültmek, büyütmekten çok daha risklidir. XFS dosya sistemi online küçültmeyi desteklemez. Ext4’te bile sıra önemlidir: önce dosya sistemini küçültün, sonra LV’yi küçültün. Tersi veri kaybına yol açar.
LVM Yapısını İzleme ve Raporlama
Düzenli izleme yapmak, sorunları önceden görmenizi sağlar. Basit bir izleme scripti:
#!/bin/bash
# /usr/local/bin/lvm-monitor.sh
THRESHOLD=80
ALERT_EMAIL="[email protected]"
# Her LV'nin kullanım oranını kontrol et
df -h | grep -v tmpfs | while read filesystem size used avail use mountpoint; do
use_percent=$(echo $use | tr -d '%')
if [ "$use_percent" -gt "$THRESHOLD" ] 2>/dev/null; then
echo "UYARI: $mountpoint bölümü %$use_percent dolu!" |
mail -s "Disk Uyarisi: $HOSTNAME" $ALERT_EMAIL
fi
done
# VG'lerde boş alan kontrolü
vgs --noheadings -o vg_name,vg_free | while read vg_name vg_free; do
echo "VG: $vg_name - Boş Alan: $vg_free"
done
Bu scripti crontab’a ekleyin:
# Her saat başı çalıştır
echo "0 * * * * root /usr/local/bin/lvm-monitor.sh" > /etc/cron.d/lvm-monitor
Ubuntu 22.04 LVM Kurulum Sonrası Yapılandırma
Ubuntu Server kurulumu sırasında “LVM ile birlikte” seçeneğini seçtiyseniz, sistem genellikle diskin yarısını VG’ye ayırır. Geri kalanı kullanmak için:
# Mevcut yapıyı gör
vgdisplay ubuntu-vg
lvdisplay /dev/ubuntu-vg/ubuntu-lv
# Tüm boş alanı root'a ver
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
# Dosya sistemini genişlet
resize2fs /dev/ubuntu-vg/ubuntu-lv
# Kontrol et
df -h /
Ubuntu 22.04 kurulumu sonrası sıklıkla yapılan ama unutulan adım budur. Diskinizin yarısını boşta bırakıyorsunuz farkında olmadan.
Bozuk Physical Volume Kurtarma
Disklerden biri bozulmaya başladığında LVM bazı durumlarda yardımcı olabilir. RAID yapısı kurduysanız bu daha kolaydır. Ama en azından verileri kurtarmayı deneyebilirsiniz:
# Bozuk PV'yi tespit et
pvdisplay
dmesg | grep -i "I/O error"
# VG'yi yeni bir diske taşı
# Önce yeni diski VG'ye ekle
pvcreate /dev/sdd1
vgextend vg_data /dev/sdd1
# Verileri bozuk diskten yeni diske taşı
pvmove /dev/sdb1 /dev/sdd1
# pvmove tamamlandıktan sonra bozuk diski çıkar
vgreduce vg_data /dev/sdb1
pvremove /dev/sdb1
pvmove komutu çalışırken sistemi kapatmayın. Uzun sürebilir ama işlem yarıda kalırsa devam ettirebilirsiniz.
LVM Metadata Yedekleme
LVM konfigürasyonunuz /etc/lvm/backup/ ve /etc/lvm/archive/ dizinlerinde otomatik olarak yedeklenir. Ama elle de yedek alabilirsiniz:
# Tüm VG'lerin metadata yedeklerini al
vgcfgbackup
# Belirli bir VG için
vgcfgbackup vg_data
# Yedek nerede?
ls -la /etc/lvm/backup/
# Gerektiğinde geri yükle
vgcfgrestore vg_data
Bu yedekler disk arızasından sonra LVM yapısını yeniden oluşturmak için kritik önem taşır. Bunları da düzenli olarak off-site yedek sisteminize kopyalayın.
Sonuç
LVM, Ubuntu sunucu yönetiminde vazgeçilmez bir araç haline gelmiştir. İlk başta “neden bu kadar katman?” diye sorabilirsiniz, ama ilk kez çalışan bir sistemi durdurmadan disk genişlettiğinizde ya da anlık snapshot alıp gönül rahatlığıyla güncelleme yaptığınızda değerini anlıyorsunuz.
Pratik önerilerimi şöyle özetleyebilirim:
- Yeni sunucu kurulumlarında her zaman LVM kullanın, sonradan pişman olmazsınız
/bootbölümünü LVM dışında tutun, sorun yaşarsınız- VG’nizde her zaman biraz boş alan bırakın, snapshot için lazım olur
- Küçültme işlemlerinden önce mutlaka yedek alın
pvmove,lvextend,vgextendkomutlarını test ortamında defalarca pratik yapın- LVM metadata yedeklerini sisteminizin dışına kopyalayın
Disk yönetimi reactive değil, proactive yapılmalıdır. Dolmadan önce genişletin, arızalanmadan önce yedekleyin. LVM size bu esnekliği sunuyor, kullanmak size kalmış.