ฉันจะใช้ OverlayFS ได้อย่างไร


53

นี้คำตอบและข้อความอีเมลที่แสดงให้เห็นว่าสิ่งที่เรียกว่า "OverlayFS" สามารถใช้ได้ในอูบุนตู 11.10 และเข้มแข็งจะเข้ามาแทนที่ aufs ใน Ubuntu 12.04

ฉันจะใช้มันได้อย่างไร เอกสารของมันอยู่ที่ไหน


1
คุณและฉันทั้งสองพี่ชาย ฉันเคยเจอสิ่งนี้มาแล้ว: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. เกินกว่าที่ฉันไร้เดียงสา ฉันกำลังแก้ไขมันในระบบออนไลน์ แต่ฉันยังไม่สามารถจัดการให้มันทำงานได้ ฉันหวังว่าฉันจะพบว่า "Upperdir" และ "Lowerdir" หมายถึงอะไร ฉันไม่พบอะไรเลย
Chuck R

คำตอบ:


63

แก้ไข: เนื่องจากการเขียนคำตอบนี้บางสิ่งมีการเปลี่ยนแปลงในโอเวอร์เลย์คือการเพิ่มพารามิเตอร์ที่จำเป็นworkdirดูคำตอบของ tottiด้านล่างสำหรับคำอธิบายโดยละเอียดของพารามิเตอร์ใหม่นี้

ในที่สุดฉันก็หามันเจอ ฉันพบการอ้างอิงถึงที่มาในเคอร์เนล แต่ด้วยเหตุผลบางอย่างมันไม่ปรากฏในทรี git บน kernel.org แต่! ถ้าคุณดึงมาเคอร์เนล Ubuntu เช่นนี้คุณสามารถค้นหาได้ในapt-get source linux-image-3.0.0-16-generic linux-3.0.0/Documentation/overlayfs.txtนอกจากนี้ยังมีอยู่ในแพ็คเกจ linux-doc /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gzด้วย

เนื่องจากเอกสารวิธีใช้จริงเป็นมากกว่า "วิธีการทำงาน" แทนที่จะเป็น "วิธีติดตั้งด้วย" นี่เป็นบทสรุปสั้น ๆ (มีตัวอย่างหนึ่งในเอกสารประกอบเคอร์เนล):

mount -t overlayfs -o [mount options] overlayfs [mountpoint for merged system]

โดยที่ [ตัวเลือกการเมานท์] สามารถ:

  • lowerdir = somedir: lowerdir เป็นไดเรกทอรีที่คุณจะวางระบบไฟล์ใหม่ของคุณหากมีสิ่งที่ซ้ำกันเหล่านี้จะถูกเขียนทับโดย (จริง ๆ แล้วซ่อนอยู่ในความโปรดปราน) รุ่นของ Upperdir
  • upperdir = somedir: upperdir เป็นไดเรกทอรีที่คุณต้องการซ้อนทับ lowerdir ด้วย หากชื่อไฟล์ที่ซ้ำกันมีอยู่ใน Lowerdir และ Upperdir เวอร์ชัน Upperdir จะมีความสำคัญกว่า
  • ตัวเลือกการเมาท์มาตรฐาน สิ่งเดียวที่ฉันเห็นจากโค้ดคือ ro / rw แต่คุณสามารถทดลองได้

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

ตัวอย่างที่ 1 การซ้อนทับระบบไฟล์รูท

ฉันทำงานบนดิสก์บูตไฮบริดของ Ubuntu ที่มีระบบฐาน Ubuntu เป็น filesystem.squashfs และฉันมีไฟล์ชื่อ ubuntu.overlay kubuntu.overlay xubuntu.overlay และ lubuntu.overlay ไฟล์. overlay เป็นการติดตั้งพื้นฐานของระบบดังกล่าวพร้อมกับเนื้อหาของ filesystem.squashfs ที่ถูกตัด (เพื่อประหยัดพื้นที่) จากนั้นฉันก็แก้ไขสคริปต์ init เพื่อวางทับไฟล์. overlay ของ distro ที่ถูกต้อง (จากพารามิเตอร์การบู๊ต) โดยใช้ overlayfs และตัวเลือกด้านบนและทำงานได้อย่างมีเสน่ห์!

นี่คือบรรทัดที่ฉันใช้ในสคริปต์ init ของฉัน (เมื่อแปลตัวแปรทั้งหมดแล้ว):

mkdir -p /overlay
mount -t squashfs /cdrom/casper/ubuntu.overlay /overlay
mount -t overlayfs -o lowerdir=/filesystem.squashfs,upperdir=/overlay overlayfs /

โปรดทราบว่า filesystem.squashfs ด้านบนเป็นไดเรกทอรีที่สร้างโดยแคสเปอร์ไม่ใช่ไฟล์

ทั้งสามงบสร้าง/overlayไดเรกทอรีติดระบบแฟ้ม squashfs ใน/overlayไดเรกทอรีและจากนั้นใช้ OverlayFS เป็นหลักรวมเนื้อหาของมากกว่า/overlay/

