ГЛАВА 5 УПРАВЛЕНИЕ ФАЙЛОВОЙ СИСТЕМОЙ СОДЕРЖАНИЕ ВВЕДЕНИЕ Как организована файловая система Блок 0 Блок 1: суперблок Описатели файлов Блоки данных Свободные блоки Заключение ФАЙЛОВЫЕ СИСТЕМЫ И ИХ РАЗМЕЩЕНИЕ НА ЗАПОМИНАЮЩИХ УСТРОЙСТВАХ Форматирование дисков Деление дисков Ограничения размеров КАК РАБОТАЕТ ФАЙЛОВАЯ СИСТЕМА Таблицы в памяти Системная таблица описателей файлов Системная таблица файлов Таблица открытых файлов Последовательность действий при доступе к файлу Открытие файла Создание файла Чтение и запись файлов Файлы, используемые несколькими процессами Конверсия маршрутного имени Синхронизация Время поиска Дыры в файлах Заключение ОБСЛУЖИВАНИЕ ФАЙЛОВОЙ СИСТЕМЫ Создание файловой системы и открытие доступа к ней Команда mkfs Монтирование и размонтирование файловых систем Заключение ПОДДЕРКА ФАЙЛОВЫХ СИСТЕМ Выработка принципов организации и обслуживания файловых систем Shell-процедуры для управления файловыми системами Проверка корректности файловых систем Контроль за использованием дискового пространства Контроль за процентом занятого дискового пространства Контроль за растущими файлами и каталогами Выявление и удаление неиспользуемых файлов Выявление пользователей, занимающих большой объем дискового пространства Сохранение и восстановление файловых систем Полное сохранение Дополнительные копии Выборочные резервные копии Напоминания о плановых сохранениях файловых систем Восстановление файловой системы с сохраненных копий ВОЗМОЖНЫЕ НЕПОЛАДКИ В ФАЙЛОВОЙ СИСТЕМЕ Аппаратные сбои Авариное завершение программ Ошибки пользователя КАК ПРОВЕРИТЬ КОРРЕКТНОСТЬ ФАЙЛОВОЙ СИСТЕМЫ Утилита fsck Команда fsck Пример использования команды Компоненты файловой системы, проверяемые утилитой fsck Суперблок Описатели файлов Счетчик ссылок Блоки косвенной адресации Блоки данных каталогов Блоки данных обычных файлов Выполнение fsck Фаза инициализации Фаза 1: Проверка блоков и размеров Фаза 1В: Повторный просмотр для поиска описателей, ссылающихся на дважды занятые блоки Фаза 2: Проверка маршрутных имен Фаза 3: Проверка связности Фаза 4: Проверка счетчиков ссылок Фаза 5: Проверка списка свободных блоков Фаза 6: Переконструирование списка свободных блоков Фаза очистки ВВЕДЕНИЕ Как организована файловая система Основная функция операционной системы UNIX - это поддержка фай- ловых систем. Файл в системе UNIX представляет собой одномерный массив байт, не имеющий какой-либо другой структуры. Файлы включаются в иерархически организованные каталоги. Каталог - это просто файл другого типа, который доступен пользователю только для чтения, но не для записи; операционная система ос- тавляет право записи файлов-каталогов лишь за собой. Совокуп- ность каталогов и обычных файлов образует файловую систему. На рис. 5-1 показано соответствие каталогов и файлов в файловой системе. Каталоги заключены в прямоугольники. Рис. 5-1. Файловая система UNIX ~--- ~------ / ------ │ - - │ ~---- │ │ │ ~---- │/bin ----- │ ---- /usr│ ---- ~- -- ---- │ │/etc│ cat ---- │ │ who mkfs │ │ ls mount │ setclk Исходной точкой файловой системы является каталог, который на- зывается ее корнем. В операционной системе UNIX всегда имеется одна файловая система, которая так и называется - корневая фай- ловая система. Традиционно корневой каталог корневой файловой системы обозначается одной наклонной чертой (/). Таким образом, на рис. 5-1 приведена стуктура корневой файловой системы. Если к корневой файловой системе, например, к каталогу /usr, "подве- сить" еще одну файловую систему, то получим результат, который проиллюстрирован на рис. 5-2. Рис. 5-2. Подключение файловой системы /usr ~--- ~---------- / -------------------- │ - - │ │ │ │ ~-- - ~-- - ~- -- │/bin│ │/etc│ ~------ /usr -------- ---- ---- │ -- - │ │ │ ~----- --------- ---------- ---- cat mkfs │ ~-- - ~--- ---- ~- -- │ │ │ │ │/bin│ │/include│ │/abc│ │ who mount │ ---- -------- ---- │ │ │ │ lp studion.h │ ls setclk │ │ │ │ │ at time.h │ │ │ │ │ │ cut math.h │ │ │ │ файловая система /usr │ ------------------------------- Для обозначения понятия "каталог", например, /usr, могут приме- няться различные термины. Каталог, который используется как точка подключения монтируемой файловой системы к корневой фай- ловой системе может называться "лист" или "точка монтирования", независимо от того какой термин используется - такой каталог является корнем для исходящей из него файловой системы. Имя этой файловой системы совпадает с именем каталога. В нашем при- мере файловая система будет называться /usr. Диаграммы на рис. 5-1 и 5-2 могут служить удобным способом представления структуры файлов и каталогов, но он не вполне то- чен и не дает представления о том, в каком виде файловые систе- мы хранятся в операционной системе UNIX. С точки зрения системы UNIX файловая система представляет собой определенным образом организованный набор блоков диска, которые можно подразделить на четыре категории: блок 0 блок 1: суперблок переменное число блоков, содержащих список описателей файлов переменное число блоков данных: большая часть их содержит данные, некоторые используются для хранения списка свободных блоков и косвенных адресов Проиллюстрируем эту схему. Рис. 5-3. Файловая система с точки зрения системы UNIX ~--------------------------------- │ Блок 0 │ │ Зарезервирован │ --------------------------------- │ Блок 1 │ │ Суперблок │ --------------------------------- │ Блок 2 │ │ . │ │ . │ │ . Описатели │ │ . файлов │ │ . │ │ Блок n │ --------------------------------- │ Блок n+1 │ │ . │ │ . Блоки │ │ . данных │ │ . │ │ . │ │ Конец файловой системы │ --------------------------------- Блок 0 Блок 0 - хотя и считается частью файловой системы, фактически не используется ею. Он зарезервирован для хранения процедур загрузки. Не все файловые системы участвуют в процессе загруз- ки. В файловых системах, не участвующих в процессе загрузки, блок 0 не используется. Блок 1: суперблок В суперблоке хранится большая часть информации о файловой сис- теме, в том числе такая информация как: Размер и статус файловой системы - метка, имя файловой системы - размер в физических и логических блоках - признак доступа только на чтение - флаг модификации суперблока - дата и время последнего изменения Описатели файлов - общее число описателей файлов - число свободных описателей файлов - массив, содержащий 100 номеров свободных описателей файлов - индекс в массиве номеров свободных описателей файлов Блоки данных - общее число свободных блоков - массив, содержащий номера 50 свободных блоков - индекс в массиве номеров свободных блоков Диаграмма полей суперблока изображена на рис. 5-4. Заметим, что в суперблоке не поддерживаются полные списки свободных описате- лей блоков; хранятся лишь номера достаточного их количества для удовлетворения текущих потребностей, возникающих при работе с файловой системой. Почти всегда, за исключением ситуации, когда файловая система близка к исчерпанию описателей файлов и блоков данных, свободных описателей и блоков имеется больше, чем пере- числено в суперблоке. Информация о них хранится в одном из бло- ков данных. Рис. 5-4. Суперблок ~----------------------------------------------------------- │ Дополнительная информация │ │ │ │ - логический и физический размеры диска │ │ - флаг модификации суперблока │ │ - признак доступа только на чтение │ │ - дата последнего изменения │ │ - метка или имя │ ----------------------------------------------------------- │ Информация об описателях файлов │ │ │ │ - общее число описателей файлов │ │ - общее число свободных описателей файлов │ │ - массив номеров свободных описателей файлов │ │ - индекс в массиве номеров свободных описателей файлов │ ----------------------------------------------------------- │ Информация о блоках │ │ │ │ - общее число свободных блоков │ │ - массив номеров свободных блоков │ │ - индекс в массиве номеров свободных блоков │ ----------------------------------------------------------- Описатели файлов Используемый в документации на английском языке термин "i-node" означает "information node" ("информационный узел"). Часто ис- пользуется написание без дефиса: inode. Аналогичным образом обозначаются понятия, связанные с описателями файлов, например, список описателей файлов называется i-list, или ilist, (i-спи- сок), i-number (i-номер) - позиция описателя в списке описате- лей файлов. Описатель файла содержит всю информацию о файле за исключением его имени, которое хранится в каталоге. Описатель файла занима- ет 64 байт, следовательно, в одном физическом блоке помещается 8 описателей файлов. Число блоков, отводимых под описатели фай- лов, не фиксировано; оно зависит от общего числа описателей файлов в файловой системе, которое указывается при ее создании. Описатель файла содержит: тип и режим файла; типы файлов: обычный (-), каталог (d), символьный (с), или fifo (именованный канал (p)); режим - это набор прав чтения- записи-выполнения. число ссылок на файл идентификатор пользователя, которому принадлежит файл идентификатор группы, которой принадлежит файл число байт в файле массив из 13 адресов блоков диска дата и время последнего доступа дата и время последней модификации дата и время создания Сердцевину описателя составляет массив из 13 адресов блоков диска. Первые 10 - непосредственные адреса, т.е. адреса первых десяти блоков, в которых хранится содержимое файла. Если файл содержит более 10240 байт, то 11-й адрес указывает на блок кос- венной адресации, содержащий еще 256 адресов блоков. 12-й адрес указывает на блок двойной косвенной адресации, в котором нахо- дятся адреса 256 блоков косвенной адресации, каждый из которых хранит адреса 256 блоков. И, наконец, для файлов, длина которых превышает 67 381 248 байт, 13-й адрес массива - это адрес блока тройной косвенной адресации, в котором находятся адреса 256 блоков двойной косвенной адресации, и т.д. Теоретически воз- можная длина файлов в системе UNIX значительно превышает разме- ры дискового пространства современных UNIX-машин. Блоки данных Остальную часть памяти, отведенной под файловую систему, зани- мают блоки данных, называемые также блоками хранения. Для обыч- ных файлов блоки данных хранят содержимое файлов. Структура со- держимого файлов не определена. Для каталогов - блоки данных содержат 16-байтные элементы (по 64 в блоке). Каждый элемент представляет файл или подкаталог данного каталога. Элемент сос- тоит из номера описателя файла, который занимает 2 байта, и имени файла или подкаталога. Свободные блоки Блоки, не занятые в данный момент под хранение описателей фай- лов, данных или адресов других блоков, образуют связный список. Каждый блок в списке содержит адрес следующего блока. Заключение Мы рассмотрели здесь абстрактную структуру файловой системы, основные компоненты, из которых она состоит, и некоторые соот- ношения между тем и другим. В последующих разделах этой главы мы покажем, как файловые системы размещаются на дисках и что происходит в процессе работы с ними. ФАЙЛОВЫЕ СИСТЕМЫ И ИХ РАЗМЕЩЕНИЕ НА ЗАПОМИНАЮЩИХ УСТРОЙСТВАХ Файловые системы операционной системы UNIX размещаются на дис- ках с произвольным доступом. Прежде чем установить файловую систему на диск, необходимо выполнить некоторые подготовитель- ные действия. Материал этой части главы представляет собой краткий обзор сведений, которые более подробно изложены в гл. 4, "Обслуживание дисков и лент". Форматирование дисков Прежде чем приступить к использованию диска в оперционной сис- теме UNIX, необходимо его отформатировать и, таким образом, вы- делить на нем адресуемые секторы. Сектор - это участок размером 1024 байт, к которому может адресоваться контроллер диска. Чис- ло секторов есть функция от размера и числа поверхностей диско- вого устройства. Примечание Жесткие диски обычно форматируются при установке. Единственный случай, когда может возникнуть необходи- мость их переформатирования - это после катастрофичес- кого аппаратного сбоя. В таком случае рекомендуется об- ратиться к представителю фирмы. Дискеты изготавливаются в расчете на возможное применение на различных машинах. Производители поставляют их в неотформатиро- ванном виде, предоставляя пользователям возможность самим от- форматировать их для конкретной машины, на которой они будут применяться. Для форматирования дискет служит команда for- mat(1M). Деление дисков Следующий уровень форматирования дисков - это установка разде- лов. На жестком диске может быть выделено до 7 разделов (см. также intro(7)). Ограничения размеров Максимальное число блоков, которое может быть отведено под фай- ловую систему, близко к общему числу секторов диска. Этот мак- симум может быть уменьшен в результате выделения на диске об- ласти для подкачек или страничной организации памяти. Максимально допустимое число описателей файлов равно 65500. Размер блока на диске - 1024 байт, такой же размер имеет сектор диска. Гибкие диски имеют размеры блоков 256, 512 и 1024 байт. В системе UNIX размер логического блока равен 1024 байт. Подп- рограммы ввода/вывода для файлов работают с блоками в 1Кб. КАК РАБОТАЕТ ФАЙЛОВАЯ СИСТЕМА До сих пор мы обсуждали лишь логическую структуру файловых сис- тем и их размещение на физических дисках. Теперь мы опишем, что происходит в процессе работы с файловыми системами в ОС UNIX. Таблицы в памяти Когда файловая система идентифицируется в системе UNIX при по- мощи команды mount(1M), то в таблице смонтированных файловых систем создается новый элемент, а ее суперблок прочитывается в буфер ядра. Части суперблока, которые более всего нужны в опе- ративной памяти - это списки свободных описателей файлов и сво- бодных блоков, а также признаки и поля, содержащие время созда- ния/модификации файлов, т. к. они постоянно подвергаются изме- нениям. СИСТЕМНАЯ ТАБЛИЦА ОПИСАТЕЛЕЙ ФАЙЛОВ В системе UNIX поддерживается структура, называемая системной таблицей описателей файлов. Когда файл открывается, его описа- тель копируется с диска в системную таблицу описателей файлов. Если два или более процессов открывают один и тот же файл, то они используют один и тот же элемент таблицы описателей. Эле- мент таблицы, помимо прочего, содержит следующую информацию: имя устройства, с которого был взят описатель файла номер описателя файла счетчик ссылок (число указателей) на данный файл. (Файл может быть открыт для более чем одного процесса.) Структура системной таблицы описателей файлов показана ниже. Рис. 5-5. Системная таблица описателей файлов ~----------------------------------------------------------- │ Указатель на следующий описатель файла в таблице │ ----------------------------------------------------------- │ Поле связи для списка свободных элементов │ ----------------------------------------------------------- │ Признак │ ----------------------------------------------------------- │ Счетчик ожиданий описателя файла │ ----------------------------------------------------------- │ Счетчик указателей на файл │ ----------------------------------------------------------- │ Имя устройства, откуда взят описатель │ ----------------------------------------------------------- │ Номер описателя │ ----------------------------------------------------------- │ Режим │ ----------------------------------------------------------- │ Число ссылок │ ----------------------------------------------------------- │ Идентификатор пользователя - владельца файла │ ----------------------------------------------------------- │ Размер файла │ ----------------------------------------------------------- СИСТЕМНАЯ ТАБЛИЦА ФАЙЛОВ В системе поддерживается еще одна таблица, называемая системной таблицей файлов. Такая таблица необходима, поскольку файлы мо- гут разделяться взаимодействующими процессами, и нужно следить за тем, какие процессы к каким файлам имеют доступ. Элемент системной таблицы файлов для каждого дескриптора файла содержит следующую информацию: признак, показывающий как был открыт файл (на чтение, на за- пись) счетчик процессов, ссылающихся на этот элемент (когда значе- ние счетчика становится равным нулю - система удаляет эле- мент) указатель на элемент системной таблицы описателей файлов указатель текущей позиции в файле, в которой будет выполнять- ся очередная операция ввода/вывода ТАБЛИЦА ОТКРЫТЫХ ФАЙЛОВ Наконец, последняя таблица, которая служит для обеспечения дос- тупа к файлам - это таблица открытых файлов. Она размещается в области памяти пользователя. В каждом процессе есть область па- мяти пользователя, а в ней - таблица открытых файлов. Элемент таблицы открытых файлов ссылается на соответствующий элемент системной таблицы файлов. На рис. 5-6 показана связь между эти- ми таблицами. Рис. 5-6. Таблицы для работы с файловой системой и связи между ними Адресное пространство операционной системы Адресное пространст- во процесса --------------------------------------------------------------- │ Системная таблица Системная ~-- -- -- -- -- -- -- -- -- -- -- - описателей таблица │Область памяти │ │ файлов файлов пользователя ~-------- ~------ │ │ │ │ 0 │ │ 0 │ Таблица ~----------- -------- ------ │ открытых │ │ │ │ │ 1 │ │ 1 │ файлов │ Процесс А │ -------- ------ │ ~---------- │ │ │ │ │ 2 ttuxx│ │ 2 │ │ 0 Stdin │ │ │ -------- ------ │ ---------- │ │ │ │ │ 3 │ │ 3 │ │ 1 Stdout │ ----------- -------- ------ │ ---------- │ │ │ 4 │ │ 4 │ │ 2 Stderr │ -------- ------ │ ---------- │ │ │ . │ │ . │ │ 3 │ │ . │ │ . │ │ ---------- │ │ │ . │ │ . │ │ . │ -------- ------ │ │ . │ │ │ │ . │ │ ---------- │ │ - -- -- -- -- - -- -- -- -- -- -- Последовательность действий при доступе к файлу В следующих нескольких параграфах мы опишем последовательность шагов, предпринимаемых операционной системой при открытии, соз- дании, чтении и записи файла. ОТКРЫТИЕ ФАЙЛА Предположим, что выполняется системный вызов open(2) с маршрут- ным именем /a/b. (В программе скорее всего используется подп- рограмма fopen(3) из стандартной библиотеки ввода/вывода, но она в свою очередь обращается к системной процедуре.) 1. Поскольку маршрутное имя начинается с наклонной черты, то операционная система извлекает из таблицы описателей файлов описатель корневого каталога. 2. Пользуясь описателем корневого каталога, система последова- тельно просматривает файл - корневой каталог в поисках эле- мента "а". Если элемент "а" обнаружен, то система извлекает номер описателя, соответствующего элементу "а". 3. Номер описателя дает смещение в списке описателей, в котором находится описатель файла "а". Выбрав описатель файла "а", система выясняет, что это каталог. 4. Осуществляется последовательный просмотр каталога "а" в по- исках элемента "b". 5. После того как элемент "b" найден, выбирается номер его опи- сателя и используется как индекс в списке описателей для вы- бора описателя файла "b". 6. По описателю файла "b" система выясняет, что это файл; копи- рует описатель в системную таблицу описателей (если его там еще нет) и устанавливает значение счетчика указателей. 7. Заносится новый элемент в системную таблицу файлов, из него устанавливается ссылка на элемент в системной таблице описа- телей; текущая позиция в файле устанавливается равной 0, т. е. указывает на начало файла, инициализируется счетчик ука- зателей на файл. 8. В таблице дескрипторов файлов в области памяти пользователя также создается новый элемент и из него устанавливается ссылка на элемент в системной таблице файлов. 9. Программа возвращает в качестве результата номер слота дескриптора файла. Для поиска описателя файла в каталоге применяется линейный по- иск, этим объясняется настоятельная рекомендация иметь неболь- шие каталоги. Время поиска сокращается также, если имена подка- талогов располагаются вблизи начала каталога. (Используйте для этого команду dcopy(1M).) СОЗДАНИЕ ФАЙЛА При создании файла (системный вызов create(2)) выполняются вна- чале следующие дополнительные действия: 1. В суперблоке отыскивается свободный номер описателя файла. 2. Устанавливается режим файла (возможно, выполняется сложение с дополнением значения UMASK), и заносится в описатель фай- ла. 3. Используя номера описателей, система осуществляет поиск в каталогах так же, как и при открытии файла. Разница заключа- ется в том, что последняя часть маршрутного имени файла за- писывается в каталог, имя которого образует остальная часть маршрутного имени. ЧТЕНИЕ И ЗАПИСЬ ФАЙЛОВ Оба системных вызова - read(2) и write(2) - выполняют следующую последовательность шагов: 1. При помощи дескриптора файла, который служит индексом в таб- лице открытых файлов и передается при вызове в качестве па- раметра, из пользовательской таблицы открытых файлов извле- кается указатель на элемент системной таблицы файлов. 2. При вызове, системной программе передаются в качестве пара- метров адрес пользовательского буфера и число байт, которые нужно прочитать (записать). Из элемента системной таблицы файлов выбирается текущая позиция в файле. 3. (Чтение) По указателю из системной таблицы файлов на сис- темную таблицу описателей извлекается описатель читаемого файла. Операционная система копирует данные из внешней памя- ти в буфер пользователя. 4. (Запись) Проходится та же цепочка указателей, но перепись данных производится из буфера пользователя во внешнюю па- мять. Если требуются новые блоки для данных или блоки кос- венной адресации, то они берутся из списка свободных блоков файловой системы. 5. Перед тем как возвратить управление пользователю, система прибавляет число прочитанных (записанных) байт к указателю текущей позиции файла в системной таблице файлов. 6. Результат программы равен числу прочитанных или записанных байт. ФАЙЛЫ, ИСПОЛЬЗУЕМЫЕ НЕСКОЛЬКИМИ ПРОЦЕССАМИ Если взаимодействующие процессы разделяют дескриптор файла, как это бывает после выполнения системного вызова fork(2), то они разделяют и соответствующий элемент в системной таблице файлов. Невзаимодействующие процессы, которые обращаются к одному и то- му же файлу, ссылаются на разные элементы в системной таблице файлов, поскольку они могут производить чтение и запись различ- ных участков файла. В обоих случаях используется один и тот же элемент в системной таблице описателей; а текущая позиция файла для чтения и записи хранится в поле соответствующего элемента системной таблицы файлов. КОНВЕРСИЯ МАРШРУТНОГО ИМЕНИ Поиск по каталогам и конверсия маршрутного имени осуществляется только один раз за все время, пока файл остается открытым. Для выполнения последующих операций доступа к этому файлу систем предоставляет дескриптор файла, который является индексом в таблице открытых файлов в пользовательской области процесса. Таблица открытых файлов указывает на элемент в системной табли- це файлов, который в свою очередь ссылается на элемент в табли- це описателей. Имея описатель файла, система может отыскать блоки, из которых состоит данный файл. Синхронизация Приведенное выше описание, хотя и довольно громоздкое, может показаться вполне четким и стройным. Дело, однако, осложняется тем, что система UNIX является многозадачной. Для того чтобы дать некоторым задачам какие-то преимущества, система может принять решение о том, что другие задачи являются менее срочны- ми. Помимо этого, для того чтобы обеспечить более быстрое обс- луживание, система хранит в памяти хэш-таблицу буферов, хэш- таблицу свободных блоков и описателей файлов, а также суперб- лок. Жертвуя надежностью, т. е. не обеспечивая при операциях вывода немедленную запись каждого байта данных на диск, система способна предоставить большее количество услуг большему числу пользователей. В обычном режиме работы содержимое буферов время от времени сбрасывается на диски. Это особый системный процесс, не связан- ный непосредственно с какими бы то ни было операциями чтения или записи в пользовательских процессах. Процесс называется "синхронизация". Помимо записи содержимого дисковых буферов он обеспечивает также запись суперблоков на диск. Для записи на диск суперблоков, измененных описателей файлов и содержимого буферов можно воспользоваться командой sync. Следует заметить, однако, что выполнение этой команды означает лишь, что перепись данных запланирована, но не обязательно выполнена. Поэтому мно- гие вводят эту команду дважды подряд, чтобы она сработала на- верняка. Время поиска Время, которое система затрачивает на поиск и чтение файла, оп- ределяется двумя характеристиками: размерами каталогов, в которых производится поиск размером самого файла Как уже говорилось выше, при поиске открываемого файла система UNIX выполняет линейный поиск во всех каталогах, перечисленных в маршрутном имени. Время поиска можно сократить двумя способа- ми: 1. Число элементов каталога должно быть невелико. Каталог сох- раняет свой максимальный размер, если только он не был сжат командой dcopy(1M). Если Ваш каталог содержит более 640 эле- ментов, то он достиг предела, за которым уже применяется косвенная адресация. 2. Перемещайте имена подкаталогов в начало каталога. Для этого в утилите dcopy(1M) предусмотрена специальная опция. Если имена подкаталогов расположены в начале каталога, то поиск занимает значительно меньше времени. Большие файлы читаются медленнее, из-за того что приходится проходить через цепочки косвенной или двойной косвенной адреса- ции. Дыры в файлах Если файл создается не вручную, средствами редактора, а ка- кой-либо программой, то программа, вообще говоря, может произ- вести запись в позицию файла, отстоящую на несколько блоков от позиции, в которую была произведена предыдущая запись. Допус- тим, программа записала блоки 1 и 2 файла. Эти блоки указаны в описателе файла. Если теперь программа перейдет сразу к 5-му блоку и запишет в него данные, то 5-й указатель адреса в описа- теле файла будет содержать адрес реального блока, в то время как 3-й и 4-й указатели останутся нулевыми, т. е. ни на что не будут указывать. В этом случае мы говорим, что в файле имеется дыра. В принципе в этом нет ничего страшного; файлу принадлежат лишь те блоки, в которые была произведена запись. Во время ре- организации файла (например, при помощи команды dcopy(1М)) под 3-й и 4-й блоки файла будут отведены реальные блоки диска; их адреса будут записаны в описатель файла, блоки будут изъяты из списка свободных блоков и заполнены нулями. Заключение В этом разделе мы попытались дать представление о том, как опе- рационная система UNIX работает с файловыми системами. Понимая, что и как происходит при функционировании файловой системы, вы сможете яснее осознать, какие действия необходимы для поддержа- ния ее целостности и работоспособности. ОБСЛУЖИВАНИЕ ФАЙЛОВОЙ СИСТЕМЫ Создание файловой системы и открытие доступа к ней После того как диск отформатирован, и выявлены его дефектные блоки (alltrack(1M)), следующий шаг - определение файловой сис- темы. Для этой цели служит команда mkfs(1М). Для определения файловой системы на дискете или кассетной ленте можно восполь- зоваться командой sysadm makefsys(1). Команда mkfs Команда mkfs имеет два формата: mkfs специальный_файл число_блоков [:число-описателей] [промежу- ток число_блоков_на_цилиндре] mkfs специальный_файл прототип [промежуток число_блоков_на_ци- линдре] Заметим, что ни в одном из форматов не предусмотрено задание имени файловой системы. Оно определяется именем специального файла устройства, на котором она будет размещена. Специальный файл устройства обычно находится в каталоге /dev и связан с идентификацией контроллера и номеров (старшим и младшим) тома для физического устройства. В первом формате единственная дополнительная информация, кото- рая обязательно должна присутствовать - это число блоков по 1024 байт, отводимых под файловую систему. Второй формат коман- ды позволяет включить эту информацию в файл-прототип, в котором также может быть определена структура каталогов и файлов новой файловой системы, и он также позволяет читать содержимое файлов существующей файловой системы. В обоих форматах предусмотрено задание величины промежутка меж- ду записями и числа блоков на цилиндре. Если эта информация в командной строке не указана, то берутся подразумеваемые значе- ния. В первом формате, хотя и требуется указание числа блоков, но число описателей файлов можно опустить. Если число блоков не указано, то по умолчанию берется один описатель на каждые четы- ре логических блока. Если Вы используете первый формат команды mkfs, то файловая система создается с одним каталогом. Если Вы используете файл- прототип, то в него может быть включена информация, по которой mkfs построит и инициализирует определенную структуру каталогов и файлов файловой системы. Формат файла-прототипа приводится в описании команды mkfs(1М) в Справочнике администратора. Заме- тим, что в команде sysadm makefsys не предусмотрено использова- ние файла-прототипа. Установление соответствия между именем устройства и именем фай- ловой системы Обычно файловую систему называют по имени верхнего каталога ее иерархической структуры. Файловая система на рис. 5-2, в начале этой главы, называется /usr. Аналогично, корневая файловая сис- тема root называется так потому, что ее верхний каталог имеет имя "root" (в системе UNIX принято обозначать его наклонной чертой (/)). Но выше мы видели, что при создании файловой сис- темы единственное имя, указываемое в командной строке (помимо имени файла-прототипа, если применяется второй формат) - это имя специального устройства. Существует два способа связать имя файловой системы с именем ка- талога. Первый, наиболее явный способ - команда labelit(1М). Эта ко- манда устанавливает связь между специальным файлом устройства и именем файловой системы, которое в дальнейшем будет указы- ваться при ее монтировании. Она записывает установленное имя файловой системы, т. е. имя ее верхнего каталога, в поле су- перблока. Если команда labelit применяется к смещаемым файло- вым системам, например, на дискетах, то в качестве одного из параметров в командной строке можно указать номер тома. Этот номер также записывается в суперблок, но обычно принято ука- зывать его в наклейке на футляре дискеты или ленты, на кото- рых хранится файловая система. Связь между устройством и файловой системой устанавливает также команда монтирования mount(1M). Если файловая система должна быть доступна для пользователей, то это действие обя- зательно. Монтирование и размонтирование файловых систем Для того чтобы сделать файловую систему доступной для пользова- телей, необходимо дать указание системе UNIX "смонтировать" ее. Монтирование корневой файловой системы всегда выполняется в процессе загрузки. Другие файловые системы также могут монтиро- ваться автоматически при переводе системы в многопользователь- ский режим. Вызов команды mount, которая переводит эти две файловые системы в рабочее состояние, упрятан в shell-процеду- рах запуска системы. Независимо от того, вызывается ли команда mount явно или из процедуры, в результате ее выполнения имя указанного в ней дискового устройства, где находится файловая система, вместе с именем каталога заносится во внутреннюю таб- лицу системы UNIX (называемую таблицей смонтированных файловых систем /etc/mnttab). Например, команда # mount /dev/dsk/sm0s3 /usr2 сообщает системе, что диск /dev/dsk/sm0s3 содержит файловую систему, которая начинается с каталога /usr2 Примечание Команда mount имеет и другие параметры. Подробнее о ней см. в Справочнике администратора. Если Вы попытаетесь при помощи команды cd сделать текущим ката- лог /usr2 до выполнения команды mount, то команда cd завершится сообщением об ошибке. До завершения команды mount система ниче- го не знает о подкаталогах каталога /usr2. Хотя каталог /usr2 имеется (он должен существовать в момент вызова mount), струк- тура его файлов и подкаталогов остается скрытой для системы UNIX до тех пор, пока не выполнится mount. Небольшие файловые системы принято хранить целиком на одной дискете. Дискета вмещает около 800Кб данных. Вы можете опреде- лять файловые системы на дискетах и использовать их либо для сохранения данных, либо непосредственно для работы. Использова- ние дискет непосредственно для работы имеет два недостатка: 1. Доступ к дискете не такой быстрый, как к жесткому диску. 2. Устройство НГМД нельзя использовать для других целей. Чаще всего пользователи предварительно копируют такие файловые системы на жесткий диск. Для того чтобы это сделать, нужно сна- чала смонтировать файловую систему. Пользователь, который пред- полагает работать с файловой системой, вводимой с дискеты, дол- жен завести для этого два каталога: на один из них файловая система будет монтироваться, а другой будет служить ее корневым каталогом. Допустим Вы создали эти два каталога. Пусть каталог для монтирования называется /hk, а корневой каталог - /myfs. Для перевода файловой системы с дискеты на жесткий диск вводит- ся команда # mount /dev /diskette /hk -r (опция -r означает монтирование только на чтение) # cd /hk1 # find . -print | cpio -pdm /myfs (см. описание команд find(1) и cpio(1), где объясняется смысл используемых опций) В команде размонтирования нужно указать только имя специального файла устройства. После того как файловая система скопирована, например, с дискеты, введите команду # umount /dev/diskette для того чтобы освободить НГМД. Чаще всего команда размонтирования выполняется сразу же, прежде других команд работы с файловыми системами. Например, команда fsck(1М) для проверки и исправления и команда dcopy(1М) для ко- пирования и сжатия применяются к размонтированнным файловым системам. Размонтирование файловых систем также является важной составной частью процесса выключения системы. Заключение До сих пор мы рассматривали файловые системы абстрактно. Мы уз- нали кое-что о том, как они создаются, хранятся на дисках, как открыть к ним доступ или, наоборот, удалить из системы. Остав- шаяся часть этой главы посвящена вопросам поддержания работос- пособности активных файловых систем. ПОДДЕРЖКА ФАЙЛОВЫХ СИСТЕМ После того, как файловая система создана, и пользователи полу- чили к ней доступ, необходимо осуществлять постоянный контроль за ее использованием в данной организации. Дальнейшее изложение осложняется тем, что приходится проводить разграничение между файловой системой и ее файлами, а это часто приводит к путани- це. Администратор рассматривает обсуждаемые ниже вопросы прежде всего с точки зрения файловых систем, в то время как пользова- тели склонны мыслить и работать в терминах отдельных файлов. Говоря о деятельности администратора по обеспечению хорошей ра- ботоспособности файловых систем, мы должны быть готовы иметь дело как с индивидуальными файлами пользователей, так и с фай- ловой системой в целом. После того, как файловая система создана и начата ее регулярная эксплуатация на Вашем компьютере, для поддержания на должном уровне качества и надежности ее работы необходимо постоянно проводить определенные работы по ее обслуживанию. Можно выде- лить четыре основных процедуры: проверка корректности файловых систем контроль за использованием дискового пространства сжатие и реорганизация файловых систем сохранение и восстановление файловых систем Разработка принципов организации и обслуживания Как и большинство других аспектов административной деятельности в системе UNIX, организация и обслуживание файловых систем должны опираться на определенные принципы, отвечающие интересам Вашей организации. Невозможно дать каких-либо однозначных реко- мендаций по таким вопросам, как выбор размеров файловых систем, число пользователей файловой системы, способ создания резервной копии, определение промежутков времени, в течение которых поль- зователи могут хранить в системе неактивные файлы, объем диско- вого пространства, отводимого для каждого пользователя. Все эти вопросы могут быть решены лишь применительно к условиям конк- ретной организации. Число пользователей, характер выполняемой ими работы, число файлов, которое им необходимо - все это пере- менные величины, и квалифицированный администратор должен сам определить, как наилучшим образом удовлетворить потребности своей организации. Shell-процедуры для управления файловыми системами После того, как основные принципы выработаны, многие рутинные работы, связанные с обслуживанием файловых систем, можно опи- сать в виде shell-процедур. Например, контроль за использовани- ем дискового пространства может осуществляться shell-процедура- ми, которые производят необходимые проверки, и, при обнаружении исключительных ситуаций, выдают сообщение на консоль. Несколько полезных соображений: Используйте shell-процедуру, выполняемую под управлением про- цесса cron, для подсчета числа свободных блоков и свободных описателей файлов с выдачей сообщений о файловых системах, для которых эти значения оказались ниже определенного миниму- ма. Используйте shell-процедуры для автоматической "чистки" рас- тущих файлов. Используйте shell-процедуры для выдачи сообщений о пользова- телях, занимающих чрезмерное количество дискового пространст- ва. Проверка корректности файловых систем Далее в этой главе имеется специальный раздел, посвященный ути- лите fsck(1М) проверки файловых систем. Тем не менее, мы сочли нужным упомянуть ее здесь, поскольку проверка файловых систем - это основа всей деятельности администратора по поддержанию их нормального состояния. Контроль за использованием дискового пространства Контроль за уровнем занятого пространятва в файловых системах необходим по следующим причинам. Если не следить за этим регулярно, то процент занятого прост- ранства на диске будет постоянно возрастать до полного его исчерпания. Когда свободного пространства на диске не остается, процессы либо вообще перестают выполняться, либо выполняются очень медленно, а система тратит время на выдачу сообщений о том, что пространство на диске исчерпано. Пользователи имеют обыкновение забывать о файлах, которые им больше не нужны, и такие файлы, оставаясь на диске, продолжа- ют занимать пространство. Некоторые файлы постоянно растут вследствие нормальной работы системы. В обязанности администратора входит следить за их размером и вовремя удалять ненужную информацию. В некоторых каталогах, таких как /tmp, в течение дня накапли- ваются файлы. При запуске системы в /tmp должно быть доста- точное число свободных блоков для хранения временных файлов до выключения системы (shutdown(1M)). Существуют четыре вида работ по поддержанию порядка на диске 1. Контроль за процентом занятого дискового пространства. 2. Контроль за размерами растущих файлов и каталогов. 3. Выявление и удаление неиспользуемых файлов. 4. Выявление пользователей, потребляющих наибольшие объемы пространства. Перечисленные виды работ описаны в первой части в главе P5 ("Процедуры обслуживания файловых систем"). В процедурах эти работы выполняются при помощи подкоманд из меню администратора. В этом разделе содержатся дополнения к процедурам части 1 и описываются некоторые системные команды, которыми Вы можете пользоваться. Контроль за процентом занятого дискового пространства Контроль за использованием дискового пространства можно произ- водить в любое время, для того чтобы проверить, насколько близ- ко к предельному уровню находится Ваша система. До тех пор пока Вы не выработали для этого какого-либо подходящего постоянного распорядка, разумно выполнять проверку ежедневно. В данном при- мере используется команда df(1М): $ df -t Опция -t означает выдачу не только числа свободных блоков и описателей файлов. Если имена файловых систем не перечислены, то выдается информация обо всех смонтированных файловых систе- мах. Контроль за растущими файлами и каталогами Почти в каждой системе, если она ежедневно используется, есть несколько файлов, которые растут в результате нормальной работы системы: ~-------------------------------------------------------------- │ Файл Назначение │ ----------------------- -------------------------------------- │/etc/wtmp │записи обо всех фактах входа в систему│ │ │ │ │/usr/adm/sulog │записи о вызовах команды su │ │ │ │ │/usr/lib/cron/log │записи обо всех действиях, предприня- │ │ │тых процессом /etc/cron │ │ │ │ │/usr/lib/help/HELPLOG| │действия, предпринятые процессом │ │ │ /usr/bin/help │ │ │ │ │/usr/lib/spell/spellist│ слова, не распознанные утилитой │ │ │ spell(1) │ ----------------------- -------------------------------------- Частота, с которой следует проверять содержимое растущих фай- лов, зависит от того, насколько активно используется Ваша сис- тема и насколько остра для Вас проблема свободного пространства на дисках. Техника поддержания разумных размеров таких файлов состоит в сочетании команд tail(1) и mv(1): $ tail -50 /usr/adm/sulog > /tmp/sulog $ mv /tmp/sulog /usr/adm/sulog Эта последовательность команд сначала помещает последние 50 строк файла /usr/adm/sulog во временный файл, а затем перемеща- ет содержимое этого файла в /usr/adm/sulog; в результате в фай- ле остается лишь 50 последних записей. Выявление и удаление неиспользуемых файлов Одна из работ по чистке перегруженных файловых систем состоит в выявлении и удалении файлов, которые в последнее время не ис- пользовались. Команды, при помощи которых это делается, будут приведены ниже. Основные же вопросы, которые Вы должны для себя решить, следующие: По истечении какого срока неиспользуемый файл становится кан- дидатом на удаление? Следует ли предупреждать пользователей о наличии устаревших файлов, которые вот-вот будут удалены из системы? Следует ли постоянно удалять устаревшие файлы или сохранять их в архиве? Команда find(1) позволяет найти все файлы, которые не использо- вались в последнее время. Эта команда просматривает каталог, указанный в командной строке, выбирает в нем имена файлов, удовлетворяющих заданным условиям, и применяет к ним указанное действие. Предлагаемый пример демонстрирует полный спектр воз- можностей команды find: $ find /usr -type f -mtime +60 -print > /tmp/deadfiles & Cмысл параметров в этом примере следующий: /usr Маршрутное имя каталога, в котором осуществля- ется поиск. Предполагается, что файловые систе- мы на Вашей машине организованы так, что неак- тивные файлы пользователей редко обнаруживаются в корневой файловой системе. -type Указывает, что поиск нужно производить только среди обычных файлов, игнорируя специальные файлы, каталоги и каналы. -mtime +60 Эта опция указывает, что Вас интересуют только файлы, которые не менялись в течение последних 60 дней. -print Указывает, что при обнаружении файла, удовлет- воряющего условиям -type и -mtime, его имя должно быть распечатано. > /tmp/deadfiles & Переадресация вывода во временный файл и указа- ние о том, что процесс вывода должен выполнять- ся как фоновый. Это весьма разумная предосто- рожность, если опыт подсказывает Вам, что объем вывода будет значительным. Для получения аналогичной информации можно воспользоваться так- же командой sysadm fileage (1), (см. процедуру 5.3). Выявление пользователей, занимающих большой объем дискового пространства В данном случае также важен не выбор команд, позволяющих уз- нать, кто занимает слишком много пространства на диске, а выбор основных принципов для принятия решений о необходимых ограниче- ниях. Следующие вопросы являются ключевыми: Какой объем дискового пространства на одного пользователя следует считать разумным для Вашей системы? Если пользователь перерасходовал норму, скажем, на 25%, то не может ли это означать, что его работа действительно требует повышенного объема памяти? Ощущается ли в Вашей системе в целом недостаток дискового пространства? Не следует ли пересмотреть существующие нормы? Полезную информацию можно получить при помощи команд du(1) и все той же find(1). Команда du выдает значение счетчиков блоков для файлов и ката- логов, перечисленных в командной строке. Например: $ du /usr выводит значения счетчиков блоков для всех каталогов файловой системы /usr. При помощи опций можно отрегулировать форму выда- чи желаемым образом. Например, можно для каждого входа выпол- нить команду du -s, чтобы проконтролировать объем памяти, зани- маемый каждым пользователем. Команду find можно применять для выявления файлов, размер кото- рых превышает заданный предел: $ find /usr -size +10 -print В данном случае будут выданы маршрутные имена всех файлов из каталогов файловой системы /usr, размер которых превышает 10 блоков (по 512 байт). Аналогичную информацию можно получить при помощи команды sysadm filesize(1), см. процедуру 5.3. Сохранение и восстановление файловых систем Очень часто значимость разработки и четкого выполнения плана работ по сохранению файловых систем не осознается в полной мере до тех пор, пока не возникла ситуация, когда данные утрачены и восстановить их невозможно. Сохранение файловых систем требует времени. Еще больше времени займут попытки восстановить пропав- шие или разрушенные данные с черновиков и распечаток или нау- гад. Ценность эффективного плана сохранения файловых систем заключается в том, что Вы получаете возможность легко восста- навливать утраченные или разрушенные данные. Для выполнения полных и добавочных сохранений файловых систем на дискеты или ленты предусмотрены специальные разделы в меню администратора (см. процедуру 5.4). Копирование отдельных ката- логов и файлов на дискету или ленту можно произвести командой sysadm store(1) или командой find(1) в сочетании с cpio(1). Пе- реписать каталоги и файлы обратно на жесткий диск можно при по- мощи sysadm restore(1) или команды cpio с соответствующими па- раметрами. Другой способ сохранения информации в системе UNIX - это копи- рование файловых систем по высокоскоростной линии передачи дан- ных на компьютер с большим объемом стабильной памяти. Пропуск- ная способность линии и объем стабильной памяти должны быть достаточны для регулярного выполнения процедуры копирования. Ваш план сохранения может включать все эти методы, или только некоторые из них. Главное, что Вы должны сделать - это оценить потребности сохранения файловых систем на Вашем компьютере и выработать соответствующий план. По мере изменения характера работы в системе план необходимо пересматривать. Имеется специ- альное системное средство в помощь администратору, которое поз- воляет установить контроль за выполнением расписания работ по сохранению файловых систем; оно описано ниже в этой главе в разделе "Напоминания о плановых сохранениях файловых систем". Полное сохранение Процедура полного копирования, которая реализуется специальными административными средствами, производит копирование каталогов и файлов указанной смонтированной файловой системы на дискеты или ленту. Единая стратегия сохранения файловых систем формиру- ется на основе сочетания полных и дополнительных резервных ко- пий. Полные копии можно выполнять и без промежуточных дополни- тельных копий, но дополнительным копиям должны предшествовать хотя бы одна полная, которая составляет их базу. Если сохранение идет на дискеты, то Вы должны иметь наготове достаточное их число для записи всех сохраняемых каталогов и файлов. Если сохранение идет на ленту, то следует иметь в виду, что лента может иметь объем от 45Мб до 155Мб в зависимости от типа имеющегося у Вас оборудования. Время сохранения на ленты су- щественно меньше, чем на дискеты; запись 45-мегабайтной ленты идет около 20 мин. Дополнительные копии Процедура дополнительного копирования, производимая специальны- ми средствами администратора, копирует файлы, которые измени- лись с момента последнего сохранения, на дискеты или ленту. Примечание При дополнительном сохранении копируются не все изме- нившиеся каталоги и файлы. В каталоге /etc/save.d/ex- cept специфицируются файлы и каталоги, которые НЕ БУДУТ копироваться. Типичный пример файла /etc/save.d/except изображен на рис. 5-7. Дополнительная резервная копия создается быстрее, чем полная, по той очевидной причине, что выбираются только файлы, изменив- шиеся с момента последнего (полного или дополнительного) сохра- нения. Тем не менее, дополнительные сохранения хотя и позволя- ют сберечь время, но могут потребовать значительного числа до- полнительных дискет; а время, затрачиваемое на восстановление с дополнительных сохранений, может перекрыть всю достигнутую эко- номию. Рис. 5-7. Пример файла /etc/save.d/except # Patterns of filenames to be excluded from saving by savefiles. # These are ed(1) regular expressions. /.news_time$ /.yesterday$ /a.out$ /core$ /dead.answer$ /dead.letter$ /ed.hup$ /nohup.out$ /tmp/ ^/etc/mnttab$ ^/ets/save.d/timestamp/ ^/etc/utmp$ ^/etc/wtmp$ ^/usr/adm/ ^/usr/at/ ^/usr/crash/ ^/usr/dict/ ^/usr/games/ ^/usr/learn/ ^/usr/news/ ^/usr/spool/ ^/usr/tmp Ключевой вопрос в формировании стратегии сохранений - это опре- деление момента, когда следует сделать очередную полную копиию. Вот несколько соображений на этот счет. Если для копирования используются дискеты, то сколько дискет Вы хотите выделить для дополнительных копий? Пример для ил- люстрации: если дополнительные копии делаются ежедневно, а полные - раз в месяц, то на сохранение файловой системы в 20Мбайт при активном ее использовании уйдет более 40 дискет. Сколько времени Вы хотите выделить для создания полной копии? Чем меньше дискет отводится для поддержания библиотеки ре- зервных копий, тем чаще придется делать полные копии. Полные копии могут потребовать в 8-10 раз больше времени, чем одна дополнительная. Сколько времени Вы готовы затратить на восстановление всей файловой системы с дискет? Для полного восстановления файло- вой системы необходимо прочитать дискеты с одной полной копии и со всех дополнительных. (Это весьма сложный процесс - в идеале Вам никогда не придется восстанавливать всю файловую систему полностью.) Какова интенсивность модификации рассматриваемой файловой системы? Затрагивают ли изменения всю файловую систему или только небольшой процент файлов? Если изменения происходят часто и охватывают большую часть файловой системы, то разум- нее, по-видимому, запланировать более частые полные сохране- ния. Если изменения концентрируются на небольшом числе фай- лов, то возможно, следует включить в общий план сохранения ряд выборочных резервных копий. Выборочные резервные копии Отдельные каталоги и файлы можно быстро переписать на одну дис- кету при помощи команд find(1) и cpio(1). Объем данных, копиру- емых на дискету, должен быть не более 800 блоков (по 1024 байт). Прежде чем копировать выбранные каталоги или файлы, про- верьте общее число блоков в них. Сочетание команд find и cpio можно использовать также для сох- ранения каталогов и файлов на ленте. На ленте, в зависимости от типа Вашего оборудования, помещается от 45 000 до 150 000 бло- ков. Напоминания о плановых сохранениях файловых систем Специальный раздел в меню администратора FILE MANAGEMENT дает возможность предусмотреть напоминания для самого себя о плано- вых сохранениях файловых систем. Средство подготовки напомина- ний позволяет делать две вещи: 1. Предусмотреть выдачу напоминаний, т. е. дать системе указа- ние типа: "Если машина выключается в такое-то время, то пош- ли на консоль сообщение о том, что нужно сохранить такие-то и такие-то файловые системы." 2. Предусмотреть проверку напоминаний, т. е. дать системе ука- зание типа: "Если подошло указанное время, а машина не была выключена, то просмотри файл напоминаний и выдай сообщения, которые были бы выданы в случае выключения системы". Данный механизм не освобождает Вас от необходимости разработки рационального распорядка сохранений. Он лишь напоминает Вам о запланированных Вами мероприятиях. О том, как применяется меха- низм напоминаний, подробно рассказано в процедуре 5.4. Для тех же целей можно воспользоваться услугами процесса cron(1M), пре- дусмотрев выдачу соответствующих напоминаний в файле cron- tab(1). Восстановление файловой системы с сохраненных копий С сохраненных копий файловой системы можно восстанавливать от- дельные файлы, структуру каталогов или всю совокупность файлов. Для любого из трех типов восстановления можно применить команду sysadm restore(1) (см. примеры в процедуре 5.4). Восстановление можно провести и командами системы UNIX: сделай- те текущим нужный каталог и выполните $ cpio -icdumv < /dev/rdiskette если ввод идет с НГМД. Дискеты должны быть те самые, на которые было сделано сохранение, и вставлять их нужно в том же порядке, как и при сохранении (см. обсуждение этого вопроса в разделе "Выборочные резервные копии"). ВОЗМОЖНЫЕ НЕПОЛАДКИ В ФАЙЛОВОЙ СИСТЕМЕ Причины, которые могут приводить к порче файловой системы, свя- заны в основном с ошибками при записи указателей или счетчиков на внешние носители. Это может произойти в результате аппаратных сбоев аварийного завершения программ ошибок пользователя или в результате комбинации аппаратных и программных ошибок и неверного выполнения процедур. Аппаратные сбои Эффективных способов, позволяющих предсказать когда случится аппаратный сбой, не существует. Лучшее, что Вы можете сделать - это четко следовать рекомендованным процедурам диагностики и ухода. На большинстве компьютеров имеется утилита, которая от- мечает дефектные блоки и при попытке записи в них обеспечивает использование вместо них блоков из областей замещения (см. гл.4 "Обслуживание дисков и лент"). Аварийное завершение программ Ошибки, которые привели к аварийному завершению программы, мо- гут быть связаны с потерей каких-то данных. В целом, здесь трудно проводить обобщения, поскольку спектр возможностей чрез- вычайно широк. Пожалуй единственный разумный совет - подвергай- те программы исчерпывающему тестированию, прежде чем приступ- ить к их применению для обработки ценной информации. Ошибки пользователя Как ни прискорбно это признавать, но, пожалуй, основные источ- ники порчи системы - ошибки пользователей. Приведем четыре пра- вила, которым должны следовать все, кто занимается обслуживани- ем файловых систем. 1. ВСЕГДА проверяйте файловую систему, прежде чем смонтировать ее. Ничто так не осложняет очистки и исправления испорченной файловой системы, как допуск к работе с ней после того, как она была испорчена. 2. НИКОГДА не удаляйте файловую систему физически, не размонти- ровав ее. 3. ВСЕГДА применяйте команду sync перед выключением системы и перед размонтированием файловой системы. 4. НИКОГДА физически не защищайте от записи монтируемую файло- вую систему, если только Вы не собираетесь смонтировать ее только на чтение. Непредсказуемый характер возможных повреждений файловых систем подчеркивает важность установления и соблюдения практики регу- лярных сохранений. Это наиболее эффективная форма защиты от по- терь данных. ГЛАВА 5 УПРАВЛЕНИЕ ФАЙЛОВОЙ СИСТЕМОЙ КАК ПРОВЕРИТЬ КОРРЕКТНОСТЬ ФАЙЛОВОЙ СИСТЕМЫ При запуске операционной системы UNIX ВСЕГДА проверяйте коррек- тность файловых систем. На большинстве машин, работающих в сис- теме UNIX, эта проверка выполняется автоматически, как часть процесса перехода в многопользовательский режим. Если Вы рабо- таете в однопользовательском режиме, то ВСЕГДА проверяйте фай- ловые системы после процедуры загрузки; Вы ОБЯЗАНЫ выполнить проверку файловой системы, если в процессе запуска получено со- общение "File system corrupted" ("Файловая система испорчена")! Можно воспользоваться командой fsstat(1), которая для каждой файловой системы на жестком диске выдает код, показывающий, нужно ли запустить программу fsck(1M) для проверки корректности и исправления. Эту же команду, или sysadm checkfsys(1) следует использовать и для проверки тех файловых систем, которые не монтируются авто- матически в процессе включения системы. Если обнаружены некор- ректности, то до монтирования файловой системы можно предпри- нять действия по ее исправлению. В оставшейся части этого раз- дела мы познакомим Вас с возможными опциями в командной строке утилиты fsck, с типами проверок, которые она производит на каж- дой фазе, и с действиями по исправлению, которые она может Вам предложить. Следует с самого начала сказать, что повреждения файловых сис- тем, хотя они и связаны с серьезными неприятностями, случаются не так уж часто. В большинстве случаев в результате проверки будет выдано сообщение о том, что все в порядке. Мы уделили здесь столько внимания необходимости проверок файловых систем, потому что необнаруженная вовремя ошибка может в конце концов привести к значительным потерям данных. Утилита fsck Утилита проверки файловых систем (fsck) - это интерактивная программа для проверки и исправления файловых систем. В проце- дуре 5.3 показан способ выполнения fsck при помощи команды sysadm checkfsys. Для проверки корректности программа fsck ис- пользует информацию, содержащуюся в самой файловой системе. Ес- ли обнаружена некорректность, то выдается сообщение о характере неисправности. По Вашему выбору утилита fsck может исправить ее или не исправлять. Вы можете при выполнении fsck проигнориро- вать неисправность, если, например, сочтете, что проблема слиш- ком серьезна, и Вы либо позже внесете исправления самостоятель- но, при помощи утилиты fsdb(1M), либо решите вернуться к преды- дущей версии файловой системы. Ни к чему хорошему не приведет игнорирование ошибок, если Вы сами после этого ничего не сдела- ете для их исправления. Некорректности файловых систем не исп- равляются сами собой. Они лишь усугубляются, если их игнориро- вать. Команда fsck Команда fsck служит для проверки файловых систем и исправления обнаруженных некорректностей. Проверяемая файловая система, ес- ли она не корневая, должна быть размонтирована. Корневую файло- вую систему можно проверять, только когда на машине установлен уровень выполнения S, и в это время не выполняются никакие дру- гие работы. Общий формат команды fsck: fsck [-y][-n][-b][-sX][-SX][-tфайл][-q][-D][-f][сфустройство] Опции команды fsck: -y Означает ответ "да" ("y") на все вопросы утилиты. Это стандартный выбор, если команда находится в shell-процедуре. Эта опция обычно заставляет fsck исправлять все ошибки. -n Означает ответ "нет" ("n") на все вопросы. Утилита fsck не будет производить запись в файловую систему. -b Перезагрузить систему, если проверяется корневая файловая система (/) и утилита fsck произвела в ней какие-либо исправления. Если обнаружены лишь незна- чительные, поправимые ошибки, то файловая система перемонтируется. -sX Означает безусловное переконструирование списка свободных блоков. После переконструирования списка свободных блоков система должна быть перезагружена, для того чтобы копия суперблока в оперативной памя- ти также была изменена (см. опцию -b). Аргумент Х задает число блоков на цилиндре и число пропускае- мых блоков (промежуток между записями). По умолча- нию берутся значения, специфицированные при созда- нии файловой системы. -SX Означает условное переконструирование списка сво- бодных блоков только в случае, если в файловой сис- теме обнаружены неисправности. Формат аргумента Х такой же, как описано выше для опции -s. -tфайл Эта опция задает временный файл на случай, если для проверки файловой системы потребуется дополнитель- ная память. Если опция не задана, то процесс запра- шивает имя файла, когда ему требуется дополнитель- ная память. -q Означает "молчаливый" способ выполнения проверки. Выходные сообщения процесса подавляются. -D Проверка каталогов на наличие плохих блоков. Эта опция используется для проверки файловых систем после аварийного отказа. -f Быстрый вариант проверки файловой системы. При этом выполняется только фаза 1 (проверка блоков и разме- ров) и фаза 5 (проверка списка свободных блоков). Фаза 6 (переконструирование списка свободных бло- ков) выполняется только в случае необходимости. сфустройство Имя специального файла устройства, связанного с файловой системой. Если имя не указано, то fsck проверяет все файловые системы, перечисленные в /etc/checklist. Пример использования команды В приведенной ниже командной строке показано применение fsck для проверки корневой файловой системы. Опции не заданы. Выдачи системы означают, что ошибок не обнаружено. Команда выполняется по фазам; некоторые фазы выполняются, только если они необходи- мы или в командной строке задана соответствующая опция. По окончании каждой фазы выдается сообщение. В конце каждой фазы выдается сводная информация о числе описателей файлов, блоков и свободных блоков в файловой системе. # fsck /dev/dsk/hd0s0 /dev/dsk/hd0s0 File System: root Volume: root ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Free List 289 files 6522 blocks 3220 free # Компоненты файловой системы, проверяемые утилитой fsck Прежде чем приступить к обсуждению отдельных фаз утилиты fsck и сообщений, которые могут быть выданы на каждой фазе, необходимо дать общее представление о компонентах файловой системы и типах проверок, применяемых к этим компонентам. СУПЕРБЛОК Суперблок - наиболее уязвимое место файловой системы, поскольку всякое изменение какого-либо блока отражается в суперблоке. Ес- ли в момент остановки ЦП последняя команда, связанная с записью в файловую систему, была не sync, то суперблок почти наверняка будет испорчен. При проверке суперблока анализируется размер файловой системы размер списка описателей файлов список свободных блоков счетчик свободных блоков счетчик свободных описателей файлов РАЗМЕР ФАЙЛОВОЙ СИСТЕМЫ И РАЗМЕР СПИСКА ОПИСАТЕЛЕЙ ФАЙЛОВ Общий размер файловой системы должен быть больше, чем число блоков, отведенных под суперблок, плюс число блоков, занятых списком описателей файлов. Число описателей файлов должно быть меньше, чем 65000. Невозможно проверить, верны ли эти размеры, тем не менее, fsck может проверить, находятся ли они в приемле- мых пределах. Все остальные проверки файловой системы зависят от разумности этих значений. СПИСОК СВОБОДНЫХ БЛОКОВ Список свободных блоков начинается в суперблоке и продолжается через свободные блоки файловой системы. Для каждого свободного блока можно выполнить проверки: счетчик списка вне диапазона номера блоков вне диапазона занятый блок в списке свободных блоков Проверяется также, все ли блоки файловой системы найдены. Ссылка на первый блок списка свободных блоков находится в су- перблоке. Программа fsck проверяет, что значение счетчика неот- рицательно и не более 50. Проверяется также, принадлежит ли но- мер каждого блока диапазону значений между номерами первого и последнего блоков файловой системы. Каждый номер сравнивается с номерами блоков из списка занятых блоков. Если указатель следу- ющего блока в списке свободных блоков не равен 0, то прочитыва- ется следующий блок и процесс повторяется. После того, как все блоки учтены, проверяется, совпадает ли число блоков в списке свободных блоков плюс число блоков, на которые есть указатели из описателей файлов, с общим числом блоков файловой системы. Если обнаружено несовпадение, то fsck может построить заново список свободных блоков, включив в него все незанятые блоки. СЧЕТЧИК СВОБОДНЫХ БЛОКОВ В суперблоке имеется счетчик свободных блоков файловой системы. Программа fsck сравнивает значение счетчика с числом фактически обнаруженных свободных блоков. Если величины не совпадают, то fsck может заменить значение счетчика в суперблоке фактическим числом свободных блоков. СЧЕТЧИК СВОБОДНЫХ ОПИСАТЕЛЕЙ ФАЙЛОВ Суперблок содержит счетчик свободных описателей файлов в файло- вой системе. Программа fsck сравнивает его с числом фактически обнаруженных в файловой системе свободных описателей файлов. Если значения не совпадают, то fsck может заменить значение счетчика в суперблоке фактическим числом свободных описателей файлов. ОПИСАТЕЛИ ФАЙЛОВ Список описателей файлов проверяется последовательно, начиная с файла номер 1 (описателя файла с номером 0 не существует). Ана- лиз корректности описателя файла включает следующие проверки: формат и тип счетчик ссылок дважды занятые блоки некорректные номера блоков поле размера в описателе файла ФОРМАТ И ТИП Каждый описатель файла содержит слово режима. Это слово содер- жит описание типа и состояния описателя. Описатель файла может иметь один из типов: обычный каталог блочный специальный символьный специальный fifo (именованный канал) Если описатель файла не принадлежит ни к одному из этих типов. то он считается ошибочным. Описатель может находиться в одном из трех состояний: свободен, занят, частично занят. Третье сос- тояние означает, что описатель имеет неверный формат. Описатель может оказаться в таком состоянии, например, если при записи в него имел место аппаратный сбой. Единственное действие по исп- равлению, которое может предпринять fsck в этом случае - очист- ка некорректного описателя файла. СЧЕТЧИК ССЫЛОК Каждый описатель файла содержит счетчик числа элементов катало- га, ссылающихся на него. Программа fsck проверяет счетчик ссы- лок каждого описателя файла путем исследования всей структуры каталогов, начиная с корневого каталога, и подсчитывает факти- ческое число ссылок для каждого описателя файла. Если счетчик ссылок, хранящийся в описателе файла, не совпадает с фактическим числом ссылок, обнаруженных fsck, то причины это- го могут быть следующие: Значение счетчика в описателе не 0, а фактическое число ссы- лок равно 0. Ни один из элементов каталогов не ссылается на этот файл. Программа fsck может занести "потерянный" файл в каталог lost+found. Значение счетчика в описателе не 0, фактическое число ссылок также не 0, но значения не совпадают. Возможно, элемент каталога был удален, а соответствующее из- менение в описатель файла не было внесено. Программа fsck может записать в счетчик в описателе файла фактическое число обнаруженных ссылок. ДВАЖДЫ ЗАНЯТЫЕ БЛОКИ Описатель файла содержит список блоков, занимаемых данным фай- лом. Программа fsck сравнивает номер каждого блока с номерами блоков в списке занятых блоков. Если номер блока, на который указывает описатель файла, обнаружен в списке занятых блоков, то он заносится в список дважды занятых блоков. Если номер бло- ка не найден в списке занятых блоков, то он туда включается. Если список дважды занятых блоков не пуст, то fsck повторно просматривает список описателей файлов, чтобы выявить все опи- сатели файлов, которые указывают на каждый дважды занятый блок. Однако, это не дает достаточно информации, чтобы определить, какой из описателей ошибочен; чаще всего бывает верен описатель файла, последнее изменение которого было произведено позднее. Такая ситуация могла возникнуть при использовании файловых сис- тем, содержащих блоки, на которые ссылается и список свободных блоков, и другие части файловой системы. Если число дважды занятых блоков велико, то это может быть выз- вано тем, что блок косвенной адресации оказался незаписанным в файловую систему. Программа fsck предлагает пользователю очис- тить оба описателя файлов. НЕКОРРЕКТНЫЕ НОМЕРА БЛОКОВ Программа fsck проверяет, принадлежит ли номер каждого из бло- ков, на которые указывает описатель файла, диапазону значений между номерами первого и последнего блоков файловой системы. Если номер блока вне этого диапазона, то он считается некор- ректным. Если в описателе файла обнаружено много некорректных номеров блоков, то это могло быть вызвано тем, что блок косвенной адре- сации оказался незаписанным в файловую систему. Программа fsck предлагает пользователю очистить данный описатель файла. Примечание Не следует путать два понятия: некорректный номер блока не то же самое, что дефектный (т. е. нечитаемый) блок диска. ПОЛЕ РАЗМЕРА В ОПИСАТЕЛЕ ФАЙЛА Описатель файла содержит поле размера длиною в 32 бита (4 бай- та). Размер - это число байт данных в файле, ассоциированном с описателем. Описатель файла-каталога отличается особой комбина- цией битов в слове режима. Размер файла-каталога должен быть кратен 16, поскольку элемент каталога занимает 16 байт (2 байта - номер описателя файла, 14 байт - имя файла или подкаталога). Если размер каталога не кратен 16, то fsck выдает предупрежде- ние об этом. Невозможно получить достаточно информации для исп- равления размера, поэтому в данном случае кроме выдачи предуп- реждения ничего не делается. Для обычных файлов можно дать грубую оценку корректности поля размера, если вычислить, сколько блоков должно быть отведено для хранения файла такого размера, и сравнить полученное значе- ние с фактическим числом блоков, на которые указывает описатель файла. АЛГОРИТМ Программа fsck вычисляет количество блоков, которое должен за- нимать файл, путем деления размера файла на 512 (число байт в блоке) с последующим округлением, затем добавляется по единице на каждый блок косвенной адресации, связанный с описателем. Если фактическое число блоков не совпало с вычисленным, то fsck выдает предупреждение о возможной ошибке в размере файла. Это всего лишь предупреждение, поскольку логические блоки могут создаваться в произвольном порядке, и система не обязательно заполняет их все. Для того чтобы проверить, действительно ли файл некорректен, требуется анализ его содержимого (см. выше в этой главе раздел "Дыры в файлах"). БЛОКИ КОСВЕННОЙ АДРЕСАЦИИ Блоки косвенной адресации принадлежат описателю файла. Поэтому ошибка в блоке косвенной адресации непосредственно затрагивает описатель, к которому блок относится. Могут быть выявлены сле- дующие некорректности: Блок уже занят другим описателем. Номера блоков вне диапазона файловой системы. Проверки, описанные выше в разделах "Дважды занятые блоки" и "Некорректные номера файлов", проводятся для блоков косвенной адресации так же, как и для блоков данных, на которые непос- редственно указывает описатель файла. БЛОКИ ДАННЫХ КАТАЛОГОВ Каталоги отличаются от обычных файлов значением слова режима в описателе файла. Блоки данных, относящиеся к каталогу, содержат элементы каталога. Для данных каталогов могут проводится следующие проверки: номер описателя файла относится к свободному описателю файла номер описателя файла больше, чем общее число описателей в файловой системе неверные номера описателей файлов для каталогов "." и ".." каталог не связан с файловой системой ЭЛЕМЕНТ КАТАЛОГА УКАЗЫВАЕТ НА СВОБОДНЫЙ ОПИСАТЕЛЬ ФАЙЛА Если номер описателя в элементе каталога относится к свободному описателю файла, то fsck может удалить этот элемент каталога. Такая ситуация может возникнуть, если блоки данных, содержащие элементы каталога, были модифицированы и записаны на диск, а описатель файла еще не был записан. НЕКОРРЕКТНЫЙ НОМЕР ОПИСАТЕЛЯ Если номер описателя в элементе каталога находится за пределами списка, то fsck может удалить этот элемент каталога. Подобная ситуация возникает, если в блок данных каталога была записана ошибочная информация. НЕВЕРНЫЕ ЭЛЕМЕНТЫ "." И ".." Номер описателя каталога "." должен быть первым элементом в блоке данных каталога. Его значение должно равняться номеру описателя проверяемого файла-каталога. Номер описателя файла для ".." должен быть вторым элеменом в блоке данных каталога. Его значение должно равняться номеру описателя надкаталога данного каталога (или номеру описателя самого каталога, если это корневой каталог). Если номера описа- телей для "." и ".." неверны, то fsck может заменить их пра- вильными номерами. ОТСОЕДИНИВШИЕСЯ КАТАЛОГИ Программа fsck проверяет связность файловой системы. Если обна- ружены отсоединившиеся каталоги, то fsck вновь подключает их к файловой системе, помещая в каталог lost+found. Подобная ситуа- ция может возникнуть, если описатели файлов были записаны в файловую систему, а соответсвующие блоки данных - нет. Если файл подключается к каталогу lost+found, то владельцу файла должно быть об этом сообщено. БЛОКИ ДАННЫХ ОБЫЧНЫХ ФАЙЛОВ В блоках данных, относящихся к обычным файлам, хранится содер- жимое этих файлов. Программа fsck не пытается анализировать корректность содержимого этих блоков. Выполнение fsck Программа fsck выполняется пофазно. Каждая фаза сообщает о най- денных ею ошибках. Если ошибка поправима, то программа спраши- вает, следует ли внести исправления. В этом разделе описаны со- общения, порождаемые на каждой фазе. В сообщениях программы fsck используются следующие сокращения: BLK номер блока DUP дважды занятый блок BAD некорректный номер блока DIR имя каталога MTIME время последней модификации файла UNREF нет ссылки (на блок или описатель файла) В приведенных ниже сообщениях используются также однобуквенные сокращения, которые в реальных сообщениях программы fsck заме- няются конкретными значениями: B номер блока F имя файла I номер описателя файла M режим файла O идентификатор владельца S размер (длина) файла T время последнего изменения X счетчик ссылок или число некорректных номеров, дважды занятых или от- сутствующих блоков или число файлов (в зависимости от контекста) Y исправленное значение счетчика ссылок или число блоков в файловой системе (в зависимости от контекста) ФАЗА ИНИЦИАЛИЗАЦИИ Проверяется синтаксис командной строки. Прежде чем приступить к проверке файловой системы, fsck инициализирует некоторые табли- цы и открывает некоторые файлы. При обнаружении ошибок инициа- лизации fsck заканчивает работу. ОБЩИЕ ОШИБКИ В этой фазе могут быть выданы три сообщения об ошибках. Нес- мотря на то, что программа, казалось бы, предлагает альтернати- ву продолжения, вообще говоря, правильнее рассматривать эти ошибки как фатальные, выйти из программы и попытаться выяснить возможные причины осложнений. CAN NOT SEEK:BLK B(CONTINUE?) Попытка перейти к блоку номер В в файловой системе закон чилась неудачно. Данная ошибка указывает на наличие серь- езных осложнений (возможно, неисправность аппаратуры), которые могут потребовать вмешательства инженерного пер- сонала. CAN NOT READ:BLK B(CONTINUE?) Попытка прочитать блок номер В в файловой системе закон- чилась неудачно. Данная ошибка указывает на наличие серь- езных осложнений (возможно, неисправность аппаратуры), которые могут потребовать вмешательства инженерного пер- сонала. CAN NOT WRITE:BLK B(CONTINUE?) Попытка записать блок номер В в файловой системе закончи- лась неудачно. Возможно, на диске установлена защита от записи. ЗНАЧЕНИЕ ОТВЕТОВ "ДА" И "НЕТ" Ответ n (нет) на приглашение CONTINUE? (ПРОДОЛЖАТЬ?) означает: Закончить работу программы. (Это рекомендуемый вариант от вета) Ответ y (да) на приглашение CONTINUE? (ПРОДОЛЖАТЬ?) означает: Попытаться продолжить проверку файловой системы. Скорее всего, однако, ошибка будет повторяться. Из-за наличия ошибок полная проверка файловой системы невозможна. Для перепроверки этой файловой системы необходим повторный за- пуск fsck. ФАЗА 1: ПРОВЕРКА БЛОКОВ И РАЗМЕРОВ На этой фазе проверяется список описателей файлов. Возможны со- общения об ошибках в результате: проверки типов описателей файлов формирования таблицы описателей файлов, на которые нет ссылок обнаружения в описателях файлов некорректных номеров или дважды занятых блоков проверки поля размера в описателе файла проверки форматов описателей файлов ТИПЫ СООБЩЕНИЙ ОБ ОШИБКАХ - ФАЗА 1 В фазе 1 выдаются сообщения об ошибках трех типов: 1) информационные сообщения 2) сообщения с приглашением CONTINUE? (ПРОДОЛЖАТЬ?) 3) сообщения с приглашением CLEAR? (ОЧИСТИТЬ?) Имеется определенная связь между информационными сообщениями и сообщениями с приглашением CONTINUE? (ПРОДОЛЖАТЬ?). Этот вопрос обычно задается тогда, когда достигнут определенный предел воз- можностей fsck по обработке ошибок, так что дальнейшая провер- ка, возможно, не имеет смысла. ЗНАЧЕНИЕ ОТВЕТОВ "ДА" И "НЕТ" - ФАЗА 1 Ответ n (нет) на приглашение CONTINUE? (ПРОДОЛЖАТЬ?) в фазе 1 означает: Закончить работу программы. Ответ y (да) на приглашение CONTINUE? (ПРОДОЛЖАТЬ?) в фазе 1 означает: Продолжить работу программы. Обнаруженные ошибки не позволяют провести полную проверку файловой системы. Для перепроверки этой файловой системы необходим повторный запуск fsck. Ответ n (нет) на приглашение CLEAR? (ОЧИСТИТЬ?) в фазе 1 озна- чает: Игнорировать ошибку. Такой ответ оправдан лишь в том случае, если пользователь намеревается исправить ошибку другими средствами. Ответ y (да) на приглашение CLEAR? (ОЧИСТИТЬ?) в фазе 1 означа- ет: Освободить описатель файла, обнулив его содержимое. Это может привести к ошибке ANALLOCATED (СЦВОБОДНЫЙ ОПИСА- ТЕЛЬ) в фазе 2 для тех каталогов, которые ссылаются на этот описатель. СООБЩЕНИЯ ОБ ОШИБКАХ В ФАЗЕ 1 UNKNOWN FILE TYPE I=I(CLEAR?) Тип файла в слове режима описателя файла I не совпадает ни с одним из типов: канал, специальный символьный, обычный, ка- талог, специальный блочный. LINK COUNT TABLE OVERFLOW (CONTINUE?) Во внутренней таблице программы fsck больше нет места для хранения занятых описателей с нулевыми значениями счетчиков ссылок. B BAD I=I Описатель файла номер I содержит номер блока В, который либо меньше номера первого, либо больше номера последнего блока файловой системы. Эта ошибка может в дальнейшем привести к выдаче сообщения EXCESSIVE BAD BLOCKS в фазе 1, если в опи- сателе номер I слишком много номеров блоков вне диапазона номеров данной файловой системы. Эта ошибка приводит также к выдаче сообщения BAD/DUP в фазах 2 и 4. EXCESSIVE BAD BLOCKS I=I (CONTINUE?) Число номеров блоков, меньших номера первого или больших но- мера последнего блока файловой системы, в описателе файла I больше некоторого предельного значения (обычно 10). B DUP I=I Описатель файла I содержит номер блока В, на который уже ссылается другой описатель файла. Эта ошибка может в даль- нейшем привести к выдаче сообщения EXCESSIVE DUP BLOCKS в фазе 1, если в описателе номер I слишком много номеров дваж- ды занятых блоков. Эта ошибка вызывает выполнение фазы 1В, а также приводит к выдаче сообщения BAD/DUP в фазах 2 и 4. EXCESSIVE DUP BLOCKS I=I (CONTINUE?) В описателе номер I число блоков, уже встречавшихся в других описателях файлов, больше некоторого предельного значения (обычно 10). DUP TABLE OVERFLOW (CONTINUE?) Во внутренней таблице программы fsck, в которой хранятся но- мера дважды занятых блоков, больше нет места. POSSIBLE SIZE ERROR I=I Размер файла в описателе номер I не соответствует числу бло- ков, указанных в описателе. Это всего лишь предупреждение. Если в команде задана опция -q, то сообщения такого типа не выдаются. DIRECTORY MISALIGNED I=I Размер каталога не кратен 16. Это всего лишь предупреждение. Если в команде задана опция -q, то сообщения такого типа не выдаются. PARTIALLY ALLOCATED INODE I=I (CLEAR?) Описатель файла номер I не занят и не свободен. ФАЗА 1В: Повторный просмотр для поиска описателей, ссылающихся на дважды занятые блоки Если обнаружены дважды занятые блоки, то fsck повторно просмат- ривает файловую систему для поиска описателей, ссылающихся на дважды занятые блоки. При обнаружении дважды занятого блока пе- чатается сообщение: B DUP I=I Описатель файла номер I содержит номер блока В, на который указывает также другой описатель. Эта ошибка приводит также к выдаче сообщения BAD/DUP в фазе 2. Номера всех описателей, ссы- лающихся на одни и те же блоки, можно выявить, проанализировав все сообщения данного типа, а также аналогичные сообщения в фазе 1. ФАЗА 2: ПРОВЕРКА МАРШРУТНЫХ ИМЕН На этой фазе удаляются элементы каталогов, которые ссылаются на некорректные описатели файлов, обнаруженные в фазах 1 и 1В. Вы- даются сообщения об ошибках типа: неверный режим или состояние корневого описателя номера описателей в каталоге вне допустимого диапазона номера описателей в каталоге соответствуют некорректным опи- сателям файлов В фазе 2 выдаются сообщения об ошибках 4 типов: 1) информационные сообщения 2) сообщения с приглашением FIX? (ИСПРАВИТЬ?) 3) сообщения с приглашением CONTINUE? (ПРОДОЛЖАТЬ?) 4) сообщения с приглашением REMOVE? (УДАЛИТЬ?) ЗНАЧЕНИЕ ОТВЕТОВ "ДА" И "НЕТ" - ФАЗА 2 Ответ n (нет) на приглашение FIX? (ИСПРАВИТЬ?) в фазе 2 означа- ет: Выйти из программы, т. к. fsck не сможет продолжить работу. Ответ y (да) на приглашение FIX? (ИСПРАВИТЬ?) в фазе 2 означа- ет: Изменить тип корневого описателя на тип "каталог". Если блоки данных, на которые указывает корневой описа- тель, не содержит в действительности описание каталога, то будет выдано очень много сообщений об ошибках. Ответ n (нет) на приглашение CONTINUE? (ПРОДОЛЖАТЬ?) в фазе 2 означает: Завершить работу программы. Ответ y (да) на приглашение CONTINUE? (ПРОДОЛЖАТЬ?) в фазе 2 означает: Игнорировать наличие в корневом описателе дважды занятых и некорректных номеров блоков и продолжить проверку файловой системы. Если описатель файла неверный, то это может привести к вы- даче большого числа сообщений об ошибках. Ответ n (нет) на приглашение REMOVE? (УДАЛИТЬ?) в фазе 2 озна- чает: Игнорировать наличие ошибки. Такой ответ оправдан, только если пользователь намеревает- ся устранить ошибку другими средствами. Ответ y (да) на приглашение REMOVE? (УДАЛИТЬ?) в фазе 2 означа- ет: Удалить ссылки на дважды занятые и свободные блоки. СООБЩЕНИЯ ОБ ОШИБКАХ В ФАЗЕ 2 ROOT INODE UNALLOCATED. TERMINATING Биты состояния в корневом описателе (обычно в описателе но- мер 2) не соответствуют состоянию "занят". Эта ошибка свиде- тельствует о наличии серьезного повреждения. Программа за- вершает работу. ROOT INODE NOT DIRECTORY (FIX?) Тип корневого описателя (обычно описателя номер 2) - не "ка- талог". DUPS/BAD IN ROOT INODE (CONTINUE?) В фазах 1 или 1В обнаружены дважды занятые или некорректные номера блоков в корневом описателе (обычно в описателе номер 2) файловой системы. I OUT OF RANGE I=I NAME=F (REMOVE?) Номер описателя файла в элементе каталога с именем F больше, чем максимальный номер в списке описателей. UNALLOCATED I=I OWNER=O MODE=M SIZE=S MTIME=T NAME=F (REMOVE?) Описатель файла номер I в элементе каталога с именем F имеет состояние, отличное от "занят". Распечатывается имя владель- ца O, режим М, размер S, время последнего изменения T, имя файла F. Если файловая система не смонтирована, не задана опция -n, и описатель указывает на символьный файл длины 0, то такие элементы каталога автоматически удаляются. DUP/BAD I=I OWNER=O MODE=M SIZE=S MTIME=T DIR=F (REMOVE?) В фазе 1 или 1В обнаружены дважды занятые или некорректные номера блоков в описателе номер I, на который ссылается ка- талог с именем F. Распечатывается имя владельца O, режим М, размер S, время последнего изменения T, имя каталога F. DUP/BAD I=I OWNER=O MODE=M SIZE=S MTIME=T FILE=F (REMOVE?) В фазе 1 или 1В обнаружены дважды занятые или некорректные номера блоков в описателе номер I, на который ссылается файл с именем F. Распечатывается имя владельца O, режим М, размер S, время последнего изменения T, имя файла F. BAD BLK B IN DIR I=I OWNER=O MODE=M SIZE=S MTIME=T Это сообщение выдается, только если задана опция -D. Обнару- жен дефектный блок в описателе файла-каталога номер I. В блоках данных каталогов могут быть обнаружены такие ошибки, как ненулевые элементы, дополнительные элементы "." и "..", символы "/" в именах. Сообщение об ошибках подобного рода обычно означает, что пользователь в дальнейшем должен либо исключить описатель файла-каталога, если весь блок плохой, либо изменить (удалить) отдельные некорректные элементы это- го каталога. ФАЗА 3: ПРОВЕРКА СВЯЗНОСТИ В этой фазе исследуется связность каталогов, просмотренных в фазе 2. Выдаются сообщения об ошибках: обнаружен каталог, на который нет ссылок отсутствуют или переполнены каталоги lost+fоund ТИПЫ СООБЩЕНИЙ ОБ ОШИБКАХ - ФАЗА 3 В фазе 3 выдаются сообщения двух типов: 1) информационные сообщения 2) сообщения с приглашением RECONNECT? (ПОДКЛЮЧИТЬ?) ЗНАЧЕНИЕ ОТВЕТОВ "ДА" И "НЕТ" В ФАЗЕ 3 Ответ n (нет) на приглашение RECONNECT? (ПОДКЛЮЧИТЬ?) в фазе 3 означает: Игнорировать ошибку. Это приводит к выдаче сообщения UNREF в фазе 4. Такой ответ оправдан лишь в том случае, если пользователь намеревается исправить ошибку другими средствами. Ответ y (да) на приглашение RECONNECT? (ПОДКЛЮЧИТЬ?) в фазе 3 означает: Подключить описатель файла-каталога к файловой системе, поместив его в каталог для "потерянных" файлов lost+found. Если при подключении к каталогу lost+found возникли зат- руднения, то будут выданы соответствующие сообщения. Если подключение прошло успешно, то выдается информационное со- общение CONNECTED (ПОДКЛЮЧЕН). СООБЩЕНИЯ ОБ ОШИБКАХ - ФАЗА 3 UNREF DIR I=I OWNER=0 MODE=M SIZE=S MTIME=T (RECONNECT?) При просмотре файловой системы обнаружено, что описатель файла-каталога номер I не включен ни в какой каталог. Распе- чатывается имя владельца O, режим М, размер S, время послед- него изменения T описателя номер I. SORRY. NO lost+found DIRECTORY. В корневом каталоге файловой системы отсутствует каталог lost+found. Подключение к каталогу lost+found не выполнено. В результате, в фазе 4 будет выявлена ошибка UNREF. Возмож- но, затруднение связано с режимом доступа к каталогу lost+ found. SORRY. NO SPACE IN lost+found DIRECTORY. Нет места для включения еще одного элемента в каталог lost+- found; подключение к каталогу lost+found не выполнено. В ре- зультате, в фазе 4 будет выявлена ошибка UNREF. Удалите из lost+found ненужные элементы или увеличьте lost+found (см. процедуру 5.2). DIR I=I1 CONNECTED. PARENT WAS I=I2 Это дополнительное сообщение, показывающее, что описатель каталога номер I1 успешно включен в lost+found. Номер надка- талога I2 в описателе подключаемого каталога заменен на но- мер описателя каталога lost+found. ФАЗА 4: ПРОВЕРКА СЧЕТЧИКОВ ССЫЛОК В этой фазе проверяется собранная в фазах 2 и 3 информация о счетчиках ссылок. Выдаются сообщения об ошибках: нет ссылок на файлы отсутствует или переполнен каталог lost+found неверные счетчики ссылок для файлов, каталогов и специальных файлов нет ссылок на файлы или каталоги некорректные номера блоков или дважды занятые блоки в файлах и каталогах неверный счетчик общего числа свободных описателей файлов ТИПЫ СООБЩЕНИЙ ОБ ОШИБКАХ - ФАЗА 4 В фазе 4 выдаются сообщения об ошибках 5 типов: 1) информационные сообщения 2) сообщения с приглашением RECONNECT? (ПОДКЛЮЧИТЬ?) 3) сообщения с приглашением CLEAR? (ОЧИСТИТЬ?) 4) сообщения с приглашением ADJUST? (ЗАМЕНИТЬ?) 5) сообщения с приглашением FIX? (ИСПРАВИТЬ?) ЗНАЧЕНИЕ ОТВЕТОВ "ДА" И "НЕТ - ФАЗА 4 Ответ n (нет) на приглашение RECONNECT? (ПОДКЛЮЧИТЬ?) в фазе 4 означает: Игнорировать ошибку. Это приведет далее в фазе 4 к выдаче сообщения CLEAR. Ответ y (да) на приглашение RECONNECT? (ПОДКЛЮЧИТЬ?) в фазе 4 означает: Подключить описатель файла-каталога к файловой системе, поместив его в каталог для "потерянных" файлов (обычно ка- талог lost+found). Если при подключении каталога в lost+found возникли зат- руднения, то будут выданы соответствующие сообщения. Ответ n (нет) на приглашение CLEAR? (ОЧИСТИТЬ?) в фазе 4 озна- чает: Игнорировать ошибку. Такой ответ оправдан лишь в том случае, если пользователь намеревается исправить ошибку другими средствами. Ответ y (да) на приглашение CLEAR? (ОЧИСТИТЬ?) в фазе 4 означа- ет: Освободить описатель файла, обнулив его содержимое. Ответ n (нет) на приглашение ADJUST? (ЗАМЕНИТЬ?) в фазе 4 озна- чает: Игнорировать ошибку. Такой ответ оправдан лишь в том случае, если пользователь намеревается исправить ошибку другими средствами. Ответ y (да) на приглашение ADJUST? (ЗАМЕНИТЬ?) в фазе 4 озна- чает: Заменить счетчик ссылок в описателе файла номер I на Y. Ответ n (нет) на приглашение FIX? (ИСПРАВИТЬ?) в фазе 4 означа- ет: Игнорировать ошибку. Такой ответ оправдан лишь в том случае, если пользователь намеревается исправить ошибку другими средствами. Ответ y (да) на приглашение FIX? (ИСПРАВИТЬ?) в фазе 4 означа- ет: Заменить значение счетчика в суперблоке фактическим значе- нием счетчика. СООБЩЕНИЯ ОБ ОШИБКАХ В ФАЗЕ 4 UNREF FILE I=I OWNER=O MODE=M SIZE=S MTIME=T (RECONNECT?) При просмотре файловой системы обнаружено, что на описатель файла номер I нет ссылки ни из одного каталога. Распечатыва- ется имя владельца O, режим М, размер S, время последнего изменения T. Если не задана опция -n, и файловая система не смонтирована, то пустые файлы автоматически удаляются. Не- пустые файлы не удаляются. SORRY. NO lost+found DIRECTORY. В корневом каталоге файловой системы отсутствует каталог lost+found. Подключение каталога к lost+found не выполнено. Это приводит к выдаче сообщения CLEAR далее в фазе 4. Воз- можно, затруднение связано с режимом доступа к каталогу lost+found. SORRY. NO SPACE IN lost+found DIRECTORY. Нет места для включения еще одного элемента в каталог lost+- found; подключение каталога к lost+found не выполнено. Это приводит к выдаче сообщения CLEAR далее в фазе 4. Проверьте размер и содержимое каталога lost+found. (CLEAR) Описатель файла, упомянутый в предыдущем сообщении UNREF, не может быть подключен. LINK COUNT FILE I=I OWNER=O MODE=M SIZE=S MTIME=T COUNT=X SHO- ULD BE Y (ADJUST?) Счетчик ссылок в описателе обычного файла номер I равен X, а должен равняться Y. Распечатывается имя владельца O, режим М, размер S, время последнего изменения T. LINK COUNT DIR I=I OWNER=O MODE=M SIZE=S MTIME=T COUNT=X SHOULD BE Y (ADJUST?) Счетчик ссылок в описателе файла-каталога номер I равен X, а должен равняться Y. Распечатывается имя владельца O, режим М, размер S, время последнего изменения T описателя, номер I файла-каталога. LINK COUNT FI=I OWNER=O MODE=M SIZE=S MTIME=T COUNT=X SHOULD BE Y (ADJUST?) Счетчик ссылок в описателе номер I обычного файла с именем F равен X, а должен равняться Y. Распечатывается имя файла F, имя владельца O, режим М, размер S, время последнего измене- ния T. UNREF FILE I=I OWNER=O MODE=M SIZE=S MTIME=T (CLEAR?) При просмотре файловой системы обнаружено, что описатель обычного файла номер I не включен ни в один каталог. Распе- чатывается имя владельца O, режим М, размер S, время послед- него изменения T описателя I. Если не задана опция -n, и файловая система не смонтирована, то пустые файлы автомати- чески удаляются. Непустые файлы не удаляются. UNREF DIR I=I OWNER=O MODE=M SIZE=S MTIME=T (CLEAR?) При просмотре файловой системы обнаружено, что описатель файла-каталога номер I не включен ни в один каталог. Распе- чатывается имя владельца O, режим М, размер S, время послед- него изменения T описателя I. Если не задана опция -n, и файловая система не смонтирована, то пустые каталоги автома- тически удаляются. Непустые каталоги не удаляются. BAD/DUP FILE I=I OWNER=O MODE=M SIZE=S MTIME=T (CLEAR?) В фазе 1 или 1В обнаружено, что описатель файла номер I со- держит дважды занятые или некорректные номера блоков. Распе- чатывается имя владельца O, режим М, размер S, время послед- него изменения T описателя I. BAD/DUP DIR I=I OWNER=O MODE=M SIZE=S MTIME=T (CLEAR?) В фазе 1 или 1В обнаружено, что описатель файла-каталога но- мер I содержит дважды занятые или некорректные номера бло- ков. Распечатывается имя владельца O, режим М, размер S, время последнего изменения T описателя I. FREE INODE COUNT WRONG IN SUPERBLK (FIX?) Фактическое число свободных описателей файлов не совпадает со значением счетчика в суперблоке файловой системы. Если задана опция -q, то значение счетчика в суперблоке будет исправлено автоматически. ФАЗА 5: ПРОВЕРКА СПИСКА СВОБОДНЫХ БЛОКОВ В этой фазе проверяется список свободных блоков. Выдаются сооб- щения об ошибках: некорректные номера блоков в списке свободных блоков неверное значение счетчика свободных блоков дважды занятые блоки в списке свободных блоков незанятые блоки файловой системы не в списке свободных блоков неверное значение счетчика общего числа свободных блоков ТИПЫ СООБЩЕНИЙ ОБ ОШИБКАХ - ФАЗА 5 В фазе 5 выдаются сообщения об ошибках 4 типов: 1) информационные сообщения 2) сообщения с приглашением CONTINUE? (ПРОДОЛЖАТЬ?) 3) сообщения с приглашением FIX? (ИСПРАВИТЬ?) 4) сообщения с приглашением SALVAGE? (ПЕРЕКОНСТРУИРОВАТЬ?) ЗНАЧЕНИЯ ОТВЕТОВ "ДА" И "НЕТ" - ФАЗА 5 Ответ n (нет) на приглашение CONTINUE? (ПРОДОЛЖАТЬ?) в фазе 5 означает: Завершить работу программы. Ответ y (да) на приглашение CONTINUE? (ПРОДОЛЖАТЬ?) в фазе 5 означает: Игнорировать оставшуюся часть списка свободных блоков и продолжить выполнение fsck. Ошибка этого типа обязательно приводит к выдаче сообщения BAD BLKS IN FREE LIST далее в фазе 5. Ответ n (нет) на приглашение FIX? (ИСПРАВИТЬ?) в фазе 5 озна- чает: Игнорировать ошибку. Такой ответ оправдан лишь в том случае, если пользователь намеревается исправить ошибку другими средствами. Ответ y (да) на приглашение FIX? (ИСПРАВИТЬ?) в фазе 5 озна- чает: Заменить значение счетчика в суперблоке на фактическое число свободных блоков? Ответ n (нет) на приглашение SALVAGE? (ПЕРЕКОНСТРУИРОВАТЬ?) в фазе 5 означает: Игнорировать ошибку. Такой ответ оправдан лишь в том случае, если пользователь намеревается исправить ошибку другими средствами. Ответ y (да) на приглашение SALVAGE? (ПЕРЕКОНСТРУИРОВАТЬ?) в фазе 5 означает: Заменить имеющийся список свободных блоков новым списком свободных блоков. Новый список свободных блоков будет упо- рядочен в соответствии со значением промежутка и специфи- кациями цилиндров в опциях -s или -S, для того чтобы мини- мизировать время вращения диска, необходимое для попадания в нужную позицию. СООБЩЕНИЯ ОБ ОШИБКАХ - ФАЗА 5 EXCESSIVE BAD BLKS IN FREE LIST (CONTINUE?) Число блоков с номерами, меньшими чем номер первого или большими чем номер последнего блока файловой системы в спис- ке свободных блоков, превысило некоторое предельное значение (обычно 10). EXCESSIVE DUP BLKS IN FREE LIST (CONTINUE?) Число блоков, которые уже упоминались в описателях файлов или ранее - в списке свободных блоков, превысило некоторое предельное значение (обычно 10). BAD FREEBLK COUNT Счетчик свободных блоков в списке свободных блоков меньше 0 или больше 50. Эта ошибка обязательно приводит к выдаче со- общения BAD FREE LIST далее в фазе 5. X BAD BLKS IN FREE LIST В списке свободных блоков обнаружено X блоков с номерами, меньшими чем номер первого или большими чем номер последнего блока файловой системы. Эта ошибка обязательно приводит к выдаче сообщения BAD FREE LIST далее - в фазе 5. X DUP BLKS IN FREE LIST В списке свободных блоков обнаружено X блоков с номерами, уже упоминавшимися в описателях файлов или ранее - в списке свободных блоков. Эта ошибка обязательно приводит к выдаче сообщения BAD FREE LIST далее - в фазе 5. X BLK(S) MISSING В списке свободных блоков не найдено X блоков, не занятых файловой системой. Эта ошибка обязательно приводит к выдаче сообщения BAD FREE LIST далее - в фазе 5. FREEBLK COUNT WRONG IN SUPERBLOCK (FIX?) Фактическое число свободных блоков не совпадает со значением счетчика в суперблоке. BAD FREE LIST (SALVAGE?) Этому сообщению обязательно предшествует одно или более ин- формационных сообщений фазы 5. Если задана опция -q, то пе- реконструирование списка свободных блоков выполняется авто- матически. ФАЗА 6: ПЕРЕКОНСТРУИРОВАНИЕ СПИСКА СВОБОДНЫХ БЛОКОВ В этой фазе выполняется переконструирование списка свободных блоков. Может быть выдано только одно сообщение об ошибке, если задано неверное число_блоков_на_цилиндре или величина промежут- ка. СООБЩЕНИЕ ОБ ОШИБКЕ - ФАЗА 6 DEFAULT FREE-BLOCK LIST SPACING ASSUMED. Это предупреждающее сообщение. Оно означает, что заданный промежуток между записями больше чем число_блоков_на_цилинд- ре, или промежуток меньше 1, или число_блоков_на_цилиндре меньше 1, или число_блоков_на_цилиндре больше 500. Исполь- зуются значения: промежуток между записями - 7 блоков, чис- ло_блоков_на_цилиндре - 400. Поскольку эти значения неверны для машины 3В2, то следует поза- ботиться о задании правильных значений в опции -S в командной строке. См. подробнее об этом fsck(1M) и mkfs(1M). ФАЗА ОЧИСТКИ После проверки файловой системы выполняется несколько функций очистки. В фазе очистки выдаются сведения о файловой системе и ее состоянии. СООБЩЕНИЯ В ФАЗЕ ОЧИСТКИ X files Y blocks Z free Это информационное сообщение, в нем указывается, что в фай- ловой системе имеется X файлов, Y блоков, Z свободных блоков. ***** BOOT UNIX (NO SYNC!) ***** Это сообщение указывает, что смонтированная файловая система или корневая файловая система была изменена программой fsck. Если не произвести немедленную перезагрузку системы UNIX, не выполняя команду sync, то результат работы, проделанной fsck, может пропасть, т. к. в оперативной памяти остались копии таблиц, поддерживаемых операционной системой UNIX. Ес- ли в команде fsck задана опция -b и проверялась корневая файловая система, то перезагрузка выполняется автоматически. ***** FILE SYSTEM WAS MODIFIED ***** Информационное сообщение, которое говорит о том, что в фай- ловую систему были внесены изменения программой fsck.