วิธีเมาท์ระบบไฟล์ ZFS ภายนอกโดยไม่มีการอุดตัน / แก้ไขระบบไฟล์ปัจจุบันหรือภายนอก


11

ฉันใช้ FreeBSD 10.2 ใช้ ZFS บนรากเป็นระบบไฟล์(zroot01) ฉันมีฮาร์ดดิสก์ภายนอกที่มีระบบไฟล์ ZFS จากระบบ FreeBSD 10.2 (zroot02) อื่นที่ฉันต้องการที่จะเมานท์ชั่วคราวอ่านอย่างเดียวเพื่อให้ฉันสามารถลบไฟล์บางส่วนออกจากนั้นตัดการเชื่อมต่อหลังจากนั้น ฉันไม่ต้องการให้ระบบ ZFS ภายนอกทำการปิดบังหรือแทนที่ระบบไฟล์ปัจจุบันของฉันและฉันไม่ต้องการให้ข้อมูลในภายนอกเสียหายหรือเปลี่ยนแปลง

เพื่อแสดงให้เห็นถึงสิ่งที่ฉันพยายามทำให้สำเร็จถ้าฉันใช้ UFS ฉันจะทำสิ่งนี้:

mount -t ufs -o ro /dev/ada0s2 /mnt/my-fun-mountpoint

... /dev/ada0s2พาร์ทิชันบนไดรฟ์ภายนอกของฉันอยู่ที่ไหนและ/mnt/my-fun-mountpointอยู่ใน/mntไดเรกทอรีของระบบปฏิบัติการที่มีอยู่ของฉัน

การค้นหาและการอ่านหน้าคนทั้งหมดไม่ได้ให้วิธีการที่ชัดเจนในการทำเช่นนั้น อะไรคำตอบผมไม่พบว่าจบลงด้วยการผ่านระบบแฟ้มของฉันปัจจุบันและสินบนมันเกินกว่าจะซ่อม - ไม่ชัดผลที่ฉันกำลังมองหา ฉันพยายามทำสิ่งนี้มานานแล้วดังนั้นฉันจำไม่ได้ว่าคำสั่งใดที่ฉันลองใช้

คุณช่วยให้คำแนะนำที่ชัดเจนเกี่ยวกับวิธีการทำเช่นนี้ได้หรือไม่? ขอบคุณล่วงหน้าสำหรับความช่วยเหลือของคุณ.

คำตอบ:


13

มันขึ้นอยู่กับว่าคุณต้องการให้พูลอ่านเป็นอย่างไร และไม่ใช่นั่นไม่ใช่เรื่องตลก

ก่อนอื่นคำศัพท์เล็กน้อย: ใน ZFS คุณจะนำเข้ากลุ่มและเลือกที่จะติดตั้งระบบไฟล์ (ใด ๆ ) ที่อยู่ภายใน คุณสามารถนำเข้าสระว่ายน้ำโดยไม่ต้องติดตั้งระบบไฟล์ใด ๆ โดยผ่าน-Nไปzpool importแล้วภายหลังการติดตั้งระบบไฟล์ใด ๆ zfs mountที่ต้องการใช้ (นี่เป็นสถานการณ์สมมติที่สมบูรณ์แบบถ้าเช่นคุณต้องการเข้าถึงระบบไฟล์เดียวจากหลาย ๆ ระบบหรือถ้าคุณต้องการทำบางสิ่งที่คล้ายกับการขัดออฟไลน์ของพูล)

ZFS ไม่ใช่แฟนตัวยงของการเข้าถึงแบบอ่านอย่างเดียว ตัวอย่างเช่นหาก ZFS ตรวจพบข้อผิดพลาดที่สามารถซ่อมแซมได้ฉันเชื่อว่ามันจะซ่อมแซมข้อผิดพลาดและเขียนข้อมูลที่ได้รับการซ่อมแซมไปยังดิสก์แม้ว่าคุณจะนำเข้ากลุ่มเป็นแบบอ่านอย่างเดียว ความเข้าใจของฉันคือว่าใน ZFS parlace "อ่านอย่างเดียว" จะใช้กับสถานะที่ผู้ใช้มองเห็นได้ของพูลและชุดข้อมูล หากคุณทำสำเนาไบนารีของดิสก์ไปยังไฟล์ (หรือชุดของไฟล์) ทำให้ไฟล์เหล่านั้นอ่านได้อย่างแท้จริงเท่านั้นและพยายามนำเข้าพูลจากที่นั่น ZFS จะไม่สามารถนำเข้า ไม่ว่าคุณจะพยายามมากแค่ไหน หากคุณทำให้ไฟล์เขียนได้มันจะทำงานได้ดี (จริง ๆ แล้วฉันพยายามทำสิ่งนี้เมื่อไม่กี่สัปดาห์ที่ผ่านมาถึงแม้ว่าจะใช้ zvol และ ZFS ก็ปฏิเสธอย่างรุนแรงเพื่อนำเข้าพูล เมื่อฉันตั้งค่า zvol ให้อ่าน / เขียนแทนการอ่านอย่างเดียวพูลนำเข้าได้ดี) ระบบไฟล์อื่น ๆ เช่น (บน Linux) ext4 และคนอื่น ๆ อาจจัดการกับสถานการณ์นี้ได้อย่างสวยงาม แต่ ZFS balks

