Linux文件系统管理

一、硬盘结构

1.1 硬盘介绍

在操作系统中,文件系统是创建在硬盘上的,因此,要想彻底搞清楚文件系统的管理机制,就要从了解硬盘开始。

硬盘是计算机的主要外部存储设备。计算机中的存储设备种类非常多,常见的主要有光盘、硬盘、U 盘等,甚至还有网络存储设备 SAN、NAS 等,不过使用最多的还是硬盘。

如果从存储数据的介质上来区分,硬盘可分为机械硬盘(Hard Disk Drive, HDD)和固态硬盘(Solid State Disk, SSD),机械硬盘采用磁性碟片来存储数据,而固态硬盘通过闪存颗粒来存储数据。

1.2 机械硬盘(HDD)

1.2.1 机械硬盘介绍

机械硬盘的外观大家可能都见过,那么机械硬盘拆开后的样子如图所示。

机械硬盘主要由磁盘盘片、磁头、主轴与传动轴等组成,数据就存放在磁盘盘片中。硬盘是上下双磁头,盘片在两个磁头中间高速旋转。

也就是说,机械硬盘是上下盘面同时进数据读取的。目前机械硬盘的常见转速是 7200 r/min,所以机械硬盘在读取或写入数据时,非常害怕晃动和磕碰。另外,因为机械硬盘的超高转速,如果内部有灰尘,则会造成磁头或盘片的损坏,所以机械硬盘内部是封闭的,如果不是在无尘环境下,则禁止拆开机械硬盘。

机械硬盘的逻辑结构主要分为磁道、扇区和柱面。如下图所示。

**磁道:**每个盘片都在逻辑上有很多的同心圆,最外面的同心圆就是 0 磁道。我们将每个同心圆称作磁道(注意,磁道只是逻辑结构,在盘面上并没有真正的同心圆)。硬盘的磁道密度非常高,通常一面上就有上千个磁道。但是相邻的磁道之间并不是紧挨着的,这是因为磁化单元相隔太近会相互产生影响。

**扇区:**扇区其实是很形象的,大家都见过折叠的纸扇吧,纸扇打开后是半圆形或扇形的,不过这个扇形是由每个扇骨组合形成的。在磁盘上每个同心圆是磁道,从圆心向外呈放射状地产生分割线(扇骨),将每个磁道等分为若干弧段,每个弧段就是一个扇区。每个扇区的大小是固定的,为 512Byte。扇区也是磁盘的最小存储单位。

**柱面:**如果硬盘是由多个盘片组成的,每个盘面都被划分为数目相等的磁道,那么所有盘片都会从外向内进行磁道编号,最外侧的就是 0 磁道。具有相同编号的磁道会形成一个圆柱,这个圆柱就被称作磁盘的柱面

硬盘的大小是使用"磁头数 x 柱面数 x 扇区数 x 每个扇区的大小"这样的公式来计算的。其中,磁头数(Heads)表示硬盘共有几个磁头,也可以理解为硬盘有几个盘面,然后乘以 2;柱面数(Cylinders)表示硬盘每面盘片有几条磁道;扇区数(Sectors)表示每条磁道上有几个扇区;每个扇区的大小一般是 512Byte

1.2.2 机械硬盘接口

机械硬盘通过接口与计算机主板进行连接。硬盘的读取和写入速度与接口有很大关系。接口的性能直接影响机械硬盘的读取和写入速度,同样也会影响机械硬盘的性能。

目前,常见的机械硬盘接口有以下几种:

  • IDE 硬盘接口(Integrated Drive Eectronics,并口,即电子集成驱动器)也称作 "ATA硬盘" 或 "PATA硬盘",是早期机械硬盘的主要接口,ATA133 硬盘的理论速度可以达到 133MB/s(此速度为理论平均值)。

  • SATA 接口(Serial ATA,串口),是速度更高的硬盘标准,具备了更高的传输速度,并具备了更强的纠错能力。目前已经是 SATA 三代,理论传输速度达到 600MB/s(此速度为理论平均值)。

  • SCSI 接口(Small Computer System Interface,小型计算机系统接口)广泛应用在服务器上,具有应用范围广、多任务、带宽大、CPU 占用率低及支持热插拔等优点,理论传输速度达到320MB/s。

1.3 固态硬盘(SSD)

固态硬盘和传统的机械硬盘最大的区别就是不再采用盘片进行数据存储,而采用存储芯片进行数据存储。固态硬盘的存储芯片主要分为两种:一种是采用闪存作为存储介质的;另一种是采用DRAM作为存储介质的。目前使用较多的主要是采用闪存作为存储介质的固态硬盘。

1.3.1 固态硬盘的优势

SSD是固态硬盘;HDD是机械硬盘,前者没有后者的运动结构,而且拥有更快的读写速度,但在价格和容量上都较弱于后者。此外还拥有低功耗、防震抗摔性好、发热低等优势。以下是详细介绍:

  • SSD和HDD最大区别是SSD由多个闪存颗粒和主控芯片组成,没有运动结构设计,而HDD采用的是碟盘和读写磁头组成。

  • 固态硬盘读写速度快:采用闪存作为存储介质,读取速度相对机械硬盘更快。固态硬盘不用磁头,寻道时间几乎为0,持续写入的速度较高。

  • 固态硬盘防震抗摔性好:传统硬盘都是磁碟型的,数据储存在磁碟扇区里。而固态硬盘是使用闪存颗粒制作而成,所以SSD固态硬盘内部不存在任何机械部件;这样即使在高速移动甚至伴随翻转倾斜的情况下也不会影响到正常使用,而且在发生碰撞和震荡时能够将数据丢失的可能性降到最小。相较传统硬盘,固态硬盘占有绝对优势。

  • 固态硬盘低功耗:固态硬盘的功耗上要低于传统硬盘;固态硬盘无噪音:固态硬盘没有机械马达和风扇,工作时噪音值为0分贝。基于闪存的固态硬盘在工作状态下能耗和发热量较低(但高端或大容量产品能耗会较高)。内部不存在任何机械活动部件,不会发生机械故障,也不怕碰撞、冲击、振动。由于固态硬盘采用无机械部件的闪存芯片,所以具有了发热量小、散热快等特点。

二、文件系统

2.1 Linux 文件系统的特性

之前讲Linux分区文件系统部分的时候涉及过inode节点block块,今天更加详细地介绍Linux文件系统。

首先了解下block,对于ext2(ext3)文件系统而言,硬盘分区首先被划分为一个个的block,硬盘分区上所有的block被聚在一起分成几个大的block group。

