标签 硬盘 下的文章

视频点此

如果你想使用你的硬盘,格式化是必须要进行的一个步骤。格式化时,总会接触到一个选项:磁盘类型——或者叫文件系统。现如今,有一堆的文件系统可供选择,至于使用哪种,就要取决于你的操作系统和正在格式化的介质是什么了。举个例子,在我的arch上,我想格式化我的U盘,我可以选择FAT32、NTFS、EXT4等等。所以,到底要怎么选择使用的文件系统呢?

我不打算介绍原理,一来很枯燥,二来我也不懂。这里只介绍一下来源和主要的功能特性供了解即可。当然,市面上的文件系统有很多,而大多数又并不常用——或者说,当下被人们熟知的只有NTFS这个文件系统吧…因此只说一些你听着可能会听亲切的文件系统们,罕见的就不提了。

再来简单说一句,为什么需要有文件系统?文件系统的工作,就是把硬盘扇区按组结合成更大的独立单位——称为簇或者块,并建立每个文件所在的组的索引。这部分具体的可以翻看我之前说过的硬盘分区相关内容。

一、FAT家族

FAT家族是DOS和Windows系统的第一款文件系统,全称File allocation table,文件分配表——系统。它有3个主要的版本:FAT12、FAT16和FAT32. 数字增大不止意味着版本更新,可以包含的簇数量、最大文件和最大分区大小也是逐次增大的。

FAT12,按簇大小8K来计算,最大文件和最大分区容量都可以支持到32M,而4KB的簇,最大只支持到16M。

FAT16,不同的簇大小也有不同的结果。最大文件体积可能是2G,可能是4G,而分区大小最多最多可以支持到16G。但16G的情况下,簇大小被分配到了256k,内部碎片是很多的。

FAT32,相对前两个FAT版本会更为人熟知吧,毕竟现如今也在应用之中。这种FAT文件系统,最大文件4G,而理论上的最大分区可以支持到16T——相比FAT16是很惊人的提升——然而,数字变大的时候,理论和实际之间就出现了很大的偏差。对于windows系统,FAT32分区最大只能到32G,而其他的操作系统,FAT32分区最大只能到2T。可见分区容量瓶颈从文件系统短板转变成了操作系统短板了。但是,得益于FAT32几乎全平台的支持,且支持的最大分区容量足够高——当然我指的是非windows平台——这个文件系统至今也是比较流行的文件系统之一。一个很明显的例子:EFI启动的主板,启动分区一定是FAT32的——虽然16也可以。

二、NTFS

FAT32在windows上的容量短板促使微软推出了更完善,更强大的文件系统。这种文件系统也是微软家族至今在使用的文件系统:NTFS(New Technology File System)。这个文件系统于1993年推出,目的就是为了解决FAT32的限制。NTFS的提升很大,单文件大小支持到了16EB,可以说没有文件大小限制了。NTFS是一个日志文件系统,说人话就是它维护着一个磁盘操作记录,这保证了它可以在系统崩溃或意外断电之后,对文件进行复原以保证数据的完整性。相对于FAT32,NTFS还支持权限和加密功能,比如可以给一个文件只读属性,那么删除和修改等等就不能进行了。这可以更方便的保证操作系统本身不被破坏掉,因此现如今的windows会强制使用NTFS分区作为系统分区。

NTFS确实不错,但是它在非windows平台的兼容性并不理想:最简单的例子,对于macos和老版本的Linux,NTFS在默认情况下对它们来说是只读的文件系统。而对于比如mp3、mp4这种独立的媒体播放器来说,NTFS直接就不能读取了。

三、exFAT

为了解决FAT文件系统的瓶颈,微软还有另一条分支线路:exFAT(extended FAT)。这种文件系统由微软在2006年推出,主要应用在U盘一类的移动存储介质上面。这种文件系统没有NTFS那么复杂,但是相对于FAT32同样有着一个很显著的优势:单文件大小最大同样支持到了16EB。而且它相对于NTFS有着更广泛的平台兼容性:对于macos,这个文件系统可以直接读写,而近些版本的安卓同样支持了这个文件系统。对于Linux,之前需要单独安装由三星开发的exFAT的驱动模块。而去年微软开放了exFAT并将其添加到了Linux内核中,预计从Linux5.7内核开始,exFAT的驱动将换成微软的代码,且将实现开箱即用,低复杂度、几乎无限大的文件体积支持,又有着广泛的兼容性,显然,这个文件系统是移动存储介质——包括SD卡的最佳选择。

