CentOS 硬盘管理实践

硬盘管理,这里指的是硬盘的分区、格式化、挂载、卸载等。本文仅针对Linux平台,并以CentOS为示例。

 

一. 前言:MBR与GPT

MBR意为Master Boot Record,即主引导记录,是传统的分区机制,有时也称其为MS-DOS分区表。

GPT意为GUID Partition Table,即全局唯一标识分区表,是一个较新的分区机制。

 

正如UEFI取代了BIOS一样,GPT也将逐步取代MBR,因为MBR的一些特性已经跟不上时代了,如:

 

硬盘容量的限制:

MBR最大仅支持2T的硬盘,超过2T的硬盘仅能利用其中的2T,而GPT最大能支持到18EB的容量(1EB=1024PB,1PB=1024TB)。

 

硬盘分区数目的限制:

MBR对分区数量有较多限制,一个硬盘至少1个主分区,至多4个,扩展分区可以没有,最多1个,且主分区+扩展分区的总数不能超过4个,逻辑分区建立在扩展分区之上,所有逻辑分区都是扩展分区的一部分,可以有若干个。

而GPT不区分主分区、扩展分区、逻辑分区,分区个数几乎没有限制(Windows系统下最多只允许划分128个分区)。

 

安全性:

MBR将所有的分区信息都放在0号扇区的64个字节中,一旦损坏所有的分区信息都不能读出来了。为了降低分区表损坏的风险,GPT在硬盘最后也保存了一份分区表副本,这就使得即使起始处的分区表被破坏也能够还原。

......

 

二. parted介绍

对于分区管理,我们首先想到的是fdisk命令,但本文将要使用到的是另一个分区管理工具parted。

为什么不是fdisk,而是parted,因为fdisk支持的是MBR/MS-DOS分区表,正如本文第一部分所述,MBR已经过时了,因此对于分区工具,我们将要使用的是支持GPT的parted。对比fdisk来说,parted是一个更高级的工具,除了支持包括GPT在内的更多的分区表类型,parted还允许调整分区大小。

 

1. 安装parted

大部分Linux发行版已经默认安装了parted,如果没有,可执行以下命令进行安装:

yum install parted

 

2. parted的使用

用法概要

parted [options] [device [command [options...]...]]

 

描述

parted是对磁盘进行分区和调整分区大小的程序。通过它可以创建、销毁、移动和复制ext2、linux-swap、FAT、FAT32和reiserfs等分区以及调整其大小。它可以创建和移动Macintosh HFS分区并调整其大小,还可以检测jfs、ntfs、ufs和xfs分区。它非常适用于为新操作系统创建空间、重新组织磁盘使用量以及将数据复制到新的硬盘。

本手册页只是parted的简要说明,且未必与最新版本的parted一致。完整的parted文档以“GNU Info”格式随软件包一起提供。

 

parted通过一组顶级选项和一组子命令实现的,它们中的大多数都具有自己的选项和操作数。下面描述了这些子命令。

 

parted具有一个可选操作数:

device

要使用的块设备。如果未指定,parted将使用它找到的第一个块设备。

 

如果在不使用参数的情况下调用parted,该程序会显示命令提示。

 

parted支持以下选项:

–a alignment-type, --align alignment-type

为新创建的分区设置对齐。有效的对齐类型包括:

 

none

使用磁盘类型所允许的最小对齐。

 

cylinder

将分区对齐到柱面。

 

minimal

使用磁盘拓扑信息提供的最小对齐。该值和opt值将使用磁盘提供的布局信息,将逻辑分区表地址对齐到磁盘上的实际物理块。min值是将分区正确对齐到物理块所需的最小对齐,这可避免性能降低。

 

optimal

使用磁盘拓扑信息提供的最佳对齐。此值可在保证最佳性能的情况下对齐到物理块大小的倍数。

 

–h,--help

显示帮助消息。

 

–l,--list

列出所有块设备上的分区布局。

 

–m,--machine

显示计算机可解析的输出。

 

–s,--script

从不提示用户介入,以脚本方式运行。

 

–v,--version

显示版本号。

 

parted子命令:

如果在parted命令行中忽略某个子命令,该实用程序将给出一个命令提示符。

 

check partition

对partition进行简单检查。

 

cp [source-device] source dest

将source-device如果未指定其他设备,则为当前设备)上的源分区的文件系统复制到当前设备上的dest分区。

 

help command

显示一般帮助,或有关某个命令的帮助(如果指定命令)。

 

mkfs partition fs-type

在分区上创建文件系统fs-type。fs-type 可以是 fat16、fat32、ext2、linux-wap或reiserfs其中之一。

 

mklabel label-type

创建一个类型为label-type的新磁盘标签(分区表)。label-type应该是bsd、dvh、gpt、loop、mac、msdos、pc98或sun其中之一。

 

