پارتیشن /var سرور پر شده، دیسک دومی با 500 گیگابایت فضای خالی به سرور متصل است، اما با پارتیشن‌بندی سنتی هیچ راه ساده‌ای برای استفاده از آن فضا در مسیر فعلی وجود ندارد. این دقیقاً مشکلی است که LVM (Logical Volume Manager) حل می‌کند: یک سطح انتزاعی بین دیسک‌های فیزیکی و فایل‌سیستم‌ها که اجازه می‌دهد فضا را بدون توقف سرویس افزایش دهید، چند دیسک را به یک فضای واحد تبدیل کنید و پیش از بکاپ یا به‌روزرسانی از داده‌ها Snapshot بگیرید. در این مقاله مفاهیم اصلی LVM، راه‌اندازی عملی روی یک دیسک جدید، افزایش و کاهش حجم، کاربرد Snapshot و اشتباهاتی را که به از دست رفتن داده منجر می‌شوند بررسی می‌کنیم.

LVM چیست و چه مشکلی را حل می‌کند؟

محدودیت پارتیشن‌بندی سنتی

در مدل سنتی، هر پارتیشن یک بازه پیوسته از سکتورهای یک دیسک است. اگر /home پر شود، تغییر اندازه نیازمند آفلاین کردن سیستم و ابزارهایی مانند GParted است؛ و اگر فضای خالی در دیسک دیگری باشد، اصلاً امکان‌پذیر نیست. تصمیم روز نصب درباره اندازه هر پارتیشن تا آخر با شما می‌ماند و در سرورهایی که سال‌ها کار می‌کنند، این تصمیم تقریباً همواره اشتباه از آب درمی‌آید.

سه سطح LVM

LVM این وابستگی را با سه سطح انتزاع می‌شکند. Physical Volume یا PV یک دیسک یا پارتیشن است که برای LVM علامت‌گذاری شده است. یک یا چند PV در یک Volume Group یا VG جمع می‌شوند که مانند یک استخر واحد از فضا عمل می‌کند. از این استخر، Logical Volume ها یا LV ها بریده می‌شوند که از دید سیستم‌عامل دقیقاً مانند یک پارتیشن معمولی رفتار می‌کنند و روی آن‌ها فایل‌سیستم ساخته می‌شود. فایل‌سیستم دیگر اهمیتی نمی‌دهد که داده‌هایش روی کدام دیسک فیزیکی قرار دارد.

Extent: واحد ساختمانی LVM

فضای هر VG به بلوک‌های هم‌اندازه‌ای به نام Physical Extent تقسیم می‌شود که اندازه پیش‌فرض آن 4 مگابایت است. هر LV فهرستی از این extent ها است که لزوماً پیوسته یا روی یک دیسک نیستند. همین ساختار افزودن فضا به یک LV را به «اختصاص چند extent آزاد دیگر» تبدیل می‌کند و جابه‌جایی داده بین دیسک‌ها را با pvmove در حال کار ممکن می‌سازد.

اصطلاحات کلیدی LVM در یک جدول

اصطلاحمعنادستورهای مرتبط
PV (Physical Volume)دیسک یا پارتیشن آماده‌شده برای LVMpvcreate، pvs، pvdisplay، pvmove
VG (Volume Group)استخر فضای تشکیل‌شده از یک یا چند PVvgcreate، vgs، vgextend، vgreduce
LV (Logical Volume)حجم منطقی که فایل‌سیستم روی آن ساخته می‌شودlvcreate، lvs، lvextend، lvreduce، lvremove
Snapshotتصویر لحظه‌ای از یک LV با مکانیزم copy-on-writelvcreate -s، lvconvert --merge
Thin Poolاستخری که LV های آن فقط به اندازه داده واقعی فضا مصرف می‌کنندlvcreate --thinpool، lvcreate -V

راه‌اندازی LVM روی یک دیسک جدید قدم‌به‌قدم

فرض کنید دیسک جدیدی با نام /dev/sdb به سرور اضافه شده است و می‌خواهید آن را برای داده‌های دیتابیس در /var/lib/mysql آماده کنید. در Ubuntu 24.04 و AlmaLinux بسته lvm2 به‌طور پیش‌فرض نصب است.

  1. دیسک را با lsblk شناسایی کنید و مطمئن شوید روی آن داده‌ای نیست.
  2. آن را به PV تبدیل کنید: pvcreate /dev/sdb (کل دیسک بدون جدول پارتیشن قابل استفاده است).
  3. یک VG بسازید: vgcreate vg_data /dev/sdb.
  4. یک LV با 80 درصد فضا بسازید تا جا برای Snapshot بماند.
  5. فایل‌سیستم بسازید و mount کنید؛ برای دیتابیس XFS یا ext4 هر دو مناسب‌اند.
  6. در /etc/fstab مسیر LV یا UUID آن را ثبت کنید تا پس از ریبوت خودکار mount شود.
