मूल बातें

Linux में LVM: भौतिक वॉल्यूम, समूह और लॉजिकल वॉल्यूम व्यवहार में

अपडेट किया गया: · Skillaria.Top

LVM (Logical Volume Manager) Linux में डिस्क और फ़ाइल सिस्टम के बीच की परत है: डिस्क भौतिक वॉल्यूम (PV) बनती हैं, समूह (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

यहाँ 30 GB का वॉल्यूम app दो-दो 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) पर बना है, तो पहले विभाजन बढ़ाएँ, जैसे growpart /dev/sdb 1 से (पैकेज cloud-guest-utils), और फिर 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 के सिद्धांत से काम करता है और स्नैपशॉट में केवल वे ब्लॉक सहेजता है जो स्नैपशॉट बनने के बाद मूल वॉल्यूम पर बदलते हैं। इसलिए स्नैपशॉट को VG में पूरे वॉल्यूम जितनी जगह नहीं, बस बदलावों जितनी जगह चाहिए।

$ 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

मर्ज के बाद स्नैपशॉट ख़त्म हो जाता है। अगर वॉल्यूम अनमाउंट नहीं हो सकता (जैसे सिस्टम का रूट), तो मर्ज अगली बार वॉल्यूम सक्रिय होने तक टल जाता है, यानी रीबूट तक।

अगर सब ठीक रहा

स्नैपशॉट बस हटा दें, ताकि वह लिखने की गति न घटाए और जगह न घेरे:

$ sudo lvremove /dev/data_vg/app_before_upgrade

स्नैपशॉट को केवल पढ़ने के लिए माउंट करना भी सुविधाजनक है, ताकि चल रहे सिस्टम का सुसंगत बैकअप rsync या tar से लिया जा सके: mount -o ro। 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 क्या है?

यह पतले वॉल्यूम हैं: एक pool बनता है (lvcreate --type thin-pool), और उसके वॉल्यूम तभी असल जगह लेते हैं जब उनमें डेटा लिखा जाए। इससे वॉल्यूम का कुल आकार भौतिक जगह से बड़ा दिया जा सकता है, पर pool के भरने पर नज़र रखनी पड़ती है।

डेटा खोए बिना वॉल्यूम समूह से डिस्क कैसे हटाएँ?

उसके एक्सटेंट समूह की दूसरी डिस्क पर pvmove /dev/sdb से ले जाएँ (पर्याप्त खाली जगह चाहिए), फिर vgreduce data_vg /dev/sdb और pvremove /dev/sdb चलाएँ।

इस विषय को वीडियो में सीखें

यह विषय “Linux: с нуля до уверенного администрирования” कोर्स में अभ्यास के साथ विस्तार से समझाया गया है।

कोर्स पर जाएँ