วิธีที่เหมาะสมในการจัดการภาชนะบรรจุ LXC บน btrfs


11

ให้บอกว่าเรามีเซิร์ฟเวอร์เป็นหนึ่งเดียวกับ LXC ติดตั้งและภาชนะ LXC ที่ใช้สำหรับเป็นฐาน /var/lib/lxc/ubuntu_baseimg เพื่อความง่ายให้ลืมการเปลี่ยนแปลงการตั้งค่าหลังจากคัดลอก img img

บางคนแนะนำให้ใช้ subvolumes และ snapshots สำหรับการสร้างตู้คอนเทนเนอร์ใหม่ แต่ใคร ๆ ก็สามารถทำ cp --reflink กับผลลัพธ์ที่คล้ายกันได้อย่างง่ายดาย

แล้ววิธีการของโพรปเปอร์คืออะไร (หรือดีกว่า) สำหรับการจัดการหลาย ๆ คอนเทนเนอร์?

  • ภาพรวม

วิธีนี้ดูดีที่สุด แต่คำสั่งเช่น lxc-destroy จะไม่ทำงานเนื่องจากจะไม่สามารถลบไดเรกทอรีได้

btrfs subvolume snapshot /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • cp พร้อม reflink

ฉันไม่แน่ใจว่ามีความแตกต่างด้านประสิทธิภาพหรือไม่ระหว่างสแนปชอตนี้

cp --reflink=always /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • หรือมีวิธีการอื่นที่ดีกว่าในการทำสิ่งนี้ซึ่งฉันไม่ทราบ

แก้ไข:

สิ่งหนึ่งที่ฉันเห็นด้วยตัวเลือก reflink คือคุณไม่สามารถลบที่เก็บฐานถ้าคนอื่นกำลังทำงานเพราะ/procและ/devมีการติดตั้งและไม่เคยเปลี่ยนการอ้างอิงเสมอเหมือนกัน แต่การปิดตู้คอนเทนเนอร์ที่มีดอกป๊อบทั้งหมดดูเหมือนจะช่วยได้


ฉันใช้คุณสมบัติสแนปชอตของ btrfs เพื่อสร้างคอนเทนเนอร์ใหม่ - และมันใช้งานได้ดี อย่างไรก็ตาม btrfs มีแคชหน้าต่อหนึ่งไดรฟ์ย่อยดังนั้นแม้ว่าการใช้สแนปชอตนั้นรวดเร็ว / มีพื้นที่ดิสก์ที่มีประสิทธิภาพ
David Goodwin

คำตอบ:


2

ฉันใช้ Ubuntu LTS 14 และเพิ่งวิ่งต่อไปนี้ (เป็นครั้งแรกแม้) และมันทำงานได้อย่างมีเสน่ห์:

lxc-stop -n ubuntu_base
lxc-clone -o ubuntu_base -n ubuntu_base_c1 -s
lxc-start -n ubuntu_base_c1 -d # make changes if needed
lxc-stop -n ubuntu_base_c1
lxc-snapshot -n ubuntu_base_c1

การใช้ -s กับ lxc-clone จะถ่ายภาพถ้าการจัดเก็บสำรองเป็น btrfs (ในกรณีของคุณ)

ตรวจสอบโคลนใหม่ / สแนปชอตด้วย

lxc-ls -f
btrfs subvolume list /var/lib/lxc

หวังว่าจะช่วย!


1
โปรดทราบว่าวันนี้คุณต้องระบุbtrfsเป็นที่เก็บข้อมูลสำรองเมื่อคุณเรียกใช้lxc-createหรือlxc-cloneจะให้overlayfsแทนคุณ
เลสเตอร์ Cheung

เมื่อต้องการสร้างคอนเทนเนอร์ "แสง" ใหม่ดูเหมือนว่าทั้งสองบรรทัดแรกนั้นเพียงพอ (lxc-stop และ lxc-clone) ต้องขอบคุณ-sตัวเลือกและสามบรรทัดสุดท้าย (lxc_start, lxc_stop, lxc_snapshot) เป็นเพียง an an กระบวนการตัวช่วยในการจัดการวิวัฒนาการคอนเทนเนอร์ในอนาคต ถูกต้องหรือไม่
lalebarde

3

ถ้าคุณจะใช้ btrfs subvolumes สำหรับ LXC คุณจะต้องเพิ่มตัวเลือกในของคุณuser_subvol_rm_allowed /etc/fstabตัวอย่างที่แยกจากไฟล์ fstab หนึ่งไฟล์:

UUID=XXXXXXXXXXXXXXXXXXXXXX / btrfs subvol=@,user_subvol_rm_allowed,defaults 0 0

ตัวเลือกจะอนุญาตให้คุณลบ subvol โดยไม่ต้องเป็น root ผู้ใช้ปกติเท่านั้น ความสามารถนี้ถูกใช้โดย lxc เมื่อสแน็ปช็อตไปใน btrfs subvolumes


3

คิดว่ามันขึ้นอยู่กับว่าภาพหลักของคุณมันใหญ่แค่ไหน ฉันอาจlxc สร้างคอนเทนเนอร์ใหม่และใช้ Salt / Puppet ฯลฯ เพื่อจัดเตรียมคอนเทนเนอร์ของฉันและเฉพาะlxc-cloneสำหรับคอนเทนเนอร์ที่ค่อนข้างใหญ่กว่า (เช่นคอนเทนเนอร์ dev ที่มีเครื่องมือจำนวนมากที่ติดตั้งและตั้งค่า)

โปรดทราบว่าlxc-cloneจะใช้ที่เก็บข้อมูลสำรองเดียวกันกับแหล่งที่มา ดังนั้นในการใช้ subvolume คุณจะต้องสร้างคอนเทนเนอร์ด้วย "-B btrfs" ตัวอย่างเช่น:

lxc-create -B btrfs -n mycontainer -t ubuntu

จากนั้นโคลนด้วย:

lxc-clone -s mycontainer mynewcontainer

ในกรณีที่คุณใช้ zfs เพื่อจัดเก็บตู้คอนเทนเนอร์ของคุณมี--zfsrootตัวเลือกพิเศษสำหรับ lxc-create เพื่อให้คุณสามารถเลือก zpool นอกเหนือจาก "tank" เริ่มต้น ตัวอย่างเช่น:

lxc-create -B zfs --zfsroot=data/lxc

แบ่งปันและสนุก!


ฉันเป็นคนขี้ขลาดตาขาวกับ BTRFS ปรากฏว่า-B btrfsมีการใช้ตัวเลือกตามค่าเริ่มต้น - ฉันถือว่าเนื่องจากเดเบียนของฉันถูกตั้งค่าด้วย BTRFS ที่จริงแล้วฉันสร้างคอนเทนเนอร์แรกของฉัน (เสียงฮือฮา debian 32 บิต) โดยไม่มีตัวเลือกนี้และสร้าง subvolume ขึ้นมา
lalebarde

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