Как получить список всех имен устройств несъемного диска (только SSD/жесткий диск и SATA/IDE)?

Мне нужен список всех названий дискового устройства (не USB, или CD-ROM) в следующей форме УПРАВЛЯЕТ ='sda sdb' так, чтобы я мог циклично выполниться через них в сценарии удара.

Идеальное решение не должно было бы устанавливать специальную утилиту и будет использовать/sys |/proc |/dev от файловой системы.

2
задан 16 July 2015 в 01:44

4 ответа

Рекомендуемое решение:

  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 переменная удара этот путь:

    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
ответ дан 2 December 2019 в 03:00

Это работает на меня:

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

Это просто входит/dev-directory и производит все с sd и еще одним символом. После этого это возвращается в дом.

1
ответ дан 2 December 2019 в 03:00

Используйте lsblk :

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

Это будет включать что-либо стоящее включительно Можно использовать -I опция наряду с эти типы устройства , чтобы сделать фильтрацию.

0
ответ дан 2 December 2019 в 03:00

Вы можете сделать это с помощью стандартных утилит 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
0
ответ дан 11 January 2021 в 15:49

Другие вопросы по тегам:

Похожие вопросы: