为什么我们需要在Linux上挂载?


67

我了解Linux中的安装方式,也了解设备文件。但是我不明白为什么我们需要挂载。

例如,如下面的问题的公认答案中所述,使用以下命令:

mount /dev/cdrom /media/cdrom

我们将CDROM设备安装到/media/cdrom最终可以使用以下命令访问CDROM的文件

ls /media/cdrom

它将列出CDROM的内容。

为什么不完全跳过安装,然后执行以下操作?

ls /dev/cdrom

并列出CDROM的内容。我希望答案是:“ 这就是Linux的设计方式 ”。但是如果是这样,那为什么要这样设计呢?为什么不/dev/cdrom直接访问目录?安装的真正目的是什么?



23
注意几乎所有的操作系​​统都“挂载”。在大多数情况下,它只是透明的。在Windows中,为笔式驱动器选择“安全删除”时,实际上是在系统自动挂载之后执行umount。Linux只是不会将用户与进程隔离开,因此结果是您可以对其进行更多“自定义”-例如,umsdos分区与vfat并没有任何明显的区别,但是如果使用mount -t umsdos挂载,您拥有所有Linux权限,所有权,特殊文件,fifos等。如果您的mount -t vfat行为类似于纯Windows分区。
SF。


7
“我了解linux中的安装方式,并且了解设备文件。” 显然不是;)
轻轨比赛(于

5
Why not access the /dev/cdrom directory directly?因为它不是目录。
布兰登2015年

Answers:


67

原因之一是块级别的访问级别比ls可以使用的级别低。/dev/cdrom,或者分别dev/sda1是您的CD ROM驱动器和硬盘驱动器的分区1,但是它们没有实现ISO 9660 / ext4,它们只是指向那些称为Device Files的设备的RAW指针。

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不是目录;这是一种特殊的文件类型,内核将其作为该设备的“句柄”提供给文件。

请参阅设备文件上的维基百科条目,以进行更深入的处理。


4
我在掩盖一些细节,因为我认为,如果您仅开始写入/ dev / sda1上存储的任何数据,都会发生不好的事情,因此,我认为存在一些预防措施或抽象措施可能会阻止您覆盖事物。但总而言之,如果您确切知道如何以及在何处写入磁盘,则可以通过手动进行操作/dev/sda1。请注意,某些工具确实会与原始磁盘直接交互,例如swapon/swapoffdd
Ehryk 2015年

4
只是增加一点,挂载会初始化文件系统,从而也激活了对用户透明的输入/输出操作的自动处理的整个层(例如,将文件缓存在RAM中,对操作进行排队,保持打开文件的状态)等等)。这就是为什么您还必须正确卸载文件系统以避免损坏(或至少使其同步)的原因。在所有常用平台上都存在挂载,而不仅仅是Linux。如果安装是由桌面环境(KDE或gnome)自动处理的,则其隐藏与在MS Windows中一样。
Orion

6
@Ehryk(最多3条评论)在典型的Linux系统中,唯一的预防措施是文件系统权限-换句话说,您必须使用root帐户写入设备文件。如果这样做,您可以cat >/dev/sda1放心使用Linux,而Linux不会阻止您。(不用说,这样做会完全损坏文件系统。)
David Z

5
@psusi在Windows 95上无法做到这一点,是的。但是它存在于MS DOS和Windows NT上(并且很好地隐藏了)。您现代的基于NT的Windows当然可以让您随意安装和卸载分区(甚至可以将其分区到其他分区的文件夹中,甚至可以同时加载到多个文件夹中)-通常,默认情况下,它通常仅将所有未知分区安装为驱动器号。您还可以通过使用设备的完整路径来访问该设备而无需安装它(与Unix方式非常相似),但前提是它没有锁定-如果当前已安装,则当然是锁定的。
罗安2015年

3
@Luaan&psusi Psusi拥有它的权利。但是对于几乎所有意图和目的,Win32 API调用者的效果基本上是相同的。(对于Posix合规性,甚至可以模拟安装语义。)Win9x实际上具有安装的概念,因为它仍在DOS之上运行。FAT支持作为本机处理程序内置于DOS,与NT内核处理它的方式有些类似。但是必须安装CDROM和网络文件系统。(记住CD的MSCDEX。这提供了ISO / RockRidge文件系统处理程序,并将其安装在驱动器号上)。
Tonny

