মৌলিক

Linux-এ LVM: ফিজিক্যাল ভলিউম, গ্রুপ ও লজিক্যাল ভলিউম হাতে-কলমে

হালনাগাদ: · Skillaria.Top

LVM (Logical Volume Manager) Linux-এ ডিস্ক ও ফাইল সিস্টেমের মাঝখানের একটি স্তর: ডিস্ক হয় ফিজিক্যাল ভলিউম (PV), একাধিক PV মিলে হয় ভলিউম গ্রুপ (VG), আর VG থেকে যেকোনো আকারের লজিক্যাল ভলিউম (LV) কাটা যায়। মূল সুবিধা — ভলিউম চালু অবস্থাতেই lvextend -r দিয়ে বাড়ানো যায়, গ্রুপে নতুন ডিস্ক যোগ করা যায় সার্ভিস বন্ধ না করে, আর ঝুঁকিপূর্ণ কাজের আগে স্ন্যাপশট নেওয়া যায়।

LVM (Logical Volume Manager) Linux-এর একটি ভলিউম ম্যানেজার, যা ফাইল সিস্টেমকে ফিজিক্যাল ডিস্ক থেকে আলাদা করে। /var-কে সরাসরি /dev/sdb1 পার্টিশনের সঙ্গে আটকে রাখার বদলে আপনি ডিস্কগুলো একটি সাধারণ পুলে রাখেন এবং সেখান থেকে প্রয়োজনমতো আকারের ভলিউম কাটেন। জায়গা কম পড়লে ভলিউম একটি কমান্ডেই বাড়ে — রিবুট বা সার্ভিস বন্ধ ছাড়াই। নিচে দেখানো হবে Linux-এ LVM কীভাবে কাজ করে, শূন্য থেকে ভলিউম কীভাবে বানাতে হয়, বাড়াতে হয়, স্ন্যাপশট নিতে হয়, আর সাধারণ ভুলে ডেটা কীভাবে বাঁচাতে হয়।

সাধারণ পার্টিশন থাকতে LVM কেন দরকার

সাধারণ পার্টিশন একটি ডিস্কের একটানা একটি অংশ। তার আকার ঠিক হয় বিভাজনের সময়, আর তা বাড়ানো যায় শুধু তার ঠিক পরে খালি জায়গা থাকলে। ডিস্ক ভরে গেলে নতুন ডিস্ক কিনতে হয়, ডেটা সরাতে হয়, /etc/fstab বদলাতে হয়, আর সার্ভিসও বন্ধ রাখতে হয়।

LVM তিনটি সমস্যা সমাধান করে:

  • নমনীয় আকার। লজিক্যাল ভলিউম যেকোনো সময় বাড়ানো যায় (ext4-এর ক্ষেত্রে কমানোও যায়)।
  • ডিস্ক একত্রীকরণ। কয়েকটি ফিজিক্যাল ডিস্ক একটি পুলে পরিণত হয়; একটি ভলিউম একসঙ্গে দুটি ডিস্কে থাকতে পারে।
  • স্ন্যাপশট। আপডেট, ডেটাবেস স্থানান্তর বা অন্য ঝুঁকিপূর্ণ কাজের আগে ভলিউমের তাৎক্ষণিক ছবি।

এই কারণে Ubuntu Server, RHEL, Rocky ও AlmaLinux-এর ইনস্টলার ডিফল্টভাবে LVM প্রস্তাব করে, আর ডেটার সার্ভারে প্রায় সবসময়ই এটি ব্যবহার হয়।

LVM-এর তিন স্তর: PV, VG ও LV

LVM-এর পুরো যুক্তি তিনটি ধারণায় সীমাবদ্ধ। একটি সহজ তুলনা: ডিস্ক হলো আটার বস্তা, গ্রুপ হলো সাধারণ গুদাম, আর লজিক্যাল ভলিউম হলো সেই গুদাম থেকে মেপে নেওয়া ভাগ।

স্তরএটি কীনামের উদাহরণকোন কমান্ডে তৈরি
PV (Physical Volume)LVM-এর জন্য চিহ্নিত ডিস্ক বা পার্টিশন/dev/sdb, /dev/sdc1pvcreate
VG (Volume Group)এক বা একাধিক PV মিলে তৈরি পুলdata_vgvgcreate
LV (Logical Volume)VG থেকে কাটা ভলিউম; তার ওপর ফাইল সিস্টেম বানানো হয়/dev/data_vg/applvcreate

