Linux डिवाइस-मैपर मैप्स LVM PV स्नैपशॉट लेते समय LV के अंदर नेस्टेड करता है


13

जो वास्तव में इस मशीन का बैकअप लेने की मेरी योजना के साथ खिलवाड़ कर रहा है ...

मेरे पास एक सर्वर है जो कई वर्चुअल मशीनों के लिए KVM हाइपरवाइजर है। इनमें से एक डॉकर चला रहा है। इसका डॉकटर वॉल्यूम / देव / vdb पर है, जिसे LVM PV के रूप में स्थापित किया गया है, जिस पर Docker अपने डायरेक्ट-lvm ड्राइवर का उपयोग Docker कंटेनर डेटा को स्टोर करने के लिए करता है। यह वर्चुअल डिस्क होस्ट के स्थानीय डिस्क पर LVM LV है।

मेजबान और अतिथि दोनों फेडोरा 21 चलाते हैं।

इस खंड का मेजबान का दृष्टिकोण है (केवल प्रासंगिक मात्रा दर्शाई गई है):

[root@host ~]# lvs
  LV                           VG         Attr       LSize
  docker2.example.com-volumes vm-volumes -wi-ao---- 40.00g
[root@host ~]# dmsetup ls --tree
vm--volumes-docker2.example.com--volumes (253:10)
 └─ (9:125)

इस वॉल्यूम का अतिथि दृश्य (फिर से, केवल प्रासंगिक वॉल्यूम दिखाया गया है):

[root@docker2 ~]# pvs
  PV         VG             Fmt  Attr PSize  PFree
  /dev/vdb   docker-volumes lvm2 a--  40.00g    0 

होस्ट पर अन्य सभी LVM संस्करणों के साथ, मैं स्नैपशॉट ले सकता हूं, स्नैपशॉट lvcreate --snapshotबैकअप कर सकता हूं और फिर lvremoveबिना किसी समस्या के। लेकिन इस विशेष वॉल्यूम के साथ, मैं इसे नहीं कर सकता lvremoveक्योंकि यह उपयोग में है:

[root@host ~]# lvremove /dev/vm-volumes/snap-docker2.example.com-volumes 
  Logical volume vm-volumes/snap-docker2.example.com-volumes is used by another device.

आखिरकार मुझे पता चला कि मेजबान पर डिवाइस-मैपर ने किसी तरह पता लगाया था कि इस तार्किक वॉल्यूम स्नैपशॉट में LVM PV है, और फिर स्नैपशॉट के होस्ट के भीतर तार्किक संस्करणों को मैप करने के लिए आगे बढ़ा (केवल प्रासंगिक वॉल्यूम दिखाए गए हैं)

[root@host ~]# dmsetup ls --tree
vm--volumes-docker2.example.com--volumes (253:10)
 └─vm--volumes-docker2.example.com--volumes-real (253:14)
    └─ (9:125)
docker--volumes-docker--data (253:18)
 └─vm--volumes-snap--docker2.example.com--volumes (253:16)
    ├─vm--volumes-snap--docker2.example.com--volumes-cow (253:15)
    │  └─ (9:125)
    └─vm--volumes-docker2.example.com--volumes-real (253:14)
       └─ (9:125)
docker--volumes-docker--meta (253:17)
 └─vm--volumes-snap--docker2.example.com--volumes (253:16)
    ├─vm--volumes-snap--docker2.example.com--volumes-cow (253:15)
    │  └─ (9:125)
    └─vm--volumes-docker2.example.com--volumes-real (253:14)
       └─ (9:125)

ये VM के अंदर तार्किक संस्करणों के समान हैं:

[root@docker2 ~]# lvs
  LV          VG             Attr       LSize
  docker-data docker-volumes -wi-ao---- 39.95g
  docker-meta docker-volumes -wi-ao---- 44.00m

विशेष रूप से, यह सिस्टम बूट होने पर LVM LV के लिए ऐसा करने की कोशिश नहीं करता है, लेकिन केवल जब मैं स्नैपशॉट लेता हूं।

यहाँ क्या हो रहा है? मैं वास्तव में नहीं चाहता कि डिवाइस-मैपर LVM स्नैपशॉट की सामग्री का निरीक्षण कर यह देखें कि क्या उनके भीतर ऐसा कुछ है जो मेरे लिए अनहेल्पी मैप कर सकता है। क्या मैं इस व्यवहार को दबा सकता हूं? या क्या मुझे किसी अन्य विधि के माध्यम से स्नैपशॉट बनाने की आवश्यकता है?

जवाबों:


8

कभी-कभी संबंधित दस्तावेज, कहने के बजाय, कॉन्फ़िगरेशन फ़ाइलों में छिपा हुआ है। तो यह LVM के साथ लगता है।

डिफ़ॉल्ट रूप से LVM स्वचालित रूप से किसी भी भौतिक उपकरणों पर वॉल्यूम को सक्रिय करने का प्रयास करेगा जो बूट के बाद सिस्टम से जुड़े होते हैं, इसलिए जब तक कि सभी पीवी मौजूद हैं, और lvmetad और udev (या अधिक हाल ही में systemd) चल रहे हैं। जब LVM स्नैपशॉट बन जाता है, तो एक udev ईवेंट बंद हो जाता है, और चूंकि स्नैपशॉट में एक PV होता है, इसलिए lvmetad स्वचालित रूप से चलता है pvscan, और आगे।

