ปรับปรุง
หลังจากที่ยุ่งกับสิ่งนี้มากขึ้นและมองไปที่รหัสchattrและอื่น ๆe2fsprogsเป็นที่ชัดเจนว่าคุณลักษณะที่กำหนดโดยchattrและผู้ที่กำหนดโดยlibattr(เช่นกับคำสั่งsetfattr) แตกต่างกันมาก chattrตั้งค่าextแฟล็กระบบไฟล์ซึ่งไม่ได้แม็พกับแอ็ตทริบิวต์ที่มีชื่อหรือเนมสเปซ ไม่มีของพวกเขาแสดงขึ้นกับสายการใด ๆ ที่จะ'slibattr listxattrพวกเขาควรจะแมปแอตทริบิวต์ที่มีชื่อในsystemเนมสเปซตามที่สันนิษฐานไว้ด้านล่าง แต่ ณ ตอนนี้ยังไม่มีการใช้งานอย่างสมบูรณ์ นอกจากนี้system.posix_acl_accessคุณลักษณะที่ฉันเข้าใจผิดสำหรับการแมปไปยังหนึ่งในแอตทริบิวต์เหล่านี้ด้านล่างไม่มีอะไรเกี่ยวข้องกับextค่าสถานะระบบแฟ้มและค่อนข้างจะทำกับรายการควบคุมการเข้าถึง เรื่องที่เกี่ยวข้องstraceข้อความปรากฏขึ้นสำหรับไฟล์ใด ๆ และหายไปเมื่อcp --preserve=xattrมีการใช้งานเท่านั้น
ดูเหมือนว่าคุณสมบัติที่กำหนดโดยchattrเฉพาะสำหรับextระบบไฟล์และวิธีเดียวที่จะส่งผลกระทบต่อพวกเขาคือผ่านe2fsprogsเครื่องมือ ในความเป็นจริงmanหน้าไม่ได้ใช้คำว่า 'คุณสมบัติเพิ่มเติม' สำหรับพวกเขา แต่แทนที่จะ 'แอตทริบิวต์ไฟล์' แอ็ตทริบิวต์ส่วนขยาย 'ของจริง' คือคู่ชื่อ / ค่าที่สามารถเปลี่ยนแปลงได้libattrและนำไปใช้กับระบบไฟล์หลายระบบ เหล่านี้เป็นสิ่งcpและrsyncมองหาและโอนไปยังไฟล์ที่คัดลอกเมื่อตัวเลือกที่เหมาะสมจะได้รับ อย่างไรก็ตามดูเหมือนว่าsystemมีเนมสเปซที่มีอยู่เพื่อแมปchattrแอตทริบิวต์กับชื่อและท้ายที่สุดกับคุณลักษณะที่เทียบเท่าในระบบไฟล์อื่น ๆ แต่ตอนนี้มันไม่ทำงาน
ฉันได้ทิ้งคำตอบดั้งเดิมไว้เหมือนเดิมเพราะมีข้อมูลที่ดีอยู่บ้างแม้ว่ามันจะผิดไปมากในประเด็น
อัปเดต 2
ฉันควรจะได้กลับไปนี้มาอีกครั้งก่อนตอนนี้ แต่ตามคำตอบนี้ , chattrงานมากกว่าเพียงextfilesystems ตามWikipediaมันเทียบเท่ากับchflagsคำสั่งในระบบที่ใช้ BSD
ฉันเขียนสคริปต์เพื่อทดสอบการตั้งค่าและการอ่านคุณสมบัติเหล่านี้ในระบบไฟล์ไม่กี่แห่งและได้ผลลัพธ์ดังต่อไปนี้:
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สถานะไฟล์ทำให้เกิดข้อผิดพลาดข้างต้นแม้ว่าจะมีการระบุไว้ใน Wikipedia ว่ามีฟังก์ชั่นบางอย่าง reiser4ผมไม่ได้ทดสอบ นอกจากนี้ในขณะที่cธงสามารถตั้งค่าext4มันไม่เป็นเกียรติ อาจมีตัวเลือกการปรับ / เมานต์ที่มีผลต่อแฟล็กเหล่านี้ แต่ฉันไม่พบอะไรเลย
อย่างไรก็ตามดูเหมือนว่าในปัจจุบันchattrเป็นเพียงยูทิลิตี้เดียวบน Linux ที่สามารถแก้ไขคุณลักษณะเหล่านี้ได้ดังนั้นจึงไม่มีการคัดลอกยูทิลิตี้ใด ๆ
คำตอบเดิม
เหตุผลที่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ฉันไม่สามารถหาเอกสารใด ๆ ในเรื่องนี้นอกจากจะบอกว่า 'บางระบบ' ต้องการตัวเลือกการเมาท์นี้เพื่อให้แอททริบิวต์เพิ่มเติมทำงาน ดูเหมือนว่าของฉัน (Debian Jessie) ไม่ได้ แม้ว่าจะมีปัญหาในการติดตั้งที่ฉันพลาดไป แต่ก็ผิดfsetattrและทำให้cpการทำงานเงียบลง
ที่จริงuser_xattrเป็นสิ่งจำเป็นในext2, ext3, reiserfsและอาจจะเป็นบางคนอื่น ๆ มันไม่จำเป็นสำหรับext4
ยังทราบว่าattrเครื่องมือsetfattr, getfattrและattr(หลังเป็นเอกสารที่จะเป็นเพียงสำหรับXFSเท่านั้น แต่ดูเหมือนว่าจะทำงานก็เช่นกันกับคนอื่น ๆ สำหรับext4) มีปัญหาในการทำงานในอะไร แต่usernamespace ฉันจะได้รับOperation not supportedถ้าฉันพยายามใช้setfattrเพื่อใส่คุณลักษณะในsystemnamespace (หรือไม่มี namespace ตามข้อผิดพลาดนี้) setfattrดูเหมือนจะประสบความสำเร็จในtrustedและsecuritynamespaces แต่แล้วก็getfattrล้มเหลวในการอ่านอะไรกลับมาและยังล้มเหลวในการอ่านอะไรจากsystemชุด namespace chattrโดย เหตุผลว่าchattrประสบความสำเร็จก็คือว่ามันใช้การโทรและการไม่ได้ioctllibattr
สิ่งที่ทำงานได้อย่างสมบูรณ์แบบคือการตั้งค่าคุณลักษณะเพิ่มเติมในuserเนมสเปซด้วยsetfattrและใช้rsyncหรือcpคัดลอกคุณลักษณะเหล่านั้นโดยสมบูรณ์ (แม้ไม่มีปัญหาcpหากคุณไม่ระบุค่าเมื่อสร้างแอททริบิวต์) ฉันคิดว่าบรรทัดล่างคือการใช้systemค่า namespace ปัจจุบันรถม้าชนิดเล็กและ / หรือไม่ได้รับการสนับสนุนอย่างน้อยก็ใน Debian และ distros อื่น ๆ ด้วย มีแนวโน้มที่rsyncนักพัฒนาจะรู้สิ่งนี้ซึ่งเป็นเหตุผลว่าทำไมพวกเขาถึงเพิกเฉย