文件系统格式化后block group的组成部分:

  • super block:记录整个文件系统的信息,包括 block 与 inode 的总量,已经使用的 inode 和 block 的数量,未使用的 inode 和 block 的数量,block 与 inode 的大小,文件系统的挂载时间,最近一次的写入时间,最近一次的磁盘检验时间等。

  • data block:用来实际保存数据的,block 的大小(1KB、2KB 或 4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化。每个 block 只能保存一个文件的数据,要是文件数据小于一个 block 块,那么这个 block 的剩余空间不能被其他文件是要;要是文件数据大于一个 block 块,则占用多个 block 块。Windows 中磁盘碎片整理工具的原理就是把一个文件占用的多个 block 块尽量整理到一起,这样可以加快读写速度。

  • inode table:用来记录文件的权限(r、w、x),文件的所有者和属组,文件的大小,文件的状态改变时间(ctime),文件的最近一次读取时间(atime),文件的最近一次修改时间(mtime),文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。每个inode默认固定大小为128bytes。

  • filesystem description:描述了每个block group的开始于结束的block号码

  • block bitmap:记录了使用的和未使用的block号

  • inode bitmap:记录了使用的和未使用的inode号

可以通过dumpe2fs命令查看分区的详细信息,下图为部分内容。

2.2 Linux 常见文件系统

文件系统描述
extLinux 中最早的文件系统,由于在性能和兼容性上具有很多缺陷,现在已经很少使用
ext2是 ext 文件系统的升级版本,Red Hat Linux 7.2 版本以前的系统默认都是 ext2 文件系统。于 1993 年发布,支持最大 16TB 的分区和最大 2TB 的文件
ext3是 ext2 文件系统的升级版本,最大的区别就是带日志功能,以便在系统突然停止时提高文件系统的可靠性。支持最大 16TB 的分区和最大 2TB 的文件
ext4是 ext3 文件系统的升级版。ext4 在性能、伸缩性和可靠性方面进行了大量改进。ext4的变化可以说是翻天覆地的,比如向下兼容 ext3、最大 1EB 文件系统和 16TB 文件、无限数量子目录、Extents 连续数据块概念、多块分配、延迟分配、持久预分配、快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等。它是 CentOS 6.x 的默认文件系统
xfsXFS 最早针对 IRIX 操作系统开发,是一个高性能的日志型文件系统,能够在断电以及操作系统崩溃的情况下保证文件系统数据的一致性。它是一个 64 位的文件系统,后来进行开源并且移植到了 Linux 操作系统中,目前 CentOS 7.x 将 XFS+LVM 作为默认的文件系统。据官方所称,XFS 对于大文件的读写性能较好
swapswap 是 Linux 中用于交换分区的文件系统(类似于 Windows 中的虚拟内存),当内存不够用时,使用交换分区暂时替代内存。一般大小为内存的 2 倍,但是不要超过 2GB。它是 Linux 的必需分区
NFSNFS 是网络文件系统(Network File System)的缩写,是用来实现不同主机之间文件共享的一种网络服务,本地主机可以通过挂载的方式使用远程共享的资源
iso9660光盘的标准文件系统。Linux 要想使用光盘,必须支持 iso9660 文件系统
fat就是 Windows 下的 fat16 文件系统,在 Linux 中识别为 fat
vfat就是 Windows 下的 fat32 文件系统,在 Linux 中识别为 vfat。支持最大 32GB 的分区和最大 4GB 的文件
NTFS就是 Windows 下的 NTFS 文件系统,不过 Linux 默认是不能识别 NTFS 文件系统的,如果需要识别,则需要重新编译内核才能支持。它比 fat32 文件系统更加安全,速度更快,支持最大 2TB 的分区和最大 64GB 的文件
ufsSun 公司的操作系统 Solaris 和 SunOS 所采用的文件系统
procLinux 中基于内存的虚拟文件系统,用来管理内存存储目录/proc
sysfs和 proc 一样,也是基于内存的虚拟文件系统,用来管理内存存储目录/sysfs
tmpfs也是一种基于内存的虚拟文件系统

三、常用的硬盘管理命令

3.1 df 命令

df 命令,用于显示 Linux 系统中各文件系统的硬盘使用情况,包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等。前面讲过,与整个文件系统有关的数据,都保存在 **Super block(超级块)**中,而 df 命令主要读取的数据几乎都针对的是整个文件系统,所以 df 命令主要是从各文件系统的 Super block 中读取数据。

df 命令的基本格式为:

[root@localhost ~]# df [选项] [目录或文件名]
选项:
-a 显示特殊文件系统,这些文件系统几乎都是保存在内存中的。如/proc,因为是挂载在内存中,所以占用量都是 0 
-h 单位不再只用 KB,而是换算成习惯单位
-T 多出了文件系统类型一列
-m 以 MB 为单位显示容量
-k 以 KB 为单位显示容量,默认以 KB 为单位
-i 不用硬盘容量显示,而是以含有 inode 的数量来显示

3.2 du 命令

du 命令是统计目录或文件所占磁盘空间大小的命令。

**注意:**使用ls命令是可以看到文件的大小的。但是ls命令査看目录大小时,目录的大小多数是 4KB或者是4KB的倍数,这是因为目录下的子目录名和子文件名是保存到父目录的 block(默认大小为 4KB)中,如果父目录下的子目录和子文件并不多,一个 block 就能放下,那么这个父目录就只占用了一个 block 大小。所以ls命令无法查看准确的目录大小。

我们在统计目录时,不是想看父目录下的子目录名和子文件名到底占用了多少空间,而是想看父目录下的子目录和子文件的总磁盘占用量大小,这时就需要使用 du 命令才能统计目录的真正磁盘占用量大小。

du 命令的基本格式为:

[root@localhost ~]# du [选项] [目录或文件名]
选项:
-a 显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
-h 使用习惯单位显示磁盘占用量,如 KBMBGB-s 统计总占用量,而不列出子目录和子文件的占用量

3.3 du 与 df 的区别

df命令是用于统计空间大小的,统计的剩余空间是准确的。

du命令是用于统计文件大小的,统计的文件大小是准确的。

3.4 fsck 命令

计算机难免会由于某些系统因素或人为误操作(突然断电)出现系统异常,这种情况下非常容易造成文件系统的崩溃,严重时甚至会造成硬件损坏。如果真出现了文件系统损坏的情况,对于一些小问题,使用 fsck 命令就可以解决。

fsck 命令用于检查文件系统并尝试修复出现的错误。在系统开机时会自动执行,该命令的基本格式如下:

[root@localhost ~]# fsck [选项] [分区设备文件名]
选项:
-a:自动修复文件系统,没有任何提示信息。
-y:自动修复,和 -a 作用一致,不过有些文件系统只支持 -y。
-f:强制检测,一般 fsck 命令如果没有发现分区有问题,则是不会检测的。如果强制检测,那么不管是否发现问题,都会检测。
-t:文件系统类型:指定要检查的文件系统类型。
-C:显示检查分区的进度条。

**注意:**在使用 fsck 命令修改某文件系统时,这个文件系统对应的磁盘分区一定要处于卸载状态,磁盘分区在挂载状态下进行修复是非常不安全的,数据可能会遭到破坏,也有可能会损坏磁盘。

3.5 dumpe2fs 命令

dumpe2fs 命令用来查看文件系统的详细信息,此命令的基本格式如下:

[root@localhost ~]# dumpe2fs [选项] 文件名
选项:
-h 仅列出 superblock(超级块)的数据信息

省略部分内容...

以上信息大致可分为 2 部分。前半部分显示的是超级块的信息,包括文件系统名称、已使用以及未使用的 inode 和 block 的数量、每个 block 和 inode 的大小,文件系统的挂载时间等。后半部分显示的是每个区块群组的详细信息(如 Group0、Group1),每个区块群组都有独立的 inode/block/superblock 系统。

3.6 stat 命令

stat命令用于查看文件的详细信息,其命令格式如下。

[root@localhost ~]# stat [选项] 文件名
选项:
-f:显示文件系统而非文件状态
-t: 以简洁方式输出信息

3.7 判断文件类型

判断文件类型:file 文件名

判断命令类型:type 命令名

四、硬盘分区

4.1 fdisk 命令

如果新添加了一块硬盘,想要正常使用,难道需要重新安装操作系统才可以分区吗?当然不是,在 Linux 中有专门的分区命令 fdisk 和 parted。其中 fdisk 命令较为常用,但不支持大于 2TB 的分区;如果需要支持大于 2TB 的分区,则需要使用 parted 命令,当然 parted 命令也能分配较小的分区。

fdisk 命令的格式如下:

[root@localhost ~]# fdisk ~l
#列出系统分区
[root@localhost ~]# fdisk 设备文件名(分区还没有分区号)
#给硬盘分区

使用 "fdisk -l" 查看分区信息,能够看到添加的硬盘(/dev/sda )的信息。其上半部分态是硬盘的整体状态,/dev/sda 硬盘的总大小是 21.5 GB,共有 2610 个柱面,每个柱面由 255 个磁头读/写数据,每个磁头管理 63 个扇区。每个柱面的大小是 8225280 Bytes,每个扇区的大小是 512 Bytes。

信息的下半部分是分区的信息,共 7 列,含义如下:

  • Device:分区的设备文件名。
  • Boot:是否为启动引导分区,在这里 /dev/sda1 为启动引导分区。
  • Start:起始柱面,代表分区从哪里开始。
  • End:终止柱面,代表分区到哪里结束。
  • Blocks:分区的大小,单位是 KB。
  • id:分区内文件系统的 ID。在 fdisk 命令中,可以 使用 "l" 查看。
  • System:分区内安装的系统是什么。

**注意:**千万不要在当前的硬盘上尝试使用 fdisk命令进行分区,这会完整删除整个系统,一定要再找一块硬盘,或者使用虚拟机。

4.2 fdisk 命令手工分区

4.2.1:查看分区

fdisk -l,查看系统所有硬盘及分区

4.2.2:确定分区设备名

fdisk /dev/sdb ,进行磁盘分区(/dev/sdb为例)

在 fdisk 交互界面中输入 m 可以得到帮助,帮助里列出了 fdisk 可以识别的交互命令,命令解释如下。

命令说明
a设置可引导标记
b编辑 bsd 磁盘标签
c设置 DOS 操作系统兼容标记
d删除一个分区
l显示已知的文件系统类型。82 为 Linux swap 分区,83 为 Linux 分区
m显示帮助菜单
n新建分区
o建立空白 DOS 分区表
p显示分区列表
q不保存退出
s新建空白 SUN 磁盘标签
t改变一个分区的系统 ID
u改变显示记录单位
v验证分区表
w保存退出
x附加功能(仅专家)

4.2.3:新建分区

分主分区:n---p 主----1 分区号----1 起始柱面-----分区大小+100M-----w

分扩展分区:n---e 扩展---2 分区号---124 起始柱面----1024 柱面(所有剩余空间都分配给扩展分区)

分逻辑分区:n---l 逻辑---不用指定分区号---124 起始柱面----+100M(指定大小)-----w

注意:有时因为系统的分区表正忙,则需要重新启动系统之后才能使新的分区表生效。

Command (m for help): w 
#保存退出
The partition table has been altered!
    
Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 

Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot. 
#要求重启动,才能格式化
Syncing disks.

4.2.4:格式化

格式化,建立文件系统,ext3 是 linux 默认文件系统。

mkfs -t ext4 /dev/sdb1(将/dev/sdb1设备分区格式化为ext4文件系统)

mkfs -t ext4 /dev/sdb5(将/dev/sdb5设备分区格式化为ext4文件系统)

mkfs 命令非常简单易用,不过是不能调整分区的默认参数的(比如块大小是 4096),这些默认参数除非特殊情况,否则不需要调整,如果想要调整就需要使用 mke2fs 命令进行重新格式化,命令格式如下:

[root@localhost ~]# mke2fs [选项] 分区设备文件名
选项:
-t 文件系统: 指定格式化成哪个文件系统,如 ext2,ext3,ext4
-b 字节: 指定 block 块的大小
-i 字节: 指定“字节/inode”的比例,也就是多少个字节分配一个 inode
-j: 建立带有 ext3 日志功能的文件系统
-L 卷标名: 给文件系统设置卷标名,就不使用 e2label 命令设定了
举个例子:
[root@localhost ~]# mke2fs -t ext4 -b 2048 /dev/sdb6 
#格式化分区,并指定 block 的大小为 2048

4.2.5:建立挂载点

mkdir /disk1-----------------对应/dev/sdb1 (把 sdb1 挂载到/disk1 目录中)

mkdir /disk5----------------对应/dev/sdb5 (把 sdb5 挂载到/disk5 目录中)

4.2.6:挂载

mount /dev/sdb1 /disk1

mount /dev/sdb5 /disk5

4.2.7:查看

mount :查看所有已经挂载的分区和光盘

fdisk -l :查看系统分区

df :查看分区占用百分比

4.2.8:自动挂载

前面把两个分区都挂载了,但是重启之后又没了,需要修改分区自动挂载文件/etc/fstab,使分区在系统开机的时候就自动挂载。注意u盘,光盘等移动硬盘禁止设置为自动挂载,系统开机的时候找不到对应的设备分区名将导致其无法正常开机。

  • 第一列: 设备文件名
  • 第二列:挂载点
  • 第三列:文件系统
  • 第四列:挂载选项
  • 第五列:是否可以被备份
    • 0:不备份
    • 1:每天备份
    • 2:不定期备份
  • 第六列:是否检测磁盘 fsck
    • 0:不检测
    • 1:启动时检测
    • 2:启动后检测

**注意:**也可以使用 UUID 进行挂载,UUID(硬盘通用唯一识别码,可以理解为硬盘的 ID) 这个字段在 CentOS 5.5 的系统当中是写入分区的卷标名或分区设备文件名的,现在变成了硬盘的 UUID。这样做的好处是当硬盘增加了新的分区,或者分区的顺序改变,再或者内核升级后,任然能够保证分区能够正确的加载,而不至于造成启动障碍。

查看每个分区的 UUID 方式一:

查看每个分区的 UUID 方式二:

4.2.9:重启测试

重启测试或者使用mount -a 重新挂载所有内容进行测试是否自动挂载成功。

4.3 parted 命令

Linux 系统中有两种常见的分区表 MBR 分区表(主引导记录分区表)和 GPT 分区表(GUID 分区表),其中:

  • MBR 分区表:支持的最大分区是 2TB(1TB=1024GB);最多支持 4 个主分区,或 3 个主分区 1个扩展分区。

  • GPT 分区表:支持最大 18EB 的分区(1EB=1024PB=1024*1024TB);最多支持 128 个分区,其中 1 个系统保留分区,127 个用户自定义分区。

虽然可以使用 fdisk命令对硬盘进行快速的分区,但对高于 2TB 的硬盘分区,此命令却无能为力,此时就需要使用 parted 命令。不过 parted 命令也有点小问题,就是命令自身分区的时候只能格式化成 ext2 文件系统,不支持ext3 文件系统,更不用说 ext4 文件系统了(截止到 CentOS 6.8 还是这样,这里只是指不能用parted 命令把分区格式化成 ext4 文件系统,但是 parted 命令还是可以识别 ext4 文件系统的)。不过影响不大,可以先分区再用 mkfs 进行格式化。

parted 命令是可以在命令行直接分区和格式化的,不过 parted 交互模式才是更加常用的命令方式,进入交互模式的方法如下:

[root@localhost ~]# parted 硬盘设备文件名
#进入交互模式

例如:

[root@localhost ~]# parted /dev/sdb
#继续划分/dev/sdb 硬盘
GNU Parted 2.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)   <--parted 的等待输入交互命令的位置,输入 help,可以看到在交互模式下支持的所有命令
parted 交互命令说明
check NUMBER做一次简单的文件系统检测
cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER复制文件系统到另外一个分区
help [COMMAND]显示所有的命令帮助
mklabel,mktable LABEL-TYPE创建新的磁盘卷标(分区表)
mkfs NUMBER FS-TYPE在分区上建立文件系统
mkpart PART-TYPE [FS-TYPE] START END创建一个分区
mkpartfs PART-TYPE FS-TYPE START END创建分区,并建立文件系统
move NUMBER START END移动分区
name NUMBER NAME给分区命名
print [devices|free|list,all|NUMBER]显示分区表,活动设备,空闲空间,所有分区
quit退出
rescue START END修复丢失的分区
resize NUMBER START END修改分区大小
rm NUMBER删除分区
select DEVICE选择需要编辑的设备
set NUMBER FLAG STATE改变分区标记
toggle [NUMBER [FLAG]]切换分区表的状态
unit UNIT设置默认的单位
Version显示版本

