Làm cách nào để sử dụng OverlayFS?


53

Đây câu trả lờithông điệp email chỉ ra rằng một cái gì đó gọi là "OverlayFS" có sẵn trong Ubuntu 11.10 và mạnh mẽ sẽ thay thế aufs trong Ubuntu 12.04.

Làm thế nào để tôi sử dụng nó? Tài liệu của nó ở đâu?


1
Anh và em cả, anh ạ. Tôi đã đi qua điều này cho đến nay : mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Ngoài ra tôi không biết gì. Tôi đang mày mò với nó trong một hệ thống trực tiếp, nhưng tôi vẫn chưa thể làm cho nó hoạt động được. Tôi ước tôi có thể tìm ra chính xác "Upperdir" và "Lowerdir" nghĩa là gì. Tôi không tìm thấy gì cả.
Chuck R

Câu trả lời:


63

Chỉnh sửa: Kể từ khi viết câu trả lời này, một số điều đã thay đổi trong lớp phủ, cụ thể là việc thêm một tham số bắt buộc workdir, xem câu trả lời của tott bên dưới để biết mô tả chi tiết về tham số mới này.

Cuối cùng tôi cũng tìm được nó. Tôi đã tìm thấy các tham chiếu đến nó trong nguồn kernel, nhưng vì một số lý do, nó không xuất hiện trong cây git trên kernel.org. Nhưng! Nếu bạn lấy nguồn kernel Ubuntu như thế này: apt-get source linux-image-3.0.0-16-genericbạn có thể tìm thấy nó trong linux-3.0.0/Documentation/overlayfs.txt. Nó cũng có sẵn trong gói linux-doc /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Vì tài liệu trợ giúp thực tế là nhiều hơn "cách thức hoạt động" thay vì "cách gắn kết với nó", đây là một tóm tắt ngắn gọn (có một ví dụ trong tài liệu kernel):

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

Trong đó [tùy chọn gắn kết] có thể là:

  • lowdir = somedir: lowdir là thư mục bạn sẽ đặt hệ thống tập tin mới của mình lên, nếu có các bản sao này bị ghi đè bởi (thực sự, ẩn trong) phiên bản của Upperdir
  • Upperdir = somedir: Upperdir là thư mục bạn muốn phủ lên Lowerdir với. Nếu tên tệp trùng lặp tồn tại trong lowdir và Upperdir, phiên bản của Upperdir được ưu tiên.
  • tùy chọn gắn kết tiêu chuẩn. Người duy nhất tôi thấy từ mã là ro / rw, nhưng bạn có thể thử nghiệm.

Một điều khiến tôi bối rối lúc đầu, vì vậy tôi có lẽ nên làm rõ, đó là việc gắn một lớp phủ không thực sự gắn kết một hệ thống tập tin. Tôi đã cố gắn hệ thống tập tin squashfs bằng cách sử dụng mount overlayfs, nhưng đó không phải là cách nó hoạt động. Trước tiên, bạn phải gắn hệ thống tệp (trong trường hợp của tôi là squashfs) vào một thư mục tùy ý, sau đó sử dụng lớp phủ để hợp nhất điểm gắn kết (một thư mục) và một thư mục khác vào thư mục cấp ba (điểm gắn kết lớp phủ) (chỉnh sửa: thư mục "đại học" này thực sự có thể là thư mục Upperdir =). Thư mục cấp ba là nơi bạn sẽ thấy các hệ thống tệp được hợp nhất (hoặc cây thư mục - nó linh hoạt).

Ví dụ 1, lớp phủ hệ thống tập tin gốc

Tôi đã làm việc trên một đĩa khởi động lai Ubuntu, trong đó hệ thống Ubuntu cơ sở tồn tại dưới dạng filesystem.squashfs và tôi có các tệp có tên ub Ubuntu.overlay kubfox.overlay xubfox.overlay và mỡ Ubuntu.overlay. Các tệp .overlay là các bản cài đặt cơ bản của các hệ thống đã nói với nội dung của filesystem.squashfs được cắt tỉa (để tiết kiệm dung lượng). Sau đó, tôi đã sửa đổi các tập lệnh init để phủ lớp tệp .overlay chính xác (từ một tham số khởi động) bằng cách sử dụng lớp phủ và các tùy chọn ở trên và nó hoạt động như một bùa mê!

