Пристрої UNIX

В огляді з попереднього розділу був пропущений каталог / dev, тому що файли, що знаходяться в ньому, самі в деякому роді представляють

огляд всіх існуючих файлів Як видно з назви, / dev містить файли пристроїв

Одна з найбільш вдалих ідей в системі UNIX полягає в способі роботи з периферійними пристроями – дисками, магнітними стрічками, принтерами, терміналами і т п Замість того щоб використовувати спеціальні підпрограми для роботи, наприклад, з магнітними стрічками, система звертається до файлу / dev/mt0 (як завжди, імя може відрізнятися) Всередині ядра звернення до цього файлу транслюються в команди роботи з стрічкою, тому програма, що виконує читання / dev/mt0, отримує дані зі змонтованої в даний момент стрічки Наприклад, команда

$ cp /dev/mt0 junk

копіює вміст стрічки у файл з імям junk Команду cp НЕ інте ресуют особливості файлу / dev/mt0, для неї це просто послідовність байтів

Файли пристроїв – як мешканці зоопарку, кожен має свої особливості, але основні ідеї файлової системи застосовні до всіх Ось невеликий фрагмент каталогу / dev:

$ ls -l /dev

crw––w––w–  1 root           0,    0 Sep 27 23:09  console crw–r––r––  1 root           3,    1 Sep 27 14:37  kmem crw–r––r––  1 root           3,    0 May    6   1981 mem brw–rw–rw–  1 root           1,  64 Aug  24 17:41  mt0 crw–rw–rw–  1 root           3,    2 Sep 28 02:03  null crw–rw–rw–  1 root           4,  64 Sep   9 15:42  rmt0

brw–r––––– 1 root

2,

0 Sep   8  08:07  rp00

brw–r––––– 1 root

2,

1 Sep 27  23:09  rp01

crw–r––––– 1 root

13,

0 Apr  12    1983  rrp00

crw–r––––– 1 root

13,

1 Jul  28  15:18  rrp01

crw–rw–rw–  1 root

2,

0 Jul    5  08:04  tty

crw––w––w–  1 you

1,

0 Sep 28  02:38  tty0

crw––w––w–  1 root

1,

1 Sep 27  23:09  tty1

crw––w––w–  1 root

1,

2 Sep 27  17:33  tty2

crw––w––w–  1 root

1,

3 Sep 27  18:48  tty3

$

У першу чергу слід звернути увагу на те, що замість довжини файлу присутні два цілих числа, а перший символ в рядку прав доступу завжди b або c Таким способом команда ls показує, що запис індексного дескриптора відноситься до пристрою, а не до звичайного файлу Індексний дескриптор звичайного файлу містить список дискових блоків, в яких зберігається вміст файлу У індексному дескрипторі файлу пристрою міститься внутрішнє імя пристрою, що складається з позначення типу символу c длясимвольного або b дляблочного, І пара чисел, які називаються старшим і молодшим номерами пристрою Диски і стрічки є блочними пристроями, а все ос-

тальні – термінали, принтери, телефонні лінії і т д – символьними Старший номер визначає тип пристрою, а молодший позначає конкретний екземпляр пристрою Наприклад, / dev/tty0 та / dev / tty1 – Це два порти контролера терміналу і тому вони мають однакові старші номери і різні молодші номера

Файли дисків зазвичай отримують імена відповідно до маркою пристрою Так, файли пристроїв для диска DEC RP06 називаються / dev / rp00 та / dev/rp01 Насправді це одна фізична пристрій, логічно розділене на дві файлові системи Якщо в системі при сутствует другий жорсткий диск, то його файли пристрої отримують імена / dev/rp10 та / dev/rp11 Перша цифра позначає номер фізичної диска, а друга – номер логічного розділу

Може виникнути питання, чому використовується не один файл дискового пристрою, а декілька Історично склалося так, що файлова система складається з окремих підсистем, крім того, це полегшує її супровід Доступ до файлів підсистеми здійснюється через каталоги основної системи Програма / etc / mount показує відповідність файлів пристроїв і каталогів:

$ /etc/mount

rp01  on /usr

$

У даному випадку коренева система розміщується на пристрої / dev/rp00 (хоча / etc / mount про це не повідомляє), а призначена для користувача файлова система – файли каталогу / usr і його підкаталоги – на пристрої /dev/ rp01

