Tarkibga o'tish

LVM: hajmni o'zgartirish va snapshot

LVM asoslari maqolasida PV → VG → LV tuzilmasi qurildi. LVM’ning asosiy amaliy foydasi aynan shu yerda namoyon bo'ladi: LV hajmini u ishlatilayotgan paytda, diskni umuman qayta bo'limlamasdan o'zgartirish va undan bir lahzada snapshot olish mumkin.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • LV’ni lvextend bilan kengaytirish va uning fayl tizimini unga moslab o'zgartirish;
  • LV’ni kichraytirish nega xavfli ekanini va buni qanday xavfsizroq qilishni tushuntirish;
  • lvcreate -s bilan snapshot yaratish va u qanday ishlashini tushuntirish;
  • o'zgarishlarni ortga qaytarish yoki ma’lumotlarni saqlab qolish uchun snapshot’dan foydalanish;
  • snapshot’da joy tugab qolishi nega xavfli ekanini tushuntirish.

LV’ni kengaytirish

Agar VG'da bo'sh joy bo'lsa, LV’ni u ishlatilayotgan paytda kengaytirish mumkin. Bu ikki bosqichli jarayon: avval LVM darajasida, keyin fayl tizimi darajasida.

1. VG'dagi bo'sh joyni tekshiring

sudo vgs vg_data

VFree ustuni qancha bo'sh joy borligini ko'rsatadi. Agar bo'sh joy bo'lmasa, avval VG'ga yangi PV qo'shish kerak:

sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd

2. LV’ni kengaytiring

sudo lvextend -L +10G /dev/vg_data/lv_app

+10G — joriy hajmga qo'shiladigan miqdor (mutlaq yangi hajm emas). Barcha bo'sh joyni berish uchun:

sudo lvextend -l +100%FREE /dev/vg_data/lv_app

3. Fayl tizimini yangi hajmga moslang

lvextend faqat block qurilma hajmini o'zgartiradi — fayl tizimi bu haqda avtomatik bilmaydi. Fayl tizimi turiga qarab qo'shimcha buyruq kerak.

ext4 uchun:

sudo resize2fs /dev/vg_data/lv_app

xfs uchun (faqat mount qilingan holda kengaytirish mumkin):

sudo xfs_growfs /mnt/app

Ikkala buyruqni alohida ishga tushirish o'rniga ext4 uchun buni bitta amalda bajarish mumkin:

sudo lvextend -r -L +10G /dev/vg_data/lv_app

-r flag'i lvextend dan keyin mos resize buyrug'ini avtomatik chaqiradi.

Tekshirish:

df -hT /mnt/app
lvs vg_data/lv_app

Info

ext4 ham, xfs ham onlayn kengaytirishni qo'llab-quvvatlaydi — LV mount qilingan va faol ishlatilayotgan bo'lsa ham hajmni o'zgartirish ishlaydi. Bu LVM’ning eng amaliy afzalliklaridan biri.

LV’ni kichraytirish — nega ehtiyotkorlik kerak

Kengaytirish xavfsiz va deyarli har doim onlayn bajariladi. Kichraytirish esa boshqacha ishlaydi: avval fayl tizimining o'zini kichraytirish kerak va faqat shundan keyin LV hajmini o'sha yangi, kichikroq hajmga moslash mumkin — kengaytirishga teskari tartib.

Danger

Tartibni teskari qilish (fayl tizimini kichraytirishdan oldin LV’ni kichraytirish) ma’lumotlar yo'qolishiga olib keladi: fayl tizimi hali ham eski, kattaroq hajmni kutadi, block qurilma esa allaqachon kichikroq. Bundan tashqari, xfs fayl tizimini umuman kichraytirib bo'lmaydi — faqat kattalashtirish mumkin.

ext4 uchun to'g'ri tartib (avval fayl tizimini unmount qilish tavsiya etiladi):

sudo umount /mnt/app
sudo e2fsck -f /dev/vg_data/lv_app
sudo resize2fs /dev/vg_data/lv_app 15G
sudo lvreduce -L 15G /dev/vg_data/lv_app
sudo mount /dev/vg_data/lv_app /mnt/app

xfs da kichraytirish qo'llab-quvvatlanmagani uchun kerak bo'lganda odatiy yondashuv: yangi, kichikroq LV yaratish, ma’lumotlarni rsync bilan unga ko'chirish, so'ng eski LV’ni o'chirish.

Production’da kichraytirishni hech qachon tekshirilgan zaxira nusxa va texnik xizmat oynasisiz bajarmaslik kerak.

