跳转到内容

Unix 指南/解释/文件系统和交换空间

来自维基教科书,开放的书籍,开放的世界

Unix 类文件系统的一个共同特征是所有文件都出现在一个文件层次结构中。存储层次结构基础的文件系统被称为根文件系统。/,包含所有其他目录的目录,本身称为根目录。其他文件系统被挂载在/下的目录上,这使得这些文件系统看起来像是根文件系统中的目录。例如,包含文件的 CD-ROM 可以被挂载到/mnt/cdrom。在这个例子中,/mnt/cdrom 被称为挂载点。对设备的访问是由另一个挂载在/dev上的文件系统提供的。这里可以访问代表物理和虚拟设备的文件。文件系统本身以/dev中的文件形式表示,例如/dev/cdrom,并且可以挂载到根文件系统中的目录,例如/mnt/cdrom。每个磁盘或存储介质可以包含一个或多个文件系统,每个文件系统都包含可以包含数据的文件。有些磁盘还用于交换空间,在内存已满时,为内存中的数据提供临时存储空间。虽然“交换空间”驻留在磁盘上,但它实际上不是一个文件系统。


Clipboard

待办事项


Clipboard

待办事项


文件系统类型列表

[编辑 | 编辑源代码]

Unix 类系统的选择会影响文件系统的选择。文件系统有两种。

  • 具有完整 Unix 支持的文件系统可以保存所有类型的 Unix 文件,包括普通文件、目录、命名管道、符号链接和设备节点。它们还支持完整的 Unix 用户和组权限模型。这使得这些文件系统适合挂载在/上,以及/home/tmp/usr/var和任何其他这样的文件系统,如果这些是独立的分区。
  • 非 Unix 文件系统最初是为非 Unix 操作系统设计的,或者用于在不同的文件系统之间交换文件。有时,文件系统上每个文件的权限必须相同,并且只允许普通文件和目录。

具有完整 Unix 支持的文件系统

[编辑 | 编辑源代码]
  • Unix 文件系统 (ufs/ffs) 是*BSD 和几种商业 Unix 变体的文件系统。UFS 是磁盘上的布局,而 FFS 是 *BSD 中对 UFS 的一些内核优化。UFS 有几个不兼容的扩展,包括 FreeBSD、NetBSD 和 Mac OS X 的 UFS2。因此,UFS 适用于根文件系统,但不适合在实现 UFS 不兼容的不同 Unix 类操作系统之间交换文件。
  • Linux 第二扩展文件系统 (ext2ext3ext4) 受 ufs/ffs 的启发,并且类似。ext2 是Linux的主要文件系统实现,可以用作根文件系统。与 ufs/ffs 不同,ext2 始终具有相同的磁盘布局,并且可以在不同的 Linux 系统之间以及理解 ext2 的其他系统之间共享。请注意,ext3实际上与 ext2 相同,但启用了日志记录,并且支持哈希 B 树,这加快了更大目录中的查找。Linux 还提供了其他你可以使用而不是 ext2 的文件系统。
  • reiserfsLinux上 ext2 的替代品。Reiserfs 是一个由 Hans Reiser 编写的快速日志文件系统。
  • jfs 是一个由 IBM 编写的,最初用于 IBM AIX,然后由同一家公司移植到 Linux 的高性能日志文件系统。
  • xfs 是一个由 SGI 编写的,高性能日志文件系统。这个文件系统最初是为 SGI 的 Irix 操作系统编写的,它已经使用一个垫片层移植到 Linux,将 Linux VFS 和锁机制转换为 Irix 语义。
  • HFS+ (hfsplus) 是Mac OS X的主要文件系统实现,可以用作根文件系统。与 ext2 一样,HFS+ 始终具有相同的磁盘布局,并且可以在不同的 Mac 系统之间共享。HFS+ 支持 Unix 和 Mac 文件属性。HFS+ 具有二叉树,这使得它有时比 ffs 和 ext2 更快。

外部文件系统

