अपडेट करें
यह कुछ और के साथ खिलवाड़ करने के लिए 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
विशेषता डालने का उपयोग करने का प्रयास करने पर मिलता है । और नामस्थान में सफल होने के लिए प्रकट होता है , लेकिन फिर कुछ भी पढ़ने में विफल रहता है और इसके द्वारा निर्धारित नामस्थान से कुछ भी पढ़ने में विफल रहता है । सफल होने का कारण यह है कि यह कॉल का उपयोग करता है और नहीं ।system
setfattr
trusted
security
getfattr
system
chattr
chattr
ioctl
libattr
हालाँकि, पूरी तरह से काम करता है, user
नामस्थान में विस्तारित विशेषताओं को सेट setfattr
कर रहा है और उनका उपयोग कर रहा है rsync
या cp
उनके साथ प्रतिलिपि बना रहा है ( cp
यदि विशेषता बनाते समय कोई मान निर्दिष्ट नहीं है तो भी कोई समस्या नहीं है)। मुझे लगता है कि लब्बोलुआब यह है कि system
नाम स्थान के मूल्यों का उपयोग वर्तमान में हैछोटी गाड़ी और / याअसमर्थित, कम से कम डेबियन में और शायद अन्य डिस्ट्रोस भी। संभवतः rsync
डेवलपर्स इसे जानते हैं, यही वजह है कि वे उन्हें अनदेखा करते हैं।