Тестирование дискового пространства в Linux

У меня есть программа, которая может умереть, когда на диске заканчивается запись определенного файла, я не уверен, что это так.

Я хотел бы запустить его и посмотреть, но мой тестовый сервер не скоро выйдет из космоса. Могу ли я издеваться над этим поведением? Не похоже, что есть какой-либо способ установить ограничение на размер папки/файла в Ubuntu, а установление пользовательских квот будет процессом (из-за получения разрешений)

Есть ли общий способ тестирования этой ситуации?

Я запускаю Ubuntu 12.04

Ответ 1

  • Создайте файл нужного размера (здесь 10 МБ)

    dd if=/dev/zero of=/home/qdii/test bs=1024 count=10000

  • Извлеките loopback-устройство из этого файла

    losetup -f /home/qdii/test

  • Отформатируйте это устройство в нужной файловой системе

    mkfs.ext4 /dev/loop0

  • Установите его там, где вы хотите (/mnt/test должен существовать)

    mount /dev/loop0 /mnt/test

  • Скопируйте свою программу на этом разделе и протестируйте

    cp /path/my/program /mnt/test && cd /mnt/test && ./program


Чтобы узнать, какая функция losetup для петлевого устройства создана, вы можете использовать losetup -a

Не забудьте отключить с помощью umount /mnt/test.

Не забудьте очистить устройства цикла после использования, losetup -D

Не забудьте удалить файл.

Ответ 2

Просто используйте /dev/full, он поднимет ошибку ENOSPC, когда вы попытаетесь записать на нее:

$ echo "Hello world" > /dev/full
bash: echo: write error: No space left on device

Ответ 3

Другой возможностью было бы уменьшить соответствующий предел с помощью setrlimit (2) syscall с RLIMIT_FSIZE или с помощью bash ulimit builtin (используя -f). Затем write (2) завершится с EFBIG

И вы также можете установить некоторые квоты в какой-либо соответствующей файловой системе, поэтому write(2) терпит неудачу с EDQOT.

Если вам нужна реальная ошибка ENOSPC для write(2), вам, вероятно, понадобится файловая система loopback, на которую отвечает qdii.

Кстати, я действительно не знаю, как "эмулировать" ошибку EIO (возможно, с некоторой файловой системой FUSE?).

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

Однако вам может потребоваться обработать ошибки EINTR и EWOULDBLOCK по-разному: это восстановимые ошибки, и вы обычно повторяете write(2) через некоторое время.

Ответ 4

Если вы делаете вызовы файловой системы POSIX, вы можете использовать libfiu, чтобы вставлять ошибки ENOSPC в вызовы.