यह देखकर कि /etc/lvm/backup/docker-volumesमैं यह निर्धारित करने में सक्षम था कि लैवमेट ने pvscanडिवाइस के प्रमुख और मामूली संख्याओं का उपयोग करके स्नैपशॉट पर स्पष्ट रूप से चलाया था , जो कि एलवीएम फ़िल्टर को बायपास करता था जो सामान्य रूप से इसे रोकते थे। फ़ाइल समाहित:

description = "Created *after* executing 'pvscan --cache --activate ay 253:13'"

में सेट करके इस व्यवहार को नियंत्रित किया जा सकता auto_activation_volume_listहै /etc/lvm/lvm.conf। यह आपको यह निर्धारित करने की अनुमति देता है कि कौन से वॉल्यूम समूह, वॉल्यूम या टैग स्वचालित रूप से सक्रिय होने की अनुमति है।

इसलिए, मैंने मेजबान के लिए दोनों वॉल्यूम समूहों को शामिल करने के लिए फ़िल्टर सेट किया है; कुछ भी फ़िल्टर से मेल नहीं खाता है और स्वचालित रूप से सक्रिय नहीं होता है।

auto_activation_volume_list = [ "mandragora", "vm-volumes" ]

अतिथि के LVM वॉल्यूम अब होस्ट पर दिखाई नहीं दे रहे हैं, और अंत में, मेरे बैकअप चल रहे हैं ...


4

आप केवीएम होस्ट पर केवल भौतिक उपकरणों का निरीक्षण करने के लिए /etc/lvm/lvm.conf में 'फ़िल्टर' मान को संपादित करना चाहते हैं; डिफ़ॉल्ट मान 'हर ब्लॉक डिवाइस' को स्वीकार करता है जिसमें LVs स्वयं शामिल हैं। डिफ़ॉल्ट मान के ऊपर की टिप्पणी काफी व्यापक है और मैं इससे बेहतर उपयोग को समझाने का बेहतर काम कर सकता हूं।


ध्यान दें कि मैंने फ़िल्टर जोड़ा है, और pvscan --cacheनए फ़िल्टर के बारे में lvmetad बताने के लिए दौड़ा , और pvscanअब बताता है कि PV को फ़िल्टर द्वारा अस्वीकार किया जा रहा है, लेकिन समस्या बनी रहती है।
माइकल हैम्पटन

मुझे लगता है कि आप स्नैपशॉट को हटाने में असमर्थता का मतलब है। इस स्तर पर, यह मुश्किल हो सकता है, और मैं केवल अस्पष्ट सुझाव दे सकता हूं। यदि KVM होस्ट को रिबूट करना सवाल से बाहर है (और मैं स्वीकार करता हूं कि एक स्लेजहेमर दृष्टिकोण है), तो शायद मेजबान से 'lvchange -an / path / to / LV' अपनी पकड़ जारी करेगा। यदि ऐसा नहीं है, तो आप शायद LVM टूल को आज़माने और बायपास करने के लिए विभिन्न dmsetup संचालन के साथ प्रयोग कर रहे हैं। हालांकि यह वहाँ बालों वाला हो जाता है, और मैं किसी भी विशिष्ट ऑपरेशन की सिफारिश करने में सहज महसूस नहीं करता।
क्रेग मिस्केल

फ़िल्टर कुछ भी नहीं करता है क्योंकि lvmetad एक udev घटना के जवाब में स्नैपशॉट को स्पष्ट रूप से स्कैन कर रहा है। समाधान के विन्यास में कुछ और निकला, हालांकि ...
माइकल हैम्पटन

2

मैं संयोजन में लगभग एक ही समस्या का सामना करना पड़ा vgimportclone। यह कभी-कभी इसके साथ विफल होगा:

  WARNING: Activation disabled. No device-mapper interaction will be attempted.
  Physical volume "/tmp/snap.iwOkcP9B/vgimport0" changed
  1 physical volume changed / 0 physical volumes not changed
  WARNING: Activation disabled. No device-mapper interaction will be attempted.
  Volume group "insidevgname" successfully changed
  /dev/myvm-vg: already exists in filesystem
  New volume group name "myvm-vg" is invalid
Fatal: Unable to rename insidevgname to myvm-vg, error: 5

उस समय, अगर मैं स्नैपशॉट को नष्ट करना चाहता था, तो मुझे सबसे पहले https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1088081udev पर वर्णित बग के कारण अस्थायी रूप से अक्षम करना पड़ा

लेकिन फिर भी, नेस्टेड एलवीएम के वॉल्यूम समूह को सफलतापूर्वक निष्क्रिय करने के बाद, नेस्टेड पीवी के लिए विभाजन मैपिंग, द्वारा बनाई गई kpartx, किसी तरह उपयोग में बनी रही।

इस चाल से प्रतीत होता है कि डिवाइस मैपर ने पुराने वॉल्यूम समूह नाम का उपयोग करके एक अतिरिक्त पैरेंट मैपिंग रखी है, जैसे कि ट्री लिस्ट में:

insidevgname-lvroot (252:44)
 └─outsidevgname-myvm--root-p2 (252:43)
    └─outsidevgname-myvm--root (252:36)

समाधान केवल उस विशेष मानचित्रण को निकालना था dmsetup remove insidevgname-lvroot। उसके बाद, kpartx -dऔर lvremoveठीक काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.