内容


学习 Linux,101

创建分区和文件系统

划分并掌管您的磁盘空间

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 学习 Linux,101

敬请期待该系列的后续内容。

此内容是该系列的一部分:学习 Linux,101

敬请期待该系列的后续内容。

概述

在本文中,学习磁盘分区和 Linux 文件系统相关内容。学习:

  • 创建分区
  • 使用 mkfs 命令来设置 ext2、ext3、ext4、xfs、Reiser v3 和 vfat 文件系统
  • 创建和管理交换空间

本文帮助您准备 Linux Professional Institute's Junior Level Administration (LPIC-1) 考试 101 中主题 104 下的目标 104.1。该目标的权值为 2。

注意:本文包含适用于 LPI Exam 101: Objective Changes as of July 2, 2012 的材料。我们添加了一些关于 ext4 文件系统的基本信息,还添加了一些关于 gdisk 和 GUID Partition Table (GPT) 的基本信息。新代码清单和图都是在 64 位的 Fedora 17 系统上完成的。

先决条件

为了最有效地利用本系列中的文章,您应该具有基本的 Linux 知识,并需要准备一个 Linux 系统,用于练习本文介绍的命令。有时候不同版本的程序输出格式不同,因此您所得到的结果未必总是与这里所示的清单和图相同。

您还应该熟悉我们的文章 “学习 Linux 101:硬盘布局” 中的内容。

块设备和分区

我们的文章 “学习 Linux 101:硬盘布局” 介绍了硬盘驱动器布局、分区以及使用 fdiskgdisk 命令来查看分区信息的基本知识。您学习了 Master Boot Record (MBR)、分区表、分区相关信息,包括主分区扩展分区逻辑分区。本文还向您介绍了 GUID Partition Tables (GPT),这是一种用于解决 MBR 格局大小固有限制的新格式。最后,我们还了解到,一个 Linux 系统可以包含一些可安排在磁盘或目录 的其他块存储设备 中的文件。和许多其他系统一样,Linux 系统上的目录也可能包含其他目录,这些目录称为子目录。这篇文章还讨论了一些指导您进行分区选择的注意事项。

注意:本文主要关注与 fdisk 命令以及使用 MBR 布局进行分区相关的 LPI 需求。创建一个 ext4 文件系统 小节中包含一些 gdisk 命令。请参阅早期文章及其参考资料,获取关于 GPT 的更多信息。

本文将首先回顾一下块设备和分区,然后进一步展示如何使用 fdisk 命令创建、修改或删除块设备上的分区。您还将学习 mkfs(mkfs 代表 make filesystem)命令的各种形式;mkfs 命令用于将分区格式化为一种特殊的文件系统类型。

注意:除了 LPI 考试要求的工具和文件系统之外,您可能会遇到或需要其他工具和文件系统。其他工具和文件系统 小节提供了其他可用工具的一个简单摘要。

块设备

块设备 是能够以固定大小 格式化的任意存储设备的抽象层;单个块的访问可以独立于其他块的访问。这样的访问通常称为随机访问

随机可访问的固定大小块的抽象层允许程序使用这些块设备,而无需担心底层设备是硬盘驱动器、软盘、CD、固态驱动器、网络驱动器,还是某种虚拟设备,比如内存文件系统。

块设备示例包括系统上的第一 IDE 硬盘驱动器(/dev/sda 或 /dev/hda)或第二 SCSI、IDE 或 USB 驱动器(/dev/sdb)。使用 ls -l 命令来显示 /dev 目录下的内容。每行输出的第一个字符是 b(针对设备,比如软盘、CD 驱动器、IDE 硬盘驱动器或 SCSI 硬盘驱动器)和 c(针对字符设备,比如 a、终端 (tty) 或空设备)。清单 1 展示了一些示例。

清单 1. Linux 块设备和字符设备
[ian@echidna ~]$ ls -l /dev/loop1 /dev/null /dev/sd[ab] /dev/sr0 /dev/tty0
brw-rw----. 1 root disk   7,  1 2010-06-14 07:25 /dev/loop1
crw-rw-rw-. 1 root root   1,  3 2010-06-14 07:25 /dev/null
brw-rw----. 1 root disk   8,  0 2010-06-14 07:25 /dev/sda
brw-rw----. 1 root disk   8, 16 2010-06-14 07:25 /dev/sdb
brw-rw----+ 1 root cdrom 11,  0 2010-06-14 07:25 /dev/sr0
crw--w----. 1 root root   4,  0 2010-06-14 07:25 /dev/tty0

分区

对于某些块设备,比如软盘、CD 或 DVD 磁盘,通常使用整个媒体作为单个文件系统。但是,对于大型硬盘驱动器,甚至是 USB 存储器,更常见的用法是将可用空间划分为几个不同的分区

分区的大小可能不同,不同的分区上可以拥有不同的文件系统,因此一个磁盘可以用于多种目的,包括在多个操作系统之间共享该磁盘。例如,我使用的测试系统包含几个不同的 Linux 发行版,有时还包含一个 Windows® 系统,它们都共享一个或两个硬盘驱动器。

