Намеренно вызовите ошибку ввода-вывода в Linux?

Какой сказанный posipiet, плюс: это означает, что два набора доверяемой информации необходимы для получения корневого доступа, не всего один; пароль root самостоятельно становится бесполезным, и может только быть усилен вместе с учетной записью обычного пользователя (и если доступ к su ограничивается, только вместе с учетной записью доверяемого пользователя).

42
задан 12 April 2013 в 23:15
5 ответов

Да, есть очень правдоподобный способ сделать это с помощью устройства сопоставления.

Устройство сопоставления устройств может рекомбинировать блочные устройства в новое сопоставление / порядок по вашему выбору. LVM делает это. Он также поддерживает другие цели (некоторые из которых совершенно новы), такие как «flakey» для имитации неисправного диска и «error» для имитации неисправных областей диска.

Можно сконструировать устройство, которое намеренно содержит черные дыры ввода-вывода, которые будут сообщать об ошибках ввода-вывода при пересечении.

Сначала создайте некоторый виртуальный том для использования в качестве цели и сделайте его адресуемым как блочное устройство.

dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img

Итак, для начала создается файл размером 512 МБ, который является основой нашего виртуального блочного устройства. в котором мы проделаем «дыру». Однако дыры еще нет. Если бы вы использовали mkfs.ext4 / dev / loop0 , вы бы получили совершенно корректную файловую систему.

Итак, Сначала приведем пример

dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139

. Это создаст устройство с именем 'errdev0' (обычно в / dev / mapper). Когда вы набираете dmsetup create errdev0 , он будет ждать stdin и завершит ввод ^ D.

В приведенном выше примере мы сделали отверстие в 5 секторов (2,5 КБ) в секторах 261144 из петлевое устройство. Затем мы продолжим работу с устройством цикла, как обычно.

Этот сценарий попытается сгенерировать вам таблицу, которая будет размещать дыры в случайных местах размером примерно 16 МБ (хотя это довольно случайно).

#!/bin/bash
start_sector=0
good_sector_size=0

for sector in {0..1048576}; do

    if [[ ${RANDOM} == 0 ]]; then
        echo "${start_sector} ${good_sector_size} linear /dev/loop0 ${start_sector}"
        echo "${sector} 1 error"
        start_sector=$((${sector}+1))
        good_sector_size=0
    else
        good_sector_size=$((${good_sector_size}+1))
    fi
done

echo "${start_sector} $((${good_sector_size}-1)) linear /dev/loop0 ${start_sector}"

Сценарий предполагает, что у вас также есть создано устройство размером 512 МБ, и ваше виртуальное блочное устройство находится на / dev / loop0 .

Вы можете просто вывести эти данные в текстовый файл в виде таблицы и передать их в dmsetup create errdev0 .

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

После того, как вы закончите, используйте dmsetup remove errdev0 , чтобы удалить устройство.

Если Если вы хотите повысить вероятность возникновения ошибки ввода-вывода, вы можете чаще добавлять отверстия или изменять размер создаваемых отверстий. Обратите внимание: размещение ошибок в определенных разделах может вызвать проблемы с самого начала, IE на 32 МБ в устройство, вы не можете записать суперблок, который обычно пытается сделать ext, поэтому формат не работает ..

Для дополнительного удовольствия - - вы можете просто losetup , затем mkfs.ext4 / dev / loop0 и заполнить его данными.

54
ответ дан 28 November 2019 в 19:42

Для проверки устойчивости программы в случае сбоя их вывода вы можете использовать псевдоустройство / dev / full , которое всегда возвращает "ENOSPACE" при записи в.

$ dd if=/dev/zero of=/dev/full
dd: writing to `/dev/full': No space left on device
1+0 records in
0+0 records out
15
ответ дан 28 November 2019 в 19:42

Вы можете сделать это множеством интересных способов. См. https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt

7
ответ дан 28 November 2019 в 19:42

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

1
ответ дан 28 November 2019 в 19:42

Зависит от того, что вы хотите протестировать. Используя библиотеку LD_PRELOAD ed, вы можете обмануть приложения, заставив их думать, например, что «все записи завершаются неудачно с ENOSPC или EIO ».

7
ответ дан 28 November 2019 в 19:42

Теги

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