如何获取所有不可移动磁盘设备名称的列表(仅限 SSD/HDD 和 SATA/IDE)?

如何获取所有不可移动磁盘设备名称的列表(仅限 SSD/HDD 和 SATA/IDE)?

我需要以下形式的所有磁盘设备名称(不是 USB 或 CD ROM)的列表 DRIVES='sda sdb',以便我可以在 bash 脚本中循环遍历它们。

理想的解决方案是不必安装特殊的实用程序,而是使用文件系统中的 /sys|/proc|/dev。

答案1

建议的解决方案:

  1. 将以下 Python 脚本复制到名为的文件中internal_block_device_resource

    #!/usr/bin/env python3
    
    import os
    import re
    from glob import glob
    
    rootdir_pattern = re.compile('^.*?/devices')
    internal_devices = []
    
    def device_state(name):
        """
        Follow pmount policy to determine whether a device is removable or internal.
        """
        with open('/sys/block/%s/device/block/%s/removable' % (name, name)) as f:
            if f.read(1) == '1':
                return
    
        path = rootdir_pattern.sub('', os.readlink('/sys/block/%s' % name))
        hotplug_buses = ("usb", "ieee1394", "mmc", "pcmcia", "firewire")
        for bus in hotplug_buses:
            if os.path.exists('/sys/bus/%s' % bus):
                for device_bus in os.listdir('/sys/bus/%s/devices' % bus):
                    device_link = rootdir_pattern.sub('', os.readlink(
                        '/sys/bus/%s/devices/%s' % (bus, device_bus)))
                    if re.search(device_link, path):
                        return
    
        internal_devices.append(name)
    
    
    for path in glob('/sys/block/*/device'):
        name = re.sub('.*/(.*?)/device', '\g<1>', path)
        device_state(name)
    print(' '.join(internal_devices))
    
  2. 确保脚本具有可执行权限:

    chmod +x internal_block_device_resource
    
  3. DRIVES通过以下方式设置你的bash 变量:

    DRIVES=$(./internal_block_device_resource)

    $ echo $DRIVES
    sda
    

初始版本:

您需要过滤可移动设备,以便可以使用此命令:

find /sys/block/*/device/block/*/removable -exec bash -c 'echo {} | perl -ne "\$a=\$_;s/^\/sys\/block\/(.*?)\/.*/\$1/;print if (\`cat \$a\` == "0")"' \;

使用 USB 棒安装后/dev/sdb,输出仅为sda

答案2

这对我有用:

echo DRIVES=\'`cd /dev; ls sd?; cd`\'

它只是进入 /dev 目录并输出带有 sd 和另一个字符的所有内容。之后,它返回主目录。

答案3

使用lsblk

$ lsblk -o NAME -nl
sda
sda1
sda2
sda4
sda5
sda6
sdb
sdb1
sdb2
sdb5
sdb6
sr0

这将包括任何值得包括的内容。您可以使用选项-I以及设备类型进行过滤。

答案4

您可以使用标准 Linux 实用程序执行此操作:

lsblk -n --scsi --output PATH,RM | \
  grep 0 | \
  awk -F ' ' '{print $1}'

lsblk --scsi --output PATH,RM将列出所有 SCSI 设备及其路径以及它们是否可移动。在我的系统上,它看起来像这样:

/dev/sda  1
/dev/sdb  0
/dev/sdc  0
/dev/sdd  0
/dev/sde  0

可移动设备的第二列为 1,不可移动设备的第二列为 0。我们将列表过滤为仅包含那些不可移动设备,并输出第一个字段,即设备的路径。这将为您提供如下列表:

/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde

将其保存在变量中将允许您循环遍历系统中每个不可移动驱动器的路径。

$ export DEVICES=$(lsblk -n --scsi --output PATH,RM | grep 0 | awk '{print $1}')
$ for DEVICE in $DEVICES; do echo $DEVICE; done
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde

相关内容