macOS 是否需要用第三方软件清理系统?
以下回答作者保留所有权利,禁止各种方式的全部或部分转载:
---------------------------------------------------------------------------------------------------------------
回答之前,我需要先提出问题:
为何要进行系统清理?
这个好像很简单:系统清理是为了维护系统健康,恢复系统性能。那么现在目标有了,剩下的就是策略了:
系统清理的对象?(或者说哪些东西需要清理)
对于一个系统来说,系统本身运行所产生的临时文件 (Temp File),缓存文件 (Cache File),历史日志 (Logs) 等都可以视为可被清理的对象。放大一些说,驻留内存的文件映射页面 (Shared Memory),File Cache (文件缓冲),临时数据 (一些匿名页面),可清除内存 (Purgable Pages) 也可以视作清理对象。再放大一些,由软件或用户产生的临时、缓存文件,长时间未访问的文件 (包括一些可能被用户遗忘的数据),软件卸载遗留文件,操作不当产生的文件 (比如 Orphans) 等等都可以被视为清理的对象。
可被清理的对象 ≠ 垃圾
这个观点是我说的,原因是:
1,缓存文件:Cache Files 是指那些用于提高再次访问速度而存储的经过处理和计算的结果文件。抛开缓存文件这一特定名词,缓存则是在整个软硬件环境中被广泛使用的技术,比如 CPU 中的缓存 (二级,三级缓存),SSD 固态硬盘中的缓存,操作系统内核的缓存,字体缓存等,虽然实现方式各异,但是其作用和目的都是一样的。
2,临时文件:Temporary Files 是指那些操作系统和应用程序产生的,用于存储中间数据的文件。这些文件有着以下原则:最终用户往往不可见,用于存储中间数据或用于提高应用程序或操作系统的性能 (如排序一个超长的数组,可以分段产生结果,最后进行合并)。
3,文件缓冲:File Cache 这是 OS X 的一项特性,是操作系统利用空闲内存提高磁盘访问效率的机制。举例来说,OS X 中的偏好设置都不是实时写入的,当你更改系统或软件的偏好设置,OS X 是将这些设定缓存在内存中,然后在“合适”的时间,一起写回磁盘中的。
4,可清除内存: Purgeable Pages 这是 OS X 的一项特性,应用程序可以利用这个特性将一些可以随时丢弃(比如可以重新计算或从磁盘中再次读取)的数据放在内存中提高性能的机制。
5,日志:Logs 包括系统的日志,崩溃报告,审计子系统日志,内核崩溃报告,Spindump,Core Dump 等等。这些与用户基本无关,但是对于系统监控和排错有重要意义。比如通过 内核崩溃报告,Core Dump 等可以分析系统或软件崩溃的原因。
6,软件遗留:Leftovers 包括软件卸载后遗留的配置文件,库,插件等。
7,神秘的“其它”,这些数据是很多用户感觉闹心的地方,如:
这里的其它出现的原因,与 Spotlight 有关。Spotlight (mds) 能够收集管理磁盘上各类型文件的元数据信息,所以通过其存储的元数据,计算当前系统中各类文件的磁盘占用信息再合适不过。所以,它就是 About This Mac,Storage 页中磁盘文件占用空间信息的数据来源。但无论 Spotlight Importer 多么强大,它总有涵盖不了的数据类型。这时,系统对这类无法识别的空间的判断,就统称为 “其它”。
综上以上描述,我们就可以知道,缓存也好,其它也罢,这些文件其实跟最终用户的关系不大,它们往往都是最终用户不可见的。举例来说,iTunes 下载的 iOS 设备更新包最终用户是不可见的,它其实存在在磁盘上,同样备份文件也是如此。但是就像空气一样,不可见不代表没有用。所以,从某些方面上来讲,我们可以说 “系统是不用清理的”,更准确一点来说“系统清理应该是不需要用户参与的”。
事实上,也是如此。OS X 其实有着最为基本的清理功能:
1,对于用户的设定和临时缓存文件等,OS X 存放在以下目录,这个目录可以通过终端命令获取:
getconf DARWIN_USER_DIR
/var/folders/1s/6908_xvs1qbbql8s__3ml65m0000gp/0/
getconf DARWIN_USER_TEMP_DIR
/var/folders/1s/6908_xvs1qbbql8s__3ml65m0000gp/T/
getconf DARWIN_USER_CACHE_DIR
/var/folders/1s/6908_xvs1qbbql8s__3ml65m0000gp/C/
以上路径的 *1s/6908_xvs1qbbql8s__3ml65m0000gp/* 部分是随机产生的 (但是对于 root 用户来说,在目前的 OS X 实现下,路径则肯定是 _/var/folders/zz/_ 开头)。*T* 则表示临时文件夹。而同级目录中的 *C* 则表示缓存文件夹。*0* 文件夹,则是用户相关的配置文件夹:. .csstore 文件是该用户的 Launch Services 数据库文件。com.apple.dock.launchpad 是一个文件夹,其中的 db/db 文件用于存储 Launchpad 中的 App 的排列信息。com.apple.pluginkit 是一个 OS X Bundle 文件 (文件夹结构),其中包含一个名为 Annotation 的 plist 文件。这个文件记录了当前系统安装的所有 App Extension,Finder Sync,Today View,Action Extension 信息以及它们在当前用户下的启用状态 (election == 1 表示启用,election == 2 表示禁用)。 com.apple.notificationcenter 是一个文件夹,包含当前用户的 Notification Center 中的历史通知数据。存储在临时文件夹中的文件有一个特点,如果该文件超过三天未被再次访问 (a(ccess) time 离当前时间超过三天),则系统会自动删除这个文件。对于缓存文件,则系统或软件负责删除它们。
2,OS X 在用户主目录 (~/Library/Caches),全局资源库 (/Library/Caches) 和 系统资源库 (/System/Library/Caches) 下均有缓存文件夹。系统和应用程序可以在这里放置任何它们需要缓存的数据。比较典型的是 Kernel Cache,为了加快启动速度,在系统第一次启动时,会将内核和所有必需的内核扩展进行预链接,然后在路径
/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache
生成预链接后的内核缓存文件。系统启动会直接使用它来加快启动速度(此后只要系统没有发现变化则一直使用此缓存)。对于 iOS 设备来说,更为激进,iOS 本身不提供单独的 kernel 和 kext 文件,而是在 iOS 系统安装时,直接安装一个预链接好的 kernelcache。
3, OS X 是个 Unix 系统,所以还有两个传统的临时文件目录,/tmp,这个目录在 OS X 的实现实际上是指向 _/private/tmp_ 的软链接。/var/tmp,这个目录在 OS X 的实现是指向 /private/var/tmp 的软链接。这两个临时文件夹是随着 Unix 出现的,其区别并不明显。OS X 之所以保留这些文件夹是作为 Unix 系统的需要,并且只有系统进程或一些从 Unix 或 Linux 上移植来的应用才使用这两个临时文件夹。/tmp 文件夹会由系统定期进行清理,在 每日维护脚本 (daily) 中,明确了对与 /tmp 文件夹中超过时的文件进行删除的操作,见 /private/etc/periodic/daily/110.clean_tmps 脚本内容(OS X 有三个维护脚本,daily,weekly,monthly,你可以自行查看它们的内容以便获知 OS X 会自动进行清理的内容):
#!/bin/sh
'' #
'' # $FreeBSD: src/etc/periodic/daily/110.clean-tmps,v 1.13 2004/02/28 04:58:40 ache Exp $
'' #
'' # Perform temporary directory cleaning so that long-lived systems
'' # don't end up with excessively old files there.
'' #
''
'' # If there is a global system configuration file, suck it in.
'' #
'' if [ -r /etc/defaults/periodic.conf ]
'' then
'' . /etc/defaults/periodic.conf
'' source_periodic_confs
'' fi
''
'' case "$daily_clean_tmps_enable" in
'' [Yy][Ee][Ss])
'' if [ -z "$daily_clean_tmps_days" ]
'' then
'' echo '$daily_clean_tmps_enable is set but' \
'' '$daily_clean_tmps_days is not'
'' rc=2
'' else
'' echo ""
'' echo "Removing old temporary files:"
''
'' set -f noglob
'' args="-atime +$daily_clean_tmps_days -mtime +$daily_clean_tmps_days"
'' args="${args} -ctime +$daily_clean_tmps_days"
'' dargs="-empty -mtime +$daily_clean_tmps_days"
'' dargs="${dargs} ! -name .vfs_rsrc_streams_*"
'' [ -n "$daily_clean_tmps_ignore" ] && {
'' args="$args "`echo " ${daily_clean_tmps_ignore% }" |
'' sed 's/[ ][ ]*/ ! -name /g'`
'' dargs="$dargs "`echo " ${daily_clean_tmps_ignore% }" |
'' sed 's/[ ][ ]*/ ! -name /g'`
'' }
'' case "$daily_clean_tmps_verbose" in
'' [Yy][Ee][Ss])
'' print=-print;;
'' *)
'' print=;;
'' esac
''
'' rc=$(for dir in $daily_clean_tmps_dirs
'' do
'' [ ."${dir#/}" != ."$dir" -a -d $dir ] && cd $dir && {
'' find -dx . -fstype local -type f $args -delete $print
'' find -dx . -fstype local ! -name . -type d $dargs -delete $print
'' } | sed "s,^\\., $dir,"
'' done | tee /dev/stderr | wc -l)
'' [ -z "$print" ] && rc=0
'' [ $rc -gt 1 ] && rc=1
'' set -f glob
'' fi;;
''
'' *) rc=0;;
'' esac
''
'' exit $rc
除了系统自动清理的这些文件,系统中还有哪些是可以被安全清理而不影响系统运行的文件呢?这里教你一个小窍门,Time Machine 在运行时,会自动排除掉一些位置不进行备份,这些位置中的文件则是可以被视为可安全清除的文件,实际上,很多软件所谓的系统清理,也就是清理这些位置的内容:
cat /System/Library/CoreServices/backupd.bundle/Contents/Resources/StdExclusions.plist
<!-- paths where we need to capture top level folder to restore disk structure, but don't want to backup any contents -->
<key>ContentsExcluded</key>
<array>
<string>/Volumes</string>
<string>/Network</string>
<string>/automount</string>
<string>/.vol</string>
<string>/tmp</string>
<string>/cores</string>
<string>/private/tmp</string>
<string>/private/Network</string>
<string>/private/tftpboot</string>
<string>/private/var/automount</string>
<string>/private/var/folders</string>
<string>/private/var/run</string>
<string>/private/var/tmp</string>
<string>/private/var/vm</string>
<string>/private/var/db/dhcpclient</string>
<string>/private/var/db/fseventsd</string>
<string>/Library/Caches</string>
<string>/Library/Logs</string>
<string>/System/Library/Caches</string>
<string>/System/Library/Extensions/Caches</string>
</array>
看到了吧,这些地方其实没有什么神秘的,所谓的清理,不过是清理掉这些内容而已,看到这里似乎也不需要什么软件帮你进行。
事实上,所谓清理软件,它们时常干的事情是什么呢?以 Clean My Mac 默认设定来说,
1,删除系统优先选择语言列表外的语言包,节省磁盘空间。比如你在系统偏好设置设定 英文,中文为有限选择语言,则 Clean My Mac 默认会删除其他语言包。
2,Developer Cache,这里是 Xcode 在开发过程中的缓存,临时文件,预链接的库,预处理的头文件,你要是个开发者,你就最好别随便让它清理这里的内容。
3,Universal Binary,OS X 可执行文件有一种叫 Universal (Fat) Binary,也就是在一个二进制可执行文件中打包了2种或以上架构的代码,比如 i386,x86_64,ppc,ppc64 等,这会导致二进制文件体积增大。CMM 会使用 ditto 或 lipo 来删除不需要二进制架构达到瘦身的目的,你可以用这两个命令自己来。但是注意,很多 App 现在带有代码签名,瘦身后的文件会导致签名验证的失败,从而导致无法启动这些程序,所以小心。
4,iTunes 临时文件,缓存文件,以及保存的 iOS 更新文件。
5,Font Caches,这是系统生成的用于提高系统应用程序性能的缓存,除非你自己加了字体,或界面显示不正常,否则根本不需要动它,反正它会自己生成。
6,软件 Leftovers 删除,和无用的 plist 配置文件删除。
所以总结起来,CMM 这种东西除非你明确知道你将要进行的操作以及可能的后果,否则用它不仅不能清理系统,还有可能导致问题或者使得你需要的文件被删除。而且很多缓存如果删除掉,应用程序或操作系统会花大量的时间重建它们,这属于白白浪费 CPU 资源的行为。
那么这类软件真的没有用么?
其实也不是的,虽然我前面说到了很多相关的问题,但是对于普通用户来说还是很枯燥,使用这类软件可以让他们方便的进行一些操作。当你遇到如下问题时,可以考虑使用它们:
1. 急需释放磁盘空间 (清除缓存和临时文件)。
2. 系统、应用程序启动、加载不正常,比如启动缓慢,加载元素失败、网络访问问题或字体错误等 (清除缓存)。
3. 卸载软件
这里终于说道了软件卸载,我个人认为,真正的需要用户参与的系统清理,只有软件卸载这一项。而对于用户来说,使用 CMM 这类软件最合适的场景也就是于此了。
最后总结:
1,OS X 有自动清理的特性。
2,一般情况下用户无需使用任何软件来清理系统。
3,只有在特定需求下,才可以考虑使用清理软件。
4,使用清理软件时,一定要在你完全明白它的作用时才可使用。
5,完整卸载软件时可以考虑使用这些清理软件(我倒是觉得,你要是不知道如何卸载某个软件,你就不应该着急安装它。卸载时首先应该选择软件自带的卸载程序,如果有的话)。
最后给些忠告:
1,最好的系统清理软件,我只推荐两个,收费的 TinkerTools System ,免费的 OnyX。TTS 是个非常严谨的系统清理软件,换句话说,他根本不是无脑的只知道删删删得到用户表面好评的一个软件。
2,做一切清理操作前,想明白为什么要做清理,期望的结果是什么,清理的对象有哪些,备份是否做到位了,如果出了问题自己能否 hold 的住。如果你没想明白以上问题,别动手,先问问别人或自己查一查。99%的用清理软件出事的,不是小白用户,不是我这样的人,而是一知半解的人。
3,最好等着买本我将要出的新版 《OS X 高手进阶》,它会教会你如何应对这些问题。
===========================================
帖子里写的不够全面,一些地方没有照顾到,如果各位有任何想法或问题,可以在评论中说明,我会酌情补充。