Добавление и удаление на ходу SATA/SCSI устройств

    Современный Linux (2.6+) может обнаруживать новоподключенные устройства (на шинах, которые поддерживают hotplug). Их можно, так же отключать, предварительно отмонтировав файловые системы и сделав sync. Среди hotplug шин не только USB, но и SATA, SCSI и SAS (в теории, это же применимо и к PATA, но там много глупых контроллеров, которые не умеют адекватно реагировать на исчезновение устройства).

    Отключать их лучше не дёргая на ходу физическое устройство, а сказав ядру полностью забыть про про него (гарантируя тем самым, что никаких операций ввода-вывода с устройством производиться не будет, даже если вспохватившийся кеш). Кроме того, иногда нужно выполнять эмуляцию процедуры plug-unplug без физического дёргания питания/шины данных (что не очень хорошо для железа). Самая типичная ситуация — это отладка скриптов udev.

    Удаление устройства


    echo 1 >/sys/block/sdX/device/delete
    

    (x — буква устройства, sda, sdb, etc).

    Эта команда удаляет указанное устройство. Заметим, это низкоуровневая команда, которая не проверяет кеш и статус примонтированности, так что лучше сначала сказать umount & sync.

    К сожалению, я не знаю метода совместить выключение шпинделя диска с его удалением с точки зрения ядра. Шпиндель можно отключить командой scsi-spin, однако, при попытке удалить устройство, оно будет раскручено заново и удалено. А у удалённого устройства уже нельзя ничего останавливать (нет устройства). Так что эта часть проблемы пока не решена.

    Добавление устройства


    Мы не можем «добавить» устройство, мы можем отдать контроллеру команду «перечитать» список устройств, подключенных к тому или иному порту. Если там найдётся что-то интересное, ядру дадут знать.

    echo "- - -" >/sys/class/scsi_host/hostX/scan
    

    X — номер шины, совпадает с номером SATA порта на материнской плате. Если не знаете, можете смело делать для всех хостов по очереди, ничего, кроме небольшого лага в дисковых операциях, незаметного для софта и файловой системы, это не даст.

    Обратите внимание, host'ы нумеруются с 0, а не с 1. (а в dmesg ata устройства нумеруются с 1).

    Так же осуществляется и сканирование USB-SATA переходников (usb-боксов и внешних винчестеров — они просто фигурируют как ещё один scsi_host).

    Если мы говорим про SCSI, то вместо "- — -" можно указать точный номер устройства/шины/LUN'а сканируемого устройства (например, «200 1 2»). SATA, в силу архитектурных особенностей (один target для одного initiator) принимает туда только «0 0 0».

    Ещё об удалении… Если вы не знаете буквы устройства, но знаете его физическое место подключения, то удалять можно «прямым текстом», записью «1» в "/sys/bus/scsi/devices/targetX:0:0/X:0:0:0/delete".
    Поделиться публикацией

    Комментарии 47

      +3
      Как раз нужно. Спасибо!
        0
        Наткнулся на эту статью, спасибо.
        Но хотел бы добавить некоторые особенности, с которыми столкнулся на Ubuntu 12.04.
        Команда:
        sudo echo 1 > /sys/block/sdb/device/delete
        
        не работает, выдавая следующую ошибку:
        bash: /sys/block/sdb/device/delete: Permission denied
        


        Приведу пример того, как это работает у меня.
        Добавление(сканирование):
        sudo sh -c "echo "'- - -'" > /sys/class/scsi_host/host0/scan"
        

        Остановка и удаление устройства:
        scsi_stop /dev/sdb   # Останавливает шпиндель
        sudo sh -c " echo 1 > /sys/block/sdb/device/delete"   # Можно дергать
        


        scsi_stop — утилита из пакета scsitools, наличествует в дефолтных репозиториях.
          0
          На счет безопасности сего действа…
          На разъеме у самого диска, некоторые контакты вынесены вперед(идут лесенкой).
          Есть мнение, что это сделано специально для этих целей.
          Мол земля сначала, а потом все остальное.
            +2
            Разумеется, не работает. Как бы должно быть очевидно, что перенаправление вывода sudo прав на выполненение команды не даёт.
              0
              Это я так, для будущих незнаек как я )
              0
              echo 1 | sudo tee /sys/block/sdb/device/delete
            0
            насколько это безопасно?
              0
              Online storage reconfiguration must be done carefully. System failures or interruptions during the process can lead to unexpected results. Red Hat advises that you reduce system load to the maximum extent possible during the change operations. This will reduce the chance of I/O errors, out-of-memory errors, or similar errors occurring in the midst of a configuration change. The following sections provide more specific guidelines regarding this.
              In addition, Red Hat recommends that you back up all data before performing online storage reconfiguration.
                0
                С точки зрения железа — безопасно. (мы про удаление информации в ядре об устройстве). Хотплаг железа имеет определённые нюансы.

                А вот с точки зрения файловой системы — если удалить устройство не отмонтировав его, это эквивалентно «дёрнуть на ходу». Так что сначала отмонтировать, сделать sync; sync (он вроде делается при отмонтировании, но лучше перебдеть), и только потом отключать.
                0
                Вот как-то я возился с внешним eSata хардом под фряху 7.0 и мечтал о чем-то таком, да ещё чтобы настроить поведение харда так, чтобы он шпиндель не останавливал при бездействви, но это поведение как оказалось регулируется только софтинкой под винду и только по USB :(
                Но тогда об этом только мечталось…
                Кстати, кроме отладки скриптов udev ещё полезно при прогоне вхвост и в гриву всяческих soft-RAID-ов без физического передергивания хардов.
                  0
                  Насколько я понимаю, smartctl умеет управлять этими параметрами. В том числе, через большинство usb-коробочек.
                  0
                  То есть, если таким образом удалить из системы устройство, его можно спокойно отключать (не учитывая пока проблемы остановки шпинлеля)? И это применимо к стандартным sata устройствам, а не только esata?
                    +1
                    Разумеется. Не забыв отмонтировать предварительно.

                    SATA отключается в таком порядке: сначала шина данных, потом питание. Включается в обратном: питание, подождать раскрутки шпинделя, шина данных.

                    Разумеется, питание нужно втыкать правильной стороной (воткнуть криво не получится, а вот кинуть напряжение «не туда» воткнув угол верх ногами — запросто). Так что перед втыканием всегда контрольный взгляд на разъём на винте и на питании.

                    Я так давно (и часто) меняю винты — скорость по SATA в три раза выше, чем по USB-SATA.
                      0
                      Стандарт SATA не предусматривает горячую замену активного устройства (используемого Операционной Системой) (вплоть до SATA Revision 3.x), дополнительно подключенные диски отключать нужно постепенно — питание, шлейф, а подключать в обратном порядке — шлейф, питание.

                      на это нам как бе намекают контакты одинаковой длинны во всех sata-разъемах
                        0
                        Мы под хотсвапом подразумеваем разные вещи. Для меня «не hotswap», это когда компьютер начинает виснуть после подтыкания PATA к тупому контроллеру. А hotswap, это когда с нужными предосторожностями можно отключить устройство и подключить обратно без перезагрузки.

                        … А так даже флешки без ритуала дёргать чревато.
                          0
                          PATA — сначала выдергиваем питание, потом шлейф.
                          SATA — сначала выдергиваем шлейф, потом питание.

                          Работает как в виндовс, так и в линукс. В случае с РАТА — на некоторых машинах/виндах возможны зависания, но чаще все проходит нормально.
                            0
                            Вот именно про эти зависания я и говорю. Особый ужас в случае slave/master'ов…
                              0
                              почему с SATA наоборот?
                                0
                                к сожалению обоснованного пруфа предоставить не могу. сам где то на железячных сайтах несколько лет назад прочитал в какой то статье, а потом 3 года очень часто проверял на практике на тысячах разных компов.

                                На винде если у PATA винта выдернуть сначала шлейф — почти всегда BSOD или зависание системы, потому всегда сначала винт удалял в устройствах, потом вырубал питание и только после этого шлейф.
                                С сата наоборот — если сначала втыкнуть шлейф то начинаются тупняки(видно сказывается то что винда думает что это хотплуг устройство, а без питания не получает ответов от контроллера), потому сначала втыкаем питание ждем раскрутки шпинделя и тыкаем шлейф.

                                То есть все дело в типах устройств и в работе дров/контроллеров
                                  0
                                  вообще говоря, здравый смысл подсказывает, что питание нужно подавать последним, а отключать первым всегда и при любых условиях для всех типов устройств. почему здесь это может быть не так, мне не вполне понятно.
                                    0
                                    Вообще-то здравый смысл говорит, что от разрыва цепи данных никому сильно не плохеет, а при разрыве цепи питания по цепям данных может идти любая ахинея (в смысле напряжения/полярности). Не смотря на то, что SATA-power планировался с рассчётом на хотплаг, никто не может гарантировать, что произойдёт при подаче «только 12 вольт и земли» на винт. Так что сначала питание, потом завершение переходных процессов (зарядка кондёров, установление тока в индуктивностях, ток RST по шинам процессоров и т.д.), и только после этого данные.
                                    0
                                    можно сильно уменьшить вероятность бсода, если вырубить предварительно винт в «диспетчере устройств»

                                    и при подключении PATA-винтов винда может его некоторое время «не видеть» пока не обновишь вручную список устройств.
                          • НЛО прилетело и опубликовало эту надпись здесь
                              +1
                              а главное — сразу интересно стало)))
                              +2
                              Спасибо, очень хорошее руководство. Но я вдобавок всё же всегда обесточиваю винчестер заранее через hdparm, а потом только убиваю ввод/вывод и отключаю его.
                                +1
                                Подробнее расскажите. У вас получается отключить устройство в ядре при выключенном шпинделе?
                                  0
                                  Я не понимаю зачем отключать шпиндель, ведь при отключении питания головки по инерции переходят в безопасную зону у шпинделя, и это безопасно и предусмотрено разработчиками жестких дисков. Поправьте меня если я не прав, мне будет интересно.
                                    +1
                                    С точки зрения парковки головок — да. Достаточно отключить питание и дать шпиделю остановиться перед любыми перемещениями, и в смысле механики всё ок.
                                    Остановка шпинделя желательна для того, чтобы в момент размыкания цепи питания там был маленький ток (и маленькая индуктивность). Когда шпиндель кушает электричество, ток больше, а значит, при наличии хоть какой-то индуктивности, и больше напряжение в момент разрыва цепи (индукциональная инерция, кажется называется, но могу название попутать). Чем выше скачок напряжения, тем выше вероятность, что кто-то его не выдержит.
                                      0
                                      Спасибо
                                +2
                                www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/pdf/Online_Storage_Reconfiguration_Guide.pdf

                                вот тут всё тоже самое только подробней (подходит всем современным линуксам)

                                ЗЫ
                                для старых линуксов работать не будет
                                например редхат4 с ядром 2.6.9 требует ребута для гарантированного правильного добавления нового устройства
                                  +2
                                  Текст хороший, но там вообще-то про iscsi. ISCSI от SCSI отличается буквой eth.
                                    +1
                                    два раза прочитал, ничего новго про себя не узнал.
                                      0
                                      там и про FC
                                      т.е. это два основных случая когда добавляются диски online
                                    –6
                                    И опять консоль…
                                      +6
                                      Разумеется. Потому что удобнее пока никто ничего не придумал.
                                        –2
                                        И потом эти люди говорят что вот вот настанет вендекапец.
                                          +1
                                          Мне реально насрать на то, что стоит на компьютерах у хомячков. Я знаю, что удобнее _мне_.
                                        0
                                        На мой взгляд, в манах вообще надо давать только консольные команды, потому что имея консольную утилиту, написать ГУИ легче, чем имея ГУЕвую утилиту, получить результат её работы в консоли.
                                        0
                                        Как это принято у сообществ конкурирующих ситсем, влезу со своими 5 рублями.
                                        в FreeBSD это делается красивей:
                                        для SATA устройств
                                        # смотрим нужное канал/устройство которое необходимо заменить
                                        atacontrol list
                                        # для добавления устойства «отцепляем канал»
                                        atacontrol detach ataN
                                        # «цепляем» канал с нашим устройством
                                        atacontrol attach ataN
                                        # если у устройства пропадало питание, то detach/attach делать не нужно
                                        atacontrol reinit ataN

                                        для SATA/SCSI устройств подключенных через CAM — аналогично, используется другая утилита
                                        # ищем наше устройство
                                        camcontrol devlist
                                        # для добавления нового (соответственно удаления старого) усройства
                                        camcontrol stop daN
                                        camcontrol eject daN
                                        camcontrol rescan all (или нужную шину увиденную в camcontrol devlist)
                                        camcontrol inquiry daN
                                        camcontrol start daN
                                        # с «плохим» устройством делаем ужасные вещи, сбрасываем шину
                                        camcontrol reset daN

                                        удачи (:
                                          0
                                          Ну, собственно, что-то подобное для линукса пишется как набор alias'ов. Кстати, а как бздя относится к USB-HDD?
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              Я имею в виду, оно его за scsi считает?
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            0
                                            уже давно научился.
                                            0
                                            Меня этот метод не раз спасал, когда выбивало винт из RAID, smartctl отваливался с «Input/output error», а в ДЦ надо было отправить запрос на замену с серийником битого винта.
                                            Удаление/добавление — и некоторое время можно опрашивать «плохой» винт через smartctl.
                                              0
                                              Если SATA диски подключены через AHCI работает:
                                              eject /dev/sdX 
                                              

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое