Специальный Файл, который вызывает ошибку ввода-вывода

Я не нашел способа настроить мерзавца на этом четвертом уровне. Единственный путь, кажется, использование переопределений значения конфигурации на команду git -c key=value.

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

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}
13
29.05.2013, 17:03
4 ответа

Можно использовать dmsetup создать устройство картопостроителя устройства с помощью любого error или flakey цели для моделирования отказов.

dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'

Где 123 длина устройства, в секторах, и/dev/loop0 является исходным устройством, на котором Вы хотите моделировать ошибки. Для ошибки Вам не нужны последующие аргументы, поскольку она всегда возвращает ошибку.

8
27.01.2020, 19:52
  • 1
    я нахожу по крайней мере две ошибки в той команде: недостающее имя устройства, опечатка заключения в кавычки, и что "1 0/dev/null, который, как " предполагают, означал? –  Hauke Laging 29.05.2013, 16:40
  • 2
    @HaukeLaging, ahh, да, я не учел имя и так или иначе поразил неправильную кавычку. 1 0/dev/null означает 1 цель, запускающуюся при смещении 0, поддержанный устройством/dev/null. Это является необходимым для хлопьевидного, но по-видимому является дополнительным для ошибки. –  psusi 29.05.2013, 16:44
  • 3
    Мне кажется, что это не является "дополнительным", но просто проигнорировано. Можно свериться dmsetup table test. Можно даже записать foo bar позади error; это просто не заботится (и таким образом должен быть удален). –  Hauke Laging 29.05.2013, 16:48
  • 4
    @HaukeLaging, отредактированный. –  psusi 29.05.2013, 16:54
  • 5
    Спасибо за ответ я думаю, что это - путь, которым я пойду на данный момент. Единственная незначительная проблема, которую я имею с этим, - то, что это требует корневого доступа, но я предполагаю, что Вам будут нужны это так или иначе или такой материал низкого уровня... (Я вырою в идею LD_PRELOAD, когда у меня будет время). –  mreithub 29.05.2013, 18:06

Вы хотите механизм внесения неисправности для ввода-вывода.

На Linux вот метод, который не требует никакой предшествующей установки и генерирует необычную ошибку (не EIO “ошибка ввода/вывода”, но ESRCH “Никакой такой процесс”):

cat /proc/1234/mem

где 1234 является PID процесса, работающего как тот же пользователь как процесс, Вы тестируете, но не, которые обрабатывают себя. Кредиты к rubasov для размышления /proc/$pid/mem.

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

Еще с некоторой установкой как корень можно усилить картопостроитель устройства для создания файлов с допустимыми секторами и поврежденными секторами.

Другой подход должен был бы реализовать маленькую файловую систему FUSE. EIO является кодом ошибки по умолчанию, когда Ваш драйвер файловой системы пространства пользователя делает что-то не так, таким образом, легко достигнуть. И Perl и привязка Python идут с примерами для начала работы, можно быстро записать файловую систему, которая главным образом зеркально отражает существующие файлы, но вводит EIO в тщательно выбранных местах. Существует существующее такая файловая система: petardfs (статья), я не знаю, как хорошо это работает из поля.

Еще один метод LD_PRELOAD обертка. Существующим является Libfiu (внесение неисправности в пространстве пользователя). Это работает путем предварительно загружения библиотеки, которая перегружает вызовы API POSIX. Можно записать простые директивы или произвольный код C для переопределения нормального поведения.

5
27.01.2020, 19:52
  • 1
    Libfiu выглядит действительно многообещающим (и это находится в debian repos). Большой ответ, спасибо, +1 –  mreithub 31.05.2013, 01:21

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

> dd if=/dev/zero of=/path/to/ext2.img bs=10M count=10
> losetup /dev/loop0 /path/to/ext2.img
> blockdev --getsz /dev/loop0
204800
> echo "0 204800 linear /dev/loop0 0" | dmsetup create sane_dev
> mke2fs /dev/mapper/sane_dev # ext2 reicht
> mount -t ext2 /dev/mapper/sane_dev /some/where
> dd if=/dev/zero of=/some/where/unreadable_file bs=512 count=4
> hdparm --fibmap /some/where/unreadable_file
/mnt/tmp/unreadable_file:
 filesystem blocksize 1024, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0       2050       2053          4
> umount /dev/mapper/sane_dev
> dmsetup remove sane_dev
> start_sector=$((204800-2053-1))
> echo $'0 2053 linear /dev/loop0 0\n2053 1 error\n2054 '"${start_sector} linear /dev/loop0 2054" | 
>   dmsetup create error_dev
> mount -t ext2 /dev/mapper/error_dev /some/where
> cat /some/where/unreadable_file # 3rd sector of file is unreadable
cat: /some/where/unreadable_file: Input/output error

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

1
27.01.2020, 19:52
  • 1
    Блоки Вашей файловой системы составляют по крайней мере 4 096 байтов в размере, таким образом, они охватят несколько секторов, даже если файл будет маленьким. –  Anon 11.09.2017, 09:38
[

] В разделе Переполнение стека и Ошибка сервера уже есть отличный набор ответов на этот вопрос, но некоторые приемы отсутствовали. Чтобы сделать жизнь проще, вот список VM/Linux блочных устройств/Linux файловой системы/Linux библиотеки пользовательского пространства I/O механизмы инжекции ошибок: [

] [] [

]Бонусный факт: []SQLite имеет драйвер VFS для моделирования ошибок[], чтобы получить хорошее тестовое покрытие.[

] [

]Похожее:[

] []
14
27.01.2020, 19:52

Теги

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