mkpart part-type [fs-type] start end

创建一个文件系统为fs-type(如果指定)的part-type分区,以start开始,以end结束(缺省情况下,以兆字节为单位)。fs-type 可以是 fat16、fat32、ext2、HFS、linux-swap、NTFS、reiserfs 或 ufs 其中之一。分区表为MBR时,part-type 应该是primary、logical 或 extended其中之一,分布表为GPT时,part-type实为part-name,可相对自由地设定。

 

mkpartfs part-type fs-type start end

创建一个文件系统为fs-type的part-type分区,以start开始,以end结束(缺省情况下,以兆字节为单位)。

不建议使用此子命令。相反,应使用 mkpart 创建空分区,然后使用诸如 mke2fs(8)(Linux 的一部分)等外部工具创建文件系统。

 

move partition start end

移动分区,使其以start开始,以end结束。请注意,move永远不会更改从设备号。

 

name partition name

将分区名称设置为name。此选项仅适用于Mac、PC98和GPT磁盘标签。如有必要,可将名称放在引号中。

 

print

显示分区表。

 

quit

从parted退出。

 

rescue start end

挽救位于start和end之间的丢失的分区。如果找到一个分区,parted 将询问是否要在分区表中为其创建一个条目。

 

resize partition end

调整partition上文件系统的大小,使其以end结束。

 

rm partition

删除partition。

 

select device

选择device作为要编辑的当前设备。device通常应该是Solaris或Linux硬盘设备,但是如有必要,也可以是分区、软件raid设备或者SVM或LVM逻辑卷。

 

set partition flag state

将partition上的flag状态更改为state。支持的标志包括:boot、root、swap、hidden、raid、lvm、lba和palo。state应当是on(开启)或off(关闭)。

 

unit unit

将unit设置为显示位置和大小时使用的单位,以及在没有明确的单位后缀时,用于解释用户提供的位置和大小。unit可以是s(扇区)、B(字节)、kB、MB、GB、TB、%(设备大小的百分比)、cyl(柱面)、chs(柱面、磁头、扇区)或compact(对于输入为兆字节,对于输出为某种用户友好形式)其中之一。

 

version

显示版本信息和版权消息。

 

三. parted实践

1. 列出所有硬盘上的分区情况

[root@localhost ~]# parted -l

Model: ATA ST4000NM0033-9ZM (scsi)

Disk /dev/sda: 4001GB

Sector size (logical/physical): 512B/512B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system     Name                  Flags

 1      1049kB  211MB   210MB   fat16           EFI System Partition  boot

 2      211MB   735MB   524MB   xfs

 3      735MB   9057MB  8321MB  linux-swap(v1)

 4      9057MB  62.7GB  53.7GB  xfs

 5      62.7GB  4001GB  3938GB  xfs

 

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system  Name                          Flags

 1      17.4kB  16.8MB  16.8MB               Microsoft reserved partition  msftres

 2      16.8MB  2000GB  2000GB  ntfs         Basic data partition

 

结果显示,主机共有两块硬盘sda和sdb,sda是系统盘,sdb的文件系统是ntfs,这是我从一台windows上拆下来的,接下来我们就在这块硬盘上执行分区操作。

 

2. 硬盘分区

我们通常以交互模式使用parted,在交互模式中,parted能够以问询方式提示用户操作,使用比较方便。

 

2.1. 以交互模式启动parted

[root@localhost svndump]# parted

GNU Parted 3.2

Using /dev/sda

Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted)

 

启动后parted自动选择了/dev/sda这个硬盘,因为这是系统的第一个硬盘。

 

2.2. 选择要进行分区的硬盘

(parted) select /dev/sdb

Using /dev/sdb

 

2.3. 查看当前硬盘的分区情况

(parted) print                                                            

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system  Name                          Flags

 1      17.4kB  16.8MB  16.8MB               Microsoft reserved partition  msftres

 2      16.8MB  2000GB  2000GB  ntfs         Basic data partition

 

2.4. 重建分区表

a. 重建分区表的命令是mklabel,首先查看mklabel命令帮助

(parted) help mklabel

  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)

         LABEL-TYPE is one of: aix, amiga, bsd, dvh, gpt, mac, msdos, pc98, sun, loop

 

结果显示parted可以创建多种类型的分区表,包括最常见的msdos,即MBR分区表和gpt分区表。

 

b. 重建gpt分区表

这里我们重建类型为gpt的分区表。

(parted) mklabel gpt                                                     

Warning: 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                                                               

(parted)   

 

这里显示警告:重建分区表将销毁硬盘上的所有数据。

 

2.5. 执行分区

a. 创建分区的命令是mkpart,首先查看mkpart命令帮助

(parted) help mkpart

  mkpart PART-TYPE [FS-TYPE] START END     make a partition

 

         PART-TYPE is one of: primary, logical, extended

    FS-TYPE is one of: btrfs, nilfs2, ext4, ext3, ext2, fat32, fat16, hfsx, hfs+, hfs, jfs, swsusp, linux-swap(v1), linux-swap(v0), ntfs, reiserfs, hp-ufs, sun-ufs, xfs, apfs2, apfs1, asfs, amufs5, amufs4, amufs3, amufs2,

        amufs1, amufs0, amufs, affs7, affs6, affs5, affs4, affs3, affs2, affs1, affs0, linux-swap, linux-swap(new), linux-swap(old)

        START and END are disk locations, such as 4GB or 10%.  Negative values count from the end of the disk.  For example, -1s specifies exactly the last sector.

       

        'mkpart' makes a partition without creating a new file system on the partition.  FS-TYPE may be specified to set an appropriate partition ID.

 

说明:

mkpart命令的参数中,PART-TYPE指的是分区类型,即主分区,逻辑分区,扩展分区,但我们知道,gpt并没有区分分区类型,因此,在gpt分区中,其实这里指的是分区的名字,因此,我们可以自由设置该值,而不必局限于primary, logical, extended这3个取值。

 

mkpart命令的参数中,FS-TYPE指的是文件系统类型,但mkpart并不会针对去创建文件系统,因此这个参数实际上没有什么意义。

             

b. 执行分区

这里我们创建4个分区。

(parted) mkpart part1 0 500g                                              

Warning: The resulting partition is not properly aligned for best performance.

Ignore/Cancel? Ignore                       #这里提示分区没有对齐,影响性能,我们暂时选择忽略                             

(parted) mkpart part2 ext2 500g 1000g                                         

(parted) mkpart part3 ext3 1000g 1500g                                    

(parted) mkpart part4 xfs 1500g -1                         #这里-1表示第4个分区使用硬盘剩下的所有空间

 

c. 显示分区后sdb硬盘上的分区情况

(parted) print                                                            

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size   File system  Name   Flags

 1      17.4kB  500GB   500GB               part1

 2      500GB   1000GB  500GB               part2

 3      1000GB  1500GB  500GB               part3

 4      1500GB  2000GB  500GB               part4

 

2.6. 删除分区

假如我们对刚才的分区方案不满意,则可以重新调整分区,这里我们先将之前的分区删除掉。

 

a. 删除分区的命令是rm,查看rm命令帮助

(parted) help rm                                                          

  rm NUMBER                                delete partition NUMBER

 

         NUMBER is the partition number used by Linux.  On MS-DOS disk labels, the primary partitions number from 1 to 4, logical partitions from 5 onwards.

 

b. 删除分区

(parted) rm 4                                                             

(parted) rm 2   

 

c. 显示删除部分分区后sdb硬盘上的分区情况                                                    

(parted) print                                                            

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size   File system  Name   Flags

 1      17.4kB  500GB   500GB               part1

 3      1000GB  1500GB  500GB               part3

 

d. 删除剩余的分区

(parted) rm 3                                                            

(parted) rm 1    

 

e. 显示删除所有分区后sdb硬盘上的分区情况                                               

(parted) print                                                           

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start  End  Size  File system  Name  Flags

 

结果显示sdb硬盘上已经不存在分区了。

 

2.7. 重新执行分区

这次我们只创建3个分区。

 

a. 执行分区

(parted) mkpart part1 0 200GB                                            

Warning: The resulting partition is not properly aligned for best performance.

Ignore/Cancel? Cancel                                                     

 

这里收到了警告:分区没有对齐,不能发挥最佳性能。这次我们选择取消分区,然后使用0%代替0,这样parted将自动执行对齐操作,解决这一问题。

(parted) mkpart part1 0% 200GB 

 

继续执行分区:

(parted) mkpart part2 200GB 1500GB                                       

(parted) mkpart part3 1500GB 100%                                         

 

b. 显示重新分区后sdb硬盘上的分区情况  

(parted) print                                                            

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system  Name   Flags

 1      1049kB  200GB   200GB                part1

 2      200GB   1500GB  1300GB               part2

 3      1500GB  2000GB  500GB                part3

 

2.8. 退出parted

(parted) quit                                                             

Information: You may need to update /etc/fstab.

 

这里显示信息:我们可能需要更新/etc/fstab配置。在对分区进行修改后,如果增加、删除了分区,或者分区的名称等发生了改变时,一般都需要对应修改/etc/fstab配置。

 

3. 分区格式化

由于parted内建的mkfs还不够完善,所以完成分区以后我们使用系统的mkfs命令对分区进行格式化。前面已经说过,parted的mkpart命令中,FS-TYPE参数实际上形同虚设,因此,我们可以忽略在执行mkpart命令时设置的分区文件系统类型。

 

将硬盘sdb分区后,各个分区的设备名称就是硬盘名称+分区编号,在我们的例子中,3个分区的名称就是sdb1、sdb2、sdb3。

 

分区的格式推荐使用xfs或者ext4。ext4属于Linux传统的分区格式ext系列,已经非常稳定,xfs则是CentOS目前默认使用的文件系统。

 

3.1. 将第一个分区sdb1格式化为ext3文件系统

[root@localhost dev]# mkfs -t ext3 sdb1

mke2fs 1.42.9 (28-Dec-2013)

Discarding device blocks: done                           

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

12214272 inodes, 48827904 blocks

2441395 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=4294967296

1491 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, 2654208,

         4096000, 7962624, 11239424, 20480000, 23887872

 

Allocating group tables: done                           

Writing inode tables: done                           

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done

 

3.2. 将第二个分区sdb2格式化为xfs文件系统

[root@localhost dev]# mkfs -t xfs -f sdb2

meta-data=sdb2                   isize=256    agcount=4, agsize=79345664 blks

         =                       sectsz=4096  attr=2, projid32bit=1

         =                       crc=0        finobt=0

data     =                       bsize=4096   blocks=317382656, imaxpct=5

         =                       sunit=0      swidth=0 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal log           bsize=4096   blocks=154972, version=2

         =                       sectsz=4096  sunit=1 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

 

3.3. 将第三个分区sdb3格式化为ext4文件系统

[root@localhost dev]# mkfs -t ext4 sdb3

mke2fs 1.42.9 (28-Dec-2013)

Discarding device blocks: done                           

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

30547968 inodes, 122167552 blocks

6108377 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=2271215616

3729 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, 2654208,

         4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,

         102400000

 

Allocating group tables: done                           

Writing inode tables: done                            

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done    

 

4. 查看分区情况(非必要)

分区并格式化后,我们使用lsblk命令和blkid命令检查一下硬盘分区情况。

 

4.1. 使用lsblk列出所有可用块设备的信息

[root@localhost dev]# lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT

sda      8:0    0   3.7T  0 disk

├─sda1   8:1    0   200M  0 part /boot/efi

├─sda2   8:2    0   500M  0 part /boot

├─sda3   8:3    0   7.8G  0 part [SWAP]

├─sda4   8:4    0    50G  0 part /

└─sda5   8:5    0   3.6T  0 part /home

sdb      8:16   0   1.8T  0 disk

├─sdb1   8:17   0 186.3G  0 part

├─sdb2   8:18   0   1.2T  0 part

└─sdb3   8:19   0   466G  0 part

 

4.2. 使用blkid列出文件系统的名称和设备的UUID等信息

[root@localhost dev]# blkid

/dev/sda1: SEC_TYPE="msdos" UUID="7F12-26C0" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="538f1950-30db-485e-87fd-2dbebce6ae2b"

/dev/sda2: UUID="1ad6e1e3-ad11-49bd-9eba-64189d2b7463" TYPE="xfs" PARTUUID="1f05e3e7-069c-4d9c-82ee-031cdfafcd4e"

/dev/sda3: UUID="81ed34c4-9a32-4432-a025-14c14c8eeadd" TYPE="swap" PARTUUID="268a98e5-b3b0-4c98-9e43-bb7b7eccfcc4"

/dev/sda4: UUID="ec2c5ec6-29c2-4580-b173-180effbad11e" TYPE="xfs" PARTUUID="2bf13a54-7366-4ea5-855c-2b1311a847e9"

/dev/sda5: UUID="3f69aeeb-86e9-4dd9-816c-2c7eab45d4ea" TYPE="xfs" PARTUUID="68d8f1ac-58cf-48dd-b3e2-ad4e6f43258b"

/dev/sdb1: UUID="eb4cd659-1d5a-48ef-8bd6-3c9938c36e6b" SEC_TYPE="ext2" TYPE="ext3" PARTLABEL="part1" PARTUUID="0ebdba08-5e20-45f4-a568-bf18ba33f6ae"

/dev/sdb2: UUID="ddcbe129-ad5b-43a5-b4e9-ea42fc998d13" TYPE="xfs" PARTLABEL="part2" PARTUUID="c6590e6d-919f-4cb2-8257-57ff210ef53b"

/dev/sdb3: UUID="4591bd47-2643-4ca2-a381-e49b9fc2b617" TYPE="ext4" PARTLABEL="part2" PARTUUID="31be4744-df12-4f86-8754-6a32d6f873f6"

 

5. 挂载分区

创建并格式化分区后,这些分区并不能直接使用,需要先执行分区挂载操作,挂载分区使用的命令是mount。

 

5.1. 分别为3个分区创建挂载点

所谓的挂载点,即文件夹。

[root@localhost dev]# mkdir /dancen

[root@localhost dev]# mkdir /dancen/p1

[root@localhost dev]# mkdir /dancen/p2

