Жанр: Учеба

Приемы профессиональной работы в Unix

сторінка №27

bin 2, 1 Jun 6 09:23 /dev/fd048ss9
| 102 brw-rw-rw- 3 bin bin 2, 7 Jun 17 14:28 /dev/fd096
| 102 brw-rw-rw- 3 bin bin 2, 7 Jun 17 14:28 /dev/fd096ds15
| 99 brw-rw-rw- 3 bin bin 2, 11 Jun 26 19:34 /dev/fd1
| 99 brw-rw-rw- 3 bin bin 2, 11 Jun 26 19:34 /dev/fd148
| 97 br--r--r-- 1 bin bin 2, 10 Jun 6 09:23 /dev/fd148ds8
| 99 brw-rw-rw- 3 bin bin 2, 11 Jun 26 19:34 /dev/fd148ds9
| 96 br--r--r-- 1 bin bin 2, 8 Jun 6 09:23 /dev/fd148ss8
| 98 br--r--r-- 1 bin bin 2, 9 Jun 6 09:23 /dev/fd148ss9
| 103 brw-rw-rw- 2 bin bin 2, 15 Jun 6 09:23 /dev/fd196
| 103 brw-rw-rw- 2 bin bin 2, 15 Jun 6 09:23 /dev/fd196ds15
|

Если мы посмотрим на записи с индексным дескриптором 102, начиная
с середины списка, то увидим прогрессирующее упрощение имен по мере
продвижения к первой записи - устройству 0, которое имеет высокую
плотность записи по умолчанию. Для того чтобы обратиться к нему как к
устройству с низкой плотностью записи, необходимо использовать имя
fd048, а не fd0. Поскольку большинство используемых гибких дисков имеют
низкую плотность записи, то имя fd048ds9 является умолчанием в
программе mntf.

Строка 17 соответствует опции -1 для указания устройства 1 вместо
устройства 0. Строки 18-22 проверяют, сиществует ли каталог для монтирования
второго устройства. Если вы используете два гибких диска одновременно,
то вы не можете монтировать их оба в один и тот же каталог.
Для разрешения этой проблемы программа mntf использует для монтирования
устройства 1 каталог /mnt1, а не /mnt. Если каталог /mnt1 не
существует, по умолчанию используется каталог /mnt, и все хорошо, если
вы используете только устройство 1. Однако следует избегать монтирования
одного гибкого диска на место второго. Вы можете получить непредвиденные
результаты. Если вы собираетесь монтировать два гибких диска,
убедитесь, что у вас есть и каталог /mnt, и /mnt1.

Строка 23 делает монтируемую файловую систему доступной только
для чтения в случае, если была указана опция -r, что выполняется добавлением
символов -r к имени каталога. Это не является частью имени
каталога, но когда shell выполняет обработку команды, пробела между
именем каталога и -r достаточно, чтобы распознать -r как опцию.

Строка 24 соответствует опции -s и присваивает переменной SYSTEM
значение sysv. Это означает, что нужно использовать другие соглашения
об именах устройств.

Строки 25-34 выполняют проверку на ошибки в командной строке. Любая
опция, отличная от уже проверенных, является ошибкой, поэтому все,
что соответствует улавливающей ветке оператора case (*), считается недопустимой
опцией. В этом случае выводится синтаксическая подсказка, и
программа завершается.

В строках 39-42 выполняется вся основная работа. Оператор case
действует в соответствии со значением переменной SYSTEM. Если оно равно
"sysv", выполняется строка 40. В противном случае выполняется строка
41 для системы XENIX. Обратите внимание, что в нашей версии командного
файла mntf в строке sysv имеется только переменная с номером устройства.
Если вы используете System V, вы можете добавить переменную
для указания плотности записи или другие параметры, которые вам нужны.

