विस्तारित विशेषताओं को cp / rsync के साथ संरक्षित करना


12

जब नकल करते हैं cp, तो विस्तारित विशेषताओं को संरक्षित नहीं किया जाता है, यहां तक ​​कि स्पष्ट के साथ भी

cp -a --preserve=all /source /dest

या

cp -a --preserve=xattr /source /dest

वही rsync, यानी के साथ है

rsync -aq -A -X --delete /source /dest

हालाँकि, गंतव्य फ़ाइल सिस्टम पर, मैं मैन्युअल रूप से (के साथ chattr) विस्तारित विशेषता बना सकता हूं । इसका मतलब है कि लक्ष्य फाइल सिस्टम xattr का समर्थन करता है।

मैं संरक्षित करने के लिए क्यों नहीं हो रहा xattrसाथ cpया rsync?

अतिरिक्त जानकारी:

  • स्रोत और लक्ष्य फाइलसिस्टम दोनों ext4 हैं
  • स्रोत और लक्षित फाइलसिस्टम दोनों स्थानीय हैं (nfs नहीं)
  • मैं डेबियन व्हीजी का उपयोग कर रहा हूं

आप इस गंतव्य फ़ाइल सिस्टम को कैसे बढ़ा रहे हैं? क्या यह एनएफएस पर है?
slm

डेस्टिनेशन फाइलसिस्टम एक स्थानीय फाइल सिस्टम है
मार्टिन वेज्टर

क्या आप mountइस फाइल सिस्टम के लिए आउटपुट दिखा सकते हैं ?
स्लम

1
क्या यूनिक्स संस्करण और संस्करण पर? किस माउंट विकल्प के साथ दोनों सिरों पर फाइलसिस्टम टाइप होता है?
गिल्स एसओ- बुराई को रोकना '

1
@MartinVegter क्या आप अपनी फ़ाइल में एक नमूना विशेषता दे सकते हैं? मैं सिर्फ दो फ़ाइलों में ext4 फाइल सिस्टम बनाया और एक परीक्षण के साथ किया setfattr -n system.name0 -v "value" test_file। मैंने test_fileext4 / jfs / xfs से / से कॉपी cp --preserve=allकिया और विस्तारित विशेषताओं को संरक्षित करने में कोई समस्या नहीं की।
यूवी वी

जवाबों:


14

अपडेट करें

यह कुछ और के साथ खिलवाड़ करने के लिए chattrऔर अन्य के लिए कोड को देखने के बाद e2fsprogs, यह स्पष्ट है कि इसके द्वारा निर्धारित की गई विशेषताएँ chattrऔर libattrउदाहरण के लिए (जैसे कमांड के साथ setfattr) अलग हैं। फाइलसिस्टम झंडे chattrसेट करता है extजो केवल एक नामित विशेषता या नाम स्थान पर मैप नहीं करता है। कोई भी उनमें से करने के लिए किसी भी कॉल के साथ दिखाई libattrहै listxattr। उन्हें संभवतः नीचे बताए गए नामस्थान में नामित विशेषताओं का मानचित्र बनाना चाहिएsystem , लेकिन अभी तक यह पूरी तरह से कार्यान्वित नहीं किया गया है। system.posix_acl_accessनीचे दी गई इन विशेषताओं में से एक के लिए मैपिंग के लिए मैंने जिस विशेषता को गलत समझा, वह extफाइलसिस्टम झंडे के साथ कुछ भी नहीं है और यह एक्सेस कंट्रोल लिस्ट के साथ नहीं है। जुड़ेstraceसंदेश किसी भी फ़ाइल के लिए दिखाई देते हैं और केवल cp --preserve=xattrउपयोग किए जाने पर गायब हो जाते हैं ।

ऐसा लगता है कि द्वारा निर्धारित विशेषताएँ फाइल सिस्टम के chattrलिए विशिष्ट हैं extऔर उन्हें प्रभावित करने का एकमात्र तरीका e2fsprogsटूल्स के माध्यम से है। वास्तव में manपृष्ठ वास्तव में उनके लिए 'विस्तारित विशेषताओं' शब्द का उपयोग नहीं करता है, बल्कि 'फ़ाइल विशेषताएँ' है। 'वास्तविक' विस्तारित गुण नाम / मूल्य जोड़े हैं जिन्हें बदलकर libattrकई फाइल सिस्टम पर लागू किया जा सकता है । ये क्या हैं cpऔर rsyncसही विकल्प दिए जाने पर कॉपी की गई फ़ाइलों को देखें और स्थानांतरित करें। हालाँकि ऐसा लगता है कि systemनाम स्थान की chattrविशेषताओं को मैप करने के लिए मौजूद है और अंततः अन्य फाइल सिस्टम पर समकक्ष विशेषताओं के लिए मौजूद है, लेकिन अब यह काम नहीं करता है।

मैंने मूल उत्तर को अक्षुण्ण रखा है क्योंकि वहाँ कुछ अच्छी जानकारी है, हालाँकि यह बिंदुओं पर काफी गलत है।

अपडेट २

मुझे अब से पहले फिर से इस पर वापस आना चाहिए था, लेकिन इस उत्तर के अनुसार , chattrकेवल extफाइल सिस्टम से अधिक पर काम करता है । विकिपीडिया के अनुसार , यह chflagsबीएसडी आधारित प्रणालियों पर कमांड के बराबर है ।

मैंने कुछ फाइल सिस्टम पर इन विशेषताओं की सेटिंग और पढ़ने का परीक्षण करने के लिए एक स्क्रिप्ट लिखी और निम्नलिखित परिणाम प्राप्त किए:

ext4:
suS-iadAcj-t-e-- mnt/test_file
suSDiadAcj-tTe-- mnt/test_dir

reiserfs:
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_file
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_dir

xfs:
--S-iadA-------- mnt/test_file
--S-iadA-------- mnt/test_dir

btrfs:
--S-iadAc------C mnt/test_file
--SDiadAc------C mnt/test_dir

ध्यान दें कि reiserfsफ़ाइल फ़्लैग को पढ़ने / सेट करने के सभी प्रयासों ने उपरोक्त त्रुटि दी, बावजूद इसके कि इसे कुछ कार्यक्षमता के रूप में विकिपीडिया पर सूचीबद्ध किया गया है। मैंने परीक्षण नहीं किया reiser4। इसके अलावा, जब cझंडा उस पर सेट हो ext4सकता है तो उसे सम्मानित नहीं किया जाता है। इन झंडों को प्रभावित करने वाले ट्यूनिंग / माउंट विकल्प भी हो सकते हैं, लेकिन मुझे कोई नहीं मिला।

हालाँकि ऐसा लगता है कि वर्तमान chattrमें लिनक्स पर एकमात्र उपयोगिता है जो इन विशेषताओं को संशोधित करने में सक्षम है और इसलिए कोई भी कॉपी उपयोगिता उन्हें संरक्षित करने में सक्षम नहीं है।

मूल उत्तर

ऐसा होने का कारण rsyncयह भी नहीं है। दस्तावेज़ के -Xअनुभाग से rsync:

For systems that support extended-attribute namespaces, a copy being done by a
super-user copies all namespaces except system.*.  A normal user only  copies
the user.* namespace.

फ़ाइल सिस्टम में उपयोग किए गए chattrऔर lsattrअंतर्निहित नाम विशेषताओं के लिए (एक इंटरनेट पर कोई सूची नहीं है) के लिए उपयोग किए जाने वाले विशेषता अक्षरों को मैप करना मुश्किल है । मेरे परीक्षणों से, हालांकि, Aविशेषता के लिए मैप मैप करता system.posix_acl_accessहै और चूंकि यह systemनाम स्थान है, rsyncइसलिए इसे कॉपी करने का प्रयास भी नहीं किया जाएगा।manस्निपेट में उल्लेखित अन्य दो नामस्थान नहीं हैं , trustedऔर securityइन्हें सेट करने के लिए रूट विशेषाधिकारों की आवश्यकता होती है (और rsyncइसके बिना प्रयास नहीं करेंगे)।

सबसे अधिक संभावना है कि जिन विशेषताओं को आपने systemनामस्थान में गिराने की कोशिश की है, जो rsyncअनदेखा करता है (और शायद बुद्धिमानी से)। या तो आप या जो नहीं हैं उन्हें प्राप्त करने के लिए रूट होने की आवश्यकता है।

के रूप में cp, वहाँ खेलने पर कीड़े प्रतीत होता है।चल रहा straceहै cp -a, मुझे निम्नलिखित दो दिलचस्प लाइनें मिलती हैं:

fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)

तथा

fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0

सबसे पहले fgetxattrकॉल किसी भी डेटा को वापस नहीं करता है (शायद इसलिए कि कोई भी - विशेषता का अस्तित्व पर्याप्त नहीं है), फिर भी किसी तरह cpगंतव्य फ़ाइल में विशेषता मान के रूप में सेट करने के लिए 28 बाइट्स (रद्दी?) डेटा मिलता है। यह एक बग की तरह प्रतीत होता है cp, लेकिन इसके बजाय जो समस्याएँ पैदा हो रही हैं वे एक बग के libattrरूप में प्रतीत होती हैं क्योंकि fsetattrकॉल 0वास्तव में विशेषता को स्थापित किए बिना सफलता के लिए वापस आती है ।

मुझे यह व्यवहार अच्छा लगता है ext4, चाहे मैं इसके साथ माउंट करूं user_xattr। मुझे यह कहने के अलावा अन्य कोई दस्तावेज नहीं मिल रहा है कि 'कुछ सिस्टम' को काम करने के लिए विस्तारित विशेषताओं के लिए इस माउंट विकल्प की आवश्यकता है। लगता है मेरा (डेबियन जेसी) नहीं है। यहां तक ​​कि एक बढ़ती हुई समस्या है जिसे मैंने याद किया है, यह गलत है fsetattrऔर इस तरह cpचुपचाप विफल होना है।

दरअसल user_xattrपर की जरूरत है ext2, ext3, reiserfsऔर संभवतः कुछ अन्य शामिल हैं। यह आवश्यक नहीं हैext4

यह भी ध्यान दें कि attrउपकरण setfattr, getfattrऔर attr(बाद वाले को केवल के लिए XFSही प्रलेखित किया गया है , लेकिन लगता है कि काम करने के लिए और साथ ही दूसरों के लिए ext4) कुछ भी लेकिन userनाम स्थान में काम करने में समस्याएं हैं । Operation not supportedअगर मुझे नाम स्थान (या इस बग के अनुसार कोई नाम स्थान) में कोई setfattrविशेषता डालने का उपयोग करने का प्रयास करने पर मिलता है । और नामस्थान में सफल होने के लिए प्रकट होता है , लेकिन फिर कुछ भी पढ़ने में विफल रहता है और इसके द्वारा निर्धारित नामस्थान से कुछ भी पढ़ने में विफल रहता है । सफल होने का कारण यह है कि यह कॉल का उपयोग करता है और नहीं ।systemsetfattrtrustedsecuritygetfattrsystemchattrchattrioctllibattr

हालाँकि, पूरी तरह से काम करता है, userनामस्थान में विस्तारित विशेषताओं को सेट setfattrकर रहा है और उनका उपयोग कर रहा है rsyncया cpउनके साथ प्रतिलिपि बना रहा है ( cpयदि विशेषता बनाते समय कोई मान निर्दिष्ट नहीं है तो भी कोई समस्या नहीं है)। मुझे लगता है कि लब्बोलुआब यह है कि systemनाम स्थान के मूल्यों का उपयोग वर्तमान में हैछोटी गाड़ी और / याअसमर्थित, कम से कम डेबियन में और शायद अन्य डिस्ट्रोस भी। संभवतः rsyncडेवलपर्स इसे जानते हैं, यही वजह है कि वे उन्हें अनदेखा करते हैं।

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