Рассел Сейдж. Приемы профессиональной работы в unix перевод "Tricks of the unix masters" by Russel G
Вид материала | Документы |
- Лекция 10. Файловые системы Unix, 116.79kb.
- Unix-подобные операционные системы, характеристики, особенности, разновидности, 40.63kb.
- Методические материалы, 3002.45kb.
- Курс для опытных администраторов unix, 67.69kb.
- Министерство Образования Российской Федерации. Юургу курсовая, 383.18kb.
- Программа курса «unix», 18.71kb.
- Лабораторная работа №1. Командный интерпретатор, 418.36kb.
- The design of the unix operating system by Maurice, 9215.6kb.
- Разработка автоматизированной системы мониторинга аппаратного и программного обеспечения, 20.06kb.
- Лекція 6 "Інформатика та комп'ютерна техніка" Тема Сервісні та прикладні програми Види, 55.04kb.
ременные режима инициализируются для разблокирования файлов. Строка 21
разрешает возможность чтения группе пользователей и другим. Строка 22
разрешает мне возможность записи. Обратите внимание, что в командном
файле lock не происходит модификации битов x, s или t. Это сделано на-
меренно, поскольку бит x должен быть установлен только в случае, если
файл может быть исполняемым. Для каталогов бит x должен быть установ-
лен только в случае, если вы хотите, чтобы другие пользователи могли
заходить в этот каталог. Мы также никогда не устанавливаем возможность
записи для группы пользователей и для других пользователей, но мы отк-
лючаем ее при блокировании файлов. Это дополнительная мера предосто-
рожности на случай, если файл имеет установленными такие права доступа
к нему, которые мы по каким-то причинам не желаем оставлять.
В строках 25 и 26 выполняется команда chmod. Параметр $@ исполь-
зован как обозначение всех имен файлов, указанных в командной строке.
Такой способ позволяет вам вызывать lock с несколькими именами файлов.
Из последних шести глав вы должны приобрести множество идей о
том, как можно обезопасить среду, в которой вы работаете, как иметь
дело с другими пользователями и вообще более продуктивно использовать
ваш рабочий день. Мы готовы двигаться дальше в понимании системы UNIX
и исследовании внутренней работы файловой системы, устройств и комму-
никаций.
* ГЛАВА 7. Устройства и файловые системы *
ТЕРМИНАЛЬНЫЕ УСТРОЙСТВА
РАБОТА С КЛАВИАТУРОЙ
ФАЙЛЫ termcap
ДИСКОВЫЕ УСТРОЙСТВА
ФАЙЛОВЫЕ СИСТЕМЫ
ЗАГРУЗОЧНЫЙ ДИСК
РАЗМЕРНЫЕ ПАРАМЕТРЫ
c Быстрая очистка экрана
mntf Монтирование гибкого диска в системном дереве
mntlook Поиск всех монтированных файловых систем
umntsys Размонтирование всех файловых систем, кроме
корневой
lrgf Создание файла максимального размера,
допустимого в вашей системе
УСТРОЙСТВА И ФАЙЛОВЫЕ СИСТЕМЫ
ВВЕДЕНИЕ
Ниже уровня известной нам области файловых систем находится мир
устройств и их драйверов. В данной главе мы исследуем некоторые мето-
ды, необходимые для работы с терминалами, дисками и непосредственно
файловыми системами. Программное средство 'c' иллюстрирует доступ к
терминалу на примере операции быстрой очистки экрана. Следующие три
средства - mntf, mntlook и umntsys - имеют дело с монтированием и раз-
монтированием файловых систем. Наконец, средство lrgf позволит вам
проверить пределы емкости вашей файловой системы.
СИСТЕМА UNIX И АППАРАТУРА
Перед тем, как углубиться в сущность вопроса, давайте обсудим не-
которые элементарные факты, которые мы должны помнить при рассмотрении
всех составляющих системы UNIX. Сердцем аппаратуры является централь-
ный процессор (CPU), который исполняет инструкции, управляющие маши-
ной, и фактически осуществляет всю работу. Операционная система необ-
ходима для руководства работой, выполняемой центральным процессором, и
для обеспечения интерфейса между ним и ресурсами, требуемыми для того,
чтобы сделать что-то полезное: оперативной памятью, внешней памятью и
другими периферийными устройствами, такими как терминалы и принтеры.
Операционная система, особенно такая высокоразвитая, как UNIX,
имеет множество утилит и характерных особенностей, но сейчас речь не
об этом. Сердцем операционной системы (в данном случае UNIX) является
ядро (kernel). Ядро управляет процессами и руководит выполняемой рабо-
той. Оно также является своего рода мостом между аппаратурой и внешним
миром. В данной главе мы обратим внимание на основные взаимоотношения
между ядром, процессами и аппаратурой.
В конечном итоге система должна взаимодействовать с внешними уст-
ройствами. Наличие базовых знаний об устройствах весьма важно для пол-
ного понимания того, как UNIX общается с внешним миром.
При работе с машиной много времени тратится на передачу данных в
машину и из нее, а это значит, что необходимо иметь дело со множеством
различных типов устройств, каждое из которых имеет свой "характер" и
особенности.
К нашему счастью, UNIX был разработан так, чтобы облегчить управ-
ление данными и устройствами настолько, насколько это возможно. К на-
шему несчастью, имеется, по всей видимости, несократимый объем знаний,
которыми мы должны овладеть обязательно. На рис. 7-1 показана общая
структура операционной системы UNIX. Мы видим, что со стороны ядра об-
ращение ко всем внешним периферийным устройствам выполняется как к
файлам устройств. Каждый тип устройств имеет свой собственный драйвер
и специфическую архитектуру, но обращение к каждому устройству выпол-
няется одинаковыми методами. Мы увидим, как использовать различные
способы доступа к устройствам и определим, какие способы наиболее эф-
фективны.
Рис. 7-1
Модель среды системы UNIX
------------------------------------------------------------------------
+-----------+
| |
+------------+ | Магнитная |
| Принтер | | лента |
+------------+ +-----------+
/dev/lp0 lpn /dev/rmt0 .../dev/rmtn
\ | | /
\ | | /
\ | | /
\ \ | | | | / /
+-------------------+------- /dev/fd0
fd:1,2 | +-------------+ |--- +-----------+
/dev/tty00----| | ПРОЦЕССОР | | |Гибкий диск|
+--------+ -- | | ЯДРО | |--- +-----------+
| | / | +-------------+ |-------- fdn
| Экран | +-------------------+
+--------+ / / | | | \ \
+--------+ / | \
|Клавиат.| ttynn /dev/hd01 hdnn
+--------+ +----------+
fd:0 | |
| Жесткий |
| диск |
| |
+----------+
------------------------------------------------------------------------
UNIX обращается к периферийным устройствам через "специальные
файлы". Имеется два типа специальных файлов: блочные и символьные. Оба
типа имеют свое предназначение и особенности. Блочный (например,
/dev/hd0) использует буферизацию и позволяет получить доступ к большим
объемам данных на жестком диске. Символьный (например, /dev/tty00 или
/dev/rfd0) не использует значительную буферизацию, а выполняет обмен с
устройством по одному символу за обращение. Даже несмотря на особые
свойства таких файлов, для них поддерживается все тот же механизм за-
щиты, что и для всех других файлов в системе.
Первая область, которую мы рассмотрим - терминальные устройства и
работа с ними. Представленные программы включают в себя средство под
названием 'c' для быстрой очистки экрана, а также пример программы,
которая считывает значения нажатых клавиш и выполняет опрос нажатия
одной клавиши. Мы также рассмотрим пример файла описания терминала
(termcap), который обеспечивает доступные определения характеристик
терминала.
Затем мы рассмотрим дисковые устройства - жесткие и гибкие диски.
Мы увидим, что имеются различные способы просмотра разделов диска с
использованием файлов устройств.
В дополнение к работе с устройствами мы рассмотрим файловые
системы на жестком диске. Всем нам известно, что система UNIX сущест-
венно ориентирована на диски, поэтому чем больше мы знаем о файловых
системах, тем лучше для нас. Для более полного понимания разделов
диска и файловых систем мы представим три программных средства.
Средство lrgf проверяет граничные значения параметров файловой системы
путем создания файла наибольшего возможного размера в вашей системе.
Средство mntf обеспечивает удобный способ монтирования и размонтирова-
ния гибких дисков. Наконец, средство mntlook выполняет поиск немонти-
рованных файловых систем, которые представляют собой потенциальную
опасность.
ТЕРМИНАЛЬНЫЕ УСТРОЙСТВА
Драйверы терминальных устройств являются одними из самых сложных
драйверов устройств. Причина этого заключается в том, что существует
множество уровней программного обеспечения, которые поддерживают ха-
рактеристики интерактивных терминалов. При работе терминала по после-
довательной линии связи необходима мощная поддержка для того, чтобы
облегчить его использование. Различные установки, которые может иметь
терминал, программируются командами stty(1) и ioctl(2). Команда
termio(7) также описывает различные аспекты протокола работы термина-
ла.
ПРОТОКОЛ ОПЕРАЦИЙ ВВОДА/ВЫВОДА ТЕРМИНАЛА
Протокол работы терминала представляет собой согласованный набор
сигналов, позволяющих системе правильно интерпретировать вводимые с
клавиатуры строки. Протокол необходим по четырем причинам. Первой яв-
ляется поддержка входной обработки специальных символов, таких как
символы удаления и прекращения работы программы. Во-вторых, нам необ-
ходимо поддерживать обработку выводимой информации, например, вставку
символов задержки или изменение последовательности возврат каретки/пе-
ревод строки. Третьей причиной является поддержка режимов необработан-
ного и "канонического" ввода. Эти два режима позволяют пользова-
тельским программам получать данные или по одному символу, или по од-
ной строке. Последняя причина введения терминального протокола - жела-
ние сделать так, чтобы пользователь мог сам изменять параметры конфи-
гурации терминала.
Содержимое терминальной подсистемы показано на рис. 7-2. Рисунок
разбит на три части: слева - область пользователя, посредине - область
ядра и справа - область устройства. Этот рисунок показывает, как пере-
даются данные между терминалами и программами пользователя.
Рис. 7-2.
Управление протоколом терминала
------------------------------------------------------------------------
Область Область ядра Область
пользователя устройства
Процесс
+-------+ : :
|Текст | : +--------+ +--------+ +-------+ : dzrint()
|-------| : ttread() |канонич.| canon()|необраб.| ttin()|приемн.| : +-----+
|Данные | : /---|очередь |<-------|очередь |<------|буфер |<--|dbuf |
| | : / +--------+ +--------+ / +-------+ : | |
| +----+| : / структура структура / структура : +-----+
| |ubuf||<---/ clist clist / ccblock :
| +----+| : / :
| +----+| : +--------- / ttxput() :
| |ubuf||---- | :
| +----+| : \ +-------+ <--+ +--------+ : +-----+
|-------| : \ |выходн.| |буфер | : |dbuf |
|Стек | : \--->|очередь|------->|передачи|------------------->| |
| | : +-------+ ttout()+--------+ dzxint() : +-----+
+-------+ : ttwrite() структура структура :
clist ccblock /|\
|
------+
Граница драйвера
устройства
-------------------------------------------------------------------
Когда какой-либо процесс читает символы с устройства, данные на-
чинают двигаться от буфера драйвера устройства, который называется
dbuf. Из этого буфера данные попадают в приемный буфер, управляемый
ядром. Приемный буфер читается подпрограммой ядра с именем ttin(), и
данные помещаются в структуру clist, называемую необработанной оче-
редью. (Слово "необработанная" означает, что над символами пока что не
производилось никакой обработки.) В то же время символы также помеща-
ются в выходную очередь, что позволяет системе выполнять эхо-отображе-
ние символов по мере их ввода.
После этого подпрограмма canon() превращает необработанную оче-
редь в каноническую. ("Каноническая" означает применение правил, кото-
рые в данный момент установлены системой для выполнения специальных
функций над строкой текста, например для обработки символа удаления.)
Такая обработка позволяет преобразовать данные перед тем, как их полу-
чит процесс пользователя. Последней подпрограммой является ttread(),
которая читает символы из канонического буфера в буфер пользова-
тельского процесса в области данных процесса.
Когда символы записываются из процесса пользователя на терминал,
они проделывают почти такой же маршрут в обратном направлении: от об-
ласти процесса к области драйвера устройства. Основное отличие в подп-
рограмме записи заключается в том, что эти данные проходят на один бу-
фер меньше. От процесса пользователя символы передаются в выходную
очередь ядра подпрограммой ttwrite(), а затем в буфер передачи с по-
мощью подпрограммы ttout(). Из буфера передачи они пересылаются не-
посредственно в приемный буфер драйвера устройства с помощью подпрог-
раммы dzxint().
ОПРЕДЕЛЕНИЕ ВВОДИМЫХ СИМВОЛОВ
Бывает так, что мы хотим увидеть, какие символы вводятся с клави-
атуры. Мы могли бы для этого написать программу, но UNIX предоставляет
встроенную возможность для этой цели.
Это команда od - восьмеричный дамп (octal dump). Такое название
осталось еще с тех давних времен, когда восьмеричное исчисление широко
применялось при отладке. К счастью, результат работы команды od можно
получить в символьном, шестнадцатиричном или десятичном виде. Фокус
использования команды od для проверки входных и выходных значений зак-
лючается в том, что od читает стандартное устройство ввода по умолча-
нию, если не указан файл. Например, вызов
$ od -cx
test string
d
d
даст такой результат:
------------------------------------------------------------------------
|
| 0000000 6574 7473 7320 7274 6e69 0a67
| t e s t s t r i n g \n
| 0000014
| $
|
Здесь вызов команды od делается без указания имени файла в ко-
мандной строке и с применением стандартного вывода в качестве выводно-
го устройства. Мы используем опцию -cx для того, чтобы байты интерпре-
тировались как символы ASCII, а соответствующие 16-битовые слова отоб-
ражались в шестнадцатиричном виде. По мере того, как вы набираете сим-
волы, они отображаются на экране, а команда od сохраняет их в своем
буфере. В конце строки нажмите возврат каретки, затем CTRL-D. Ввод
CTRL-D завершает чтение символов командой od и выдает распечатку, в
которой сверху будут шестнадцатиричные значения, а снизу символы в ко-
де ASCII.
Обратите внимание, что два символа, выводимые для каждого шест-
надцатиричного слова, располагаются в обратном порядке по сравнению с
двумя байтами, образующими это слово. Например, слово 6574 интерпрети-
руется как два символа, t и e, где 65 - код ASCII для символа e, а 74
- ASCII-код для символа t. Для того чтобы выйти из команды od, введите
еще один CTRL-D для прекращения блочного чтения. Если вы хотите еще
проверять символы, продолжайте их вводить. Команда od работает
несколько загадочно. Если вы введете достаточное количество символов,
она выдаст на экран информацию по нажатию только лишь возврата карет-
ки. Но если вы ввели всего несколько символов, требуется нажатие как
возврата каретки, ТАК И CTRL-D для получения результата на экране.
Теперь мы можем сделать один фокус - изменить канонический способ
обработки при чтении символов командой od. Это позволит нам увидеть
эффект от различных установок протокола работы. Для этого проверьте
текущие установки вашего терминала. В версии System V используйте ко-
манду "stty -a", а в версии Berkeley вам нужно применить команду "stty
everything". System V выдает гораздо больше параметров, чем Berkeley.
(Наиболее популярные версии UNIX'а разработаны и поддерживаются следу-
ющими фирмами: System V - фирмой AT&T Bell Laboratories, которая в
настоящее время называется Unix System Laboratories; BSD (Berkeley
Software Distribution) - Калифорнийским университетом в Беркли; XENIX
- фирмой Microsoft.- Прим. перев.) Ниже приводится пример из XENIX:
------------------------------------------------------------------------
|
| speed 9600 baud; line = 0;
| intr = DEL; quit = |; erase = h;
| kill = u; eof = d; eol = `
| parenb -parodd cs7 -cstobp hupcl cread -clocal
| -ignbrk brkint ignpar -parmrk -inpck istrip -inlcr -igncr icrnl -iuclc
| ixon ixany -ixoff
| isig icanon -xcase echo echoe echok -echonl -noflsh
| opost -olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel ff1
|
После того, как мы почешем голову, мы увидим, что текущий флаг
для канонической обработки установлен в состояние "icanon". То есть,
мы можем видеть, что он включен, поскольку нет префикса в виде знака
минус (хотя это не является строгим правилом).
Что происходит при канонической обработке? Символ возврата на шаг
назад (backspace) является одним из важных вопросов. Когда вы вводите
символ CTRL-H, он поступает в необработанную очередь как литеральный
символ CTRL-H. Когда программа canon() читает CTRL-H, она понимает это
так: "Изменить CTRL-H на символ возврата на шаг назад, записать пробел
на место символа, затем сделать еще шаг назад." При эхо -отображении
вы получаете удаление символа на экране. Когда каноническая обработка
отключена, вы посылаете CTRL-H как обычные символы. Вот пример того,
как это выглядит:
------------------------------------------------------------------------
|
| $ stty -icanon Отключение канонической обработки
| $ od -cx
| test stringhhhhhhcase
| d...
|
| 0000000 6574 7473 7320 7274 6e69 0867 0808 0808
| t e s t s t r i n g \b \b \b \b \b
| 0000020 6308 7361 0a65 0a04 0a0a 0a0a 0a0a 0a0a
| \b c a s e \n 004 \n \n \n \n \n \n \n \n \n
|
После слова "string" вы видите группу чисел 08, которые в
ASCII-коде обозначают CTRL-H. Эти числа 08 показывают вам, что лите-
ральные символы CTRL-H действительно присутствуют в их "необработан-
ной" форме. Поскольку CTRL-H не является больше специальным символом,
команда od рассматривает его подобно любому другому символу. Здесь
возникает новая проблема: поскольку специальные символы не распозна-
ются, мы потеряли возможность завершить блочное чтение вводом символа
конца файла (EOF). Когда вводится CTRL-D, он понимается просто как еще
один символ. Поэтому мы должны заполнить буфер команды od, чтобы
заставить ее выполнить дамп. В нашем примере CTRL-D - это символ 004
после символов case \n.
Кстати, в системе Berkeley используются установки "обработанная"
("cooked") и "необработанная" ("raw") для stty, которые по существу
служат для тех же целей, что "canon" и "-canon" в System V.
ДИНАМИЧЕСКОЕ ПЕРЕОПРЕДЕЛЕНИЕ СИМВОЛОВ ПРЕРЫВАНИЯ
Обратите внимание, что в предыдущей распечатке команды stty -a
присутствуют определения символов "intr" и "quit". Это две функции,
которые прерывают работу ваших работающих процессов. Строки intr и
quit представляют собой особые функции, а не просто нажатие клавиши.
Эти функции можно назначить на любую клавишу клавиатуры при помощи ко-
манды stty.
Если мы изменили значение "intr" на другой символ, то этот новый
символ прервет ваши процессы. Вы даже можете установить в качестве
клавиши прерывания обычный символ. Вот как это можно сделать:
$ stty intr x
$ this is a junk stringx
$
Когда вы вводите символ x в конце строки, то вся введенная строка
обрывается и вы получаете новый символ приглашения. Для того чтобы
вернуться к обычному режиму работы, введите в качестве символа преры-
вания старый символ. Если старым символом был "delete", вы даете такую