靠!安裝了macOS Catalina(10.15.4)後,文件系統都亂套了

本文同步發表於我的微信公衆號,掃一掃文章底部的二維碼或在微信搜索 極客起源 即可關注,每個工作日都有文章更新。

最近閒來無事,決定將我的兩臺apple電腦升級成最新的蘋果系統(macOS Catalina),當然,由於以前升級過多次mac系統,所以毫不猶豫從app store下載了最新的macOS Cetalina系統,當然,下載很快,安裝也很快,過程就不說了,so easy。
1.  到底發生了什麼事
不過安裝完後,發生了一件不可思議的事,進入硬盤,發現硬盤裏只有如下5個目錄。my god,我的其他文件夾哪裏去了?難道升級時給我格式化了?

轉念一想,Apple應該不會這麼變態,否則蘋果總部應該早都被自己的用戶給踏平了。於是立刻上網查是怎麼回事,很過有了結果。原來從Catalina版本開始,Apple爲了實現自己更安全的目的,將硬盤分成了兩個卷(以前是一個卷),一個是系統卷,一個是數據卷。從下圖所示的磁盤工具中就可以看出這一點。

這有些類似於Windows的邏輯磁盤,不過與Windows不同,Catalina的系統卷和數據卷是共享整個磁盤的,只是進行了邏輯隔離。在默認情況下,系統卷只允許操作系統本身來寫文件,對於其他用戶(包括root用戶)都是隻讀的。也就是說,使用sudo命令也不能向系統卷寫入任何數據。

2. 我的文件到哪裏去了呢?

現在關鍵的問題是,我的文件夾到哪裏去了呢?其實Catalina會將用戶自己創建的文件夾都放到如下的目錄:
/Users/Shared/Relocated\ Items/Security

如果你的mac系統是中文狀態,那麼該目錄就是下圖所示的目錄:

切換到該目錄,就會看到自己建立的所有的目錄和相關文件。

這下放心了,只要文件都在就好,那麼緊接着有面臨另外一個鬧心的問題,文件是都在,但路徑全都變了,這就意味着以前設置的環境變量、word、excel、webstorm、goland等工具的打開歷史已經沒有意義了,所有的路徑都需要重新設置,所有的文件都需要重新打開。天啊,我爲什麼要升級呢!

3. 恢復以前的目錄結構

於是首先想到,是否將這些目錄和文件移動到數據卷,路徑是否會恢復呢?說做就做。

從磁盤工具中數據卷的裝載點可以看到,數據卷的物理目錄是/System/Volumes/Data,於是立刻切換到該目錄,默認是空。

現在使用下面的命令將原來的目錄移動到數據卷根目錄(假設有一個名爲test的目錄要移動)。

sudo mv /Users/Shared/Relocated\ Items/Security/test  /System/Volumes/Data

如果要移動其他目錄,只要將test修改爲相應的目錄名即可。注意,這裏必須用sudo,普通用戶沒有寫權限。

注意:如果只在數據卷中移動數據,速度非常快,因爲並不是真的移動的數據,而只是改變了目錄的位置。

將所有的目錄移動到/System/Volumes/Data後,會發現,目錄並沒有像期望的一樣恢復到原來的樣子,而是所有的目錄前面都加了一個/System/Volumes/Data,也就是說,變成了/System/Volumes/Data/test。看樣子要想其他法子了。

有網友提供的方法是將目錄和文件直接移動到系統卷的根目錄,這樣就會恢復原貌了。這個方法當然可行,不過將數據從數據卷移動到系統卷,是非常費時的,因爲這時真正的移動數據。而且系統卷要想寫入數據,需要做特殊處理(一會再說),比較麻煩。而且以後也無法使用一般的方法在系統卷根目錄添加任何目錄和文件,感覺也比較彆扭。

我認爲最好的方式是文件和目錄仍然放在數據卷,而在系統卷根目錄創建指向數據卷相應目錄的軟鏈接,這樣以後再創建新目錄和文件時,只要在數據卷完成即可。如果哪個文件或目錄要通過根(/)訪問,可以在系統卷的根目錄創建一個軟鏈接,這樣纔是是魚和熊掌可兼得之法。

不過系統卷默認即使使用root用戶也無法寫入文件,不過可以將安全監測關掉。具體方法如下:

1.  重啓mac電腦,按着Command + R,等待進入安全模式; 
2. 進入安全模式後,在上方菜單打開終端,然後執行csrutil disable命令關掉SIP(系統完整性保護),重啓電腦,正常進入系統;
3. 在終端執行sudo mount -uw / 命令將系統卷根目錄設爲可寫狀態;

經過這3步,系統卷根目錄已經可寫了,但仍然需要使用sudo命令。如果操作完,想重新打開SIP,可以再次進入安全模式,然後執行csrutil enable 命令即可,當然,不打開也沒問題。現在假設數據卷有一個名爲backup的目錄,爲backup在系統卷根目錄創建軟鏈接的方法如下:

首先在終端進入系統卷根目錄,然後執行下面的命令
sudo ln -s /System/Volumes/Data/backup backup

爲其他目錄在系統卷根目錄創建軟連接的方法類似。ok,現在我們可以爲需要通過系統卷根目錄訪問的目錄和文件創建軟鏈接了,都搞定後,我們會發現所有的路徑都恢復正常了。

4. 編譯程序又出錯了

如果你是普通用戶,那麼到這裏就完全搞定了,不過對於程序員來說,還遠遠沒有結束。由於我要使用go語言開發相關項目,於是試一試go語言是否可以編譯通過,結果.....,竟然輸出了下面的錯誤:

_cgo_export.c:3:10: fatal error: 'stdlib.h' file not found

這個錯誤我以前遇到過,是由於/usr/local目錄中沒有stdlib.h文件導致的,在上一個macOS版本中,可以在磁盤上搜索macOS_SDK_headers_for_macOS_10.14.pkg文件,然後安裝即可。不過在Catalina中,並沒有macOS_SDK_headers_for_macOS_10.14.pkg文件,當然macOS_SDK_headers_for_macOS_10.15.pkg也沒有。不過在/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk目錄下卻發現了已經安裝好的相應文件。

注意:如果沒有該目錄或相關文件,可以使用 xcode-select --install命令安裝
這裏又要用到軟鏈接了,其實go使用cgo編譯時,會到如下兩個目錄搜索相關文件:
/System/Library/Frameworks/CoreFoundation.framework
/System/Library/Frameworks/Security.framework

所以只要通過軟鏈接,將相關的目錄和文件鏈接到這兩個目錄即可,於是有了如下的解決方案:

在終端進入/System/Library/Frameworks/CoreFoundation.framework目錄,然後執行下面兩條命令:
sudo ln -s  /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Headers Headers

sudo ln -s  /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/CoreFoundation.framework/Versions/A/Modules Modules

再進入/System/Library/Frameworks/Security.framework目錄,然後執行下面兩條命令:
sudo ln -s  /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Security.framework/Headers Headers
sudo ln -s  /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Security.framework/Modules Modules
完成以上步驟後,新系統就一切恢復如常了,真是虛驚一場。最後建議:用戶的數據最好還是放在數據卷中,如果非要通過系統卷的根(/)訪問,可以在根目錄創建軟鏈接,但不要忘了打開SIP哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章