文章 “学习 Linux 101:硬盘布局” 中曾介绍过,硬盘驱动器拥有一个几何参数(geometry),根据术语柱面、磁头和扇区定义。即使是现代驱动器也使用逻辑块寻址(LBA),这使得几何参数变得几乎无关紧要,用于分区的基本分配单元通常仍旧是柱面。

显示分区信息

分区信息存储在磁盘的分区表 中。分区表列出每个分区的起始柱面和结束柱面的相关信息,关于其类型 的信息,以及它是否标记为可引导。要创建和删除分区,需要使用一个专门设计的程序来编辑分区表。对于 LPI 考试,您需要了解 fdisk 程序,这也是本文介绍的程序,尽管也可以使用其他几个工具。本文末尾将提到其中几个工具。

附带 -l 选项的 fdisk 用于列示分区。如果想查看一个特定驱动器上的分区,需要添加一个设备名称,比如 /dev/sda。请注意,分区工具需要 root 访问权限。清单 2 展示了我的系统的两个主硬盘驱动器上的分区。

清单 2. 使用 fdisk 列出分区
[root@attic4 ~]# fdisk -l /dev/sda

Disk /dev/sda: 640.1 GB, 640135028736 bytes
255 heads, 63 sectors/track, 77825 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00064a1a

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         127     1020096   83  Linux
/dev/sda2             128        1402    10241437+  82  Linux swap / Solaris
/dev/sda3   *       46340       56538    81920000   83  Linux
/dev/sda4            1403       46339   360956422    5  Extended
/dev/sda5            1403       10420    72437053+  83  Linux
/dev/sda6           10421       19344    71681998+  83  Linux
/dev/sda7           19345       28350    72340663+  83  Linux
/dev/sda8           28351       37354    72324598+  83  Linux
/dev/sda9           37355       46339    72171981   83  Linux

Partition table entries are not in disk order

[root@echidna ~]# fdisk -l /dev/sda

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000de20f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9111    73184076    7  HPFS/NTFS
/dev/sda2            9634        9730      779152+  83  Linux
/dev/sda3            9731      116679   859067842+   5  Extended
/dev/sda5            9731       20917    89859546   83  Linux
/dev/sda6           20918       39644   150424596   83  Linux
/dev/sda7           39645       53905   114551451   83  Linux

注意:

  1. 标题信息显示磁盘大小和几何参数。大多数使用 LBA 的磁盘每个柱面拥有 255 个磁头,每个磁道拥有 63 个扇区,总共拥有 16065 个扇区,或者每个柱面 8225280 字节。
  2. 在第二个示例中,第一个主分区(/dev/sda1)标记为 bootable(或 active)。这允许标准 DOS PC 主引导记录引导该分区。这个标记对 LILO 或 GRUB 引导装载程序没有意义。第一个示例使用 GRUB 作为引导装载程序,/dev/sda3 被标记为 bootable 的原因可能是我以前使用这个驱动器的一次意外。
  3. StartEnd 列显示每个分区的起始和结束柱面。这些分区不能重叠且通常应该相邻,即中间没有空间。
  4. Blocks 列显示大小为 1K(1024 字节)的块的数量。对于本文撰写之时使用的大多数磁盘而言,扇区大小是 512 字节,因此一个分区中的块的最大数量是柱面数量(End + 1 - Start)和每个柱面的扇区数量的乘积的一半。块数量后面的 + 号表示分区中的扇区没有全部使用。
  5. Id 列表示分区的预期用途。类型 82 是表示 Linux 交换分区,类型 83 表示 Linux 数据分区。已定义的分区类型大概有 100 种。第二个磁盘由几个操作系统共享,其中包括 Windows/XP,因此出现了 Windows NTFS(也可能是 FAT32)分区。

使用 fdisk 进行分区

您刚刚已经看到如何使用 fdisk 命令来显示分区信息。这个命令还提供了一个菜单环境来编辑分区表,以便创建或移除分区。

警告

开始修改分区之前,需要记住一些重要事项。如果不遵守以下这些原则,则会存在丢失现有数据的风险。

  1. 开始之前备份重要数据,进行任何可能会导致数据丢失的操作之前都应这样做。
  2. 不要更改正在使用的分区。事先详细计划,然后小心执行。从 CD、DVD 或 USB 启动一个实时发行版是确保没有硬盘驱动器分区正在使用的一个好办法。
  3. 了解您的工具fdisk 命令不会向您的磁盘提交任何更改,除非您要求它那样做。其他工具,其中包括 parted 可能会随着您的操作提交更改。
  4. 如果的确犯了错误,那么应立即停止。分区工具对分区表进行写操作。除非您使用的工具还包含对您磁盘的数据区域的移动、大小重置、格式化等写操作功能,否则您的数据将不会受到影响。如果您的确犯了错误,尽快停止操作并寻求帮助。您仍然有可能恢复此前的分区表定义,从而恢复您的分区和数据。

启动 fdisk

要以交互模式启动 fdisk,只需提供一个磁盘的名称(比如 /dev/hda 或 /dev/sdb)作为参数。以下示例启动一个 Knoppix Live DVD。您需要 root 权限,并将看到类似于 清单 3 的输出。

清单 3. 启动交互式 fdisk
knoppix@Microknoppix:~$ su -
root@Microknoppix:~# fdisk /dev/sda

The number of cylinders for this disk is set to 121601.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help):

大多数磁盘拥有超过 1024 个柱面,因此您通常会看到 清单 3 中显示的警告。类型 m 将显示一个可用的单字母命令列表,如 清单 4 所示。

清单 4. fdisk 中的帮助
Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help):

使用 p 命令来显示这个特定磁盘上的现有分区,清单 5 显示了输出。

清单 5. 显示现有分区表
Command (m for help): p

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000de20f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9111    73184076    7  HPFS/NTFS
/dev/sda2            9634        9730      779152+  83  Linux
/dev/sda3            9731      116679   859067842+   5  Extended
/dev/sda5            9731       20917    89859546   83  Linux
/dev/sda6           20918       39644   150424596   83  Linux
/dev/sda7           39645       53905   114551451   83  Linux

Command (m for help):

这个磁盘是一个 1TB 磁盘,包含一个小于 80GB 的 Windows/XP 分区。它是一个主分区,标记为 bootable,这是 Windows 系统的典型特征。

添加分区

现在我们使用部分闲置空间来添加一些分区。

  1. 我们将创建一个交换分区 /dev/sda4。这将是一个主分区,填充 /dev/sda1 的结束柱面和 /dev/sda2 的起始柱面之间的 521 个柱面空隙。您不必对导致这个空隙的奇怪原因感到好奇;我只是为了撰写本文而创建了这个空隙。
  2. 我们将创建一个 40GB 的逻辑分区 /dev/sda8。
  3. 最后,我们将创建一个 2000MB 的小型逻辑分区,以便在 Linux 和 Windows 系统之间共享数据。这个分区最终将格式化为 FAT32(或 vfat)。这个分区将命名为 /dev/sda9。

创建我们的分区

我们首先使用 n 命令来创建一个新分区,如 清单 6 所示。

清单 6. 创建第一个分区
Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
p
Selected partition 4
First cylinder (9112-121601, default 9112): 
Using default value 9112
Last cylinder, +cylinders or +size{K,M,G} (9112-9633, default 9633): +521

Command (m for help): p

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000de20f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9111    73184076    7  HPFS/NTFS
/dev/sda2            9634        9730      779152+  83  Linux
/dev/sda3            9731      116679   859067842+   5  Extended
/dev/sda4            9112        9633     4192965   83  Linux
/dev/sda5            9731       20917    89859546   83  Linux
/dev/sda6           20918       39644   150424596   83  Linux
/dev/sda7           39645       53905   114551451   83  Linux

Partition table entries are not in disk order

Command (m for help):

我们采用默认值作为第一个柱面并指定值 +521 作为柱面的数量。如 清单 6 所示,我们的分区大小约为 4GB。由于它是一个主分区,因此它的编号必须为 1 至 4。顺序指定分区编号是个好主意;否则一些工具会报告错误,fdisk 将警告我们:我们的分区表条目不再按磁盘顺序排列。

还要注意一点:我们的新分区类型被指定为 83,表明这是一个 Linux 数据分区。可以将这个数字视为分区预定用途的操作系统的指示符。分区的最终用途应该匹配这个设置,但这时我们的分区甚至还没有格式化,更谈不上有数据了。我们将首先创建其他分区,然后介绍如何更改分区类型。

您可能已经注意到,当我们输入 n 子命令创建一个新分区时,惟一的选择是 “l”(表示逻辑分区)和 “p”(表示主分区)。您只能看到剩余的可能分区类型的选项。如果驱动器还没有扩展分区,您将看到选项 “e”(表示扩展分区)。还要注意,我们的扩展分区(/dev/sda3)为类型 5。

现在我们来定义 40GB Linux 分区和 2000MB FAT32 分区。这次我们只需指定大小 +40G 和 +2000M,分别表示 40GB 和 2000MB。使用 fdisk 为我们计算柱面数,结果如 清单 7 所示。

清单 7. 创建数据分区
Command (m for help): n
First cylinder (53906-116679, default 53906): 
Using default value 53906
Last cylinder, +cylinders or +size{K,M,G} (53906-116679, default 116679): +40G

Command (m for help): n
First cylinder (59129-116679, default 59129): 
Using default value 59129
Last cylinder, +cylinders or +size{K,M,G} (59129-116679, default 116679): +2000M

Command (m for help): p

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000de20f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9111    73184076    7  HPFS/NTFS
/dev/sda2            9634        9730      779152+  83  Linux
/dev/sda3            9731      116679   859067842+   5  Extended
/dev/sda4            9112        9633     4192965   83  Linux
/dev/sda5            9731       20917    89859546   83  Linux
/dev/sda6           20918       39644   150424596   83  Linux
/dev/sda7           39645       53905   114551451   83  Linux
/dev/sda8           53906       59128    41953716   83  Linux
/dev/sda9           59129       59384     2056288+  83  Linux

Partition table entries are not in disk order

Command (m for help):