Строка 41 выполняет версию команды, рассчитанную на систему
XENIX. Переменная CMD содержит, как мы отмечали, команду монтирования
(mount) или размонтирования (umount). Последовательность символов
/dev/fd указывает файл устройства для гибкого диска. Переменная DRIVE
равна 0 или 1. Переменная DENSITY указывает устройство с высокой или
низкой плотностью записи. Если должна быть выполнена команда монтирования,
переменная DIR содержит каталог. Если выполняется размонтирование,
значение переменной DIR равно нулю.

ЗАМЕЧАНИЕ ПО ВОПРОСУ БЕЗОПАСНОСТИ

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

# chown root /etc/mount "- делает пользователя root владельцем
модуля /etc/mount
# chmod 4511 /etc/mount и дает возможность выполнять команду mount
всем пользователям

# chown root /etc/umount "- делает то же самое для команды
# chmod 4511 /etc/umount размонтирования

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

---------------------------------------------------------------------------

ИМЯ: mntlook
---------------------------------------------------------------------------

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

НАЗНАЧЕНИЕ

Просмотр всех файлов дисковых устройств и обнаружение всех файловых
систем, включая немонтированные.

ФОРМАТ ВЫЗОВА

mntlook

ПРИМЕР ВЫЗОВА

mntlook /dev/hd*

Поиск файловых систем на всех жестких дисках

ТЕКСТ ПРОГРАММЫ

1 static char id[] =
"@(#) mntlook v1.0 Look for mounts Author: Russ Sage";
Поиск файловых систем

3 #include
4 #include
5 #include
6 #include
7 #include

9 #define BSIZ 512

