Identifique de forma confiável um disco (não uma partição) no Linux (Debian)

1

Eu quero fazer backup da tabela de partições de um disco em um script como este:

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

Mas

  • Eu não quero usar /dev/sda , porque pode não ser confiável.

  • /dev/disk/by-id parece também não ser confiável.

  • /dev/disk/by-uuid e df incluem somente partições (não discos).

No entanto, fdisk -l mostra um UUID "Identificador de disco". Posso de alguma forma obter o nome do disco ( sda ) do identificador de disco? Ou existe outra maneira de identificar um disco de maneira confiável?

    
por Toxiro 29.03.2018 / 00:24

1 resposta

1

Use /dev/disk/by-id/ de qualquer maneira. O problema com o qual você faz o link parece-me um raro defeito no hardware ou algo igualmente ruim.

Compare

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

para

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

No entanto, em alguns dos meus sistemas, o comando acima exibe valores em branco; você ainda pode tentar:

# 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

Não sei muito sobre o WWN , mas os números de série devem ser codificados no hardware. Meu ponto é, se qualquer número de série mudar por qualquer motivo, então você pode ter problemas maiores do que um script de backup que de repente não funciona.

Observe que um número de série identifica um dispositivo físico não importando qual seja sua tabela de partição (ou, se houver um, analise o termo "superfloppy" e esta questão ). Se você quiser identificar as próprias tabelas de partição, esses UUIDs "Identificador de Disco" serão a abordagem correta (observe que são UUIDs de 128 bits no esquema GPT, mas assinaturas opcionais de 32 bits em MBR, exemplo aqui ). Eles são apenas alguns bytes no disco que podem ser alterados, clonados, copiados. Não encontrei nenhuma maneira rápida de identificar um nó de dispositivo por esse tipo de identificador, além de navegar pelos dispositivos disponíveis:

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 [...] include partitions only (not disks).

Bem, isso pode incluir nem todos eles porque esses UUIDs se referem a estruturas dentro de partições (como sistemas de arquivos ou swap), não a partições em si (e se você lidar com o superfloppy, ele estará aqui como um disco inteiro). Cada um desses UUIDs é escrito em algum lugar dentro de sua partição correspondente (ou dispositivo, se for superfloppy). Estes são identificadores que você vê quando invoca, por exemplo,

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

Se você precisar de identificadores de partições, eles estarão em /dev/disk/by-partuuid/ . Estes são os mesmos que em

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

e eles são armazenados em uma tabela de partição correspondente, não dentro de qualquer partição. Você pode obter uma imagem mais ampla executando

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

Para identificar um dispositivo que contém uma partição com um determinado UUID, tente:

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

( sed apenas retira dígitos finais aqui). Esta solução pode ser facilmente adaptada para recuperar informações de /dev/disk/by-uuid/ se você precisar.

    
por 29.03.2018 / 09:57