[other] 【小知识】硬盘占用和文件尺寸不符的几种情况
Tofloor
poster avatar
enforcee
deepin
2023-10-11 00:08
Author

包括类Unix系统和Windows的相关内容。帮你找找「失踪」的硬盘空间。

joy

一、簇的对应

文件在硬盘上的存储的最小单元并非一个字节,而是连续的一系列字节构成的一个空间,称为簇(cluster),文件会使用若干个簇来存储数据。如果文件的最后部分不够占满一个簇,这个簇中剩余的空间就被浪费了,如果要存放另外一个文件就要从另一个簇开始。

簇的大小是文件系统的设计和创建文件系统(格式化)时的选项决定的。选用多大的簇也是比较复杂的学问,可能会影响硬盘空间的利用效率和性能。本文就不详细解释了。如果选择的簇尺寸太大,存储文件就会占用更大的磁盘空间,这个问题尤其影响大量小文件的存储。通常情况,我们所称的文件的大小是文件本身的大小,而文件的磁盘占用是文件所占用的簇的大小。后者会比前者大一些。一些文件管理器会同时显示两者,但是有的可能只显示其中一项。

可以创建一个文件然后用下面的命令看看差别。如果创建的文件足够小,前者显示的就是一个簇的尺寸。

du -B 1 <文件>

du --apparent-size -B 1 <文件>

如果希望改变簇的尺寸,通常就要重新创建文件系统(格式化)了。

二、隐藏文件

这个大家都很熟悉了。在Unix的设计中,以点号.开头的文件即为隐藏文件。这是因为我们通常用一个点号.来代表当前目录本身,用两个点号..来代表上级目录。在一些应用中希望隐藏掉这两个特殊含义的目录,就采用了判断第一个字符是不是点号.的简单方法,而这也让其他开头是点号.的目录也被隐藏了。后来我们也将错就错,把这个传统保留了下来。

通常我们在文件管理器按下Ctrl+H就可以切换隐藏文件是否可见。通常的图形应用程序也会创建隐藏文件或目录来存放配置或临时文件。不过现在更推荐的做法是放在.local或者.config目录中(要不看着太乱了)。

在Windows的设计中,隐藏文件和文件名不相关,任何文件都有可能成为隐藏文件,其实是Windows的文件系统ntfs的特性。因此Windows读取类Unix系统的文件系统或者反过来,都会让隐藏文件现身。

在GNU/Linux系统中,一些应用程序会把缓存的数据存放在隐藏目录中。因此定期清理会节约一些硬盘空间。顺便,Windows的话应用的数据通常存放在%AppData%变量指定的文件夹(不过一些无特权的应用程序也会把这个路径作为安装目录)。

如果需要删除这些隐藏文件,需要仔细识别其中的内容。删除一些文件可能会让应用程序丢失配置。虽然说这些文件都能重新生成,但是对很多用户来说,配置也是很重要的资产。

GNU/Linux有很多非常直观的硬盘用量分析工具,比如GNOME的baobab等,可以帮助你查看是哪个目录占地最多。

三、虚拟内存

这个疑点在Windows上比较常见。默认状态是自动在系统盘划分一些空间作为虚拟内存,而用户也可以自行修改设置,让某个分区上有多少硬盘空间作为虚拟内存使用。这当然会占用一些硬盘空间(就算删掉了所有文件,也可以看到有一些磁盘用量)。

除了虚拟内存之外,如果开启Windows的休眠功能,也会占用一些硬盘空间(不超过内存的大小)。可以用管理员运行cmd或者powershell输入以下命令来开关休眠(也可以使用自带的磁盘清理,选择「清理系统文件」。不过关闭了以后就只能用命令开启了):

powercfg -H ON

powercfg -H OFF

在类Unix系统中,我们把类似的技术称为swap(交换空间),可以使用swap分区或者swap文件来开启。而swap也同时存放休眠数据,因此不需要单独设置休眠文件。由于swap通常都是用户自己规划的,而且用swap分区更常见,所以靠改虚拟内存来调节硬盘压力的操作通常只在Windows上管用。

可以通过更改/etc/fstab来调节类Unix系统的挂载方案(当然也能修改swap的设置),一些图形界面的分区编辑器也能辅助用户完成这些配置,比如GNOME disks。

四、丢失的文件

有时一些文件系统或者硬件的错误,会损坏文件系统的文件。一种情况是文件的索引丢失了,但是文件的数据还留着,这样无论用哪种文件管理都没法再看到这些文件,而硬盘空间确实还被占用着。除了重新创建文件系统(格式化)之外,可以使用文件系统检查工具来恢复这些文件。

在类Unix系统上,我们使用fsck命令来检查和修复文件系统的问题。如果还原了丢失的文件,会存放在一个名为lost+found的目录中。这个目录不是我们通常意义的目录,更像是文件系统的一个功能,如果删除后需要使用专用命令mklost+found来重建。

对于微软开发的文件系统ntfs和exfat,在GNU/Linux上的工具可能不足以处理全部状况。如果安装了Windows系统,可以使用Windows上的命令chkdsk来修复。还原的文件会被放入FOUND.000目录中。不过在一些版本的Windows中这个目录在文件资源管理器中仍然是不可见的(即便已经显示了隐藏文件)。可以用一些命令来显示和操作这些文件。比如这个命令来列出文件:

dir /A H 目录

或者在自带的磁盘清理中,可以「删除旧的chkdsk文件」。

需要注意的是,文件系统检查是一个比较危险的命令,尽量提前备份重要资料,准备充足的时间和电量来操作(有些硬盘可能需要运行数个小时),而且一些不够成熟的修复工作可能会让情况雪上加霜。在执行这些命令之前应该仔细阅读说明且谨慎操作。

断电、非正常关机、以及不等安全弹出就断开存储设备(现在的系统基本都使用了写入缓存,因此点击安全弹出U盘之后还是需要等到系统正式提示可以移除之后才能拔掉)都有可能造成文件丢失。但是由于各种文件系统的设计不同,恢复文件的能力也有差别。有些文件系统能自动检查问题,但是有些就需要手动运行命令才能找回硬盘空间。

五、换算关系

这个虽然已经是常识了,但是连我自己犯迷糊的时候还是挺多,损失的硬盘空间其实是虚惊一场。我们使用的数字单位有两种,一种是基于二进制的1KB=(2^10)B=1024B,一种是基于10进制的1KB=(10^3)B=1000B。虽然现在我们为了区别他们,前者基于二进制的单位我们改称KiB、MiB、GiB,但是很多时候混用的情况依然屡见不鲜。我们使用各种程序计算硬盘空间时,要先注意使用的单位到底是1024还是1000,尤其是1TiB比1TB多出将近100GB,这样的「误差」肯定是不能忽视的了。

Reply Favorite View the author
All Replies
deepin小助手
Super Moderator
OM
2023-10-11 00:16
#1

这个好,能帮助不少小白解决问题

Reply View the author
阿尼樱奈奈
Moderator
2023-10-11 00:25
#2

like

Reply View the author
流浪的加菲
deepin
2023-10-12 22:01
#3

支持下!like

Reply View the author
longlong
deepin
Developer
2023-10-13 20:58
#4

其实还有一个为root用户保留的空间,这个在一些文件系统下会被计算为占用

Reply View the author
Equationzhao
deepin
2023-10-13 22:38
#5

支持

Reply View the author
andktan
deepin
2023-12-25 18:00
#6

like

Reply View the author