Причина проблемы
Проблема заключается в том, как XFS распределяет inode. В отличие от большинства файловых систем, распределение происходит динамически при создании новых файлов. Однако, если не указано иное, inode ограничивается 32-разрядными значениями, что означает, что они должны помещаться в пределах первого терабайта хранилища в файловой системе. Таким образом, если вы полностью заполните этот первый терабайт, а затем увеличите размер диска, вы все равно не сможете создавать новые файлы, поскольку inode не могут быть созданы в новом пространстве.
Решение 1 - изменить параметры монтирования
Одним из решений является повторное монтирование файловой системы с опцией монтирования inode64
. Однако некоторые приложения будут вести себя странно (например, MySQL), и NFS будет очень смущена. Так что, если вы не уверены, что ваша система будет работать с этой опцией, вы можете перейти к следующей опции.
Решение 2 - переместить файлы
Второе решение состоит в том, чтобы найти некоторые файлы, которые в данный момент хранятся в первом терабайте, и переместить их в другую область файловой системы.
Переезд по возрасту
В нашем случае это было легко - файловая система использовалась годами, поэтому мы могли просто найти самые старые файлы и удалить их из файловой системы, а затем переместить их обратно. Это было легко сделать с помощью команды find:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
дал нам список, содержащий размер и имя каталога для всех каталогов ровно на 3 уровня ниже точки монтирования, которые были старше 2 лет. Затем мы можем отсортировать список, чтобы найти самые большие каталоги, и использовать их mv
для перемещения в другую файловую систему и обратно.
Перемещение по группе размещения
Если вы не можете просто перейти по возрасту, например, когда было создано много файлов одновременно, вы все равно можете найти нужные файлы для перемещения, но это займет немного больше времени.
XFS имеет группы выделения (также известные как AG ), начиная с 0. Вы можете проверить размер блока и количество блоков каждого AG, чтобы выяснить, какие группы находятся на первом терабайте, используя xfs_info /path/to/mountpoint
. Или вы можете просто проверить первые несколько AG, чтобы увидеть, какие из них заполнены, а затем очистить их.
- Проверка свободного места в первых четырех AG:
для ag в `seq 0 1 5`; сделать эхо свободного пространства в AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "совершенно бесплатно"; сделанный
Если общее свободное место в какой-либо группе меньше 40, вы не сможете создавать в нем новые файлы.
- Найти файлы в этом AG
Это требует проверки метаданных для каждого файла в файловой системе. Это займет много времени ... Вот предложение:
find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Затем вы можете использовать grep для " 0 "
(это пробел, ноль и другой пробел), чтобы найти все файлы в AG 0, grep для, " 1 "
чтобы найти файлы в AG 1 и т. Д. Начните с AG 0, уберите самые большие файлы (используя mv
не cp
!) а потом обратно. Повторяйте, пока у вас не будет достаточно свободного места.
результат
После того, как мы переместили достаточно файлов из / extra, а затем обратно, в AG 0 появилось много места, и снова стало возможно создавать новые файлы.