[root@localhost dev]# mkdir /dancen/p3

 

5.2. 执行挂载

[root@localhost dev]# mount /dev/sdb1 /dancen/p1

[root@localhost dev]# mount /dev/sdb2 /dancen/p2

[root@localhost dev]# mount /dev/sdb3 /dancen/p3

 

5.3. 查看挂载后的硬盘情况

[root@localhost dev]# df -Th

Filesystem     Type      Size  Used Avail Use% Mounted on

/dev/sda4      xfs        50G  6.0G   45G  12% /

devtmpfs       devtmpfs  7.8G     0  7.8G   0% /dev

tmpfs          tmpfs     7.8G   80K  7.8G   1% /dev/shm

tmpfs          tmpfs     7.8G  8.9M  7.8G   1% /run

tmpfs          tmpfs     7.8G     0  7.8G   0% /sys/fs/cgroup

/dev/sda2      xfs       497M  195M  302M  40% /boot

/dev/sda1      vfat      200M  9.8M  191M   5% /boot/efi

/dev/sda5      xfs       3.6T  1.9T  1.8T  52% /home

/dev/sdb1      ext3      184G   60M  174G   1% /dancen/p1

/dev/sdb2      xfs       1.2T   33M  1.2T   1% /dancen/p2

/dev/sdb3      ext4      459G   73M  436G   1% /dancen/p3

 

5.4. 开机自动挂载

我们虽然手动挂载了新建的3个分区,但一旦系统重启,这些分区还需要重新手动挂载。为了使用方便,我们需要编辑/etc/fstab配置,使得这些分区能够在开机时被mount命令自动挂载。

 

/etc/fstab配置文件可以用三种不同的方法表示文件系统:

内核名称

UUID

label

 

使用内核名称,如/dev/sdb1,来表示文件系统简单直观,可直接使用。

使用UUID或是label的好处在于它们与磁盘顺序无关。如果你在BIOS中改变了你的存储设备顺序,或是重新拔插了存储设备,或是因为一些BIOS可能会随机地改变存储设备的顺序,那么用UUID或是label来表示将更有效。

使用UUID表示文件系统时,格式为:

UUID=1ad6e1e3-ad11-49bd-9eba-64189d2b7463

使用label表示文件系统时,格式为:

LABEL=/boot

 

我个人推荐使用UUID来表示文件系统,但在本文中,为了简单直观,我们使用文件系统的内核名称来表示文件系统。

 

[root@localhost dev]# vi /etc/fstab

#

# /etc/fstab

# Created by anaconda on Fri May  8 16:44:33 2015

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=ec2c5ec6-29c2-4580-b173-180effbad11e /                       xfs     defaults        0 0

UUID=1ad6e1e3-ad11-49bd-9eba-64189d2b7463 /boot                   xfs     defaults        0 0

UUID=7F12-26C0          /boot/efi               vfat    umask=0077,shortname=winnt 0 0

UUID=3f69aeeb-86e9-4dd9-816c-2c7eab45d4ea /home                   xfs     defaults        0 0

UUID=81ed34c4-9a32-4432-a025-14c14c8eeadd swap                    swap    defaults        0 0

/dev/sdb1                                 /dancen/p1              ext3    defaults        0 0

/dev/sdb2                                 /dancen/p2              xfs     defaults        0 0

/dev/sdb3                                 /dancen/p3              ext4     defaults       0 0

 

6. 调整分区大小

parted允许用户重新调整分区大小。但是需要注意,分区一旦建立,尽量不要去缩小分区大小,特别是在分区已经有数据的情况下,不然轻则分区调整失败,重则造成数据损失,因此,我们所谓调整分区大小,通常是指扩张分区,即调大分区大小。

 

6.1. 卸载需要调整的分区

在调整分区时,需要先将需要调整的分区卸载掉,分区卸载操作与分区挂载操作相对应,卸载分区使用的命令时umount。

 

a. 打印硬盘的剩余空间

(parted) select /dev/sdb

Using /dev/sdb

(parted) print free                                                      

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system  Name   Flags

        17.4kB  1049kB  1031kB  Free Space

 1      1049kB  200GB   200GB   ext3         part1

 2      200GB   1500GB  1300GB  xfs          part2

 3      1500GB  2000GB  500GB   ext4         part2

        2000GB  2000GB  1122kB  Free Space

 

b. 卸载需要调整的分区

不考虑硬盘尾部的1122kb,这里硬盘已经没有剩余空间了。我们将删除第三个分区sdb3,然后将第二个分区sdb2扩展到硬盘尾部。

首先,我们需要将需要调整的两个分区卸载掉。

[root@localhost dev]# umount /dev/sdb2

[root@localhost dev]# umount /dev/sdb3

 

6.2. 调整分区

a. 删除分区3

(parted) rm 3

 

b. 再次打印硬盘的剩余空间

