बीट्रॉफ़ सबवूम्स के बीच फाइलों को स्थानांतरित करना एक महंगा ऑपरेशन क्यों है?


7

मुझे जो समझ में आया है, btrfs सबवॉल्म्स एक ही फाइल सिस्टम "स्टोरेज" को साझा करते हैं, इसलिए मुझे यह जानकर आश्चर्य हुआ कि अलग-अलग सबवोल्यूम के बीच फाइल हिलाना एक महंगा ऑपरेशन है, जैसे अलग-अलग फाइलसिस्टम (कॉपी + डिलीट) के बीच चलना।

मैं विशेष रूप से आश्चर्यचकित था जब किसी ने इस काम के बारे में सुझाव दिया था: सबवोल्यूम के बीच रिफ़्लिंक-कॉपी फाइलें, फिर मूल वाले को हटा दें। इसे एक सस्ता ऑपरेशन (केवल मेटाडेटा के चारों ओर घूमना) कहा जाता है। कैसे है कि गाय का उपयोग करते समय अलग-अलग उप-खंड डेटा ब्लॉक साझा कर सकते हैं, लेकिन नहीं में-बढ़ते डेटा का आसान संचालन होना चाहिए?


4
यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन आपको यह जानने में रुचि हो सकती है कि कोरुटिल्स 8.24 (3 जुलाई, 2015 को जारी) से, mvएक मानक कॉपी ( चेंगलॉग ) पर वापस गिरने से पहले एक रिफ्लिन की कोशिश करेगा ।
विंसेंट यू

@VincentYu जानकारी के लिए धन्यवाद। लेकिन क्या यूजर स्पेस के बजाए फाइलसिस्टम द्वारा ही एक मूव / रीनेम ऑपरेशन का प्रबंधन नहीं किया जाना चाहिए? मैंने जो पढ़ा है, यह चाल व्यवहार एक ही है, भले ही उसी आरोह बिंदु के अंदर किया गया हो, यानी सबवोल्यूम को किसी अन्य निर्देशिका में माउंट नहीं किया गया हो, इसलिए कर्नेल शायद यह पहचान नहीं सके कि यह एक ही फाइल सिस्टम है।
m.alessandrini

1
@VincentYu सिर्फ जानकारी के लिए, और नए उत्तर से जागृत, मैंने अधिक अप-टू-डेट सिस्टम (डेबियन परीक्षण, कर्नेल 4.6.0, कोर्यूटिल्स 8.25-2) के साथ सबवोल्यूम के बीच एक बड़ी फ़ाइल को स्थानांतरित करने की कोशिश की, लेकिन कुछ भी नहीं बदला।
m.alessandrini

@ m.alessandrini मैंने अभी पाया कि cp --reflinkदो सबवोल्यूम्स के बीच उपयोग करने में सक्षम होने के लिए मुझे शीर्ष स्तर के सबवोल्यूम को माउंट करने और उस नेमस्पेस के अंदरcp कमांड जारी करने के लिए मजबूर किया गया था , अन्यथा एक त्रुटि के साथ बाहर निकल जाएगाcp...Invalid cross-device link
डेज़र्ट नॉर्टन

@DzamoNorton तथ्य यह है कि पहले यह आपके द्वारा वर्णित कॉन्फ़िगरेशन (वर्तमान dir के सभी उपखंड) में भी काम नहीं करता था, जहां रिफ्लिन-कॉपी ने काम किया था। लेकिन मैंने अभी कोशिश की और आज यह कदम एक शून्य-समय ऑपरेशन है, (कर्नेल 4.16), इसलिए मुझे लगता है कि इस पर ध्यान दिया गया है।
m.alessandrini

जवाबों:


4

कैसे है कि गाय का उपयोग करते समय अलग-अलग उप-खंड डेटा ब्लॉक साझा कर सकते हैं, लेकिन नहीं में-बढ़ते डेटा का आसान संचालन होना चाहिए?

एमवी इस कदम का प्रयास करने के लिए नाम बदलकर syscall का उपयोग करता है। btrfs का कर्नेल नाम बदलने का अर्थ है कि क्रॉस सबवोल्यूम चाल का पता लगाता है और इसे स्पष्ट रूप से नापसंद करता है (भले ही उसी माउंट पॉइंट के तहत):

/* we only allow rename subvolume link between subvolumes */
if (old_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest)
    return -EXDEV;

यह संभवतः सबवोल्यूम इनोड अकाउंटिंग के साथ करना है और कोड इन ऑपरेशनों को लेते हैं। रिफ़्लिंक-कॉपी वास्तव में नए मेटाडेटा (लेकिन डेटा स्वयं सीओडब्ल्यू है) को नए सबवोल्यूम में बनाया गया है। सिद्धांत रूप में वे शायद नाम बदलकर "मूव" कर सकते हैं मेटाडेटा कुछ ऐसा ही करके जो कॉपी --reflink के बाद rm सोर्स करता है ... बस किसी ने भी इसे करने का प्रयास नहीं किया है।


धन्यवाद, मैंने जिज्ञासा के लिए कर्नेल कोड को ब्राउज़ किया, और इसे पहली नज़र में (स्पष्ट रूप से) समझने के अलावा, मैं वास्तव में टिप्पणी में उस वाक्य को नहीं समझता हूं। क्या आप जानते हैं कि इसका क्या मतलब हो सकता है?
m.alessandrini

2
सबवोल्यूम फाइल सिस्टम में कहीं भी डायरेक्टरी एंट्रीज (उर्फ "सबवोल्यूम लिंक") के रूप में दिखाई देते हैं। टिप्पणी यह ​​कह रही है कि आप सबवूम्स के बीच सबवूमल डायरेक्टरी प्रविष्टियों का नाम बदल सकते हैं (वास्तविक रूप से डायर या फाइलें नहीं।
ब्राउन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.