20

基本上,并且为了简单起见,操作系统需要知道如何访问该设备上的文件。

mount 不仅“授予您访问文件的权限”,还告诉操作系统驱动器具有的文件系统,是否为只读或读/写访问权限等。

/dev/cdrom如果是低级设备,操作系统功能将不知道如何访问它们...假设您将奇怪格式的cdrom(甚至是音频cd)放入ls其中,如何知道其中有哪些文件(如果有)没有先“挂载”的CD-ROM?

请注意,这在许多操作系统中会自动发生(甚至在某些发行版和图形界面上甚至是Linux),但这并不意味着其他操作系统不会“挂载”驱动器。


8

为了一致性

想象一下,您系统中的第一个硬盘驱动器上有一些分区。例如,/dev/sda2。稍后,您确定驱动器不够大,因此您购买了第二个驱动器并将其添加到系统中。突然之间,/dev/sda您的当前驱动器变为/dev/sdb。您的分区现在是/dev/sdb2

使用建议的系统,您必须更改访问旧分区上的数据的所有脚本,应用程序,设置等,以反映名称的更改。

但是,通过挂载,您仍可以对该重命名的驱动器使用相同的挂载点。您必须进行编辑/etc/fstab以告诉您的系统(例如)/media/backup现在/dev/sdb2改为,但这仅是一次编辑。

请注意,现代系统更加简单。它们具有,而不是用/dev/sda2或引用该设备/dev/sdb2,它们UUIDS看起来像c5845b43-fe98-499a-bf31-4eccae14261b或可以赋予更友好的标签,例如backup在安装时可以用来引用该设备。这样,在添加新设备时设备名称不会更改,这使得管理更加简单:

# mount LABEL="backup" /media/backup

为了安全

通过要求安装设备,管理员可以控制对设备的访问。可以在卸下设备后卸下设备,但在使用时不能卸下设备(除非您要丢失数据)。如果您是Windows用户,还记得通知区域中的绿色小图标,它告诉您可以安全删除USB记忆棒吗?那就是Windows为您安装和卸载控制棒。因此,原理不只是Unix / Linux。


通用ID实际上是UUID,而不是Microsoft的GUID。
Ruslan 2015年

@Ruslan-就是这样!当时我的MS头戴了。非常感谢-我更改了它。
garethTheRed 2015年

6

我称之为历史原因。并非其他答案是错误的,但故事还有很多。

比较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增加了更多的安全性,网络功能,对多个用户的支持等;随着网络的普及,微软也开始为服务器开发操作系统。

但是,仍然很容易看出两者是不同传统的结果。


1
不只是那样 设备是供文件系统驱动程序(可能还有其他系统软件)使用的低层抽象。Unix被设计为面向操作系统程序员的操作系统。例如,那些文件系统驱动程序的程序员。这就是为什么这些低级抽象向用户公开的原因。
reinierpost

5

当前的安排有几个优点。它们可以分为块特殊文件的优点和挂载点的优点。

特殊文件是代表设备的文件。Unix构建的思想之一就是一切都是文件。这使许多事情变得简单,例如,用户交互只是在tty设备上的文件读写,这是字符专用文件。同样,检查坏块,对磁盘进行分区或格式化也仅是文件操作。如果磁盘是mfm,ide,scsi,fiberchanel或其他文件,则它不会起作用。

但是另一方面,您可能不想只处理整个磁盘或仅对文件进行分区,并且在许多情况下,文件数量超出磁盘容量。因此,我们有挂载点。挂载点允许您将整个磁盘(或分区)放在目录中。在我的Slackware时代,大小合适的硬盘只有几百MB,通常将CD用作/ usr,并将硬盘用作/,/ usr / local和swap。或者,您可以将/放在一个驱动器上,将/ home放在另一个驱动器上。