(parted) print free                                                       

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system  Name   Flags

        17.4kB  1049kB  1031kB  Free Space

 1      1049kB  200GB   200GB   ext3         part1

 2      200GB   1500GB  1300GB  xfs          part2

        1500GB  2000GB  500GB   Free Space

 

删除第三个分区后,硬盘出现了500GB的剩余空间。

 

c. 调整分区大小的命令是resizepart,我们首先查看一下命令帮助

(parted) help resizepart                                                  

  resizepart NUMBER END                    resize partition NUMBER

 

         NUMBER is the partition number used by Linux.  On MS-DOS disk labels, the primary partitions number from 1 to 4, logical partitions from 5 onwards.

    END is disk location, such as 4GB or 10%.  Negative value counts from the end of the disk.  For example, -1s specifies exactly the last sector.

 

d. 调整分区大小

这里我们将第2个分区扩展到硬盘尾部。

(parted) resizepart 2 100%         

 

e. 打印调整后硬盘的空间分布情况                                     

(parted) print free                                                       

Model: ATA WDC WD20EZAZ-00G (scsi)

Disk /dev/sdb: 2000GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system  Name   Flags

        17.4kB  1049kB  1031kB  Free Space

 1      1049kB  200GB   200GB   ext3         part1

 2      200GB   2000GB  1800GB  xfs          part2

 

可以看到,2号分区已经从1300GB扩展为1800GB了。

 

6.3 重新挂载调整后的分区

a. 重新挂载2号分区

[root@localhost ~]# mount /dev/sdb2 /dancen/p2

 

b. 查看重新挂载分区后的硬盘情况

[root@localhost ~]# df -Th

Filesystem     Type      Size  Used Avail Use% Mounted on

/dev/sda4      xfs        50G  6.0G   45G  12% /

devtmpfs       devtmpfs  7.8G     0  7.8G   0% /dev

tmpfs          tmpfs     7.8G   80K  7.8G   1% /dev/shm

tmpfs          tmpfs     7.8G  8.9M  7.8G   1% /run

tmpfs          tmpfs     7.8G     0  7.8G   0% /sys/fs/cgroup

/dev/sda2      xfs       497M  195M  302M  40% /boot

/dev/sda1      vfat      200M  9.8M  191M   5% /boot/efi

/dev/sda5      xfs       3.6T  1.9T  1.8T  52% /home

/dev/sdb1      ext3      184G   60M  174G   1% /dancen/p1

/dev/sdb2      xfs       1.2T   33M  1.2T   1% /dancen/p2

 

结果显示,2号分区的大小并没有变化,这是因为系统不知道该分区的大小发生了变化,因此我们需要将变化告知系统。

 

c. 更新文件系统大小

[root@localhost ~]# resize2fs /dev/sdb2

resize2fs 1.42.9 (28-Dec-2013)

resize2fs: Bad magic number in super-block while trying to open /dev/sdb2

Couldn't find valid filesystem superblock.

 

这里我们收到了报错,因为更新文件系统大小的命令resize2fs是针对ext系列文件系统的,而我们的2号分区的文件系统是xfs,因此需要使用针对xfs文件系统更新文件系统大小的命令xfs_growfs。

 

[root@localhost ~]# xfs_growfs /dev/sdb2

meta-data=/dev/sdb2              isize=256    agcount=4, agsize=79345664 blks

         =                       sectsz=4096  attr=2, projid32bit=1

         =                       crc=0        finobt=0

data     =                       bsize=4096   blocks=317382656, imaxpct=5

         =                       sunit=0      swidth=0 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal               bsize=4096   blocks=154972, version=2

         =                       sectsz=4096  sunit=1 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

data blocks changed from 317382656 to 439550481

 

d. 查看更新文件系统大小后的硬盘情况

[root@localhost ~]# df -Th

Filesystem     Type      Size  Used Avail Use% Mounted on

/dev/sda4      xfs        50G  6.0G   45G  12% /

devtmpfs       devtmpfs  7.8G     0  7.8G   0% /dev

tmpfs          tmpfs     7.8G   80K  7.8G   1% /dev/shm

tmpfs          tmpfs     7.8G  8.9M  7.8G   1% /run

tmpfs          tmpfs     7.8G     0  7.8G   0% /sys/fs/cgroup

/dev/sda2      xfs       497M  195M  302M  40% /boot

/dev/sda1      vfat      200M  9.8M  191M   5% /boot/efi

/dev/sda5      xfs       3.6T  1.9T  1.8T  52% /home

/dev/sdb1      ext3      184G   60M  174G   1% /dancen/p1

/dev/sdb2      xfs       1.7T   33M  1.7T   1% /dancen/p2

 

这次系统识别到2号分区增长的空间了。

 

f. 更新/etc/fstab