4.4 parted 命令手工分区

4.4.1 查看分区

(parted) print
#进入print指令
Model: VMware, VMware Virtual S (scsi)
#硬盘参数,是虚拟机
Disk/dev/sdb: 21.5GB
#硬盘大小
Sector size (logical/physical): 512B/512B
#扇区大小
Partition Table: msdos
#分区表类型,是MBR分区表
Number Start End Size Type File system 标志
1 32.3kB 5379MB 5379MB primary
2 5379MB 21.5GB 16.1GB extended
5 5379MB 7534MB 2155MB logical ext4
6 7534MB 9689MB 2155MB logical ext4
#看到了我们使用fdisk命令创建的分区,其中1分区没被格式化;2分区是扩展分区,不能被格式化

使用 print 命令可以査看分区表信息,包括硬盘参数、硬盘大小、扇区大小、分区表类型和分区信息。分区信息共有 7 列,分别如下:

**1.**Number:分区号,比如,1号就代表 /dec/sdb1;

**2.**Start:分区起始位置。这里不再像 fdisk 那样用柱面表示,使用字节表示更加直观;

**3.**End:分区结束位置;

**4.**Size:分区大小;

**5.**Type:分区类型,有 primary、extended、logical 等类型;

**6.**Filesystem:文件系统类型;

**7.**标志:分区的标记。

4.4.2 修改成 GPT 分区表

(partcd) mklabel gpt
#修改分区表命令
警告:正在使用/dev/sdb上的分区。由于/dev/sdb分区已经挂载,所以有警告。注意,如果强制修改,那么原有分区及数据会消失
忽略/Ignore/放弃/Cancel? ignore
#输入ignore忽略报错
警告:The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?/Yes//No? yes
#输入 yes
警告:WARNING: the kernel failed to re-read the partition table on /dev/sdb (设 备或资源忙).As a result, it may not reflect all of your changes until after reboot.
#下次重启后才能生效
(parted) print
#查看一下分区表
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
#分区表已经变成 GPT
Number Start End Size File system Name 标志
#所有的分区都消失了

修改了分区表,如果这块硬盘已经有分区了,那么原有分区和分区中的数据都会消失,而且需要重启系统才会生效。转换分区表的目的是为了支持大于 2TB 的分区,如果分区并没有大于 2TB,那么这步是可以不执行的。

**注意:**一定要把/etc/fstab文件中和原有分区的内容删除掉,才能重启动。要不系统启动就一定会报错的。

4.4.3 建立分区

因为修改过了分区表,所以/dev/sdb 中的所有数据都消失了,所以可以重新对这块硬盘分区。不过建立分区时,默认文件系统就只能建立成 ext2 了,命令如下:

(parted)mkpart
#输入创建分区命令,后面不要参数,全部靠交互
指定
分区名称? []?disk1
#分区名称,这里命名为disk 1
文件系统系统? [ext2]?
#文件系统类型,直接回车,使用默认文件系统ext2
起始点? 1MB
#分区从1MB开始
结束点?5GB分区到5GB结束
#分区完成
(parted) print
#查看一下
Model: VMware, VMware Virtual S (scsi)
Disk/dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B 
Partition Table: gpt
Number Start End Size Rle system Name 标志
1 1049kB 5000MB 4999MB disk1
#分区1已经出现

现在的 print 查看的分区,和第一次查看 MBR 分区表的分区时有些不一样了,少了 Type 这个字段,也就是分区类型的字段,多了 Name 分区名字段。分区类型是标识主分区、扩展分区和逻辑分区的,不过这种标识只在 MBR 分区表中使用,现在已经变成了 GPT 分区表了,所以就不再有 Type 类型了。也就说主分区、扩展分区和逻辑分区的概念不再有用了。

4.4.4 建立文件系统

分区分完了,还需要格式化。不过如果使用 parted 交互命令格式化的话,只能格式化成 ext2 文件系统。这里演示下 parted 命令的格式化方法,所以文件系统就格式化成 ext2,命令如下:

