zfs เปลี่ยนชื่อ / ย้ายระบบไฟล์รูทไปเป็น child


9

มีคำถามที่คล้ายกันอยู่แต่การแก้ปัญหา (โดยใช้mv) นั้นแย่มากเพราะในกรณีนี้มันทำงานเป็น "คัดลอกแล้วลบ" แทนที่จะย้าย "บริสุทธิ์"

ดังนั้นฉันสร้างสระว่ายน้ำ:

zpool create tank /dev/loop0

และ rsynced /tankข้อมูลของฉันจากการจัดเก็บอีกในนั้นโดยตรงเพื่อให้ข้อมูลของฉันในตอนนี้คือ

zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
tank      591G  2.10T   591G  /tank

ตอนนี้ฉันรู้แล้วว่าฉันต้องการให้ข้อมูลของฉันอยู่ในระบบไฟล์ลูกไม่ใช่ใน/tankระบบไฟล์โดยตรง

ดังนั้นฉันจะย้ายหรือเปลี่ยนชื่อระบบไฟล์รูทที่มีอยู่เพื่อให้กลายเป็นลูกในกลุ่มได้อย่างไร

การเปลี่ยนชื่อแบบง่ายจะไม่ทำงาน:

zfs rename tank tank/mydata
cannot rename to 'tank/mydata': datasets must be within same pool

(Btw ทำไมมันถึงบ่นว่าชุดข้อมูลไม่ได้อยู่ในกลุ่มเดียวกันเมื่อข้อเท็จจริงที่ว่าฉันมีเพียงหนึ่งกลุ่มเท่านั้น)

ฉันรู้ว่ามีวิธีแก้ปัญหาที่เกี่ยวข้องกับการคัดลอกข้อมูลทั้งหมด ( mvหรือส่งชุดข้อมูลทั้งหมดไปยังอุปกรณ์อื่นและย้อนกลับ) แต่ไม่ควรมีวิธีที่เรียบง่ายสง่างาม?

เพิ่งสังเกตว่าฉันไม่สนใจสแนปชอตในขั้นตอนนี้ (ยังไม่มีใครสนใจ)

คำตอบ:


4

(ดูหมายเหตุในข้อคิดเห็นการทำงาน แต่คุณจะไม่สามารถลบเริ่มต้น snapshot ดังนั้นจึงไม่ใช่วิธีที่ดี)

ด้วย ZFS สิ่งนี้จะตรงไปตรงมาอย่างน่าประหลาดใจเพียงแค่ถ่ายภาพโคลนและ rm ไม่มีพื้นที่ว่างเพิ่มเติมหรือเวลาคัดลอก

zfs snapshot tank@mydata
zfs clone tank@mydata tank/newname
zfs set mountpoint=/beep/boop tank/newname
rm -rf /tank/*

ระวังเมื่อรัน rm -rf หากคุณไม่เปลี่ยนจุดเชื่อมต่อหากคุณมีระบบไฟล์อื่นใน zpool ของคุณ คุณไม่ต้องการลบเนื้อหาของระบบไฟล์ใหม่ (/ ถัง / ชื่อใหม่) ซ้ำหรือระบบไฟล์ลูกอื่น ๆ (ถัง / *) โดยไม่ตั้งใจ เมื่อคุณยืนยันไฟล์ของคุณไม่ได้อยู่ในรูท fs (/ tank /) และเฉพาะในระบบไฟล์ใหม่ของคุณคุณสามารถลบสแนปชอตเริ่มต้นนั้นได้

zfs delete tank@mydata

ดูเหมือนว่าเป็นคำตอบที่น่าเชื่อถือ (ฉันไม่สามารถคิดวิธีอื่นในการรับข้อมูลไปยังชุดข้อมูลใหม่โดยไม่ย้าย) แต่น่าเสียดายที่คุณไม่สามารถลบภาพรวมต้นฉบับนี้ได้ โคลนมีผลข้างเคียงที่น่าอึดอัดใจเล็กน้อย คุณไม่สามารถลบ tank @ mydata เนื่องจากชุดข้อมูลใหม่ขึ้นอยู่กับมัน คุณสามารถโปรโมตชุดข้อมูลใหม่ซึ่งจะย้าย tank @ mydata ไปยัง tank / newname @ mydata แต่ตอนนี้คุณได้ทำการสับเปลี่ยนการพึ่งพาและคุณได้รับข้อผิดพลาด 'ชุดข้อมูลที่มีอยู่แล้ว' ถ้าคุณลองและลบชุดข้อมูลใหม่ (อย่างน้อย บน FreeBSD แม้ว่าฉันจะถือว่านี่เป็น ZFS เฉพาะมากกว่า OS)
USD Matt

@USDMatt: คุณพูดถูก มันทำงานได้อย่างสมบูรณ์ถ้าคุณทำงานกับระบบย่อย (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / renamed-asnap-clone) แต่ไม่ใช่ถ้าคุณทำงานที่รูทของ zpool ให้ความรู้สึกเหมือนเป็นแมลงจดบันทึกเป็นอีกเหตุผลหนึ่งที่ไม่เติมระบบไฟล์รูทของพูลของคุณ)
notpeter

4

ด้วยปัญหาที่บันทึกโดย @USDMatt การส่ง / รับ ZFS น่าจะเป็นวิธีที่ดีที่สุด

zfs snapshot tank@snap
zfs send tank@snap | zfs receive tank/anotherfs
zfs set mountpoint=/beep/boop tank/anotherfs
rm -rf /tank/*
zfs destroy tank@snap

ระวังเมื่อรัน rm -rf หากคุณไม่เปลี่ยนจุดเชื่อมต่อหากคุณมีระบบไฟล์อื่น ๆ ใน zpool ถังของคุณ คุณไม่ต้องการลบเนื้อหาของระบบไฟล์ใหม่ (/ tank / newname) ซ้ำหรือระบบไฟล์ย่อยอื่น ๆ (/ tank / *) โดยไม่ตั้งใจ


0

ฉันไม่คิดว่าจะมีวิธีที่หรูหราเรียบง่าย ... แม้ว่าคุณจะสามารถเปลี่ยนจุดเมานต์ของคุณ ...

mkdir /tank
zfs set mountpoint=/tank/mydata <possibly renamed tank set>

หรืออาจเปลี่ยนชื่อรถถังแล้วติดตั้งในตำแหน่งที่คุณต้องการ ...

ไม่ว่าจะเป็นหรือสร้างระบบไฟล์ในตำแหน่งที่เหมาะสมและ cp, mv หรือ zfs ส่ง / รับ ...

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