8.2.1 创建分区

一开始,你必须在存储设备上创建分区来容纳文件系统。分区可以是整个硬盘,也可以是部
分硬盘,以容纳虚拟目录的一部分。

fdisk工具用来帮助管理安装在系统上的任何存储设备上的分区。它是个交互式程序,允许
你输入命令来逐步完成硬盘分区操作。

要启动fdisk命令,你必须指定要分区的存储设备的设备名,另外还得有超级用户权限。如
果在没有对应权限的情况下使用该命令,你会得到类似于下面这种错误提示。

$ fdisk /dev/sdb
Unable to open /dev/sdb
$


说明 有时候,创建新磁盘分区最麻烦的事情就是找出安装在Linux系统中的物理磁盘。Linux
采用了一种标准格式来为硬盘分配设备名称,但是你得熟悉这种格式。对于老式的IDE驱
动器,Linux使用的是/dev/hdx。其中x表示一个字母,具体是什么要根据驱动器的检测顺
序(第一个驱动器是a,第二个驱动器是b,以此类推)。对于较新的SATA驱动器和SCSI
驱动器,Linux使用/dev/sdx。其中的x具体是什么也要根据驱动器的检测顺序(和之前一
样,第一个驱动器是a,第二个驱动器是b,以此类推)。在格式化分区之前,最好再检查
一下是否正确指定了驱动器。


如果你拥有超级用户权限并指定了正确的驱动器,那就可以进入fdisk工具的操作界面了。
下面展示了该命令在CentOS发行版中的使用情景。

$ sudo fdisk /dev/sdb
[sudo] password for Christine:
Device contains neither a valid DOS partition table,
nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xd3f759b5.
Changes will remain in memory only
until you decide to write them.
After that, of course, the previous content won’t be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will
be corrected by w(rite)
[…]
Command (m for help):


窍门 如果这是你第一次给该存储设备分区,fdisk会警告你设备上没有分区表。


fdisk交互式命令提示符使用单字母命令来告诉fdisk做什么。表8-2显示了fdisk命令提示
符下的可用命令。
image.png
尽管看上去很恐怖,但实际上你在日常工作中用到的只有几个基本命令。
对于初学者,可以用p命令将一个存储设备的详细信息显示出来。

Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 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: 0x11747e88
Device Boot Start End Blocks Id System
Command (m for help):

输出显示这个存储设备有5368 MB(5 GB)的空间。存储设备明细后的列表说明这个设备上
是否已有分区。这个例子中的输出中没有显示任何分区,所以设备还未分区。
下一步,可以使用n命令在该存储设备上创建新的分区。

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-652, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-652, default 652): +2G
Command (m for help):

分区可以按主分区(primary partition)或扩展分区(extended partition)创建。主分区可以被
文件系统直接格式化,而扩展分区则只能容纳其他主分区①。扩展分区出现的原因是每个存储设
备上只能有4个分区。可以通过创建多个扩展分区,然后在扩展分区内创建主分区进行扩展。②上
例中创建了一个主分区,在存储设备上给它分配了分区号1,然后给它分配了2 GB的存储设备空
间。你可以再次使用p命令查看结果。

Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 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: 0x029aa6af
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
Command (m for help):

从输出中现在可以看到,该存储设备上有了一个分区(叫作/dev/sdb1)。Id列定义了Linux怎
么对待该分区。fdisk允许创建多种分区类型。使用l命令列出可用的不同类型。默认类型是83,
该类型定义了一个Linux文件系统。如果你想为其他文件系统创建一个分区(比如Windows的NTFS
分区),只要选择一个不同的分区类型即可。

可以重复上面的过程,将存储设备上剩下的空间分配给另一个Linux分区。创建了想要的分
区之后,用w命令将更改保存到存储设备上。

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
$

存储设备的分区信息被写入分区表中,Linux系统通过ioctl()调用来获知新分区的出现。
设置好分区之后,可以使用Linux文件系统对其进行格式化。


窍门 有些发行版和较旧的发行版在生成新分区之后并不会自动提醒Linux系统。如果是这样的
话,你要么使用partprob或hdparm命令(参考相应的手册页),要么重启系统,让系统
读取更新过的分区表。


——————————
① 此处说法有误。扩展分区内容纳的应该是“逻辑分区”(logical partition)。可参考https://en.wikipedia.org/wiki/
Extended_boot_record及https://technet.microsoft.com/en-us/library/cc976786.aspx
② 此处正确的说法应是:“可以通过创建一个扩展分区,然后在扩展分区内创建逻辑分区进行扩展。”

8.2.2 创建文件系统

在将数据存储到分区之前,你必须用某种文件系统对其进行格式化,这样Linux才能使用它。
每种文件系统类型都用自己的命令行程序来格式化分区。表8-3列出了本章中讨论的不同文件系
统所对应的工具。
image.png