Коренева файлова система необхідна для роботи операційної системи Каталоги / bin, / dev і / etc завжди знаходяться в кореневій файловій системі, так як це єдина файлова система, доступна при завантаженні, і в ній зберігаються файли, які беруть участь у запуску опера ційної системи, такі як / bin / sh У процесі початкового завантаження перевіряється цілісність всіх файлових систем (див icheck (8) або fsck (8)), після чого вони приєднуються до кореневої системи Операція приєднання називається монтуванням і являє собою програмний аналог установки нового диска в дисковод, для її виконання необхідні повноваження супер Після того як пристрій / dev/rp01 змонтовано в каталог / usr, файли користувальницької файлової системи доступні так само, як якщо б вони входили в кореневу файлову систему

Зазвичай користувачеві немає необхідності замислюватися про те, куди змонтована кожна з файлових систем, ходячи тут є два істотні моменти По-перше, заборонено створення посилань на фай ли, розташовані в інших файлових підсистемах, так як вони монтуються і размонтіруйте незалежно один від одного Наприклад, неможливо в призначеному для користувача каталозі / usr створити посилання на про-

граму, що знаходиться в / bin, так як ці каталоги належать різним файловим системам:

$ ln  /bin/mail /usr/you/bin/m

ln: Cross–device   link

$

Ще одна перешкода полягає в тому, що різні файлові систе ми можуть містити збігаються номери індексних дескрипторів

По-друге, файлові системи мають обмеження на розмір (кількість блоків, доступних для розміщення файлів) і кількість індексних дескрипторів Якщо підсистема заповнена, то неможливо збільшити файл, що не звільнивши попередньо дисковий простір Команда df (disc free space – вільний дисковий простір) показує кількість вільного місця в змонтованих файлових систе мах:

$ df

/dev/rp00 1989

/dev/rp01 21257

$

Тут / usr містить 21257 вільних блоків Багато це чи мало, залежить від того, як використовується система, вимоги до вільного простору можуть дуже сильно відрізнятися Між іншим, з усіх команд df, можливо, має найбільшу різноманітність вихідних форматів В інших системах результат її виконання може виглядати зовсім по-іншому

Звернемося тепер до більш корисним на практиці речам При реєстрації в системі користувачеві виділяється термінальна лінія, а отже, і файл пристрою в / dev, через який відбувається обмін символами

Команда tty виводить дані про термінал користувача:

$ who  am  i

you           tty0        Sep 28 01:02

$ tty

/dev/tty0

$ ls -l /dev/tty0

crw––w––w–  1 you            1,  12 Sep 28 02:40  /dev/tty0

$ date &gt/dev/tty0

Wed  Sep 28 02:40:51  EDT  1983

$

Зверніть увагу, що пристрій належить вам, і тільки ви маєте дозвіл на його читання Іншими словами, ніхто не може стежити безпосередньо за тим, що вводиться з клавіатури Водночас, висновок на термінал користувача доступний всім Цього можна уникнути, змінивши командою chmod права доступу до пристрою, – тоді

інші користувачі не зможуть надіслати вам повідомлення командою write

Також для цієї мети можна виконати команду mesg

$ mesg n Вимкнути виведення повідомлень

$ ls -l /dev/tty0

crw––––––– 1 you            1,  12 Sep 28 02:41  /dev/tty0

$ mesg y Відновити

$

Часто виникає необхідність звернутися до свого терміналу по імені Щоб не займатися його пошуками, можна використовувати пристрій / dev / tty, яке є синонімом поточного терміналу, незалежно від його справжнього імені

$ date &gt/dev/tty

Wed  Sep 28 02:42:23  EDT  1983

$

Особливо зручно пристрій / dev / tty для організації взаємодії з користувачем, коли стандартний введення і виведення перенаправлені в файли Однією з програм, що використовують / dev / tty, є crypt Відкритий текст зчитується зі стандартного вводу, зашифровані дані виводяться в стандартний висновок, а ключ для шифрування crypt отримує з / dev / tty:

$ crypt &ltcleartext  &gtcryptedtext

Enter  key:                                          Введіть ключ для шифрування

$

Тут немає явного згадування пристрої / dev / tty, але, тим не менше, воно використовується Ключ не може бути отриманий з стандартного вводу, оскільки той призначений для читання вихідного файлу Тому команда crypt відкриває файл / dev / tty і зчитує звідти ключ, відключивши автоматичний луна-висновок, тому ваш шифруючий ключ не зявляється на екрані У розділах 5 і 6 будуть розглянуті ще кілька застосувань /dev/tty

Припустимо, користувачеві потрібно запустити програму, але її висновок користувача не цікавить Наприклад, він вже знає сьогоднішні новини і не хоче читати їх знову

Висновок команди news можна виключити, перенаправивши його в пристрій

/dev/null:

$ news &gt/dev/null

$

Дані, що виводяться в / dev / null, пропадають без будь-яких коментарів, а при спробі введення з / dev / null програма негайно отримує ознака кінця файлу, так як операція читання повертає нуль байт

Часто / dev / null служить для того, щоб виділити з вихідних даних програми діагностичні повідомлення Наприклад, команда time (ti-me (1)) показує використання процесора програмою Ця інформація направляється в стандартний висновок помилок, що дозволяє хронометрировать програми з великим обємом виведення, направляючи його в / dev / null:

$ ls -l /usr/dict/words

–r––r––r––  1 bin        196513 Jan  20   1979  /usr/dict/words

$ time  grep  e /usr/dict/words  &gt/dev/null

real

130

user

90

sys

27

$ time  egrep  e /usr/dict/words &gt/dev/null

real

80

user

39

sys

28

$

Значення, що виводяться командою time, показують загальний час виконання, процесорний час, витрачений програмою, і процесорний час, витрачений ядром Команда egrep – це більш швидкий варіант grep, який буде розглянутий у розділі 4 при пошуку у великих фай лах egrep працює приблизно вдвічі швидше Якщо висновок grep і egrep НЕ перенаправити у файл або в / dev / null, то доведеться чекати закінчення виводу на термінал сотень тисяч символів, щоб отримати потрібну інформацію

Вправа 29Вивчіть інші файли каталогу / dev в розділі 4 керівництва У чому різниця між / dev/mt0 та / dev/rmt0 Поясніть можливі переваги використання підкаталогів в / dev для дисків, стрічок і т п ~

Вправа 210Стрічки, записані в системах, відмінних від UNIX, часто мають різні розміри блоків, наприклад 800 байт – для десяти 80-символьних перфокарт, але стрічкове пристрій / dev/mt0 розраховане на блоки довжиною 512 байт Вивчіть команду dd (dd (1)), використовувану при читанні таких стрічок ~

Вправа 211Чому пристрій / dev / tty не реалізоване як си лан ка на термінал, з якого виконувалася реєстрація Що станеться, якщо встановити йому права доступу rw – w – w-, як у поточного терміналу ~

Вправа 212Як працює write (1) Підказка: див utmp (5) ~

Вправа 213Як визначити, що користувач недавно працював з терміналом ~

Історія та бібліографія

Файлової системи присвячена одна з частин дослідження «UNIX implementation» (Реалізація UNIX) Кена Томпсона (Ken Thompson), виданого в BSTJ (Bell System Technical Journal) у липні 1978 року Док лад Денніса Рітчі (Dennis Ritchie) «The evolution of the UNIX timesharing system» (Еволюція поділу часу в UNIX), зроблений на симпозіумі з розробки мов та методології програмування (Symposium on Language Design and Programming Methodology) в Сіднеї (Австралія) в вересні 1979 року, представляє прекрасний опис того, як була спроектована і реалізована файлова система в першу ОС UNIX на PDP-7 і як вона доросла до сьогоднішнього стану

Файлова система UNIX увібрала в себе деякі ідеї з системи MULTICS Ця система всебічно розглянута в праці «The MULTICS System: An Examination of its Structure» (Система MULTICS: Дослідження структури) Органіка (EI Organick), виданому MIT Press в 1972 році

У статті «Password security: a case history» (Безпека паролів: наочна ілюстрація) Боба Морріса (Bob Morris) і Кена Томпсона приведено цікаве порівняння механізмів паролів на ряді систем про нього розказано в другому томі керівництва по UNIX для програміста)

Надрукована в тому ж томі стаття Денніса Рітчі «On the security of UNIX» (Про безпеку в UNIX) пояснює, чому безпека системи більше залежить від грамотного адміністрування, ніж від використання програм типу crypt

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*