四、ext家族

现在,回到Linux。1992年,针对Linux的extened file system(EXT)文件系统开始开发,并于1993年发布了ext2文件系统。这个在当时成为了很多发行版默认的文件系统。2001年,这个文件系统同样增加了日志功能,名称变更成了ext3。2008年,ext4发布,同时,这个文件系统也成为了Linux的默认文件系统。EXT4,单文件最大支持16T,分区容量支持到1EB。但是,因为是针对Linux出现的文件系统,ext家族都不能原生支持windows和macos——当然,可以通过软件实现访问,但是并不推荐。

五、苹果家族

1985年,苹果推出了自己的文件系统:HFS(Hierarchical File System)。它支持单文件2G,分区最高2T。1998年,文件系统加入了日志功能,并且对于macos10.4以后的版本来说,单文件和分区容量支持提升到了8EB,这个文件系统被命名为HFS+。2017年,苹果宣布了一个专为SSD或者其他固态存储设备设计的新文件系统APFS(Apple File System)。当然,这些文件系统都是苹果自己的产品,所以这三种文件系统均不支持微软平台和Linux平台。

六、选择

所以要怎么选择分区的文件系统呢?对于系统分区,windows7以上必须使用NTFS,Linux系统,ext4是最简单的。也可以选择其他的类型,但是可能需要自己单独增加一些内核模块以保证支持使用的文件系统。而苹果,HFS+或者APFS就无所谓了。不过APFS可能更先进一些吧?

对于U盘,如果容量低于32G,FAT32可能是更好的选择,因为它的平台兼容性是最强的。而对于32G以上容量的U盘,或者你的U盘需要存储大于4G的单个文件,那么exFAT就是一个好选择了。就我个人的经验来说,最好不要将NTFS应用到U盘的文件系统上,因为有时候会出现莫名其妙的权限问题导致U盘不可用。

对于其他分区或者移动硬盘,NTFS自然是最适合用在windows系统上面的了。而如果你需要经常在windows和mac之间交换数据的话,exFAT是一个不错的选择——加上Linux也一样。对于Linux,虽然NTFS也可以用在Linux上面,但是会出现莫名其妙的写入错误——比如说当你使用Steam Linux安装CSGO到一个NTFS的游戏库中时,你将永远得到一个“校验失败“的提示。所以,如果你的Linux有不同的分区,请让它们使用非NTFS的、Linux支持的文件系统。

视频点此

之前留下了一个问题:为什么现在不用传统的三维寻址了呢?

因为不好用了呗。但为什么不好用了呢?这就说到今天介绍的问题了:碟片上的扇区都有哪些划分方式。注意哦,我说的是碟片,所以这就包括了硬盘、CD在内的很多圆盘样的存储设备了。慢慢说。

在正式开始之前,先用这种方式来简单理解一下扇区:固定时间间隔,读写头一时间单位在碟片上面划过的长度。再记住线速度与角速度关系的公式:v=Ω·r. 好了,可以开始了。

1、CLV

一开始的技术叫做CLV:恒定线速度。核心:整张盘的线速度都相同。根据刚才说到的公式:如果v一定,则r同Ω成反比。也就是说,磁头越接近内圈,需要的转速越高。所以这种技术需要马达不断的调整转速,寿命自然也非常短,通常用在低于12倍速光驱中。

2、CAV

CLV因为不停的更改机器的转速,会对机器的寿命造成一定的影响,而且磁盘转速也不能无限制的加快。所以后来又有了一种磁盘技术叫做CAV:恒定角速度,即马达的转速恒定。显然这对马达有了很不错的保护。而根据公式,角速度一定时,线速度同半径是成正比的。所以越靠近外圈,碟片的线速度就越快。再根据前边提到的扇区定义,很轻易就能得到一个结论:越靠近外圈,一个扇区的面积会越大。但这为硬盘带来了几个优势:一个扇区的面积越大,对应的磁介质就会越稀疏,而相互之间干扰出错的可能性就会越小。因此硬盘留下了一个传统:靠前的分区在磁盘外圈。