并非所有文件系统工具都已经默认安装了。要想知道某个文件系统工具是否可用,可以使用
type命令。

$ type mkfs.ext4
mkfs.ext4 is /sbin/mkfs.ext4
$
$ type mkfs.btrfs
-bash: type: mkfs.btrfs: not found
$

据上面这个取自Ubuntu系统的例子显示,mkfs.ext4工具是可用的。而Btrfs工具则不可用。
请参阅第9章中有关如何在Linux发行版中安装软件和工具的相关内容。

每个文件系统命令都有很多命令行选项,允许你定制如何在分区上创建文件系统。要查看所
有可用的命令行选项,可用man命令来显示该文件系统命令的手册页面(参见第3章)。所有的文
件系统命令都允许通过不带选项的简单命令来创建一个默认的文件系统。

$ sudo mkfs.ext4 /dev/sdb1
[sudo] password for Christine:
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526120 blocks
26306 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216 17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
$

这个新的文件系统采用ext4文件系统类型,这是Linux上的日志文件系统。注意,创建过程中
有一步是创建新的日志。

为分区创建了文件系统之后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将
数据存储在新文件系统中了。你可以将新文件系统挂载到虚拟目录中需要额外空间的任何位置。

$ ls /mnt
$
$ sudo mkdir /mnt/my_partition
$
$ ls -al /mnt/my_partition/
$
$ ls -dF /mnt/my_partition
/mnt/my_partition/
$
$ sudo mount -t ext4 /dev/sdb1 /mnt/my_partition
$
$ ls -al /mnt/my_partition/
total 24
drwxr-xr-x. 3 root root 4096 Jun 11 09:53 .
drwxr-xr-x. 3 root root 4096 Jun 11 09:58 ..
drwx———. 2 root root 16384 Jun 11 09:53 lost+found
$

mkdir命令(参见第3章)在虚拟目录中创建了挂载点,mount命令将新的硬盘分区添加到挂
载点。mount命令的-t选项指明了要挂载的文件系统类型(ext4)。现在你可以在新分区中保存
新文件和目录了!


说明 这种挂载文件系统的方法只能临时挂载文件系统。当重启Linux系统时,文件系统并不会
自动挂载。要强制Linux在启动时自动挂载新的文件系统,可以将其添加到/etc/fstab文件。


现在文件系统已经被挂载了到虚拟目录中,可以投入日常使用了。遗憾的是,在日常使用过
程中有可能会出现一些严重的问题,例如文件系统损坏。下一节将演示如何应对这种问题。

8.2.3 文件系统的检查与修复

就算是现代文件系统,碰上突然断电或者某个不规矩的程序在访问文件时锁定了系统,也会
出现错误。幸而有一些命令行工具可以帮你将文件系统恢复正常。

每个文件系统都有各自可以和文件系统交互的恢复命令。这可能会让局面变得不太舒服,随
着Linux环境中可用的文件系统变多,你也不得不去掌握大量对应的命令。好在有个通用的前端
程序,可以决定存储设备上的文件系统并根据要恢复的文件系统调用适合的文件系统恢复命令。

fsck命令能够检查和修复大部分类型的Linux文件系统,包括本章早些时候讨论过的ext、
ext2、ext3、ext4、ReiserFS、JFS和XFS。该命令的格式是:

fsck options filesystem

你可以在命令行上列出多个要检查的文件系统。文件系统可以通过设备名、在虚拟目录中的
挂载点以及分配给文件系统的唯一UUID值来引用。


窍门 尽管日志式文件系统的用户需要用到fsck命令,但是COW文件系统的用户是否也得使用
该命令还存在争议。实际上,ZFS文件系统甚至都没有提供fsck工具的接口。


fsck命令使用/etc/fstab文件来自动决定正常挂载到系统上的存储设备的文件系统。如果存储
设备尚未挂载(比如你刚刚在新的存储设备上创建了个文件系统),你需要用-t命令行选项来指
定文件系统类型。表8-4列出了其他可用的命令行选项。
image.png
你可能注意到了,有些命令行选项是重复的。这是为多个命令实现通用的前端带来的部分问
题。有些文件系统修复命令有一些额外的可用选项。如果要做更高级的错误检查,就需要查看这
个文件系统修复工具的手册页面来确定是不是有该文件系统专用的扩展选项。


窍门 只能在未挂载的文件系统上运行fsck命令。对大多数文件系统来说,你只需卸载文件系
统来进行检查,检查完成之后重新挂载就好了。但因为根文件系统含有所有核心的Linux
命令和日志文件,所以你无法在处于运行状态的系统上卸载它。
这正是亲手体验Linux LiveCD的好时机!只需用LiveCD启动系统即可,然后在根文件系
统上运行fsck命令。


到目前为止,本章讲解了如何处理物理存储设备中的文件系统。Linux还有另一些方法可以
为文件系统创建逻辑存储设备。下一节将告诉你如何使用逻辑存储设备。