[编辑 | 编辑源代码]
  • iso9660 是 CD-ROM 的通用文件系统。大多数 Unix 类系统都可以读取它。
  • UDF 是 DVD 的通用文件系统。一些较新的 Unix 类系统可以读取和写入它。
  • msdos (FAT) 是来自 MS-DOS、FreeDOS、ReactOS 和 Microsoft Windows 的文件系统。通常你可以有普通文件和目录,但没有特殊文件、符号链接,也没有 Unix 文件权限。由于几乎每个 Unix 类系统(包括 Linux、*BSD 和 Mac OS X)以及 DOS/Windows 都理解它,因此 msdos 文件系统通常用于在计算机之间或在启动多个操作系统的计算机之间交换文件。
  • ntfs 是来自 Microsoft Windows NT 的较新文件系统。一些 Linux 内核可以读取它们。

磁盘分区

[编辑 | 编辑源代码]

如果磁盘没有分区,它可以用于一个文件系统,或全部用作交换空间。

  • 在 Linux 上,IDE/ATA 磁盘被称为 /dev/hda、/dev/hdb、/dev/hdc...
  • 在 Linux 上,SCSI 磁盘被称为 /dev/sda、/dev/sdb、/dev/sdc...
  • 在 *BSD 上,IDE/ATA 磁盘被称为 /dev/wd0c、/dev/wd1c、/dev/wd2c...
    • 在 FreeBSD 上,IDE/ATA 磁盘被称为 /dev/ad0c、/dev/ad1c、/dev/ad2c...
  • 在 *BSD 上,SCSI 磁盘被称为 /dev/sd0c、/dev/sd1c、/dev/sd2c...
  • 在 *BSD 上,光盘 (CD) 被称为 /dev/cd0c、/dev/cd1c...
  • 在 Mac OS X 上,磁盘被称为 /dev/disk0、/dev/disk1、/dev/disk2...
  • NetBSD/OpenBSD 磁盘映像是 /dev/svnd0c、/dev/svnd1c、/dev/svnd2c...

分区磁盘允许使用多个文件系统和交换空间。

  • 在 Linux 上,hda 被分区为 /dev/hda1、/dev/hda2、/dev/hda3、/dev/hda4...
  • 在 *BSD 上,wd0 被分区为 /dev/wd0a、/dev/wd0b、/dev/wd0c、/dev/wd0d...
  • 在 Mac OS X 上,disk0 被分区为 /dev/disk0s1、/dev/disk0s2、/dev/disk0s3...

此外,*BSD 还有一些额外的规则

  • 分区 'c' (/dev/wd0c) 必须是整个磁盘。
  • 如果 *BSD 操作系统在磁盘上启动,那么分区 'a' 必须是根 (/),'b' 必须是交换空间。(如果磁盘上没有操作系统,那么 'a' 可以用于任何文件系统)。

章节 分区磁盘 更详细地描述了格式以及如何编辑分区表。

挂载文件系统和激活交换空间

[编辑 | 编辑源代码]

使用的命令是

  • mount 用于挂载文件系统
  • umount 用于卸载文件系统
  • swapctlswaponswapoff

简单挂载

[编辑 | 编辑源代码]

假设 /dev/hdb 是一个设备(例如 CD 驱动器),而 /mnt/cdrom 是挂载的位置。那么挂载命令是

mount /dev/hdb /mnt/cdrom

还有更多挂载选项,因此可以在 Unix 命令指南 中查找 mount。

使用 fstab 挂载

[编辑 | 编辑源代码]

/etc/fstab 文件通过指定默认挂载点来帮助你挂载。

  1. 为 /dev/hdb 创建一个 /etc/fstab 条目。
  2. 运行以下命令
mount /dev/hdb

卸载

[edit | edit source]

它是称为 umount,而不是 unmount...

umount /dev/hdb

用户挂载

[edit | edit source]

用户挂载 是指非超级用户用户对文件系统的挂载和卸载。不幸的是,不同的 Unix 变体对这项任务有不同的方法。(另一种方法是配置“sudo”以允许用户在挂载和卸载时成为 root。)以下是一些 root 允许用户挂载的方法

  • Linux 允许用户执行通过/etc/fstab文件允许的挂载。每个包含挂载选项“user”的行描述了允许的挂载。例如,mount /dev/cdrom非 root 用户将挂载/dev/cdrom使用挂载点和选项显示在/etc/fstab中,但前提是“user”在挂载选项中列出。
  • 许多流行的 BSD 家族操作系统允许用户挂载任何用户可以读取和写入的设备。用户可以选择用户拥有的任何挂载点。在大多数系统中,必须由 root 用户更改 sysctl 值才能执行此操作。
    • 在 OpenBSD 中,kern.usermount 必须设置为 1。
    • 在 NetBSD 中,vfs.generic.usermount 必须设置为 1。
    • 在 FreeBSD、PcBSD 和 DragonflyBSD 中,vfs.usermount 必须设置为 1。

联合挂载

[edit | edit source]

通常,文件系统被挂载到空目录。如果目录不为空,则其文件将被隐藏,直到文件系统被卸载。联合挂载 允许这些文件显示出来。目录中每个现有文件只在挂载的文件系统中没有相同位置的文件时才会显示。所有新文件都在挂载的文件系统上创建。请注意,联合挂载很奇怪,可能无法在您的系统上正常工作。

一些操作系统为其提供了 mount(8) 选项 -o union。在这个例子中,一个非分区 SCSI 磁盘 sd0 将被挂载到 /etc(它通常不是挂载点)。我们拥有的任何 /etc 文件,如果不在 sd0 上,都将仍然可用。

# mount -o union /dev/sd0c /etc

磁盘映像

[edit | edit source]

文件系统可以存储在另一个文件系统上的文件上。这些文件称为 磁盘映像,它们有几个应用

  • 使用 dd 将数据从设备节点复制到普通文件,以保留小磁盘的内容,例如软盘。
  • 一些程序允许您在刻录到 CD 之前制作 iso9660 磁盘映像。您可能希望以只读方式挂载磁盘映像以在刻录之前检查它。还可以将此类映像移动到装有 CD 刻录机的计算机,或提供映像供下载,以便其他人刻录它。
  • 如果您在磁盘上没有用于新分区的可用空间,但某些分区有可用空间,则如果您需要新的文件系统,则可以创建磁盘映像。有时这有助于创建加密文件系统。

本指南仅描述原始磁盘映像,其中仅包含文件系统。还有其他格式(例如 Mac OS X NDIF 格式),但这些格式必须转换或以特殊方式处理。

在 NetBSD 和 OpenBSD 上挂载磁盘映像

[edit | edit source]

通常,NetBSD 和 OpenBSD 仅允许挂载存储在设备上的文件系统。因此,涉及五个步骤

  1. 将磁盘映像与 svnd 设备相关联。
  2. 挂载 svnd 设备。
  3. 使用磁盘映像。
  4. 卸载 svnd 设备。
  5. 取消将磁盘映像与设备关联。

关联和取消关联由 vnconfig(8) 命令处理。在这个例子中,/the/disk/image 将与 /dev/svnd0c 相关联。此特定磁盘映像具有一个包含分区“a”上的文件系统的磁盘标签,我们将其挂载到 /mnt 上。如果没有磁盘标签,我们将改为挂载分区“c”。

# vnconfig -c /dev/svnd0c /the/disk/image
# mount /dev/svnd0a /mnt
...
# umount /dev/svnd0a
# vnconfig -u /dev/svnd0c

在 FreeBSD 5 上挂载磁盘映像

[edit | edit source]

在 FreeBSD 5 中,使用带有 vnode 支持存储的 mdconfig(8)

在 Linux 上挂载磁盘映像

[edit | edit source]

mount(8) 选项 -o loop 可用于挂载磁盘映像而不是设备。

# mount -o loop /the/disk/image /mnt
...
# umount /mnt