由于我们已经删除了3号分区,因此,需要对应更新/etc/fstab的内容。

[root@localhost dev]# vi /etc/fstab

#

# /etc/fstab

# Created by anaconda on Fri May  8 16:44:33 2015

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=ec2c5ec6-29c2-4580-b173-180effbad11e /                       xfs     defaults        0 0

UUID=1ad6e1e3-ad11-49bd-9eba-64189d2b7463 /boot                   xfs     defaults        0 0

UUID=7F12-26C0          /boot/efi               vfat    umask=0077,shortname=winnt 0 0

UUID=3f69aeeb-86e9-4dd9-816c-2c7eab45d4ea /home                   xfs     defaults        0 0

UUID=81ed34c4-9a32-4432-a025-14c14c8eeadd swap                    swap    defaults        0 0

/dev/sdb1                                 /dancen/p1              ext3    defaults        0 0

/dev/sdb2                                 /dancen/p2              xfs     defaults        0 0

/dev/sdb2                                 /dancen/p2              xfs     defaults        0 0

 

7. 注意事项

parted与fdisk命令不同,fdisk命令在交互执行过程中,不会实际对硬盘产生影响,只有当最后保存操作时,操作才会真正执行,而parted在交互过程中,各个操作是即时执行的,因此,为了避免数据损失,须谨慎执行各项操作。

 

三. 附录

fstab文件介绍

fstab文件,即/etc/fstab,用于定义磁盘分区,各种其他块设备或远程文件系统应如何装入文件系统,每个文件系统在一个单独的行中描述。

 

文件示例

一个简单的/etc/fstab,使用内核名称标识磁盘:

# <file system>        <dir>         <type>    <options>             <dump> <pass>

tmpfs                  /tmp          tmpfs     nodev,nosuid          0      0

/dev/sda1              /             ext4      defaults,noatime      0      1

/dev/sda2              none          swap      defaults              0      0

/dev/sda3              /home         ext4      defaults,noatime      0      2

 

字段定义

/etc/fstab文件包含了如下字段,通过空格或Tab分隔:

<file system> <dir>      <type>   <options>     <dump> <pass>

<file systems> - 要挂载的分区或存储设备。

<dir> - <file systems>的挂载位置。

<type> - 要挂载设备或是分区的文件系统类型,支持许多种不同的文件系统:ext2,ext3,ext4,reiserfs,xfs,jfs,smbfs,iso9660,vfat,ntfs,swap及auto。设置成auto类型,mount命令会猜测使用的文件系统类型,对CDROM和DVD等移动设备是非常有用的。