ตัวอย่างที่ 2 การรวมโปร่งใสของสองไดเรกทอรี

ในกระบวนการสร้าง USB สดใหม่สำหรับแต่ละรุ่นฉันใช้ OverlayFS เพื่อประหยัดเวลา ฉันเริ่มต้นด้วยไดเรกทอรีที่เรียกว่า ubuntu-base ซึ่งมีเนื้อหาของภาพ ubuntu-core ซึ่งเป็นการติดตั้งขั้นพื้นฐานที่สุด ฉันจะสร้างไดเรกทอรีที่เรียกว่า ubuntu, kubuntu, lubuntu และ xubuntu

จากนั้นฉันใช้ OverlayFS เพื่อสร้างไฟล์จาก ubuntu-base แสดงในแต่ละไดเรกทอรี ฉันจะใช้สิ่งนี้:

mount -t overlayfs -o lowerdir=ubuntu-base,upperdir=kubuntu overlayfs kubuntu

สิ่งนี้ทำให้ไฟล์จาก ubuntu-base ปรากฏขึ้นในโฟลเดอร์ kubuntu จากนั้นฉันสามารถchrootไปยังโฟลเดอร์ Kubuntu apt-get install kubuntu-desktopและทำสิ่งที่ชอบ การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นระหว่างการเมานต์ OverlayFS นี้จะยังคงอยู่ในไดเรกทอรีด้านบนในกรณีนี้โฟลเดอร์ kubuntu จากนั้นเมื่อฉันยกเลิกการเมานท์ OverlayFS ก็จะทำการเมานท์ไฟล์ที่มีอยู่จริงใน ubuntu-base สิ่งนี้ทำให้ฉันไม่ต้องมีหลายสำเนาของไฟล์ใน ubuntu-base ในขณะที่ยังสามารถใช้งานได้ราวกับว่าพวกมันมีอยู่จริงในแต่ละตำแหน่ง


3
"แต่ด้วยเหตุผลบางอย่างมันไม่ปรากฏในทรี git บน kernel.org" - นั่นเป็นเพราะ overlayfs ไม่ได้อยู่ในเคอร์เนล upstream เหมือนกับ aufs ไม่ใช่ (และจะไม่เคย) ระบบไฟล์ร่วมดังกล่าวนั้นถูกรวมเข้าด้วยกันโดย Ubuntu Kernel Team
MestreLion

2
OverlayFS กำลังเข้าสู่เคอร์เนล 3.10
ดาวิดซี. บิชอป

8
ในที่สุดควรไปที่ 3.18 lwn.net/Articles/617099
Rmano

4
@Rmano: บนเครื่องของฉันมันใช้งานได้เฉพาะกับoverlayไม่ได้overlayfs
Janus Troelsen

1
ขอบคุณ @austinmarton ฉันพบสิ่งนี้มานานแล้วและ totti ก็ครอบคลุมไว้ด้านล่างก่อนที่ฉันจะอัปเดตคำตอบของฉันดังนั้นฉันจึงให้เครดิตกับคำตอบของเขาที่ด้านบนสุดของฉัน
Chuck R

20

จากhttps://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt :

บนและล่าง

ระบบไฟล์ซ้อนทับรวมสองระบบไฟล์ - ระบบไฟล์ 'บน' และระบบไฟล์ 'ล่าง' เมื่อชื่อมีอยู่ในทั้งสองระบบไฟล์วัตถุในระบบแฟ้ม 'ส่วนบน' จะมองเห็นได้ในขณะที่วัตถุในระบบแฟ้ม 'ด้านล่าง' อาจถูกซ่อนอยู่หรือในกรณีของไดเรกทอรีรวมกับวัตถุ 'ส่วนบน'

มันจะถูกต้องมากขึ้นในการอ้างถึง 'ไดเรกทอรีต้นไม้' ด้านบนและล่างแทนที่จะเป็น 'ระบบแฟ้ม' เนื่องจากเป็นไปได้มากที่ต้นไม้ไดเรกทอรีทั้งสองจะอยู่ในระบบแฟ้มเดียวกันและไม่มีข้อกำหนดว่าจะให้รากของระบบแฟ้มสำหรับ ทั้งบนหรือล่าง

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

การซ้อนทับแบบอ่านอย่างเดียวของระบบไฟล์แบบอ่านอย่างเดียวสองระบบอาจใช้ระบบไฟล์ประเภทใดก็ได้

ไดเรกทอรี

การวางซ้อนส่วนใหญ่เกี่ยวข้องกับไดเรกทอรี หากชื่อที่กำหนดปรากฏขึ้นในทั้งระบบไฟล์ด้านบนและด้านล่างและอ้างถึงไดเรกทอรีที่ไม่ใช่ในทั้งสองวัตถุด้านล่างจะถูกซ่อน - ชื่อหมายถึงวัตถุด้านบนเท่านั้น

