การรักษาแอตทริบิวต์เพิ่มเติมด้วย 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)
  • ฉันใช้ Debian Wheezy

คุณติดตั้งระบบไฟล์ปลายทางนี้อย่างไร? มันมากกว่า NFS เหรอ?
slm

ระบบไฟล์ปลายทางเป็นระบบไฟล์ในระบบ
Martin Vegter

คุณสามารถแสดงผลของmountระบบไฟล์นี้ได้หรือไม่?
slm

1
ตัวแปรและเวอร์ชันของยูนิกซ์คืออะไร? ระบบไฟล์ประเภทใดที่ปลายทั้งสองด้านพร้อมตัวเลือกเมานท์?
Gilles 'หยุดความชั่วร้าย'

1
@MartinVegter คุณช่วยให้ตัวอย่างแอตทริบิวต์ไฟล์ของคุณมี? ฉันเพิ่งสร้างระบบแฟ้ม ext4 setfattr -n system.name0 -v "value" test_fileในสองไฟล์และได้ทดสอบกับ ฉันคัดลอกtest_fileไปยัง / จาก ext4 / jfs / xfs ด้วยcp --preserve=allและไม่มีปัญหาใด ๆ ที่รักษาคุณลักษณะเพิ่มเติม
UVV

คำตอบ:


14

ปรับปรุง

หลังจากที่ยุ่งกับสิ่งนี้มากขึ้นและมองไปที่รหัส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นักพัฒนาจะรู้สิ่งนี้ซึ่งเป็นเหตุผลว่าทำไมพวกเขาถึงเพิกเฉย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.