Введение в администрирование ОС Solaris 10

Устройство и администрирование файловой системы UFS

Показывать лекцию целиком

Разбиение диска на разделы

Разбиение диска на разделы производится в двух случаях: при установке системы и при подключении нового диска. Разбиение на разделы следует спланировать так, чтобы в будущем размеры разделов были достаточны для установки программ и размещения файлов данных. В Solaris должны быть созданы как минимум два раздела: корневой (root), монтируемый в файловой системе в корень ее дерева и обозначаемый символом "/" (слэш), и раздел для свопинга. Последний не имеет точки монтирования, так как не принадлежит к файловой системе и не размечается, а используется для прямого чтения страниц с диска и записи страниц на диск.

Для более надежной и быстрой работы системы принято, кроме упомянутых разделов, создавать разделы с точками монтирования /usr, /export/home и, возможно, /opt. Далее мы будем называть разделы по именам точек монтирования (например, раздел /usr ).

Отметим, что при использовании файловой системы ZFS думать о разбиении диска на разделы незачем, но об этом подробнее рассказывается в лекции 8.

В корневом каталоге системы располагается несколько файлов и ряд обязательных для работы системы подкаталогов. Это подкаталоги /bin, /sbin, /dev, /devices, /etc, /tmp. Как правило, имеются подкаталоги /usr и /opt, а также /export, они обычно являются точками монтирования других разделов.

Корневой каталог в типичной установке Solaris (набор программ Entire Distribution – подробнее см. лекции 3 и 4) занимает 200 Мб (при условии, что каталоги /usr, /opt, /var и /export/home размещены в других разделах). При установке системы ему следует выделить 300 Мб – с запасом. Каталог /usr займет не меньше 1400 Мб, /var – не менее 100 Мб. Для каталога /var имеет смысл выделить больше места, т.к. именно в нем будут содержаться быстро растущие в размере файлы протоколов, почтовые ящики пользователей и прочее. Приведенные объемы разделов справедливы для варианта установки с набором программ Entire Distribution.

Вообще говоря, перед планированием разделов следует подумать о том, как будет использоваться компьютер под управлением Solaris. Если это будет сервер Oracle, надо зарезервировать один неразмеченный (неотформатированный) раздел под базы данных Oracle. Если планируется сделать почтовый сервер, то следует отвести под раздел /var достаточно места для размещения всех почтовых ящиков в каталоге /var/mail, а если это будет файловый сервер, надо сделать отдельный большой раздел для хранения файлов пользователей (например, /export/home ).

Таким образом, фактическое пространство, которое следует отвести под каталог /var, зависит от назначения компьютера. Исходя из собственного опыта, я всегда создаю для /var раздел размером как минимум 256Мб в системах с небольшой нагрузкой (почтовый сервер, http-cache и ftp для сети из 10-50 компьютеров) и до 2-3Гб в системах со средней нагрузкой (почтовый сервер, http-cache, СУБД типа MySQL, веб-сервер с 5-10 виртуальными хостами в сети из 50-150 компьютеров).

При установке системы программа-установщик предложит вам разумные значения по умолчанию. Если специфика устанавливаемой системы требует изменений, можно сделать их прямо в окне разметки диска, которое появляется в ходе работы установщика. О типах установки (установка базового комплекта, установка полного комплекта ПО Solaris и т.п.) подробнее рассказано в лекции 4.

При установке нового диска его разметку поможет провести программа format. Эта программа также может использоваться для получения информации о геометрии диска, для низкоуровнего форматирования SCSI-дисков и восстановления некоторой служебной информации после сбоев.

Разметка нового диска

Предположим, мы подключили новый диск, и это IDE primary slave диск. Чтобы создать на нем файловую систему, потребуется создать на новом диске разделы (по крайней мере один) и затем на каждом из разделов создать новую файловую систему.

Создание разделов на диске выполняется с помощью команды format или fdisk. Последняя применяется только для платформы x86. Однако, из format можно вызвать fdisk – и этот способ предпочтительнее. Почему – будет ясно из следующего описания.

После подключения нового диска нет надобности перенастраивать ядро Solaris, если диски этого типа в системе уже есть. Например, если у вас уже есть один IDE-диск и система с ним уже работает, незачем перезапускать систему с ключом r или создавать файл /reconfigure и перезапускаться для обнаружения нового устройства. Достаточно создать новые файлы устройств в каталогах /devices и /dev. Для этого в более ранних версиях Solaris использовалась программа disks, а начиная с версии Solaris 9 следует запускать devfsadm. При запуске без параметров новый диск будет обнаружен и требуемые файлы будут добавлены в каталоги /devices, ./dev/dsk и /dev/rdsk.

Теперь любая программа работы с диском, требующая файл устройства в каталоге /dev/rdsk, уже может работать с диском. Запустим программу format. В меню программы следует выбрать диск, а затем выбрать запуск fdisk. После этого мы будем работать в среде программы fdisk. Ее интерфейс нам знаком по другим системам, только обратите внимание, что есть возможность создавать разделы нескольких типов. Если мы добавляем дополнительный диск для работы с ним из среды Solaris, то следует выбрать тип Solaris. Раздел на новом диске не должен быть помечен как "активный", если только с него не будет загружаться какая-нибудь система в будущем.

Можно запустить программу fdisk самостоятельно, без предварительного вызова программы format, но последняя все равно будет нужна на следующем этапе.

После создания раздела следует выйти из fdisk, и в программе format выбрать partition->print.

Если определен размер только одного подраздела (partition), а именно – подраздела номер 2, это говорит о том, что для созданного раздела fdisk следует определить подразделы. Если это отвечает вашим намерениям, достаточно создать всего один подраздел размером с весь раздел fdisk. Это можно сделать через меню Partition программы format. Выбрав partition->номер подраздела (например, 0), будет легко задать его размер.

Обязательно выберите пункт label для записи получившейся таблицы разделов на диск.

После этого создадим новую файловую систему на получившемся подразделе. Помните: разделы fdisk для Solaris – это лишь место для размещения подразделов типа solaris (slices). А на этих подразделах как раз и существует файловая система UFS, и располагаются файлы и каталоги. Файловую систему на новом диске создадим командой newfs.

Программа mkfs позволяет создавать файловые системы разных типов, включая UFS, а newfs является более удобным интерфейсом к mkfs исключительно для создания файловых систем UFS.