ที่วัตถุทั้งบนและล่างเป็นไดเรกทอรีไดเรกทอรีที่ผสานจะเกิดขึ้น

ณ เวลาเมานต์สองไดเรกทอรีที่กำหนดให้เป็นตัวเลือกการเมานต์ "lowerdir" และ "upperdir" ถูกรวมเข้าในไดเรกทอรีที่ผสาน

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

"workdir" จะต้องเป็นไดเรกทอรีว่างเปล่าในระบบไฟล์เดียวกับ Upperdir

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

เฉพาะรายการของชื่อจากไดเรกทอรีที่ถูกผสาน เนื้อหาอื่น ๆ เช่นเมตาดาต้าและแอตทริบิวต์เพิ่มเติมมีการรายงานสำหรับไดเรกทอรีด้านบนเท่านั้น คุณลักษณะเหล่านี้ของไดเรกทอรีล่างถูกซ่อนอยู่


4
ขอบคุณสำหรับการชี้แจงเกี่ยวกับ workdir นั่นคือการเปลี่ยนแปลงที่ค่อนข้างเร็ว ๆ นี้และด้วยเหตุผลใดก็ตามที่ฉันไม่สามารถหาเอกสารเกี่ยวกับสิ่งที่ 'workdir' ทำจริง มันไม่ได้อยู่ในเคอร์เนลช่วยทั้งครั้งที่ฉันดู เพิ่มความสับสนในเลเยอร์ IMO แบบโอเวอร์เลย์ฉันหวังว่าจะสามารถใช้เวอร์ชันที่ใหม่กว่าได้หากไม่มีมันเป็นสิ่งที่ยุ่งเหยิงในเวิร์กโฟลว์ของฉัน
Chuck R

7

ฉันได้ขยายบทความเหล่านี้เพื่อรวมสคริปต์สำหรับ overlayfs ที่ตั้งค่ารูท fs แบบอ่านอย่างเดียว

หวังว่ามันจะช่วย


1
ขอบคุณงานที่คนอื่นทำ Dustin และฉันได้เพิ่มแพคเกจ banary ชื่อว่า 'overlayroot' ลงใน quantal ซึ่งเป็นส่วนหนึ่งของแพ็กเกจซอร์สของcloud-initramfs-tools ดูเอกสารการใช้งานใน/etc/overlayroot.conf
smoser

2

ตัวอย่างที่เรียกใช้น้อยที่สุด

# Create the filesystems.
dd if=/dev/zero of=lower.ext4 bs=1024 count=102400
mkfs -t ext4 lower.ext4
cp lower.ext4 upper.ext4
mkdir lower upper overlay
sudo mount lower.ext4 lower
sudo mount upper.ext4 upper
sudo chown "$USER:$USER" lower upper
printf lower-content > lower/lower-file
# Upper and work must be on the same filesystem.
mkdir upper/upper upper/work
printf upper-content > upper/upper/upper-file
# Work must be empty. E.g. this would be bad:
#printf work-content > upper/work/work-file
# Make the lower readonly to show that that is possible:
# writes actually end up on the upper filesystem.
sudo mount -o remount,ro lower.ext4 lower

# Create the overlay mount.
sudo mount \
  -t overlay \
  -o lowerdir=lower,upperdir=upper/upper,workdir=upper/work \
  none \
  overlay \
;

# Interact with the mount.
printf 'overlay-content' > overlay/overlay-file
ls lower upper/upper upper/work overlay

# Write to underlying directories while mounted
# gives undefined behaviour.
#printf lower-content-2 > lower/lower-file-2
#printf upper-content-2 > upper/upper-file-2

# Unmount the overlay and observe state.
sudo umount overlay
ls lower upper/upper upper/work

# Cleanup.
sudo umount upper lower

GitHub ต้นน้ำ

เอาท์พุทของครั้งแรกที่lsมีภูเขา:

lower:
lost+found  lower-file

overlay:
lost+found  lower-file  overlay-file  upper-file

upper/upper:
overlay-file  upper-file

upper/work:
work

เอาต์พุตของวินาทีที่lsไม่มีการเมาท์:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

การตีความ:

  • ด้านล่าง: ไม่เปลี่ยนแปลงหลังจากเขียนทับ
  • upper: ได้รับการดัดแปลงเพื่อวางซ้อน
  • โอเวอร์เลย์: แสดงไฟล์จากทั้งบนและล่าง
  • ทำงาน: มีเนื้อหาสุ่ม ( work/ไดเรกทอรี) บางอย่างที่เราไม่ควรสนใจ

ตัวอย่างที่ดัดแปลงจาก: ตัวอย่างการใช้ OverlayFS

นี่คือตัวอย่างที่ซับซ้อนมากขึ้นที่มีเลเยอร์ที่ต่ำกว่าหลาย ๆ อัน: Overlayfs โหลดซ้ำกับเลเยอร์หลายรายการ (การย้ายออกจาก aufs)

ทดสอบกับ Ubuntu 18.04, Linux kernel 4.15.0

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