硬盘管理,这里指的是硬盘的分区、格式化、挂载、卸载等。本文仅针对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磁盘标签。如有必要,可将名称放在引号中。
显示分区表。
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,不需要同时指定。