Я ищу способ вывести список всех разделов определенного типа в Linux. (В частности: все системные разделы EFI.)
Я знаю, что blkid
может фильтровать по типу файловой системы: команда blkid -t TYPE = vfat
возвращает правильные результаты, но не очень надежный: могут быть другие файловые системы vfat, которые не являются ESP, или могут быть ESP, отформатированные с другой файловой системой.
Итак, есть ли эквивалентная команда, которая может выводить список устройств, но фильтровать по типу раздела?
EDIT
Мне нужен список всех системных разделов EFI (или ESP). Эти разделы имеют тип раздела EF00
в gdisk или тип раздела ef
в fdisk. Чаще всего они форматируются как vfat.
Теперь я могу использовать blkid
для вывода списка всех разделов, отформатированных с помощью vfat, но это оставляет две проблемы:
a) Могут быть разделы EFI, не отформатированные с помощью vfat (или не отформатированные вообще), которые отсутствуют в списке, и
б) могут быть обычные файловые системы, отформатированные как vfat, которые будут включены в список неправильно.
Поэтому сопоставление по типу файловой системы - не лучший вариант. Вот почему я ищу что-то, что может соответствовать типу раздела , поэтому EF00
или ef
.
Если такой команды нет, я бы возможно, мне потребуется сделать следующее, чтобы получить нужную мне информацию:
- список всех дисков
- для каждого диска узнать, есть ли на нем таблица разделов MBR или GPT
- перечислить таблицу разделов
- filter the results to only print the ESP partitions
This is cumbersome and error-prone, so if an equivalent of blkid
exists that is able to match partition types, I would like to use that.
lsblk -o +PARTTYPE
включает в листинг тип UUID раздела. Тип UUID системного раздела EFI - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
, поэтому смазка для этого (в нижнем регистре, или используйте флаг -i
с смазкой) перечисляет ваши ESP.
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
Чтобы вывести список разделов 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.25
, 2.33
, похоже, это поддерживает).
Вы можете обработать его с помощью jq
или скрипта Python/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": "/"
}
]
},
...