VG-এর ভেতরে জায়গা ভাগ হয় এক্সটেন্ট (PE, physical extents) — নির্দিষ্ট আকারের ব্লকে, ডিফল্টে 4 MiB। লজিক্যাল ভলিউম আসলে কিছু এক্সটেন্টের সেট, যেগুলো পাশাপাশি থাকতে হয় না এবং ভিন্ন ডিস্কেও থাকতে পারে। এ কারণেই ভলিউম বাড়ানো এত সহজ: LVM যেকোনো জায়গা থেকে খালি এক্সটেন্ট যোগ করে দেয়।

লজিক্যাল ভলিউমের ডিভাইসে দুটি সমান পথে পৌঁছানো যায়: /dev/data_vg/app ও /dev/mapper/data_vg-app। ভেতরে এটি কার্নেলের device-mapper ডিভাইস।

আগে থেকে কী আছে দেখা

প্রথমে নিশ্চিত হন প্যাকেজটি ইনস্টল আছে: Debian ও Ubuntu-তে এটি lvm2 (sudo apt install lvm2), RHEL পরিবারে এটি ডিফল্টে থাকে। পুরো চিত্র দেখতে সংক্ষিপ্ত ও বিস্তারিত কমান্ড আছে:

$ 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

বিস্তারিত দেখায় pvdisplay, vgdisplay ও lvdisplay। সাধারণ পার্টিশনের সঙ্গে একসঙ্গে পুরো ছবি দেখায় lsblk: লজিক্যাল ভলিউম সেখানে lvm ধরনে দেখা যায়।

$ 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

দেখা যাচ্ছে app ভলিউমটি 30 GB, যা একসঙ্গে দুটি 20 GB ডিস্কে আছে — সাধারণ পার্টিশনে এমনটি সম্ভব নয়।

শূন্য থেকে LVM: কাঁচা ডিস্ক থেকে মাউন্ট করা ভলিউম

ধরা যাক সার্ভারে একটি খালি ডিস্ক /dev/sdb যুক্ত হয়েছে, আর অ্যাপ্লিকেশনের ডেটার জন্য 15 GB ভলিউম লাগবে। lsblk দিয়ে ডিস্কের নাম দুবার যাচাই করুন: নিচের প্রতিটি কমান্ড নির্দিষ্ট ডিভাইসের ডেটা মুছে দেয়।

ধাপ 1. ফিজিক্যাল ভলিউম তৈরি

$ sudo pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

LVM-কে পুরো ডিস্ক দেওয়া যায়, অথবা আগে fdisk বা parted দিয়ে “Linux LVM” ধরনের একটি পার্টিশন বানিয়ে (/dev/sdb1) সেটি দেওয়া যায়। পার্টিশন অন্য প্রশাসকদের কাছে বেশি স্পষ্ট এবং LVM-এর ওপর ভুল করে নতুন করে ডিস্ক ভাগ করার ঝুঁকি কমায়; আবার ক্লাউডে পুরো ডিস্ক বাড়ানো সহজ।

ধাপ 2. ভলিউম গ্রুপ তৈরি

$ sudo vgcreate data_vg /dev/sdb
  Volume group "data_vg" successfully created

ধাপ 3. লজিক্যাল ভলিউম কাটা

$ sudo lvcreate -n app -L 15G data_vg
  Logical volume "app" created.

-L নির্দিষ্ট আকার দেয়, -l দেয় এক্সটেন্ট বা শতাংশে আকার: -l 100%FREE গ্রুপের সব খালি জায়গা নেবে, -l 50%VG — অর্ধেক গ্রুপ। VG-তে কিছু খালি জায়গা রাখা ভালো অভ্যাস: পরে যেকোনো ভলিউমে বা স্ন্যাপশটের জন্য তা কাজে লাগবে।

ধাপ 4. ফাইল সিস্টেম ও মাউন্ট

$ 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

রিবুটের পরেও ভলিউম মাউন্ট রাখতে /etc/fstab-এ একটি লাইন যোগ করুন। লজিক্যাল ভলিউমের /dev/mapper/... পথ স্থির থাকে, তাই সেটি বা blkid-এর UUID ব্যবহার করা যায়:

/dev/mapper/data_vg-app  /srv/app  ext4  defaults  0 2

রিবুটের আগে sudo mount -a দিয়ে লাইনটি যাচাই করুন: fstab-এর ভুল সার্ভারকে জরুরি মোডে আটকে দিতে পারে।

সার্ভিস বন্ধ না করে LVM ভলিউম বাড়ানো

LVM ভালোবাসার মূল কারণ এটিই। ভলিউম বাড়ে চালু থাকা ফাইল সিস্টেমের ওপর, আর অ্যাপ্লিকেশন ডেটা লিখতেই থাকে। গ্রুপে খালি জায়গা আছে কি না, তার ওপর পদ্ধতি নির্ভর করে।

VG-তে খালি জায়গা থাকলে

$ 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

মূল পতাকা — -r (--resizefs): ভলিউম বাড়ানোর পরপরই এটি ফাইল সিস্টেমও বাড়ায়। এটি না থাকলে ভলিউম বড় হবে, কিন্তু df -h পুরনো আকার দেখাবে, কারণ ফাইল সিস্টেম নতুন জায়গার খবর জানে না। এটি সবচেয়ে সাধারণ ভুল: এমন হলে ext4-এর জন্য resize2fs, আর XFS-এর জন্য xfs_growfs হাতে চালালেই হবে।

$ sudo resize2fs /dev/data_vg/app      # ext4, ডিভাইস দিতে হয়
$ sudo xfs_growfs /srv/app             # XFS, মাউন্ট পয়েন্ট দিতে হয়

খেয়াল রাখুন: -L +4G 4 GB যোগ করে, আর -L 4G মোট আকার 4 GB করে। ভলিউমকে গ্রুপের বাকি সব খালি জায়গা দিতে -l +100%FREE ব্যবহার করুন।

VG-তে জায়গা ফুরিয়ে গেলে: নতুন ডিস্ক যোগ

নতুন ডিস্ক যুক্ত করুন (ক্লাউডে ভলিউম সংযুক্ত করুন), lsblk দিয়ে খুঁজে গ্রুপে যোগ করুন:

$ 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

তিনটি কমান্ড, শূন্য বিরতি। ফাইল সিস্টেম এখন দুটি ডিস্কে ছড়ানো, আর অ্যাপ্লিকেশন তা টেরও পায় না।

ক্লাউডে ডিস্ক বড় করা হলে

ক্লাউডে প্রায়ই নতুন ডিস্ক যোগের বদলে বিদ্যমান ডিস্ক বড় করা সহজ। তখন কার্নেল ডিভাইসের নতুন আকার দেখে, আর ফিজিক্যাল ভলিউম pvresize দিয়ে প্রসারিত করতে হয়:

$ sudo pvresize /dev/sdb
  Physical volume "/dev/sdb" changed
$ sudo lvextend -r -l +100%FREE /dev/data_vg/app

PV যদি পার্টিশনে (/dev/sdb1) বানানো হয়ে থাকে, আগে পার্টিশনটি বড় করুন, যেমন cloud-guest-utils প্যাকেজের growpart /dev/sdb 1 দিয়ে, তারপর pvresize /dev/sdb1।

LVM ভলিউম কি ছোট করা যায়

যায়, তবে সব ফাইল সিস্টেমে এবং চালু অবস্থায় নয়। XFS একেবারেই ছোট করা যায় না — শুধু ডেটা সরিয়ে নতুন করে বানাতে হয়। Ext4 ছোট করা যায়, কিন্তু শুধু আনমাউন্ট অবস্থায়:

$ sudo umount /srv/app
$ sudo lvreduce -r -L 10G /dev/data_vg/app

-r সহ LVM নিজেই ফাইল সিস্টেম যাচাই (e2fsck) করে এবং ভলিউম কমানোর আগে তা ছোট করে। -r ছাড়া ভলিউম এমনভাবে কাটা যায় যে তা ফাইল সিস্টেমের চেয়ে ছোট হয়ে যায় এবং ডেটা নষ্ট হয়। ছোট করার আগে সবসময় ব্যাকআপ নিন।

LVM স্ন্যাপশট: ঝুঁকির আগে ভলিউমের ছবি

স্ন্যাপশট হলো লজিক্যাল ভলিউমের তাৎক্ষণিক ছবি। এটি মুহূর্তের মধ্যে তৈরি হয় এবং ডেটা নকল করে না: LVM copy-on-write পদ্ধতিতে কাজ করে, আর স্ন্যাপশট তৈরির পরে মূল ভলিউমের যেসব ব্লক বদলায়, শুধু সেগুলোই সংরক্ষণ করে। তাই স্ন্যাপশটের জন্য গ্রুপে পুরো ভলিউমের জায়গা নয়, শুধু পরিবর্তনের জন্য জায়গা লাগে।

$ 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% কলাম দেখায় পরিবর্তন-সংরক্ষণের জায়গা কতটা ভরা। 100%-এ পৌঁছালে ক্লাসিক স্ন্যাপশট অকার্যকর হয়ে যায় এবং শুধু মুছে ফেলা যায়। আকার ঠিক করুন প্রত্যাশিত পরিবর্তনের চেয়ে কিছু বেশি রেখে, আর দীর্ঘ সময় থাকা স্ন্যাপশট lvs দিয়ে নজরে রাখুন, প্রয়োজনে lvextend দিয়ে বাড়ান।

স্ন্যাপশটে ফিরে যাওয়া

আপডেট ভালো না গেলে ভলিউমকে স্ন্যাপশটের সময়ের অবস্থায় ফিরিয়ে আনুন:

$ 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

মার্জ হয়ে গেলে স্ন্যাপশট আর থাকে না। ভলিউম আনমাউন্ট করা না গেলে (যেমন সিস্টেমের root), মার্জ অপেক্ষা করবে পরের সক্রিয়করণ পর্যন্ত, অর্থাৎ রিবুট পর্যন্ত।

সব ঠিক থাকলে

স্ন্যাপশটটি মুছে ফেলা হয়, যাতে তা লেখার গতি না কমায় এবং জায়গা না নেয়:

$ sudo lvremove /dev/data_vg/app_before_upgrade

চলমান সিস্টেমের সামঞ্জস্যপূর্ণ ব্যাকআপ নিতে স্ন্যাপশট শুধু পড়ার জন্য মাউন্ট করা সুবিধাজনক: mount -o ro এবং rsync বা tar দিয়ে কপি। XFS-এর ক্ষেত্রে nouuid অপশন যোগ করুন, নইলে মূল ভলিউমের সঙ্গে UUID মিলে যাওয়ায় মাউন্ট ব্যর্থ হবে।

LVM ও RAID: কাজ আলাদা

LVM নিজে ডিস্ক বিকল হওয়া থেকে রক্ষা করে না। ভলিউম যদি দুটি ডিস্কে ছড়ানো থাকে আর একটি মারা যায়, তাহলে অর্ধেক নয়, পুরো ভলিউমই হারিয়ে যায়। নির্ভরযোগ্যতার জন্য LVM-এর নিচে RAID (mdadm) রাখা হয়, অথবা LVM-এর নিজস্ব মিরর মোড ব্যবহার করা হয় (lvcreate --type raid1 -m 1)।

আর RAID বা স্ন্যাপশট কোনোটিই ব্যাকআপের বদল নয়। স্ন্যাপশট মূল ভলিউমের একই ডিস্কে থাকে, আর RAID বাধ্যভাবে দুর্ঘটনাক্রমে করা rm -rf-ও মিরর করে। আলাদা মাধ্যমে আলাদা কপি রাখতে হবে।

LVM-এর কমান্ড-সংক্ষেপ

কাজকমান্ড
PV, VG, LV-এর সংক্ষিপ্ত তালিকাpvs, vgs, lvs
ফিজিক্যাল ভলিউম তৈরিpvcreate /dev/sdb
গ্রুপ তৈরিvgcreate data_vg /dev/sdb
গ্রুপে ডিস্ক যোগvgextend data_vg /dev/sdc
ভলিউম তৈরিlvcreate -n app -L 15G data_vg
ভলিউম ও ফাইল সিস্টেম বাড়ানোlvextend -r -L +5G /dev/data_vg/app
ডিস্ক বড় করার পর PV বাড়ানোpvresize /dev/sdb
স্ন্যাপশটlvcreate -s -n snap -L 2G /dev/data_vg/app
স্ন্যাপশটে ফেরতlvconvert --merge /dev/data_vg/snap
গ্রুপ থেকে ডিস্ক সরানোpvmove /dev/sdb, তারপর vgreduce data_vg /dev/sdb
ভলিউম মোছাlvremove /dev/data_vg/app

