Linux'ta LVM: fiziksel birimler, gruplar ve mantıksal birimler pratikte
LVM (Logical Volume Manager) Linux'ta diskler ile dosya sistemleri arasında bir katmandır: diskler fiziksel birimlere (PV) dönüşür, bir birim grubunda (VG) birleşir ve bu gruptan istenen boyutta mantıksal birimler (LV) kesilir. Temel avantajı, birimin lvextend -r ile anında büyütülebilmesi, gruba hizmet kesintisi olmadan yeni disk eklenebilmesi ve riskli bir işlemden önce anlık görüntü alınabilmesidir.
LVM (Logical Volume Manager), Linux'ta dosya sistemlerini fiziksel disklerden ayıran bir mantıksal birim yöneticisidir. /var dizinini sabit olarak /dev/sdb1 bölümüne bağlamak yerine, diskleri ortak bir havuza koyar ve ondan istediğiniz boyutta birimler kesersiniz. Yer yetmediğinde birim tek komutla büyür; yeniden başlatmaya veya hizmeti durdurmaya gerek kalmaz. Aşağıda Linux'ta LVM'in nasıl çalıştığını, birimleri sıfırdan nasıl oluşturacağınızı, büyütmeyi, anlık görüntü almayı ve tipik hatalardan nasıl kaçınacağınızı anlatıyoruz.
Normal bölümler varken LVM neden gerekli
Sıradan bir bölüm, tek bir diskin kesintisiz bir parçasıdır. Boyutu bölümlendirme sırasında belirlenir ve yalnızca hemen arkasında boş alan varsa büyütülebilir. Disk dolduğunda yeni disk almanız, verileri taşımanız ve /etc/fstab dosyasını yeniden yazmanız gerekir; bu sırada hizmeti de durdurmanız gerekir.
LVM üç sorunu çözer:
- Esnek boyut. Mantıksal birim istediğiniz zaman büyütülebilir (ext4 için küçültülebilir de).
- Diskleri birleştirme. Birden fazla fiziksel disk tek bir havuz olur; bir birim aynı anda iki diskte de bulunabilir.
- Anlık görüntüler. Güncelleme, veritabanı taşıma veya başka bir riskli işlemden önce birimin anlık kopyası.
Bu yüzden Ubuntu Server, RHEL, Rocky ve AlmaLinux kurulum programları varsayılan olarak LVM önerir ve veri sunucularında neredeyse her zaman kullanılır.
LVM'in üç katmanı: PV, VG ve LV
Tüm LVM mantığı üç kavrama sığar. Basit bir benzetme: diskler un çuvalları, grup ortak depo, mantıksal birimler depodan tarttığınız porsiyonlar.
| Katman | Ne | Örnek ad | Oluşturan komut |
|---|---|---|---|
| PV (Physical Volume) | LVM için hazırlanmış disk veya bölüm | /dev/sdb, /dev/sdc1 | pvcreate |
| VG (Volume Group) | bir veya birden fazla PV'yi birleştiren havuz | data_vg | vgcreate |
| LV (Logical Volume) | VG'den kesilmiş birim; üzerinde dosya sistemi oluşturulur | /dev/data_vg/app | lvcreate |
VG içindeki alan, sabit boyutlu bloklara — PE (physical extents) — bölünür; varsayılan boyut 4 MiB'dir. Mantıksal birim, bu extent'lerin bir kümesinden ibarettir; extent'ler bitişik olmak zorunda değildir ve farklı disklerde bulunabilir. Birimin bu kadar kolay büyütülebilmesinin nedeni budur: LVM ona boş extent'leri her yerden ekleyebilir.
Mantıksal birime iki eşdeğer yoldan erişilebilir: /dev/data_vg/app ve /dev/mapper/data_vg-app. Arka planda bu, çekirdeğin device-mapper aygıtıdır.
Mevcut durumu görme
Önce paketin kurulu olduğundan emin olun: Debian ve Ubuntu'da bu lvm2 paketidir (sudo apt install lvm2); RHEL ailesinde varsayılan olarak kuruludur. Genel bakış için kısa ve ayrıntılı komutlar vardır:
$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sdb data_vg lvm2 a-- <20.00g 0
/dev/sdc data_vg lvm2 a-- <20.00g <10.00g
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
data_vg 2 1 0 wz--n- 39.99g <10.00g
$ sudo lvs
LV VG Attr LSize Pool Origin Data% Meta%
app data_vg -wi-ao---- 30.00g
Ayrıntılı bilgi için pvdisplay, vgdisplay ve lvdisplay kullanılır. Normal bölümlerle birlikte genel görünümü lsblk verir: mantıksal birimler lvm türüyle görünür.
$ lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 20G 0 disk
└─data_vg-app 253:0 0 30G 0 lvm /srv/app
sdc 8:32 0 20G 0 disk
└─data_vg-app 253:0 0 30G 0 lvm /srv/app
Görüldüğü gibi, 30 GB'lık app birimi, her biri 20 GB olan iki diskte birden yer alıyor — normal bir bölümle bunu yapmak mümkün değildir.
Sıfırdan LVM: ham diskten bağlı birime
Sunucuya boş bir /dev/sdb diski eklendiğini ve uygulama verileri için 15 GB'lık bir birime ihtiyaç olduğunu varsayalım. Diskin adını lsblk ile iki kez kontrol edin: aşağıdaki tüm komutlar belirtilen aygıttaki verileri yok eder.
Adım 1. Fiziksel birim oluşturma
$ sudo pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
LVM'e diskin tamamını verebilirsiniz; ya da önce fdisk veya parted ile “Linux LVM” türünde bir bölüm oluşturup onu (/dev/sdb1) verebilirsiniz. Bölüm diğer yöneticiler için daha açıktır ve diski LVM'in üzerine yanlışlıkla bölümlendirmeye karşı korur; tüm diski ise bulutta büyütmek daha kolaydır.
Adım 2. Birim grubu oluşturma
$ sudo vgcreate data_vg /dev/sdb
Volume group "data_vg" successfully created
Adım 3. Mantıksal birim kesme
$ sudo lvcreate -n app -L 15G data_vg
Logical volume "app" created.
-L mutlak boyut verir, -l ise extent sayısı veya yüzde verir: -l 100%FREE grubun tüm boş alanını alır, -l 50%VG grubun yarısını. Gruptaki boş bir payı korumak iyi bir uygulamadır: sonradan herhangi bir birime ekleyebilir veya anlık görüntüye ayırabilirsiniz.
Adım 4. Dosya sistemi ve bağlama
$ sudo mkfs.ext4 /dev/data_vg/app
$ sudo mkdir -p /srv/app
$ sudo mount /dev/data_vg/app /srv/app
$ df -h /srv/app
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data_vg-app 15G 24K 14G 1% /srv/app
Birimin yeniden başlatmadan sonra da bağlı kalması için /etc/fstab dosyasına satır ekleyin. Mantıksal birimler için /dev/mapper/... yolu kararlıdır, bu yüzden bunu ya da blkid'in verdiği UUID'yi kullanabilirsiniz:
/dev/mapper/data_vg-app /srv/app ext4 defaults 0 2
Yeniden başlatmadan önce sudo mount -a ile kaydı kontrol edin: fstab'daki bir hata sunucuyu acil durum moduna sokabilir.
LVM birimini hizmeti durdurmadan büyütme
LVM'i sevmenin asıl nedeni budur. Birim bağlı dosya sistemi üzerinde büyür, uygulama yazmaya devam eder. Senaryo, grupta boş yer olup olmadığına bağlıdır.
VG içinde boş yer varsa
$ sudo vgs data_vg
VG #PV #LV #SN Attr VSize VFree
data_vg 1 1 0 wz--n- <20.00g <5.00g
$ sudo lvextend -r -L +4G /dev/data_vg/app
Size of logical volume data_vg/app changed from 15.00 GiB to 19.00 GiB.
Logical volume data_vg/app successfully resized.
resize2fs 1.47.0
Filesystem at /dev/mapper/data_vg-app is mounted on /srv/app; on-line resizing required
Kilit bayrak -r (--resizefs): birim büyütüldükten hemen sonra dosya sistemini de genişletir. Bu bayrak olmadan birim büyür, ama df -h eski boyutu gösterir, çünkü dosya sistemi yeni alandan haberdar değildir. En sık yapılan hata budur; bu durumda resize2fs (ext4) veya xfs_growfs (XFS) komutunu elle çalıştırmak yeterlidir.
$ sudo resize2fs /dev/data_vg/app # ext4, aygıt adı verilir
$ sudo xfs_growfs /srv/app # XFS, bağlama noktası verilir
Dikkat: -L +4G 4 GB ekler, -L 4G ise toplam boyutu 4 GB yapar. Geriye kalan tüm yeri birime vermek için -l +100%FREE kullanın.
VG'de yer bittiyse: disk ekleme
Yeni diski takın (bulutta birim ekleyin), lsblk ile bulun ve gruba ekleyin:
$ sudo pvcreate /dev/sdc
$ sudo vgextend data_vg /dev/sdc
Volume group "data_vg" successfully extended
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app
Üç komut, sıfır kesinti. Dosya sistemi artık iki diskin üzerinde durur ve uygulama bunu fark etmez.
Bulutta disk büyütüldüyse
Bulutta çoğu zaman yeni disk eklemek yerine mevcut diski büyütmek daha kolaydır. Bu durumda çekirdek aygıtın yeni boyutunu görür, fiziksel birimi ise pvresize ile genişletmeniz gerekir:
$ sudo pvresize /dev/sdb
Physical volume "/dev/sdb" changed
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app
PV bir bölüm (/dev/sdb1) üzerinde oluşturulduysa, önce bölümü genişletin — örneğin cloud-guest-utils paketindeki growpart /dev/sdb 1 ile — ve ancak sonra pvresize /dev/sdb1 çalıştırın.
LVM birimi küçültülebilir mi
Küçültülebilir, ama her dosya sistemi için değil ve çalışır durumdayken değil. XFS hiç küçültülemez — yalnızca verileri taşıyarak yeniden oluşturulabilir. Ext4 küçültülebilir, ama yalnızca bağlantısı kesilmiş durumda:
$ sudo umount /srv/app
$ sudo lvreduce -r -L 10G /dev/data_vg/app
-r bayrağıyla LVM dosya sistemini kendisi denetler (e2fsck) ve birim küçülmeden önce sıkıştırır. Bu bayrak olmadan dosya sistemini olduğundan küçük bir birim yapıp verileri bozmak kolaydır. Küçültmeden önce mutlaka yedek alın.
LVM anlık görüntüleri: riskli işlem öncesi kopya
Anlık görüntü, mantıksal birimin an'lık bir kopyasıdır. Saniyenin küçük bir kesrinde oluşturulur ve veriyi kopyalamaz: LVM copy-on-write (yazmada kopyala) yöntemiyle çalışır ve yalnızca anlık görüntüden sonra orijinal birimde değişen blokları saklar. Bu nedenle anlık görüntü için VG'de yalnızca değişiklikler kadar yer gerekir, birimin tamamı kadar değil.
$ sudo lvcreate -s -n app_before_upgrade -L 2G /dev/data_vg/app
Logical volume "app_before_upgrade" created.
$ sudo lvs data_vg
LV VG Attr LSize Origin Data%
app data_vg owi-aos--- 19.00g
app_before_upgrade data_vg swi-a-s--- 2.00g app 0.01
Data% sütunu değişiklik deposunun ne kadar dolu olduğunu gösterir. %100'e ulaşırsa klasik anlık görüntü geçersiz olur ve yalnızca silinebilir. Boyutu beklenen değişim miktarına göre biraz fazla seçin; uzun süre tutulan anlık görüntüleri lvs ile izleyin veya lvextend ile genişletin.
Anlık görüntüye geri dönme
Güncelleme kötü giderse, birimi anlık görüntü anındaki haline döndürün:
$ sudo umount /srv/app
$ sudo lvconvert --merge /dev/data_vg/app_before_upgrade
Merging of volume data_vg/app_before_upgrade started.
$ sudo mount /srv/app
Birleştirmeden sonra anlık görüntü kaybolur. Birim bağlantısı kesilemiyorsa (örneğin sistem kökü ise), birleştirme bir sonraki birim etkinleştirilene, yani yeniden başlatmaya kadar ertelenir.
Her şey yolunda gittiyse
Anlık görüntüyü yalnızca silin; yazmayı yavaşlatmasın ve yer kaplamasın:
$ sudo lvremove /dev/data_vg/app_before_upgrade
Çalışan bir sistemin tutarlı yedeğini almak için anlık görüntüyü yalnızca okuma modunda bağlamak kullanışlıdır: mount -o ro ve kopyalama için rsync ya da tar. XFS için orijinalle UUID çakışması nedeniyle bağlamanın reddedilmemesi adına nouuid seçeneği ekleyin.
LVM ve RAID: görevleri karıştırmayın
LVM tek başına disk arızasına karşı koruma sağlamaz. Birim iki diske yayılmışsa ve diskten biri bozulursa, birimin yarısı değil tamamı kaybolur. Arızaya dayanıklılık için LVM'in altına RAID (mdadm) konur veya LVM'in kendi ayna (mirror) modu kullanılır: lvcreate --type raid1 -m 1.
Ne RAID ne de anlık görüntü yedeğin yerini tutar. Anlık görüntü orijinalle aynı disklerde durur; RAID ise yanlışlıkla çalıştırılan rm -rf komutunu da sadık biçimde yansıtır. Başka bir ortamda ayrı bir kopya gerekir.
LVM komutları özeti
| Görev | Komut |
|---|---|
| PV, VG, LV genel görünümü | pvs, vgs, lvs |
| Fiziksel birim oluşturma | pvcreate /dev/sdb |
| Grup oluşturma | vgcreate data_vg /dev/sdb |
| Gruba disk ekleme | vgextend data_vg /dev/sdc |
| Birim oluşturma | lvcreate -n app -L 15G data_vg |
| Birimi ve dosya sistemini büyütme | lvextend -r -L +5G /dev/data_vg/app |
| Disk büyütüldükten sonra PV'yi genişletme | pvresize /dev/sdb |
| Anlık görüntü | lvcreate -s -n snap -L 2G /dev/data_vg/app |
| Anlık görüntüye geri dönme | lvconvert --merge /dev/data_vg/snap |
| Diski gruptan çıkarma | pvmove /dev/sdb, sonra vgreduce data_vg /dev/sdb |
| Birimi silme | lvremove /dev/data_vg/app |
Sık yapılan hatalar
- Birim büyütüldü, ama df eski boyutu gösteriyor.
-runutulmuş.resize2fsveyaxfs_growfsçalıştırın. - Insufficient free space. Grupta boş extent yok:
vgsile kontrol edin vevgextendile disk ekleyin ya da PV'yi genişletin. - Device /dev/sdc excluded by a filter. Diskte eski bölüm tablosu veya dosya sistemi imzası kalmış. Veriler gerçekten gereksizse,
wipefs -a /dev/sdcile temizleyin. - Anlık görüntü Invalid oldu. Değişiklik deposu %100 doldu. Onarılamaz; yalnızca silinebilir ve bir dahaki sefere daha fazla yer ayrılmalıdır.
Özet
Linux'ta LVM üç katmandan oluşur: fiziksel birimler (PV) bir gruba (VG) konur, o gruptan mantıksal birimler (LV) kesilir. Bu, normal bölümlerde olmayan şeyleri sağlar: lvextend -r ile birimi anında büyütmek, kesinti olmadan disk eklemek ve riskli değişikliklerden önce anlık görüntü almak. LVM'in RAID'in ve yedeklemenin yerini tutmadığını unutmayın. Disk bölümlendirme, LVM, RAID ve kotalar kursta uygulamalı olarak işlenmektedir.
Sık sorulan sorular
Verileri olan çalışan bir bölümü LVM'e geçirmek mümkün mü?
Doğrudan değil: pvcreate aygıtın başlangıcını siler. Önce başka bir diskte LVM kurun, verileri rsync ile kopyalayın, fstab'ı düzeltin ve ancak sonra eski bölümü serbest bırakın.
LVM disk performansını yavaşlatır mı?
Anlık görüntü olmadan device-mapper'ın ek yükü neredeyse fark edilmez. Etkin klasik anlık görüntüler ise copy-on-write nedeniyle orijinal birimdeki yazmaları yavaşlatır; bu yüzden onları haftalarca tutmamalısınız.
Ev bilgisayarında veya dizüstü bilgisayarda LVM gerekli mi?
Zorunlu değildir, ama disk şifrelemesi (içinde LVM bulunan LUKS) ile veya bölümleri yeniden bölümlendirmeden boyutlandırmak istediğinizde faydalıdır. Veri içeren sunucularda LVM neredeyse standarttır.
LVM'de thin provisioning nedir?
İnce birimlerdir: bir havuz (lvcreate --type thin-pool) oluşturulur ve havuzdaki birimler yalnızca veri yazıldıkça gerçek yer kaplar. Böylece fiziksel olarak olandan fazla alan vaat edebilirsiniz, ama havuzun dolumunu izlemeniz gerekir.
Veriyi kaybetmeden bir diski birim grubundan nasıl çıkarırım?
Diskteki extent'leri grubun diğer disklerine pvmove /dev/sdb ile taşıyın (yeterli boş alan gerekir), ardından vgreduce data_vg /dev/sdb ve pvremove /dev/sdb çalıştırın.
Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.
Kursa git