Snapshot’lar: ular nima va qanday ishlaydi

Snapshot LV holatini muayyan lahzada "muzlatib", uni alohida LV sifatida taqdim etadi. Snapshot yaratish o'sha lahzadagi fayllarning to'liq to'plamini nusxalamaydi — LVM faqat keyinchalik asl LV’da o'zgaradigan bloklarni kuzatadi (copy-on-write).

lv_app (original)  ──snapshot──>  lv_app_snap (state at that moment)
     │
     └─ subsequent writes only affect lv_app,
        lv_app_snap keeps showing the unchanged state

Snapshot yaratish

sudo lvcreate -s -n lv_app_snap -L 2G /dev/vg_data/lv_app
  • -s — snapshot yaratish rejimi;
  • -n lv_app_snap — snapshot nomi;
  • -L 2G — snapshot uchun ajratilgan joy. Bu asl LV hajmi emas — faqat o'zgargan bloklarni kuzatish uchun zaxira.

Tekshirish:

sudo lvs -o+lv_size,origin,data_percent

Origin ustuni snapshot qaysi LV’dan olinganini, Data% esa snapshot zaxirasi hozir qanchalik to'lganini ko'rsatadi.

Warning

Agar snapshot uchun ajratilgan joy (-L) to'lib qolsa, snapshot ishlatib bo'lmaydigan (invalid) holatga keladi. Asl LV’ga og'ir yozish davrida snapshot’ni kuzatib boring va Data% qiymatini muntazam tekshiring.

Ko'zdan kechirish uchun snapshot’ni mount qilish

sudo mkdir -p /mnt/app_snap
sudo mount -o ro /dev/vg_data/lv_app_snap /mnt/app_snap

Snapshot’ni faqat o'qish uchun mount qilish tavsiya etiladi — snapshot’ning butun ma’nosi shunda: o'sha lahzadagi holatni ko'zdan kechirish yoki uning zaxira nusxasini olish.

Snapshot’dan ortga qaytarish (asl LV’ni oldingi holatga tiklash)

sudo umount /mnt/app
sudo lvconvert --merge /dev/vg_data/lv_app_snap

lvconvert --merge snapshot holatini asl LV’ga qaytaradi va shu jarayonda snapshot’ni yo'q qiladi. Agar LV faol ishlatilayotgan bo'lsa, merge’ni yakunlash ko'pincha qayta yuklash yoki VG'ni qayta faollashtirishni talab qiladi — buyruq chiqishidagi ogohlantirishni diqqat bilan o'qing.

Danger

lvconvert --merge qaytarib bo'lmaydi: snapshot olingandan beri asl LV’ga yozilgan har bir o'zgarish yo'qoladi. Buni faqat ma’lumotlarni haqiqatan ortga qaytarish kerak bo'lganda, ataylab qabul qilingan va tasdiqlangan qaror sifatida bajaring.

Snapshot’ni olib tashlash (ortga qaytarmasdan)

Agar snapshot faqat vaqtinchalik ko'zdan kechirish yoki zaxira uchun ishlatilgan bo'lsa va asl LV’dagi o'zgarishlarni saqlab qolish kerak bo'lsa:

sudo umount /mnt/app_snap
sudo lvremove /dev/vg_data/lv_app_snap

Bu snapshot’ni butunlay o'chiradi va asl LV’ga hech qanday ta’sir qilmaydi.

Klassik (thick) va thin snapshot’lar

Yuqorida lvcreate -s -L 2G bilan yaratilgan snapshot — klassik (thick) snapshot: VG'ning qat’iy bir qismi oldindan ajratiladi va asl LV’ga yozish shu zaxiradan oshib ketsa, snapshot invalid (ishlatib bo'lmaydigan) holatga keladi. Zamonaviy LVM muqobil variantni taklif qiladi — buning o'rniga thin pool'dan ajratiladigan thin snapshot’lar:

sudo lvcreate -L 50G -T vg_data/thinpool          # create a thin pool
sudo lvcreate -V 20G -T vg_data/thinpool -n lv_app  # a thin LV inside it
sudo lvcreate -s -n lv_app_snap vg_data/lv_app    # snapshot: no -L needed
Jihat Klassik snapshot (-L) Thin snapshot (thin pool)
Hajmni ajratish Yaratishda belgilangan qat’iy zaxira (-L) Kerak bo'lganda umumiy pool’dan oladi
Joy tugab qolishi Snapshot invalid bo'ladi Butun pool to'ladi — asl LV ham, snapshot’lar ham to'xtab qoladi
Snapshot’lar soni Har biri o'z yozish jarimasini olib yuradi Ko'p snapshot pool’ni arzon bo'lishadi
Odatiy foydalanish Yangilanishdan oldin bir martalik "xavfsizlik nuqtasi" Tez-tez/avtomatlashtirilgan snapshot’lar, konteyner saqlash qatlami