换一个角度来看:角速度一定,Ω/t就是一个定值(记为k),进而可以得出,360°/k是一个定值。因此CAV模式下,不仅越外圈的扇区密度越小,每个磁道拥有的扇区数还是相同的。这就让CHS有了极大地用武之地:磁头、柱面、扇区,这三个量每个量都是从0到一个固定值的,管理起来就能方便很多。

3、ZDR

但随后的ZDR——区域数据记录技术——让CHS疑惑了。

简单来说,ZDR就是分区CAV:每个区域内为恒定角速度,而各个区域内的角速度不同。从磁盘的最外圈到内圈划分出若干个区域,每个区域内的每磁道扇区一致,但靠内的区域比外侧的区域的每磁道扇区数要少,从而可以根据不同的磁道长度来合理设定扇区的数量,以达到充分利用磁盘存储空间的目的。

可以想象,虽然磁头和磁道还是可确定的范围,但扇区却根据磁道所处区域的不同而有不同的范围,这种情况下的CHS显然就没那么好用了。而由于密度可以做到内外圈类似,所以越靠近外圈读写可以越快,因此第一个分区放在最外圈依旧是一个好的习惯。

还有一些其他的划分方式,比如P-CAV(内圈CAV外圈CLV)、Z-CLV(划块线速度)就不详细介绍了,这些都是在上面的基础之上进行的组合和改良。

正是ZDR的出现,让传统CHS变的不再那么好用了。所以也催生了LBA的产生。而现在的SSD,更是进一步舍弃了CHS三元素,让物理CHS更彻底的成为了历史。

视频点此

半个月前,我提到了硬盘的一些单位。那今天,借着这些单位,来看一个问题:打开文件时,你的硬盘是怎么找到文件的。

一、“古典概型”

没什么特别的意思。我就突然想起来这个词了。我想说的意思就是,在若干年前,硬盘要如何定位文件呢?

正如之前的内容所说,一块硬盘里有多张碟片,每个碟片有两个磁头,在磁道上读写着它所对应的碟片面的扇区,而所有碟片的相同半径的磁道就构成了柱面。想一想,磁头可以确定一个扇区所在的碟片面,碟片切柱面便得到了扇区所在的磁道,再加上扇区号,这三个维度便可以确定一个扇区了。

这就是传统的三维寻址,学名叫C(Cylinder,柱面)H(Head,磁头)S(Sector,扇区)寻址方式。注意,这种方式下,磁头和柱面从0开始计算,而扇区数则是从1开始算的。至于为什么这么定义,标准。因为当年的IBM兼容机就是这么规定的,你要想兼容,那按要求做就行了。

规定的这一部分稍微的扩展一些吧:在IBM兼容机中,INT 13H中断被用作硬盘操作。如果调用这个中断来读写硬盘,就需要一组CHS参数来定位一个扇区。其中,C用10个二进制位存储,最大到1023;H用8个二进制位存储,最大255;S用6个二进制位存储,最大63. 而一个扇区的大小一般是512B,所以调用了INT 13H中断的程序,只能读写到1023 * 255 * 63 * 512字节大小的硬盘区域,核算过来就是可以读写到硬盘前8G左右的扇区。但现在的硬盘肯定远远大于8G,所以为了照顾使用INT 13H的老程序,微软等几家公司制定了扩展INT 13H标准,又出现了采用线性寻址方式来操作硬盘,从而突破了这个限制。

而线性寻址,也是当今机械硬盘主要的寻址方式。全称逻辑块寻址,缩写LBA(Logical Block Address)。

二、LBA

这种寻址方式就简单粗暴了很多。从0柱面0磁头1扇区开始,一直到最后一个柱面最后一个磁头最后一个扇区结束,每一个扇区都有一个独一无二的序号,这个序号是从0开始记录的。也就是说,0柱面0磁头1扇区转换到线性地址上就是逻辑0扇区,这便是“扇区从0还是从1开始的”这种矛盾症结所在,知道就行了。

再来看LBA本身。它其实也有一个进化的过程。

CHS寻址,就像之前所说,一共用了24个二进制位来存储了坐标的3个量,LBA一开始也用了24位。区别只限于CHS将这24位分成了3份,LBA则用来保存一个数。那这个数有多大呢?16777215. 算上可以用0了,一个可以编号16777216个扇区。这有多大?8589934592字节。注意哦,单位是字节,换算过来只有8.6G多一些。很明显,啥用都没有。因此,LBA扩大了一次存储的二进制位数,达到了28位。这时候能编号多少扇区了呢?268435456。核算过来最大容量137.4G左右。很明显还是不够啊,因此LBA再次进行了扩展,用48位来保存。此时不考虑其他的情况下,按512字节一扇区来计算,可以访问到144PB的位置,这个数量级,一段时间内应该够用了。

容量问题解决了,再来看一个问题:我已经知道逻辑0扇区对应的CHS坐标了,那么之后的序号按什么顺序排列呢?我是把0柱面1磁头1扇区编号为逻辑1扇区,还是把0柱面0磁头2扇区编号为逻辑1扇区呢?在了解了磁盘使用扇区的顺序之后,你应该就能知道了。

现在的多碟片硬盘,虽然有多个磁头,但往往都是由一个轴统一带动的。因此很容易想象出来,同一时刻,各个磁头会处在同一个磁道——或者说柱面上面。而移动磁头到其他柱面是硬盘读写过程中最消耗时间的一个步骤,所以尽最大可能让磁头不动才能确保有更高的执行效率。因此,编号从0柱面0磁头1扇区开始,到0柱面0磁头这一圈都编好序号之后,才会切换到0柱面1磁头1扇区继续编号,从而保证了效率最高。

你可能会有一个疑问:移动磁头最耗时间,那磁盘转动同样要消耗时间。这么一看,好像不需要任何机械动作的切换读写磁头这个动作才是最快的。那为什么我不先把所有柱面同一位值的扇区都写完,再切换到下一个扇区的位置呢?换句话说,为什么不按照0柱面0磁头1扇区 - 0柱面1磁头1扇区 - 0柱面2磁头1扇区这个顺序给扇区编号呢?另外,就像前边我说到的,其实扩展INT 13H也打破了8G界限。如果你想计算的话,在28位LBA的时候,CHS28位同样可以记录到136G多的位置(CHS寻址下,28位分成这三份:柱面使用两个寄存器共16位,扇区用一个寄存器共8位,磁头用一半寄存器共4位)。但为什么好好地CHS就被抛弃了,硬要造一个线性寻址方式呢?以后再说。

视频点此:
第一期第二期第三期

虽然我用Arch,但是更常去的Linux相关的论坛还是Deepin。而越看论坛里边询问有关启动项的问题,越感觉这些用户把EFI想的复杂了。所以就简单的来说说EFI启动模式相关的东西。

一、BIOS和UEFI启动,有什么不同

1、BIOS

一句话概括:

BIOS启动,只认识设备。

详细来说,因为只认识设备,所以必须要事先约定好读取设备的哪个部分才能保证正常读取引导。因此这种启动方式,需要定义一个主引导记录,位于硬盘的柱面0 磁头0 扇区1。它的大小是512B,由3部分构成:主引导程序446B+DPT硬盘分区表64B+磁盘有效标志0x55 0xAA

启动时,BIOS按照保存的设备启动顺序依次检索设备的有效标志。如果不是55AA,则跳过,是,则表示可启动,转而去读主引导程序。但引导程序到底会做什么,主板不管。

正是因为BIOS读取的位置固定这个特性,使得一个设备只会出现一个引导程序,后加入的程序会覆盖先前的引导,就有点儿刻板了。

2、UEFI

UEFI则解决了这个问题。因为UEFI

不但认识设备,还认识分区,更认识文件。

因为整体高级了不少,所以UEFI在启动的时候会有一系列的初始化操作。至于都初始化了什么,怎么初始化的,这里暂不细究。但是其中有一个初始化要说一下。这个初始化的名字叫DXE——Deiver eXecution Environment.

在这一步,UEFI会加载设备的驱动。如果说加载驱动前,主板只能知道当前它访问的设备是个什么东西,那么在加载驱动之后,主板就能知道这个东西的详细信息都有什么了。