Đây là những dòng mà tôi đã sử dụng trong tập lệnh init của mình (một khi tất cả các biến được dịch):

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

Lưu ý rằng filesystem.squashfs ở trên là một thư mục được tạo bởi casper, không phải là một tệp.

Ba câu lệnh này tạo ra một /overlaythư mục, gắn kết một hệ thống tập tin squashfs trên /overlaythư mục và sau đó sử dụng OverlayFS để hợp nhất các nội dung của /overlayhơn /.

Ví dụ 2, hợp nhất hai thư mục

Trong quá trình xây dựng lại USB trực tiếp của tôi cho mỗi bản phát hành, tôi sử dụng OverlayFS để tiết kiệm rất nhiều thời gian. Tôi bắt đầu với một thư mục có tên ubfox-base chứa nội dung của hình ảnh lõi ub Ubuntu là cài đặt cơ bản nhất. Sau đó, tôi sẽ tạo các thư mục có tên là ubfox, kubfox, mỡ Ubuntu và xubfox.

Sau đó, tôi sử dụng OverlayFS để làm cho các tệp từ cơ sở Ubuntu xuất hiện trong các thư mục riêng lẻ. Tôi sẽ sử dụng một cái gì đó như thế này:

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

Điều này làm cho các tệp từ ubfox-base hiển thị trong thư mục kubfox. Sau đó, tôi có thể chrootvào thư mục kubfox và làm một cái gì đó như apt-get install kubuntu-desktop. Mọi thay đổi được thực hiện trong khi gắn kết OverlayFS này sẽ vẫn ở thư mục trên, trong trường hợp này là thư mục kubfox. Sau đó, một khi tôi ngắt kết nối OverlayFS, các tệp thực sự tồn tại trong cơ sở Ubuntu nhưng được "nhân đôi" vào thư mục kubfox biến mất trừ khi chúng bị thay đổi. Điều này giúp tôi không phải có nhiều bản sao của các tệp trong cơ sở Ubuntu trong khi vẫn có thể sử dụng chúng như thể chúng tồn tại trên thực tế ở mỗi vị trí.


3
"nhưng vì một số lý do, nó không xuất hiện trong cây git trên kernel.org" - Đó là vì lớp phủ không nằm trong kernel ngược dòng, giống như aufs không (và sẽ không bao giờ). Các hệ thống tập tin liên minh như vậy được tích hợp bởi Ubuntu Kernel Team.
MestreLion

2
OverlayFS rõ ràng là nhận được vào kernel 3.10.
David C. Giám mục

8
Cuối cùng, nên vào 3.18 lwn.net/Articles/617099
Rmano

4
@Rmano: trên máy của tôi, nó chỉ hoạt động mà overlaykhông cóoverlayfs
Janus Troelsen

1
Cảm ơn bạn @austinmarton, tôi cũng đã tìm thấy điều này một thời gian và totti đã trình bày nó bên dưới trước khi tôi cập nhật câu trả lời của mình, vì vậy tôi đã ghi công cho câu trả lời của anh ấy ở đầu trang của tôi.
Chuck R

20

Từ https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt :

Trên và dưới

Hệ thống tệp lớp phủ kết hợp hai hệ thống tệp - hệ thống tệp 'trên' và hệ thống tệp 'dưới'. Khi một tên tồn tại trong cả hai hệ thống tệp, đối tượng trong hệ thống tệp 'trên' sẽ hiển thị trong khi đối tượng trong hệ thống tệp 'dưới' bị ẩn hoặc, trong trường hợp thư mục, được hợp nhất với đối tượng 'trên'.

Sẽ đúng hơn nếu đề cập đến một 'cây thư mục' trên và dưới thay vì 'hệ thống tập tin' vì cả hai cây thư mục đều nằm trong cùng một hệ thống và không có yêu cầu nào phải lấy gốc của hệ thống tập tin hoặc trên hoặc dưới.

Hệ thống tệp thấp hơn có thể là bất kỳ hệ thống tệp nào được Linux hỗ trợ và không cần phải ghi. Hệ thống tập tin thấp hơn thậm chí có thể là một lớp phủ khác. Hệ thống tập tin phía trên thường sẽ có thể ghi được và nếu nó phải hỗ trợ việc tạo các thuộc tính đáng tin cậy. * Mở rộng và phải cung cấp d_type hợp lệ trong các phản hồi readdir, vì vậy NFS không phù hợp.

Lớp phủ chỉ đọc của hai hệ thống tệp chỉ đọc có thể sử dụng bất kỳ loại hệ thống tệp nào.

Thư mục

Lớp phủ chủ yếu liên quan đến các thư mục. Nếu một tên cụ thể xuất hiện trong cả hai hệ thống tập tin trên và dưới và đề cập đến một thư mục không thuộc một trong hai thì đối tượng thấp hơn sẽ bị ẩn - tên chỉ liên quan đến đối tượng trên.

Trong đó cả hai đối tượng trên và dưới là các thư mục, một thư mục hợp nhất được hình thành.

Tại thời điểm gắn kết, hai thư mục được cung cấp dưới dạng tùy chọn gắn kết "lowdir" và "Upperdir" được kết hợp thành một thư mục hợp nhất:

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

"Workdir" cần phải là một thư mục trống trên cùng một hệ thống tập tin như Upperdir.

Sau đó, bất cứ khi nào một tra cứu được yêu cầu trong một thư mục được hợp nhất như vậy, việc tra cứu được thực hiện trong mỗi thư mục thực tế và kết quả kết hợp được lưu trong bộ đệm thuộc hệ thống tập tin lớp phủ. Nếu cả hai tra cứu thực tế tìm thấy các thư mục, cả hai đều được lưu trữ và một thư mục hợp nhất được tạo ra, nếu không thì chỉ có một thư mục được lưu trữ: phía trên nếu nó tồn tại, nếu không thì thấp hơn.

Chỉ có danh sách các tên từ thư mục được hợp nhất. Các nội dung khác như siêu dữ liệu và các thuộc tính mở rộng chỉ được báo cáo cho thư mục trên. Các thuộc tính của thư mục thấp hơn được ẩn.


4
Cảm ơn đã làm rõ về workdir. Đó là một thay đổi khá gần đây và vì bất kỳ lý do gì, tôi không bao giờ có thể tìm thấy bất kỳ tài liệu nào về những gì 'công việc' thực sự đã làm. Nó không có trong kernel giúp lần cuối tôi nhìn. Thêm một lớp nhầm lẫn cho lớp phủ IMO, mong muốn các phiên bản mới hơn có thể được sử dụng mà không có nó - nó làm rối tung quy trình làm việc của tôi.
Chuck R

7

Tôi đã mở rộng các artikels này để bao gồm một Script cho các lớp phủ để thiết lập một fs gốc chỉ đọc.

Hy vọng nó giúp.


1
Nhờ vào công việc mà những người khác đã làm, Dustin và tôi đã thêm gói ban hành có tên 'overlayroot' vào định lượng, là một phần của gói nguồn công cụ đám mây-initramfs . Xem tài liệu sử dụng trong /etc/overlayroot.conf
smoser

2

Ví dụ runnable tối thiểu

# 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 ngược dòng .

Đầu ra của đầu tiên lsvới mount:

lower:
lost+found  lower-file

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

upper/upper:
overlay-file  upper-file

upper/work:
work

Đầu ra thứ hai lskhông có giá đỡ:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Diễn dịch:

  • thấp hơn: không thay đổi sau khi viết lên lớp phủ
  • trên: nhận được sửa đổi cho lớp phủ
  • lớp phủ: hiển thị các tệp từ cả trên và dưới
  • công việc: chứa một số nội dung ngẫu nhiên (một work/thư mục) chúng ta không nên quan tâm

Ví dụ được điều chỉnh từ: Ví dụ sử dụng OverlayFS

Dưới đây là một ví dụ phức tạp hơn với nhiều lớp thấp hơn: Lớp phủ tải lại với nhiều lớp (di chuyển khỏi aufs)

Đã thử nghiệm trên Ubuntu 18.04, nhân Linux 4.15.0.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.