Назад | Перейти на главную страницу

RHEL5: невозможно создать разреженный файл размером более 256 ГБ в tmpfs

/var/log/lastlog записывается при входе в систему. Размер этого файла основан на самом большом UID в системе. Чем больше максимальный UID, тем больше размер этого файла. К счастью, это разреженный файл, поэтому размер на диске намного меньше размера ls отчеты (ls -s сообщает размер на диске).

В нашей системе мы проверяем подлинность на сервере Active Directory, и пользовательские идентификаторы UID оказываются очень, очень большими. Например, 900000000 UID для первого пользователя AD, 9000000001 для второго и т. Д.

Это странно, но все должно быть в порядке. Это приводит к /var/log/lastlog быть huuuuuge, хотя - как только пользователь AD входит в систему lastlog отображается как 280 ГБ. К счастью, его реальный размер все еще невелик.

Это отлично работает, когда /var/log/lastlog хранится на жестком диске в файловой системе ext3. Однако он ломается, если lastlog хранится в файловой системе tmpfs. Затем выясняется, что максимальный размер любого файла в tmpfs составляет 256 ГБ, поэтому sessreg ошибки программы при попытке записи lastlog.

Откуда берется этот предел в 256 ГБ и как его увеличить?

В качестве простого теста для создания больших разреженных файлов я делал:

dd if=/dev/zero of=sparse-file bs=1 count=1 seek=300GB

Я пробовал поискать в Google «максимальный размер файла tmpfs», «ограничение файловой системы 256 ГБ», «максимальный размер файла linux» и тому подобное. Мне не удалось найти много. Единственное упоминание о 256 ГБ, которое я могу найти, это то, что файловые системы ext3 с блоками 2 КБ ограничены файлами размером 256 ГБ. Но наши жесткие диски отформатированы блоками 4K, так что, похоже, это не так - не говоря уже о том, что это происходит в tmpfs, установленном НА ВЕРХНЕМ жестком диске, поэтому раздел ext3 не должен быть фактором.

Все это происходит в 64-битной системе Red Hat Enterprise Linux 5.4. Интересно, что на моей персональной машине разработки, которая представляет собой 32-разрядную систему Fedora Core 6, я могу без проблем создавать файлы размером 300 ГБ в файловых системах tmpfs. В системах RHEL5.4 это не годится.

Ответ можно найти в исходниках Linux, в частности, /usr/src/linux/mm/shmem.c, начиная примерно со строки 70 в моей системе (Gentoo 2.6.31-ish):

/*
 * The maximum size of a shmem/tmpfs file is limited by the maximum size of
 * its triple-indirect swap vector - see illustration at shmem_swp_entry().
 *
 * With 4kB page size, maximum file size is just over 2TB on a 32-bit kernel,
 * but one eighth of that on a 64-bit kernel.  With 8kB page size, maximum
 * file size is just over 4TB on a 64-bit kernel, but 16TB on a 32-bit kernel,
 * MAX_LFS_FILESIZE being then more restrictive than swap vector layout.

Одна восьмая из 2 ТБ - это ровно 256 ГБ. Как вы обнаружили в своей 32-битной тестовой системе FC6, большие размеры возможны с 32-битным ядром.

Похоже, что изменение размера страницы может быть связано чтобы позволить Поддержка файловой системы HugeTLB в ядре. Тем не менее, я не знаю достаточно о внутренностях ядра, чтобы сказать, как и почему, или какие шаги вам нужно предпринять, чтобы воспользоваться им, или какие другие последствия это может иметь. Чтобы включить его, запустите make menuconfig, перейдите к Файловые системы, а потом Псевдо файловые системы. Рассматриваемый вариант Поддержка файловой системы HugeTLB. В онлайн-справке для него написано:

CONFIG_HUGETLBFS:

hugetlbfs is a filesystem backing for HugeTLB pages, based on
ramfs. For architectures that support it, say Y here and read
<file:Documentation/vm/hugetlbpage.txt> for details.

If unsure, say N.

Возможно, стоит запустить это и с помощью StackOverflow. Надеюсь, это поможет.

Одно предложение ... не могли бы вы создать образ ext3 в tmpfs, смонтировать его и поместить туда lastlog? Что-то вроде:

cd /tmp
dd if=/dev/zero of=lastlog.img bs=1024k count=10
losetup /dev/loop1 lastlog.img
mkfs.ext3 /dev/loop1
mount /dev/loop1 /var/lastlog