至于需要加载什么,以及要依照什么顺序去检索这些设备可否启动,这些就都是从BIOS存储的设备序列来读取出来了。与传统方式相同,UEFI在BIOS中同样保存了一个启动顺序,UEFI会根据这个序列去依次查找启动项。至于启动项,EFI又分成两个:文件启动项和设备启动项。

文件启动项,即一个指向明确文件存储位置的启动项。使用这个启动项,UEFI会直接去往这个位置来加载执行。

设备启动项,则只指向一个设备。对于这种启动项,UEFI定义了一个标准,即如果这个设备可以启动,那么这个设备的efi引导文件一定是/efi/boot/bootx64.efi。对于一个设备启动项,EFI会直接执行这个路径下面的文件。如果可执行则继续,找不到则报失败。

对于UEFI+GPT,UEFI又有一个标准,即这个硬盘如果可以启动,则需要有一个EFI分区(ESP),格式为FAT32,而文件启动项放置在路径/EFI/厂商名下。这便是一个ESP分区最基本的结构。

二、如何指定一个EFI启动项

因为有两种启动项,所以启动自然分为两种情况

1、选择从哪个硬件启动

在用户选择了启动磁盘后,UEFI会在这个磁盘中寻找EFI分区,然后找这个分区下的/EFI/Boot/bootx64.efi(UEFI可以执行的二进制文件),由这个文件进行下一步操作(引导操作系统),这个文件通常由操作系统给出,在光盘/EFI/BOOT目录下。

2、选择用哪个文件启动项启动

这个启动项记录了引导文件(*.efi)所在的磁盘和分区以及文件名,直接执行这个efi文件即可开始进行下一步操作(引导操作系统)

硬件启动项比较容易,可以自己尝试把安装盘镜像直接拷贝到fat32格式的U盘下面即可。

至于文件启动项,这涉及到写入信息,可以使用efibootmgr来尝试一下

三、几个常见问题的解决

最后,就可以看看几个典型“问题”了。也许看过之后你就能明白为什么我会说“有些人把EFI想的复杂了”。

1、有Windows,又装了Linux双系统,为什么不能引导到Linux上?

同理,还有一个问题:我有双系统,删掉Linux后,为什么Windows的启动项回不来?

这不是Linux有Bug,只是你的BIOS设置有问题。

装好Linux后,EFI系统自然会创建对应的文件启动项。这个启动项对应着GRUB引导程序,它可以识别并启动到Linux和Windows中。而Windows自身的Windows Boot Manager,只能识别微软系列的系统。所以如果Windows Boot Manager排列在了最前方,自然就不能引导到Linux中了。解决办法就是进入你的BIOS,将GRUB的引导项移动到最上方的位置。

反之,删除Linux后Windows的引导回不来,就是因为Windows Boot Manager被放在了最下方,挪上去就可以了。

2、如何制作一个UEFI的安装光盘

正如前面所说,对于硬件启动项,EFI会自动寻找硬件的bootx64.efi文件。而一个支持EFI启动的安装盘镜像,自然会有这个路径。因此只需要把你的U盘格式化成FAT32,并将镜像解压到U盘中即可。

当然,如果你的安装盘中有单文件大于4G,受限于FAT32的最大文件限制,这时候你可能才需要启动盘制作工具。否则,解压即可万事大吉。

总的来说,UEFI表现给用户的东西要比传统启动简单了太多太多。很多时候问题来源于你的设置,而不是系统厂商。

视频点此

硬盘,一个存储着你所有资源的一个设备。也许你知道你的硬盘大小4TB,但你是否意识到了,这其实只是在以文件为视角在进行度量呢?有没有其他的度量方式呢?

先来看硬盘本身。也就是物理层面的玩意儿。

1、碟片和磁头

不考虑固态硬盘,那么一块硬盘最主要的构成就是存数据用的“光盘”了。想要读写数据,就必定会有一个东西作为改变光盘电子的媒介。这个媒介就叫做磁头。如果想要最大程度的利用一张光盘,正反两面都进行存储必然是最容易想到的解决方案。所以硬盘中,一张碟片会用两个磁头分别从上下两面进行数据操作。