11 main(argc,argv)
12 int argc;
13 char *argv[];
14 {
15 struct filsys sb;
16 int d, dev;
17 char buf[BSIZ];

19 for (d = 1; d " argc; d++)
20 {
21 if (argv[d][0] == '-')
22 {
23 printf("mntlook: invalid argument %s\n", argv[d]);
24 printf("usage: mntlook device [device ...]\n");
25 continue;
26 }
27 if ((dev = open(argv[d],O_RDONLY)) " 0)
28 {
29 sprintf(buf, "cannot open %s",argv[d]);
невозможно открыть
30 perror(buf);
31 continue;
32 }

34 /* throw away first block */
обойти первый блок
35 if (read(dev, &sb, sizeof(sb)) == -1)
36 {
37 perror("cannot read block 0");
не читается блок 0
38 continue;
39 }

41 /* block 1 is the superblock */
блок 1 является суперблоком
42 if (read(dev, &sb, sizeof(sb)) == -1)
43 {
44 perror("cannot read block 1");
не читается блок 1
45 continue;
46 }

48 if (sb.s_magic == S_S3MAGIC)
49 {
50 printf("\nDEV: %s --" VALID file system\n",argv[d]);
51 printf("filsys: %s\n",sb.s_fname);
52 printf("pack : %s\n",sb.s_fpack);
53 printf("type : %s byte block\n",
54 (sb.s_type == S_B512) ? "512" : "1024");
55 printf("magic : %lx\n",sb.s_magic);
56 }

58 close(dev);
59 }
60 }

ОПИСАНИЕ

ЗАЧЕМ НАМ НУЖНА ПРОГРАММА mntlook?

Файловые системы являются сердцевиной системы UNIX. Сама система
не существует вне файловой системы, а расширенные возможности системы
обеспечиваются файловой системой.

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

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

ЧТО ДЕЛАЕТ mntlook?

Программа mntlook предназначена для просмотра содержимого файлов
устройств и поиска суперблока. (Мы вкратце рассматривали суперблоки
ранее). Когда суперблок обнаружен, из него извлекается и выводится на
экран имя файловой системы, имя дискового пакета, используемый размер
блока и идентификационный "магический номер".

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

Давайте рассмотрим, каким образом файловые системы связаны с физическим
носителем. К каждой машине подсоединено фиксированное число
периферийных устройств. Для работы со сменными носителями в UNIX реализована
концепция монтированного и немонтированного файлового пространства.
Но первым шагом является установка пакета дисков (или гибкого
диска) в дисковое устройство. После этого можно выполнять операции
чтения и записи на физических носителях, указывая определенные имена
устройств.

Монтирование представляет собой логическое действие, которое читает
суперблок с пакета дисков и записывает его в память, где ядро
системы поддерживает свою версию суперблока. Периодически выполняется
запись версии, находящейся в памяти, обратно на диск, чтобы эти две
версии были по возможности одинаковыми. В System V это делает программа
update, которая работает в фоновом режиме с момента загрузки системы.


Для обращения непосредственно к физическому носителю используются
такие команды, как, например, команда "od -c /dev /rfd0", которая дампирует
неструктурированный гибкий диск. Одной из команд, которые непосредственно
помещают данные на устройство, является команда "cp file
/dev/rfd0". Область данных начинается с самого первого байта на гибком
диске. Такие данные несовместимы с командами tar, cpio или файловой
системой.

Для обращения к файловой системе используется команда "mount
/dev/fd0 /mnt". Начиная с этого момента, все обращения к данному устройству
выполняются через каталог /mnt. Важно то, что непосредственный
доступ к файлу устройства является операцией более низкого уровня, чем
операции файловой системы, что позволяет прочитать информацию о суперблоке
непосредственно с устройства.

Входной информацией для программы 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 головки/цилиндр

Промышленный стандарт:

1 дорожка = 17 секторов, или 17 секторов/дорожку
1 сектор = 512 байт, или 512 байт/сектор
1 Кбайт = 1024 байта = 2^10
1 Мбайт = 1024 килобайта = 2^20 = 1 048 576 байт

Характеристики устройства различны для разных устройств, но промышленный
стандарт для числа секторов на дорожку и байтов на сектор
остается одинаковым. В табл. 7-4 показаны примеры характеристик различных
устройств.

Таблица 7-4

Размеры жестких дисков и их конфигурация
---------------------------------------------------------------------------

Число цилиндров Число головок Мегабайты
---------------------------------------------------------------------------

981 3 25

697 5 30

981 5 42

925 7 55

1024 8 71
---------------------------------------------------------------------------

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

615 цил 4 дор 17 сек 512 байт
------- * ----- * ------ * -------- = 21 411 840 байт/диск
1 диск 1 цил 1 дор 1 сек

21411840 байт 1 мегабайт
------------- * ------------ = 20.4 мегабайта/диск
1 диск 1048576 байт

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

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

Важным моментом, на который необходимо обратить внимание, является
использование разных терминов. Иногда применяется число головок
на цилиндр, а иногда число дорожек на цилиндр. При использовании каждого
из этих терминов соответствующим образом изменяются и другие термины.
Существует такая взаимосвязь:

цилиндр, дорожка, сектор = физический сектор
цилиндр, головка, байт = блок

Эти две записи выражают в точности одно и то же. Когда вы используете
запись вида цилиндр/дорожка/сектор, то в результате получаете
физический сектор. Используя запись вида цилиндр/головка/байт, вы получаете
в результате номер блока. Следует помнить, что ГОЛОВКА - это
то же самое, что и ДОРОЖКА. Если вы это запомните, все остальное встанет
на свое место.

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

1. Сколько дорожек имеет диск?

615 цил 4 дор
Решение: ------- * ----- = 2460 дор/диск
1 диск 1 цил

2. Сколько байт в дорожке?

17 сек 512 байт
Решение: ------ * -------- = 8704 байт/дор
1 дор 1 сек

3. Сколько дорожек в одном мегабайте?

2460 дор 1 диск
Решение: -------- * ------ = 123 дор/Мб
1 диск 20 Мб

4. Сколько цилиндров в одном мегабайте?

1 цил 2460 дор
Решение: ----- * -----

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.