Можно ли исчерпать место на диске, создав очень большое количество пустых файлов?

35

Хорошо известно, что пустые текстовые файлы имеют нулевые байты:

введите описание изображения здесь

Тем не менее, каждый из них содержит метаданные , которые, согласно моим исследованиям, хранятся в inode и используют пространство .

Учитывая это, мне кажется логичным, что можно заполнить диск, просто создав пустые текстовые файлы. Это верно? Если да, сколько пустых текстовых файлов мне нужно будет заполнить, скажем, 1 ГБ?


Чтобы выполнить некоторые проверки, я запускаю, df -iно это, по-видимому, показывает% используемых инодов (?), А не их вес.

Filesystem             Inodes  IUsed    IFree IUse% Mounted on
udev                   947470    556   946914    1% /dev
tmpfs                  952593    805   951788    1% /run
/dev/sda2            28786688 667980 28118708    3% /
tmpfs                  952593     25   952568    1% /dev/shm
tmpfs                  952593      5   952588    1% /run/lock
tmpfs                  952593     16   952577    1% /sys/fs/cgroup
/dev/sda1                   0      0        0     - /boot/efi
tmpfs                  952593     25   952568    1% /run/user/1000
/home/lucho/.Private 28786688 667980 28118708    3% /home/lucho
luchonacho
источник
Связано: unix.stackexchange.com/q/62049
moooeeeep

Ответы:

40

Эти выходные данные предлагают в 28786688целом inode, после чего /dev/sda2будет возвращена следующая попытка создать файл в корневой файловой системе (устройстве ) ENOSPC(«На устройстве не осталось места»).

Объяснение: в исходном проекте файловой системы * nix максимальное число inode устанавливается во время создания файловой системы. Выделенное пространство выделено для них. Вы можете исчерпать inode прежде, чем вы исчерпаете пространство для данных, или наоборот. Наиболее распространенная файловая система Linux по умолчанию ext4все еще имеет это ограничение. Информацию о размерах inode в ext4 смотрите на странице man для mkfs.ext4.

Linux поддерживает другие файловые системы без этого ограничения. На btrfs, пространство распределяется динамически. «Структура inode относительно мала и не будет содержать данных встроенного файла или данных расширенного атрибута». (ext3 / 4 выделяет некоторое пространство внутри inode для расширенных атрибутов ). Конечно, вы все еще можете исчерпать место на диске, создав слишком много метаданных / каталогов.

Размышляя об этом, tmpfs является еще одним примером, когда inode распределяются динамически. Трудно понять, какое максимальное число inode, о которых сообщается, df -iбудет фактически означать на практике для этих файловых систем. Я бы не придавал никакого значения показанному значению.


«XFS также динамически распределяет inode. Так же, как и JFS. То же самое делал / делает reiserfs. Как и F2FS. Традиционные файловые системы Unix распределяют inode статически во время mkfs, как и современные FS, такие как ext4, которые отслеживают свое наследие, но в наши дни это так. исключение, а не правило.

«Кстати, XFS позволяет вам установить ограничение на максимальный процент пространства, используемого inode, поэтому вы можете исчерпать inode до того, как вы не сможете добавить к существующим файлам. (По умолчанию 25% для FS до 1 ТБ, 5% для файловых систем до 50 ТБ, 1% для более крупных.) В любом случае, это использование пространства для метаданных (иноды и карты экстентов) будет отражаться в регулярной форме df -h"- Питер Кордес в комментарии к этому ответу

sourcejedi
источник
Итак, вы говорите, что если я создам 28786688-667980=28118708пустые файлы, у меня фактически закончатся inode и "сломается моя система"?
Лучоначо
1
XFS также распределяет inode динамически. Так же как и JFS. Так сделал / делает reiserfs. Как и F2FS . Традиционные файловые системы Unix статически распределяют inode во время mkfs, как и современные FS, такие как ext4, которые отслеживают свое наследие, но в наши дни это исключение, а не правило. (Если вы не взвешиваете вещи по установленной базе, в которой, вероятно, точно можно сказать, что большинство файловых систем, которые в настоящее время находятся на диске в системах * nix в дикой природе, статически
Питер Кордес
Кстати, XFS позволяет вам установить ограничение на максимальный процент пространства, используемого inode, так что вы можете исчерпать inode до того, как вы не сможете добавить к существующим файлам. (По умолчанию 25% для FS менее 1 ТБ, 5% для файловых систем объемом до 50 ТБ, 1% для большего размера.) В любом случае, это использование пространства для метаданных (иноды и карты df -hэкстентов ) будет отражаться в регулярном @luchonacho.
Питер Кордес
26

Создание пустых файлов включает в себя следующее:

  • иноды, по одному на файл;
  • дополнительные записи каталога, также по одному на файл, но агрегированные.

Количество доступных inode часто определяется при создании файловой системы и не может быть изменено (некоторые файловые системы, такие как Btrfs или XFS, выделяют inode динамически). Вот что измеряется df -i. Когда у вас заканчиваются inode, вы не можете создавать новые файлы или каталоги, даже если у вас есть свободное место на диске.

Записи каталога также занимают место из доступного дискового пространства. Это можно увидеть, посмотрев на размер каталога: он всегда кратен размеру блока, а когда в каталоге содержится много файлов, его размер увеличивается. Если у вас заканчивается свободное место на диске, вы не сможете создавать новые файлы или каталоги в каталоге, который «заполнен» ( т. Е. Когда добавление нового файла будет связано с выделением нового блока), даже если у вас есть доступные inode.

Так что да, можно использовать свободное место на диске, используя только пустые файлы.

Стивен Китт
источник
Таким образом, мне нужно было бы создать достаточно пустых файлов для 100% использования inode?
Лучоначо
@luchonacho да, фактически один пустой файл на индекс.
Стивен Китт
Также обратите внимание на расширенные атрибуты, которые могут добавить пространство поверх этого. Например, если в каталоге много ACL по умолчанию, для создания файла в нем потребуется место для хранения этих ACL.
Стефан
ОК, я исправлюсь. Дело в том, что для меня это выглядит странно как с отрисованными шрифтами, так и со шрифтами фиксированной ширины в моем браузере. Из любопытства, как вы их вставляете? У вашей клавиатуры есть другая клавиша для этого символа и клавиша U + 0022?
Стефан
Спасибо, из любопытства, я проверил, были ли они на моей раскладке клавиатуры в Великобритании, и действительно ли они на AltGr + Shift + V / B (двойные кавычки без сдвига). Я буду придерживаться U + 0022, хотя.
Стефан
7

Аргумент чистой логики:

Имя файла состоит из ненулевого количества байтов. Даже при теоретическом максимальном сжатии в гипотетической файловой системе, разработанной для обеспечения абсолютного максимального количества имен файлов, каждое имя файла все равно будет занимать как минимум один бит где-то на вашем физическом диске. Возможно, больше, но «1 бит на файл» - это тривиальный минимум.

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

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

Anoe
источник
0

Просто нет, но вы можете исчерпать иноды на linux, которые будут такими же, как и нехватка места.

вы можете попробовать что-то вроде этого в вашей оболочке n=0; while :; do touch $n; let n=n+1; done

Просто запустите его на виртуальной машине, иначе у вас не будет inode.

in1t3r
источник
Что делает эта команда?
Лучоначо,
Он начинается, когда истинный бесконечный цикл, который на каждом шагу создает имя файла, которое является целым числом, начиная с 0, а затем 1 2 3 ..., в конечном итоге создаст достаточно файлов, чтобы использовать все inode файловой системы.
in1t3r
1
Если вы запустите эту команду на вашем / home разделе, если он независим, то у / partition у вас не возникнет проблем, вы просто не можете больше писать в ваш / home раздел. Я предлагаю сделать в нем каталог с именем inodetest cd, а затем запустить команду после того, как вы увидите ошибки, которые вы больше не можете создавать в файловой системе, нажмите Ctrl + C и запустите, rm -fr inodetestчтобы избавиться от всех этих пустых файлов и снова нормально работать. :)
in1t3r
0

Вы не можете заполнить диск, создав пустые файлы - на диске все равно будет достаточно места для новых файлов. Но да, вы можете исчерпать ограниченный запас бесплатных inode файловой системы - и в этот момент вы не можете создавать новые файлы (даже если ваш диск - по мере использования используемого пространства - практически пуст). Это всего лишь список инодов файловой системы, который использовался, а не диск ... поэтому файловая система заполнена, а диск практически пуст. Таблица inode использует пространство на диске, но таблица не увеличивается при добавлении файлов - точно так же, как лист бумаги не увеличивается, когда вы пишете по строкам.

(ответ в комментарии Баарда Копперуда)

luchonacho
источник
Не уверен, что нам нужен еще один ответ, который говорит то же самое ?
Джефф Шаллер