Съемная карта с интерфейсом USB, перечисленная как несъемный в/sys/block?

Насколько я знаю, это не имеет значения в какой порядок поместить разделы в.

Однако "случайный", вероятно, не "корректное" слово для использования здесь. Возможно, Вы означали говорить "произвольный". Кроме того, возможно, у Вас должен быть первый раздел быть /, следующий /home и последний быть swap. Это, по-моему, лучше, чем выбор произвольного порядка, чтобы вставить их, потому что существует "своего рода упорядочивание" здесь в противоположность произвольному упорядочиванию.

5
13.04.2017, 15:36
3 ответа

Селектор съемного USB-накопителя: USBKeyChooser

Думаю, он у меня есть:

Замена grep -Hv 0 / sys / block / * / съемный от grep -Hv ^ ATA \ * $ / sys / block / * / device / vendor , похоже, работает:

export USBKEYS=($(
    grep -Hv ^ATA\ *$ /sys/block/*/device/vendor |
    sed s/device.vendor:.*$/device\\/uevent/ |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
    echo $dev \"$(
        sed -e s/\ *$//g </sys/block/$dev/device/model
        )\" ;
  done

Или даже использование readlink , чтобы убедиться, что это USB, может точнее ...

export USBKEYS=($(
    xargs -n1 readlink < <(echo /sys/block/*) |
    sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
    xargs grep -H ^DRIVER=sd |
    sed s/device.uevent.*$/size/ |
    xargs grep -Hv ^0$ |
    cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
    echo $dev \"$(
        sed -e s/\ *$//g </sys/block/$dev/device/model
        )\" ;
  done

Перемотка назад:

В этом I

  1. Убедитесь, что это USB (или съемный

  2. ). Убедитесь, что это работает как жесткий диск (не CD -Rom)

  3. Убедитесь, что они имеют размер больше 0 (не пустой картридер).

Версия для гольфа:

US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
  sed s+/device.*$+/dev*/ue*+ <(grep -Hv ^ATA\ *$ /sys/block/*/device/vendor)) <(:))) <(:))))

set | grep ^US=

Это может быть написано

US=($(
    cut -d/ -f4 <(
        grep -vl ^0$ $(
            sed s@device/.*@size@ <(
                grep -l ^DRIVER=sd $(
                    sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/dev*/ue*+p' <(
                        xargs -n1 readlink < <(echo /sys/block/*)
                    )
                ) /dev/null # equivalant but quicker than <(:)
            )) /dev/null)))

С ссылка для чтения , версия для гольфа становится:

US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
    sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/dev*/ue*+p' <(
    xargs -n1 readlink < <(echo /sys/block/*)) ) <(:))) <(:))))

В порядке: usbKeyChooser

Последняя версия подпрограммы usbKeyChooser находится в моем интерактивном установщике :

#!/bin/bash
DIALOG=whiptail

usbKeyChoose() {
    while [ ! -b /dev/$STICK ] ;do
        USBKEYS=($(
                xargs -n1 readlink < <(echo /sys/block/*) |
                sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
                xargs grep -H ^DRIVER=sd |
                sed s/device.uevent.*$/size/ |
                xargs grep -Hv ^0$ |
                cut -d / -f 4                 ))
        if [ ${#USBKEYS[@]} -eq 0 ];then
            title="No key found"
        else
            title="Choose wich USB stick have to be installed"
        fi

        menu=(R "Re scan devices")
        for dev in ${USBKEYS[@]} ;do
            read model </sys/block/$dev/device/model
            menu+=($dev "$model")
        done
        num=$($DIALOG --menu "$title" 21 72 14 "${menu[@]}" 2>&1 >/dev/tty)
        if [ ! "$num" ] ; then
            echo "User aborted."
            exit 0;
        fi
        [ ! "$num" = "R" ] && [ "${USBKEYS[num]}" ] && STICK=${USBKEYS[num]}
    done; }

usbKeyChoose
echo $STICK

Мне нравится этот цикл решение, потому что они

  • позволяют вставлять много ключей,
  • ждут регистрации ядра,
  • допустят выбор,
  • по умолчанию ничего и
  • разрешают прерывание пользователем.

В любом случае, даже если пользователь сделал ошибку ОК выбор, следующий экран - это еще один выбор, спрашивающий пользователя, для которого изображение должно быть записано в ключе, по умолчанию на создать новое изображение , что является очень долгим процессом, когда пользователь можно было нажать Ctrl + c

2
27.01.2020, 20:38

Это ответ Ф. Хаури, адаптированный для kdialog:

#!/bin/bash

DIALOG=kdialog

usbKeyChoose() {
    while [ ! -b /dev/$STICK ] ;do
        USBKEYS=($(
                xargs -n1 readlink < <(echo /sys/block/*) |
                sed -ne 's+^.*/usb[0-9].*/\([^/]*\)$+/sys/block/\1/device/uevent+p' |
                xargs grep -H ^DRIVER=sd |
                sed s/device.uevent.*$/size/ |
                xargs grep -Hv ^0$ |
                cut -d / -f 4                 ))
        if [ ${#USBKEYS[@]} -eq 0 ];then
            title="No key found"
        else
            title="Choose wich USB stick have to be installed"
        fi

        menu=(R "Re scan devices")
        i=0
        for dev in ${USBKEYS[@]} ;do
            read model </sys/block/$dev/device/model
            #echo $i $dev "$model"
            menu+=("$i" "$dev $model")
            i=$[i + 1]
        done
        num=$($DIALOG --menu "$title"  "${menu[@]}")
        #echo "num=$num"
        #echo "USBKEYS[num]=${USBKEYS[num]}"
        if [ ! "$num" ] ; then
            echo "User aborted."
            exit 0;
        fi
        [ ! "$num" = "R" ] && [ "${USBKEYS[num]}" ] && STICK=${USBKEYS[num]}
    done; }

usbKeyChoose
echo $STICK
0
27.01.2020, 20:38

Итак, чтобы вытащить это в список, вы можете использовать ту же команду, которую я дал вам раньше, но просто отмените требование removeable:

% for blk in $(lsblk -ndo name) ; do
>        udevadm info --query=all --name "$/dev/$blk" |\
>        grep -q ID_BUS=usb && printf \
>            'findmnt %s -no TARGET ;'\
>                "/dev/$blk" /dev/"$blk"[0-9]
>        } ; done 2>&- |. /dev/stdin 

Ничего страшного - теперь она будет выводить только активные точки монтирования для блочных устройств на шине usb, а я, например, не могу придумать много примеров неснимаемых блочных устройств usb.

Что касается почему ваше текущее устройство не регистрируется как извлекаемое, то наиболее вероятный ответ заключается в том, что его драйвер просто не указывает его таким образом. Когда устройства обнаруживаются программой udev она собирает информацию о них, как только может, основываясь на своей базе правил. Вы можете просмотреть все эти классификации с помощью:

% udevadm info --query=all --name /dev/$BLOCK_DEVICE

Это вернет список всех записей ключ=значение, которые система использует для классификации оборудования, на которое ссылается /dev/$BLOCK_DEVICE. В нижней части этого сообщения slm советует, как эту информацию можно легко разобрать для ваших нужд - и это действительно довольно просто. Документация справедливо описывает ее как "человекочитаемую, удобную для grep". Выше я отфильтровал все блочные устройства только до тех, которые находятся на шине usb с помощью:

% grep -q ID_BUS=usb

Вы также можете пройтись по атрибутам по всему дереву устройств для вашего текущего устройства и другого, чьи атрибуты, по вашему мнению, оно должно отражать. Если этого не происходит, значит, udev назначил его не так, как вы думаете. К счастью, вы можете увидеть каждую точку данных, которая повлияла на его назначение:

udevadm info --attribute-walk --name /dev/$BLOCK_DEVICE

Вы можете использовать эти данные для моделирования новых правил назначения по своему усмотрению.

4
27.01.2020, 20:38

Теги

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