-T largefile
флаг корректирует сумму inodes, которые выделяются при создании файловой системы. После того, как выделенный, их число не может быть скорректировано (по крайней мере, для ext2/3, не полностью уверенного в ext4). Значение по умолчанию является одним inode для каждого 16K дискового пространства. -T largefile
делает это одним inode для каждого мегабайта.
Каждый файл требует одного inode. Если Вы не имеете inodes в запасе, Вы не можете создать новые файлы. Но они статически выделили inodes, занимают место, также. Можно ожидать сохранять приблизительно 1,5 гигабайта для каждых 100 ГБ диска путем установки -T largefile
, в противоположность значению по умолчанию. -T largefile4
(один inode на 4 МБ), не имеет такого сильного воздействия.
Если Вы уверены, что средний размер файлов, хранивших на устройстве, будет выше 1 мегабайта, то любой ценой, установить -T largefile
. Я счастливо использую его на своих разделах устройства хранения данных и думаю, что это не является слишком радикальным из установки.
Однако при распаковке очень большого источника tarball многих файлов (думайте сотни тысяч) к тому разделу у Вас есть шанс исчерпывания inodes для того раздела. Существует мало, можно сделать в той ситуации кроме выбора другого раздела к untar к.
Можно проверить, сколько inodes Вы имеете в наличии в живой файловой системе с dumpe2fs
команда:
# dumpe2fs /dev/hda5
[...]
Inode count: 98784
Block count: 1574362
Reserved block count: 78718
Free blocks: 395001
Free inodes: 34750
Здесь, я могу все еще создать 34 тысячи файлов.
Вот то, что я получил после выполнения mkfs.ext3 -T largefile -m 0
на разделе на 100 ГБ:
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/loop1 102369 188 102181 1% /mnt/largefile
/dev/loop2 100794 188 100606 1% /mnt/normal
largefile версия имеет 102 400 inodes, в то время как нормальный создал 6 553 600 inodes и сохранил 1,5 ГБ в процессе.
Если у Вас есть хорошая подсказка о том, какие файлы размера Вы собираетесь поставить файловую систему, можно подстроить сумму inodes непосредственно с -i
переключатель. Это устанавливает байты на inode отношение. Вы получили бы 75% сбережений пространства, если бы Вы использовали -i 65536
в то время как все еще способность создать более чем миллион файлов. Я обычно вычисляю для хранения по крайней мере 100 000 запчастей inodes.
Если Вы управляете программой обертки, то удостоверьтесь, что она не вызывает подоболочку. В глубине души инструкция выполнить программу состоит из полного пути (абсолютный или относительно текущего каталога) к исполняемому файлу и списку строк для передачи как аргументы. Поиск ПУТИ, пробельные аргументы разделения, заключая в кавычки и операторы управления все обеспечиваются оболочкой. Никакая оболочка, никакая боль.
Например, с оберткой Perl, используйте форму списка exec
или system
. На многих языках назовите один из exec
или execXXX
функции (или unix.exec
или независимо от того, что это называют), а не system
, или os.spawn
с shell=False
, или любой ценой.
Если обертка является сценарием оболочки, использовать "$@"
передать аргументы, например.
#!/bin/sh
mysim -preset-opt "$@"
Если у Вас не будет выбора, и программа обертки вызывает оболочку, то необходимо будет заключить аргументы в кавычки прежде, чем передать их оболочке. Простой способ заключить аргументы в кавычки состоит в том, чтобы сделать следующее:
'
(одинарная кавычка) четырьмя символьными строками '\''
. (например. don't
становится don'\''t
)'
в начале каждого аргумента и также в конце каждого аргумента. (например, от don't
, don'\''t
становится 'don'\''t'
)Если необходимо сделать это в обертке оболочки, вот путь.
arguments='-preset-opt'
for x; do
arguments="$arguments '"
while case $x in
*\'*) arguments="$arguments${x%%\'*}'\\''"; x=${x#*\'};;
*) false;; esac
do :; done
arguments="$arguments$x'"
done
(К сожалению, удар ${VAR//PATTERN/REPLACEMENT}
создайте, который должен прибыть удобный сюда, требует изворотливого заключения в кавычки, и я не думаю, что можно получить '\''
как текст замены.)
Можно использовать Bash ${VAR//PATTERN/REPLACEMENT}
идиома для преобразования одинарной кавычки '
в '\''
первым помещением '\''
в переменную (как промежуточный шаг) и затем расширяющий эту переменную как REPLACEMENT
элемент в упомянутой идиоме Bash.
# example
{
str="don't"
escsquote="'\''"
str="'${str//\'/${escsquote}}'"
printf '%s\n' "$str" # 'don'\''t'
}
Вы можете использовать getopts
в bash
, который может разобрать аргументы для вас, например:
while getopts a:b: opts; do
case ${opts} in
a)
A=${OPTARG}
;;
b)
B=${OPTARG}
;;
esac
done
Чтобы в лучшем случае избежать инъекций, рассмотрите возможность перехода на [T]csh. В отличие от оболочек Bourne, оболочка C «ограничена», поэтому для написания сценариев рекомендуется использовать другие, более безопасные пути. «Ограничения», накладываемые оболочкой C, делают ее одной из самых надежных оболочек для работы. (Например, :Вложенность минимальна или невозможна, что предотвращает инъекции любой ценой; есть лучшие способы добиться желаемого.)