磁盘与文件系统管理工具

概述

参考:

磁盘分区管理工具

Parted

参考:

Parted 是一个 partition(分区) 操作程序,支持对 2T 以上硬盘的分区,支持 GTP 分区表,如果直接输入 parted 命令则进入 parted 工具,以交互式方式对 DEVICE 进行操作。

Parted 程序在 CentOS 和 Ubuntu 中都属于 parted 包,这个包中有两个程序,partedpartprobe

parted 程序可以在交互模式中运行,当 parted 运行在交互模式中时,对磁盘进行的操作,只有在执行 quit 命令后,才会将更新通知给 Linux 内核

Syntax(语法)

parted [OPTIONS] [DEVICE [COMMAND [ARGUMENT…]…]]

OPTIONS

  • -a, –align=[none|cyl|min|opt] # alignment for new partitions
  • -l, –list # 列出所有块设备上的分区布局,i.e.列出所有磁盘的分区
  • -m, –machine # 与 -l 选项配合, 显示出机器可以解析的输出内容
  • -s, –script # never prompts for user intervention

COMMAND

align-check <ALIGN-TYPE> <DEVICE> # 检查指定分区是否对齐

  • ALIGN-TYPE
    • minimal #
    • optimal #

select <DEVICE> # 选择对 DEVICE 磁盘进行操作

mklable <LABEL-TYPE> # 创建一个新的 Disk Label(磁盘标签)。

Disk Label 其实就是 Partition Table(分区表),也有的人称为 Partition Map(分区图)

这个行为会虽然不会导致磁盘所有数据丢失,但是却无法使用这些数据,如果想要恢复,可以通过恢复模式,参考这里进行恢复。当为一个已经有磁盘标签的磁盘创建标签时,将会出现如下提示:

Warning: The existing disk label on /dev/vdb will be destroyed and all data on this disk will be lost. Do you want to continue?

  • LABEL-TYPE
    • bsd
    • loop # 这个标签通常用于 LVM 类型的磁盘上,带有这种标签的磁盘,其实是没有分区表的。
    • gpt # 这个类型的标签就是 GPT 分区表
    • msdos # 这个类型的标签就是 MBR 分区表
    • pc98
    • sun
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start  End  Size  File system  Name  Flags


Model: Virtio Block Device (virtblk)
Disk /dev/vda: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End    Size   Type     File system  Flags
 1      1049kB  107GB  107GB  primary  ext4         boot

不同类型的分区表,其显示的内容也不同,比如 GPT 分区别没有 Type 列,有 Name 列;而 msdos 有 Type 列却没有 Name 列。所以不同的分区表类型,会影响 mkpart 等命令的参数。

mkpart [PART-TYPE NAME FS-TYPE] <START> <END> # 创建一个新的分区。

  • PART-TYPE # 分区类型
    • 注意:该参数仅适用于分区表类型为 msdos 和 dvh 的磁盘
    • extended # 扩展分区
    • logical # 逻辑分区
    • primary # 主分区
  • NAME # 分区表的名字
    • 注意:分区表类型为 GPT 的磁盘必须指定 NAME 参数。如果是在交互模式中,可以设定一个空名字~~~o(╯□╰)o
  • FS-TYPE # 为分区添加文件系统类型的签名,通常都是在该分区的 offset 0 处添加签名。注意:仅仅是添加签名,并不是真的创建一个文件系统,想要创建文件系统,使用单独的 mkfs 等命令
    • btrfs
    • ext2、ext3、ext4
    • fat16、fat32
    • hfs、hfs+
    • linux-swap
    • ntfs
    • reiserfs
    • udf
    • xfs

name <NUMBER> <NAME> # 设置 NUMBER 号分区的名称为 NAME。仅对 GPT、Mac、MIPS、PC98 磁盘类型下的分区有效。

print [NUMBER] # 显示磁盘的分区信息,或者显示指定分区的信息

rescure START END # 救援一个丢失的分区。好像没什么用~~o(╯□╰)o?????????????????

resizepart <NUMBER> <END> # 移动指定分区的结束位置,即.调整分区的容量大小。注意:这不会修改分区中的任何文件系统,如果需要调整文件系统,则需要使用 resize2fs 之类的程序。

rm <NUMBER> # 删除指定的分区

select * <DEVICE> # 在交互模式中选择要编辑的磁盘设备。DEVICE 可以是 Linux 硬盘设备、分区、软 RAID 设备、LVM

set <NUMBER> <FLAG> <STATE> # 设置分区的 Flag。这命令有啥用?~~囧???????????

unit <UNIT> # 设定 parted 程序在显示磁盘信息时所使用的默认单位。

当我们使用 % 给磁盘分区后,过了一段时间我们往往忘记了每个分区具体都占了磁盘的百分比,这时候,使用 unit % 指令就可以看到这些信息了。o(∩_∩)o

EXAMPLE

检查 /dev/vda 磁盘的 1 号分区是否对齐

  • parted /dev/vda align-check optimal 1

设置 /dev/vdb 磁盘的分区表为 msdos 格式

  • parted /dev/vdb mktable msdos

设置/dev/vdb 磁盘的第一个分区的 FLAG 为 lvm

  • parted /dev/vdb set 1 lvm on

partprobe - 探测分区

当创建完分区而无法用 mkfs 创建文件系统的时候,用该命令,让内核重新读取分区情况以便让新增加的分区可以在不重启的情况下使用

fdisk

与 parted 工具类似,分为交互式命令与非交互式命令

Syntax(语法)

fdisk [/Path/DEV]

EXAMPLE

  • fdisk -l # 查看当前磁盘分区详情

磁盘设备管理工具

lsblk

参考:

lsblk 是 list block devices 的简称。该工具可以列出有关所有可用或指定的块设备的信息。 lsblk 命令读取 sysfs文件系统udev db 来收集信息。

默认情况下,该命令以树形格式打印所有块设备(除了 RAM 磁盘)。效果如下:

~]# lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0           11:0    1  1024M  0 rom
vda          252:0    0   500G  0 disk
├─vda1       252:1    0     2M  0 part
├─vda2       252:2    0   500M  0 part /boot
└─vda3       252:3    0 499.5G  0 part
  └─vg1-root 253:0    0 499.5G  0 lvm  /

除了上面例子中的 6 列信息,lsblk 还会提供很多其他信息,使用 lsblk –help 命令获取所有可用列的列表。

  • NAME # 块设备名称
  • KNAME # 该块设备在内核内的名称。
  • MAJ:MIN # major(主要):minor(次要) 的块设备编号
    • MIN 就是 /dev/dm-X 设备后面那个 X 的编号
  • ROTA # 该设备是否为旋转设备(不是旋转设备就表示设备是固态硬盘或做过 raid 的逻辑盘)。1 是,0 不是
  • RM # 该设备是否是可移动设备
  • SIZE # 块设备大小
  • RO #
  • TYPE # 块设备类型
  • MOUNTPOINT # 该块设备的挂载路径

lsblk [OPTIONS] [DEVICE…]

OPTIONS

  • -J, –json # 使用 JSON 格式输出内容。
  • -o, –output <LIST> # 指定要打印的输出列。 使用–help 获取所有受支持列的列表。如果以+LIST 格式(例如 lsblk -o + UUID)指定 LIST,则可以扩展默认的列表。
  • -p, –paths # 在 NAME 列显示块设备所在位置的绝对路径
  • -t, –topology # 输出块设备的拓扑信息。相当于 -o NAME,ALIGNMENT,MIN-IO,OPT-IO,PHY-SEC,LOG-SEC,ROTA,SCHED,RQ-SIZE,RA,WSAME

EXAMPLE

  • lsblk –output NAME,KNAME,TYPE,SIZE,MOUNTPOINT #

blkid - 查看块设备 UUID

效果如下:

~]# blkid
/dev/vda1: PARTUUID="155ebb92-01"
/dev/vda2: UUID="6c780e7d-7d0d-4e87-a3a3-77bd9a6ff9d5" TYPE="ext4" PARTUUID="155ebb92-02"
/dev/vda3: UUID="SADfxz-bqhC-QdUe-ogW1-diaM-1Fr8-TppSou" TYPE="LVM2_member" PARTUUID="155ebb92-03"
/dev/mapper/vg1-root: UUID="47af4ed5-64c5-405f-bef1-c65dc2984e21" TYPE="xfs"