pvcreate /dev/sdb
vgcreate vg_data /dev/sdb
lvcreate -n lv_mysql -l 80%VG vg_data
mkfs.xfs /dev/vg_data/lv_mysql
mkdir -p /var/lib/mysql
mount /dev/vg_data/lv_mysql /var/lib/mysql

مشاهده وضعیت با pvs، vgs و lvs

سه دستور pvs، vgs و lvs خلاصه‌ای یک‌خطی از هر سطح می‌دهند و نسخه‌های display آن‌ها جزئیات کامل را نشان می‌دهند. ستون VFree در خروجی vgs مهم‌ترین عدد برای برنامه‌ریزی است: فضای تخصیص‌نیافته‌ای که می‌توانید به LV ها اضافه کنید یا برای Snapshot نگه دارید.

افزایش فضا بدون توقف سرویس

اضافه کردن دیسک جدید به VG

وقتی VG فضای آزاد ندارد، دیسک جدید را با pvcreate /dev/sdc آماده و با vgextend vg_data /dev/sdc به استخر اضافه کنید. از این لحظه extent های دیسک جدید برای همه LV های آن VG قابل استفاده‌اند. در سرورهای مجازی که دیسک موجود بزرگ‌تر شده است، ابتدا پارتیشن را با growpart گسترش دهید و سپس pvresize /dev/sda3 را اجرا کنید تا LVM اندازه جدید را ببیند.

lvextend با گزینه -r

افزایش حجم LV و فایل‌سیستم با یک دستور انجام می‌شود: lvextend -r -L +50G /dev/vg_data/lv_mysql یا برای مصرف همه فضای آزاد lvextend -r -l +100%FREE. گزینه -r پس از بزرگ شدن LV به‌طور خودکار resize2fs را برای ext4 یا xfs_growfs را برای XFS اجرا می‌کند. هر دو فایل‌سیستم به‌صورت آنلاین و در حالی که دیتابیس در حال کار است رشد می‌کنند. بدون -r فقط LV بزرگ می‌شود و df همچنان اندازه قدیمی را نشان می‌دهد.

کاهش حجم: فقط ext4 و فقط آفلاین

کوچک کردن LV داستان متفاوتی دارد. XFS اصلاً از کاهش اندازه پشتیبانی نمی‌کند و تنها راه، ساخت LV جدید و انتقال داده است. ext4 قابل کوچک شدن است اما باید ابتدا unmount شود، با e2fsck -f بررسی شود و سپس lvreduce -r -L 100G اجرا شود که فایل‌سیستم را پیش از LV کوچک می‌کند. اگر LV را کوچک‌تر از فایل‌سیستم کنید، داده‌های انتهای آن بی‌بازگشت از بین می‌روند؛ پس LV ها را از ابتدا کوچک بسازید و با رشد نیاز بزرگ کنید.

Snapshot در LVM: بکاپ سازگار بدون قفل طولانی

ساخت و حذف Snapshot

Snapshot یک تصویر لحظه‌ای از یک LV است که ساخت آن کسری از ثانیه‌ طول می‌کشد. کاربرد اصلی آن گرفتن بکاپ سازگار از دیتابیس است: جداول را برای یک لحظه با FLUSH TABLES WITH READ LOCK قفل کنید، Snapshot بسازید، قفل را آزاد کنید و سپس از Snapshot بکاپ بگیرید در حالی که دیتابیس به کار خود ادامه می‌دهد. کاربرد دوم، نقطه بازگشت پیش از به‌روزرسانی بزرگ است؛ اگر مشکلی پیش آمد با lvconvert --merge به وضعیت قبل برمی‌گردید.

lvcreate -s -n snap_mysql -L 20G /dev/vg_data/lv_mysql
mount -o ro,nouuid /dev/vg_data/snap_mysql /mnt/snap
rsync -a /mnt/snap/ /backup/mysql/
umount /mnt/snap
lvremove -y /dev/vg_data/snap_mysql

محدودیت‌های copy-on-write

Snapshot کپی کامل داده نیست؛ فقط بلوک‌هایی که پس از ساخت آن در LV اصلی تغییر می‌کنند، نسخه قدیمی‌شان در فضای Snapshot ذخیره می‌شود. اندازه‌ای که با -L تعیین می‌کنید باید برای حجم تغییرات در طول عمر Snapshot کافی باشد؛ اگر پر شود، Snapshot نامعتبر می‌شود و بکاپ ناقص خواهد بود. همچنین هر نوشتن در LV اصلی تا زمانی که Snapshot وجود دارد عملیات اضافی ایجاد می‌کند، بنابراین Snapshot را کوتاه‌عمر نگه دارید و پر شدن آن را با ستون Data% در lvs پایش کنید.

