LINUX.ORG.RU

помогите удалённо включить извлечённую USB-флешку

 ,


2

4

добрый день! прошу помощи, уважаемые форумчане. Есть удалённый ПК, который работает в качестве сервера. В него вставлена флешка USB, для резервирования ключей. Во время работы с Thunar (монтировал образы дисков) нечаянно извлёк флешку путём нажатия на кнопку извлечения (eject). Теперь нужно её обратно включить чтобы она виделась в системе. Перезагружать сервер нельзя. пробовал это - sudo sh -c ‘echo 1 > /sys/devices/pci0000:00/0000:00:1d.1/usb3/authorized’

прошёлся так по всем портам - не помогло. Потом попробовал заслать 0 вместо 1. При этом подключенный USB-диск на 500 Гб действительно исчез из системы, а при подаче на этот же порт единицы появился. А флешка не появляется. Хотя если запустить приложение Диски, флешка там есть под видом USB 2.0 Drive, но там где обычно разделы - No Media

попробовал ещё так - rrmod usb_storage && modprobe usb_storage это не помогло.

только что установил usbreset с AUR выполнил lsusb, моя флешка вот - Bus 001 Device 007: ID 23a5:5786 USB Disk 2.0

дал команду sudo usbreset /dev/bus/usb/001/007 написало: Resetting USB device /dev/bus/usb/001/007 Reset successful

но это не помогло.

прошу подсказки, как вновь увидеть флешку без перезагрузки и можно ли вообще…



Последнее исправление: corelinux (всего исправлений: 2)
Ответ на: комментарий от Vsevolod-linuxoid

там к сожалению никого нет и не будет несколько дней

corelinux
() автор топика

rrmod usb_storage && modprobe usb_storage это не помогло.

это должно было помочь. Может модуль не выгрузился? Сделай отдельно, без «&&» rmmod и проверь, модуль выгрузился или нет (через lsmod). И потом уже modprobe

Да, и команда должна быть rmmod, не rrmod.

Можно ещё попробовать modprobe -r вместо rmmod (или modprobe --remove)

Chord ★★★★
()

Интересный опыт с eject, попробовал у себя. :) Даже раз пришлось перезагружаться, когда в результате экспериментов отключилась клавиатура.

Но в итоге поборол с unbind/bind. Во всяком случае, флешка стала доступна для действий в ФМ.

Единственно, gxkb перестал почему-то переключать en/ru, и чтобы написать это сообщение, пришлось вводить setxkbmap в терминале.
Хотя, казалось бы, какая связь. Так что на всякий, перезагружусь, может еще что отвалилось. :)

krasnh ★★★★
()
Ответ на: комментарий от i586

eject -t

:)
Ведь чувствовал, что eject может совершать и обратное действие, даже man посмотрел, но мельком…

krasnh ★★★★
()
Ответ на: комментарий от Chord

Можно ещё попробовать modprobe -r вместо rmmod (или modprobe –remove)

всё это испробовано, не работает. Модуль USB я так понял выгрузить никак, так как он встроен в ядро..

corelinux
() автор топика
Ответ на: комментарий от bvn13

ребутни комп

нельзя, это сервер и его нельзя перезагружать, там свои причины. Надо как-то без перезагрузки флешку запустить. Вообщем ребят, я делаю вывод что на данном ПК это возможно особенность юсб-порта или материнки. Через unbind/bind тоже не вышло…

я нашёл в интернет этот скрипт. Он перезапускает всё на свете, всю подсистему USB, и даже это мне не помогло.

#!/usr/bin/env bash

Resets all USB host controllers of the system.

This is useful in case one stopped working

due to a faulty device having been connected to it.

base=«/sys/bus/pci/drivers» sleep_secs=«1»

This might find a sub-set of these:

* ‘ohci_hcd’ - USB 1.0

* ‘ehci-pci’ - USB 2.0

* ‘xhci_hcd’ - USB 3.0

echo «Looking for USB standards …» for usb_std in «$base/»?hci* do echo «* USB standard ‘$usb_std’ …» for dev_path in «$usb_std/»: do dev=«$(basename «$dev_path»)» echo " - Resetting device ‘$dev’ …" printf ‘%s’ «$dev» | sudo tee «$usb_std/unbind» > /dev/null sleep «$sleep_secs» printf ‘%s’ «$dev» | sudo tee «$usb_std/bind» > /dev/null echo " done." done echo " done." done echo «done.»

corelinux
() автор топика
Ответ на: комментарий от corelinux