সাধারণ ভুল

  • ভলিউম বাড়ল, কিন্তু df পুরনো আকার দেখায়। -r ভুলে গেছেন। resize2fs বা xfs_growfs চালান।
  • Insufficient free space. গ্রুপে খালি এক্সটেন্ট নেই: vgs দেখুন, এবং vgextend দিয়ে ডিস্ক যোগ করুন অথবা PV বাড়ান।
  • Device /dev/sdc excluded by a filter. ডিস্কে পুরনো পার্টিশন টেবিল বা ফাইল সিস্টেমের চিহ্ন রয়ে গেছে। ডেটা নিশ্চিতভাবে দরকার না থাকলে wipefs -a /dev/sdc দিয়ে তা মুছুন।
  • স্ন্যাপশট Invalid হয়ে গেছে। পরিবর্তন-সংরক্ষণের জায়গা 100% ভরে গেছে। একে আর ফেরানো যায় না — শুধু মুছে ফেলা যায়, আর পরের বার বেশি জায়গা বরাদ্দ করতে হবে।

সারসংক্ষেপ

Linux-এর LVM তিনটি স্তরে কাজ করে: ফিজিক্যাল ভলিউম (PV) মিলে গ্রুপ (VG) হয়, আর গ্রুপ থেকে কাটা হয় লজিক্যাল ভলিউম (LV)। এতে সাধারণ পার্টিশনে যা মেলে না তা পাওয়া যায়: lvextend -r দিয়ে চালু অবস্থায় ভলিউম বাড়ানো, সার্ভিস বন্ধ না করে ডিস্ক যোগ করা, এবং ঝুঁকির আগে স্ন্যাপশট। মনে রাখবেন, LVM RAID বা ব্যাকআপের বিকল্প নয়। ডিস্ক বিভাজন, LVM, RAID ও কোটা নিয়ে হাতে-কলমে আলোচনা হয়েছে Linux কোর্সের একটি লেকচারে।

সাধারণ প্রশ্ন

চালু থাকা ডেটার পার্টিশন কি সরাসরি LVM-এ বদলানো যায়?

সরাসরি না: pvcreate ডিভাইসের শুরুর অংশ লিখে ফেলে। অন্য ডিস্কে LVM বানিয়ে rsync দিয়ে ডেটা কপি করুন, fstab ঠিক করুন, তারপর পুরনো পার্টিশন ছাড়ুন।

LVM কি ডিস্কের কাজের গতি কমায়?

স্ন্যাপশট ছাড়া device-mapper-এর খরচ প্রায় চোখে পড়ে না। সক্রিয় ক্লাসিক স্ন্যাপশট copy-on-write-এর কারণে মূল ভলিউমে লেখার গতি কমায়, তাই সেগুলো সপ্তাহের পর সপ্তাহ রাখা উচিত নয়।

বাড়ির কম্পিউটার বা ল্যাপটপে কি LVM দরকার?

বাধ্যতামূলক নয়, তবে ডিস্ক এনক্রিপশনে (LUKS-এর ভেতরে LVM) এবং পার্টিশন নতুন করে না সাজিয়ে আকার বদলাতে চাইলে কাজে লাগে। ডেটার সার্ভারে LVM প্রায় মানক ব্যবস্থা।

LVM-এর thin provisioning কী?

এটি পাতলা ভলিউম: একটি পুল বানানো হয় (lvcreate --type thin-pool), আর পুলের ভলিউম শুধু লেখা ডেটার অনুপাতে জায়গা নেয়। এতে ভলিউমগুলোকে বাস্তবে থাকার চেয়ে বেশি আকার দেওয়া যায়, কিন্তু পুল কতটা ভরল তা নজরে রাখতে হয়।

ডেটা না হারিয়ে ভলিউম গ্রুপ থেকে ডিস্ক কীভাবে সরাবেন?

pvmove /dev/sdb দিয়ে তার এক্সটেন্টগুলো গ্রুপের অন্য ডিস্কে সরান (যথেষ্ট খালি জায়গা লাগবে), তারপর vgreduce data_vg /dev/sdb এবং pvremove /dev/sdb চালান।

ভিডিওতে বিষয়টি শিখুন

“Linux: с нуля до уверенного администрирования” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।

কোর্সে যান