更改分区类型

在离开 fdisk 之前,我们将更改 swap 和 vfat 分区的分区类型。为此,我们使用 t 子命令来设置分区类型。我们将 /dev/sda4 设置为类型 82(Linux 交换分区),将 /dev/sda9 设置为类型 9(FAT32)。如果您想查看受支持类型的完整列表,请输入 L,如 清单 8 所示。

清单 8. 更改分区类型
Command (m for help): t
Partition number (1-9): 4
Hex code (type L to list codes): 82
Changed system type of partition 4 to 82 (Linux swap / Solaris)

Command (m for help): t
Partition number (1-9): 9
Hex code (type L to list codes): b
Changed system type of partition 9 to b (W95 FAT32)

Command (m for help):

保存分区表

到目前为止,我们只是对分区表进行了内存编辑。我们可以用 q 命令退出,不保存更改。如果某些分区不能满足您的要求,您可以使用 d 命令来删除一个或多个分区,以便重新定义它们。如果您对设置满意,则可以使用 v 命令来验证您的设置,然后使用 w 命令来写入新的分区表并退出。参见 清单 9。如果您再次运行 fdisk -l 命令,您将看到,Linux 现在已能够识别新分区。与其他操作系统不同的是,Linux 并不总是需要重新启动才能看到更改。举例来说,如果 /dev/hda3 变成 /dev/hda2,则需要重新启动,因为原来的 /dev/hda2 已被删除。如果需要重新启动,fdisk 应该会告诉您。

清单 9. 保存分区表
Command (m for help): v
999521580 unallocated 512-byte sectors

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
root@Microknoppix:~# fdisk -l /dev/sda

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000de20f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9111    73184076    7  HPFS/NTFS
/dev/sda2            9634        9730      779152+  83  Linux
/dev/sda3            9731      116679   859067842+   5  Extended
/dev/sda4            9112        9633     4192965   82  Linux swap / Solaris
/dev/sda5            9731       20917    89859546   83  Linux
/dev/sda6           20918       39644   150424596   83  Linux
/dev/sda7           39645       53905   114551451   83  Linux
/dev/sda8           53906       59128    41953716   83  Linux
/dev/sda9           59129       59384     2056288+   b  W95 FAT32

Partition table entries are not in disk order

高级 fdisk

您可能已注意到,我们没有更改任意分区上的 bootable 标记。现在,我们的磁盘还有 Windows Master Boot Record (MBR),因此将启动标记为 bootable 的第一个主分区(示例中为 NTFS 分区)。

LILO 和 GRUB 都不使用 bootable 标记。如果其中一个安装在 MBR 中,那么它就能够引导 Windows/XP 分区。您也可以将 LILO 或 GRUB 安装到您的 /boot 分区(/dev/hda2)中,将该分区标记为 bootable 并移除 /dev/hda1 的 bootable 标记。如果机器今后将恢复为 Windows 专用机器,那么保留原始 MBR 可能会有用。

如果需要,您还可以使用 fdisk 来修复分区表中的分区顺序。这通常将会更改分区编号,因此您可能需要完成其他工作才能将您的系统恢复为工作系统。要进行这个更改,使用 f 子命令切换到专家模式,然后使用 f 子命令修复分区顺序,如 清单 10 所示。如果您只是想看看新的分区顺序而不实际更改,可以使用 q 子命令退出(本例的做法),而不是将更新后的分区表写到磁盘中。

清单 10. 修复分区表顺序
Command (m for help): p

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000de20f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9111    73184076    7  HPFS/NTFS
/dev/sda2            9634        9730      779152+  83  Linux
/dev/sda3            9731      116679   859067842+   5  Extended
/dev/sda4            9112        9633     4192965   82  Linux swap / Solaris
/dev/sda5            9731       20917    89859546   83  Linux
/dev/sda6           20918       39644   150424596   83  Linux
/dev/sda7           39645       53905   114551451   83  Linux
/dev/sda8           53906       59128    41953716   83  Linux
/dev/sda9           59129       59384     2056288+   b  W95 FAT32

Partition table entries are not in disk order

Command (m for help): x

Expert command (m for help): f
Done.

Expert command (m for help): r

Command (m for help): p

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000de20f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        9111    73184076    7  HPFS/NTFS
/dev/sda2            9112        9633     4192965   82  Linux swap / Solaris
/dev/sda3            9634        9730      779152+  83  Linux
/dev/sda4            9731      116679   859067842+   5  Extended
/dev/sda5            9731       20917    89859546   83  Linux
/dev/sda6           20918       39644   150424596   83  Linux
/dev/sda7           39645       53905   114551451   83  Linux
/dev/sda8           53906       59128    41953716   83  Linux
/dev/sda9           59129       59384     2056288+   b  W95 FAT32

Command (m for help): q

您现在已经了解了向 Linux 工作站添加分区的一种方法。文章 “学习 Linux,101:查找并放置文件系统” 介绍了其他可能的方法。

文件系统类型

Linux 支持几种不同的文件系统。每个文件系统都有自己的优缺点和性能特征。文件系统的一个重要属性是日志,它允许系统在崩溃后更快地恢复。通常,日志文件系统比非日志文件系统更好。您可能还需要考虑,您选择的文件系统是否支持 Security Enhanced Linux(或 SELinux)。以下是备考 LPI 考试需要了解的文件系统类型的一个简单摘要。参考 参考资料 了解其他背景信息。

ext2 文件系统

ext2 文件系统(也称为第二扩展文件系统)旨在克服早期 Linux 版本中使用的 Minix 文件系统的缺点。多年来,该文件系统一直广泛应用于 Linux。但 ext2 中没有日志,现在基本上已被 ext3 和最新的 ext4 所取代。

ext3 文件系统

ext3 文件系统向标准 ext2 文件系统添加了日志功能,因此是一个非常稳定的文件系统的一个演化发展。它在大多数情况下提供合理的性能并且仍旧在改进。由于它在可靠的 ext2 文件系统上添加了日志功能,因此可以将现有 ext2 文件系统转换为 ext3 文件系统,并且在必要时还可以转换回来。

ext4 文件系统是作为 ext3 的扩展来启动的,它通过增加存储限制和提高性能来满足更大文件系统的需求。为了保留 ext3 的稳定性,在2006 年 6 月,该扩展被拆分成一个新的文件系统,即 ext4。ext4 文件系统在 2008 年 12 月正式发布,包含在 2.6.28 内核中。不同于 ext3 的一些更改包括:

  • 文件系统可以设置为高达 1EB,文件多达 16TB。
  • 使用 extent 替代块映射,以此作为一种提高性能的方法。
  • 使用日志校验和 (Journal checksum) 来提高可靠性。
  • 更快的文件系统检查,因为检查过程中可以忽略未分配的块。
  • 使用延时分配和多区块分配器来提高性能和减少文件碎片。
  • 提供更细粒度的时间戳更改,一个新的创建日期(最终需要更新到其他许多库和实用工具,使其得到充分利用)。进一步的时间戳更改可以解决将时间戳存储为有符号的 32 位整数而引起的 2038 年问题。

ReiserFS 文件系统

ReiserFS 是一个基于 B 状树的文件系统,拥有非常好的总体性能,特别是对于大量小文件。ReiserFS 拥有良好的伸缩性并具有日志功能。但该文件系统不再受到积极开发,不支持 SELinux,基本上已被 Reiser4 取代。

XFS 文件系统

XFS 文件系统拥有日志功能,包含一些健壮的特性,并针对可伸缩性进行了优化。XFS 在 RAM 中强制缓存中转数据,因此如果使用 XFS,建议采用不间断电源供应。

交换文件系统

交换空间在使用之前必须相应格式化,但它通常不被视为文件系统。

vfat 文件系统

vfat 文件系统(也称为 FAT32)没有日志功能,且缺乏完整的 Linux 文件系统实现所需的许多特性。它可用于在 Windows 和 Linux 系统之间交换数据,因为 Windows 和 Linux 都能读取它。不要将这个文件系统用于 Linux,除非要在 Windows 和 Linux 之间共享数据。如果您在一个 vfat 磁盘上解压缩一个 Linux 归档文件,那么您将丢失权限(比如执行权限),还会丢失该归档文件中可能存储的符号链接。

ext3 文件系统是一个成熟的文件系统,用作几个发行版上的默认文件系统。在几个发行版上,ext4 文件系正逐渐使用默认文件系统替代它,这些发行版包括 Red Hat 企业版 Linux 6、Fedora 17 和 Ubuntu 12.10。ReiserFS 文件系统多年来一直用作一些发行版(包括 SUSE)的默认文件系统,但现在已经较少使用。

创建文件系统

Linux 使用 mkfs 命令来创建文件系统,使用 mkswap 命令创建交换空间。mkfs 命令实际上是几个特定文件系统的命令的前端,比如面向 ext3 的 mkfs.ext3,面向 ext4 的 mkfs.ext4 以及面向 ReiserFS 的 mkfs.reiserfs

您的文件系统上安装的是什么文件系统支持?使用 ls /sbin/mk* 命令寻找答案。清单 11 展示了一个示例。

清单 11. 文件系统创建命令
[ian@echidna ~]$ ls /sbin/mk*
/sbin/mkdosfs      /sbin/mkfs.ext2     /sbin/mkfs.ntfs
/sbin/mke2fs       /sbin/mkfs.ext3     /sbin/mkfs.vfat
/sbin/mkfs         /sbin/mkfs.ext4     /sbin/mkfs.xfs
/sbin/mkfs.btrfs   /sbin/mkfs.ext4dev  /sbin/mkhomedir_helper
/sbin/mkfs.cramfs  /sbin/mkfs.msdos    /sbin/mkswap

您会注意到一些命令的各种形式。例如,您通常会发现,文件 mke2fs、mkfs.ext2 和 mkfs.ext3 是一样的,文件 mkreiserfs 和 mkfs.reiserfs 也一样。启动系统可能需要的文件系统将使用硬链接来提供同一文件的不同名称。Linux 中不能用于 / 文件系统的那些文件系统(比如 vfat 或 msdos)可能会使用符号链接代替。文章 “学习 Linux,101:创建和更改硬链接和符号链接” 会帮助您了解这些不同类型的链接。

所有 mkfs 命令都有几个公共选项。根据在 -type 选项中指定的文件系统类型,特定于正在创建的文件系统类型的选项将被传递到适当的创建命令。我们的示例使用 mkfs -type,但您也可以直接使用其他类型,效果一样。例如,您可以使用 mkfs -type ext2mk2fsmkfs.ext2。要获取一个特定文件系统的手册页,使用适当的 mkfs 命令作为名称,比如 man mkfs.ext3。下面的输出示例中显示的许多值都能通过 mkfs 的选项控制。

既然已经创建了所有分区,我们将重新启动 Fedora 12 系统(而不是有点缓慢的实时 Knoppix DVD)并格式化文件系统。当然,如果愿意,您也可以继续使用 Knoppix 系统。请注意,创建文件系统需要 root 权限。

创建一个 ext3 文件系统

我们使用 mkfs 命令将 /dev/sda8 分区格式化为 ext3,如 清单 12 所示。

清单 12. 创建一个 ext3 文件系统
[root@echidna ~]# mkfs -t ext3 /dev/sda8
mke2fs 1.41.9 (22-Aug-2009)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2624496 inodes, 10488429 blocks
524421 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
321 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

请注意,一个日志与 ext3 是一同创建的。如果您想向某个现有 ext2 系统添加一个日志,那么可以使用带有 -j 选项的 tune2fs 命令。

对于 ext2、ext3 和 ext4 系统,一个有用的选项是带有一个名称的 -L 选项,该选项为分区指定了一个标签。这个标签可用于在挂载文件系统时代替设备名称;它针对可能需要在各种控制文件中反映的更改提供某种级别的隔离。要为现有 ext2、ext3 或 ext4 文件系统显示或设置标签,请使用 e2label 命令。标签的最大大小限制为 16 个字符。

最近的一个改进是使用 Universally Unique IdentifierUUID,而不是标签。UUID 是一个 128 位标识符,通常显示为 32 位 16 进制数字和 4 个连词号。大多数 Linux 文件系统在被格式化时自动生成一个 UUID。使用 blkid 命令(不需要 root 权限)来查看我们刚刚格式化的分区的 UUID,如 清单 13 所示。与标签相比,UUID 更可能具备惟一性,对 USB 驱动器这样的热插拔设备尤其有用。

清单 13. 使用 blkid 命令显示一个 UUID
[ian@echidna ~]$ blkid /dev/sda8
/dev/sda8: UUID="87040def-920e-4525-9c81-c585ddc46384" SEC_TYPE="ext2" TYPE="ext3"

创建一个 ext4 文件系统

暂时走出传统 MBR 布局,使用 GUID Partition Table (GPT) 格式化一个 USB 闪存驱动器,了解其工作原理。然后在该驱动器上使用 gdisk 命令创建一个 Linux 分区。最后,在新创建的分区上使用 mkfs 命令创建一个 ext4 文件系统。

使用 gdisk 查看典型 USB 闪存驱动器(又称之为 USB 拇指驱动器或 USB 密钥)。它们通常是 FAT32 文件系统附带的,可延伸至整个驱动器,而且通常无法分区。清单 14 显示了 gdisk 如何展示一个未包含在 GPT 布局中的驱动器的信息。

清单 14. 使用 gdisk 显示非 GPT 磁盘信息
[root@attic4 ~]# gdisk -l /dev/sdc
GPT fdisk (gdisk) version 0.8.4

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format.
***************************************************************

