перблоке непосредственно с устройства.
Входной информацией для программы mntlook являются имена файлов
устройств. В командной строке нельзя указывать никакие опции. Имена
устройств могут быть как блочными, так и символьными. Для операции
чтения это не имеет никакого значения, если только у вас имеются права
чтения. Затем программа читает второй блок и проверяет "магическое
число", определяющее суперблок. Суперблок - это просто структура языка
Си, которая предопределена системой и хранится в файле filsys.h, что
указано в нашей программе оператором #include. Магическое число
представляет собой длинное целое, имеющее заранее определенное значе-
ние. Если элемент структуры, которая прочитана с диска, содержит это
число, то считается, что остальная часть структуры является корректны-
ми данными. Для каждой файловой системы имеется только одна структура
суперблока.
Если магическое число такое, как надо, выводится остальная инфор-
мация о файловой системе. Если это число некорректно, на экран ничего
не выводится и программа обрабатывает в цикле следующий файл уст-
ройства, указанный в командной строке.
Данная программа может служить в качестве функции, обеспечивающей
безопасность, поскольку она умеет идентифицировать файловые системы,
которые кто-либо оставил на машине несмонтированными. Как отмечается в
главе 9, нарушители защиты могут читать данные с немонтированных уст-
ройств, поэтому если оставить устройство или файловую систему немонти-
рованными, то на самом деле это не предохраняет их от несанкциониро-
ванного доступа.
ПРИМЕРЫ
1. $ mntlook /dev/hd13
Поиск суперблока на устройстве с именем hd13. Это имя указывает
устройство 1, третий раздел. Для просмотра разделов в среде XENIX нуж-
но запустить программу fdisk. Для System V нужно воспользоваться ко-
мандой iv.
2. $ mntlook /dev/fd0*
Поиск файловых систем на гибких дисках с любой плотностью записи,
находящихся в устройстве 0. Это снова пример для системы XENIX.
3. $ for DEV in /dev/*[fh]d*
> do
> echo "checking device: $DEV"
> mntlook $DEV
> done
Данный цикл выполняется по всем именам устройств для гибих и
жестких дисков по очереди. Каждое имя выводится на экран. Затем прове-
ряется, содержит ли данное устройство файловую систему.
ПОЯСНЕНИЯ
Строки 3-7 определяют включаемые файлы, которые использует данная
программа. Вам необходимо изучить эти файлы, поскольку они не только
помогут вам понять работу этой программы, но и покажут вам некоторые
важные значения, имеющие отношение к файловым системам.
Строка 9 определяет размер используемого буфера. Этот буфер при-
меняется только для хранения сообщений об ошибках, поэтому он не дол-
жен быть очень большим.
Строка 15 определяет структуру суперблока. Он имеет тип filesys
(см. включаемый файл sys/types.h). На моей машине суперблок имеет раз-
мер 1024 байта. Если вы не знаете точно размер буфера у вас, то вы мо-
жете проверить его, вставив в программу следующий оператор:
printf ("the size is %d",sizeof(sb))
Строка 16 описывает рабочую переменную d и дескриптор файла dev.
Строка 17 объявляет буфер размером BSIZE.
Строки 19-59 - это один большой цикл for. Этот цикл представляет
собой всю остальную часть программы. Он выполняется столько раз,
сколько аргументов указано в командной строке. Счетчик цикла начина-
ется с 1, поскольку первым аргументом argv[0] является имя команды. В
качестве аргументов должны быть указаны имена файлов, поэтому данный
цикл использует каждое имя по очереди.
В строках 21-26 проверяется, не начинается ли текущий рассматри-
ваемый нами аргумент со знака '-'. Если да, то это опция, что
представляет собой ошибку, поэтому выводится сообщение об ошибке и
оператор continue вызывает выполнение следующей итерации цикла. Таким
образом, данная программа отвергает опции, но работает при обнаружении
имен файлов.
Считая, что имя файла было найдено, строки 27-32 открывают файл
устройства с этим именем только для чтения. Если данный вызов open не-
удачен, мы посылаем сообщение в буфер вместе с именем, указанным в ко-
мандной строке. Этот буфер передается программе обработки ошибок
(системной), которая использует наше сообщение как первую часть своего
сообщения об ошибке. Она выводит системное сообщение, которое опреде-
ляет данную ошибку. По оператору continue начинается выполнение следу-
ющей итерации цикла for.
Строки 35-39 читают первый блок файла. Для корневой файловой
системы первым блоком является загрузочная запись. Если при этом чте-
нии возникает ошибка, выводится сообщение об ошибке и выполнение цикла
продолжается.
Строки 42-46 читают второй блок, который должен находиться в том
месте, где размещается суперблок, если он имеется. По информации, про-
читанной и помещенной в структуру, мы можем получить доступ к каждому
элементу по его имени.
Строка 48 проверяет, равно ли магическое число в структуре маги-
ческому числу, определенному в файле заголовка. Если они совпадают,
программа mntlook выводит имя файла устройства и сообщение о том, что
файловая система корректна, имя файловой системы (если оно имеется),
имя пакета дисков, размер используемого блока и магическое число в
шестнадцатиричном виде.
В строках 53-54 мы имеем подобие кодированной структуры: оператор
printf использует структуру типа if-then-else для указания строки, ко-
торую нужно выводить. После того как выведена первая строка, выполня-
ется проверка и если она прошла успешно, то выводится значение 512.
Если в результате проверки получено значение "ложь", выводится значе-
ние 1024. Этот метод описан в книге B.W.Kernighan, D.M.Ritchie "The C
Programming Language" (Prentice-Hall, 1978).
Строка 58 закрывает устройство, и цикл возвращается в
начало для принятия следующего имени устройства.
РАЗМЕРНЫЕ ПАРАМЕТРЫ
Теперь, когда мы рассмотрели взаимоотношения между устройствами и
файловыми системами и некоторые параметры, связанные с форматами
дисков, давайте обратимся к гайкам и болтикам этих устройств. Хотя
основная часть этой информации может показаться экзотичной, она может
оказаться важной при определенных обстоятельствах. Например, для уста-
новки системы UNIX на новую машину вам нужно разбить диск на сегменты
и понимать, каким образом UNIX фактически располагается на диске. Если
вы создаете программы, которые выполняют какую-либо операцию низкого
уровня с диском, вам, очевидно, необходимо понимать, что вы делаете.
Администраторам, поскольку они должны добавлять новые устройства в
систему, необходимо уметь определять количество файловых систем (т.е.
сколько можно создать разделов на диске), их размеры и знать, каким
образом установить файловые системы в эти разделы. Администраторы
должны также уметь писать или модифицировать драйверы устройств. Нако-
нец, при работе с дисками возникают проблемы, такие как плохие блоки,
которые необходимо изолировать и с которыми приходится иметь дело.
РАЗМЕРЫ БЛОКОВ
System V является последним достижением ветви фирмы AT&T в фа-
мильном дереве UNIX. Это означает, что System V содержит последние
правки, внесенные в исходную систему UNIX. Эти правки предназначены
для того, чтобы сделать UNIX жизнеспособным и стойким коммерческим
продуктом. Для повышения устойчивости были внесены изменения, касающи-
еся работы с файлами и размеров их блоков.
Обычно обмен данными с дисками осуществляется блоками по 512 бай-
тов. Дисковая аппаратура имеет дело именно с таким размером. Для учета
этого факта UNIX первоначально использовал 512-байтные блоки внутри
файловой системы, что, возможно, облегчало написание программ и созда-
вало впечатление, что так и нужно. Однако нельзя отрицать, что при
этом UNIX может работать медленно!
Для ускорения работы внутренние программы в настоящее время
используют блоки размером 1024 байта. Сам диск должен выполнить два
обращения к 512-байтным блокам, но в системе две эти операции чтения
рассматриваются как одна операция чтения блока размером 1024 байта.
Единственная проблема заключается в том, что одни утилиты выдают ре-
зультаты в 512-байтных блоках, а другие - в 1024-байтных, в зависи-
мости от того, когда они были написаны. Когда сильно приближаются пре-
делы свободного пространства на диске, вам действительно нужно знать,
с каким размером вы имеете дело.
Для лучшего понимания проблемы размеров блоков, в табл. 7-3 пока-
зано, какие утилиты какой размер блока используют. Эта информация по-
лучена в основном из System V на машине VAX, из другого варианта
System V и из XENIX. Эти значения могут отличаться на разных машинах,
но идея сохраняется.
Вы видите, что большинство утилит выдают результат в блоках раз-
мером 512 байтов, но утилиты, относящиеся к файловой системе, выдают
результат в 1024-байтных блоках. Поскольку UNIX обращается к дисковому
пространству поблочно, важно уметь точно вычислять, сколько свободного
пространства в файловой системе. Весьма плоха ситуация, когда имеется
какой-то большой файл в редакторе vi (который использует файл /tmp для
промежуточного редактирования), а на диске недостаточно места для за-
писи временного файла редактора vi в реальный файл на диске. На самом
деле это может случиться на персональных машинах с ограниченным (ска-
жем, 20 Мбайт) объемом жесткого диска.
Таблица 7-3
Размеры блоков для различных команд системы UNIX
---------------------------------------------------------------------------
512 байтов/блок 1024 байта/блок
---------------------------------------------------------------------------
ls -s fdisk (размеры разделов)
sum mkfs
cpio fsck
df
du
---------------------------------------------------------------------------
РАСЧЕТЫ, СВЯЗАННЫЕ С БЛОКАМИ
Еще одним важным вопросом, имеющим отношение к физическим уст-
ройствам и логическим файловым системам, является определение местона-
хождения определенного блока на жестком диске. Номер этого блока вы-
числяется по номерам цилиндра, дорожки и сектора.
Знание номеров блоков становится важным, когда на диске появля-
ется дефектное место. Это дефектное место отмечается номерами цилиндра
и головки. Вам необходимо вычислить, какие блоки попадают в дефектную
область и занести их номера в таблицу дефектных блоков.
Обратная задача также важна. Если программа fsck начинает сооб-
щать, что где-то появился дефектный блок, то каким образом мы можем
узнать номера цилиндра, головки, сектора и т.д. для данного дефектного
блока? Такое обратное вычисление сделать очень тяжело, если не невоз-
можно. Во-первых, номер блока представляет собой произведение четырех
чисел. Трудно узнать, какие именно эти числа. Кроме того, файловые
системы могут использовать информацию вида база/смещение, поэтому блок
номер 1 в файловой системе в действительности является блоком номер
1382 на диске. Определить, какого вида информация была использована в
данном случае, тоже тяжело.
Конкретные данные в следующем примере относятся к вполне опреде-
ленной машине, но на других машинах используются подобные зависимости.
Эти данные относятся к машине с жестким диском объемом 20 Мбайт с
системами XENIX/DOS.
Характеристики устройства:
1 диск = 615 цилиндров, или 615 цилиндров/диск
1 цилиндр = 4 головки (дорожки), или 4 головки/цилиндр
Промышленный стандарт: