覆疊檔案系統(overlay filesystem)
覆疊檔案系統(overlay filesystem)是一種分層的把戲,讓容器能廉價地共用一個共同的基底映像,同時每個容器仍各自取得可寫入的空間。想像一本不能在上面寫字的印刷參考書,蓋上一張透明的賽璐珞片:你直接透過賽璐珞片讀到底下的書頁,但你做的任何筆記都寫在賽璐珞片上,書本保持原封不動。許多人可以共用一本書,各自有自己那張寫了變動的賽璐珞片。這種「把唯讀的基底墊在可寫入的頂層之下」的堆疊,正是覆疊(或聯合)檔案系統所做的事。
具體而言它把兩層或更多層合併成一個視角。有一個唯讀且共享的下層(容器映像:作業系統檔案、程式庫與應用程式),以及一個可寫入且為單一容器私有的上層。當容器讀取一個檔案時,檔案系統先看上層,再退回下層;它看到的是合併後的結果,彷彿那是一個普通的檔案系統。當容器要寫入一個只存在於唯讀下層的檔案時,檔案系統會先把它私下複製到上層再去編輯那份副本——這是一個寫入時複製(copy-on-write)步驟——所以共享的基底永不被動到,使用同一個基底的其他容器也不受影響。
覆疊檔案系統之所以重要,是因為它正是讓容器映像如此省空間、啟動如此快速的關鍵:一百個來自同一映像的容器,共用它那數 GB 的一份唯讀副本,而每個容器只多加一層薄薄的上層,存放它實際更動的少數檔案。這也是為何容器被刪除時它的寫入會隨之消失,除非你刻意把它們存到別處——可寫入的上層在設計上就是短暫的。誠實的告誡:覆疊的寫入若必須先把一個大檔案複製上來,可能比在普通檔案系統上寫入慢;而且只有當容器真的共用相同的下層時,這種分層才省空間。
二十個容器全都從同一個 800 MB 的映像啟動。它們共用那一個唯讀的下層;每個容器只多加一層極小的可寫入上層,僅幾 MB,用來放自己的設定與紀錄。當其中一個容器編輯一個共享的系統檔案時,會在它的上層建立一份私有副本,讓其餘十九個容器的基底保持不變。
一個共享的唯讀基底,每個容器一層薄薄的私有可寫入層,靠寫入時複製接合。
容器的寫入活在短暫的上層裡,所以容器被移除時它們就丟失了,除非你把資料存到獨立的卷冊(volume)。覆疊也會拖慢「對下層大檔案的第一次寫入」,因為它必須先把整個檔案複製上來才能編輯。