1

Я хочу сделать резервную копию таблицы разделов диска в следующем сценарии:

sfdisk --dump /dev/sda > partition_table.dump

Но

  • Я не хочу использовать /dev/sda , потому что он может быть ненадежным.

  • /dev/disk/by-id также не является надежным.

  • /dev/disk/by-uuid и df включают только разделы (не диски).

Однако fdisk -l показывает UUID "Идентификатор диска". Можно ли как-то получить имя диска (sda) из идентификатора диска? Или есть другой способ надежно идентифицировать диск?

1 ответ1

1

В любом случае используйте /dev/disk/by-id/ . Проблема, на которую вы ссылаетесь, выглядит для меня как редкая неисправность оборудования или что-то похожее плохое.

сравнить

ls -l /dev/disk/by-id/

в

# 'lsblk' is from 'util-linux' package
lsblk -pdo NAME,VENDOR,MODEL,SERIAL,WWN

Однако в некоторых моих системах приведенная выше команда отображает пустые значения; еще можно попробовать:

# the below 'smartctl' command (from 'smartmontools' package) probably needs 'sudo'
for sd in $(lsblk -pdo NAME | tail -n +2); do
  printf "%s\n" "$sd"; smartctl -i "$sd" |
  grep -E "Model:|Number:|WWN"
done

Я не знаю много о WWN, но серийные номера должны быть аппаратно закодированы. Я хочу сказать, что если какой-либо серийный номер изменится по какой-либо причине, у вас могут возникнуть большие проблемы, чем сценарий резервного копирования, который вдруг не работает


Обратите внимание, что серийный номер идентифицирует физическое устройство независимо от того, какова его таблица разделов (или, если она вообще существует, изучите термин "superfloppy" и этот вопрос). Если вы хотите идентифицировать сами таблицы разделов, то обнаруженные вами UUID "Идентификатор диска" будут правильным подходом (обратите внимание, что это 128-битные UUID в схеме GPT, но 32-битные необязательные подписи в MBR, пример здесь). Это всего лишь несколько байтов на диске, которые можно изменить, клонировать, создать резервную копию. Я не нашел быстрого способа идентифицировать узел устройства по этому типу идентификатора, кроме просмотра доступных устройств:

id=8080fdb4-6905-4f34-91fa-61389615d7d3
# the below 'fdisk' command (from 'util-linux' package) probably needs 'sudo'
for sd in $(lsblk -pdo NAME | tail -n +2); do
  fdisk -l "$sd" | grep -qi " ${id}$" && printf "%s\n" "$sd"
done

/dev/disk/by-uuid [...] включает только разделы (не диски).

Ну, это может включать даже не все из них, потому что эти UUID ссылаются на структуры внутри разделов (например, файловые системы или подкачки), а не на сами разделы (и если вы имеете дело с superfloppy, он будет здесь как целый диск). Каждый из этих UUID записан где-то внутри соответствующего раздела (или устройства, если он суперфлоппи). Это идентификаторы, которые вы видите, когда вы вызываете, например,

# 'file' is from 'file' package
file -s /dev/sda2

Если вам нужны идентификаторы разделов, они находятся в /dev/disk/by-partuuid/ . Это так же, как в

# 'partx' is from 'util-linux' package
partx --show /dev/sda

и они хранятся в соответствующей таблице разделов, а не внутри какого-либо раздела. Вы можете получить более широкую картину, запустив

# 'blkid' (from 'util-linux' package) probably needs 'sudo'
blkid

Чтобы определить устройство, которое содержит раздел с данным UUID, попробуйте:

id=68e3b991-5c7a-4d18-a120-834ef4effe00
readlink -e "/dev/disk/by-partuuid/$id" | sed 's/[0-9]*$//'

(sed просто удаляет последние цифры здесь). Это решение может быть легко адаптировано для извлечения информации из /dev/disk/by-uuid/ если вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .