我了解 Linux 中的安装是什么,也了解设备文件。但是我不明白为什么我们需要安装。
例如,正如中所解释的该问题的已接受答案,使用此命令:
mount /dev/cdrom /media/cdrom
我们正在挂载 CDROM 设备/media/cdrom
并最终能够使用以下命令访问 CDROM 的文件
ls /media/cdrom
这将列出 CDROM 的内容。
为什么不完全跳过安装并执行以下操作?
ls /dev/cdrom
并已列出 CDROM 的内容。我希望答案之一是:“Linux 就是这样设计的”。但是如果是的话,那为什么要这样设计呢?为什么不直接访问/dev/cdrom
目录呢?挂载的真正目的是什么?
答案1
原因之一是块级访问的级别比ls
能够使用的级别要低一些。/dev/cdrom
,或者dev/sda1
可能分别是您的 CD ROM 驱动器和硬盘驱动器的分区 1,但它们没有实现 ISO 9660 / ext4 - 它们只是指向那些称为设备文件。
mount 确定的事情之一是如何使用原始访问 - 哪些文件系统逻辑/驱动程序/内核模块将管理读/写,或转换ls /mnt/cdrom
为需要读取的块,以及如何解释这些块的内容阻止诸如file.txt
.
其他时候,这种低级别访问就足够了;我刚刚读取和写入了串行端口、USB 设备、tty 终端和其他相对简单的设备。我永远不会尝试从 /dev/sda1 手动读取/写入来编辑文本文件,因为我基本上必须重新实现 ext4 逻辑,其中可能包括:查找文件 inode,找到存储块,读取完整块,进行更改,写入完整块,然后更新索引节点(也许),或者将其全部写入日志 - 太困难了。
亲自了解这一点的一种方法就是尝试一下:
[root@ArchHP dev]# cd /dev/sda1
bash: cd: /dev/sda1: Not a directory
/dev
是一个目录,您可以cd
随心所欲ls
。/dev/sda1
不是目录;它是一种特殊类型的文件,内核提供该文件作为该设备的“句柄”。
看设备文件上的维基百科条目以便进行更深入的治疗。
答案2
基本上,简单地说,操作系统需要知道如何访问该设备上的文件。
mount
不仅是“允许您访问文件”,它还告诉操作系统驱动器具有的文件系统,是否是只读或读/写访问权限等。
/dev/cdrom
是一个低级设备,操作系统功能不知道如何访问它们...想象一下,您在其中放入了一个格式奇怪的 CDROM(甚至是音频 CD),如何ls
知道上面有哪些文件(如果有) CD-ROM 没有先“安装”它?
请注意,这种情况在许多操作系统(甚至某些发行版和图形界面上的 Linux)中会自动发生,但这并不意味着其他操作系统不会“安装”驱动器。
答案3
我称之为历史原因。并不是说其他答案是错误的,但这个故事还有更多内容。
比较 Windows:Windows 最初是作为单计算机、单用户操作系统。那台计算机可能只有一个软盘驱动器和一个硬盘驱动器,没有网络连接,没有 USB,什么都没有。 (Windows 3.11 具有本机网络功能;Windows 3.1 没有.)
Windows 诞生时的设置非常简单,无需花哨:只需每次自动安装所有内容(所有两个设备),不会(不会)出现很多问题。
相比之下,Unix 从一开始就被设计为在具有多个用户的服务器网络上运行。
Unix 的设计决策之一是,文件系统对于最终用户来说应该显示为一个统一的实体,无论物理磁盘分布在多少台计算机上,无论哪种磁盘,也无论数十台计算机中的哪一台用户将从中访问它。用户文件的逻辑路径将保持不变,即使这些文件的物理位置在一夜之间发生了变化(例如由于服务器维护)。
他们从存储这些文件的物理设备中抽象出逻辑文件系统、文件路径。假设服务器 A 通常托管 /home,但服务器 A 需要维护:只需卸载服务器 A 并将备份服务器 B 安装在 /home 上,除了管理员之外,没有人会注意到。
(与为不同物理设备赋予不同名称的 Windows 约定不同 - C:、D: 等 - 这不利于 Unix 所追求的透明度。)
在那种环境下,你不能随心所欲地把所有看到的东西都装上去,
在大型网络中,个别磁盘和计算机经常出现故障。管理员需要能够说出在何时何地安装了什么,例如对一台计算机进行受控关闭,同时另一台计算机透明地接管托管相同的文件。
这就是为什么从历史角度来看:Windows 和 Unix 来自不同的背景。如果您愿意,您可以将其称为文化差异:
- Unix诞生于管理员需要控制挂载的环境中;在网络上的数十个存储设备中,管理员必须决定在何处以及何时安装什么。
- Windows 诞生于没有管理员、只有两个存储设备的环境中,用户可能知道他们的文件是在软盘上还是硬盘上。
- (当然,Linux 是作为单机操作系统诞生的,但它从一开始就被明确设计为在家用计算机上尽可能模仿 Unix。)
最近,操作系统之间的距离越来越近:
- Linux 添加了更多单计算机、单用户的功能(例如自动挂载);因为它在单机设置中经常使用。
- Windows 添加了更多的安全性、网络、多用户支持等;随着网络变得越来越普遍,微软也开始为服务器开发操作系统。
但还是很容易看出两者是不同传统的结果。
答案4
问题标题问:为什么我们需要在Linux上挂载?
解释这个问题的一种方法:为什么我们需要发出显式mount
命令才能使文件系统在 Linux 上可用?
答案是:我们不这样做。
您不需要显式挂载文件系统,您可以安排它自动完成,Linux 发行版已经为大多数设备执行此操作,就像 Windows 和 Mac 一样。
所以这可能不是你想问的。
第二种解释:为什么我们有时需要发出显式mount
命令以使文件系统在 Linux 上可用? 为什么不做操作系统总是为我们做,并对用户隐藏?
这是我在问题文本中读到的问题,当你问:
为什么不完全跳过安装并执行以下操作
ls /dev/cdrom
并列出 CD-ROM 的内容吗?
想必,您的意思是:为什么不让该命令执行以下操作
ls /media/cdrom
现在呢?
好吧,在这种情况下,/dev/cdrom
将是目录树,而不是设备文件。所以你真正的问题似乎是:为什么首先要有一个设备文件?
我想对已经给出的答案添加一个答案。
为什么用户可以看到设备文件?
每当您使用 CD-ROM 或任何其他存储文件的设备时,都会使用一个软件将 CD-ROM 上的任何内容解释为文件的目录树。每当您使用ls
访问 CD-ROM 上的文件的任何其他类型的命令或应用程序时,都会调用它。该软件是用于将文件写入 CD-ROM 的特定文件系统的文件系统驱动程序。每当您在文件系统上列出、读取或写入文件时,该软件的工作就是确保在相关设备上执行相应的低级读取和写入操作。每当您mount
使用文件系统时,您都会告诉系统该设备使用哪个文件系统驱动程序。无论您是使用mount
命令显式执行此操作,还是将其留给操作系统自动完成,都需要完成此操作,当然,文件系统驱动程序软件首先需要存在。
文件系统驱动程序如何完成其工作?答案:它通过读取和写入设备文件来实现。为什么?答案,正如您已经说过的:Unix 就是这样设计的。在 Unix 中,设备文件是设备的常见低级抽象。特定设备的真正设备特定软件(设备驱动程序)应该将设备上的打开、关闭、读取和写入作为对设备文件的操作来实现。这样,更高级别的软件(例如文件系统驱动程序)就不需要了解各个设备的内部工作原理。低级设备驱动程序和文件系统驱动程序可以由不同的人单独编写,只要他们同意彼此交互的通用方式,这就是设备文件的用途。
因此文件系统驱动程序需要设备文件。
但是我们普通用户为什么能看到设备文件呢?答案是 Unix 是为操作系统程序员而设计的。它的设计目的是允许用户编写设备驱动程序和文件系统驱动程序。事实上它们就是这样写的。
Linux也是如此:你可以编写自己的文件系统驱动程序(或设备驱动程序),安装它,然后使用它。它使 Linux(或 Unix 的任何其他变体)易于扩展(这实际上是 Linux 诞生的原因):当市场上出现某种新硬件时,或者设计一种新的、更智能的方式来实现文件系统时,有人可以编写代码来支持它,使其工作,并将其贡献给 Linux。
设备文件使这变得更容易。