写入 /dev/sdX 而不是 /dev/sdX1

写入 /dev/sdX 而不是 /dev/sdX1

会发生什么身体上如果我想将一些文件复制到外部硬盘驱动器,并且执行cp -a [file] /dev/sdX而不是cp -a [file] /dev/sdX1?或者当通过用零覆盖来擦除驱动器时,dd if=/dev/zero of=/dev/sdX和之间有什么区别dd if=/dev/zero of=/dev/sdX1?据我所知,sdX表示“磁盘”及其sdX1上的第一个分区。从计算机科学的角度来看,sdXsdX1似乎都代表文件(或 OOP 术语中的对象),但我不太明白它与身体的看法。

附言:这个问题可能类似于 FAT 格式的驱动器与 Ext4 格式的驱动器有何不同。我猜 99.99% 是相同的,只是一个小文件(分区表?)不同(格式化驱动器通常只需几秒钟)。因此,操作系统(?)将读取格式化信息,然后根据特定于该格式的协议继续写入数据。

答案1

如果我想将一些文件复制到外部硬盘驱动器并执行 cp -a [file] /dev/sdX 而不是 cp -a [file] /dev/sdX1,物理上会发生什么?

假设您拥有适当的权限,这两个命令都不会以易于检索的方式写入文件。
这两个命令都会导致内容file直接写入 LBA(又称扇区),并绕过任何文件系统约定。
写入的数据不会与文件名、文件大小、所有者、创建时间、权限或任何类型的属性相关联。

第一个命令,带有目标/dev/sdX,将从物理驱动器的第一个 LBA 开始顺序写入文件内容。这将破坏 MBR(主引导记录)和分区表,并使所有文件系统的内容无法访问。
第二个命令,带有目标/dev/sdX1,将从分区号 1 的第一个 LBA 开始顺序写入文件内容。这将破坏分区的引导扇区,并且可能损坏此分区的文件系统,使文件系统(及其所有文件)无法访问。

换句话说,这两个命令之间的主要区别在于写入开始的 LBA(又名扇区号)。


或者,当通过用零覆盖来擦除驱动器时,dd if=/dev/zero of=/dev/sdX 和 dd if=/dev/zero of=/dev/sdX1 之间有区别吗?

第一个命令,带有目标/dev/sdX,会将驱动器的所有 LBA 全部清零。任何信息都不再可读(除非使用一些据称非常特殊的技术)。
第二个命令带有目标/dev/sdX1,将清零分区号 1 的所有 LBA。尽管分区的定义仍然存在,但该分区的文件系统(及其文件)已被覆盖,无法再访问。此分区之外的 LBA 不受影响。


据我所知,sdX 的意思是“磁盘”...

它指的是驱动器。SSD
和闪存驱动器没有“磁盘”。

从计算机科学的角度来看,sdX 和 sdX1 似乎都代表文件

并非所有操作系统都将设备视为文件(例如 MS Windows)。

...但我真的不明白从物理角度来看有什么区别。

这些设备名称(实际上是设备节点)代表存储设备的顶层逻辑布局。IBM PC 和 MS DOS 建立的惯例是将 PC 大容量存储设备划分为逻辑分区。(软盘,又称软盘,不受此惯例限制。)

每个分区由起始 LBA(又称扇区号)和结束 LBA 定义,因此具有大小(LBA 或扇区数)。当分区格式化时(针对文件系统),每个分区还会分配一个文件系统类型的标识码。
根据分区方案(例如 MSDOS 或 GPT),有可选的标志和(卷)名称。

整个驱动器由一个/dev/sdX 设备节点。除了驱动器大小(即 LBA 数量)和分区表(如果有)外,此设备没有任何其他用户关心的显著属性。


附言:这个问题可能类似于 FAT 格式的驱动器与 Ext4 格式的驱动器有何不同的问题。

不,它们并不相似。
文件系统存在于驱动器分区之上的抽象层。
文件系统的复杂性比分区方案高出几个数量级。您还选择了两个在复杂性和功能上截然相反的文件系统。

我的猜测是 99.99% 是相同的,只是一个小文件(分区表?)不同(格式化驱动器通常只需要几秒钟)。

你的猜测是错误的。计算机执行某个程序所花费的时间并不是该操作复杂程度的可靠衡量标准。

