Я ищу портативный способ получить имя устройства родительского блока (например /dev/sda
), учитывая имя устройства раздела (например /dev/sda1
). Я знаю, что могу просто выбросить последний символ, но в некоторых случаях это не сработает:
- Кард-ридеры MMC обычно имеют имена вроде
/dev/mmcblk0
, в то время как их разделы имеют имена как/dev/mmcblk0p1
(обратите внимание на дополнительныеp
). - необязательно: некоторые блочные устройства вообще не имеют таблицы разделов и отформатированы как один раздел. В этом случае устройство разделения и родительское блочное устройство совпадают.
Объемы LVM - это совершенно другой котелок с рыбой. Мне не нужно сейчас их поддерживать, но если их учет требует небольших дополнительных усилий, я бы не возражал.
shell-script
partition
block-device
Дмитрий Григорьев
источник
источник
/dev/sd0a
но нет/dev/sd0
устройства (есть/dev/sd0c
...)/dev/sda1
и/dev/mmcblk0p1
, в любом случае , зависят от Linux.lsblk
хотя относительно недавно.lsblk
также использует номера узлов устройства, чтобы найти правильный, вместо того, чтобы просто использовать имя. кажется, самое простое решение для Linux и util-linux, вероятно, всегда будет доступно в любом случае.lsblk -dpno pkname $devname
прошел все мои тесты! Возможно, вам следует добавить ответ./dev/sd0c
в этом случае. Подходят ли ответы ниже для вас?Ответы:
Если вы используете Linux, вы можете использовать
lsblk
(который является частьюutil-linux
):источник
lsblk
(util-linux
: 2.20.1, Ubuntu 14.04) не имеетpkname
столбца, простоkname
.$ lsblk -no pkname /dev/nvme0n1p3
возвращает 7 строк в моей системе. Да, этот раздел зашифрован и содержит LVM, это не тривиальная ситуация. Я не знаю, как вы должны надежно выбрать правильную строку из сценария.Если устройство является разделом другого устройства, он
/sys/class/block/$dev
будет содержать файл с именемpartition
(содержимое которого является номером раздела).Если это так, вы можете получить имя родительского устройства с помощью:
Или с
zsh
:Пример:
Объемы LVM совершенно разные, они не являются разделами, за исключением особого случая, когда они являются одним непрерывным
linear
отображением физического PV.Если вы в таком случае, вы можете получить название этого PV с помощью:
Где
$dev
что-то вродеdm-2
(что вы можете получить от"$(basename "$(readlink -f /dev/VG/LV)")"
).источник
lsblk
короткий синтаксис, но я признаю, что ваш ответ более общий и переносимый. Благодарность!