после всех неудачных экспериментов я попробовал всё это на своём домашнем ноуте где тоже стоит Manjaro. Извлекал флешку через «извлечь» и даже в программе Диски тушил её через кнопку Power, при этом флешка вообще тухла (лапмочка). Но скрипт который я привёл выше (т.е. реализация unbind/bind) флешку возвращал к жизни. Но стоить отметить что на ноуте у меня только порты USB 3.0, возможно контроллер умеет включать/отключать питание на порту. Комп который используется как сервер, на самом деле сервер только формально, по факту обычный старый комп.

corelinux
() автор топика
Ответ на: комментарий от krasnh

Но в итоге поборол с unbind/bind. Во всяком случае, флешка стала доступна для действий в ФМ.

справедливости ради надо сказать, что в этом примере есть строка echo -n «0000:00:1a.0» > /sys/bus/pci/drivers/ehci_hcd/unbind

на моём ПК, который используется как сервер, нет /sys/bus/pci/drivers/ehci_hcd

есть только /sys/bus/pci/drivers/ehci_pci

corelinux
() автор топика
Ответ на: комментарий от corelinux

также потом делал это

echo 0 > /sys/bus/usb/devices/usb1/1-1/1-1.2/authorized echo 1 > /sys/bus/usb/devices/usb1/1-1/1-1.2/authorized

указав свои номера под которыми у меня эта флешка.

не помогло.

corelinux
() автор топика
Ответ на: комментарий от corelinux

А можно этот скрипт в отформатированном виде? Может пригодится в будущем, будет где скопировать.

