К вопросу о Linux (Л) -24



Мы исходим из того, что вы получаете полноценную операционную систему, сразу полностью за все заплатив. (Билл Гейтс в ответ на вопрос о конкуренции с Л.)


Чем больше я узнаю о Linux, тем меньше я ненавижу Б.Г.


Ну, вообще то, я никогда не испытывал к нему столь сильных чувств, просто начинаю лучше понимать, за что фирма, производящая Окна, берет деньги. И становится яснее, почему потребители предпочитают платить Биллу (тут, конечно, есть варианты, ну Вы поняли), вместо того, чтобы воспользоваться бесплатной («то есть даром») альтернативой. Но начнем по порядку, и рассмотрим два эпизода взаимодействия с Л.

В последнее время на разрабатываемых мною устройствах функционирует Л (в той или иной своей ипостаси, ну да Вы поняли …), в рамках которой исполняется ПО специального назначения. И вот в процессе взаимодействия с внешними устройствами (специализированными клавиатурами) были обнаружены интересные артефакты поведения ОС, которые и привели к мысли изложенной в эпиграфе.

Эпизод первый — в процессе коррекции программы клавиатуры, подключаемой по USB, «случайно, не-нарочно» был внесен дефект, который приводил к невыдаче строкового дескриптора устройства. Для тех, кто не сильно связан с USB, необходимое пояснение — строковый дескриптор — это необязательная часть описания устройства, которая предназначена исключительно для визуализации типа устройства и производителя системными утилитами. Тем не менее, это не оправдание программистам и такие ошибки не следует допускать, но все бывает в жизни. Как может отреагировать хост под управлением вменяемой ОС в случае подключения к нему подобного неправильного устройства?

Лично я вижу 3 возможные стратегии:

  1. проигнорировать ошибку и работать с устройством дальше, тем более, что никаких препятствий для этого нет — так поступают Окна, по крайней мере, начиная с 7, и это замечательное решение;
  2. пометить устройство, как неисправное, выдать соответствующее системное сообщение и дальше игнорировать данное устройство — тоже вполне нормальная и осмысленная реакция;
  3. повторять запрос строкового дескриптора и, пока он не будет получен, не начинать работу собственно с данным устройством — тоже вполне приемлемое решение, хотя несколько хуже предыдущих, поскольку занимает определенную часть ресурсов процессора и шины USB (а они совсем не безграничны).

Пнп: Следует отметить, что стандарт на интерфейс лишь предусматривает необходимость (рисунок 8.31 на странице 222) при ожидании входного сообщения контролировать время и обрабатывать тайм-аут, как одну из возможных ошибок — повторить запрос 3 раза, а далее выдать сигнал о неудаче транзакции. Дальнейшие действия хоста определяются реализацией. Ну, по крайней мере, я не нашел в стандарте подобной информации, хотя это и не окончательно.

Так вот, разработчики Л не ограничились лежащими на поверхности решениями и пошли глубже, придумав необычайно интересный и, не побоимся этого слова, идиотский весьма креативный способ:

4. повторять запрос определенное количество раз, по исчерпанию какового пометить устройство, как неисправное и далее его отключить.

Пока ничего криминального, если бы не одна маленькая деталь («а все остальное — нюансы») — пока Л хост повторяет вышеуказанный запрос, он монополизирует доступ по шине (скорее всего не запускается тайм-аут в железе либо не обрабатывается прерывание от него) и все (!!!) остальные USB устройства простаивают. Занимает этот процесс порядка десятка секунд, в течении которых все устройства недоступны – уже неплохо. А вот и вишенка на торте — после исчерпания попыток провести чтение строкового дескриптора у неправильной клавиатуры, к ней вообще перестают приходить пакеты, она после тайм-аута в 2 секунды понимает, «что что-то пошло не так», и пытается предъявить себя хосту заново путем пере-подключения, в результате чего процесс повторяется. Результаты вполне понятны — работа с шиной просто невозможна, если Вы не готовы к использованию режима «икания». Необычайно оригинальное решение, но это (оригинальность) его единственное достоинство.

Мои знакомые Линуксоиды после демонстрации данного явления сначала пытались объяснить его в стиле «это не баг, это фича такая» (вернее, сначала они, как у них принято, предложили пересобрать ядро с последними патчами, это вообще в Л сообществе универсальный ответ на любое сообщение о возможной ошибке), а потом сказали, что, да, поведение неправильное, но, наверное, где-нибудь в конфигах сборки есть флажок, сбросив или установив который, можно данное поведение системы отключить. Если это действительно так, то единственное название для флажка, которое я могу предложить, это (на русском языке): «Я_действительно_хочу_чтобы_ОС_вела_себя_при_сбое_строкового_дескриптора_как_истеричка», в стиле «Пока эта сука не скажет мне свое имя, я вообще ни с кем разговаривать не буду», прошу прощения за мой французский. Ну и даже если это так и такой флаг есть, разве по умолчанию ОС не должна собираться в нормальном, не извращенном, режиме? Почему-то Окна именно так и делают. Конечно, следовало бы посмотреть исходный текст хоста Л (скорее всего, конкретного USB драйвера) и определить, есть ли такой флажок и как вообще добиваются подобного поведения системы, но по причинам, указанным ниже, это сделано не было, так что ограничимся только констатацией факта.

Вторая фича (намного больше похожая на ошибку, поскольку все-таки в первом случае устройство было неправильное, что я сразу подчеркнул) была выявлена после того, как ошибка программы устройства была устранена и мы начали работать дальше.

Дело в том, что на спроектированном устройстве наличествовали два контроллера, которые реализовывали функцию джойстика и клавиатуры каждый, при этом один обрабатывал левую часть клавиатуры, а второй — правую. Но одна кнопка передней панели была заведена на оба контроллера, поскольку на ней была маркировка «ОГОНЬ» и результаты сбоя одного контроллера были бы весьма неприятны. При нажатии на эту кнопку оба контроллера выдавали символ «пробел» и все было неплохо, пока мы не заметили, что иногда (~10% случаев) после отпускания кнопки Л продолжает считать ее нажатой и приложение переходит в режим непрерывного огня. При этом повторное нажатие и опускание кнопки возвращало систему в нормальный режим.

Было высказано предположение, что близко расположенные (по времени) события от клавиатуры могут быть пропущены, в данном случае сообщение об отпускании кнопки.

Далее были проведены различные действия для определения причины неисправности, но их описание выходит по объему и тематике за данный пост и будет (я надеюсь) описано отдельно. Но сам по себе процесс выяснения причин столь несложной (на первый взгляд) ошибки потребовал таких усилий, что пропало всякое желание разбираться в причине первого описанного в посте бага.
Возвращаясь к эпиграфу, должен сказать, что на Окнах7 данный дефект не наблюдался на протяжении по меньшей мере 100 нажатий, что говорит об устойчивости этой ОС по данному фактору. Опять-таки, исходных кодов я не видел, но поведение программы говорит само за себя.

Маловероятно, чтобы квалификация разработчиков Окон существенно превосходила аналогичный показатель для сообщества с открытым кодом и вопрос, видимо, только в качестве тестирования, которое однозначно проводится в большем объеме (и с более высоким качеством), когда оным занимаются люди, получающие за свою работу деньги (помимо морального удовлетворения).

Вынужден констатировать, что поведение Л, по крайней мере в описанных ситуациях, как нельзя лучше определяется фразой «ну работает же», что нельзя считать приемлемым для ОС, претендующей на надежность и широкое распространение, вот почему мое отношение к Б.Г. в результате данного эпизода улучшилось, поскольку он точно не виноват в происходящем (хотя тут могут быть разные мнения).




