磁盘、分区和文件系统
背景
在云厂商提供廉价的 Linux ECS 方案中,往往只配了单颗虚拟硬盘。一般来说,这类廉价ECS搭配的硬盘的容量都非常小,仅能满足系统本身运行。为了满足日常所需,往往还需要加购第二颗硬盘,为此,我需要了解一点磁盘分区知识。
文件系统的概念
文件系统是存储和管理文件的方法。文件系统使得用户保存数据时,不必关心数据实际保存在硬盘(或者光盘)的数据块地址,只需要记住这个文件的所属目录和文件名。
不同的文件系统具有不同的特性,例如性能、安全性和兼容性。
常见的文件系统有:
ext4
:常用于Linux
系统,具有良好的性能和可靠性。NTFS
:常用于Windows
系统,支持大文件和权限控制。FAT32
:用于跨平台兼容性,但不支持大文件和权限。
磁盘和分区
在Linux中设备出现在/dev/
路径下。一个虚拟磁盘往往用vdx
表示,其中x=a,b,c,...。比如/dev/vda
、/dev/vdb
、...等。
一块磁盘往往会被划分成多个分区来用作不同的用途。硬盘的第一个扇区(512 字节),包含分区表和引导代码,称之为主引导记录(MBR
)。其中,分区表记录了磁盘各个分区的起始位置。
随着技术的发展,
GPT
(GUID 分区表)逐渐取代了MBR
分区表。GPT
允许更多的分区,没有主分区和扩展分区的概念,它支持数千个分区。不过,为了简单起见,我们这里不谈论
GPT
分区是将硬盘划分为不同的逻辑部分的过程。每个分区可以被视为一个独立的“逻辑”磁盘。
由于MBR
分区表的设计限制,一个磁盘驱动器最多可以包含四个主分区或三个主分区和一个扩展分区。
- 主分区:用于操作系统、应用程序和用户数据。在Windows中,这通常是您的 C 盘。
- 扩展分区:本身不包含文件系统,而是用于容纳逻辑分区。逻辑分区没有直接的设备名称,而是通过扩展分区来访问。
操作系统中,往往有多块磁盘,而每个磁盘又可以划分成多个分区。注意,每个分区都会视作一个单独的设备,例如:
/dev/vdb
: 表示当前机器中第二个虚拟磁盘设备/dev/vdb/1
:表示虚拟磁盘/dev/vdb
上的第1个虚拟磁盘
此外,不同的分区可以使用不同的文件系统。换言之,同一块磁盘,可以创建不同的文件系统。
分区管理与创建文件系统
管理分区表
我们可以使用fdisk
管理一块磁盘的分区表:
sudo fdisk /dev/vdb
注意,fdisk
管理的其实是磁盘的分区表,这意味着它操作的是磁盘的第一个扇区!
该命令是一个交互式的环境,可以使用m
提示菜单:
~$ sudo fdisk /dev/vdb
[sudo] password for itminus:
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
Command (m for help):
其中,最基本的几个命令是:
p
: 打印分区表d
: 删除一个分区n
: 创建一个新分区w
: 把变更写入磁盘分区表
创建文件系统
仅仅只管理分区表是不够的,我们还需要在磁盘分区上创建文件系统。Linux中提供了mkfs.<fs-type>
系列命令来创建文件系统。
比如,我们想要在刚刚更新的磁盘上的第1个分区创建.ext4
文件系统,可以使用如下命令:
sudo mkfs.ext4 /dev/vdb1
注意,这里的设备名是/dev/vdb1
而非/dev/vdb
,这表示是/dev/vdb
上的第一个分区,而不是在整个磁盘设备上创建文件系统!
挂载文件系统
创建了文件系统后,还必须进行挂载到对应路径上,才能进行操作。
在Linux
中,文件/etc/fstab
用于配置静态的文件系统,记录在这其中的文件系统会被操作系统自动挂载。该配置文件有固定6列:
- Device:设备名,比如
UUID
,或者/dev/vdb1
之类(注意不是/dev/vdb
)。 - Mount Point:挂载点,即挂载到的文件路径
- File System Type:文件系统类型,比如
ext4
- Options:选项,多个选项之间用
,
分隔。 - Backup Operation:备份操作。
- File System Check Order:文件系统检查顺序。
0
表示不检查,根文件系统应设置为 1,其他分区应设置为 2。
示例:
# /etc/fstab: static file system information.
UUID=ed2ccb2c-d03a-486c-b726-64ddd3f54030 / ext4 errors=remount-ro 0 1
/dev/vdb1 /www ext4 defaults 0 2
现在,我们可以使用lsblk
列出块设备:
~$ lsblk -o NAME,TYPE,MOUNTPOINT,LABEL,SIZE,UUID
NAME TYPE MOUNTPOINT LABEL SIZE UUID
sr0 rom cidata 386K 2024****
vda disk 50G
└─vda1 part / 50G ed2c****
vdb disk 30G
└─vdb1 part /www 30G 933d****