最近閒來無事,決定將個人兩臺apple電腦升級成最新的蘋果系統(macOS Catalina),固然,因爲之前升級過屢次mac系統,因此堅決果斷從app store下載了最新的macOS Cetalina系統,固然,下載很快,安裝也很快,過程就不說了,so easy。程序員
1. 到底發生了什麼事web
不過安裝完後,發生了一件難以想象的事,進入硬盤,發現硬盤裏只有以下5個目錄。my god,個人其餘文件夾哪裏去了?難道升級時給我格式化了?xcode
轉念一想,Apple應該不會這麼變態,不然蘋果總部應該早都被本身的用戶給踏平了。因而馬上上網查是怎麼回事,很過有告終果。原來從Catalina版本開始,Apple爲了實現本身更安全的目的,將硬盤分紅了兩個卷(之前是一個卷),一個是系統卷,一個是數據卷。從下圖所示的磁盤工具中就能夠看出這一點。安全
這有些相似於Windows的邏輯磁盤,不過與Windows不一樣,Catalina的系統卷和數據卷是共享整個磁盤的,只是進行了邏輯隔離。在默認狀況下,系統卷只容許操做系統自己來寫文件,對於其餘用戶(包括root用戶)都是隻讀的。也就是說,使用sudo命令也不能向系統卷寫入任何數據。app
2. 個人文件到哪裏去了呢?webstorm
如今關鍵的問題是,個人文件夾到哪裏去了呢?其實Catalina會將用戶本身建立的文件夾都放到以下的目錄:ide
/Users/Shared/Relocated\ Items/Security工具
若是你的mac系統是中文狀態,那麼該目錄就是下圖所示的目錄:spa
切換到該目錄,就會看到本身創建的全部的目錄和相關文件。操作系統
這下放心了,只要文件都在就好,那麼緊接着有面臨另一個鬧心的問題,文件是都在,但路徑全都變了,這就意味着之前設置的環境變量、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哦!