Unumdorlik haqidagi eslatma ikkalasiga ham tegishli: klassik snapshot mavjud ekan, asl LV’ga har bir yozish eski blokni snapshot’ga copy-on-write qilishni ishga tushiradi, shuning uchun og'ir yozish yuklamalari snapshot olib tashlanmaguncha sekinroq ishlaydi. Xavf shunchaki "snapshot to'ladi" (klassik) dan "pool to'ladi" (thin) ga ko'chadi — thin pool’larda pool’ning Data% qiymatini kuzating va u tugashidan oldin kattalashishi uchun thin_pool_autoextend_threshold ni sozlang.

Snapshot’dan qachon foydalanish kerak

Vaziyat Snapshot foydalimi?
Katta yangilanishdan oldin "xavfsizlik nuqtasi" olish Ha — biror narsa noto'g'ri ketsa, --merge bilan ortga qaytarish mumkin
Ishlab turgan ma’lumotlar bazasidan izchil zaxira olish Ha — snapshot’ni mount qilib, undan tar/rsync bilan nusxalang
Uzoq muddatli arxivlash Yo'q — snapshot doimiy saqlash uchun mo'ljallanmagan; u asl LV’ga bog'liq bo'lib qoladi
Disk joyini tejash Yo'q — snapshot’ning o'ziga ham qo'shimcha joy kerak

Keng tarqalgan xatolar

Snapshot hajmini juda kichik tanlash

Snapshot’ning -L hajmi asl LV hajmiga qarab emas, asl LV qanchalik o'zgarishi kutilayotganiga qarab tanlanishi kerak. Og'ir yoziladigan LV’dagi kichik snapshot tezda to'ladi va invalid bo'ladi.

resize2fs/xfs_growfs ni unutish

lvextend faqat block qurilma hajmini o'zgartiradi. Mos fayl tizimi darajasidagi buyruq ishga tushmaguncha df eski hajmni ko'rsatishda davom etadi.

xfs ni kichraytirishga urinish

xfs_growfs faqat kattalashtiradi. Agar kichraytirish kerak bo'lsa, yechim fayl tizimini emas, LV’ni almashtirish (yangi LV + ma’lumotlarni ko'chirish).

Mashqlar

  1. O'chirib tashlasa bo'ladigan VM’da oldingi maqoladan qolgan lv_app LV’ni 5 GiB ga kengaytiring va natijani df -hT bilan tasdiqlang.
  2. lv_app dan 1 GiB hajmli snapshot oling, unga fayl yozing (snapshot’ga emas, asl LV’ga), so'ng snapshot’ni mount qilib, Data% qiymatini kuzating.
  3. --merge bilan snapshot’dan ortga qayting va fayl asl LV’dan yo'qolganini tasdiqlang.
  4. ext4 LV’ni to'g'ri tartibda kichraytiring (unmount → fsck → resize2fs → lvreduce) va har bir qadamda natijani tekshiring.

Mashqni bajardim deyish uchun: fayl tizimi turi (ext4 yoki xfs) va maqsadli amal (kengaytirish yoki kichraytirish) berilganda u onlayn, oflayn qo'llab-quvvatlanishini yoki umuman qo'llab-quvvatlanmasligini ayta olishingiz kerak.

Xulosa

lvextend (kerak bo'lsa -r bilan) LV’ni va uning fayl tizimini birga, odatda onlayn kengaytiradi; lvreduce teskari tartibni talab qiladi — avval fayl tizimi, keyin LV — va xfs da umuman qo'llab-quvvatlanmaydi. Snapshot LV’ning muayyan vaqtdagi holatini copy-on-write orqali saqlaydi va uni lvconvert --merge bilan tiklash yoki lvremove bilan tashlab yuborish mumkin. Ikkalasi ham VG'dagi bo'sh joyga bog'liq — shuning uchun Disk bandligi (disk usage) va Disk to'lganda troubleshooting maqolalarida ko'rilgan monitoring LVM muhitida ham xuddi shunday dolzarb qoladi.

Manbalar