Выделяется символами ``` в начале текста и в конце. Подробней здесь https://www.linux.org.ru/help/markdown.md.

krasnh ★★★★
()
Ответ на: комментарий от krasnh

А можно этот скрипт в отформатированном виде?

пожалуйста

#!/usr/bin/env bash
# Resets all USB host controllers of the system.
# This is useful in case one stopped working
# due to a faulty device having been connected to it.

base="/sys/bus/pci/drivers"
sleep_secs="1"

# This might find a sub-set of these:
# * 'ohci_hcd' - USB 1.0
# * 'ehci-pci' - USB 2.0
# * 'xhci_hcd' - USB 3.0
echo "Looking for USB standards ..."
for usb_std in "$base/"?hci*
do
    echo "* USB standard '$usb_std' ..."
    for dev_path in "$usb_std/"*:*
    do
        dev="$(basename "$dev_path")"
        echo "  - Resetting device '$dev' ..."
        printf '%s' "$dev" | sudo tee "$usb_std/unbind" > /dev/null
        sleep "$sleep_secs"
        printf '%s' "$dev" | sudo tee "$usb_std/bind" > /dev/null
        echo "    done."
    done
    echo "  done."
done
echo "done."
corelinux
() автор топика
Ответ на: комментарий от corelinux

если кто умеет подправить скрипт, пожалуйста сделайте исправление. в нём есть вот такая строка = for usb_std in «$base/»?hci*

это не очень хорошо, так как скрипт сносит устройства с шины ahci, которые не являются юсб-устройствами) таким образом слетают все диски HDD/SDD на шине AHCI. Они то сразу перезапускаются после bind, но если диск в этот момент использовался а дана такая команда, возможна порча данных

corelinux
() автор топика
Ответ на: комментарий от corelinux

возможно контроллер умеет включать/отключать питание на порту.

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

что ты от него ожидал если то же самое вручную не помогло?

вручную пробовал включать/отключать саму флешку. А скрипт кроме конкретных устройств переподключает все существующие в системе USB-концентраторы. Посчитал что может такая глобальная перезагрузка решит ситуацию)

на данный момент я так и не понимаю до сих пор, почему не могу увидеть флешку. Например я включаю приложение Диски. Оно показывает мне список всех примонтированных устройств. В списке есть и моя флешка, только когда на ней нажимаешь там светится вместо разделов фраза No Media когда запускаю скрипт который ребиндит юсб-систему, флешка и другой USB-диск пропадают из этого списка. После включения они снова появляются. Но диск появляется с разделами. А флешка нет.

corelinux
() автор топика
Ответ на: комментарий от firkax

А ты смотри не в гуи а в /dev. Ещё можно с помощью dd её попробовать прочитать

только что попробовал

[manjaro manjaro]# hexdump -C /dev/sdc
hexdump: /dev/sdc: No medium found
hexdump: all input file arguments failed
corelinux
() автор топика
Ответ на: комментарий от corelinux

/dev/sdc: No medium found

Да видит система твою флешку, ресетить шину нет смысла.
Просто флешка выполнила команду и выплюнула из себя media :)
Тут надо копать в сторону sg3_utils, отдать SCSI-команду чтоб обратно загрузилось media.
Я сначало подумал, что надо:

sg_start -l -vvv /dev/<флешка>

но моей transcend это не помогло, помогло следующее:

sg_reset -t -vvv /dev/<флешка>
arson ★★★★★
()
Последнее исправление: arson (всего исправлений: 2)
Ответ на: комментарий от arson

но моей transcend это не помогло, помогло следующее: sg_reset -t -vvv /dev/<флешка>

[manjaro ~]# [manjaro ~]# sg_reset -t -vvv /dev/sdd
sg_reset: starting target reset
    third argument to ioctl(SG_SCSI_RESET) is 0x4
sg_reset: completed
corelinux
() автор топика
Ответ на: комментарий от corelinux

на моём ПК, который используется как сервер, нет /sys/bus/pci/drivers/ehci_hcd

Погляди в dmesg | grep usb на строки new ... USB device number ... using, возможно у тебя для флешки использовался другой интерфейс, типа xhci_hcd.

agentgoblin
()
Ответ на: комментарий от agentgoblin

Погляди в dmesg | grep usb на строки new … USB device number

[manjaro ~]# dmesg | grep usb
[88050.993141] usb 1-6: reset high-speed USB device number 3 using ehci-pci
corelinux
() автор топика
Ответ на: комментарий от agentgoblin

возможно у тебя для флешки использовался другой интерфейс, типа xhci_hcd

я на своём домашнем ноуте где стоит тоже Manjaro попробовал это с флешкой. и она переинициализируется посредством unbind/bind и вот на домашнем ноуте действительно используется интерфейс xhci_hcd

corelinux
() автор топика
Ответ на: комментарий от corelinux

Перед выполнением команд запусти в соседнем терминале udevadm monitor и покажи что пишет (желательно с разделением по командам).

arson ★★★★★
()
Ответ на: комментарий от arson

Перед выполнением команд запусти в соседнем терминале udevadm monitor

запустил. выполняю команду

sg_reset -t -vvv /dev/<флешка>

вывод :

 sudo sg_reset -t -vvv /dev/sdb
sg_reset: starting target reset
    third argument to ioctl(SG_SCSI_RESET) is 0x4
sg_reset: completed target (or bus or host) reset

во втором терминале показываю:

[manjaro@manjaro ~]$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[104856.438565] change   /devices/pci0000:00/0000:00:1d.7/usb1/1-6/1-6:1.0/host4/target4:0:0/4:0:0:0/block/sdb (block)
UDEV  [104856.451657] change   /devices/pci0000:00/0000:00:1d.7/usb1/1-6/1-6:1.0/host4/target4:0:0/4:0:0:0/block/sdb (block)
corelinux
() автор топика
Ответ на: комментарий от arson

А sg_start ?

open /dev/sdb with flags=0x802
    start stop unit cdb: [1b 00 00 00 03 00]
      duration=0 ms
[manjaro@manjaro ~]$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[106038.826351] change   /devices/pci0000:00/0000:00:1d.7/usb1/1-6/1-6:1.0/host4/target4:0:0/4:0:0:0/block/sdb (block)
UDEV  [106038.838968] change   /devices/pci0000:00/0000:00:1d.7/usb1/1-6/1-6:1.0/host4/target4:0:0/4:0:0:0/block/sdb (block)

тоесть то же самое при выполнении обоих команд.

corelinux
() автор топика

Короче у меня сработало так:

echo 0 > /sys/bus/usb/devices/usb1/authorized
echo 1 > /sys/bus/usb/devices/usb1/authorized

Срабатывает, только когда сбрасываю всю шину целиком.

U2
()
Последнее исправление: U2 (всего исправлений: 2)
Ответ на: комментарий от U2

Срабатывает, только когда сбрасываю всю шину целиком.

так делал ещё тогда, когда не открывал этот топик) к сожалению в моём случае не помогает.. Если к этой же шине подключено не извлечённое устройство, то при рестарте шины оно пропадает а потом появляется. А флешка не появляется.

corelinux
() автор топика

некоторые флешки после reset ожидают от udevd кофигурацию с параметрами как именно media должен быть подключен к USB-шине. К сожалению я не помню как именно засылать эти параметры флешке.

cvv ★★★★★
()

А если так?

echo suspend > /sys/bus/usb/devices/«номер устройства»/power/level
sleep 10
echo on > /sys/bus/usb/devices/«номер устройства»/power/level
greenman ★★★★★
()
Ответ на: комментарий от corelinux

Я бы попробовал отключить питание флешки, через программу диски. И снова перезапустить шину.

U2
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.