Loading

Linux文件系统初识及fdisk、parted分区工具使用

核心内容:

  • 文件系统类型和操作方法
  • 磁盘分区及分区工具(fdisk、parted)的使用

文件系统

文件系统概述

从用户逻辑的角度理解文件系统,文件系统是Linux下的所有文件和目录的集合,这些文件和目录结构是以一个树状的结构来组织的,这个树状结构构成了Linux的文件系统。

Linux下常用的文件系统类型

Ext3与Ext4文件系统:

Ext4(Fourth Extended Filesystem,缩写为Ext4)是第四代扩展文件系统是Linux系统下的日志文件系统,是Ext3文件系统的后继版本,Ext3目前只支持32,000个子目录,而Ext4支持无限数量的子目录。

  • Ext4的文件系统容量可达1EB,文件大小可达16TB
  • Ext3的文件系统容量可达32TB,文件大小可达2TB
XFS文件系统:

XFS一种高性能的日志文件系统,最早于1993年,由Silicon Graphics为他们的IRIX操作系统而开发,是IRIX 5.3版的默认文件系统。2000年5月,Silicon Graphics以GNU通用公共许可证发布这套系统的源代码,之后被移植到Linux 内核上。XFS 特别擅长处理大文件,同时提供平滑的数据传输。

它可以支持上百万T字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大小为9 EB,最大文件系统尺寸为18 EB。

文件系统的使用方法

  • 在硬盘上创建分区
  • 在分区上建立文件系统
  • 在需要时或系统启动时挂装文件系统到系统中
  • 使用后或关机时卸装文件系统

分区

  • 分区是将一个物理驱动器分成若干个逻辑驱动器,可以把硬盘连续的区块当做一个独立的磁盘使用。
  • 分区表是一个硬盘分区的索引,分区的信息都会写进分区表。

分区的作用

  • 防止数据丢失
  • 增加磁盘空间使用效率
  • 数据激增到极限不会引起系统挂起

硬盘分区

分区类型:主分区、拓展分区、逻辑分区

早期的MBR分区模式中,主分区数量 + 拓展分区数量 ≤ 4,原因:

  • 在基本磁盘里的分区表(DPT)中,有64个字节(1BEH~1FDH)来描述分区,在这64字节中版,描述一个权分区的属性需要16个字节,因此只能容纳四个主分区的记录,因此也只能创建四个主分区。如果需要创建更多分区,可以将第四个分区创建为扩展分区(一种能容纳多个逻辑分区的主分区)。

而时下常用的则是GPT分区模式,它的优点如下:

  • 支持2TB以上的大硬盘。
  • 每个磁盘的分区个数几乎没有限制。为什么说“几乎”呢?是因为Windows系统最多只允许划分128个分区。不过也完全够用了。
  • 分区大小几乎没有限制。又是一个“几乎”。因为它用64位的整数表示扇区号。夸张一点说,一个64位整数能代表的分区大小已经是个“天文数字”了,若干年内你都无法见到这样大小的硬盘,更不用说分区了。
  • 分区表自带备份。在磁盘的首尾部分分别保存了一份相同的分区表。其中一份被破坏后,可以通过另一份恢复。
  • 每个分区可以有一个名称(不同于卷标)。

分区工具使用

实验环境说明:

物理机配置 Intel i9 9900KF RAM:32GB

虚拟机工具 VMWare WorkStation Pro 15.5.2 build-15785246

Linux版本 CentOS Linux release 7.3.1611 (Core) 1C2G 配置

远程连接工具 FinalShell 3.7.6

使用fdisk对存储设备进行分区

首先,我们为虚拟机添加一块SCIS类型的硬盘,大小为10~20G即可。

image-20201028135547323

接着,启动或重启虚拟机,接着使用命令lsblk列出所有可用块设备的信息,还能显示他们之间的依赖关系。

image-20201028135931600

这里可以看到sdb即为新添加的SCSI硬盘,接着,我们使用命令fdisk /dev/sdb对该硬盘进行分区。fdisk提供了一个交互式分区方式,每一步只需跟着指令即可。

