У меня есть устройство для чтения SD-карт. Это простое USB-устройство с тремя разными местами для подключения различных типов SD-карт.

Когда я вставляю в него SD-карту, я могу понять, что SD-карта доступна по адресу /dev/sdb с такими командами, как...

df -h

blkid -o list

fdisk -l

Можно ли сделать скрипт, который будет автоматически:

  1. Скажите, в каком блоке устройств доступна SD-карта (например: /dev/sda или /dev/sdb и т. д..)
  2. Размонтируйте SD-карту.

С помощью udevadm info -a -n /dev/sdb я разработал уникальные данные: ATTRS{idVendor}, ATTRS{idProduct} и ATTRS{serial} для моего устройства чтения SD-карт.

Может ли скрипт получить блок устройства с этими данными?

0
FlexMcMurphy 29 Янв 2021 в 17:28
Для съемных носителей вы можете монтировать автоматически на основе UUID и PARTUUID с AutoFS. Пожалуйста, взгляните на wiki.archlinux.org/index.php/autofs.
 – 
binarysta
29 Янв 2021 в 17:12
Спасибо, но я не хочу монтировать SD-карту. Я хочу знать, в каком блоке устройств доступна SD-карта после ее вставки. Мне нужен скрипт, который сделает это за меня. Я не хочу выполнять какие-либо команды самостоятельно.
 – 
FlexMcMurphy
29 Янв 2021 в 17:30
Никогда не используйте sda или sdb, используйте то, что уже доступно с помощью uuid и т. д., в /dev/disk/by-*/ . Пример вопросов и ответов, на который я ответил: unix.stackexchange.com/questions/569603/…
 – 
A.B
29 Янв 2021 в 17:46
@A.B Удачи. Но мне не нравится такой подход, потому что он требует, чтобы я заранее знал идентификатор SD-карты. Мне нужен скрипт, который будет работать для любой SD-карты, вставленной в этот SD-кардридер.
 – 
FlexMcMurphy
29 Янв 2021 в 18:01

1 ответ

После нескольких часов гугления я нашел этот полезный ответ.

Используя df -h и blkid -o list, я обнаружил, что SD-карта находится в /dev/sdb. Затем я использовал udevadm info -a -n /dev/sdb, чтобы найти productID, VendorID и серийный номер моего устройства чтения SD-карт (устройство USB).

Теперь предположим, что я подключаю устройство чтения SD-карт к другому компьютеру. Этот скрипт будет перебирать все /dev/sdX блоки устройств и сообщать, к какому из них подключено устройство чтения SD-карт.

#!/bin/bash

# If ALL of these variables have values then you get "Success" below.
# If one or more of the variables do not contain a value (unset) or are null then you get "Failure" below.
# These are unique identifiers of the sd card reader
str_vendor="54jf"
str_product="775y"
str_serial="ID_SERIAL_SHORT=519S83946286"

for BLOCK in $(ls /dev | grep "^sd[a-z]$")
do
    echo "Device block " $BLOCK
    grep_vendor=$(udevadm info --query=all /dev/$BLOCK | grep $str_vendor)
    grep_product=$(udevadm info --query=all /dev/$BLOCK | grep $str_product)
    grep_serial=$(udevadm info --query=all /dev/$BLOCK | grep $str_serial)
    echo $grep_vendor
    echo $grep_product
    echo $grep_serial
    
    # From a comment to answer in above link... adding the colon [:] means to test if the variable is null OR unset
    # The udevadm commands result in the grep_* variables becoming NULL if the command returns nothing. (not sure?)
    # This is why the colon is needed. Note: Some reported that "This doesn't work in scripts where set -u is used"
    if [ -z ${grep_vendor:+x} ] || [ -z ${grep_product:+x} ] || [ -z ${grep_serial:+x} ]; then
        echo "Failure"
    else
        echo "Success"
    fi
    
done

Как проверить состояние переменных пришло из этой темы.

Причиной необходимости этой функции было то, что я мог быстро разделить и отформатировать любую SD-карту, подключенную к устройству чтения SD-карт, просто запустив скрипт.

Любые отзывы приветствуются!

Ура ,

0
FlexMcMurphy 30 Янв 2021 в 04:11
Взгляните на dmesg, когда вы вставляете SD-карту
 – 
ctac_
29 Янв 2021 в 20:36
Да, я мог бы это сделать, но я не хочу ничего делать вручную... просто запустите скрипт, и он сделает все за меня. Я думаю, было бы сложнее запустить скрипт на выходе dmesg по сравнению с опросом всех устройств /dev/sdX.
 – 
FlexMcMurphy
29 Янв 2021 в 22:50