现在,我注意到您提到将CD安装在/ media / cdrom上,这对于仅具有一个cdrom驱动器的计算机很方便,但是如果有多个CDrom驱动器,该怎么办?您应该在哪里安装第二个?还是第三个?还是第十五?您当然可以使用/ media / cdrom2等,也可以将其安装在/ src / samba / resources / windows-install或/ var / www上,或在需要的地方进行安装。


我认为OP意味着为什么不mount完全跳过整个过程,而是/dev/cd0, /dev/cd2, /dev/sda1, /dev/sda2直接进行交互-每个已经具有指定的“目录”种类。
Ehryk 2015年

1
您是正确的,但是您真的会找到/ dev / sdb9 / share / doc / package / README的好方法吗?甚至d:/ share / doc / package / README都更好,但是/ usr / share / doc / package / README具有语义!这是安装点的值。
hildred

3
我怀疑语义用法后来作为“在目录系统和指向该设备的原始文件指针之间放入一些代码”的必要性的有用副产品而来,因为使用cd / ls / nano /其他比原始更容易写道:dd if=/file of=/dev/sda2 bs=4096 skip=382765832 count=84756,更不用说相关的inode / FAT / journal更新。
Ehryk 2015年

(我敢肯定,一些Linux的受虐狂可能会将/ dev / sdb9作为工作目录)
Ehryk 2015年

2
我的第一台计算机在2张8英寸的软盘上运行cp / m。它根本不支持子目录。每个磁盘一个目录。路径类似于b:name.ext。语义命名的思想已经确立。甚至是磁带系统。 UNIX已经拒绝了用于挂载点的驱动器号的想法,@ Ehryk,您知道不仅可以将驱动器安装在Windows上的目录中,也可以将其安装在dos上吗?我在MS-DOS 5上做到了此外,当我正在寻找手册页时,我不想记住它不在哪台计算机上,而是在哪个驱动器上
hildred 2015年

5

问题标题问:为什么我们需要在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。

设备文件使此操作更加容易。


1
解释得很好
Shailendra


3

因为/dev/cdrom是设备,但是/media/cdrom文件系统。您需要将前者安装在后者上才能访问CD-ROM上的文件。

当您启动计算机时,您的操作系统已经从物理硬盘设备自动挂载了根文件系统和用户文件系统。这只是添加了更多的文件系统来使用。

所有操作系统都可以执行此操作-但是,某些操作系统(例如Windows,将CD-ROM安装到上时D:)是透明执行的。Linux将其留给您,以便您可以更好地控制该过程。


2
我不同意你的措辞。/dev/cdrom是一个设备文件(具有特殊能力,使我们可以轻松地与相关设备进行I / O通信)。/media/cdrom是一个目录,但本质上是另一个文件(请记住,Linux中的所有文件都是文件,包括目录)。现在,当我们mount最终拥有将设备文件的内容作为文件系统查看的特殊功能时。我对最后一句话的不解是通过阅读以上答案。
Greeso 2015年

@Greeso:我坚持我的回答。
Lightness Races in Orbit 2015年

0

这样做是因为在台式机和笔记本电脑用户界面的许多媒体中,插入媒体时该做什么都不明确,因为用户的直觉是,将磁盘插入与用户进行交互的物理盒中并没有区别,例如,将其插入到具有网络连接的计算机旁边的设备中。

因此,从根本上讲,用于媒体的用户界面需要类似地处理两种潜在的挂载事件,并且计算机没有一种好方法可以像使用其他用户界面进行网络挂载一样直观地处理网络挂载,例如智能手机,平板电脑和可穿戴式计算机,它们无法在设备中插入物理媒体。(请注意,iPhone界面切换SIM卡的可怕程度,这是iOS设备已插入其中的一种物理媒体。

还请注意,针对这种类型的物理盒的UI的其他流行方法(例如Windows 98,Windows 8,Mac OS X v10.2(Jaguar)和Mac OS X v10.9(Mavericks))也会遇到相同的问题,并使用其他GUI对话框来解决潜在的混乱(例如,Windows 8通常配置为提示插入的每个新CD,是否应将其作为文件系统,音乐媒体或适当的MP4视频集合进行挂载)。没有任何理由不能将这些用户对话框中的任何一个用于Linux或其他UNIX。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.