Warning! Main partition table overlaps the first partition by 2 blocks!
Try reducing the partition table size by 8 entries.
(Use the 's' item on the experts' menu.)

Warning! Secondary partition table overlaps the last partition by
33 blocks!
You will need to delete this partition or resize it in another utility.
Disk /dev/sdc: 62530624 sectors, 29.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D7900F13-839B-49B2-9C43-4367528DC381
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 62530590
Partitions will be aligned on 32-sector boundaries
Total free space is 0 sectors (0 bytes)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              32        62530623   29.8 GiB    0700  Microsoft basic data

首先要注意,必须以 root 用户的身份运行 gdisk,或者使用 sudo,具体取决于您系统的设置。其次要注意,gdisk 想要将现有格式转换成 GPT,并向您发出警告。因为您使用了 -l 选项仅列出这些分区,没有执行任何活动。

现在,以交互模式运行 gdisk。列出可用的命令,然后,在创建一个新的空 GUID 分区表之前列出已知的分区类型,最后列出 Linux 分区。您可以显示新的信息,然后停止运行 gdisk清单 15 展示了交互过程。

清单 15. 使用 gdisk 创建一个 GUID Partition Table (GPT) 和一个分区
[root@attic4 ~]# gdisk /dev/sdc
GPT fdisk (gdisk) version 0.8.4

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format.
THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing 'q' if
you don't want to convert your MBR partitions to GPT format!
***************************************************************

Warning! Main partition table overlaps the first partition by 2 blocks!
Try reducing the partition table size by 8 entries.
(Use the 's' item on the experts' menu.)

Warning! Secondary partition table overlaps the last partition by
33 blocks!
You will need to delete this partition or resize it in another utility.

Command (? for help): ?
b	back up GPT data to a file
c	change a partition's name
d	delete a partition
i	show detailed information on a partition
l	list known partition types
n	add a new partition
o	create a new empty GUID partition table (GPT)
p	print the partition table
q	quit without saving changes
r	recovery and transformation options (experts only)
s	sort partitions
t	change a partition's type code
v	verify disk
w	write table to disk and exit
x	extra functionality (experts only)
?	print this menu

Command (? for help): l
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE          
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS            
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved   
8200 Linux swap            8300 Linux filesystem      8301 Linux reserved      
8e00 Linux LVM             a500 FreeBSD disklabel     a501 FreeBSD boot        
a502 FreeBSD swap          a503 FreeBSD UFS           a504 FreeBSD ZFS         
a505 FreeBSD Vinum/RAID    a800 Apple UFS             a901 NetBSD swap         
a902 NetBSD FFS            a903 NetBSD LFS            a904 NetBSD concatenated 
a905 NetBSD encrypted      a906 NetBSD RAID           ab00 Apple boot          
af00 Apple HFS/HFS+        af01 Apple RAID            af02 Apple RAID offline  
af03 Apple label           af04 AppleTV recovery      af05 Apple Core Storage  
be00 Solaris boot          bf00 Solaris root          bf01 Solaris /usr & Mac Z
bf02 Solaris swap          bf03 Solaris backup        bf04 Solaris /var        
bf05 Solaris /home         bf06 Solaris alternate se  bf07 Solaris Reserved 1  
bf08 Solaris Reserved 2    bf09 Solaris Reserved 3    bf0a Solaris Reserved 4  
bf0b Solaris Reserved 5    c001 HP-UX data            c002 HP-UX service       
ef00 EFI System            ef01 MBR partition scheme  ef02 BIOS boot partition 
fd00 Linux RAID            

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-62530590, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-62530590, default = 62530590) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sdc: 62530624 sectors, 29.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): B321C1C5-795A-4836-9E16-D7D45DD8F3F2
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 62530590
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048        62530590   29.8 GiB    8300  Linux filesystem

Command (? for help): q

最后一项任务是在您的新分区 /dev/sdc1 上创建一个 ext4 文件系统。使用 mkfs-L 选项为分区贴上标签,然后使用 blkid 命令显示 GUID,和您在上面对 ext3 进行的操作一样。清单 16 说明了这一过程。

清单 16. 创建一个 ext4 分区
[root@attic4 ~]# mkfs -t ext4 -L IAN-USB32 /dev/sdc1
mke2fs 1.42.3 (14-May-2012)
Filesystem label=IAN-USB32
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1957888 inodes, 7816324 blocks
390816 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
239 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   

[root@attic4 ~]# blkid /dev/sdc1
/dev/sdc1: UUID="b3a3c2bc-ea8d-40c6-967e-927006f55416" TYPE="ext4" LABEL="IAN-USB32"

要查看您在创建 ext4 分区时可以指定的所有参数,请参阅 mkfs.ext4 手册页。

创建一个 XFS 文件系统

现在我们将刚才格式化为 ext3 的分区重新格式化为 XFS 文件系统。我们的 Fedora 12 系统使用了 SELinux(安全增强 Linux),因此我们应该使用 -i 参数指定比默认值 256 更大的索引节点。推荐值是 512。请注意,如果 XFS 格式化程序发现分区上已有一个文件系统,那么它将会通知您。还要注意的一点是,XFS 格式重新指定了 UUID。

清单 17. 创建一个 XFS 文件系统
[root@echidna ~]# mkfs -t xfs -i size=512 /dev/sda8
mkfs.xfs: /dev/sda8 appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.
[root@echidna ~]# mkfs -t xfs -f -i size=512 /dev/sda8
meta-data=/dev/sda8              isize=512    agcount=4, agsize=2622108 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=10488429, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=5121, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@echidna ~]# blkid /dev/sda8
/dev/sda8: UUID="1b6798f2-f07f-4d5e-af06-2470df37ddb3" TYPE="xfs"

可以使用带有一个名称的 -L 选项来设置 XFS 系统的标签。还可以使用 xfs_admin 命令和 -L 选项来为现有 XFS 文件系统添加标签。使用带 -l 选项的 xfs_admin 命令来显示标签。与 ext2、ext3 和 ReiserFS 不同的是,XFS 标签的最大长度为 12 个字符。

创建一个 ReiserFS 文件系统

可以使用带 -t reiserfs 选项的 mkfs 命令或 mkreiserfs 命令创建 ReiserFS 文件系统。ReiserFS 不支持 SELinux,正被 Resier4 取代。

可以使用 -l 选项(或带有一个名称的 --label 选项)为一个 ReiserFS 系统设置标签。可以使用 reiserfstune 命令添加标签或显示现有 ReiserFS 文件系统上的标签。标签的最大长度限制为 16 个字符。

您可能需要在您的系统上安装 ReiserFS 包,然后才能使用 ReiserFS,因为它可能不包含在默认安装内。参见手册页或信息页,了解有关的更多细节。

创建一个 vfat 文件系统

现在,我们将在 /dev/sda9 上创建 FAT32 (vfat) 文件系统。

清单 18. 创建一个 vfat 文件系统
[root@echidna ~]# mkfs -t vfat /dev/sda9
mkfs.vfat 3.0.9 (31 Jan 2010)
[root@echidna ~]# blkid /dev/sda9
/dev/sda9: LABEL="" UUID="CF72-99A8" TYPE="vfat"

vfat 文件系统的 UUIDs 比标准 UUIDs 短,因此不惟一的几率要大一些。如果想用一个标签代替,可以使用 dosfslabel 命令。DOS 分区的标签的最大长度限制为 11 个字符。

创建交换空间

现在我们使用 mkswap 命令在 /dev/sda4 分区上创建一些交换空间,如 清单 19 所示。

清单 19. 创建交换空间
[root@echidna ~]# mkswap /dev/sda4
Setting up swapspace version 1, size = 4192960 KiB
no label, UUID=8f5a3a05-73ef-4c78-bc56-0e9b1bcc7fdb

请注意,mkswap 的最近几个版本都显示了生成的 UUID。

与常规文件系统不同,交换分区不能挂载。相反,它们使用 swapon 命令启用。您的 Linux 系统的启动脚本将负责自动启用您的交换分区。

其他工具和文件系统

以下工具和文件系统不是这个考试的 LPI 目标的内容。这个非常简略的概述仅触及您可能会遇到的一些工具和文件系统的皮毛。

分区工具

许多 Linux 发行版都包含 cfdisksfdisk 命令。cfdisk 命令提供了一个比 fdisk 更图形化的界面,并使用了 ncurses 库函数,如 图 1 所示。sfdisk 命令面向程序员,可被脚本化。如果您对该命令了如指掌,尽管使用它。

图 1. 使用 cfdisk
屏幕截图显示用于处理分区的 cfdisk 工具图形化界面
屏幕截图显示用于处理分区的 cfdisk 工具图形化界面

用于处理分区表的另一个流行工具是 parted,该命令能够对许多类型的分区执行大小重置、格式化、创建分区以及销毁分区等操作。尽管 parted 不能重置 NTFS 分区大小,但 ntfsresize 却可以。qtparted 工具使用 Qt 工具包来提供一个图形界面。它包含 parted 功能和 ntfsresize 功能。

gparted 是另一个图形分区工具,主要用于 GNOME 桌面。它使用 GTK+GUI 库,如 图 2 所示。(参见 参考资料,获取 qtpartedgparted 的链接)。

要使用上述工具,可能需要安装相应的程序包,因为它们可能不包含在默认安装中。

图 2. 使用 gparted
屏幕截图显示用于处理分区的 gparted 工具的图形化界面
屏幕截图显示用于处理分区的 gparted 工具的图形化界面

在前面您已经了解了 gdisk 命令,它的操作方式与 fdisk 非常类似。对于 GPT 磁盘,应该使用 gdisk 命令,而对于其他传统 MBR 布局,应该使用 fdisk 命令。partedgparted 都可以处理 GPT 布局和 MBR 布局,因此,您可能会发现使用其中一个工具处理这两个类型的布局都非常方便。

许多发行版都允许在安装过程中对磁盘进行分区,有时还允许缩小现有的 Windows NTFS 或 FAT32 分区。请参阅您版本的安装文档。

逻辑卷管理程序

Linux 的逻辑卷管理程序(或 LVM)允许将多个物理存储设备合并为单个卷组。例如,您可能会将一个分区添加到一个现有卷组,而不是必须开辟出足够您想要的文件系统使用的连续空间。文章 “学习 Linux 101:硬盘布局” 包含更多信息和使用 LVM 创建文件系统的示例。

RAID

RAID (Redundant Array of Independent Disks) 技术使用比高端系统上的磁盘便宜得多的廉价磁盘来提供一个可靠的数据存储。RAID 有几种类型,可以在硬件或软件中实现。

更多文件系统

除了上面介绍的文件系统之外,您可能还会遇到其他文件系统。

IBM 的 Journaled File System (JFS),目前用于 IBM 企业服务器,专为高吞吐量服务器环境而设计。它可用于 Linux,包含在几个发行版中。要创建 JFS 文件系统,使用 mkfs.jfs 命令。

btrfs(B-Tree 文件系统)最初由 Oracle 开发,在 GPL 许可下可用。它是一个用于 Linux 的新型写入时拷贝(copy-on-write)文件系统,旨在关注容错性、修复和轻松管理的同时实现高级特性。这个文件系统可能不会默认安装,因此您可能需要安装一个程序包(比如 btrfs-progs)来启用 btrfs 支持。

还有其他文件系统,比如通常在嵌入式设备上使用的 cramfs 文件系统。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux, Open source
ArticleID=502332
ArticleTitle=学习 Linux,101: 创建分区和文件系统
publish-date=01212013