一些 Linux 内核可以挂载 cloop(压缩循环),它是一个压缩的磁盘映像。此类映像必须以只读方式挂载。首先准备映像,然后如何压缩它?然后如何挂载它?Knoppix livecd 使用 cloop 将更多程序放到 CD 中。

创建磁盘映像

[edit | edit source]

在您挂载并开始使用新创建的空磁盘映像之前,需要执行两个步骤

  1. 使用 dd(1) 创建一个具有正确大小的新的零文件。
  2. 使用分区和文件系统格式化磁盘映像。

这是一个例子。我们使用 dd 和无限的零 /dev/zero 来创建一个 1440 千字节的磁盘映像(1440 个 1024 字节的块)。然后我们使用 mkfs.ext3(8) 来创建一个未分区 ext3 文件系统。请注意,mkfs.ext3 不会执行挂载,因此它不关心它是否格式化的是设备还是磁盘映像。(FIXME 这是否正确?)

$ dd bs=1024 count=1440 if=/dev/zero of=example
$ mkfs.ext3 example

*BSD newfs(8)newfs_msdos(8) 实用程序只坚持格式化设备。这可以通过 vnconfig(8) 解决。如果我们要对磁盘映像进行分区,我们也会制作一个磁盘标签。可以忽略虚构的磁盘几何形状。

$ dd bs=1024 count=1440 if=/dev/zero of=example
$ sudo vnconfig -c /dev/svnd0c example
$ sudo newfs /dev/rsvnd0c
...
$ sudo vnconfig -u /dev/svnd0c

实际上,在 *BSD 上,最好始终使用磁盘标签,尤其是在创建 ffs 文件系统时,这样文件系统就会在标签中正确列出,并且字母将与“c”不同。

$ dd bs=1024 count=1440 if=/dev/zero of=example
$ sudo vnconfig -c /dev/svnd0c example
$ sudo disklabel -E svnd0

Initial label editor (enter '?' for help at any prompt)
> a
partition: [a]
offset: [0]
size: [2880]
FS type: [4.2BSD]
> p
device: /dev/rsvnd0c
type: SCSI
disk: vnd device
label: fictitious
bytes/sector: 512
sectors/track: 100
tracks/cylinder: 1
sectors/cylinder: 100
cylinders: 28
total sectors: 2880
free sectors: 0
rpm: 3600

16 partitions:
#             size        offset  fstype [fsize bsize  cpg]
  a:          2880             0  4.2BSD   2048 16384   32 # Cyl     0 -    28*
  c:          2880             0  unused      0     0      # Cyl     0 -    28*
> q
Write new label?: [y]
$ sudo newfs /dev/rsvnd0a
...
$ sudo vnconfig -u /dev/svnd0c

加密文件系统

[edit | edit source]

OpenBSD 上的加密文件系统

[edit | edit source]

由于 OpenBSD 集成了加密,因此可以预期有一种方法可以拥有加密文件系统。OpenBSD 仅为磁盘映像提供 Blowfish 加密。这可以通过 -k 标志对 vnconfig(8) 使用 -c 来实现。

在这个例子中,我们将挂载名为 /secrets 的加密磁盘映像,它包含一个名为“a”的单个分区字母

# vnconfig -ck /dev/svnd0c /secrets
Encryption key:
# mount /dev/svnd0a
...
# umount /dev/svnd0a
# vnconfig -u /dev/svnd0c

请注意,如果您输入了错误的加密密钥,vnconfig 仍然会成功。挂载将失败,因为磁盘标签和文件系统头无法读取。在这种情况下,您必须 vnconfig -u,然后使用正确的密钥 vnconfig -ck。在最初格式化新的磁盘映像时,请确保使用正确的密钥。

要拥有整个加密磁盘分区,请创建一个普通的未加密磁盘映像,将其挂载,然后使用一个大文件填充分区以用作磁盘映像。

Linux 上的加密文件系统

[edit | edit source]

一些 Linux 内核配置允许您使用 losetup 加密磁盘映像。想想 lo(opback) 设置,而不是 lose tup。

参考资料

[编辑 | 编辑源代码]
华夏公益教科书