當(dāng)我們升級(jí) macOS Catalina 后,卻發(fā)現(xiàn)一件我煩心的事:用 Alfred 搜索應(yīng)用時(shí),不少應(yīng)用都會(huì)重復(fù)出現(xiàn)。當(dāng)我按照兩個(gè)應(yīng)用顯示的路徑去查看,卻發(fā)現(xiàn)了讓我不解的現(xiàn)象:Macintosh HD/Applications路徑一直都是應(yīng)用安裝的默認(rèn)路徑,沒有問題。但這個(gè) System/volumes/Macintosh/Applications文件夾從何而來?

更加奇怪的是,仔細(xì)看顯示的路徑,從 Macintosh HD 盤符開始的路徑,居然又回到 Macintosh HD,仿佛是陷入了自我循環(huán)。

想弄清這兩個(gè)問題,就要回到在 Catalina 升級(jí)時(shí),去看看硬盤里發(fā)生的事情。
1、
一切要從 macOS 的系統(tǒng)文件的安全性開始講起。
從 El Capitan 開始,Apple 工程師給 macOS 加上了「系統(tǒng)完整性保護(hù)」技術(shù)。這就像給書柜的某些抽屜加上了鎖,沒有鑰匙就拿不到里面的文件,這樣系統(tǒng)文件就不會(huì)被輕易篡改。
不過有鎖就有鑰匙,只要獲得了 root 權(quán)限,惡意程序還是能讀寫系統(tǒng)文件。
到了 Catalina,Apple 工程師想了一個(gè)更徹底的辦法:那就是將所有系統(tǒng)文件從原本的文件系統(tǒng)中分離出來,組成獨(dú)立的文件系統(tǒng),并且把這個(gè)文件系統(tǒng)從設(shè)計(jì)上設(shè)定為只能讀取,不能寫入。
就好像買了一個(gè)新書柜專門用來放重要文件,而且這個(gè)書柜壓根就沒有可以打開的地方,這樣系統(tǒng)文件就很難被惡意修改。

具體要如何實(shí)現(xiàn)呢?首先要感謝 macOS High Sierra 中開始使用的新文件系統(tǒng) —— APFS,它可以輕松地在一塊磁盤中創(chuàng)建多個(gè)卷。
在安裝 Catalina 時(shí),會(huì)在磁盤中新建一個(gè) Macintosh HD 卷,并且將原來的卷改名為 Macintosh HD Data。新建的 Macintosh HD 卷就是專用用來存放系統(tǒng)文件的「書柜」,整個(gè)卷都是只讀的。 Macintosh HD Data 就像之前一樣,讓用戶自由地讀寫數(shù)據(jù)、安裝應(yīng)用。

創(chuàng)建好 Macintosh HD 之后,Macintosh HD Data 中的系統(tǒng)文件就會(huì)被剪切到系統(tǒng)卷 Macintosh HD ,組成獨(dú)立的文件系統(tǒng)。

至此,通過分離系統(tǒng)文件到獨(dú)立卷的操作就完成了。無論程序在 Macintosh HD Data 卷對(duì)文件系統(tǒng)做什么,都不會(huì)影響 Macintosh HD 中的系統(tǒng)文件。
在一塊硬盤上設(shè)置兩個(gè)文件系統(tǒng),實(shí)現(xiàn)了 Apple 工程師們想要系統(tǒng)安全性。不過如果就此結(jié)束,可就苦了用戶和開發(fā)者們了。
2、
一塊磁盤同時(shí)存在兩個(gè)宗卷、兩套文件系統(tǒng)會(huì)造成什么問題呢?
對(duì)于用戶來說,會(huì)明顯感受到文件系統(tǒng)的不統(tǒng)一。最明顯的是在 Finder 中,如果不加以處理,你應(yīng)該會(huì)同時(shí)看到 Macintosh HD Data 與 Macintosh HD。而且就像 Windows 上的不同分區(qū),找起文件來會(huì)比單一宗卷麻煩得多。
而對(duì)開發(fā)者來說,問題就嚴(yán)重的多?,F(xiàn)在所有系統(tǒng)文件都會(huì)被移到了 Macintosh HD 中,而第三方應(yīng)用只能待在 Macintosh HD Data。不少應(yīng)用會(huì)依賴系統(tǒng)程序和文件,如果開發(fā)者不加以適配,按照原來設(shè)定好的路徑就會(huì)找不到系統(tǒng)文件,應(yīng)用就無法使用了。這種純粹因?yàn)?Apple 引起的「技術(shù)債」,開發(fā)這可不會(huì)樂意花自己的時(shí)間去還。
為了讓用戶和程序?qū)⑦@兩個(gè)原本獨(dú)立的文件系統(tǒng),當(dāng)作一個(gè)統(tǒng)一的文件系統(tǒng)來使用,Apple 用「卷組」和 「firmlink」 這兩項(xiàng)技術(shù),來了一場(chǎng)障眼法表演。

為了解決兩個(gè)宗卷的顯示問題,Apple 工程師引入了「卷組」這一概念,一個(gè)卷組由一個(gè)系統(tǒng)卷( Macintosh HD)和一個(gè)數(shù)據(jù)卷( Macintosh HD Data)組成。數(shù)據(jù)卷會(huì)像一塊外置硬盤一樣,被掛載在 /System/Volumes 目錄下,這樣兩個(gè)文件系統(tǒng)就合成了一個(gè)文件系統(tǒng)。而在 Finder 邊欄中,只有 Macintosh HD 會(huì)顯示出來。這樣普通用戶就不會(huì)察覺到硬盤中存在著兩個(gè)宗卷,只有當(dāng)你打開 Disk Utility 時(shí),就會(huì)看到兩個(gè)宗卷。

這種程度的障眼法瞞得過普通用戶,卻瞞不過應(yīng)用程序。一方面前文所說的文件路徑的問題沒有被解決,另一方面應(yīng)用程度文件數(shù)量巨大,而且需要頻繁讀取,簡(jiǎn)單的直接掛載在 /System/Volumes 目錄下,不加以處理的話,會(huì)極大地消耗電腦的硬件資源。
為了填這個(gè)坑,Apple 工程師引入了 firmlink 技術(shù)。
firmlink 是什么呢?用 Apple 工程師自己的原話說,它就是數(shù)據(jù)卷與系統(tǒng)卷之間的「雙向蟲洞」。聽上去很復(fù)雜,其實(shí)從實(shí)際效果去看的話,是很容易理解的。
既然我們是想讓兩個(gè)系統(tǒng)看上去像一個(gè)完整的文件系統(tǒng),那我們給數(shù)據(jù)卷中的文件在系統(tǒng)卷中創(chuàng)建一個(gè)替身,結(jié)合系統(tǒng)文件和替身,不就得到了一個(gè)完整且單一的文件系統(tǒng)了嗎?

這個(gè)數(shù)據(jù)卷中的文件在系統(tǒng)卷中的替身,就是 firmlink。例如 /Users 是 Macintosh HD Data 中的文件夾,但它在系統(tǒng)卷的根目錄下有一個(gè) firmlink 。 所以你在硬盤的根目錄中看到的 /Users ,真實(shí)的目錄地址其實(shí)是 /System/Volumes/Data/Users/。如果你想知道自己 Mac 為哪些文件創(chuàng)建了 firmlink查看。

當(dāng)然 firmlink 的厲害之處,在于應(yīng)用程序可以通過它,遍歷整個(gè)系統(tǒng)卷的文件系統(tǒng)。例如程序可以從數(shù)據(jù)卷中的 /System/Volumes/Data/Users/用戶名/Desktop ,直接通過 /System/Users/用戶名/Desktop 的路徑回到系統(tǒng)卷中,這樣就大大減少了不必要的資源消耗。而且從應(yīng)用程序的視角去看,系統(tǒng)文件一直存在于它原來的位置。這樣一來,開發(fā)者完全不需要因?yàn)樾碌奈募到y(tǒng)做任何適配。
利用 firmlink,無論是在 Finder,還是實(shí)際的文件目錄中,不管是用戶還是應(yīng)用程序,都被 Apple 的障眼法瞞了過去,將系統(tǒng)卷和數(shù)據(jù)卷的文件系統(tǒng)當(dāng)成統(tǒng)一的文件系統(tǒng)。
知道了 firmlink 和卷組的存在,我們終于能解釋文章開頭的問題。
3、
首先,系統(tǒng)中并不存在兩個(gè)重復(fù)的應(yīng)用。數(shù)據(jù)卷 Macintosh HD Data 負(fù)責(zé)第三方應(yīng)用的安裝,所以 System/volumes/Macintosh/Applications 才是應(yīng)用的真實(shí)目錄,而 Macintosh HD/Applications 只是它的 。解決辦法也很簡(jiǎn)單,在 Alfred 中輸入 reload 命令,Alfred 就會(huì)恢復(fù)正常。

而 Macintosh HD宗卷在 Finder 中出現(xiàn)自我循環(huán)的現(xiàn)象,其實(shí)只是 Finder 施加的一點(diǎn)小魔法。
前文解釋過,Macintosh HD Data 被掛載在了系統(tǒng)卷的 /System/Volumes 目錄中,所以這個(gè)目錄中的 Macintosh HD,其實(shí)是 Macintosh HD Data ,只不過為了避免使用者因?yàn)椴皇煜み@個(gè)名字,對(duì)其誤操作(對(duì)數(shù)據(jù)卷內(nèi)的文件用戶是可以寫入和刪除的?。?,同時(shí)也讓文件系統(tǒng)看上去完整,F(xiàn)inder 將它顯示成了Macintosh HD。不信?用 Terminal 或者其他終端查看下,就能看到/System/Volumes 目錄下文件夾的真實(shí)名字。

忙活了半天,Apple 工程師終于可以安心地打把昆特牌,再也不會(huì)被客服追著問:這里有 Mac 用戶誤刪了系統(tǒng)文件,要怎么修復(fù)???這項(xiàng)技術(shù)這么好,用在 iOS 行不行啊?行??!而且實(shí)際上,iOS 上的系統(tǒng)文件早就被放在單獨(dú)的系統(tǒng)卷中保護(hù)起來了。