Thin Provisioning

در حالت Thin، یک thin pool ساخته می‌شود و LV های داخل آن فقط به اندازه داده‌ای که واقعاً نوشته‌اند فضا مصرف می‌کنند و Snapshot های thin محدودیت اندازه ثابت ندارند. این مدل در سرورهای مجازی‌سازی مانند Proxmox رایج است، اما نیازمند مانیتورینگ دقیق است، چون پر شدن pool باعث خطای I/O در همه LV ها می‌شود.

اشتباهات رایج و نکات ایمنی

  • اجرای lvextend بدون -r و تعجب از اینکه df تغییری نشان نمی‌دهد.
  • کوچک کردن LV پیش از فایل‌سیستم که به تخریب داده منجر می‌شود.
  • تخصیص 100 درصد VG به LV ها و نداشتن فضایی برای Snapshot در روز بحران.
  • تصور اینکه LVM جایگزین RAID است: LVM افزونگی ایجاد نمی‌کند و با خرابی یک دیسک، همه LV هایی که روی آن extent دارند آسیب می‌بینند. RAID باید زیر LVM باشد، نه به جای آن.
  • نگهداری Snapshot برای روزها و متعجب شدن از افت شدید کارایی نوشتن.

چه زمانی به LVM نیاز ندارید؟

LVM یک سطح پیچیدگی اضافه می‌کند و در هر سروری لازم نیست. روی بیشتر سرورهای مجازی که یک دیسک مجازی قابل تغییر اندازه دارند، افزایش فضا با growpart و resize2fs بدون LVM هم انجام می‌شود و تصاویر آماده بسیاری از ارائه‌دهندگان به همین دلیل LVM ندارند. در مقابل، روی سرور اختصاصی با چند دیسک NVMe، نیاز به Snapshot برای بکاپ دیتابیس، یا سرورهای مجازی‌سازی، LVM تقریباً ضروری است. هزینه کوچک یادگیری LVM در روز نصب، ساعت‌ها داون‌تایم آینده را جبران می‌کند.

جمع‌بندی

LVM با جدا کردن فایل‌سیستم از دیسک فیزیکی، انعطافی فراهم می‌کند که پارتیشن‌بندی سنتی هرگز نداشت: افزایش فضا در حال کار، ادغام چند دیسک و Snapshot برای بکاپ سازگار. سه مفهوم PV، VG و LV و دستورهای pvcreate، vgcreate، lvcreate و lvextend -r برای شروع کافی‌اند. همواره بخشی از VG را آزاد نگه دارید، Snapshot ها را کوتاه‌عمر بسازید و به یاد داشته باشید که LVM نه افزونگی است و نه جایگزین بکاپ.

سوالات متداول

آیا می‌توان LVM را روی سرور در حال کار بدون نصب مجدد فعال کرد؟

برای پارتیشن ریشه، تبدیل درجا بسیار پرخطر است و پیشنهاد نمی‌شود. روش عملی این است که LVM را روی دیسک جدید بسازید، داده‌های پرتغییر مانند /var/lib/mysql را به LV منتقل کنید و پارتیشن ریشه را به حال خود بگذارید.

تفاوت LVM و RAID چیست؟

RAID برای افزونگی و تحمل خرابی دیسک است و LVM برای انعطاف در مدیریت فضا. در سرورهای اختصاصی معمولاً mdadm یا RAID سخت‌افزاری زیر LVM قرار می‌گیرد تا هر دو مزیت به دست آید.

چگونه فضای LV را بدون ریبوت افزایش دهم؟

اگر VG فضای آزاد دارد، lvextend -r -L +20G /dev/vg/lv کافی است و فایل‌سیستم به‌صورت آنلاین بزرگ می‌شود. اگر VG پر است، ابتدا دیسک جدید را با vgextend اضافه کنید یا در سرور مجازی پس از بزرگ کردن دیسک، growpart و pvresize را اجرا کنید.

Snapshot در LVM چقدر فضا نیاز دارد؟

به اندازه حجم تغییراتی که در طول عمر Snapshot روی LV اصلی رخ می‌دهد. برای بکاپ شبانه‌ای که یک ساعت طول می‌کشد، معمولاً 10 تا 20 درصد اندازه LV کافی است، اما این یک قاعده سرانگشتی است و باید با ستون Data% در lvs پایش شود.

آیا LVM سرعت دیسک را کم می‌کند؟

سربار LVM در حالت عادی ناچیز است، چون فقط یک جدول نگاشت ساده در device-mapper است. افت محسوس فقط زمانی رخ می‌دهد که Snapshot فعال باشد و با حذف آن پس از بکاپ، کارایی به حالت عادی برمی‌گردد.