ext4 文件系统具有文件所有权和权限。FAT 没有。

ext4 文件系统具有日志功能,能够抵御断电。FAT 没有。

还有更多差异。


附录

不,它们并不相似。文件系统存在于驱动器分区之上的抽象层。

但是分区表和文件系统规范不是都保存在驱动器的很小一部分上吗?

坚持认为比较不同的文件系统就好比比较驱动器和分区是愚蠢的。分区包含在驱动器中;没有驱动器,分区就不可能存在。

然而文件系统是相互排斥的,尤其是 FAT 与 ext4(尽管 ext2/ext3/ext4 文件系统之间的关系是例外)。一个分区中只能存在一个文件系统。您可以安装其中一个文件系统,然后忘记并永远不使用另一个。

您试图将注意力转移到存储在介质上的静态信息(即分区表和您假设存在于某处的模糊文件系统数据)上,这是没有意义的。
首先要定义分区的开始和结束位置(或要安装什么文件系统)。
然后以某种方式将该信息存储在介质上的某个地方。
真正的工作开始于操作系统在读取和写入文件时必须对分区执行 I/O 操作时。

换句话说,分区表(在分区安装时不会改变)和文件系统结构(在格式化期间安装的初始化形式会改变/增长)不是分区和文件系统的显著组成部分(分别)。
关注这些数据就像制定马拉松比赛的策略,只依赖于你的起跑位置(即在人群的最前面),而忽略了接下来的 42 公里。

(供您参考,很久以前,在一家 UNIX 公司工作时,我编写了一个 FAT 格式化实用程序。因此,在某个时间点,我确切地知道磁盘格式化需要做什么。)


附录2

相反,它们就像是操作系统的一套规则……

不是。分区表仅包含 操作系统
使用的(参数)数据。
“规则”由构成操作系统算法的代码实现。
这些算法使用数据。
数据不是算法(或“规则”)。

分区的文件系统 ID 会安装文件系统处理程序,它将处理该挂载点的所有后续打开、读取、写入、lseek 和关闭系统调用。 格式化
期间写入的初始化结构(例如空分配表、空根目录)会在文件系统创建、写入和删除文件时更新。
“规则”用于执行打开、读取、写入、lseek 和关闭文件操作的文件系统处理程序代码中实现。
所有文件系统 I/O 操作都将通过分区层(执行 LBA 转换)。

LBA 转换器的伪代码(即将lba文件系统“设备” ( ) 的给定 LBA ( device_mounted) 转换为实际/物理设备的 LBA)可以是:

if (device_mounted == drive)  
    then  
        if (lba >= drive_size)  
            then  reject translation
            else  actual_lba = lba

    else if (device_mounted == valid_partition_number)
        then  
            if (lba >= partition_size)  
                then  reject translation
                else  actual_lba = lba + partition_start

return (actual_lba)

处理分区只是一个简单的映射。
文件系统是具有用户界面、需要资源并执行 I/O 的子系统。
使用一些微小的共性并不是一个合理的比较基础。

答案2

像 /dev/sdX 这样的磁盘可以看作是字节数,其中字节数与磁盘大小相匹配。在像 /dev/sdX 这样的磁盘上,您可以放置​​某种分区表,但您不必在磁盘上放置分区表,如果您愿意,您可以简单地将 /dev/sdX 作为普通文件访问,或者您可以将文件系统直接放在 /dev/sdX 上。

对于某种分区表,/dev/sdX 的开头将用于描述 /dev/sdX 的不同部分如何分配给不同的分区 /dev/sdX1、/dev/sdX2... 由于您至少需要一些空间用于分区表,因此每个分区都将小于整个磁盘 /dev/sdX。

同样,分区可能包含一些文件系统或者像普通文件一样被访问。

例如:

|---/dev/sdX-------------------------------------------------------------|
| partition table |--/dev/sdX1-------|--/dev/sdX2------------------------|

因此,如果您擦除 /dev/sdX,您将擦除所有分区以及分区表。如果您擦除 /dev/sdX1,您将只擦除该分区。

文件系统是一种使用连续设备(如磁盘或分区)的方法,它允许您动态地为目录结构中的不同文件分配空间的各个部分。正如您所了解的,实现文件系统的方法有很多种,它们通常会创建某种包含数据的链接列表。

相关内容