SDB:分区、文件系统、挂载点基础
在安装 openSUSE 或向现有系统添加/删除磁盘时,人们开始谈论挂载和卸载,以及文件系统和分区。有些人对这些词在 Unix/Linux 环境中的真正含义知之甚少,这意味着在此领域讨论问题充满了潜在的误解。许多人确实有一些基于对其他操作系统熟悉度的知识。这增加了造成混淆的可能性。本页旨在阐明在 Unix/Linux 环境中考虑的这些术语。
磁盘的概念
在本文档中,“磁盘”一词将用作通用术语,用于表示操作系统将其视为磁盘驱动器的任何内容,即它们可以永久存储和检索数据的地方——永久性意味着在关闭计算机电源时具有非易失性。无论它是一个看起来像磁盘的闪存设备、光盘驱动器或“真正的”硬盘,甚至多个设备的组合。
由于新型存储设备向系统呈现为磁盘,因此它们属于此类。操作系统无法看到磁盘是在系统外壳内、旁边、桌子上或另一个架子上,因此在某些人称之为“内部”和“外部”磁盘之间没有区别。
磁盘通常由制造商格式化。这意味着损坏的磁道被标记并使用替换磁道,扇区号被写入。这是为了与控制器的硬件和固件接口。这种类型的格式化也称为“低级格式化”。
分区
分区的概念
通常有必要——尤其是在想要在同一台计算机上安装多个操作系统时——将硬盘划分为几个区域,并将每个区域分配给这样一个或另一个操作系统。这种划分是通过称为“分区”的操作完成的,创建的区域称为“分区”。每个系统可以独立于其他操作系统在这些分区上存储和检索数据。
要访问分区,操作系统必须读取磁盘的非常特殊区域,称为“分区表”。分区表包含有关分区大小和位置的信息。
系统管理员可以从当前运行的操作系统使用一个专门的程序来创建、删除和操作分区。该程序称为“分区编辑器”。
要被操作系统使用,磁盘必须包含至少一个分区,但通常会有更多。操作系统可以使用几个分区,即使它们属于不同的磁盘。
分区命名
- 在 Windows 中,分区以字母后跟冒号命名,例如 C:、D: 等。Windows 系统始终位于 C:。
- 在 Linux 中,分区以从唯一根目录到树中其位置的路径命名——所有目录和文件(包括设备文件)都放置在该树中以构成整个文件系统。通常它们被命名为 /dev/hd<a letter>/<a number> 或 /dev/sd<a letter>/<a number> 例如 /dev/sda1 或 /dev/hda2。我们将在谈论 Linux 中的文件系统时进一步阐明这一点。
PC 上的磁盘分区
传统分区和启动
基本原理
在开始时,当磁盘空间很小的时候,有一种想法是四个分区足以满足所有可能的用途(但事实证明这是错误的)。使用这种类型的分区,有关分区的数据——数量、位置、大小、类型等——被写入分区表,分区表位于磁盘开头的特定扇区中,并且固件——称为基本输入输出系统 (BIOS)——在其中获取指令以启动机器。这个启动扇区被称为“主引导记录”(MBR),包含继续加载操作系统所需的代码。MBR 中包含的引导程序有时被称为“引导加载程序”。它通常作为加载机制的第一阶段工作,将控制权交给位于另一个分区的特定扇区中的第二阶段: “卷引导记录”(VBR)。
下图显示了 MBR 的结构。首先加载到内存中以供计算机 BIOS 执行的阶段 1 引导加载程序。此加载程序(主引导加载程序 (PBL))将在分区表中查找具有指示它是启动分区的引导标志的分区,即包含第二阶段引导加载程序的那个分区。因此,第一阶段引导加载程序将在该分区的 VBR 中查找允许加载操作系统的代码。如果计算机上只有一个操作系统,可以直接完成此操作,或者通过一个向用户显示引导菜单的程序。这样的程序称为“引导管理器”。
引导管理器可以根据具体情况放置在引导磁盘的 MBR 中或分区的 VBR 中——具有设置为指示它是启动分区的引导标志。最著名的引导管理器包括 GRUB 和 Lilo。
主分区、扩展分区和逻辑分区
当显然四个分区不足时,找到了一个向后兼容的解决方案:将四个分区之一(然后称为“主分区”)变成一个特殊分区,称为“扩展分区”,该扩展分区可以容纳更多分区——“逻辑分区”。较新的 BIOS(现在所有 BIOS)都知道这一点。因此,我们有 3 种类型的分区
- 主分区,这些是旧的分区,可以有四个(编号 1、2、3、4);
- 扩展分区(实际上也是主分区)——只能有一个,它通常位于最高创建的主分区之后(3 或 4)的编号,并且应包含磁盘的所有剩余空间(否则空间将被浪费);
- 逻辑分区——它们在扩展分区内创建,它们的编号始终是 5 及更高(最大值存在争议,但足以满足大多数人)。
有些人对扩展分区感到困惑,它似乎没有用处并且占用了很多磁盘空间,而这些空间似乎也属于其他有用的分区;当然,扩展分区充当辅助分区的容器,因此空间同时显示在扩展分区和它包含的辅助分区中。阅读上述内容可能会让他们放心。
此处显示包含所有三种类型分区的磁盘示例
fdisk -lDisk /dev/sda: 200.0 GB, 200049647616 bytes 255 heads, 63 sectors/track, 24321 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disklabel type: dos Disk identifier: 0x1c841c84 Device Boot Start End Blocks Id System /dev/sda1 1 574 4604008+ c W95 FAT32 (LBA) Partition 1 does not end on cylinder boundary. /dev/sda2 * 575 8967 67416772+ 7 HPFS/NTFS /dev/sda3 8968 24321 123331005 f W95 Ext'd (LBA) /dev/sda5 8968 9229 2104483+ 82 Linux swap / Solaris /dev/sda6 9230 11840 20972826 83 Linux /dev/sda7 11841 24321 100253601 83 Linux
- 分区 1 是 PC 制造商放置的恢复分区。
- 分区 2 包含 Windows XP 系统(Windows 将其称为 C: 驱动器)。
- 分区 3 是扩展分区,它一直延伸到磁盘末尾,并包含以下三个
- 分区 5 是 openSUSE swap 分区。
- 分区 6 是 openSUSE / 分区。
- 分区 7 是 openSUSE /home 分区。
- “磁盘标签类型”行指示它是一个“dos”分区表。
- 位于 /dev/sda2 前面的星号指示引导标志的位置,标识了 Windows 兼容的 MBR 代码跳转到继续引导过程的分区。除非使用其他非 Windows 兼容的 MBR 代码(例如 LILO 和 Grub 使用的代码),否则必须有一个主分区上的引导标志。
GPT 分区
传统分区(也称为“dos 分区”)的主要限制之一是它仅使用 32 位来保存块地址,因此,使用 512 字节扇区,地址范围为 2^32 字节(2TB)。为了克服此限制,英特尔在 1990 年代后期设想了一种新的分区表:GPT,此后已成为 UEFI 标准的一部分。达到这一点后,似乎有必要解释各种缩写词
- GPT 代表 GUID 分区表。
- GUID 代表全局唯一标识符。
- UEFI 代表统一可扩展固件接口。UEFI 是定义固件软件的标准——固件本身与硬件直接连接——以及操作系统之间的接口。UEFI 已取代了旧的 BIOS。要了解有关 UEFI 的更多信息,请阅读 专门介绍 UEFI 的页面。
GPT 分区和使用 UEFI 固件启动
如果您的计算机没有 BIOS,而是具有符合 UEFI 标准的固件,则启动方式将与上述描述的方式完全不同。本页的范围不包括详细描述此启动。有关此主题的更多信息,请参阅 UEFI。
Linux 文件系统及其设置
Linux 文件系统的描述
Linux 中的文件
通常说在 Linux 中“几乎所有东西都是一个文件;如果某样东西不是一个文件,那么它就是一个进程”。但是,Linux 区分不同类别的文件
- 常规文件包含数据,例如文本、程序指令、图片、视频录制等。
- 目录实际上只是包含文件列表的文件。
- 特殊文件,代表用于输入和输出的机制,放置在 /dev 目录下。
- 套接字,用于通过网络进行进程间通信的特殊文件。
- 链接,一种在文件系统的多个位置创建可见文件的机制。
- 管道,允许进程间通信,相对于套接字具有更精简的语义。
我们将在本页稍后回顾这些概念中的一些。
文件系统结构
在 Linux 中,所有文件和文件夹都放置在一个单一的根树中。这个根被称为root,在 Linux 命令中用 / 符号表示。用于包含这些文件(或文件夹)的卷不会在树中明显显示,从而完全抽象了它们。每个使用的卷都包含树的一部分,但不太可见。
在这棵树中,通过其路径可以绝对地定位特定的文件或目录。该路径以 / - 文件系统的根 - 开头,然后是构成相关文件谱系的目录名称,每个祖先目录之间用一个 / 字符分隔。因此,/home/Fred/Documents/example.txt 表示位于 Documents 目录中的 example.txt 文件,该目录本身位于 Fred 文件夹中,该文件夹本身位于 home 目录中,而该目录直接位于根目录 (/) 下。
- 文件放置在许多树中的一个树中,每个树的根都是诸如 C:、D: 等卷。
- 树级别的分隔符是 \ 而不是 /。
设备文件和特殊文件 - 磁盘和分区的命名
在启动时,Linux 系统扫描硬件并将每个发现的设备与一个特殊文件(也称为设备文件)关联起来。这个特殊文件 - 命名的原因是它在磁盘上没有内容,但它用作一个文件 - 是设备驱动程序和硬件之间的接口。驱动程序只需写入此设备文件进行输出,并在其中读取以进行输入。这些设备文件通常放置在 /dev 目录下。磁盘通常与特殊文件(设备文件)hd<letter>(用于 PATA 设备)和 sd<letter>(用于 SATA 驱动器)关联。这些磁盘的分区由 hd<letter>/<number> 或 sd<letter>/<number> 表示,并放置在 /dev 目录下,例如 /dev/hda, /dev/hda1, /dev/hda2, /dev/sda, /dev/sda1, /dev/sda2, /dev/sdb 等。
安装前的分区准备
除了低级格式化和创建分区之外,还有一个操作没有完成,操作系统无法使用分区:高级分区。事实上,此操作旨在放置文件系统的一个分支。这个分支完全是空的,但已准备好接收目录和文件,并准备 VBR - 我们之前谈到的著名 VBR。在 Linux 中,仿佛要强调这种格式化所做的事情,它称之为 mkfs.<type> - mkfs 是 make filesystem 的缩写。这就是为什么在文献中,我们会发现“make a filesystem”一词而不是“format”。
在安装过程中,系统会提示您指定要分配给每个分区的文件系统类型。我们不会深入探讨每种类型的优缺点,但要知道 Linux 最常用的类型有 ext2、ext3、ext4、Reiser、Btrfs、Xfs 等。如果您稍后在安装后,想要在分区上创建文件系统,则必须指定 mkfs.<type> 这种文件系统类型。例如,要在 /dev/sdc1 中创建一个 ext4 文件系统,请打开终端,并获取超级用户权限,然后启动命令
mkfs.ext4 /dev/sdc1设置文件系统 - 分区的挂载和卸载
在 RAM 中的初始化
当系统启动时,在引导加载程序将内核加载到内存后,会从使用各种技术的图像中在内存中创建一个最小文件系统,对此的解释超出了本页的范围。这个文件系统是虚拟的,因为它驻留在易失性内存中。它将逐渐变得真实,因为通过现在要描述的挂载操作,它将驻留在非易失性介质上。这是因为,这个虚拟的初始系统包含所有必要的驱动程序来挂载不同的分区 - 及其文件系统 - 这使得一切成为可能。
挂载和卸载的概念
挂载点
挂载点不过是文件系统树中的任何目录,我们将在其上移植位于仍未激活分区上的分支。如以下插图所示,移植将使该挂载点下游的树分支对操作系统不可见,并将其替换为移植到移植分区上的分支。
挂载和卸载说明
前面的图片显示了如何将分区 - 在这里是 b 分区 - 挂载到挂载点 - 在这里是 /home。一切都好像已挂载分区的根正在替换挂载点所代表的目录,就像嫁接一样。分区内部的整个树立即可以被操作系统的进程访问。从那一刻起,b 分区属于 Linux 文件系统。相反,如果在挂载之前,树在挂载点之后延伸,具有或多或少的复杂分支,该分支不会从包含它的介质中消失,它只是从操作系统断开连接并对操作系统不可见。下图描述了这种机制,在 c 分区挂载到 /home/user1 挂载点后,/home/User1/Docs1 目录从文件系统中消失。
当然,如果随后卸载 c 分区,则会重新发现隐藏的目录,而 c 分区的目录将再次变得无法访问。
最后,卸载 b 分区将恢复初始状态。
确定要挂载的分区
在 openSUSE 或任何其他 Linux 发行版的安装过程中,管理员在完成系统上存在的磁盘分区后,会被要求指定他想要对分区做什么。通常,openSUSE 建议一个基本组织,提供以下用途
- 一个交换分区,将用作计算机 RAM 的扩展;
- 一个分区,将被挂载到文件系统的根目录;
- 一个分区,将被挂载到 /home 挂载点,其用途是用户的目录和文件,以便将它们与 Linux 系统清晰地分隔开。
管理员在安装过程中做出的选择存储在真实的 /etc/fstab 文件中 - 真实是指驻留在非易失性磁盘上的文件。此文件包含除了分区的分配之外,一些超出本页范围的挂载选项,但邀请读者使用命令阅读 fstab man 页
man fstab
安装后挂载分区
在安装过程中,管理员定义了系统必须使用哪些分区以及它们应该在文件系统树中的哪些位置挂载。至于挂载本身,YaST 会透明地完成。但是,如果我们在安装后想要访问另一个分区该怎么办?我们将会回顾以下问题的各种答案。
可移动介质的情况
这里我们说的是可以由用户随意插入和拔出的 CD/DVD 或 USB 存储设备。当可移动设备插入系统时会发生什么?首先需要为它分配一个设备文件。udev 守护程序会执行此操作,就像它在启动时为任何其他设备所做的那样,遵循相同的规则。内核会通知 udev 守护程序新设备的可用性,udev 会创建设备文件。例如,如果它是一个 USB 存储设备,并且该存储设备已标记,则可以在 /dev/disk/by-label/ 目录中找到该设备文件。至于挂载,事情的发生方式如下。HAL 守护程序从 udev 收到一个信号,告诉它已创建了一个新的设备文件。HAL 使用 /media 目录来完成挂载。
它在那里挂载所有内容。它在那里进行管理。这不可配置。当要挂载的分区具有标签(例如 Backup)时,它将使用该标签在 /media/Backup/ 创建挂载点,并将分区挂载在那里。如果没有标签,它将使用设备类型作为名称进行挂载,从而挂载到 /media/cdrom/ 或 /media/disk/。它会添加数字以避免双重名称 (/media/disk-1)。因此,您无法将您的流浪主目录挂载到 /home/ 中使用 HAL!用户可以随时卸载分区 - 甚至建议在断开此类介质之前进行卸载,以避免中断待处理的读写操作。
为此,他可以使用桌面环境的图形文件资源管理器或使用 umount 命令
umount <分区's挂载点路径>
不可移除介质的情况
在双系统安装 openSUSE 和 Windows 后,可能会发现需要访问 Windows 分区内的许多文件,但不幸的是,该分区尚未被系统声明为已挂载。
- 如果需要是临时的,可以使用诸如 Gnome-disk-utility 之类的工具在 /run/media/<用户名>/<分区标签> 上进行临时挂载。
挂载的分区随后会出现在文件管理器中。它也可以从命令行访问——请参考 Linux 的基本命令。
- 如果需要是永久的,可以向 /etc/fstab 文件中添加一行。下次启动时,新行将被考虑,并且分区将按照在 /etc/fstab 中定义的选项进行挂载。
文件系统的标准组织
Linux 文件系统的组织由 文件系统层次结构标准 定义。该标准使软件和用户能够预测已安装文件和目录的位置。在其最新版本中,它区分了两种主要标准,这些标准决定了文件的定位。它们的变异性——静态或可变——以及它们在主机之间共享的能力——可共享和不可共享。我们现在不会深入研究本文的细节,而只是说明第一级目录的用途。
- / 是根。它是文件系统的最高级别。在文件系统设置的开始阶段,这个目录——以及一些其他子目录——纯粹是虚拟的(驻留在 RAM 中),然后包含文件系统的最终根的分区被挂载在那里,只读。这样内核才能找到初始化磁盘和挂载其他分区所需的工具。完成这项工作后,分区将被重新挂载为读写。
- /home 是用户文件将被放置的地方。通常,但并非强制,会有一个单独的分区挂载在那里。
- /etc 是已安装应用程序配置文件的地方,例如 /etc/fstab、/etc/hosts 等。
- /lib 是共享库和内核模块的地方。
- /media 是用于可移动设备的挂载点,例如 CD、DVD、USB 存储器或驱动器等。
- /bin 是用于基本命令二进制文件的位置,例如 cat、ls、mount 等。
- /boot 是用于引导加载程序静态文件的地方。
- /dev 是用于设备文件的位置。
- /mnt 是用于临时挂载文件系统的地方。
- /opt 是用于附加程序的地方。
- /run 是用于与正在运行的进程相关的数据的地方。
- /sbin 是用于基本命令的地方。
- /srv 是用于系统支持的服务的数据,例如 Web 服务器的文件。
- /tmp 是用于临时文件的地方。
- /usr 是一个二级层次结构。
- /var 是用于可变数据的地方。
- /root 是用于属于超级用户(root)的文件的地方。
当然,对于每个一级目录,该标准都会深入到树的描述中,但这些详细的知识对于普通用户来说,更不用说初学者来说,并非绝对必要。
工具
由于这是一个入门教程,我们不会过多地讨论工具,但会提到一些(例如 fdisk、mkfs.<类型>、mount)。与往常一样,它们和配置文件(如 /etc/fstab)在您的系统上(以及在互联网上)都有它们的 man-pages。它们是供您阅读的。虽然 Yast > 系统 > 分区器 是一个有用的 GUI,但您可能需要在运行级别 3 或单用户模式下恢复到 CLI 命令,因为您需要在处理它们时卸载文件系统。出于同样的原因,您甚至可能需要从运行 fdisk 和朋友的救援 CD/DVD 启动(否则您将没有未挂载的 /)。可引导的 GUI 工具(如 Gparted)更进一步。它们了解文件系统的内部结构,因此可以更改它们的大小,但这超出了本文的范围。
链接
- http://en.wikipedia.org/wiki/Disk_formatting
- http://en.wikipedia.org/wiki/Disk_partitioning
- http://en.wikipedia.org/wiki/Inode
- http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
- http://en.wikipedia.org/wiki/Udev
- http://en.wikipedia.org/wiki/HAL_(software)
关键词:分区,文件系统,挂载点,udev,HAL