进一步考虑,在工艺一定的前提下,一张碟片的最大存储量是固定的。那如果想要进一步扩展容量,需要怎么办?没错,加入第二张、第三张碟片。硬盘就是这么干的。与之对应的,加入碟片的同时就要加入更多的磁头完成数据的操作。因此,一块硬盘也可以有4个、6个,甚至更多的磁头。关于磁头就先说到这里。接下来看看碟片上的东西。

2、磁道、柱面和扇区

众所周知,碟片是由中心的轴带动着转动的。因此如果给定一个从轴心开始的线段,那么在旋转的碟片上会留下一个圆环。不同长度的线段会留下半径不同的圆环,每个圆环就是一个磁道。而多个碟片摞在一起,相同半径的圆环就会变成一个空心的圆柱体。每个碟片就是这个圆柱体的一个切面。柱面就这么形成了。自然,磁道和柱面其实说的是同一个东西,只不过一个把视角落在了单张碟片上,一个是落在了多张碟片形成的体上。

从圆心沿碟片向外拉两条直线,跟每一个磁道相交,便会形成一个扇形的区域。而磁盘转速一定,所以如果控制了时间间隔,同一个磁道上的扇形区域大小便也相同,每一个扇形区域就叫做一个扇区。不过要注意,现在的硬盘跟以前的硬盘对扇区的划分方式有所不同,不过这里涉及不到就不讨论了。

至此,物理层面上的一些“单位”就介绍完了。所以在硬盘眼里,存在着一组新的描述硬盘大小的说法:这块硬盘有8个磁头,单面10000磁道,平均每个磁道12500扇区。

没什么用。不过这对于硬盘本身来说,是寻找文件存储地址的一个工具。这个以后会来聊一聊。今天先接着来看度量衡。

通过上面的介绍,想必你已经意识到硬盘中最小的单位是物理层面上都不可再分的扇区了,一块硬盘的容量便可通过扇区数x扇区大小来计算。而一个扇区的大小是多少?512B,当然如今 4K的也不少见。想一想,即便是4G一个扇区,对于当今动辄4T的硬盘容量,也需要1000个扇区才能表示完全。所以如果让系统直接面向扇区进行数据的处理,那记录下一个文件在那些扇区中是多么的琐碎?所以,为了减轻寻址的繁琐,一个文件系统会把相邻的一些扇区合并起来,提供给操作系统统一使用。合并后的每一个区域,就叫做一簇,或者一个块。这个地方,请翻看我之前的关于磁盘碎片的内容吧。

所以,在操作系统眼中,硬盘容量的说法又变了。它会变成“这个硬盘一共有62500000个簇,每个簇64k”。

至于文件视角,我们便熟悉了:这个硬盘容量4T

视频点此
第一期第二期

一、为什么需要

举个形象的例子:你的Linux装在一个50G的硬盘中。就是说,能用的空间就只有50G。现在,加入了一个100G的硬盘。

要知道:Linux中任何分区都需要映射到某一个文件夹上面才能使用。这个映射过程叫做“挂载”,而这个显示分区内容的文件夹就是“挂载点”。一旦文件夹变成了挂载点,这个文件夹下的内容便不能被显示出来了。而Linux的很多文件放置的位置都是统一的,你不能更改。所以这100G你要怎么加入到系统中使用?

仔细想想,挺不好搞的吧?

新建一个文件夹当作挂载点:你只能存储你自己的东西到这上面,大多数内容还是在50G的硬盘中;

挂载到内容多的文件夹下:不但需要先将所有东西移动过去,还需要调整fstab文件。而且容量是事先定死的,如果其他文件夹占用也高了,还需要经历无损调整分区—新建分区—移动数据—设置挂载点这样繁琐的步骤。不好。

这时候,lvm的作用便显现出来了。

二、优势

lvm把任何你想的分区整合成一个大的虚拟硬盘,使你可以在这上面进行分区操作。而任何事后加入的硬盘,都可以在不关机的情况下进行整合操作。

就像Windows的跨区卷,可以将不同硬盘的空闲空间整合成一个分区使用,容量等于空闲空间之和。但lvm更灵活的地方,在于它整合之后,出现的是一个新的“硬盘”,用户可以在这个“硬盘上面”再分区。

三、方法

总是有人认为Linux需要用命令,一般人用不懂。我也不知道这种印象是怎么来的,大概是因为网上能找到的教程都是命令形式?那我就用图形化的来展示一下。参见这里