fdisk常用命令参数:
    p:打印分区表.
    n:新建一个新分区.
    d:删除一个新分区.
    q:退出不保存.
    w:保存退出.

image-20201028143052927

Partition type中输入p即可开始创建主分区。由于这块磁盘目前为MBR分区模式,所以\(主分区数+拓展分区数≤4\),分区号仅为1-4

[root@18102040217-lzx-master ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):# n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):# p
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):#
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):# +5G
分区 1 已设置为 Linux 类型,大小设为 5 GiB

根据上述提示,我们已经完成了主分区的划分,大小为5GB,此时分区信息还未更新到磁盘,需输入w才能保存分区效果,我们也可以等拓展分区分完后再写入。

命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e
分区号 (2-4,默认 2):
起始 扇区 (10487808-41943039,默认为 10487808):
将使用默认值 10487808
Last 扇区, +扇区 or +size{K,M,G} (10487808-41943039,默认为 41943039):
将使用默认值 41943039
分区 2 已设置为 Extended 类型,大小设为 15 GiB

至此,我们将主分区与拓展分区均已划分完成,接下来我们将划分逻辑分区。

命令(输入 m 获取帮助):# n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): # l
添加逻辑分区 5
起始 扇区 (10489856-41943039,默认为 10489856):
将使用默认值 10489856
Last 扇区, +扇区 or +size{K,M,G} (10489856-41943039,默认为 41943039):# +6G
分区 5 已设置为 Linux 类型,大小设为 6 GiB

命令(输入 m 获取帮助):# n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p):# l
添加逻辑分区 6
起始 扇区 (23074816-41943039,默认为 23074816):
将使用默认值 23074816
Last 扇区, +扇区 or +size{K,M,G} (23074816-41943039,默认为 41943039):
将使用默认值 41943039
分区 6 已设置为 Linux 类型,大小设为 9 GiB

完成分区后,不要忘记w指令,保存分区结果。

命令(输入 m 获取帮助):# w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

再次使用lsblk命令时,我们可以看到块设备下的新的从属关系。

image-20201028144213767

接下来,我们需要对分区进行格式化和挂载。我们可以都把他们格式化为Ext4类型,格式化的过程是全自动的。我们先把主分区格式化为Ext4格式。