# newfs /dev/rdsk/c0d1s0
newfs: construct a new file system /dev/rdsk/c0d1s0: (y/n)? y
/dev/rdsk/c0d1s0:       2060352 sectors in 2044 cylinders of 16
tracks, 63 sectors
         1006,0MB in 128 cyl groups (16 c/g, 7,88MB/g, 3776 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
 32,  16224,  32416,  48608,  64800,  80992,  97184,  113376,  129568,
145760,  161952,  178144,  194336,  210528,  226720,  242912,  258080,
274272,  290464,  306656,  322848,  339040,  355232,  371424,  387616,
403808,  420000,  436192,  452384,  468576,  484768,  500960,  516128,
532320,  548512,  564704,  580896,  597088,  613280,  629472,  645664,
661856,  678048,  694240,  710432,  726624,  742816,  759008,  774176,
790368,  806560,  822752,  838944,  855136,  871328,  887520,  903712,
919904,  936096,  952288,  968480,  984672,  1000864,  1017056,
1032224,  1048416,  1064608,  1080800,  1096992,  1113184,  1129376,
1145568,  1161760,  1177952,  1194144,  1210336,  1226528,  1242720,
1258912,  1275104,  1290272,  1306464,  1322656,  1338848,  1355040,
1371232,  1387424,  1403616,  1419808,  1436000,  1452192,  1468384,
1484576,  1500768,  1516960,  1533152,  1548320,  1564512,  1580704,
1596896,  1613088,  1629280,  1645472,  1661664,  1677856,  1694048,
1710240,  1726432,  1742624,  1758816,  1775008,  1791200,  1806368,
1822560,  1838752,  1854944,  1871136,  1887328,  1903520,  1919712,
1935904,  1952096,  1968288,  1984480,  2000672,  2016864,  2033056,
2049248,

Смонтируем получившуюся файловую систему в каталог /test:

# mount -F ufs /dev/dsk/c0d1s0 /test
# ls test
lost+found

Обратите внимание: при создании файловой системы сразу создается каталог lost+found на ней, для того, чтобы при автоматическом восстановлении файлов после сбоя (при перезагрузке, например) программе fsck было куда записать потерявшиеся фрагменты файлов. Кроме этого, в некоторые блоки (их список выводится при работе newfs или mkfs ) записана резервная копия суперблока новой файловой системы.

Количество индексных дескрипторов в файловой системе

Количество индексных дескрипторов в создаваемой файловой системе типа UFS можно задать посредством указания параметра с ключом -i:

newfs –i nbpi raw_device_name

Например

newfs –i 2048 /dev/rdsk/c0d0p0

Параметр nbpi обозначает число байтов, приходящихся на один индексный дескрипторИмеется в виду число байт данных в файлах этого раздела, а не длина индексного дескрип- тора, последняя фиксирована и равна 128 байтам (прим. Авт.)., что при известном объеме диска однозначно определяет число индексных дескрипторов в файловой системе.

Программы mkfs и newfs поддерживают еще ряд ключей, которые позволяют гибко описывать параметры создаваемой файловой системы.

Элементы файловой системы

Файловая система каждого из разделов диска состоит из нескольких структурных элементов. Это суперблок, таблица индексных дескрипторов, блоки описания файлов, блоки, содержащие списки управления доступом к файлам (ACLaccess control lists), каталоги и собственно файлы.

Файловая система UFS содержит четыре основных компонента с управляющей информацией: загрузочный блок, суперблок, таблицу индексных дескрипторов (i-node table) и каталоги. Кроме этого, в Solaris (начиная с версии 2.5Фактически, впервые Sun Microsystems ввела поддержку ACL для файловой системы UFS в 1993 году в специальной версии SolarisTrusted Solaris, которая была сертифицирована на уровень безопасности B1., с 1995 года) в файловой системе хранятся списки управления доступом (ACL). Хранение списков ACL обеспечивают так называемые теневые индексные дескрипторы (shadow inodes).

В System V каждый раздел жесткого диска форматируется (размечается) для размещения на нем файловой системы UNIX, в BSD – один раздел жесткого диска разбивается на подразделы, каждый из которых форматируется. Мы называем "разделом UNIX" такой размеченный в формате файловой системы UNIX раздел или подраздел.

Загрузочный блок (boot block) – это, как правило, часть метки диска (disk label). В загрузочном блоке записана маленькая программа, которая при старте системы загружает ядро ОС с диска в оперативную память. Загрузочный блок располагается в первом секторе диска. Такой блок имеет смысл создавать только для первого раздела жесткого диска, однако место для него резервируется в каждом разделе.

Суперблок содержит общую информацию о файловой системе как совокупности файлов на данном разделе жесткого диска, в частности, размер раздела UNIX, число свободных и занятых блоков и индексных дескрипторов и флаг целостности файловой системы. Этот флаг устанавливается при успешном завершении работы с файловой системой, например, при корректной остановке операционной системы. В случае, если компьютер выключили рубильником, не дождавшись корректной остановки системы, при следующем старте системы программа fsck автоматически начнет проверку дисков и выдаст сообщение "clean flag is not set in superblock". Копии суперблока многократно записываются в нескольких блоках внутри каждого раздела для пущей надежности. В файловой системе UFS записывается по одной копии суперблока на каждую группу цилиндров. Если выяснится, что оригинал суперблока в начале раздела поврежден, будет использована копия суперблока.

Таблица индексных дескрипторов (i-node table) содержит дескрипторы файлов. Дескриптор файла содержит сведения о типе файла, размещении файла на диске, правах доступа к нему, UID владельца файла, GID группы файла, время последнего доступа к файлу, время последней модификации файла, время последней модификации самого индексного дескриптора. Подробнее структура таблицы индексных дескрипторов рассмотрена в подраздел "таблица индексных дескрипторов: детали".

Размер индексного дескриптора фиксирован и составляет в Solaris в UFS 128 байт.

Размер таблицы индексных дескрипторов фиксирован и задается при создании файловой системы на разделе. Программе mkfs (и, соответственно, newfs ) можно явно указать требуемое количество байт данных, которые должны приходиться на один индексный дескриптор, что определит количество индексных дескрипторов на разделе. Например, если раздел состоит из 1000000 байт и число байт на дескриптор составляет 1000, то будет создано 1000 индексных дескрипторов.

Таблица индексных дескрипторов: детали

В ранних версиях UNIX таблица индексных дескрипторов занимала фиксированное пространство в начале устройства; в файловых системах UFS современных систем эта таблица распределена по диску, потому что каждая часть таблицы отвечает за часть диска.

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

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

Каждому файлу соответствует индексный дескриптор. Он хранит информацию о различных атрибутах файла и его размещении на диске. В индексном дескрипторе записаны:

  • тип файла;
  • права доступа к файлу;
  • идентификатор владельца файла;
  • идентификатор группы файла;
  • время последней модификации файла;
  • время последнего доступа к файлу;
  • время последней модификации самого индексного дескриптора;
  • число повторных использований индексного дескриптора (т.е. случаев, когда файл был стерт и его индексный дескриптор был использован для хранения данных о другом файле);
  • длину файла в байтах (для файлов устройств это поле имеет смысл сочетания major и minor номера устройства, см. раздел "файлы устройств");
  • идентификатор файловой системы, в которой расположен файл;
  • количество связей файла;
  • число блоков файла (требуется для поддержки работы с файлами, которые содержат большие области, заполненные символами с кодом "ноль", т.е. пустое пространство; такие файлы называются holey files – файлы с пустотами);
  • номер теневого индексного дескриптора (если требуется);
  • структура из 15 номеров блоков, описывающая размещение файла на диске; каждый номер блока занимает 4 байта.
  • Структура, описывающая физическое размещение файла на диске в UFS, представляет собой последовательность из номеров блоков.

    Если файл имеет размер более двенадцати блоков (т.е. его длина больше 12 x 8192 = 98304 байт), то предпоследние три номера обозначают не номера блоков данных, а номера косвенных блоков (indirect blocks), в которых хранятся указатели на следующие блоки данных и, возможно, на следующие косвенные блоки.

    Первые двенадцать номеров блоков содержат просто номера блоков данных. Тринадцатый номер – это номер косвенного блока первого уровня. В блоке первого уровня содержится до 2048 адресов блоков данных (речь идет о 8192-байтных блоках).

    Четырнадцатый номер блока содержит номер косвенного блока второго уровня. Косвенный блок второго уровня содержит 2048 номеров косвенных блоков первого уровня, таким образом, через косвенный блок второго уровня адресуется до 20482 блоков данных.

    В пятнадцатый номер блока записан номер косвенного блока третьего уровня. Косвенный блок третьего уровня содержит 2048 номеров косвенных блоков второго уровня, так что через косвенный блок третьего уровня адресуется до 20483 блоков данных.

    Файл не может располагаться на разных разделах UNIX. Файл может быть фрагментирован, хотя файловая система построена так, чтобы свести фрагментацию к минимуму. Теоретически рекомендуется не заполнять файловую систему более, чем на 70%, чтобы не увеличивать фрагментацию при работе.

    Максимальный размер файла может быть легко посчитан, так как мы знаем правила адресации блоков данных. Если размер блока равен 512 байт, то:

  • напрямую адресуемые из индексного дескриптора блоки в сумме дают размер 12 x 8192 байт = 98304 байт;
  • адресуемые через номер косвенного блока первого уровня – 2048 x 8192 байт = 16777216 байт;
  • адресуемые через номер косвенного блока второго уровня – 20482 x 8192 байт = 34359738368 байт;
  • адресуемые через номер косвенного блока третьего уровня – 20483 x 8192 байт = 70368744177664 байта.
  • Вместе получается примерно 64 Тбайта. Однако, Solaris 9, насколько об этом можно судить по доступным фактам, не поддерживал файлы размером более 1 Тбайта. Для файлов и файловых систем большого размера предпочтительнее использовать файловую систему ZFS, которая поддерживается в Solaris начиная с версии Solaris 10.

    Все современные системы UNIX используют 128-байтный индексный дескриптор, который вмещает больше информации и номер блока в нем занимает не 3 байта (как в прошлом), а 4. Поэтому адресовать можно весьма большие разделы.

    28 байт в таком дескрипторе отводится под разные расширения, включая место для 32-разрядных идентификаторов владельца и группы файла, а также под 64-разрядные поля времен модификации. Введение 64-разрядных полей времени в UNIX вместо прежних 32-разрядных, нужно для того, чтобы избежать "проблемы 2031 года", т.к. именно в этом году перестанет хватать 32 байт для представления времени в системах UNIX. Разработчики обоснованно полагают, что до тех пор все существующие системы UNIX будут переведены на 64-разрядную архитектуру.

    Обычные индексные дескрипторы

    Обычные индексные дескрипторы (i-nodes) используются повсюду во всех системах UNIX. В Solaris существует специальный тип индексных дескрипторов: теневые индексные дескрипторы. Они служат для хранения информации о расширенных правах доступа к файлам и каталогам.

    Теневые индексные дескрипторы

    Теневые индексные дескрипторы (shadow i-nodes) содержат информацию, позволяющую получать доступ к расширенным правам доступа (ACL) файла или каталога. Этот тип файловых дескрипторов существует в реализации файловой системы UFS в Solaris, начиная с версии 2.5.1. Solaris поддерживает теневые индексные дескрипторы для файловых систем UFS (Unix File System), NFS (Network File System версий 2 и 3), CacheFS (Cache File System). Информация о расширенных правах доступа в ZFS хранится иначе в силу более сложной структуры служебных данных ZFS. Расширенные права доступа могут быть назначены в отношении каталогов, обычных файлов, символических ссылок и именованных каналов (FIFO).

    Если в отношении файла назначены расширенные права доступа (например, с помощью команды setfacl), то будет создан теневой индексный дескриптор для этого файла и в обычный индексный дескриптор этого файла будет записана ссылка на теневой индексный дескриптор. Теневой индексный дескриптор не имеет специального формата, он представляет собой точно такой же индексный дескриптор, как и обычный, но с указанием в поле типа дескриптора на то, что он – теневой.

    Расширенные права доступа хранятся в специальном файле, который создается в момент назначения таких прав. Теневой дескриптор указывает на этот специальный файл. В Solaris разрешено создавать не более 1024 записей в таком файле, следовательно, расширенные права доступа могут содержать не более 1024 специфических определений прав. Этого с избытком хватает для установки каких угодно специфических прав доступа. Каждая запись ACL занимает 12 байт, поэтому обычно эти записи не требуют много места на диске. Однако, при назначении специфических прав доступа большому числу объектов в файловой системе следует помнить о том, что для этого требуется дополнительный объем дисковой памяти.

    Для назначения и просмотра расширенных прав доступа используются команды setfacl и getfacl, о которых более подробно рассказывается в лекции 6.

    Оптимизация размеров разделов

    Как гласит русская народная поговорка в переводе на английский и обратно, "Недостаток ума нередко компенсируется усиленной ходьбой". Вопрос об оптимизации дисковой подсистемы обычно встает как неизбежный результат отсутствия детального планирования системы в целом. Поэтому первым правилом для тех системных администраторов, которые желают видеть свою систему быстрой и надежной, будет "планируй все заранее". В случае использования ZFS, впрочем, созданная заранее удачная концепция файловой системы поможет даже рассеянному администратору.

    Когда требуется установить новый сервер Solaris, стоит подумать, чем этот сервер будет занят. В современном мире задачи компьютеров меняются быстрее, чем оборудование. Если пять лет назад почтовый сервер, обслуживающий сто пользователей, мог работать на медленном компьютере с диском 1 Гб, то нынче с почтой связано намного больше задач, чем просто прием, передача и хранение. Современный почтовый сервер для тех же ста пользователей принимает почту, проверяет ее на вирусы, блокирует спам, возможно, выполняет контекстный анализ письма для фильтрации спама, и только после этого сохраняет на диске. Объемы передаваемой почты тоже существенно возросли. Письма часто отправляются в формате HTML, а многие адресаты вкладывают в письма не только текстовые документы, но и фотографии, музыкальные файлы и видеоклипы. Поэтому, планируя с запасом свой новый почтовый сервер, вы не ошибетесь. Сейчас средний пользователь хранит в почтовом ящике несколько гигабайт информации, и следует ожидать, что в ближайшее время придется оценивать возможную нагрузку на файловую систему почтового сервера исходя из десятков гигабайт на каждого пользователя. Кстати, в первом издании этой книги, которое вышло в 2006 году, числа в предыдущем предложении были ровно вдесятеро меньше. Разумеется, наш прогноз не относится к серверам, которые только передают почту, но не хранят почтовые ящики пользователей.

    Для передачи и приема нескольких писем в секунду придется установить новый компьютер с новым процессором Pentium IV, если на сервере будет запущена программа контекстного анализа писем для фильтрации спама (например, spamasassin). Объем памяти, естественно, тоже должен быть достаточным для одновременного запуска десятков копий программы sendmail или ее аналога.

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

    В Solaris размер корневой файловой системы / вполне может быть менее 3 Гб. Даже с учетом возможного обновления системы этого достаточно. Но файловая система /opt, куда будут устанавливаться все новые пакеты, должна быть спланирована с запасом. Если работа сервера будет связана с большой дисковой нагрузкой (кэширование http-запросов, хранение файлов или почты), то для этих специфических целей (например, кэш http-запросов) можно выделить отдельный раздел и назначить ему такой размер, который соответствует вашим потребностям.

    Надо будет учесть такие факторы, как возможный рост потребностей, требуемая производительность (для подсистем SCSI лучше установить 6 дисков по 9 Гб, чем один размером 54 Гб – будет быстрее), и не забыть учесть "запас", который создает система на каждом разделеСм. "минимальное свободное пространство"..

    Как узнать, сколько места осталось на диске?

    Оценить текущее использование диска поможет программа df:

    #df
    /             (/dev/dsk/c0d0s0):       1787406 blocks   419477 files
    /boot         (/dev/dsk/c0d0p0:boot):  19452 blocks     -1 files
    /proc         (/proc             ):    0 blocks         2896 files
    /etc/mnttab   (mnttab            ):    0 blocks         0 files
    /dev/fd       (fd                ):    0 blocks         0 files
    /var/run      (swap              ):    1265832 blocks   30240 files
    /tmp          (swap              ):    1265832 blocks   30240 files
    /export/home  (/dev/dsk/c0d0s7   ):    7647080 blocks   481212 files

    Чтобы получить более наглядную картину, в которой размер занятых блоков приводится в килобайтах, следует дать команду df –k:

    #df -k
    Filesystem            kbytes   used    avail    capacity  Mounted on
    /dev/dsk/c0d0s0       1857844  964142  837967   54%       /
    /dev/dsk/c0d0p0:boot  11234    1508    9736     14%       /boot
    /proc                 0        0       0        0%        /proc
    mnttab                0        0       0        0%        /etc/mnttab
    fd                    0        0       0        0%        /dev/fd
    swap                  632924   20      632904   1%        /var/run
    swap                  633208   304     632904   1%        /tmp
    /dev/dsk/c0d0s7       3823549  9       3785305  1%        /export/home

    Команда

    df –o i

    сообщит о количестве свободных и занятых индексных дескрипторов на разделе. Обратите внимание на то, что в других UNIX это делается с помощью команды

    df -i

    Для оценки размеров подкаталогов любого каталога используйте du. Например, для определения того, сколько места на дисках занимают подкаталоги корневого каталога, дайте команду du –s /*:

    #du –s /*
    2  /bin
    3011  /boot
    87255 /cdrom
    1424  /core
    3068  /dev
    76 /devices
    6262  /etc
    26 /export
    6  /floppy
    4  /format.log
    1  /home
    20702 /kernel
    2  /lib
    16 /lost+found
    2  /Mail
    2  /mnt
    1  /net
    2  /nsmail
    14 /opt
    3822  /platform
    730131  /proc
    50 /qq
    2  /qqqq
    34154 /sbin
    640/tmp
    46 /TT_DB
    1811752 /usr
    46138 /var
    0  /vol
    19 /xfn

    В этой команде ключ –s указывает, что следует выдать суммарные значения по всем подкаталогам, а аргумент /* требует, чтобы была посчитана статистика по всем подкаталогам и файлам корневого каталога. Без указания ключа –s программа du сообщит о том, сколько места занимает каждый из "листьев" дерева каталогов, т.е. выдаст длинный и подробный список всех подкаталогов вообще, включая подкаталоги подкаталогов подкаталогов...

    Минимальное свободное пространство

    При создании файловой системы часть раздела диска резервируется на всякий случай. Эта доля задается параметром minfree (параметр free при запуске программы mkfs ) и по умолчанию составляет 10% общего объема файловой системы. Ко "всяким случаям" относят переполнение диска (т.е. превышение выделенного лимита пространства размещенными на разделе файлами), необходимость срочно найти свободный дисковый блок, когда диск почти заполнен, и тому подобное. В современных системах, где файловые системы размером в сотни гигабайт обычны, 10% свободного объема составляет значительный объем дискового пространства.

    Чтобы уменьшить такие параноидальные издержки, значение minfree достаточно установить равным 1%. Кстати, при установке Solaris 9 на мой ноутбук ThinkPad 390X с диском размером 4 гигабайта, по умолчанию файловая система была создана именно с таким minfree. Несмотря на это, документация на mkfs_ufs утверждала, что 10% является значением по умолчанию. При создании файловой системы минимальное свободное пространство можно задать так:

    mkfs_ufs –o free=1

    или так:

    newfs –m 1

    Изменить параметры файловой системы можно с помощью программы tunefs.

    После того, как на диске осталось менее minfree процентов свободного пространства, запись на диск сможет выполнить только root.

    Фрагментация

    Любая файловая система так или иначе ищет компромисс между бесконтрольной фрагментацией, как в системе FAT, и полным запретом на фрагментацию, как в файловой системе ОС RT-11. Одной из проблем FAT является необходимость регулярно дефрагментировать раздел, а в файловой системе RT-11 приходилось регулярно выполнять программу squeese, которая записывала друг за другом, последовательно, все файлы, разбросанные по диску. Фрагментация FAT приводила к снижению производительности ввода-вывода, а запрет на фрагментацию в RT-11 делал невозможным запись на диск большого файла, даже если на диске было полно участков с размером хоть чуть меньше его длины, так как файл должен был быть записан только в последовательно расположенные блоки.

    В файловой системе UFS проблема фрагментации решается очень изящно. Фактически, фрагментация диска редко превышает 1-2% от его объема, что в мире Windows считается превосходным показателем.

    Как удается достичь такого? Нужно ли что-то делать системному администратору, чтобы фрагментация не мешала производительности в UNIX?

    Фактически, термин "фрагментация" в UNIX означает явление, совсем не похожее на фрагментацию в FAT. В UFS если на диск записывается файл размером меньше блока, ему выделяется фрагмент блока, но фактически "резервируется" целый блок, и файл, таким образом, имеет резерв для расширения до размера блока. Файлы размером больше блока записываются в свободные (по возможности, последовательные) блоки файловой системы. Однако размер файла не всегда кратен длине блока, поэтому последний из блоков, в которые записан файл, будет, скорее всего, заполнен не до конца. В этот блок в UFS можно записать фрагмент другого файла. В этом смысле "фрагментом" файла в UFS называется часть файла, меньшая по размеру, чем блок. Фрагменты одного файла не могут храниться в разных блоках. Это означает, что файл не может занимать более одного блока неполностью. Это иллюстрирует рис 7.1.

    (рис 7.1) Фрагментация в UFS

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

    Фрагментации в том смысле, в котором она мучает пользователей Windows, в файловой системе UFS не бывает, так как драйвер файловой системы сам заботится о том, чтобы размещать файл, по возможности, в пределах одного цилиндра.

    Как много фрагментов (в понимании UFS) на разделе, можно выяснить, дав команду fsck –n.

    Для уменьшения числа фрагментов (в понимании FAT), т.е. частей файла, записанных на разделе в разных цилиндрах вдали друг от друга, для записи файла в последовательные блоки следует воспользоваться коммерческими программами дефрагментации (см., например, http://www.eaglesoft.com/products.html – только для платформы SPARC) или выполнить резервное копирование всех файлов раздела и обратное их восстановление посредством программ ufsdump / ufsrestore.

    Изменение размеров раздела

    Для изменения размеров раздела UFS можно воспользоваться программой growfs. Кроме этого, если изменить размер раздела по какой-либо причине не представляется возможным, следует установить новый диск и перенести часть информации на него, возможно, создав соответствующие символические ссылки на переполненном разделе. Подробнее об изменении размеров разделов дисков и повышении их производительности рассказано в лекции 8 курса "Системное администрирование ОС Solaris 10".

    Проверка файловых систем

    Аналогом широко известной из систем Windows программы scandisk в UNIX является программа fsck. В Solaris fsck по умолчанию проверяет все фаловые системы, перечисленные в /etc/vfstab. Обычно имеет смысл запускать fsck вручную с указанием конкретной файловой системы:

    fsck /dev/dsk/c0d0s7

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

    Если в настоящий момент файловая система смонтирована, fsck не начинает проверку такой файловой системы. Это правило можно обойти, если потребовать от fsck обращаться к диску как к символьному устройству, а не как к блочному:

    fsck /dev/dsk/c0d0s7
    /dev/dsk/c0d0s7 is a mounted file system, ignored
    fsck /dev/rdsk/c0d0s7
    ** /dev/rdsk/c0d0s7
    ** Currently Mounted on /export/home
    ** Phase 1 - Check Blocks and Sizes
    ** Phase 2 - Check Pathnames
    ** Phase 3 - Check Connectivity
    ** Phase 4 - Check Reference Counts
    ** Phase 5 - Check Cyl groups
    2 files, 9 used, 3823540 free (20 frags, 477940 blocks,
     0.0% fragmentation)
    Вернуться к учебному плану