<options> - 挂载时使用的参数,注意有些参数是特定文件系统才有的。一些比较常用的参数有:

       auto - 在启动时或键入了mount -a命令时自动挂载。

       noauto - 只在你的命令下被挂载。

       exec - 允许执行此分区的二进制文件。

       noexec - 不允许执行此文件系统上的二进制文件。

       ro - 以只读模式挂载文件系统。

       rw - 以读写模式挂载文件系统。

       user - 允许任意用户挂载此文件系统,若无显示定义,隐含启用noexec,nosuid,nodev参数。

       users - 允许所有users组中的用户挂载文件系统。

       nouser - 只能被root挂载。

       owner - 允许设备所有者挂载。

       sync - I/O同步进行。

       async - I/O异步进行。

       dev - 解析文件系统上的块特殊设备。

       nodev - 不解析文件系统上的块特殊设备。

       suid - 允许suid操作和设定sgid位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。

       nosuid - 禁止suid操作和设定sgid位。

       noatime - 不更新文件系统上inode访问记录,可以提升性能。

       nodiratime - 不更新文件系统上的目录inode访问记录,可以提升性能。

       relatime - 实时更新inode access记录。只有在记录中的访问时间早于当前访问才会被更新。(与noatime相似,但不会打断如mutt或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能。

       flush - vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。

       defaults - 使用文件系统的默认挂载参数,例如ext4的默认参数为:rw,suid,dev,exec,auto,nouser,async。

<dump> dump工具通过它决定何时作备份。dump会检查其内容,并用数字来决定是否对这个文件系统进行备份。允许的数字是0和1。0表示忽略,1则进行备份。大部分的用户是没有安装dump的,对他们而言<dump>应设为0。

<pass> fsck读取<pass>的数值来决定需要检查的文件系统的检查顺序。允许的数字是0,1,和2。根目录应当获得最高的优先权1, 其它所有需要被检查的设备设置为2,0表示设备不会被fsck所检查。

 

文件系统标识

在/etc/fstab配置文件中你可以以三种不同的方法表示文件系统:内核名称、UUID或者label。使用UUID或是label的好处在于它们与磁盘顺序无关。如果你在BIOS中改变了你的存储设备顺序,或是重新拔插了存储设备,或是因为一些BIOS可能会随机地改变存储设备的顺序,那么用UUID或是label来表示将更有效。

 

要显示分区的基本信息请运行:

$ lsblk -f

NAME   FSTYPE LABEL      UUID                                 MOUNTPOINT

sda                                                         

├─sda1 ext4   Arch_Linux 978e3e81-8048-4ae1-8a06-aa727458e8ff /

├─sda2 ntfs   Windows    6C1093E61093B594                    

└─sda3 ext4   Storage    f838b24e-3a66-4d02-86f4-a2e73e454336 /media/Storage

sdb                                                           

├─sdb1 ntfs   Games      9E68F00568EFD9D3                    

└─sdb2 ext4   Backup     14d50a6c-e083-42f2-b9c4-bc8bae38d274 /media/Backup

sdc                                                          

└─sdc1 vfat   Camera     47FA-4071                            /media/Camera

 

内核名称

你可以使用fdisk -l来获得内核名称,前缀是dev。

 

标签

注意:使用这一方法,每一个标签必须是唯一的。

要显示所有设备的标签,可以使用lsblk -f命令。在/etc/fstab中使用LABEL=作为设备名的开头:

 

/etc/fstab

# <file system>        <dir>         <type>    <options>             <dump> <pass>

tmpfs                  /tmp          tmpfs     nodev,nosuid   0      0

LABEL=Arch_Linux       /             ext4      defaults,noatime      0      1

LABEL=Arch_Swap        none          swap      defaults              0      0

 

UUID

所有分区和设备都有唯一的UUID。它们由文件系统生成工具(mkfs.*)在创建文件系统时生成。

lsblk -f命令将显示所有设备的UUID值。/etc/fstab中使用UUID=前缀:

 

/etc/fstab

# <file system>                           <dir>         <type>    <options>             <dump> <pass>

tmpfs                                     /tmp          tmpfs     nodev,nosuid          0      0

UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26 /     ext4              defaults,noatime      0      1

UUID=03ec5dd3-45c0-4f95-a363-61ff321a09ff /home ext4              defaults,noatime      0      2

UUID=4209c845-f495-4c43-8a03-5363dd433153 none  swap              defaults              0      0

 

自动挂载

如果/home分区较大,可以让不依赖/home分区的服务先启动。把下面的参数添加到/etc/fstab文件中/home项目的参数部分即可:

noauto,x-systemd.automount

这样/home分区只有需要访问时才会被挂载。内核会缓存所有的文件操作,直到/home分区准备完成。

 

注意:这样做会使/home的文件系统类型被识别为autofs,造成mlocate查询时忽略该目录。实际加速效果因配置而异,所以请自己权衡是否需要。

挂载远程文件系统也是同理。如果你仅想在需要的时候才挂载,也可以添加noauto,x-systemd.automount参数。另外,可以设置x-systemd.device-timeout=#参数,设置超时时间,以防止网络资源不能访问的时候浪费时间。

如果你的加密文件系统需要密钥,则需要添加noauto参数到/etc/crypttab文件中的对应位置。systemd开机的时候就不会打开这个加密设备,会一直等待到设备被访问时再使用密钥文件挂载。比如在使用加密RAID设备的时候可以节省一定的时间,因为 systemd 不必等到设备可用后才能访问。例如:

/etc/crypttab

data /dev/md0 /root/key noauto

 

路径名有空格

如果挂载的路径中有空格,可以使用 "\040" 转义字符来表示空格(以三位八进制数来进行表示)

/etc/fstab

UUID=47FA-4071     /home/username/Camera\040Pictures   vfat  defaults,noatime      0  2

/dev/sda7          /media/100\040GB\040(Storage)       ext4  defaults,noatime,user  0  0

 

外部设备

外部设备在插入时挂载,在未插入时忽略。这需要nofail选项,可以在启动时若设备不存在直接忽略它而不报错。

/etc/fstab

/dev/sdg1    /media/backup    jfs    defaults,nofail    0  2

 

atime参数

使用noatime,nodiratime或relatime可以提升ext2,ext3及ext4格式磁盘的性能。Linux在默认情况下使用atime选项,每次在磁盘上读取(或写入)数据时都会产生一个记录。这是为服务器设计的,在桌面使用中意义不大。默认的atime选项最大的问题在于即使从页面缓存读取文件(从内存而不是磁盘读取),也会产生磁盘写操作!

使用noatime选项阻止了读文件时的写操作。大部分应用程序都能很好工作。只有少数程序如Mutt需要这些信息。Mutt的用户应该使用relatime选项。使用relatime选项后,只有文件被修改时才会产生文件访问时间写操作。nodiratime选项仅对目录禁用了文件访问时间。relatime是比较好的折衷,Mutt等程序还能工作,但是仍然能够通过减少访问时间更新提升系统性能。

注意:noatime已经包含了nodiratime,不需要同时指定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值