Устройство USB (клавиатура или мышь) показывает в «lsusb», но не работает, если это второе устройство USB, которое будет подключено

Вот как вы можете это сделать:

   i=$(((t=19876543212)-(h=12345678901)))
   { dd count=0 skip=1 bs="$h"
     dd count="$((i/(b=64*1024)-1))" bs="$b"
     dd count=1 bs="$((i%b))"
   } <infile >outfile

Это все, что действительно необходимо - для этого не нужно намного больше.Во-первых, dd count = 0 skip = 1 bs = $ block_size1 практически мгновенно выполнит lseek () вместо обычного ввода файла. Нет никаких шансов пропущенных данных или какой-либо другой неправды об этом, вы можете просто перейти прямо к желаемой стартовой позиции. Поскольку дескриптор файла принадлежит оболочке, а dd просто наследуют его, они будут влиять на его позицию курсора, и вы можете просто выполнять его поэтапно. Это действительно очень просто - и нет стандартного инструмента, лучше подходящего для этой задачи, чем dd .

Используется размер блока 64 КБ, что часто бывает идеальным. Вопреки распространенному мнению, большие размеры блоков не ускоряют работу dd . С другой стороны, крошечные буферы тоже никуда не годятся. dd необходимо синхронизировать свое время в системных вызовах, чтобы ему не приходилось ждать копирования данных в память и обратно, а также чтобы ему не приходилось ждать системных вызовов. Итак, вы хотите, чтобы это заняло достаточно времени, чтобы следующее read () не ждало последнего, но не настолько, чтобы вы выполняли буферизацию большего размера, чем необходимо.

Таким образом, первый dd переходит в начальную позицию. На это уходит ноль времени. Вы можете вызвать любую другую программу, которая вам нравится в этот момент, чтобы прочитать ее стандартный ввод, и она начнет чтение непосредственно с желаемого байтового смещения. Я вызываю другой dd , чтобы прочитать ((интервал / размер блока) -1) подсчет блоков в стандартный вывод.

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

Не верьте, кстати, когда люди заявляют факты в лицо без доказательств. Да, dd может выполнить короткое чтение (хотя такие вещи невозможны при чтении с исправного блочного устройства - отсюда и название) . Такие вещи возможны только в том случае, если вы неправильно буферизуете поток dd , который читается не с блочного устройства. Например:

cat data | dd bs="$num"    ### incorrect
cat data | dd ibs="$PIPE_MAX" obs="$buf_size"   ### correct

В обоих случаях dd копирует все данных. В первом случае возможно (хотя маловероятно с cat ) , что некоторые из блоков вывода, которые dd копирует, будут битами равными «$ num» байтов, потому что dd задан только для буферизации чего-либо вообще, когда буфер специально запрашивается в его командной строке. bs = представляет максимальный размер блока, потому что цель dd - ввод-вывод в реальном времени.

Во втором примере я явно указываю размер выходного блока и dd буферов чтения, пока не будет выполнена полная запись. Это не влияет на count = , который основан на входных блоках, но для этого вам просто нужен другой dd . Любая дезинформация, предоставленная вам иным образом, не должна приниматься во внимание.

2
15.10.2018, 06:59
1 ответ

Фейспалм

Кажется, когда-то давно, пытаясь настроить резервный жесткий диск, я случайно начал записывать данные резервной копии в /run/media/$USER/BackupData, хотя тома на самом деле там не было... В свою очередь, в runфайловая система засоряет его. После rmсоздания этой резервной копии данных я снова подключил мышь, и, похоже, она работает без проблем! Я подозреваю, что это также исправляет другую ошибку, с которой я столкнулся, когда разрешения на USB-накопители загадочным образом менялись.

2
27.01.2020, 22:08

Теги

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