Fdisk 和分区
硬盘可以划分为一个或者多个称为分区的逻辑磁盘。
这种划分在磁盘扇区 0 中的分区表中进行了描述。
在 BSD 世界中,人们谈论“磁盘片”和“磁盘标签”。
Linux 至少需要一个分区,即它的根文件系统。
它可以使用交换文件和/或者交换分区,但后者效率更高。
因此,通常人们会想要一个专用于交换分区的第二个 Linux 分区。
在 Intel 兼容硬件上,引导系统的 BIOS 通常只能访问磁盘的前 1024 个柱面。
出于这个原因,大磁盘的人通常会创建第三个分区,只有几 MB 大,通常挂载在 /boot 上,用于存储内核镜像和引导时所需的一些辅助文件,以确保这些东西是BIOS 可访问。
可能出于安全、易于管理和备份或者测试的原因,使用超过最小分区数。
BSD/SUN 型磁盘标签
一个 BSD/SUN 类型的磁盘标签可以描述 8 个分区,其中第三个应该是“整个磁盘”分区。
不要在柱面 0 处启动实际使用其第一个扇区(如交换分区)的分区,因为这会破坏磁盘标签。
Fdisk 的工作原理
fdisk(在第一种调用形式中)是一个菜单驱动的程序,用于创建和操作分区表。
它理解 DOS 类型的分区表和 BSD 或者 SUN 类型的磁盘标签。
该设备通常是以下之一:
- /dev/hda /dev/hdb /dev/sda /dev/sdb
- (/dev/hd[a-h] 用于 IDE 磁盘,/dev/sd[a-p] 用于 SCSI 磁盘,/dev/ed[a-d] 用于 ESDI 磁盘,/dev/xd[ab] 用于 XT 磁盘)。
(设备名称是指整个磁盘。 )
分区是设备名称后跟分区号。
例如,/dev/hda1 是系统中第一个 IDE 硬盘上的第一个分区。
磁盘最多可以有 15 个分区。
另请参阅/usr/src/linux/Documentation/devices.txt。
Fdisk 概要
以下是 fdisk 及其选项和功能的技术细分:
fdisk [-u] [-b 扇区大小] [-C cyls] [-H 磁头] [-S 扇区] 设备
fdisk -l [-u] [设备...]
fdisk -s 分区...
fdisk -v
RIX/SGI 型磁盘标签
一个 IRIX/SGI 类型的磁盘标签可以描述 16 个分区,其中第十一个应该是一个完整的“卷”分区,而第九个应该被标记为“卷头”。
卷头还将覆盖分区表,即它从零块开始,默认情况下扩展到五个柱面。
卷头中的剩余空间可以由头目录条目使用。
任何分区都不能与卷标头重叠。
也不要更改其类型并在其上创建一些文件系统,因为我们将丢失分区表。
仅当在 IRIX/SGI 机器上使用 Linux 或者在 Linux 下使用 IRIX/SGI 磁盘时才使用这种类型的标签。
从 Linux 命令行创建和管理硬盘分区
fdisk 是一个命令行分区编辑器,允许我们从命令行创建、编辑和管理计算机硬盘驱动器上的分区。
还有其他类似的工具,例如 cfdisk 和 parted,但 fdisk 是最通用的,也可能是最简单的。
DOS 类型分区表
DOS 类型的分区表可以描述无限数量的分区。
在扇区 0 中有空间用于描述 4 个分区(称为“主要”)。
其中之一可能是扩展分区;这是一个包含逻辑分区的框,在扇区链表中找到描述符,每个扇区位于相应的逻辑分区之前。
四个主分区(存在与否)的编号为 1-4.
逻辑分区从 5 开始编号。
在 DOS 类型的分区表中,每个分区的起始偏移量和大小以两种方式存储:作为扇区的绝对数量(以 32 位给出)和作为圆柱/磁头/扇区三元组(以 10+8+6 给出)位)。
前者没问题;使用 512 字节扇区,这将工作到 2 TB。
后者有两个不同的问题。
首先,这些C/H/S字段只有在磁头数和每磁道扇区数已知的情况下才能填充。
其次,即使我们知道这些数字应该是多少,可用的 24 位也不够。
DOS 只使用 C/H/S,Windows 两者都使用,Linux 从不使用 C/H/S。
使用 fdisk 对驱动器进行分区
本教程将引导我们了解使用 fdisk 对硬盘进行分区的基础知识。
这是一个简单但功能强大的工具,提供了许多管理驱动器的选项。
对硬盘驱动器进行分区将清除其上的所有数据。
请务必备份数据或者使用空白驱动器。
- 首先找出硬盘驱动器的位置。
你可以试试:
ls /dev
然后,尝试找出它是哪个驱动器。主驱动器可能是 /dev/sda,但我们需要确保。
我们还可以查看 /etc/fstab 以查看哪些驱动器安装在何处。如果它为我们提供 UUID 编号,我们可以搜索每个分区的 UUID,并查看哪些匹配。
sudo blkid /dev/sda1
- 接下来,使用 -l 标志列出驱动器上的当前分区表。用实际驱动器替换“/dev/sda”。
sudo fdisk -l /dev/sda
如果我们使用的是空白驱动器,则应该不会有太多内容。
- 再次运行 fdisk 命令。这一次,没有任何标志。这将带我们进入 fdisk 控制台。
sudo fdisk /dev/sda
- 进入 fdisk 控制台后,我们就可以开始处理分区了。首先,如果你想像以前一样列出分区,你可以输入 p 键。
p
- 然后,使用 n 键创建一个新分区。
n
- 然后提示将询问我们是要创建主分区还是扩展分区。
选择 p(主要)。
p
- 选择一个分区号。对于第一个分区,默认值为 1 ,因此请使用它。
1
- 然后,它会要求我们选择第一个扇区。不要太担心这个。只需按 Enter 即可获得默认值。
- 下一个提示将让我们选择分区的大小。我们可以以兆字节 (M) 或者千兆字节 (G) 为单位指定分区大小。假设我们正在设置一个驱动器来安装 Linux,512M 是启动分区的好地方。
+512M
- 完成后,我们可以使用 p 键再次查看新分区。
- 如果我们打算将新分区用作引导分区,则需要打开可引导标志。通过按 a 来做到这一点。然后,如果询问,请输入分区号。如果这是我们驱动器上唯一的一个,则为 1 。
a 1
- 现在,我们可以在驱动器上创建其他分区。再次输入 n 开始。
- 对主分区再次按 1.
- 使用默认分区号。如果你刚开始,它是 2 。
- 也使用默认的第一个扇区。它将在前一个分区之后立即开始。按 Enter 继续。
- 再次选择驱动器的大小。如果我们希望使用单独的主分区设置根分区,则 +20G 之类的东西会很好用。如果我们想占用剩余的可用空间,只需按 Enter 即可。
+20G
- 对要在驱动器上创建的每个新分区重复这些步骤。完成后,按 w 将分区表写入驱动器。
w
- 现在,我们可以使用 mkfs 命令来格式化分区以供使用。对于大多数 Linux 系统,EXT4 文件系统就是我们想要的,因此我们可以运行以下一组命令来设置分区。这假设我们正在 /dev/sda 上工作并且我们设置了单独的主分区和根分区。
sudo mkfs.ext4 /dev/sda1 sudo mkfs.ext4 /dev/sda2 sudo mkfs.ext4 /dev/sda3
- 我们新分区和格式化的驱动器可以使用了。如果你一直在关注,你可以在你刚刚创建的分区上安装和运行一个 Linux 发行版,比如 Arch Linux。
Dos 6.x 警告
DOS 6.x FORMAT 命令在分区的数据区的第一个扇区中查找某些信息,并将此信息视为比分区表中的信息更可靠。
DOS FORMAT 期望 DOS FDISK 在发生大小更改时清除分区数据区域的前 512 个字节。
即使给出了 /U 标志,DOS FORMAT 也会查看这些另外信息——我们认为这是 DOS FORMAT 和 DOS FDISK 中的一个错误。
最重要的是,如果我们使用 cfdisk 或者 fdisk 来更改 DOS 分区表条目的大小,那么在使用 DOS FORMAT 格式化分区之前,我们还必须使用 dd 将该分区的前 512 个字节归零。
例如,如果我们使用 cfdisk 为 /dev/hda1 创建 DOS 分区表条目,那么(在退出 fdisk 或者 cfdisk 并重新启动 Linux 以使分区表信息有效之后)我们将使用命令“dd if=/ dev/zero of=/dev/hda1 bs=512 count=1" 将分区的前 512 个字节归零。
如果我们使用 dd 命令,请格外小心,因为一个小的拼写错误可能会使我们磁盘上的所有数据都无用。
为了获得最佳结果,我们应该始终使用特定于操作系统的分区表程序。
例如,我们应该使用 DOS FDISK 程序制作 DOS 分区,使用 Linux fdisk 或者 Linux cfdisk 程序制作 Linux 分区。
一致性检查
每当打印出分区表时,都会对分区表条目执行一致性检查。
此检查验证物理和逻辑起点和终点是否相同,以及分区是否在柱面边界上开始和结束(第一个分区除外)。
某些版本的 MS-DOS 创建的第一个分区不是从柱面边界开始,而是从第一个柱面的扇区 2 开始。
从柱面 1 开始的分区不能从柱面边界开始,但这不太可能造成困难,除非机器上有 OS/2.
更新分区表后,在退出之前执行 sync() 和 BLKRRPART ioctl()(从磁盘重新读取分区表)。
很久以前,使用 fdisk 后需要重新启动。
我不认为现在是这种情况了。
事实上,重启太快可能会导致尚未写入的数据丢失。
请注意,内核和磁盘硬件都可能会缓冲数据。
fdisk 选项
-b 扇区大小:指定磁盘的扇区大小。
有效值为 512、1024 或者 2048.
(最近的内核知道扇区大小。
仅在旧内核上使用它或者覆盖内核的想法。
)
-C cyls:指定磁盘的柱面数。
我们不知道为什么有人想要这样做。
-H 磁头:指定磁盘的磁头数。
(当然不是物理编号,而是用于分区表的编号。
)合理的值是 255 和 16.
-S sects:指定磁盘每个磁道的扇区数。
(当然不是物理编号,而是用于分区表的编号。
)合理的值是 63.
-l :列出指定设备的分区表,然后退出。
如果未提供设备,则使用 /proc/partitions(如果存在)中提到的设备。
-u :列出分区表时,以扇区而不是柱面为单位给出大小。
-s 分区:分区的大小(以块为单位)打印在标准输出上。
-v : 打印 fdisk 程序的版本号并退出。
磁盘几何
如果可能,fdisk 将自动获取磁盘几何结构。
这不一定是物理磁盘几何结构(实际上,现代磁盘实际上并没有像物理几何结构那样的东西,当然不是可以用简单的圆柱/磁头/扇区形式描述的东西),而是 MS-DOS 使用的磁盘几何结构对于分区表。
通常,默认情况下一切顺利,如果 Linux 是磁盘上唯一的系统,则没有问题。
但是,如果磁盘必须与其他操作系统共享,那么让另一个操作系统的 fdisk 至少创建一个分区通常是个好主意。
当 Linux 启动时,它会查看分区表并尝试推断出与其他系统良好协作所需的(假)几何。