磁盘

块设备简介

Gentoo Linux以及普通Linux中有关磁盘方面的知识,包括Linux文件系统,分区和块设备。

一旦磁盘和文件的来龙去脉都了解了,将设置分区和文件系统的安装Gentoo Linux。

首先,块设备。 最著名的块设备可能是代表Linux系统第一块磁盘的/dev/sdaSCSISATA磁盘全标为/dev/sd*; 甚至IDE磁盘在libata内核框架下也标为/dev/sd*。 当使用老设备框架时,第一个IDE磁盘是/dev/hda

上面的块设备代表的抽象接口的磁盘。

用户程序可以使用这些块设备来与磁盘进行交互,而无需担心驱动器到底是IDE,SCSI还是其他什么东西。

该程序可以把磁盘当作一系列连续的,可随机访问的512字节块的存储。

分区表

虽然理论上可以用一整块磁盘来安装一个Linux系统(比如当创建一个btrfs RAID时),但是实践中几乎从不这样做。

实际上,一块磁盘可以被分成小一些的、更容易管理的块设备。 在x86系统里,这被称为分区。

有两个标准的分区技术可以被使用:MBRGPT

MBR

主引导记录MBR (Master Boot Record)对分区的起始扇区和长度使用32比特的标识符,它支持三种分区类型:主分区扩展分区逻辑分区

  1. 主分区把它们的信息存储在主引导记录里一个非常小的空间里,通常是512字节,因为这个空间太小了,所以系统只支持四个主分区。 (例如从 /dev/sda1/dev/sda4

  2. 为了支持更多的分区,其中一个主分区可以被标识成扩展分区,然后这个分区就可以包含逻辑分区了(分区里的分区)。

重要

虽然大多数主板制造商仍然支持传统模式,但除非使用的是2010年之前的硬件,否则最好使用GUID分区表对磁盘进行分区。

必须使用MBR的读者应该确认以下信息: 1. 大多数2010年后的主板认为MBR是一种传统(支持但不理想)的启动模式。 2. 由于使用32位标识符,主引导记录分区表无法处理大小超过2TB的磁盘。 3. 除非创建扩展分区,否则MBR最多支持四个分区。 4. MBR体系不提供任何备份,因此如果应用程序或用户覆盖MBR,则所有分区信息都将丢失。

手册作者建议读者安装Gentoo时尽可能使用 GPT 。

GPT

GPT(GUID Partition Table)为分区使用64比特标识符,它用来存储分区信息的空间也远比MBR的512字节要大,GPT磁盘它也不对分区的数量作限制。

分区的大小限制可以达到8ZiB

译者注: 1ZiB = 1,024 EiB 1EiB = 1024 PiB 1PiB = 1024 TiB 1TiB = 1024 GiB 1GiB = 1024 MiB 1MiB = 1024 KiB 1KiB = 1024 B 1. 当操作系统和系统固件之间的软件接口是UEFI (相对于BIOS)时,GPT几乎是必选的,因为这里MBR会引起很多兼容性问题。

  1. GPT还利用校验和和冗余。 它携带CRC32校验和以检测报头和分区表中的错误,并在磁盘的末尾有一个备份GPT
  2. 此备份表可用于恢复磁盘开头附近主GPT的损坏。

GPT还是MBR

依据上面的描述,人们大概会认为使用GPT应该总是被推荐的方法,尽管还有一些注意事项。

在一台基于BIOS的计算机上使用GPT虽然是能够工作的,但是那样你就不能与微软的Windows操作系统进行双重引导了

原因是微软的Windows如果检测到一个GPT分区标签,它就会以UEFI模式进行引导。

一些存在bugBIOS或者配置成以BIOS/CSM/legacy模式进行引导的EFI也对从GPT标签的磁盘进行引导支持不好。

如果也碰到了这种情况,有一个可能的凑合办法:在被保护的MBR分区上加上boot/active标志,可以使用带有 -t dos选项的fdisk 命令强制它使用MBR格式读取分区表。

在这个例子中,我们用 fdisk 并敲击 a键来切换分区的(是否是活动的)标记。 敲击 1键来选择第一个分区,然后敲击w键来将所作改动写入磁盘,最后退出 fdisk这个程序。

user $fdisk -t dos /dev/sda
Welcome to fdisk (util-linux 2.24.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): a
Partition number (1-4): 1

Command (m for help): w

使用UEFI

当在一个使用了UEFI(替代BIOS)进行引导作业的系统上安装Gentoo时,很重要的一点是一个EFI的系统分区 (ESP)需要被创建。

分区工具parted的简介如下:

EFI系统分区也需要是一个FAT32分区(在Linux系统里也被称为vfat)。见UEFI specification

这一章节末尾的指导中以ext2分区格式为例作为了/boot/ 的文件系统。

请确保EFI分区使用vfat,就像这样:

root #mkfs.fat -F 32 /dev/sda2

如果引导分区(ESP)没有使用FAT32(vfat)文件系统,系统的UEFI固件很可能将无法找到引导或Linux内核来启动系统!


高级存储

Btrfs RAID

如上所述,btrfs具有跨多个设备创建文件系统的能力。

以这种方式生成的Btrfs文件系统可以采用以下模式:raid0,raid1,raid10,raid5和raid6。 RAID模式56已显着改进,但仍被认为不稳定。

  1. 创建多设备文件系统后,可以使用几个命令添加新设备并删除旧设备。
  2. Btrfs比其他文件系统有更多交互,对于初学者不那么友好。

ext4文件系统可以转换成btrfs文件系统,这对于那些想要安装Gentoo并使用一个稳定的,良好测试的文件系统,并增加他们关于新的文件系统的知识,如btrfs。 通过这个实验可能是有用的。

LVM

x86 安装CD提供对逻辑卷管理器(LVM)的支持。

LVM增加了分区设置提供的灵活性。

下面的安装说明将集中在常规分区,但是很好的知道LVM是支持的,如果该路由是所需的。

有关详细信息,请参阅LVM文章。 新手注意:完全支持LVM不在本指南的范围之内。

默认分区方案

一直到这份指南的末尾,下面的分区方案将被使用。

分区 文件系统 大小 描述
/dev/sda1 (bootloader) 2M BIOS boot partition
/dev/sda2 ext2 (or fat32 if UEFI is being used) 128M Boot/EFI system partition
/dev/sda3 (swap) 512M or higher Swap partition
/dev/sda4 ext4 Rest of the disk Root partition

如果这足够了,读者转到GPT分区,可以立即跳转到Default: Using parted to partition the disk。 那些仍然对MBR感兴趣和使用示例布局可以跳转到Alternative: Using fdisk to partition the disk.

fdiskparted 都是分区实用程序。

fdisk是众所周知的,稳定的,并且推荐用于MBR分区布局,而parted 是支持GPT分区的第一个Linux块设备管理实用程序之一。

喜欢fdisk的用户界面的用户可以使用 gdisk (GPT fdisk)作为parted的替代。

  1. 设计一个分区方案
  2. 多少个分区以及多大? 分区的数量是高度依赖于环境。

    1. 比如,如果有很多个用户,则建议有一个独立的/home/,以增强安全性及便于备份。
    2. 如果要安装的Gentoo是用来做邮件服务器,则/var/应该独立,因为所有的邮件都储存于/var/
    3. 游戏服务器应该有一个独立的/opt/,因为大多数游戏服务器都安装在那里。 原因也和/home/目录一样:安全和备份。 在大多数场景下,应该保持/usr/大一些:不仅是因为它包含多数的应用程序,它通常还托管Gentoo ebuild存储库(默认情况下位于/usr/portage),占用大约650 MB的空间。

      这个磁盘空间估计值不包括通常存储在这个ebuild存储库中的packages/distfiles/目录。

    选择一个正确的文件系统将会获得最大化的性能。

它非常依赖于管理员想用它来做什么。

独立分区或卷有以下的优势:

  1. 为每个分区或者卷选择性能最好的文件系统。
  2. 当一个失控的工具持续向一个分区或卷写文件时,也不至于让整个系统由于无可用空间而无法运行。
  3. 如果有必要,可以简化文件系统检查,多个检查可以并行的完成(其实在这一点上,有多个磁盘比多个分区更有优势)。
  4. 可以通过在挂载一些分区或卷时使用只读、nosuid(忽略setuid属性)、noexec(忽略可执行属性)等来增加安全性。

多个分区同样也有劣势

  1. 如果不能合理的配置,系统可能会在一个分区上有很多空闲空间,而其他分区却没有空间。
  2. 另外一个麻烦是独立的分区——尤其是像/usr//var/这样的重要挂载点——经常需要管理员在引导时通过一个initramfs来在其他引导脚本启动前挂载这些分区。

    在不同的情况下,结果也可能不同。

另外对于SCSISATA还有一个最多15分区的限制,除非使用GPT标签。

那么swap空间呢?

  1. 对于swap空间,没有一个完美值。 swap空间的目的是当内存(RAM)有压力时为内核提供磁盘存储。
  2. 一个swap空间允许内核将看过来稍后不会被访问的内存页面移动到磁盘(swap或者page-out)、施放内存。
  3. 当然,如果那块内存突然要使用到,需要花一些时间(相比较内存,硬盘是非常慢的)将这些页面需要放回到内存中(page-in)。

如果系统不运行很需要内存的应用程序或系统有足够多的可能内存,则不需要太多的swap空间。 不过,swap空间还用来在休眠时储存整个内存。 > 如果一个系统需要休眠,则必须需要大一点的swap空间,通常至少为系统安装的内存数量。

什么是BIOS引导分区?

BIOS引导分区是一个非常小的分区(1到2MB) 引导器软件如GRUB2可以将不适于存放在引导扇区(MBR中只有几百个字节)里并且不能存放在其它位置的额外数据存放于此。

这种分区并不总是需要的,但是考虑到低地址空间消耗以及记录大量不同的分区的难度,我们建议最好还是创建一个。

为完整起见,在PC/BIOS模式下将GRT分区方案与GRUB2一起使用时,需要BIOS启动分区。

在EFI/UEFI模式下引导时不需要它。

默认:使用parted对磁盘进行分区

在这一章里,之前提到的分区方案范例将被使用:

Partition Description
/dev/sda1
/dev/sda2 Boot partition
/dev/sda3 Swap partition
/dev/sda4 Root partition

可以根据实际需要调整分区方案。

使用parted查看当前分区布局

这个parted应用为磁盘分区提供了一个简单的接口,而且它支持很大的分区空间(超过2TB)。

用 parted 来搞磁盘吧(在我们的例子中,它是/dev/sda)。

我们建议让parted 来优化分区对齐:

root #parted -a optimal /dev/sda
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
  1. 对齐意思就是分区在磁盘上开始于一个众所周知的边界,从而确保操作系统层面(从磁盘获取页面)使用最少的磁盘内部开销。
  2. 没有对齐的分区可能需要磁盘去抓取两个页面而不是一个,即使操作系统只请求了一个页面。

要了解parted支持的所有选项,敲 help 然后回车。

设置GPT标签

大部分x86amd64架构的磁盘是以msdos标签被准备出来的。 如果使用 parted,在磁盘上设置一个GPT标签的命令为mklabel gpt:

改变分区类型将会移除磁盘上的所有分区,磁盘上的所有数据也将丢失。 (parted)mklabel gpt

为了让磁盘使用MBR分区布局,使用 mklabel msdos命令。

使用parted移除全部分区

如果这一步(之前用过 mklabel 操作或磁盘本来就是崭新的),首先请移除磁盘上所有已经存在的分区。 输入print命令可以查看当前的分区信息,rm 中N是需要移除的分区号码。

(parted)rm 2

对其它不需要的分区采取同样的操作。但是在这里请确保不要犯任何错误,因为parted是立即执行改变的,这一点不像fdisk是分步操作,允许用户在保存或者退出fdisk时可以"undo"。

创建分区

用parted 命令和下列设置创建分区

要使用的分区类型。 通常是“Primary”。 1. 如果您用的是msdos分区标签,请注意最多只有4个主(Primary)分区能够被使用。 2. 如果您需要使用多于4个分区,请使用其中的一个主分区将其转换为扩展分区以便在其中创建足够使用的逻辑分区。 分区的开始位置(可以被表示为MB, GB, ...) 分区的结束位置(可以被表示为MB, GB, ...)

首先,要告诉parted我们工作要使用的容量单位是megabytes(实际上是mebibytes,其标准缩写符号是MiB,但是我们会通篇使用MB因为它用得更普遍一些)

(parted)unit mib

现在创建一个2MB的分区,它后面将被GRUB2引导器使用。

使用mkpart 完成这个操作,并且通知 parted 从1MB开始到3MB结束(创建一个大小为2MB的分区)。

(parted)mkpart primary 1 3
(parted)name 1 grub
(parted)set 1 bios_grub on
(parted)print
Model: Virtio Block Device (virtblk)
Disk /dev/sda: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number   Start      End      Size     File system  Name   Flags
 1       1.00MiB    3.00MiB  2.00MiB               grub   bios_grub

同样地创建引导分区(128MB),交换分区(在这个例子中是512MB)和使用了剩下所有磁盘空间根分区(结束位置被标记为-1,意味着磁盘尾部减去1MB,那里是分区最远能够所达之处)

(parted)mkpart primary 3 131
(parted)name 2 boot
(parted)mkpart primary 131 643
(parted)name 3 swap
(parted)mkpart primary 643 -1
(parted)name 4 rootfs

当使用UEFI接口来引导系统时(取代BIOS),要将引导分区标识为EFI系统分区。

当“boot”选项在这个分区被设置时,Parted可以自动完成此事。

(parted)set 2 boot on 分区结果看起来就像下面这样:

(parted)print
Model: Virtio Block Device (virtblk)
Disk /dev/sda: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number   Start      End      Size     File system  Name   Flags
 1       1.00MiB    3.00MiB  2.00MiB               grub   bios_grub
 2       3.00MiB    131MiB   128MiB                boot   boot
 3       131MiB     643MiB   512MiB                swap
 4       643MiB     20479MiB 19836MiB              rootfs

附注

UEFI安装时,引导标志将出现在引导分区(ESP)。 使用 quit 命令退出parted。

备选:使用fdisk对磁盘进行分区

虽然最近的fdisk 应该也支持GPT, 但它仍然有一些问题。下面给出的指导假定我们的分区方案使用的是MBR。 下面的部分解释了怎样使用fdisk来创建范例分区布局,范例分区布局我们在前面已经提到过了。

Partition   Description
/dev/sda1   BIOS boot partition
/dev/sda2   Boot partition
/dev/sda3   Swap partition
/dev/sda4   Root partition

请您根据自己的实际需要来调整您的分区布局。

查看当前分区布局

fdisk是一个流行的和强大的分区工具。用fdisk向磁盘开火吧!(在我们的例子里,我们使用/dev/sda):

root #fdisk /dev/sda

如要支持GPT,需要增加 -t gpt选项。建议一定要仔细研究fdisk的输出,因为最近的 fdisk开发改变了它的以MBR作为缺省设置的行为。 后面的指南假定我们使用的是MBR布局。 使用 p 键来显示磁盘当前的分区配置。

Command (m for help):p Disk /dev/sda: 240 heads, 63 sectors, 2184 cylinders Units = cylinders of 15120 * 512 bytes

Device Boot Start End Blocks Id System /dev/sda1 * 1 14 105808+ 83 Linux /dev/sda2 15 49 264600 82 Linux swap /dev/sda3 50 70 158760 83 Linux /dev/sda4 71 2184 15981840 5 Extended /dev/sda5 71 209 1050808+ 83 Linux /dev/sda6 210 348 1050808+ 83 Linux /dev/sda7 349 626 2101648+ 83 Linux /dev/sda8 627 904 2101648+ 83 Linux /dev/sda9 905 2184 9676768+ 83 Linux

这块特定的磁盘被配置为容纳了7个Linux文件系统(每一个文件系统各对应于一个被标识为“Linux”的分区)以及一个交换分区(被标识为“Linux swap”)

使用fdisk移除全部分区

首先从这个磁盘移除所有现存的分区。

d来删除一个分区。例如删除一个已经存在的 /dev/sda1

Command (m for help):d Partition number (1-4): 1

这个分区已经计划被删除了,当您用p键打印分区清单时它将不会被显示了,但此时它还未被实际删除,直到改变被真正保存。这将允许用户在操作错误后中止——此时,输入q并按Enter可以立即防止分区被删除。

重复敲击 p来打印分区清单,然后敲击 d键和分区号码来删除它。最终,分区表将变得空空如也。

Command (m for help):p Disk /dev/sda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes

Device Boot Start End Blocks Id System 现在在内存中的分区表已经空了,我们是时候来创建分区了。

创建BIOS引导分区

首先创建一个很小的BIOS引导分区。敲击 n 键来创建一个新分区,然后敲击p 键来选择是主分区类型,后面跟一个1 键来选择是第一个主分区。当提示“first sector”选项时,请确保它开始于2048(这是引导器所必须的)然后敲Enter键。当提示“last sector”时,键入+2M来创建一个大小为2Mbyte的分区。

Note 开始于2048扇区是一个容错机制,当引导器无法检测这个分区为可用时尽量保持功能正常。 Command (m for help):n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First sector (64-10486533532, default 64): 2048 Last sector, +sectors +size{M,K,G} (4096-10486533532, default 10486533532): +2M 构造分区用于UEFI:

Command (m for help):t Selected partition 1 Hex code (type L to list codes): 4 Changed system type of partition 1 to 4 (BIOS boot) Note 不鼓励对MBR分区布局使用UEFI,如果系统具有UEFI功能,请使用GPT分区布局。 创建引导分区 首先创建一个很小的BIOS引导分区。敲击 n 键来创建一个新分区,然后敲击p 键来选择是主分区类型,后面跟一个2 键来选择是第二个主分区。当提示“first sector”选项时,敲回车以接受默认值。当提示“last sector”时,键入+128M来创建一个大小为128Mbyte的分区。

Command (m for help):n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First sector (5198-10486533532, default 5198): (Hit enter) Last sector, +sectors +size{M,K,G} (4096-10486533532, default 10486533532): +128M 现在,当敲击 p键时,下面的分区信息将被显示:

Command (m for help):p Disk /dev/sda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes

Device Boot Start End Blocks Id System /dev/sda1 1 3 5198+ ef EFI (FAT-12/16/32) /dev/sda2 3 14 105808+ 83 Linux 敲击 a 键来切换一个分区是否为可引导的标记,然后敲击 2。之后再一次敲 p键,您可以发现一个“*”被放置于相应分区的“boot”列。

创建swap分区

为了创建交换分区,敲击 n 来创建一个新分区,然后是 p 键来告诉fdisk要创建一个主分区。然后敲击 3 来创建第三个分区,/dev/sda3。当提示输入“ the first sector”时,敲击 Enter键。当提示输入“the last sector”时,键入+512M(或者按需给交换分区分配任意容量)来创建一个512MB大小的分区。

这些做完之后,敲击 t来设置分区类型, 3来选择刚刚创建的这个分区,然后敲击“82”设置分区类型为“Linux Swap”。

创建根分区

最后创建根分区,敲击 n来创建一个新分区,然后敲击 p 告诉l fdisk 要创建一个主分区。然后敲击 4 来创建第四个主分区 /dev/sda4。当提示输入“the first sector”时,敲击Enter。当提示输入“the last sector”时,敲击Enter来创建一个占用了所有剩余磁盘空间的分区。完成这些步之后,敲击 p ,会显示一张类似于下面的分区表:

Command (m for help):p Disk /dev/sda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes

Device Boot Start End Blocks Id System /dev/sda1 1 3 5198+ ef EFI (FAT-12/16/32) /dev/sda2 * 3 14 105808+ 83 Linux /dev/sda3 15 81 506520 82 Linux swap /dev/sda4 82 3876 28690200 83 Linux 保存分区布局 要保存分区布局并退出 fdisk,请敲击 w。

Command (m for help):w 当分区创建完成后,就该在其上部署文件系统了。