Комментарии (118):

  1. nckma
    /#21271882 / +3

    Я давно работаю с Linux и у меня бывали случаи, когда думаешь «что за чертовщина!».
    Однако, каждый раз, когда я пытался разобраться в этой чертовщине, то всему находилось вполне логичное объяснение, и обычно выходило, что я сам не прав.
    Затрудняюсь сказать, что именно у вас там происходит, но вероятно, вы не правы.
    Ядро Linux очень стабильное и очень правильное.
    Я даже скорее допущу, что баг в вашей клавиатуре и ее саму нужно чинить.
    У вас есть аппаратный USB анализатор? Вот им бы посмотреть что на самом деле происходит…

    • GarryC
      /#21272252

      Анализатор есть, и он показал, что на токен IN наша клавиатура отвечала ACK, но пакет DATA не передавала, то есть это точно наша ошибка. При этом Л не передавал ни одного пакета до окончания кадра, далее ситуация повторялась. Windows через некоторое время передавала очередной пакет для других устройств и повторяла запросы к строковому дескриптору в следующем кадре 3 раза, после чего прекращала их.

      • nckma
        /#21272710

        Вам нужно клавиатуру менять или чинить.
        Если у устройства нет данных для ответа на токен IN, то оно все равно должно ответить DATA пакетом, даже пустым. Тогда контроллер вам пришлет ACK.
        Насколько я помню, должно быть так:
        SETUP
        ->Setup
        <-Data0
        ->Ack
        IN
        ->In
        <-Data1 (no data)
        ->Ack
        OUT
        ->Out
        ->Data0 (no data)
        <-Ack

        На токен In клавиатура имеет право ответить только пакетом Data0/Data1 и ни в коем случает не Ack. Аck пошлет клавиатуре хост, если принятые им данные Data корректные по CRC

        Если логика USB у устройства не верная, то чего ожидать от Линукса?

        • GarryC
          /#21272732

          Конечно же, логика у устройства неверная, я уже об этом написал. Но подобные ситуации стандартом предусмотрены и завешивать ВСЕ устройства — это неправильно.

          • nckma
            /#21272778

            Не знаю, что вы называете «завешивать все устройства», но с моей точки зрения, порт на котором обнаружено багованное устройство лучше отключить для предотвращения более опасных ситуаций типа конфликтов на шине, сильное потребление тока и т.д.
            Возможно, то, что вызывает у вас такое негодование на самом деле сделано умышленно, для сохранения жизнеспособности системы при обнаружении устройства с багом в протоколе USB.

            • GarryC
              /#21272832

              Под завешивать все устройства я подразумеваю прекращение любого обмена по шине, в том числе с нормальными устройствами на время принятия решения по багованному устройству — около 10 секунд…
              А с багованным устройством можно поступать, как захочет хост, в том числе отключать его и с этой точки зрения к Л претензий никаких нет и быть не может.

    • justhabrauser
      /#21272528 / +1

      Владелец уранового лома предъявляет претензии производителям унитазов в вагонах РЖД.
      Ашотакова?

      • GarryC
        /#21272684

        А то такого, что стандартом на USB данная ситуация предусмотрена и все, что требовалось от Л — это реализовать требования стандарта в полном объеме, тогда урановые ломы не страшны.

        • justhabrauser
          /#21272714

          1. Про стандарты (POSIX, например) лучше в техподдержку Microsoft написать. Можно узнать много нового.
          2. Про "не страшны" — это к ОС РВ (ОС Реального Времени).
          3. Не стоит натягивать сову на глобус поведение отдельно взятой подсистемы отдельно взятой реализации ОС с отдельно взятой железкой на качество самой ОС.

          • GarryC
            /#21272926

            Хотел бы услышать Ваше мнение, что еще может характеризовать качество самой ОС, кроме «поведения отдельно взятой подсистемы отдельно взятой реализации ОС с отдельно взятой железкой»?

            • justhabrauser
              /#21272986 / +2

              Ну, например, когда неудачно выбранный видеодрайвер валит ОС в BSOD, откуда оно уже никогда не возвращается. Потому что работа с графикой глубоко впаяна в ядро.
              Или, например, когда неудачный веб-браузер (IE) технически невозможно выпилить из ОС даже силами самих разработчиков. Потому что он глубоко впаян в ОС.
              Это — неудачная ОС, потому что сама архитектура неудачная. И изменить это невозможно.
              А удачная ОС состоит из кубиков. Которые вы можете сложить так, как посчитаете нужным (если захотите). И если один кубик поломается всё здание не сложится.
              Вы же кернел паник не поймали? Дисковая подсистема продолжает работать? Буквы на экране бегают?

              • fougasse
                /#21273428 / +1

                Монолитное ядро — это у вас кубики?
                Рискну быть заминусированым, но если так рассуждать то добавления дров от мыши 2004 года в ядро в 2020 — тоже неудачная архитектура.

                • nckma
                  /#21273452 / +1

                  Ну есть insmod/rmmod/modprobe. Так что монолитность довольно условная.
                  Кроме того, вы реально можете сконфигурировать и собрать свое ядро из нужных вам кубиков.

                • justhabrauser
                  /#21273454

                  Для перфекционистов есть Debian+Hurd.
                  На другом конце — можете хоть кеды в загрузочный образ вкомпилить.
                  Можете вкомпилить дрова в ядро — можете загрузить как модуль — можете вообще не загружать.
                  У вас есть выбор.
                  PS. я буду читать камменты

                • justhabrauser
                  /#21273504

                  И да — какие претензии к мышу 2004 года? Что за расизм?
                  Я вот сейчас пишу с машины с процессором выпуска Q1'04 (P4 3.0GHz). Мне застрелиться?

                • ooki2day
                  /#21275214

                  а как условный «роадмап» связан с архитектурой? как посчитали нужным, так и поставили приоритеты. в конце концов, Вас никто не держит, и Вы сами можете закоммитить так нужные Вам дрова. либо собрать только для себя

                • wholeman
                  /#21276512

                  У меня есть несколько старых устройств, которыми я всё ещё иногда пользуюсь, некоторые вообще прошлого века, и большое спасибо, что они всё ещё присутствуют в ядре. В виде модулей, конечно. А вот в Windows я ими воспользоваться не могу, ибо производители на драйвера давно забили.

  2. vilgeforce
    /#21271966 / +1

    О, как я вас понимаю! За давностью лет не помню всех деталей, но у меня вроде бы тоже строковой дескриптор устройство не отдавало, при запросе перезагружалось. При этом венда этот дескриптор не просила и устройство работало. На такой случай, есть USB_QUIRK_CONFIG_INTF_STRINGS, который надо прописать в drivers/usb/core/quirks.c ;-)

    • ky0
      /#21273114 / +7

      Вот, какая плохая ОС — приходится аж какую-то там строчку в файлик записывать! :) А в винде просто ждёшь три года, когда обновят драйвер — и порядок.

      • nikolayv81
        /#21273260 / +1

        Исходя из адреса файлика для строчки, предположу что ещё и ядро пересобоать, но в любом случае это лучше чем ничего.
        Другое дело, что возможно, можно было бы заложить вероятность такого бага в устройстве, что возможно, и сделали в МС.

        • nckma
          /#21273460 / +2

          Все зависит от точки зрения.
          Одна точка зрения — запустить устройство во чтобы то ни стало, лишь бы хоть как-то заработало. Вторая точка зрения — если есть подозрение, что в устройстве баг, то заблокировать его и не использовать от греха подальше.
          Обе точки зрения имеют право на существование, но что более правильно?

          • nikolayv81
            /#21274002

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

            • nckma
              /#21274704 / +1

              Статья слишком эмоционально окрашена, в ней нет фрагментов кода прикладной программы или каких-то скриншотов. Все одни эмоции.
              Я вот думаю, что видимо они сами делают свою кастомную клавиатуру и что-то там намудрили со своей реализацией USB, а признавать свои ошибки не хотят — грешат на Линукс.

              • GarryC
                /#21276382

                Ну прочитайте все таки, там все написано. Да, при проектировании кастомной клвиатуры была допущена ошибка (я 3 раза об этом написал в разных местах), но обработка данной конкретной ошибки в Л драйвере сделана не в соответствии со стандартом USB, что и привело к откровенно неудачному поведению системы. Свою ошибку в первой части мы признали, исправили и далее все заработало нормально.
                А вот вторая часть — целиком и полностью на совести Л, поскольку анализатор шины показывает, что состояния обоих клавиатур прочитаны, значит, теряется отжание клавиши в недрах ОС.

                • nckma
                  /#21276562

                  Хм… ну хоть что нибудь покажите из ваших изысканий! Ни скриншотов, ни фрагментов вашего кода (как вы читаете события клавиатуры — а читать события клавиш можно в Linux многими разными способами), ни протоколов USB анализатора, ни даже версии вашей Linux мы не знаем. Какое железо? Линукс он знаете работает и на Raspberry Pi и сотовом телефоне и в точке доступа Wifi и в платах FPGA на кастомных процессорах.
                  В общем беспредметный разговор…

      • Revertis
        /#21273264

        Так не только ведь записывать, а пересобирать ядро с ним. Это так просто?

        • ky0
          /#21273386 / +4

          С реверс-инженерингом драйвера не сравнится.

  3. KYuri
    /#21272000 / +4

    Суть статьи:

    • на конкретном примере X я обнаружил, что поведение системы Y не соответствует моим ожиданиям, а поведение системы Z меня устраивает;
    • как будут вести себя эти системы на другом конкретном примере N, я даже не задумываюсь и в расчет не беру;
    • то, что поведение системы Y можно изменить, приложив определенные усилия, а поведение системы Z — нельзя, тоже в расчет не беру;
    • несмотря на эти мои «в расчет не беру», я считаю, что система Y — говно плохая, а система Z — конфетка хорошая;
    • невзирая на пункт в правилах «не следует путать хабр с жалобной книгой», свои переживания и выводы я изложил в статье

    • GarryC
      /#21272128 / -1

      1а. На конкретном примере я обнаружил, что система Х ведет себя неправильно (это я про второй эпизод, не-отжатие клавиши — это неправильно).
      1б. Система У ведет себя правильно, значит реализовать правильное поведение возможно.
      2. Другие конкретные примеры можно не рассматривать, ошибка уже имеет место быть.
      3. Поведение системы Х, может быть, удастся изменить, хотя процесс не так прост, как нам говорят, поведение системы У в данном случае в коррекции не нуждается.
      4. Делаю вывод (на мой взгляд, обоснованный), что система Х в данном конкретном аспекте не столь хороша, как система У.
      5. Нисколько не предполагая, что Хабр внимательно читают контайнеры системы Х, ни в коем мере не рассматриваю свой пост, как жалобу, но скорее склонен предполагать, что это предостережение тем читателям, которые считают систему Х абсолютно надежной.

      • nckma
        /#21273540 / +2

        «Неотжатие клавиши» — хм… думаю этому тоже найдется простое и логичное объяснение. Просто вы искать не хотите. Возможно это опять же баг вашей программы. Вы на чем пишите программу? Точно ли она у вас кроссплатформенная и обработчик нажатий точно одинаков в линукс и виндовс? А то может эти обработчики написаны по разному и соответственно ведут себя по разному.
        Я пожалуй повторюсь — Linux очень хорош, если что-то не работает — ищите ошибку в своей программе, врядли ошибка в ОС.

        • GarryC
          /#21276422

          Ну можно попросить Вас прочитать статью? Есть 2 клавиатуры, подключенные по USB к компьютеру, они вполне себе работают, но при одновременном нажатии двух одинаковых кнопок на разных клавиатурах иногда клавиша считается постоянно нажатой после отпускания. Происходит авто-повтор, причем не в нашей программе, а в любом окне, в том числе в консоли (хотя я об этом не написал, извиняюсь). Каким боком тут может быть наша программа, я не понимаю. Если на том же железе запустить Винду, то все отрабатывается нормально.

      • viordash
        /#21276388

        :) Эх,
        если бы Вы написали не просто какой-то Linux, а например AstraLinux, то реакция Ваших оппонентов вероятно была бы другой

        • GarryC
          /#21276402

          Ну, вообще то, это как Астра и был :)

          • zabbius
            /#21276428

            А что-нить поприличнее не пробовали ради интереса? Дебиан там какой или Арч? Чисто для сравнения, что проблема именно общая, а не в Астре.

  4. 1delovoj1
    /#21272208 / +2

    Сколько было случаев когда Виндовс(любая) не работала(как надо) с оборудованием даже крупных производителей(разработанного по всем стандартам)?
    Разные диструбутивы Linux по разному работают с оборудованием(как стандартным так и не стандартным). Прежде чем обижать бесплатное программное обеспечение после неудачного опыта подключения к нему нестандартного оборудования(слепленного на коленке «абы як») нужно просто подумать о ком то кто может все это настроить(всего один раз). И практика показывает что после этого Linux работает много много лет без сбоев, в отличие от поделки БГ. не могу писать чаще раза в сутки, но да, я знаю где ваша ошибка.

    • GarryC
      /#21272284

      Так я и не спорю, что такое бывает. У меня была ситуация, когда Виндовс ОЧЕНЬ медленно работал по сети с МК устройством, на котором крутилась программа с использованием Uip, причем Линукс работал замечательно. Оказалось, что в Винде по умолчанию принят размер кадра в 2 пакета, который Uip никак не поддерживает, пришлось править конфиги.
      Я никак не против Линукса, но не все так просто…

  5. zabbius
    /#21272258 / +3

    Линух, да, бывает косячит. Однако, в отличие от мелкомягкой поделки, поддается починке/допиливанию. Если что-то не работает в линуксе — чиним, если что-то не работает в винде — аминь, идем покупать то, что в ней работает.

    • GarryC
      /#21272318

      Видите ли, я тоже верил, что так оно и есть, но в данном конкретном случае при попытке разобраться с причинами пришлось столько лазить по исходникам и попасть в такие дебри, которые я хотел бы «развидеть». Возможно, в следующий раз мне будет легче, но первое (вообще то, второе, я уже туда лазил) знакомство с исходными кодами Л меня скорее огорчило, нежели обрадовало.

      • zabbius
        /#21272348

        Дык это потому что у вас напрочь не массовый случай. Вы первый нашли этот баг, до вас его никто не встречал. Логично, что редкий баг чинить сложнее и дольше, чем массовый.
        В случае с виндой это был бы тупик.

      • dlinyj
        /#21273018

        callidus77:
        Помница в нашей сетке монтажники подключали абонента. Пришли, воткнули сетевуху, а у него Фря и дров нету. Почесали головы и ушли. Чел через три недели наконец-то коннектится.
        Грят: «Долго ж ты искал дрова.»
        Он: «Я не искал. Я их сам написал.»


        Отсюда. О чём ваш пост мне непонятно. Если вы нашли проблему в ядре, так исправьте её. Что ныть?

        • Revertis
          /#21273274 / -1

          Видимо, у чувака слишком много свободного времени, и он его не ценит.

          • dlinyj
            /#21273406

            В 2005 это был единственный путь. Ну и плюс, опыт. Бесплатное обучение. Наоборот очень ценит время

            • Fox_exe
              /#21273712 / +1

              А если он этими дровами ещё и с остальным миром поделился — ему ещё и спасибо сказала куча народу.

        • symbix
          /#21273710 / +1

          Ха, а у меня как-то давно была ровно такая же ситуация, как в той цитате с башорга — FreeBSD и новенькая модель интеловой сетевухи.


          Я, правда, всего-навсего добавил PCI ID в список поддерживаемых драйвером em, на ближайшую модель, и все заработало.

        • GarryC
          /#21276440 / -1

          Я нашел проблему в поведении ОС, если бы я нашел конкретную проблему в текстах, то, наверное, исправил бы ее.
          Вы, вообще то, пробовали что-либо исправлять в ядре Л, смотрели исходные коды? Я — смотрел, и с тех пор на фразу «Так исправьте ядро» смотрю с большой настороженностью.

          • dlinyj
            /#21276568

            Вы, вообще то, пробовали что-либо исправлять в ядре Л, смотрели исходные коды?
            Посмотрите мои публикации, и после этого задавайте вопросы. Вёл курс по модулям ядра.

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

  6. merhalak
    /#21272268 / +4

    Конечно же, Вы оформили баг и отправили его в багтрекер Вашего дистрибутива? Можно ссылку?

    • GarryC
      /#21272290 / -3

      Конечно же, нет, я об этом написал во второй части (которая еще не опубликована), когда разбирался с причинами. Я просто не умею это делать, никогда не приходилось.

      • lorc
        /#21272416 / +1

        Т.е. вы бесплатно пользуетесь трудом тысяч человек, но вам лень помочь им, разобравшись хотя бе с тем как репортить об ошибках? Лично я вообще исповедую принцип «разобрался в проблеме — засабмить патч». Благо в Linux это в принципе возможно. Но я понимаю что не все готовы возиться с процессом upstream.

        Тем не менее, открыть файл MAINTAINERS и написать в linux-usb@vger.kernel.org описание проблемы — не так уж и сложно. Тем более, что вы в принципе уже разобрались с проблемой.

        И вообще, раз уж ваше устройство ведет себя некорректно — добавьте соответствующий quirk как писали выше. Естественно, что разработчики ядра ничего не могут знать об «особенностях» вашей конкретной железяки.

      • maxzhurkin
        /#21273010

        В конце концов, можно в исходниках поправить и собрать "для себя любимого" уникальное ядро без этого бага

    • justhabrauser
      /#21272510 / +4

      Не царское это дело — багрепорты писать.
      Тем более бесплатно (даже плюсвкарму не дадут).

      • jcmvbkbc
        /#21274496

        Тем более бесплатно (даже плюсвкарму не дадут).

        Могут добавить тег Reported-by к патчу.

  7. evgenyk
    /#21272312 / +1

    Претензии не по адресу, ИМХО, вы тот человек, которому нужно исправить поведение Л в данном случае, Вам это и проталкивать. Т.е. винить Вам нужно самого себя.

    • GarryC
      /#21272342 / -1

      То есть, по Вашему мнению, желание иметь правильную обработку двух одновременных событий на двух разных клавиатурах — это каприз конкретного пользователя? Сильное утверждение, требует доказательства.

      • zabbius
        /#21272364

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

        • GarryC
          /#21272434

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

          • zabbius
            /#21272454

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

          • nikolayv81
            /#21273436

            Не повод, но увы, другого художника небыло, спасибо тому кто написал хоть так (даже если на з.п. от какой-то крупной компании), и спасибо вам что подробно описали проблему, даже если вы не зарепортите баг, кто-то может прочитав статью сделать это, а возможно кто-то и исправит.

            • GarryC
              /#21276462

              Не могу не сказать спасибо человеку, который понял смысл моего поста, а то я уже думал, что пишу настолько плохо. К сожалению, Вы оказались в меньшинстве, большая часть комментаторов увидела только наезд на святое «Как только можно не падать на колени в молитве перед святым Л» — да, можно, но для меня не святой.

              • wholeman
                /#21276652

                Так Вы же сами выбрали такой стиль изложения. Линукс, безусловно, не святой, и в нём куча багов. Но Вы столкнулись с одним, котрый проявляется в весьма нетипичной ситуации (попробуйте руками нажать одинаковые клавиши на разных клавиатурах столь же одновременно) — и на основе этого делаете обобщение, что Л — плохо, а В — хорошо. Уверяю Вас, там тоже есть баги. И, если Вы читали EULA, MS не обязуется их исправлять по первому требованию. Но, в отличие от Л, сами Вы тоже этого сделать не сможете.

            • wholeman
              /#21276706

              Статья не очень мотивирует тратить время на решение экзотических проблем автора, поэтому не уверен, что кто-то этим займётся. Разве что кто-то из молодёжи, дабы доказать, что Linux вообще ничем не хуже Windows.

        • monah_tuk
          /#21272822

          так как сценарий не стандартный

          На самом деле достаточно стандартный. Ниже писал, как некоторые клавиатурные производители боролись с проблемой множества нажатых клавиш на USB клавиатуре, представлясь сразу несколькими клавиатурами. Моя механика так делала, но в Linux работала отменно.

          • zabbius
            /#21272896

            ну значит эти производители сделали не так, как автор поста, раз у них все работало в массовых масштабах

        • Gryphon88
          /#21276208

          Кстати, не настолько нестандартный: когда делают самопальные педали их обычно в дескрипторе описывают как клавиатуру.

          • shnegs
            /#21276308

            на педалях аналоговый сигнал.

            • Gryphon88
              /#21276334

              Не всегда, эти, кстати, часто прописывают как джойстик. Бывают педали для расширения клавиатуры, например чтоб забиндить прыжок или смену оружия в играх. Ещё я видел педаль для автокомплита в IDE, передала не один символ, а комбинацию-хоткей.

      • evgenyk
        /#21272516

        Я не имею в виду каприз. Я имею в виду то, что в свободном софте превалирует подход, что тот кому нужно что-то, тот и отвечает за это.
        Собственно и в платном софте почти так.

        • Revertis
          /#21273284 / -1

          То есть, никто ни за что не отвечает.

      • maxzhurkin
        /#21273022

        Так с Шиндоус вы вообще заявите "я вам деньги заплатил, так что даже подробностей вам не скажу, но хочу, чтобы прям сейчас всё работало, как надо"?

  8. OlegikOS
    /#21272366

    я не так давно пользуюсь Линуксом, вроде все стабильно

    • GarryC
      /#21272400

      Так я достаточно экзотические случаи описываю — две клавиатуры (у Вас она, скорее всего, одна) и одновременное нажатие/отпускание на обоих (даже подключив две клавиатуры, Вы вряд ли сможете такого стабильного совпадения добиться), они далеко не у каждого происходят, а в стандартных ситуациях Л вполне не плох.

  9. amarao
    /#21272408

    Я правильно понимаю, что вы нашли багофичу в ядре и на основании одной багофичи делаете вывод о всей ОС?


    Скажите, а если бы вы за проприетарную ОС заплатили, в ней не было бы багов?

    • GarryC
      /#21272460

      Я сделал вывод о всей ОС? Не заметил.
      И да, Вы таки правы, количество багов в ОС совсем не однозначно определяется ее стоимостью, но тенденция к их уменьшению по мере роста стоимости, скорее всего, должна иметь место.

      • amarao
        /#21272540 / +2

        Цена на ПО определяется не его качеством, а тем, сколько за него можно попросить. Многие $многомиллионные (за копию) продукты такие вырвиглазные и багованные, что только ой. Почему? Потому что компания платит деньги за фичи, а не за удобство. Компаний мало, цена гигантская, а пользователи потерпят (так как цена гигантская, потратить месяц на обучение сотрудника как тривиальную вещь в ней сделать — ерунда).

      • amarao
        /#21272548 / +1

        Да, вы сделали вывод о всей ОС.
        Цитирую:
        "Ну, вообще то, я никогда не испытывал к нему столь сильных чувств, просто начинаю лучше понимать, за что фирма, производящая Окна, берет деньги. И становится яснее, почему потребители предпочитают платить Биллу (тут, конечно, есть варианты, ну Вы поняли), вместо того, чтобы воспользоваться бесплатной («то есть даром») альтернативой."

      • justhabrauser
        /#21272552

        "К вопросу о Linux (Л)"

        Я сделал вывод о всей ОС? Не заметил.

        Ну как Вам сказать...

  10. zabbius
    /#21272482 / +2

    Кстати, мысли вслух. Если бы статья была написана о том же баге, но в ключе «смотрите, с чем мы столкнулись и как починили», то реакция читателей была бы строго положительной.

    • justhabrauser
      /#21272602 / -1

      Ученье — свет. А за свет надо платить. © "Петроэлектросбыт"
      Наблюдаем процесс оплаты самообучения рейтингом и/или кармой.

  11. Walt_Brann
    /#21272678 / +1

    Почему вместо описания решения проблемы, вы просто ноете высказываете мнение?

    • Revertis
      /#21273306 / -1

      А высказывать мнение на Хабре уже запрещено? О кривых особенностях языков программирования высказывают, о кривом железе высказывают, о кривых библиотеках высказывают, почему нельзя высказать мнение о кривой ОС?

      • justhabrauser
        /#21273400 / +1

        Можно, конечно.
        Проблема в излишнем обобщении поведения отдельно взятого кривого железа до "кривой ОС".
        Вот прямо до тотальной кривизны прямо всей ОС.

      • zabbius
        /#21273404 / +2

        Можно, но для нормального обвинения в кривости тут маловато аргументов.

      • Walt_Brann
        /#21273972

        Своё мнение по этому вопросу можно было бы сократить и добавить в это место технические подробности непосредственно решения. Статья приобрела бы совсем другой оттенок.

  12. monah_tuk
    /#21272750 / +1

    Как может отреагировать хост под управлением вменяемой ОС в случае подключения к нему подобного неправильного устройства?

    И как же прореагирует Windows? :-)


    Необычайно оригинальное решение, но это (оригинальность) его единственное достоинство.

    Talk is cheap. Show me the code. Если серьёзно, не хватает ссылки на отчёт об ошибке.


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

    Серьёзно??? Я только на заре знакомства с Linux этим баловался, годах в 1999-2002. Да по работе, когда нужно дополнительные драйвера
    включить или подтюнить что-то (embedded). Да, совет проверить на более новой или старой версии ядра возможен (например, для Ubuntu, но только для проверки!), но пересобирать...


    в данном случае сообщение об отпускании кнопки.

    Хммм… Нет там события на отпускание кнопки. Передаётся только текущее состояние нажатых клавиш. Хост, сравнивая новую и предыдущую посылку считает дельту и делает заключение, какие новые кнопки были нажаты, а какие были отпущены и уже после генерирует аналоги KeyUp/KeyRelease.


    Окнах7 данный дефект не наблюдался на протяжении по меньшей мере 100 нажатий

    См ссылку выше )))


    И, кстати, по ходу, из-за косяка в Windows XP или около того, которые работали с HID клавиатурой только в режиме BOOT протокола, появилась проблема с максимальным количеством нажатых клавиш в 6 штук (посылка 8 байт, но, пишу по памяти, один байт на состояние клавиш типа CTRL/SHIFT/ALT, а второй — не помню). Диктовалось это тем, в таком режиме можно не заморачиваться разбором Report'ов. При том, что даже через EP0, можно посылку передать до 64 байт, если устройство определить как high-speed и ограничиться 8 байт только для low-speed режима. Да, есть ограничение на максимальный размер, но… сможете единовременно нажать ~60 клавиш?


    В результате появлялись монстры, представлявшиеся как композитные устройства из нескольких HID клавиатур. Которые слали каждый свою порцию данных. Спасибо Виндосу за это.


    Или просто взять драйвера. USB3 ощутимо стабильнее и производительнее работает на Linux. По крайней мере в части UVC.


    Если что, утверждения не голословный, накушался много и на Винде и на Маке и на Линухе, пока делал это, это, это и это.


    А вообще, тема BadUSB обширна, и Linux там не в лидерах.

    • GarryC
      /#21272910

      Автор знает, как работает HID клавиатура (и про максимум 6 нажатых клавиш, это прямо прописано в стандарте, не знал, что Винда к этому причастна, может все таки скорее IBM?), и в посте было упомянуто некое абстрактное сообщение об отпускании клавиши, но никак не конкретное сообщение от USB устройства.

      • monah_tuk
        /#21273066 / +2

        Я выпад про "не знает" выпилил, вы уж извините. Нервишки :)


        и про максимум 6 нажатых клавиш, это прямо прописано в стандарте, не знал, что Винда к этому причастна

        Нет, вы меня не поняли. Стандарт HID регламентирет два режима работы, который распространяется на мышь и клавиатуру, это Boot и Report.


        Первый режим был затеян с той целью, что бы облегчить реализацию поддержки USB клавиатур в BIOS, иными словами он позволяет игнорировать дескрипторы, которые описывают формат посылки и накладывают жёсткое ограничение на размер посылки в 8 байт, как минимально возможный для Low Speed. Формат этой посылки также чётко определён. Т.е. хост:


        1. может позволить себе не разбирать HID дескрипторы
        2. не переводить клавиатуру/мышь из Boot (по умолчанию) в Report режим
        3. всегда рассчитывать на посылку в 8 байт с чётко определённым форматом

        Но вы ограничены при этом в 6 символах за посылку.


        Report режим позволяет вам самим описать HID дескрипторами то, что будет в посылке от клавиатуры и размер оного. Хост, если перевёл устройство в Report режим (и, естественно, если устройство согласно на это), обязан следовать вашим декларациям и обрабатывать соответственно. По крайней мере я смеха ради делал посылки 60 клавиш на Linux, работало :) На SS режиме, можете вообще до 1024 байт передать, т.е. ВСЕ клавиши сразу, и ещё несколько раз постольку же сверху.


        Т.е. моё утверждение выше основано на том, что реализация поддержки USB/HID клавиатур в Windows была сделана и оставалась долгое время крайне топорной, работая с клавиатурой только в режиме Boot протокола, что вызвало появление проблемы, по сути, на ровном месте. И серию мужественных решений оной. Сейчас, вроде, Windows может разобрать дескрипторы и нормально интерпретировать более 6 клавиш в посылке. Но не уверен.

        • GarryC
          /#21276518 / +1

          Ну если так, то понял, тогда Винда действительно виновата, что навязывался только один, причем не самый удобный, вариант репорта.
          Сейчас она (по крайней мере у меня) работает с любыми типами репортов, хотя BOOT режим все равно приходится поддерживать, что бы в BIOS работать.

      • oam2oam
        /#21273108 / +1

        Видимо, вы не поняли — в HID (а клавиатура это HID) просто нет такого — отпускание клавиш! Ну вот просто нет такого понятия даже! Есть только ответ от HID в котором для boot протокола есть 8 байт, 1 байт представляет битовую маску нажатых модификаторов, 2 байт резервный (не используется) а потом до 6 байт скан-кодов (а чему они соответствуют, это описано в таблице HID 1.12) или нулей…

  13. le1ic
    /#21272982

    > на ней была маркировка «ОГОНЬ» и результаты сбоя одного контроллера были бы весьма неприятны

    В два раза уменьшили вероятность false negative, по при этом в два раза увеличилась вероятность false positive. Может это и не проблема, конечно.

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

    А с точки зрения надежности, если контроллеры висят на одном проводе, то эммм

    • GarryC
      /#21276538

      Контроллеры висят на разных USB портах, хотя, конечно, через один корневой хаб.

  14. wholeman
    /#21273134 / +2

    Если б Вы потратили своё время не на эту статью, а на багрепорт или патч, лучше было бы всем. Кроме, может быть, Билла Гейтса. Честное слово.

  15. justhabrauser
    /#21273222 / +2

    Статья должна называться "К вопросу о новой бензопиле и суровых сибирских мужиках".

  16. snikulov
    /#21273556

    Что за прикол — хэйтить (минусовать) за то, что человек высказал своё мнение? У автора своя точка мнения, на основе своего опыта. Подскажите ему как улучшить опыт и посочувствуйте, по доброму. :)

    • justhabrauser
      /#21273622

      На минуточку — минусовали (не хейтили — именно минусовли) статью, а не автора.
      Это типа "я не согласен с мнением автора в данном вопросе" (там даже и причины указать можно).
      А вот самого автора (его карму) не трогали, насколько я успел заметить. Стоит, как у молодого.
      Ну или почти не трогали (придурки везде есть).
      То есть к автору претензий нет — есть оценка данного конкретного его высказывания. Он сказал "фэ" линуху — линухоиды сказали "фэ" его "фэ" (ограничился бы одной подсистемой USB — глядишь и прокатило).
      Что не так? )
      PS. а вот за камменты против мнения автора может и в карму прилететь. Инфа — 146%. Вот это уже хейтинг.

      • Siemargl
        /#21275998

        Примерно -10 в карме автора.

        • justhabrauser
          /#21276032

          Отнюдь.
          Когда стартовало, было 9x. Визуальная память, точно не фиксировал — то ли 91, то ли 94, то ли аж 97 — но не 98 или 99 точно.
          Вчера глубоким вечером было 91, это точно. Сейчас — 88. За статью с таким провокационным содержанием и желтым заголовком и недорого довольно.

  17. mistergrim
    /#21273918

    В комментах как обычно. (Л) хороший, устройства плохие.

    • ky0
      /#21275132

      Ну, почему же? Да, реакция на подобный случай могла бы быть и поизящнее.

      Но основная часть комментариев, в общем-то, не с этим спорит, а с тем, что автор в чересчур эмоциональной манере делает чересчур далекоидущие выводы только потому, что в этом микроскопическом случае ОС ведёт себя не так, как ему хотелось бы.

      Более того — вместо того, чтобы, разобравшись в проблеме, отправить патч (а судя по статье — технических знаний у него для этого вполне достаточно) — он садится на попу ровно и начинает высказывать претензии. Очень конструктивно, что сказать…

      • GarryC
        /#21276588

        Дело в том, что моих знаний пока не хватило. Я неделю (в свободное время, часа по 2 в день) пытался пробиться через многослойную обработку клавиш, чтобы обнаружить точку дефекта, и пока не могу похвастаться успехом.
        Во второй части поста я об этом думал написать, но только когда смогу найти дефект и предложить метод его устранения. Вот тогда я смогу высказать все, что думаю по поводу исходных текстов Л, поскольку мнение это не слишком понравится большинству комментаторов.
        Почему то мне кажется, что подавляющее большинство предлагающих «исправить ошибку» исходники Л не открывали, не в обиду будь сказано.

  18. tzlom
    /#21274206

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

  19. mistiq
    /#21274344

    Мы исходим из того, что вы получаете полноценную операционную систему, сразу полностью за все заплатив.
    Но ведь это ложь. Что может голая винда? Да ничего почти. Скачивая сборку какого-нибудь минта/убунты вы получаете полноценную систему из коробки. С офисным пакетом, проигрывателем и тонной утилит. Ей уже можно пользоваться. А если чего-то не хватает. Ну как пример, из нового LM выпилили GIMP. Мне понадобилось ровно 50 (пятьдесят) секунд что бы его получить. ALT+F2 -> sudo apt install gimp. На винде это так не работает.

    И да, заголовок никак не коррелирует с смыслом статьи. Подключая нерабочую клавиатуру которую необходимо либо поменять по гарантии либо выкинут, автор сетует на Linux. Странная логика. Очень.

  20. shnegs
    /#21274624 / +1

    Опоздал маленько, но:
    let the srach begin!

  21. Igelko
    /#21274626 / +1

    Статья, кмк, откровенно плоха для хабра. Такое прокатило бы в lor/talks, но здесь было бы правильным показать кусочки исходников, приложить пару картинок с диаграммой взаимодействия, добавить ссылки на используемую спеку USB или развёрнутые цитаты из неё.
    И ещё крайне желательно собрать всё это в кучу и послать баг-репорт автору подсистемы, просто потому что так устроено OSS-сообщество.

  22. kamagan
    /#21274680

    Даже если предположить что в обоих вышеописанных ситуациях виновата ось, делать вывод о том что она плоха лишь на этих основаниях — так себе вывод. И уж тем более на тех же основаниях делать вывод о том что другая ось хороша (кстати почему только Windows).

  23. EddyEm
    /#21275228 / +1

    Пользуюсь линуксом с 2000 года. Мастдайку удалил со всех своих компьютеров в 2003. Полет нормальный.
    А ТС — простая истеричка, у которой руки не оттуда растут!

  24. b-s-a
    /#21276634

    Как разработчик могу объяснить почему все так:
    1. Линукс точится преимущественно для серверов. Поддержка игровых контроллеров вообще за энтузиастами.
    2. Когда какой-то разработчик устройства сталкивается с проблемой, то он пишет разработчику ОС. Чем больше разработчиков или чем они значительней (багрепорт от интел будет рассмотрен в первую очередь) пишет, тем быстрее проблема решается. Как думаете, под какую ос делают больше устройств?

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

    Что вам следует сделать:
    1. зайти сюда bugzilla.kernel.org и написать баги по каждому случаю, предоставив логи ядра и прочую информацию. Когда начнется переписка, то активно ее поддерживать.
    2. исправить самостоятельно, отправить патч в багзиллу или в почтовую рассылку. Этот метод быстрее.

  25. Runime
    /#21276638

    Ой, та ладно, я больше чем уверен что, подавляющему большенству не нужно сразу две клавиатуры на одном компе, мне трудно даже представить для чего такая необходимость нужна, и этот "глюк" на Linux, по сравнению со всеми багами на Windows, ни что. Компилирует винда, допустим, Python, в разы медленнее чем Linux, а о стабильности и говорить не стоит…

  26. Egres
    /#21276640

    Так на тои и Linux: нашёл баг — отправь фикс, или хотя бы bugreport (а лучше и то и другое). Разница тут в том, что в отличие от винды, ты можешь сам исправить найденный баг (и поделиться решением с другим).

  27. Dukat
    /#21278240

    Недавно вышло обновление стабильной ветки Debian. Среди прочего, MariaDB 10.3.18 -> 10.3.22.
    После установки и перезагрузки (ядро тоже обновилось) БД не запустилась. В своих логах вообще пусто, в системных — «Aborted». Это в, казалось бы, эпоху journalctl.

    Легко гуглится статья в доках MariaDB: «Что делать, если эта хрень не запускается?». Подробно рассказано, как найти файлы логов. Разобрано несколько случаев. Отдельно выделена глава для пользователей systemd (лично ничего против этого тулкита не имею).

    Ничего похожего на мой случай. На «СтэкОверфло» советуют сделать «apt purge mariadb*». Серьёзно. И, что противоречит логике, переустановка чего либо очень часто решает проблему. Но меня такой подход не устраивает.

    Ладно, ход поиска решения понятен.
    Пробую запустить без старых файлов данных (mv /var/lib/mysql /var/lib/mysql.bak) — без результата.
    Печально, у меня сильно кастомный конфиг, долго придётся искать несовместимость (хотя откуда она могла взяться?).

    Пробую запустить Марию вообще без кастомных конфигов (кстати, концепция conf.d/ очень удобна, спасибо) — успешно стартует. Методом исключения по методу Монте-Карло нахожу какую бы вы думали проблемную опцию?

    Я ставил на нестандартный порт из непривелигированных, параметры буфера и кэша InnoDB, увеличение лимита на количество открываемых файлов (в конфигах systemd тоже было в отдельном файлике установлено нужное значение параметра, которое ещё в интеренетах настоятельно рекомендуют не ставить в значение «nolimit», т.к. в каких-то версиях systemd это воспринималось как «65 тысяч сколько-то»).

    Оказалось, дело в «lc_messages = ru_RU». Ну вы поняли.

    Но всё равно, виндовый сервер считаю плохой идеей. BSD? Ну, за примерно год администрирования FreeBSD всякое случалось. «Из коробки» удобно не многое.

    • Siemargl
      /#21278686

      Оказалось, дело в «lc_messages = ru_RU». Ну вы поняли.
      Мы поняли. Рафик Линукс не увиноват

    • ky0
      /#21281016

      Вы СУБД обновляете без тестового прогона на отдельном идентичном стенде, да ещё и с одновременным апдейтом ядра? Может, ещё и в продакшене? Ну ок.

      • Dukat
        /#21281028

        Верил в репутацию Debian как стабильного дистрибутива)

        • ky0
          /#21281038

          Дебиан-то прекрасен. Я намекаю в основном на «самую популярную (но не самую стабильную, видимо) свободныю СУБД» :)