linux - 如何列出特定类型的分区?

linux - 如何列出特定类型的分区?

我正在寻找一种方法来列出 Linux 上特定类型的所有分区。(具体来说:所有 EFI 系统分区)。

我知道blkid可以根据文件系统类型进行过滤:该命令blkid -t TYPE=vfat返回正确的结果,但不是很强大:可能存在其他不是 ESP 的 vfat 文件系统,或者可能存在使用不同文件系统格式化的 ESP。

那么,是否存在一个等效的命令,可以列出设备但根据分区类型进行过滤?

编辑

我需要所有 EFI 系统分区(或 ESP)的列表。这些分区EF00在 gdisk 中具有分区类型,ef在 fdisk 中具有分区类型。它们最常见的格式是 vfat。现在,我可以使用blkid列出所有使用 vfat 格式化的分区,但这留下了两个问题:
a) 可能存在未使用 vfat 格式化(或根本没有格式化)的 EFI 分区,这些分区将不包含在列表中,并且
b) 可能存在格式化为 vfat 的常规文件系统,这些文件系统将错误地包含在列表中。因此匹配文件系统类型不是解决问题的办法。所以我在寻找可以匹配的东西分区类型,所以EF00ef

如果不存在这样的命令,我可能需要执行以下操作来获取我想要的信息:
- 列出所有磁盘
- 对于每个磁盘,找出它是否有 MBR 或 GPT 分区表
- 列出分区表
- 过滤结果以仅打印 ESP 分区

这很麻烦而且容易出错,所以如果blkid存在能够匹配分区类型的等效物,我愿意使用它。

答案1

lsblk -o +PARTTYPE列表中包含分区类型 UUID。EFI 系统分区类型 UUID 是C12A7328-F81F-11D2-BA4B-00A0C93EC93B,因此 grep 搜索此信息(小写,或使用-i带有 grep 的标志)会列出您的 ESP。

答案2

1)对于特定类型的列表分区:

:~# lsblk -ln -o NAME,TYPE
...
sda          disk
sda1         part
sda1_crypt   crypt
vg0xa-system lvm
vg0xa-swap   lvm
vg0xa-tmp    lvm
vg0xa-var    lvm
vg0xa-usr    lvm
...

也可以看看:lsblk -ln -o NAME,PARTTYPE

2)或者更具体地说:

:~# lsblk -ln -o NAME,TYPE | grep sda1_crypt
sda1_crypt   crypt

答案3

为了列出 EFI 分区,您可以使用:

$ lsblk -ln -o NAME,LABEL | grep EFI_SYSPART | awk '{print $1}'
nvme0n1p1
nvme1n1p1

或按文件系统分类FSTYPE

lsblk -ln -o NAME,FSTYPE | grep vfat
nvme0n1p1 vfat
nvme1n1p1 vfat
  • 对于每个磁盘,查明其上是否有 MBR 或 GPT 分区表

尝试解析 JSON 输出lsblk -J(您需要版本> 2.252.33似乎支持此功能)。

您可以使用jqPython/Ruby/Perl 脚本来处理它:

$ lsblk -J -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL | jq .blockdevices
[
  {
    "name": "sr0",
    "fstype": null,
    "size": "1024M",
    "mountpoint": null,
    "label": null
  },
  {
    "name": "nvme0n1",
    "fstype": null,
    "size": "894,3G",
    "mountpoint": null,
    "label": null,
    "children": [
      {
        "name": "nvme0n1p1",
        "fstype": "vfat",
        "size": "511M",
        "mountpoint": "/boot/efi",
        "label": "EFI_SYSPART"
      },
      {
        "name": "nvme0n1p2",
        "fstype": "linux_raid_member",
        "size": "29,3G",
        "mountpoint": null,
        "label": null,
        "children": [
          {
            "name": "md2",
            "fstype": "ext4",
            "size": "29,3G",
            "mountpoint": "/",
            "label": "/"
          }
        ]
      },
...

答案4

lsblk -o NAME,SIZE,PARTUUID,PARTLABEL,FSTYPE \
  --filter 'PARTTYPENAME == "EFI System"'
NAME       SIZE PARTUUID                             PARTLABEL FSTYPE
sda1       512M 31a252ad-d88e-432e-a9e9-30583242f063 EFI       vfat
sdb1       512M 7e83a5d5-085e-4bae-b19a-a8da609143e1 EFI       vfat

相关内容