web-dev-qa-db-ja.com

すべての非リムーバブルディスクデバイス名のリストを取得する方法(SSD / HDDおよびSATA / IDEのみ)

次の形式のすべてのディスクデバイス名(USBまたはCD ROMではない)のリストが必要です。bashスクリプトでループできるようにするには、DRIVES = 'sda sdb'です。

理想的なソリューションでは、特別なユーティリティをインストールする必要はなく、ファイルシステムの/ sys |/proc |/devを使用します。

2
eskhool

推奨される解決策:

  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
Sylvain Pineau

これは私のために働く:

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

単純に/ dev-directoryに移動して、すべてをsdともう1つの文字で出力します。その後、自宅に戻ります。

1
Joshua Gleitze

lsblk を使用します。

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

これには、含める価値のあるものがすべて含まれます。 -Iオプションを device types とともに使用して、フィルタリングを実行できます。

0
muru