ปรับปรุง
หลังจากที่ยุ่งกับสิ่งนี้มากขึ้นและมองไปที่รหัส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
งานมากกว่าเพียงext
filesystems ตาม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
) มีปัญหาในการทำงานในอะไร แต่user
namespace ฉันจะได้รับOperation not supported
ถ้าฉันพยายามใช้setfattr
เพื่อใส่คุณลักษณะในsystem
namespace (หรือไม่มี namespace ตามข้อผิดพลาดนี้) setfattr
ดูเหมือนจะประสบความสำเร็จในtrusted
และsecurity
namespaces แต่แล้วก็getfattr
ล้มเหลวในการอ่านอะไรกลับมาและยังล้มเหลวในการอ่านอะไรจากsystem
ชุด namespace chattr
โดย เหตุผลว่าchattr
ประสบความสำเร็จก็คือว่ามันใช้การโทรและการไม่ได้ioctl
libattr
สิ่งที่ทำงานได้อย่างสมบูรณ์แบบคือการตั้งค่าคุณลักษณะเพิ่มเติมในuser
เนมสเปซด้วยsetfattr
และใช้rsync
หรือcp
คัดลอกคุณลักษณะเหล่านั้นโดยสมบูรณ์ (แม้ไม่มีปัญหาcp
หากคุณไม่ระบุค่าเมื่อสร้างแอททริบิวต์) ฉันคิดว่าบรรทัดล่างคือการใช้system
ค่า namespace ปัจจุบันรถม้าชนิดเล็กและ / หรือไม่ได้รับการสนับสนุนอย่างน้อยก็ใน Debian และ distros อื่น ๆ ด้วย มีแนวโน้มที่rsync
นักพัฒนาจะรู้สิ่งนี้ซึ่งเป็นเหตุผลว่าทำไมพวกเขาถึงเพิกเฉย