Тестирование дискового пространства в 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
в вызовы.