在没有 udev 守护进程的系统上生成 /dev/disk/-by-path/ name 的命令

在没有 udev 守护进程的系统上生成 /dev/disk/-by-path/ name 的命令

在大多数 Linux 系统上,udev 通常在以下位置创建符号链接

/dev/disk/by-uuid/
/dev/disk/by-path/

指向实际设备节点(/dev/sda/dev/sdb等)。

我的系统上没有 udev,我想手动生成这些符号链接。我知道我可以用来blkid生成by-uuid名称。

但是如何在不使用 udev 的情况下生成by-path给定磁盘(例如/dev/sda1)的名称?

具体来说,我正在寻找一种方法来查找我的哪个磁盘是通过 iSCSI 从主机连接的磁盘10.1.14.22。它可能是sdb,或者sdc可能是其他,因为我同时连接到多个(不同的)iSCSI 主机。

答案1

这个脚本可以解决问题,至少对于大多数典型场景来说是这样。它需要blkidlsscsised

#!/bin/bash
mkdir -p /dev/disk/by-{path,uuid}
for dev in `blkid -o device | grep -v block`; do
  ln -s "$dev" "/dev/disk/by-uuid/$(blkid -o value -s UUID "$dev")"
done

lsscsi -v | sed 'N;s/\n//' |\
  sed 's/.*\(\/dev\/\w\+\).*\(pci\)[0-9]\{4\}[^/]\+\/[^/]\+\/\([0-9:.]\+\)[^ ]*\/\([0-9:]\+\)[]].*/\1 \2-\3-scsi-\4/' |\
  sed 's/.*\(\/dev\/\w\+\).*\(pci\)[^/]*\/\([0-9:.]\+\)\/ata[^ ]*\/\([0-9:]\+\)[]].*/\1 \2-\3-ata-\4/' |\
  while read dev pci; do
    pp="/dev/disk/by-path/$pci"
    ln -s "$dev" "$pp"
    for part in "${dev}"[0-9]*; do
      [ -e "$part" ] && ln -s "$part $pp-part${part/$dev/}"
    done
  done

相关内容