[root@18102040217-lzx-master ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

接下来,我们再把两个逻辑分区格式化为Ext4格式。

[root@18102040217-lzx-master ~]# mkfs.ext4 /dev/sdb5
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
393216 inodes, 1572864 blocks
78643 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1610612736
48 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

[root@18102040217-lzx-master ~]# mkfs.ext4 /dev/sdb6
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
589824 inodes, 2358528 blocks
117926 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2151677952
72 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

最后,我们在/mnt目录下创建三个挂载点,用mount命令进行对格式化好的分区进行手动挂载即可。

[root@18102040217-lzx-master ~]# mkdir /mnt/disk1 /mnt/disk2 /mnt/disk3
[root@18102040217-lzx-master ~]# mount /dev/sdb1 /mnt/disk1
[root@18102040217-lzx-master ~]# mount /dev/sdb5 /mnt/disk2
[root@18102040217-lzx-master ~]# mount /dev/sdb6 /mnt/disk3

如果我们需要自动挂载,我们需要更新/etc/fstab挂载文件。

[root@18102040217-lzx-master ~]# echo "/dev/sdb1 /mnt/disk1 ext4 defaults 0 0" >> /etc/fstab
[root@18102040217-lzx-master ~]# echo "/dev/sdb5 /mnt/disk2 ext4 defaults 0 0" >> /etc/fstab
[root@18102040217-lzx-master ~]# echo "/dev/sdb6 /mnt/disk3 ext4 defaults 0 0" >> /etc/fstab

reboot重启以后,在\(FinalShell\)右侧也可以看到挂载点的可用空间。

image-20201028194122828

使用parted对存储设备进行分区

Linux系统中有两种常见的分区表,除了MBR分区表(主引导记录分区表),还有GPT分区表(GUID分区表)。

如果我需要改变一块硬盘的分区表类型,就需要使用parted工具。

首先,先向虚拟机中添加一块20GB的SCIS类型的硬盘。虚拟机开机后,使用lsblk命令可以看到新的块设备。

image-20201028200001491

使用命令parted /dev/sdc进入parted的交互界面。

[root@18102040217-lzx-master ~]# parted /dev/sdc
GNU Parted 3.1
使用 /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print                                                            
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start  End  Size  Type  File system  标志

可以看到磁盘默认的分区表类型,为msdos,即MBR模式。在交互模式下,我们可以用mklabel [分区表类型]修改硬盘分区表的类型。执行完成后,在使用print命令,可以看到分区表类型变为GPT模式了。

(parted) # mklabel gpt
警告: The existing disk label on /dev/sdc will be destroyed and all data on this disk will be lost. Do you want to continue?
是/Yes/否/No? # yes                                                         
(parted) print                                                            
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  标志

(parted) 

parted交互模式下,也提供了分区的方法,即mkpart。接下来我们将使用parted分出一个名称为disk1、文件系统类型为Ext4、大小为5GB的分区。

(parted) # mkpart                                                           
分区名称?  []? # disk1                                                     
文件系统类型?  [ext2]? # ext4                                              
起始点? 10MB                                                              
结束点? 5GB                                                              
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name   标志
 1      10.5MB  5000MB  4989MB  ext4         disk1

parted交互式分区命令完成后,将自动写入磁盘,无需保存,这点有别于fdisk。完成分区后,我们需要对他们进行格式化和挂载,这点同上,这里就不再赘述。

如果我们删除某一分区,我们可以在交互式下使用rm命令。

(parted) # print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name   标志
 1      10.5MB  5000MB  4989MB  ext4         disk1
 2      5000MB  15.0GB  10.0GB  ext4         disk2


(parted) rm 1                                                             
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name   标志
 2      5000MB  15.0GB  10.0GB  ext4         disk2

如果我们需要调整某一分区的大小,我们可以在交互式下使用resize命令。(注:CentOS 7 下进入 parted 里面找不到 resize 的功能 (显示 parted 3.0 已经将功能移除了)。)

推荐的方案是:用 parted(resizepart) + resize2fs进行分区缩放。以下实例是将/dev/sdc2分区从10GB扩大到15GB

[root@18102040217-lzx-master ~]# parted /dev/sdc
GNU Parted 3.1
使用 /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name   标志
 2      5000MB  15.0GB  10.0GB               disk2

(parted) resizepart                                                     
分区编号? 2                                                             
结束点?  [15.0GB]? 20GB 

(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name   标志
 2      5000MB  20.0GB  15.0GB  ext4         disk2
(parted) q                                                                
信息: You may need to update /etc/fstab.

[root@18102040217-lzx-master ~]# resize2fs /dev/sdc2                      
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/sdc2 to 3662204 (4k) blocks.
The filesystem on /dev/sdc2 is now 3662204 blocks long.

[root@18102040217-lzx-master ~]# e2fsck -f /dev/sdc2
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/sdc2: 11/912128 files (0.0% non-contiguous), 100276/3662204 blocks

接下来,我们可以尝试一下把扩大的分区挂载至/mnt/disk4目录下,并在下面创建一个test.txt文件。

[root@18102040217-lzx-master ~]# mount /dev/sdc2 /mnt/disk4
[root@18102040217-lzx-master ~]# echo "It's a test file." >> /mnt/disk4/test.txt
[root@18102040217-lzx-master ~]# cat /mnt/disk4/test.txt 
It's a test file.

接下来,我们将分区缩小至8GB,看一下文件是否会损坏。

[root@18102040217-lzx-master ~]# umount /dev/sdc2 # 取消挂载
[root@18102040217-lzx-master ~]# parted /dev/sdc
GNU Parted 3.1
使用 /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) resizepart                                                       
分区编号? 2                                                              
结束点?  [20.0GB]? 13GB                                                  
警告: Shrinking a partition can cause data loss, are you sure you want to continue?

可以看到直接使用resizepart进行压缩分区会导致数据丢失,parted已经进行警告,这里我就不继续操作了。

posted @ 2020-10-28 21:28  上海井盖王  阅读(177)  评论(0)    收藏  举报