URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 70582
[ Назад ]

Исходное сообщение
"FreeBSD 6.1 UFS2, ограничение на количество каталогов внутри..."

Отправлено Autopilot , 28-Ноя-06 15:08 
Можно создать не более 32767 подкаталогов. Попытка снять ограничение.

Каталоги создавались CMS'кой очень крупного сайта. И исправить CMS нет возможности - одна версия обслуживает около сотни сайтов. На линуксе все решалось переходом на reiserfs. Но во фре reiserfs только на чтение.
Поисковики ничего толкового не предоставили. Кое где речь шла о перекомпиляции ядра, но что нужно было изменить не говорилось.
Ограничение в 32767 наводило на мысль, что для хранения использовалось двухбайтовое, но знаковое число. Изменив тип двухбайтового числа на беззнаковое и увеличив лимит, теоритически можно было бы обойти ограничение.

Покопавшись в исходниках ядра FreeBSD, нашел ограничение задаваемое константой LINK_MAX.
Далее в /usr/sys/ufs были найдены переменные, сравниваемые с LINK_MAX. Так же пришлось изменить тип числа в исходниках ext2fs - компилятор ругнулся.

/usr/src/sys/sys/syslimits.h:57
before
#define LINK_MAX        32768 /* max file link count */
after
#define LINK_MAX        65000 /* max file link count */

/usr/src/sys/ufs/inode.h:98
before:
int16_t        i_nlink;    /* File link count */
after:
u_int16_t    i_nlink;    /* File link count */

/usr/src/sys/ufs/dinode.h:127
before:
int16_t        di_nlink;    /*     2: File link count. */
after:
u_int16_t    di_nlink;    /*     2: File link count. */

/usr/src/sys/ufs/dinode.h:168
before:
int16_t        di_nlink;    /*     2: File link count. */
after:
u_int16_t    di_nlink;    /*     2: File link count. */

/usr/src/sys/gnu/fs/ext2fs/inode.h:90
before:
int16_t        i_nlink;    /* File link count */
after:
u_int16_t    i_nlink;    /* File link count */

На виртуальной машине компиляция выполнилось успешно и простенький скрипт насоздавал 64999 каталогов.
#!/bin/sh
a=1
while [ $a -lt 65005 ]
do
echo "$a"
a='expr $a + 1'
mkdir $a
done

Проверка раздела при помощи fsck ошибок не выявило. Но создав еще каталог и запустив там скриптик, исчерпал количество доступных инодов. Так что со снятием ограничения нужно позаботится и о достаточном количестве inode.

Просьба к знатокам и гуру - на какие грабли можно напороться, реализовав эти исправления?
Не просто так ограничение существовало. К сожалению, я недостаточно хорошо знаю английский, чтобы запросить в список рассылки FreeBSD.


Содержание

Сообщения в этом обсуждении
"FreeBSD 6.1 UFS2, ограничение на количество каталогов внутри..."
Отправлено butcher , 28-Ноя-06 21:31 
>Просьба к знатокам и гуру - на какие грабли можно напороться, реализовав
>эти исправления?
>Не просто так ограничение существовало. К сожалению, я недостаточно хорошо знаю английский,
>чтобы запросить в список рассылки FreeBSD.

Ваших изменений мало. Нужно "прошерстить" код ядра на предмет имён, типы которых вы изменили. И исправить все их некорректные использования, как, например, здесь:
http://freebsd.rambler.ru/bsdmail/freebsd-questions_1999/msg...

Вот, собственно, объяснение, почему происходит ошибка:
http://freebsd.rambler.ru/bsdmail/freebsd-questions_1999/msg...

А ограничение это, судя по всему, из-за банального снижения производительности при большом кол-ве каталогов..


"FreeBSD 6.1 UFS2, ограничение на количество каталогов внутри..."
Отправлено idle , 28-Ноя-06 21:35 
Тут лежит патч: http://lists.freebsd.org/pipermail/freebsd-fs/2005-March/001...,
и несколько succesful stories.