修订历史 | ||
---|---|---|
修订 3.5 | 2005 年 12 月 26 日 | |
重新组织了文档页面顺序。添加了关于设置交换空间的页面。添加了分区标签页面。更新了第 4 节中的最大交换空间值。添加了关于创建 ext2/3 文件系统的说明。修复了 Richard Calmbach 识别的断开链接。创建了 XML 版本。 | ||
修订 3.4.4 | 2004 年 3 月 8 日 | |
同步了 SGML 版本和 HTML 版本。更新了 lilo 的位置和交换空间讨论。 | ||
修订 3.3 | 2003 年 4 月 4 日 | |
同步了 SGML 和 HTML 版本 | ||
修订 3.3 | 2001 年 7 月 10 日 | |
更正了第 6 节,柱面号的计算 | ||
修订 3.2 | 2000 年 9 月 1 日 | |
Dan Scott 于 2000 年 10 月 2 日提供 sgml 转换。重写了简介。重写了逻辑设备中关于设备名称的讨论。重新组织了分区类型。编辑了分区要求。添加了恢复已删除分区表的内容。 | ||
修订 3.1 | 2000 年 6 月 12 日 | |
更正了分区要求中的交换空间限制,更新了简介中的各种链接,在如何使用 fdisk 分区中添加了提交的示例,在分区要求中添加了文件系统讨论。 | ||
修订 3.0 | 2000 年 5 月 1 日 | |
Anthony Lissot 基于 Kristian Koehntopp 的 Linux 分区 HOWTO 进行了首次修订。 | ||
修订 2.4 | 1997 年 11 月 3 日 | |
Kristian Koehntopp 的最后一次修订。 |
分区是将单个硬盘驱动器划分为多个逻辑驱动器的一种手段。分区是驱动器上的一组连续的块,被视为独立的磁盘。分区表(这是本 HOWTO 的主题)是一个索引,它将硬盘驱动器的各个部分与分区关联起来。
为什么要使用多个分区?
封装您的数据。由于文件系统损坏是分区本地的,如果发生意外,您只会丢失部分数据。
提高磁盘空间效率。您可以根据您的使用情况,使用不同块大小格式化分区。如果您的数据由大量小文件(小于 1k)组成,而您的分区使用 4k 大小的块,那么您将为每个文件浪费 3k 空间。一般来说,对于每个文件,您平均浪费半个块的空间,因此如果您有很多文件,将块大小与文件的平均大小相匹配非常重要。
限制数据增长。失控的进程或疯狂的用户可能会消耗大量磁盘空间,以至于操作系统在硬盘驱动器上不再有空间进行簿记操作。这将导致灾难。通过隔离空间,您可以确保在分配的磁盘空间耗尽时,除了操作系统之外的其他东西会崩溃。
sfdisk:fdisk 的命令行版本
cfdisk:fdisk 的基于 curses 的版本
parted:Gnu 分区编辑器
Partition Magic:一个商业实用程序,用于创建、调整大小、合并和转换分区,而不会破坏数据。
Disk Drake:一个 Perl/Gtk 程序,用于创建、调整大小和删除分区
表 1. 相关 HOWTO
标题 | 作者 | 描述 |
---|---|---|
双启动安装策略 | Gjoen Stein | 如何估计文件系统不同部分的不同大小和速度要求。 |
Linux 多磁盘系统调优 | Gjoen Stein | 如何估计文件系统不同部分的不同大小和速度要求。 |
Linux 大磁盘 | Andries Brouwer | 关于超过 1024 个柱面的磁盘的说明和注意事项 |
Linux 磁盘配额 | Ralf van Dooren | 关于限制每个用户磁盘空间使用量(配额)的说明 |
Partition-Rescue mini-HOWTO | Jean-Daniel Dodin | 如何在 Windows 安装后恢复已删除的 linux 分区。似乎不保留数据。 |
Linux ADSM 备份 | Thomas Koenig | 关于将 Linux 集成到 IBM ADSM 备份环境中的说明。 |
使用 MSDOS 进行 Linux 备份 | Christopher Neufeld | 关于 MS-DOS 驱动的 Linux 备份的信息。 |
Linux HOWTO 索引 | Tim Bynum | 关于编写和提交 HOWTO 文档的说明 |
Linux 使用特殊的命名法来指代硬盘驱动器分区,为了理解后续页面的讨论,必须理解这种命名法。
在 Linux 中,分区由设备文件表示。这些是位于/dev中的虚拟文件。以下是一些条目
brw-rw---- 1 root disk 3, 0 May 5 1998 hda brw-rw---- 1 root disk 8, 0 May 5 1998 sda crw------- 1 root tty 4, 64 May 5 1998 ttyS0 |
按照惯例,IDE 驱动器将被赋予设备名称/dev/hda到/dev/hdd。硬盘 驱动器 A (/dev/hda) 是第一个驱动器,硬盘 驱动器 C (/dev/hdc) 是第三个。
典型的 PC 有两个 IDE 控制器,每个控制器可以连接两个驱动器。例如,/dev/hda是第一个 IDE 控制器上的第一个驱动器(主盘),/dev/hdd是第二个控制器(从盘)上的第二个驱动器(计算机中的第四个 IDE 驱动器)。
您可以直接写入这些设备(使用 cat 或 dd)。但是,由于这些设备代表整个磁盘,从第一个块开始,您可能会错误地覆盖主引导记录和分区表,这将使驱动器无法使用。
表 3. 分区名称
驱动器名称 | 驱动器控制器 | 驱动器编号 | 分区类型 | 分区号 |
/dev/hda1 | 1 | 1 | 主分区 | 1 |
/dev/hda2 | 1 | 1 | 主分区 | 2 |
/dev/hda3 | 1 | 1 | 主分区 | 3 |
/dev/hda4 | 1 | 1 | 交换分区 | NA |
/dev/hdb1 | 1 | 2 | 主分区 | 1 |
/dev/hdb2 | 1 | 2 | 主分区 | 2 |
/dev/hdb3 | 1 | 2 | 主分区 | 3 |
/dev/hdb4 | 1 | 2 | 主分区 | 4 |
一旦驱动器被分区,分区将以名称末尾的数字表示。例如,第二个驱动器上的第二个分区将是/dev/hdb2。上表列出了分区类型(主分区)以求清晰,尽管该概念直到第 3.3 节才解释。
SCSI 驱动器遵循类似的模式;它们用 'sd' 而不是 'hd' 表示。因此,第二个 SCSI 驱动器的第一个分区将是/dev/sdb1。在上表中,驱动器编号被任意选择为 6,以介绍 SCSI ID 号在 linux 下不映射到设备名称的想法。
在 (Sun) Solaris 和 (SGI) IRIX 下,赋予 SCSI 驱动器的设备名称与其插入位置有关。在 linux 下,只有哀号和咬牙切齿。
之前
SCSI ID #2 SCSI ID #5 SCSI ID #7 SCSI ID #8 /dev/sda /dev/sdb /dev/sdc /dev/sdd |
之后
SCSI ID #2 SCSI ID #7 SCSI ID #8 /dev/sda /dev/sdb /dev/sdc |
SCSI 驱动器具有从 1 到 15 的 ID 号。较低的 SCSI ID 号被分配较低的字母顺序。例如,如果您有两个编号为 2 和 5 的驱动器,则 #2 将是/dev/sda,#5 将是/dev/sdb。如果您移除其中任何一个,所有编号较高的驱动器将在您下次启动时被重命名。
如果您的 linux 机器中有两个 SCSI 控制器,您需要检查 /bin/dmesg 的输出,以查看每个驱动器被分配了什么名称。如果您移除两个控制器中的一个,剩余的控制器可能会将其所有驱动器重命名。可恶...
有两种解决方法;都涉及使用程序在每个分区上放置标签(请参阅第 6 节)。即使设备物理移动,标签也是持久的。然后,您可以直接或间接地通过标签引用分区。
上表说明了名称分配中一个神秘的跳跃。这是由于使用了逻辑分区(请参阅第 3.4 节),逻辑分区总是从 5 开始,原因稍后解释。
这就是您处理 linux 磁盘设备所需要知道的一切。为了完整起见,请参阅 Kristian 在下面对设备号的讨论。
设备文件唯一重要的是其主设备号和次设备号,它们显示为代替文件大小
$ ls -l /dev/hda |
当访问设备文件时,主设备号选择哪个设备驱动程序被调用来执行输入/输出操作。此调用使用次设备号作为参数完成,次设备号如何被解释完全取决于驱动程序。驱动程序文档通常描述驱动程序如何使用次设备号。对于 IDE 磁盘,此文档位于 /usr/src/linux/Documentation/ide.txt。对于 SCSI 磁盘,人们会期望在 /usr/src/linux/Documentation/scsi.txt中找到此类文档,但实际上没有。必须查看驱动程序源代码才能确定( /usr/src/linux/driver/scsi/sd.c:184-196)。幸运的是,Peter Anvin 在 /usr/src/linux/Documentation/devices.txt中有一个设备号和名称列表;请参阅块设备、主设备号 3、22、33、34(用于 IDE)和主设备号 8(用于 SCSI 磁盘)的条目。主设备号和次设备号各占一个字节,这就是为什么每个磁盘的分区数量受到限制的原因。
分区被标记为托管某种类型的文件系统(不要与卷标混淆(请参阅第 6 节))。这样的文件系统可以是 linux 标准 ext2 文件系统或 linux 交换空间,甚至可以是外部文件系统,如 (Microsoft) NTFS 或 (Sun) UFS。每个分区类型都关联一个数字代码。例如,ext2 的代码是0x83,linux 交换空间的代码是0x82。要查看分区类型及其代码的列表,请执行/sbin/sfdisk -T
分区类型代码是任意选择的(您无法弄清楚它们应该是什么),并且它们特定于给定的操作系统。因此,理论上,如果您使用两个操作系统使用相同的硬盘驱动器,则相同的代码可能用于指定两种不同的分区类型。OS/2 使用 0x07 类型标记其分区,Windows NT 的 NTFS 也是如此。MS-DOS 为其各种 FAT 文件系统分配了多个类型代码:0x01、0x04 和 0x06 是已知的。DR-DOS 使用 0x81 来指示受保护的 FAT 分区,从而在当时与 Linux/Minix 发生类型冲突,但 Linux/Minix 和 DR-DOS 都不再被广泛使用。
OS/2 使用0x07类型标记其分区,Windows NT 的 NTFS 也是如此。MS-DOS 为其各种 FAT 文件系统分配了多个类型代码:0x01、0x04和0x06是已知的。DR-DOS 使用0x81来指示受保护的 FAT 分区,从而在当时与 Linux/Minix 发生类型冲突,但 Linux/Minix 和 DR-DOS 都不再被广泛使用。
硬盘驱动器的一个主分区可以被再分区。这些是逻辑分区。这有效地允许我们绕过历史性的四个分区限制。
用于容纳逻辑分区的主分区称为扩展分区,它有自己的文件系统类型 (0x05)。与主分区不同,逻辑分区必须是连续的。每个逻辑分区都包含指向下一个逻辑分区的指针,这意味着逻辑分区的数量是无限的。但是,linux 对驱动器上任何类型分区的总数施加了限制,因此这有效地限制了逻辑分区的数量。在 SCSI 磁盘上最多为 15 个分区,在 IDE 磁盘上最多为 63 个分区。
计算机上运行的每个进程都分配了许多 RAM 块。这些块称为页。在不久的将来将被处理器引用的内存页集合称为“工作集”。Linux 尝试预测这些内存访问(假设最近使用的页面将在不久的将来再次使用),并在可能的情况下将这些页面保留在 RAM 中。
如果机器上运行的进程过多,内核将尝试通过将页面写入磁盘来释放 RAM。这就是交换空间的用途。它有效地增加了您可以使用的内存量。但是,磁盘 I/O 比从 RAM 读取和写入 RAM 慢大约一百倍。将此视为紧急内存,而不是额外的内存。
如果内存变得如此稀缺,以至于内核从一个进程的工作集中分页出去,以便为另一个进程分页进来,则称该机器正在抖动。一些读者可能不经意地经历过这种情况:硬盘驱动器疯狂地运转,但计算机速度慢到无法使用。交换空间是您需要拥有的东西,但它不能替代足够的 RAM。有关确定您需要的交换空间大小的提示,请参阅第 4.4 节中的讨论。
对于引导驱动器:如果您想从您即将分区的驱动器引导您的操作系统,您将需要
一个主分区
一个或多个交换分区
零个或多个主/逻辑分区
一个或多个主/逻辑分区
零个或多个交换分区
您的引导分区应该是主分区,而不是逻辑分区。这将简化灾难发生时的恢复,但这在技术上不是必需的。它必须是类型0x83“Linux native”。如果您使用的是 21-3 之前的 lilo 版本(即,来自 1990 年代),您的引导分区必须包含在驱动器的前 1024 个柱面内。(通常,引导分区只需要包含内核映像。)
如果您有多个引导分区(例如来自其他操作系统),请将它们全部保留在前 1024 个柱面内(所有 DOS 分区都必须在前 1024 个柱面内)。如果您使用的是现代版本的 lilo,或除了 lilo 以外的其他方式来加载您的内核(例如,引导盘或基于 MS-DOS 的 Linux 加载器 LOADLIN.EXE),则分区可以位于任何位置。有关详细信息,请参阅 Large-disk HOWTO。
除非您交换到文件(请参阅第 9.2 节),否则您将需要一个专用的交换分区。它必须是类型0x82“Linux swap”。它可以放置在磁盘上的任何位置(但请参阅第 4.4.3 节)。主分区或逻辑分区都可以用作交换分区。一个驱动器上可以存在多个交换分区。总共允许 8 个(跨驱动器)。请参阅下面关于交换空间大小的注释(第 4.4 节)。
必须使用单个主分区作为逻辑分区的容器(扩展分区)。扩展分区可以放置在磁盘上的任何位置。逻辑分区必须是连续的,但不必填充扩展分区。
您的 linux 文件系统中的所有内容都可以放在同一个(单个)分区中。但是,在某些情况下,您可能希望限制某些文件系统的增长。例如,如果您的邮件假脱机目录与您的根文件系统在同一个分区中,并且它填满了分区中的剩余空间,您的计算机基本上会挂起。
此文件系统包含假脱机目录,例如邮件和打印的假脱机目录。此外,它还包含错误日志目录。如果您的机器是服务器并且出现长期错误,这些消息可能会填满分区。服务器计算机应该将 /var 放在与 / 不同的分区中。
这是大多数可执行二进制文件所在的位置。此外,内核源代码树也在这里,还有大量文档。
一些程序在此处写入临时数据文件。通常,它们很小。但是,如果您运行计算密集型作业,例如科学或工程应用程序,则在短时间内可能需要数百兆字节。在这种情况下,将 /tmp 保留在与 / 不同的分区中。
这是用户主目录所在的位置。如果您不对用户施加配额,则应将其放在自己的分区中。
这是您的内核映像所在的位置。有关旧系统上的放置位置,请参见上面的讨论。
对于 ext2,分区决策应受备份考虑因素的约束,并避免来自不同文件生命周期的外部碎片第 10.4 节。
文件有生命周期。创建文件后,它将在系统上保留一段时间,然后被删除。文件生命周期在整个系统中差异很大,并且部分取决于文件的路径名。例如,在/bin, /sbin, /usr/sbin, /usr/bin和类似目录中的文件可能具有很长的生命周期:数月及以上。在/home中的文件可能具有中等的生命周期:几周左右。在/var中的文件通常是短寿命的:/var/spool/news中几乎没有文件会保留超过几天,/var/spool/lpd中的文件以分钟或更短的时间来衡量其生命周期。
对于备份,如果每日备份量小于单个备份介质的容量,则很有用。每日备份可以是完整备份或增量备份。
您可以决定使您的分区大小足够小,以便它们完全适合一个备份介质(选择每日完整备份)。在任何情况下,分区都应该足够小,使其每日增量(所有修改的文件)适合一个备份介质(选择增量备份,并期望为每周/每月完整转储更换备份介质 - 无法进行无人值守操作)。
您的备份策略取决于该决定。
在规划和购买磁盘空间时,请记住留出足够的资金用于备份!未备份的数据毫无价值!几乎对于每个人来说,数据复制成本都远高于备份成本!
为了性能,将不同生命周期的文件保存在不同的分区上很有用。这样,新闻分区上的短寿命文件可能会被严重碎片化。这对/或/home分区的性能没有影响。
传统观点是创建与 RAM 大小相等的交换空间。
但请记住,这只是一种经验法则。很容易创建程序具有极大或极小工作集的情况(请参阅第 3.5 节)。例如,具有以非常随机的方式访问的大型数据集的模拟程序在其数据段中几乎没有明显的局部引用,因此其工作集将非常大。
另一方面,一个图形程序同时打开了许多 JPEG,除了一个图标化之外的所有 JPEG,将有一个非常大的数据段。但是图像变换都是在一个图像上完成的,程序占用的大部分内存都没有被访问。对于具有许多编辑器窗口的编辑器也是如此,其中一次只修改一个窗口。这些程序 - 如果它们设计得当 - 具有非常高的局部引用,并且它们的大部分可以保持交换出去,而不会对性能造成太大的影响。一个一旦启动程序就永远不会退出的用户会想要大量的交换空间,原因相同。
服务器通常配置的交换空间比其桌面对应物更多。即使给定的交换量足以满足其操作,服务器也可能承受瞬时重负载,这会导致它以高速率分页输出。一些管理员更喜欢这样而不是服务器完全崩溃。在这些情况下,交换空间可能是 ram 大小的数倍。
目前,交换分区的最大大小取决于架构。对于 i386、m68k、ARM 和 PowerPC,它“官方”为 2Gb。在 alpha 上为 128Gb,在 sparc 上为 1Gb,在 sparc64 上为 3Tb。2.6 内核上的 opteron 可以写入 16 Tb 的交换分区。对于 linux 内核 2.1 及更早版本,限制为 128Mb。分区可能大于 128 MB,但从未使用过超出部分的空间。如果您想要超过 128 MB 的交换空间用于 2.1 及更早版本的内核,则必须创建多个交换分区(最多 8 个)。在 2.4 之后,“官方”上可能存在 32 个交换区。有关详细信息,请参阅设置交换空间。
脚注: “官方”最大交换空间大小:对于内核 2.4,限制为 64 个交换空间,每个交换空间最大为 64Gb,尽管这并未反映在 mkswap 的手册页中。对于 2.6 内核上的 64 位 opteron,允许 128 个交换区,每个交换区高达 16 Tb!(感谢 Peter Chubb 的计算)
简短的答案是任何地方都可以。但是,如果您有兴趣尽可能地提高速度,则有两种基本策略(除了购买更多 RAM)。
将交换空间分布在多个驱动器上,或者至少分布在您写入最少的驱动器上。
将每个交换分区放在外磁道上。
以下是注意事项
如果您有一个具有多个磁头的磁盘和一个具有较少磁头的磁盘,并且两者在其他参数上相同,则具有多个磁头的磁盘将更快。从不同的磁头读取数据速度很快,因为它是纯电子的。从不同的磁道读取数据速度很慢,因为它涉及物理移动磁头。
因此,在单独的驱动器上写入交换空间将比在单个驱动器上来回移动磁头更快。
放置:较旧的磁盘在所有磁道上都具有相同数量的扇区。对于这些磁盘,假设您的磁盘磁头将从随机磁道向交换区移动,将交换空间放在磁盘中间将是最快的。
较新的磁盘使用 ZBR(区域位记录)。它们在外磁道上具有更多扇区。在恒定的 rpm 数下,这在外磁道上产生的性能远高于内磁道。将您的交换空间放在快速磁道上。(一般来说,编号较低的柱面与较低的分区号相关联。但是,请参阅 Kristian 最近关于此问题的评论。-Tony)
用法:当然,您的磁盘磁头不会随机移动。如果您的交换空间位于磁盘中间,位于 постоянно 繁忙的 home 分区和几乎未使用的 archive 分区之间,那么如果您的交换空间靠近 home 分区,则可以获得更短的磁头移动时间,这将更好。但是,如果您将交换空间放在另一个原本未使用的磁盘上,则会更好。
条带化:可以通过同时写入多个交换区来提高速度。具有相同优先级的交换空间将像 RAID 一样写入。请参阅第 9.3 节。
总结: 将您的交换空间放在快速磁盘上,该磁盘具有多个磁头,并且不忙于做其他事情。如果您有多个磁盘:分割交换空间并将其分散在所有磁盘甚至不同的控制器上。
本节向您展示如何使用 fdisk 实用程序实际对硬盘驱动器进行分区。Linux 只允许 4 个主分区。您可以通过细分其中一个主分区来拥有更多的逻辑分区。只有一个主分区可以被细分。
示例
通过键入(以 root 身份)启动 fdiskfdisk 设备在命令提示符下。设备可能是类似/dev/hda或/dev/sda的内容(请参阅第 2.1.1 节)。您需要的基本 fdisk 命令是
p打印分区表
n创建新分区
d删除分区
q退出而不保存更改
w写入新分区表并退出
您对分区表所做的更改在您发出写入 (w) 命令之前不会生效。这是一个示例分区表
Disk /dev/hdb: 64 heads, 63 sectors, 621 cylinders Units = cylinders of 4032 * 512 bytes Device Boot Start End Blocks Id System /dev/hdb1 * 1 184 370912+ 83 Linux /dev/hdb2 185 368 370944 83 Linux /dev/hdb3 369 552 370944 83 Linux /dev/hdb4 553 621 139104 82 Linux swap |
概述
确定您的交换空间大小(请参阅第 4.4 节)以及它应该放在哪里(请参阅第 4.4.3 节)。将剩余空间划分为其他三个分区。
示例
我从 shell 提示符启动 fdisk
# fdisk /dev/hdb |
Command (m for help): p Disk /dev/hdb: 64 heads, 63 sectors, 621 cylinders Units = cylinders of 4032 * 512 bytes |
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-621, default 1):<RETURN> Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-621, default 621): +384M |
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (197-621, default 197):<RETURN> Using default value 197 Last cylinder or +size or +sizeM or +sizeK (197-621, default 621): +128M |
Device Boot Start End Blocks Id System /dev/hdb1 1 196 395104 83 Linux /dev/hdb2 197 262 133056 83 Linux |
Command (m for help): a Partition number (1-4): 1 |
Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): 82 Changed system type of partition 2 to 82 (Linux swap) Command (m for help): p |
Disk /dev/hdb: 64 heads, 63 sectors, 621 cylinders Units = cylinders of 4032 * 512 bytes Device Boot Start End Blocks Id System /dev/hdb1 * 1 196 395104+ 83 Linux /dev/hdb2 197 262 133056 82 Linux swap /dev/hdb3 263 458 395136 83 Linux /dev/hdb4 459 621 328608 83 Linux |
侧面主题
概述: 创建一个主分区,用它来容纳所有额外的分区。然后在其中创建逻辑分区。在创建逻辑分区之前或之后创建其他主分区。
示例
我从 shell 提示符启动 fdisk
# fdisk /dev/sda |
首先我弄清楚我想要多少个分区。我知道我的驱动器有 183Gb 的容量,我想要 26Gb 的分区(因为我碰巧有大约这个大小的备份磁带)。
183Gb / 26Gb = 大约 7
所以我需要 7 个分区。即使 fdisk 接受以 Mb 和 Kb 表示的分区大小,我还是决定计算每个分区最终将占用的柱面数,因为 fdisk 报告的起始点和停止点是以柱面为单位的。当我输入 fdisk 时,我看到我有 22800 个柱面。
> The number of cylinders for this disk is set to 22800. 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., LILO) 2) booting and partitioning software from other > OSs (e.g., DOS FDISK, OS/2 FDISK) |
由于我有 4 个主分区,其中 3 个可以长 3258 个柱面。扩展分区必须长 (4 * 3258) 或 13032 个柱面才能容纳 4 个逻辑分区。
我输入以下命令来设置 3 个主分区中的第一个(我键入的内容以粗体显示)
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-22800, default 1): <RETURN> Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-22800, default 22800): 3258 |
Partition number (1-4): 4 First cylinder (9775-22800, default 9775): <RETURN> Using default value 9775 Last cylinder or +size or +sizeM or +sizeK (9775-22800, default 22800): <RETURN> Using default value 22800 |
/dev/sda1 1 3258 26169853+ 83 Linux /dev/sda2 3259 6516 26169885 83 Linux /dev/sda3 6517 9774 26169885 83 Linux /dev/sda4 9775 22800 104631345 5 Extended |
Command (m for help): n First cylinder (9775-22800, default 9775): <RETURN> Using default value 9775 Last cylinder or +size or +sizeM or +sizeK (9775-22800, default 22800): 13032 |
Device Boot Start End Blocks Id System /dev/sda1 1 3258 26169853+ 83 Linux /dev/sda2 3259 6516 26169885 83 Linux /dev/sda3 6517 9774 26169885 83 Linux /dev/sda4 9775 22800 104631345 5 Extended /dev/sda5 9775 13032 26169853+ 83 Linux /dev/sda6 13033 16290 26169853+ 83 Linux /dev/sda7 16291 19584 26459023+ 83 Linux /dev/sda8 19585 22800 25832488+ 83 Linux |
我想提交我的分区布局,因为它适用于任何 Linux 发行版(即使是大型基于 RPM 的发行版)。我有一个硬盘驱动器... 恰好是 10 GB。 Windows 看不到超过 9.3 GB 的容量,但 Linux 可以看到所有容量并使用所有容量。它也具有远超过 1024 个柱面。
表 7. 分区布局示例
分区 | 挂载点 | 大小 |
---|---|---|
/dev/hda1 | /boot | (15 兆字节) |
/dev/hda2 | Windows 98 分区 | (2 千兆字节) |
/dev/hda3 | 扩展分区 | (不适用) |
/dev/hda5 | 交换空间 | (64 兆字节) |
/dev/hda6 | /tmp | (50 兆字节) |
/dev/hda7 | / | (150 兆字节) |
/dev/hda8 | /usr | (1.5 千兆字节) |
/dev/hda9 | /home | (驱动器的剩余空间) |
我还注意到您没有任何真正的分区表示例,对于新手,我强烈建议放上一些。我刚刚脱离新手阶段,分区是我最困惑的地方。
在 Linux 中,硬盘驱动器被称为设备,设备是 /dev 中的伪文件/dev。例如,编号第二小的 SCSI 驱动器的第一个分区是 /dev/sdb1/dev/sdb1。如果被称为 /dev/sda 的驱动器/dev/sda从链中移除,那么后一个分区会在重启时自动重命名为 /dev/sdb1/dev/sda1。
卷标使分区能够保留一致的名称,而无需考虑它们连接的位置,也无需考虑连接的其他设备。标签对于 Linux 卷不是强制性的。每个标签最多可以包含 16 个字符。
有三个工具可以创建卷标:mke2fs、tune2fs 和 e2label。
e2label /dev/hdb1 pubsw
tune2fs -Lpubsw /dev/hdb1
这两个命令中的任何一个都会将第二个驱动器的第一个分区标记为 "pubsw"。该标签会与该特定分区保持关联,即使驱动器被移动到另一个控制器甚至另一台计算机。
mke2fs pubsw /dev/hdb1
mke2fs -Lpubsw /dev/hdb1
将执行与前两个命令相同的操作 - 在它们创建文件系统之后。这意味着这两个命令中的任何一个都将删除分区中的任何现有数据。
这是一个 fstab 示例。这是一个位于 /etc 中的文本文件,通常在操作系统安装期间设置。它描述了每个分区将挂载在哪里,以及它将如何挂载。当您添加/删除设备时,您可以通过实用程序或手动修改它。
LABEL=/ / ext3 defaults 1 1 LABEL=/boot /boot ext2 defaults 1 2 none /dev/pts devpts gid=5,mode=620 0 0 none /dev/shm tmpfs defaults 0 0 LABEL=HOME /home ext3 defaults 1 2 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0 LABEL=/usr /usr ext3 defaults 1 2 /dev/hdc1 /k-space ext3 defaults 1 2 /dev/hda6 swap swap defaults 0 0 /dev/hdd /media/cdrecorder auto pamconsole,ro,exec,noauto,managed 0 0 /dev/fd0 /media/floppy auto pamconsole,exec,noauto,managed 0 0 |
最左边的列列出了设备,第二列列出了挂载点。此示例包含设备和标签的混合。第二个控制器的主驱动器始终挂载在 /k-space/k-space。标记为 "HOME" 的分区始终挂载在 /home/home,无论它在哪个驱动器上或具有哪个分区号。请注意,允许将挂载点用作标签,例如 "/usr"
devlabel 是一个创建指向设备的符号链接的脚本。例如,
devlabel -d/dev/hdb1-s/dev/home
将创建一个从 /dev/hda1 到 /dev/home 的链接/dev/hdb1到/dev/home。至关重要的是,它存储了 /dev/hda1 上硬件的唯一标识符/dev/hdb1,并将该标识符与您在 /etc/sysconfig/devlabel 中指定的链接名称一起存储。如果硬件稍后移动到 /dev/hdc1/dev/hdc1,将查询其唯一标识符(使用 /usr/bin/partition_uuid),将其与其在 /etc/sysconfig/devlabel 中的条目匹配,并再次链接到 /dev/home/dev/home.
当硬盘驱动器被分区时,它被映射到各个部分,但这些部分是空的。就像新建的图书馆一样;在存放书籍之前,必须先放置书架、标牌和卡片目录系统。
分区内的组织结构称为文件系统。在 Linux 中,标准文件系统是 ext2 和 ext3。 ext3 文件系统是 ext2,加上磁盘写入日志,称为日志。日志允许系统从意外断电等事故中快速恢复。
在分区中创建 ext2/3 文件系统的主要工具是 mke2fs。它通常位于 /sbin/sbin中。 mkfs.ext2 和 mkfs.ext3 是前端,它们将特定选项传递给 mke2fs。
mke2fs /dev/hdb1
mkfs.ext2 /dev/sdb1 /dev/hdb1
两者都在第二个驱动器的第一个分区上创建 ext2 文件系统,以及
mke2fs -j /dev/sdb1/dev/hdb1
mkfs.ext3 /dev/sdb1 /dev/hdb1
创建 ext3 文件系统。
-m 选项可能是对非专家最有用的选项之一。如果文件系统被填满并且没有更多空间可写,则基本上无法使用,因为操作系统不断写入磁盘。默认情况下,分区百分之五的空间保留供 root 用户使用。这允许 root 在分区上执行管理活动,并可能从中移出一些数据。但是,当分区包含 / 或 home 目录时,这最为关键。对于纯数据分区,这只是丢失的空间。 250Gb 分区的百分之五是 12.5 Gb。特别是在大型分区的情况下,将保留空间设置为最小值(即百分之一)是安全的。
mkfs.ext3 -m 1 /dev/sdb1/dev/hdb1
创建一个文件系统,其中只有 1% 的空间保留给 root 用户。 tune2fs -m 可用于在将数据加载到分区后调整保留块。
以下是手动恢复已删除分区表的说明。有一些实用程序,例如 gpart 或 TestDisk ,可以使此任务变得容易得多。但是,如果您正在阅读本文是因为您已经运气不佳,那么这就是您必须做的
创建一个至少与您的第一个分区一样大的分区。您可以使其大于原始分区任意数量。如果您低估了,将会哭天喊地。
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-23361, default 1): <RETURN> Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-22800, default 22800): 13032 Command (m for help): w |
在第一个分区上运行 dumpe2fs 并 grep 输出块计数。
示例
% dumpe2fs /dev/sda1 | grep "Block count:" Block count: 41270953 |
删除您刚刚创建的分区
Command (m for help): d Partition number (1-4): 1 |
创建一个大小与您从块计数中获得的大小完全相同的新分区。由于您无法在 fdisk 中输入块大小,因此您需要计算出需要请求多少个柱面。以下是公式
(number of needed cylinders) = (number of blocks) / (block size) (block size) = (unit size) / 1024 (unit size) = (number of heads) * (number of sectors/cylinder) * (number of bytes/sector) |
考虑以下示例,其中硬盘驱动器已分区为四个主分区,分别为 1、2、4 和 8 个柱面。
disk /dev/sda: 16 heads, 63 sectors, 23361 cylinders Units = cylinders of 1008 * 512 bytes Device Boot Start End Blocks Id System /dev/sda1 1 2 976+ 83 Linux /dev/sda2 3 5 1512 83 Linux /dev/sda3 6 10 2520 83 Linux /dev/sda4 11 19 4536 83 Linux |
在其上运行 e2fsck 以验证您是否可以读取新分区。
在剩余分区上重复步骤 1-5。
感谢:Mike Vevea,jedi 系统管理员,提供基本策略。
通常,设置交换空间只有两个步骤:创建分区并将其添加到 /etc/fstab。 /dev/hda6 上交换分区的典型 fstab 条目如下所示
/dev/hda6 swap swap defaults 0 0 |
下次重启时,初始化脚本将自动激活它,无需执行任何其他操作。
但是,如果您想立即使用它,则需要手动激活它。以 root 身份,键入 swapon /dev/hda6
mkswap -f /dev/hda6 swapon /dev/hda6 |
有时您可能会用完交换空间,并且重新分区驱动器或添加新驱动器是不切实际的。在这种情况下,您可以使用普通分区中的常规文件。您所要做的就是创建一个所需大小的文件
dd if=/dev/zero of=/var/my_swap bs=1024 count=131072
并激活它 mkswap /var/my_swap; swapon /var/my_swap
mkswap -f /var/my_swap swapon /var/my_swap |
此调用创建一个名为 my_swapmy_swap的文件,位于 /var/var中。它的长度为 128 Mb (128 x 1024 = 131072)。最初,它填充了零。但是,mkswap 将其标记为交换空间,swapon 告诉内核开始将其用作交换空间。当您完成操作后,swapoff /var/my_swap
swapoff /var/my_swap rm /var/my_swap |
同一系统上可以使用多个交换分区。考虑一个 fstab 示例,其中有一个单独的交换分区
/dev/hda5 / ext3 defaults 1 1 /dev/hda1 /boot ext2 defaults 1 2 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 /dev/hda7 /usr ext3 defaults 1 2 /dev/hda6 swap swap defaults 0 0 |
想象一下用这三行替换交换分区的条目
/dev/hda6 none swap sw,pri=3 0 0 /dev/hdb2 none swap sw,pri=2 0 0 /dev/hdc2 none swap sw,pri=1 0 0 |
此配置将导致内核首先使用 /dev/hda6。它被分配了最高的优先级(pri=3)。最大优先级可以是 32767,最低优先级为 0。如果该空间已用完,内核将开始使用 /dev/hdb2,然后使用 /dev/hdc2。为什么要这样配置?假设最新的(最快的)驱动器被赋予最高的优先级。这将最大限度地减少交换空间使用量增长时的速度损失。
可以同时写入所有三个分区。如果每个分区都具有相同的优先级,则内核将像 RAID 一样写入它们,从而提高相应的速度。
/dev/hda6 none swap sw,pri=3 0 0 /dev/hdb2 none swap sw,pri=3 0 0 /dev/hdc2 none swap sw,pri=3 0 0 |
请注意,这三个分区位于不同的驱动器上,这在速度提升方面是理想的。
在 shell 提示符下,我开始在我的分区上创建文件系统。继续(参见 第 5.3 节)中的示例,这是 mkfs.ext2 /dev/sda1
# mke2fs /dev/sda1 |
我需要为我的每个分区执行此操作,但不包括 /dev/sda4/dev/sda4(我的扩展分区)。 Linux 支持除 ext2 之外的文件系统类型。您可以通过查看 /usr/src/linux/include/linux/fs.h/usr/src/linux/include/linux/fs.h
来了解您的内核支持的类型。最常见的文件系统可以使用 /sbin/sbin中以 "mk" 开头的程序创建,例如 mkfs.msdos 和 mke2fs。
要设置交换分区 mkswap /dev/hda6
# mkswap -f /dev/hda5 |
# swapon /dev/hda5 |
挂载分区意味着将其附加到 Linux 文件系统。要挂载 Linux 分区 mount -t 文件系统类型 设备名称 挂载点
# mount -t ext2 /dev/sda1 /opt |
文件系统类型。您可能要使用的其他类型是
ext3(基于 ext2 的日志文件系统)
msdos (DOS)
hfs (mac)
iso9660 (CDROM)
nfs(网络文件系统)
设备名称。您可能要使用的其他设备名称
/dev/hdb2/dev/hdc2(第二个 IDE 驱动器中的第二个分区)
/dev/fd0(软盘驱动器 A)
/dev/cdrom(CDROM)
挂载点。这是您想要“看到”分区的位置。当您键入 ls /optls /opt时,您可以看到 /dev/sda1/dev/sda1中的内容。如果 /opt/opt下已经有一些目录和/或文件,则在此挂载命令之后它们将不可见。
磁盘空间由操作系统以块和块片段为单位进行管理。在 ext2 中,片段和块的大小必须相同,因此我们可以将讨论限制在块上。
文件大小不一。它们不会在块边界处结束。因此,对于每个文件,每个文件的最后一个块的一部分都会被浪费。假设文件大小是随机的,则磁盘上每个文件大约浪费半个块。 Tanenbaum 在他的著作《操作系统》中称之为“内部碎片”。
您可以通过磁盘上分配的 inode 数量来猜测磁盘上的文件数量。在我的磁盘 /dev/hda3
# df -i Filesystem Inodes IUsed IFree %IUsed Mounted on /dev/hda3 64256 12234 52022 19% / /dev/hda5 96000 43058 52942 45% /var |
但是,对于大型连续的数据块,数据传输速度更快。这就是为什么 ext2 尝试以 8 个连续块为单位预先分配空间给增长的文件。当文件关闭时,未使用的预分配空间将被释放,因此不会浪费空间。
文件中块的非连续放置对性能不利,因为文件通常以顺序方式访问。它迫使操作系统拆分磁盘访问并使磁盘移动磁头。这称为“外部碎片”或简称为“碎片”,是 MS-DOS 文件系统的常见问题。结合 MS-DOS 使用的糟糕的缓冲区缓存,文件碎片对性能的影响非常明显。 DOS 用户习惯于每隔几周对磁盘进行碎片整理,有些人甚至对碎片整理产生了一些仪式性的信念。
这些习惯都不应延续到 Linux 和 ext2。 Linux 原生文件系统在正常使用情况下不需要碎片整理,这包括磁盘上至少有 5% 的可用空间的任何情况。 ext2 有一个名为 defrag 的碎片整理工具,但告诫用户不要随意使用。在此操作期间断电可能会损坏您的文件系统。由于无论如何您都需要备份数据,因此只需从您的副本写回即可完成工作。
MS-DOS 文件系统也因内部碎片而丢失大量磁盘空间而闻名。对于大于 256 MB 的分区,DOS 块大小会变得太大,以至于不再有用(这在一定程度上已通过 FAT32 得到纠正)。 Ext2 不会强制您为大型文件系统选择大型块,除非对于 0.5 TB 范围(这是 TB,其中 1 TB 等于 1024 GB)及以上的超大型文件系统,在这些文件系统中,小块大小会变得效率低下。因此,与 DOS 不同,无需将大型磁盘拆分为多个分区以减小块大小。
如果您有很多小文件,请使用 1Kb 的块大小。对于大型分区,4Kb 的块大小就足够了。