dmsetup

参考:

低级的逻辑卷管理

dmsetup ls

dmsetup remove ceph–a56518ac–089c–4567–8000–7084c8fe9624-osd–block–ca074b77–a560–434d–86da–f329f21d018e

LVM

参考:

Logical Volume Manager(逻辑卷管理器,简称 LVM) 提供了从物理设备创建 Virtual Block Devices(虚拟块设备)工具。虚拟设备比物理设备更易于管理,并且可以具有超出物理设备自身提供的功能的能力。

  • Volume Group(卷组,简称 VG) 是一个或多个物理设备的集合,每个设备称为 Physical Volume(物理卷,简称 PV)
  • Logical Volume(逻辑卷,简称 LV) 从 VG 中创建,是可由系统或应用直接使用的虚拟块设备。
    • 根据内核中 Device Mapper(设备映射,简称 DM) 实现的算法,LV 中的每个数据块都存储在 VG 中的一个或多个 PV 上。

LVM 创建的 LV 本质上是相当于创建了一个新的物理磁盘,这不说是逻辑上的磁盘。所以称为逻辑卷。在 Linux 中,LVM 表现为一种 device-mapper 类型的磁盘。

image.png

上图中,虽然 testvg1-testlv 磁盘是一个 LVM,并且是通过 /dev/sdb 磁盘的分区创建的,但是从整个磁盘管理的角度来看,一个 LV 就是一个物理磁盘,只不过类型不同罢了。

Syntax(语法)

lvm [ COMMAND | FILE ]

Example

创建 LVM 顺序:

  1. Physical Volume:PV 物理卷(相当于一块一块真实的物理磁盘)
  2. Volume Group:VG 卷组(把多块物理磁盘组合在一起形成一个组,并在创建 VG 时把整个组的空间划分为一个个默认大小为 4M 的 PE,VG 就相当于一个存储池子,里面有好多好多 PE 块组成了一个大的磁盘空间供 LV 使用)
  3. Pysical Extent:PE 物理区域(把真实的物理磁盘的空间切分为一个个固定大小的块,每个块就是 PE)
  4. Logical Volume:LV 逻辑卷(从 VG 中拿出多个 PE 组成逻辑上的磁盘空间,可以把 LV 当成一个分区)

创建逻辑卷的步骤:

  1. 创建分区,并使之可用
    1. pvcreate /dev/sda{1,2}
    2. vgcreate testvg1 /dev/sda{1,2}
    3. lvcreate -L 10G -n testlv testvg1

扩展逻辑卷的步骤:

  1. 确定扩展的大小,并确保 lv 所属的 vg 有足够的剩余空间
    1. pvcreate /DEV/PATH
    2. vgextend VG /DEV/PATH
  2. 扩展 lv 大小,执行 lvextend 命令,第二条为扩展所有剩余空间到逻辑卷
    1. lvextend -L [+]SIZE LvPath
    2. lvextend -l+100%FREE /dev/mapper/vg0-root
  3. 扩展系统文件大小,执行 resize2fs 命令
    1. xfs_growfs LvPath

缩减逻辑卷的步骤

  1. 卸载卷 umount,并执行强制检测
    1. e2fsck -f LvPath
  2. 缩减文件系统大小
    1. resize2fs LvPath SIZE
  3. 缩减 lv 大小
    1. lvreduce -L [-]Siza LvPath

pv - 物理卷管理命令

参考:

Syntax(语法)

pvcreate POSITION [OPTIONS] # 初始化物理卷以供 PVM 使用

  • POSITION #

pvcreat 创建 PV

OPTIONS

EXAMPLE

  • pvcreate /dev/sdb1
  • pvcreate /dev/sdb{1,2}

pvremove 删除 PV

pvscan 扫描 PV

pvs 简要显示 PV

  • PV:物理卷名称 VG:PV 所属的卷组 Fmt:物理卷格式 Attr: PSize:物理卷大小 PFree:物理卷空余大小

pvdisplay # 详细显示 PV

  • PV Name:物理卷名称
  • VG Name:PV 所属的卷组名称
  • PV Size:物理卷占用多少空间
  • Allocatable:是否可分配
  • PE Size:每个 PE 占用的空间容量
  • Total PE:合计有多少个 PE
  • Free PE:有多少空余的 PE
  • Allocated PE:分配了多少 PE
  • PV UUID:PV 的 UUID 号

pvmove 把一个 pv 上的数据挪动到另一个 pv 上

vg - 卷组管理命令

Syntax(语法)

vgcreat,vgs,vgdisplay,vgextend,vgreduce,vgremove,vgrename

vgcreat

vgcreat VgName PvPath

创建 vg 自定义 vg 名 需要加入 VG 的 PV 路径

选项

  • -s # 指定 PE 大小,默认 4M

应用范例

  • vgcreate myvg /dev/sda{1,2} # 以 sdb1 和 sdb2 组合起来创建一个名叫 myvg 的 VG

vgs

  • #PV # 该卷组中物理卷的个数 # LV:逻辑卷的个数

vgdisplay

vgextend 扩大卷组

  1. 语法格式:vgextend VgName PvPath
  2. 选项
  3. 应用实例
    1. vgextend myvg /dev/sdc1 # 为卷组 myvg 添加一个/dev/sdc1 的物理卷

vgreduce 缩小卷组(注:缩减卷组前,要把要缩减掉的 pv 上的数据用 pvmove 挪走)

lv - 逻辑卷管理命令

参考:

lvcreat,lvdisplay,lvs,lvextend,lvreduce,lvremove

lvcreat

Syntax(语法)

lvcreat [OPTIONS] VgName [PvPath]

创建 lv 从哪个 vg 中创建

OPTIONS

  • -n # 指定 lv 名字
  • -L # 指定 lv 的空间大小
  • -p # 指定访问权限
  • -s # 创建 lv 的快照 snapshot

EXAMPLE

  • lvcreate -L 3G -n lv1 myvg # congmyvg 卷组中创建名为 Imyvg 大小为 3G 的 LV
  • lvcreate -s -L3G -n lv1snapshot -p r /dev/myvg/lv1 # 创建名为 lv1snapshot,只有读权限,3G 大小的 lv1 的快照

lvdisplay

lvextend

lvextend [OPTIONS] LvPath [PvPath]

增加 lv 增加哪个 LV [可以指定从哪个 PV 里给该 LV 增加]

OPTIONS

  • -L # 指定要增加的空间,增加到 5G 则是-L 5G,增加了 5G 则是-L +5G

EXAMPLE

  • lvextend -L 5G /dev/myvg/lv1 扩展 lv1 这个逻辑卷到 5G 的容量
  • lvextend -L +5G /dev/myvg/lv1 sdc1 # 扩展 lv1 逻辑卷多出 5G 的空间,从 sdc1 中给 lv 提供空间
  • lvextend -l+100%FREE /dev/mapper/vg0-root # 扩展卷组中所有空间给 vg0-root 这个逻辑卷

resize2fs

如果是 xfs 文件系统,则使用 xfs_growfs 命令来增大或者收缩未加载的 ext 文件系统的大小。如果文件系统是处于 mount 状态下,那么它只能做到扩容

注意:在 lv 扩容完成后,还需要对文件系统进行扩容,否则无法使用

OPTIONS

EXAMPLE

  • resize2fs /dev/myvg/lv1

snapshot 快照卷

注意:lvm 创建的快照是基于原始卷来运行的,原始卷修改了多少内容,其修改之前的内容就会被自动复制到快照卷里,快照是按照 PE 复制的,每个 PE 的改变,原始 PE 都会自动备份到快照当中,当快照卷的容量满了,就失去了快照卷了,注意 lvm 创建的快照与 openstack 的实例创建的快照还有 VMware 创建的快照的区别


最后修改 May 22, 2024: memory mgmt, huge pages, numa (279776de)