หากคุณเป็นผู้โชคร้ายและไม่ได้มี ECC RAMที่ติดตั้งในระบบที่คุณกำลังนำเข้าสระว่ายน้ำแล้ว ZFS' ความพยายามที่จะแก้ไขข้อผิดพลาดใด ๆ ก็เจอจริงอาจทำให้สิ่งเลวแม้จะมีความคิดเห็นที่แตกต่างกันกับว่านี้เป็นจริงความเสี่ยงที่แท้จริง ในทางปฏิบัติ โดยส่วนตัวแล้วฉันเห็นว่าข้อมูลใด ๆ ที่ฉันสนใจเพียงพอที่จะปกป้องด้วย ZFS และสแน็ปช็อตและการสำรองและสำรองข้อมูลในระดับที่เก็บข้อมูลและสิ่งที่ไม่ควรได้รับการปกป้องจาก ECC RAM เช่นกัน แต่พีซีจำนวนมากไม่มี ECC RAM

ดังนั้นคุณสามารถนำเข้าพูลในโหมดอ่านอย่างเดียวโดยมีรูตสำรองที่เฉพาะเจาะจงเพื่อป้องกันไม่ให้เหยียบนิ้วเท้าอื่น แต่คุณต้องระวังว่าไม่จำเป็นต้องอ่านอย่างเดียวจริงๆ (มันจะได้ แต่ให้แน่ใจว่าคุณไม่ได้ตั้งใจเปลี่ยนแปลงอะไรในสระว่ายน้ำ.) โดยให้ทำการนำเข้าอ่านอย่างเดียวสมมติว่าสระว่ายน้ำเป็นชื่อtankและที่โหนดอุปกรณ์ (s) / อยู่ในที่มีอยู่/devคุณจะ ใช้คำสั่งเช่น:

# zpool import tank -d /dev -o readonly=on -R /mnt/someplace

นี้จะมองใน/devสิ่งใดถือ ZFS สระว่ายน้ำที่มีชื่อtank, นำเข้าชั่วคราวตั้งค่าคุณสมบัติสระว่ายน้ำreadonlyไปon(ซึ่งหมายความว่าทุกการเขียนโดยผู้ใช้จะถูกปฏิเสธ) และการตั้งค่าชั่วคราวของคุณสมบัติการaltroot /mnt/someplace(ค่าคุณสมบัติเหล่านี้เป็น "ชั่วคราว" ในแง่ที่ว่าพวกเขาจะไม่คงอยู่กับดิสก์เป็นค่าคุณสมบัติปัจจุบันดังนั้นหากคุณส่งออกและนำเข้าพูลอีกครั้งโดยไม่มีค่าเหล่านั้นค่าจะกลับสู่ปกติ อาจถูกเขียนลงในประวัติพูลแม้ว่าเมื่อนำเข้าพูลแล้วคุณสามารถดูได้zpool history tank หากคุณเอียงมาก) เมื่อนำเข้าพูลคุณจะเห็นไฟล์ของคุณภายใต้ / mnt / someplace และมีการเข้าถึงแบบอ่านอย่างเดียวตามปกติรวมถึงสแน็ปช็อตใด ๆ ที่ทำบนชุดข้อมูลในพูลแล้ว

จากตัวอย่างของคุณฉันสงสัยว่าคุณจะใช้บางอย่างตามแนวของ:

# zpool import zroot02 -d /dev -o readonly=on -R /mnt/my-fun-mountpoint

เมื่อเสร็จแล้วอย่าลืมส่งออกกลุ่มข้อมูลให้สะอาด:

# zpool export tank

หรือบางที

# zpool export zroot02

ซึ่งจะถอนติดตั้งระบบไฟล์และชุดข้อมูลอื่น ๆ ภายในพูลล้างบัฟเฟอร์ทั้งหมด (เท่าที่จำเป็นต้องมีการฟลัชในตอนแรก) ทำเครื่องหมายพูลว่าไม่ได้อิมพอร์ตบนอุปกรณ์ที่เป็นส่วนประกอบทั้งหมดและดำเนินการดูแลทำความสะอาดอื่น ๆ ที่จำเป็น สามารถย้ายพูลไปยังระบบอื่นได้อย่างปลอดภัยและนำเข้าที่นั่นในภายหลัง


1
หากคุณแน่ใจจริงๆว่าสิ่งที่คุณระบุไว้ในย่อหน้าที่สามนั้นถูกต้องนั่นอาจเป็นข้อผิดพลาดของการใช้ BSD ZFS พูลการนำเข้าแบบอ่านอย่างเดียว ZFS ได้รับการออกแบบให้อ่านอย่างเดียวอย่างแท้จริงนั่นคือไม่เคยพยายามเขียนหรือแก้ไขข้อมูลหรือข้อมูลเมตาใด ๆ รวมถึงประวัติพูล ดูarc.stillopensolaris.org/txt/PSARC_2010_306.txt
jlliagre

1
@jlliagre ฉันค่อนข้างแน่ใจ แต่มันอาจจะอยู่ในบริบทของการใช้ ZFS อื่น ๆ ฉันไม่เห็นว่าทำไมพวกเขาถึงแตกต่างกันในแง่มุมพื้นฐานเช่นนี้ ฉันเชื่อว่าการใช้งาน ZFS แบบโอเพนซอร์ซทั้งหมดแบ่งปันรหัสจำนวนมากที่ติดตามเชื้อสายของมันกลับไปที่ซัน ฉันอาจตั้งค่าสภาพแวดล้อมการทดสอบบางอย่างสำหรับสิ่งนี้และโผล่มันด้วยไม้แล้วดูว่าเกิดอะไรขึ้น แต่มันจะมีเวลาก่อนที่ฉันจะอุทิศเวลาในการทำสิ่งนั้นจริง ๆ
CVn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.