(parted) mkfs
#格式化命令(很奇怪,也是mkfs,但是这只是parted的交互命令)
WARNING: you are attempting to use parted to operate on (mkfs) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs. We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
警告:The existing file system will be destroyed and all data on the partition will be lost. Do you want to continue?/Yes//No? yes
#警告你格式化丟失,没关系,已经丢失过了
分区编号? 1
文件系统类型 [ext2]?
#指定文件系统类型,写别的也没用,直接回车
(parted) print #格式化完成,查看一下
Model: VMware, VMware Virtual S (scsi)
Disk/dev/sdb: 21,5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name标志
1 1049kB 5000MB 4999MB ext2 diski
#拥有了文件系统

如果要格式化成 ext4 文件系统,就使用 mkfs 命令(注意:不是 parted 交互命令中的 mkfs,而是系统命令 mkfs)。

[root@localhost ~]# mkfs -t ext4 /dev/sdb1

4.4.5 调整分区大小

parted 命令有一大优势,就是可以调整分区的大小(在 Windows 中也可以实现,不过要么需要转换成动态磁盘,要么需要依赖第三方工具)。起始 Linux 中 LVM 和 RAID 可以支持分区调整,这两种方法可以看成动态磁盘方法,使用 parted 命令调整分区更加简单。

**注意:**parted 调整已经挂载使用的分区时,是不会影响分区中的数据的,也就是说,数据不会丢失。但是一定要先卸载分区,再调整分区大小,否则数据是会出现问题的。另外,要调整大小的分区必须已经建立了文件系统(格式化),否则会报错。

