Como obter a lista de todos os nomes de dispositivos de disco não removíveis (apenas SSD / HDD e SATA / IDE)?

2

Eu preciso de uma lista de todos os nomes de dispositivos de disco (não USB ou CD ROM) na seguinte forma DRIVES = 'sda sdb' para que eu possa percorrê-los em um script bash.

A solução ideal não precisaria instalar um utilitário especial e usaria / sys | / proc | / dev a partir do sistema de arquivos.

    
por eskhool 26.09.2014 / 09:12

3 respostas

2

Solução recomendada:

  1. Copie o seguinte script python em um arquivo chamado 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. Certifique-se de que o script tenha permissão executável:

    chmod +x internal_block_device_resource
    
  3. Defina sua variável DRIVES bash desta maneira:

    DRIVES=$(./internal_block_device_resource)

    $ echo $DRIVES
    sda
    

Versão inicial:

Você precisa filtrar dispositivos removíveis para poder usar este comando:

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

Com um stick USB montado como /dev/sdb , a saída é apenas sda .

    
por Sylvain Pineau 26.09.2014 / 10:04
1

Isso funciona para mim:

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

Ele simplesmente vai para o diretório / dev e produz tudo com sd e mais um caractere. Depois disso, ele retorna para casa.

    
por Joshua Gleitze 26.09.2014 / 09:28
0

Use lsblk :

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

Isso incluirá qualquer coisa que valha a pena incluir. Você pode usar a opção -I junto com os tipos de dispositivo para fazer a filtragem.

    
por muru 26.09.2014 / 09:52