靠!安装了macOS Catalina(10.15.4)后,文件系统都乱套了

最近闲来无事,决定将个人两台apple电脑升级成最新的苹果系统(macOS Catalina),固然,因为之前升级过屡次mac系统,因此坚决果断从app store下载了最新的macOS Cetalina系统,固然,下载很快,安装也很快,过程就不说了,so easy。程序员

1.  到底发生了什么事web

不过安装完后,发生了一件难以想象的事,进入硬盘,发现硬盘里只有以下5个目录。my god,个人其余文件夹哪里去了?难道升级时给我格式化了?xcode

image.png

转念一想,Apple应该不会这么变态,不然苹果总部应该早都被本身的用户给踏平了。因而马上上网查是怎么回事,很过有告终果。原来从Catalina版本开始,Apple为了实现本身更安全的目的,将硬盘分红了两个卷(之前是一个卷),一个是系统卷,一个是数据卷。从下图所示的磁盘工具中就能够看出这一点。安全

image.png

这有些相似于Windows的逻辑磁盘,不过与Windows不一样,Catalina的系统卷和数据卷是共享整个磁盘的,只是进行了逻辑隔离。在默认状况下,系统卷只容许操做系统自己来写文件,对于其余用户(包括root用户)都是只读的。也就是说,使用sudo命令也不能向系统卷写入任何数据。app


2. 个人文件到哪里去了呢?webstorm


如今关键的问题是,个人文件夹到哪里去了呢?其实Catalina会将用户本身建立的文件夹都放到以下的目录:ide

/Users/Shared/Relocated\ Items/Security工具


若是你的mac系统是中文状态,那么该目录就是下图所示的目录:spa

image.png

切换到该目录,就会看到本身创建的全部的目录和相关文件。操作系统


这下放心了,只要文件都在就好,那么紧接着有面临另一个闹心的问题,文件是都在,但路径全都变了,这就意味着之前设置的环境变量、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哦!

相关文章
相关标签/搜索