命令如下:

(parted) resize
分区编号? 1
#指定要修改的分区编号
起始点? [1049kB]? 1MB
#分区起始位置
结束点? [5000MB]? 6GB
分区结束位置
(parted) print
#查看一下
Model: VMware, VMware Virtual S (scsi)
Disk/dev/sdb: 21,5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name标志
1 1049kB 6000MB 5999MB ext2 diski
#分区大小改变

4.4.6 删除分区

命令如下:
(parted) rm
#删除分区命令
分区编号? 1
#指定分区编号
(parted) print
#查看一下
Model: VMware, VMware Virtual S (scsi)
Disk/dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name 标志 
#分区消失

**注意:**parted 中所有的操作都是立即生效的,没有保存生效的概念。这一点和 fdisk 交互命令明显不同,所以做的所有操作时要时刻注意。

4.5 分配 swap 分区

4.5.1 分配 swap 分区

新建分区后(参考fdisk命令手工分区新建分区),并修改为 swap 分区 ID。

[root@localhost ~]# fdisk /dev/sdb
#拿/dev/sdb 分区
Command (m for help): t 
#修改分区的系统 ID
Selected partition 1 
#只有一个分区,所以不用选择分区了
Hex code (type L to list codes): 82 
#改为 swap 的 ID
Changed system type of partition 1 to 82 (Linux swap / Solaris)
[root@localhost ~]# mkswap /dev/sdb1 
Setting up swapspace version 1, size = 522076 KiB
no label, UUID=c3351dc3-f403-419a-9666-c24615e170fb

4.5.2 格式化 swap 分区

[root@localhost ~]# swapon 分区设备文件名
例:
[root@localhost ~]# swapon /dev/sdb1

4.5.3 自动挂载 swap 分区

修改/etc/fstab文件,增加如下内容。

/dev/sdb1 swap swap defaults 0 0 
#加入新 swap 分区的相关内容,这里是直接使用的分区的设备文件名,大家当然也可以
#使用 UUID 号了。