Файлу какого типа соответствует строка атрибутов crw rw

Обновлено: 03.07.2024

В традиционной модели файловой системы UNIX и Linux каждому файлу соответствует набор из девяти битов режима. Они определяют, какие пользователи имеют прав читать файл, записывать в него данные или запускать его на выполнение. (Права доступа к файлу, отображаемые командой ls для символической ссылки lrwxrwxrwx представляют собой фиктивные значения. Права на создание, удаление или разрешение ссылки управляются содержащим ее каталогом, в то время как права чтения, записи или выполнения для файла, указываемого ссылкой, предоставляются собственными правами целевого файла. Следовательно, символическая ссылка не нуждается (и не обладает) ни в какой собственной информации о правах доступа.)Вместе с другими тремя битами, которые в основном влияют на работу исполняемых файлов, этот набор образует код, или режим, доступа к файлу.

Двенадцать битов режима хранятся вместе с четырьмя дополнительными битами, определяющими тип файла. Эти четыре бита устанавливаются при создании файла и не подлежат изменению. Биты режима могут изменяться владельцем файла или суперпользователем с помощью команды chmod ("change mode" — изменить режим). Просмотр значений этих битов осуществляется с помощью команды ls -i (или ls -id в случае каталога). Пример приведен далее.

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

Код доступа удобно записывать в виде восьмеричного числа, так как каждая цифра в нем представляется тремя битами. Три старших бита (в коде доступа им соответствуют восьмеричные значения 400, 200 и 100) служат для управления доступом к файлу его владельца. Вторые три бита (40, 20 и 10) задают доступ для членов группы. Последние три бита (4, 2 и 1) определяют доступ к файлу остальных пользователей. Старший бит каждой триады — это бит чтения, средний — бит записи, младший — бит выполнения.
комментарий:
три бита пронумерованы соотвественно 2 1 0. нумерация справа налево. адрес означает степень числа 2.
число 7 имеет в двойчной системе вид : 111. получаем: 1*2^2 + 1*2^1 +1*2^0 = 4 + 2 + 1 = 7
число 4 имеет в двойчной системе вид : 100. получаем: 1*2^2 + 0*2^1 +0*2^0 = 4 + 0 + 0 = 4
эти биты соотвественно означают r w x - Read Write eXecute - чтение запись(изменение, удаление) исполнение
разберем популярные значения
755 - 111 101 101 - вледельцу разрешено все, членам группы и остальным запрещена запись
644 - 110 100 100 - владельцу разрешены чтение и запись, членам группы и остальным - только чтение

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

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

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

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

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

Команда ls: просмотр атрибутов файла

Файловая система хранит для каждого файла около сорока информационных полей; большая часть из них используется самой файловой системой. Администратора, в основном, интересует количество жестких ссылок, владелец, группа, код доступа, время последнего обращения и последней модификации, размер и тип файла. Всю эту информацию можно получить с помощью команды ls -1 (или команды ls -id в случае каталога; без флага -d команда ls перечисляет содержимое каталога).

Для каждого файла хранится также время последнего изменения атрибутов. Традиционное название этого поля ("ctime" от "change time" — время изменения) многих вводит в заблуждение, так как они полагают, что это время создания файла. На самом деле здесь зафиксировано время последнего изменения одного из атрибутов файла (владелец, код доступа и так далее), но не его содержимого.

$ ls -1 /bin/gzip
-rwxr-xr-x 3 root root 62100 May 28 2010 /bin/gzip
В первом поле задается тип файла и режим доступа к нему. Поскольку первый символ — дефис, значит, перед нами обычный.

Следующие девять символов — это три набора битов режима. Порядок наборов таков: владелец, группа, другие пользователи. В листинге команды ls биты режима представляются буквами г, w и х (чтение, запись и выполнение). В показанном примере владелец имеет все права доступа к файлу, а остальные пользователи — только право на чтение и выполнение. Если бы был установлен бит setuid, то вместо буквы х, обозначающей право владельца на выполнение, стояла бы буква s. В случае бита setgid вместо буквы х для группы тоже была бы указана буква s. Последний бит режима (право выполнения для других пользователей) представляется буквой t, когда для файла задан sticky-бит. Если бит setuid/setgid или sticky-бит установлен, а надлежащий бит выполнения — нет, эти биты представляются символами Бит, что указывает на игнорирование данных атрибутов вследствие ошибки.

Второе поле листинга представляет собой счетчик ссылок на файл. В данном случае здесь стоит цифра 3, свидетельствующая о том, что /bin/gzip — одно из трех имен файла (два других — /bin/gunzip и /bin/zcat). Каждый раз при создании жесткой ссылки на файл этот счетчик увеличивается на единицу. Символические ссылки в счетчике не учитываются.

Любой каталог имеет минимум две жесткие ссылки: из родительского каталога и из специального файла "." внутри самого каталога.

Следующие два поля определяют владельца и группу файла. В данном примере файл принадлежит пользователю root и одноименной группе. В действительности ядро хранит эти данные не в строковом виде, а в виде идентификаторов. Если символьные версии идентификаторов определить невозможно, в этих полях будут отображаться числа. Так происходит, когда запись пользователя или группы была удалена из файла, соответственно, /etc/passwd или /etc/group. Не исключено также, что возникла ошибка в базе данных NLS или LDAP, если она используется.

В следующем поле отображается размер файла в байтах. Рассматриваемый файл имеет размер 62100 байт. Далее указана дата последней модификации файла: 28 мая 2010 г. В последнем поле листинга приведено имя файла: /bin/gzip.

Для файла устройства команда ls выдает несколько иную информацию.

$ ls -1 /dev/ttyO
crw-rw---1 root root 4, 0 Jun 11 20:41 /dev/ttyO
Большинство полей те же, но вместо размера в байтах показаны старший и младший номера устройства. Имя /dev/ttyO относится в данной системе (Red Hat) к первой виртуальной консоли, управляемой драйвером устройства 4 (драйву терминала).

При поиске жестких ссылок может пригодиться команда ls -i, отображающая для каждого файла номер его индексного дескриптора. Не вдаваясь в детали реализации файловой системы, скажем, что этот номер представляет собой индекс таблицы, в которой перечислены все файлы системы. Именно на индексные дескрипторы ссылаются файловые записи каталогов. Жесткие ссылки, указывающие на один и тот же файл, будут иметь одинаковый номер. Для того чтобы составить представление о "паутине" ссылок, воспользуйтесь командой ls -li для определения числа ссылок и номера индексного дескриптора какого-нибудь файла, а затем поищите его "двойников" с помощью команды find.

Другими важными опциями команды ls являются -а, отображающая все записи в каталоге (даже те файлы, имена которых начинаются с точки), -t, выполняющая сортировку файлов по времени изменения (или -tr, осуществляющая сортировку в обратном хронологическом порядке), -F, отображающая имена файлов с выделением каталогов и исполняемых файлов, -R, выводящая рекурсивный список, и -h, которая отображает размеры файлов в удобной для человеческого восприятия форме (например, 8К или 53М).

Команда chmod: изменение прав доступа

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

Первым аргументом команды chmod является спецификация прав доступа. Второй и последующий аргументы — это имена файлов, права доступа к которым подлежат изменению. При использовании восьмеричной формы записи первая цифра относится к владельцу, вторая — к группе, а третья — к другим пользователям. Если необходимо задать биты setuid/setgid или дополнительный бит, следует указывать не три, а четыре восьмеричные цифры: первая цифра в этом случае будет соответствовать трем специальным битам. Символ u ("wser") обозначает владельца файла, g ("group") — группу, о ("others") — других пользователей, а ("") — всех пользователей.

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

$ chmod -R g+w mydir
добавляет групповое право записи к каталогу mydir и его содержимому, не затрагивая остальные права.

При установке битов выполнения будьте осторожны с выполнением команды chmod -R. Ведь применительно к каталогу и файлу бит выполнения интерпретируется по-разному. Поэтому вряд ли реальный результат выполнения команды chmod -R а-х будет соответствовать ожидаемому вами.

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

Идентификатор администратора системы (пользователя root ) равен:

(1) Аппаратно реализованная часть загрузки системы, в отличие от вторичного загрузчика, реализованного программно

(2) Программа, записанная в ПЗУ, определяющая местонахождение и тип операционной системы

(3) Программа, работающая со стартовым виртуальным диском, в отличие от вторичного загрузчика, работающего с полным вариантом системы

(4) Маленькая программа в заранее известном месте диска, задача которой — найти и загрузить вторичный загрузчик

(1) Любой тип объектов файловой системы, кроме собственно файлов и каталогов

(2) Особый объект файловой системы, называемый также символьным устройством

(3) Класс объектов файловой системы, обмен данными с которыми не приводит к обращению к содержимому какого-либо определённого файла

(1) Полностью определяет состояние работающей системы

(2) Полностью определяет поведение системы на данном пользовательском наполнении

(4) о размере и атрибутах каждого файла, принадлежащего пакету

Разделение сетевых протоколов на уровни не позволяет

(1) Интерпретировать данные более высокого уровня независимо от того, каким способом они были получены на более низком уровне

(2) Одновременно обмениваться данными посредством нескольких различных сред передачи данных

(3) Передавать несколько пакетов более высокого уровня в одном пакете более низкого уровня

(4) Передавать один пакет более высокого уровня с помощью нескольких пакетов более низкого уровня

Какой параметр сети можно задавать с помощью утилиты ifconfig ?

(4) Список интерфейсных адресов абонентов локальной сети

В оконном интерфейсе субъектом с точки зрения системы является

(3) задача, выводящая и вводящая данные в рамках окна

Для редактирования «плоского» текста на удалённом компьютере пользователю потребуется

(2) Клиент Secure Shell на рабочей станции и текстовый редактор ( vim , ncedit или joe ) на удалённом компьютере

(3) Любой текстовый редактор на рабочей станции, имеющий встроенный сервер Secure Shell

(1) указать, кто является обладателем всех прав на это программное обеспечение

(2) определить круг прав пользователя по отношению к этому программному обеспечению

(3) определить, на каких условиях можно продавать данное программное обеспечение

(4) сделать данное программное обеспечение свободным

Основное средство взаимодействия пользователя и ОС Linux

(2) файл особого типа, содержащий ссылки на другие файлы и каталоги

(3) список подкаталогов следующего уровня вложенности

Уникальным идентификатором файла в файловой системе является:

(4) номер индексного дескриптора каталога, в котором находится файл

(3) UID и GID объекта, список GID, членом которых является хозяин объекта, тип объекта и его атрибуты

(1) программа, которая читает со стандартного ввода, а выводит на стандартный вывод

(2) связанная пара дескрипторов, где данные, записанные на входной дескриптор, сразу доступны для чтения с выходного

Управляющий символ “ ^W ” (удаление слова) действует на

(2) любой ввод с терминала, если не изменены настройки терминала

(3) любой ввод с терминала, только если программа использует библиотеку readline

(4) только ввод командной строки любого командного интерпретатора

(1) текст, который состоит только из печатных (отображаемых на экране) символов

(2) текст, в котором не содержится никакой метаинформации об оформлении

(3) формат файлов, который используется текстовыми редакторами

(1) Изменять настройки некоторой службы или последовательность выполнения некоторых сценариев без редактирования файлов

(2) Помещать все конфигурационные файлы и сценарии служб в один специальный каталог

(3) Изменять любые настройки службы без редактирования файлов

(4) Изменять содержимое конфигурационных файлов или стартовых сценариев, не редактируя их

(1) Любой раздел диска, указанный в расширенном разделе

(3) Любой раздел диска, кроме первого и расширенного разделов

(3) Большинства конфигурационных файлов и стартовых сценариев

(4) Любых файлов, не попадающих по классификации FHS в специальные каталоги /lib , /var , /bin и т. п.

Какие две из перечисленных ниже задач решаются на сетевом уровне семейства протоколов TCP/IP?

(2) построение пути данных от отправителя к получателю

Чем отличается «таблица» межсетевого экрана iptables от «цепочки»?

(1) Понятие «цепочка» использовалось только в предыдущей версии межсетевого экрана Linux — ipchains . В iptables его заменили более общим понятием «таблица»

(2) Таблицы и цепочки следуют попеременно в произвольном порядке; по действию ACCEPT пакет может покинуть таблицу, но не цепочку

(3) Цепочки iptables состоят из нескольких таблиц; покидая одну таблицу, пакет направляется в другую

(4) Таблицы iptables состоят из нескольких цепочек; покидая одну цепочку, пакет направляется в другую

(1) ко всем утилитам, которые могут быть запущены в Linux

(2) только к свободному UNIX-совместимому ядру, изначально написанному Линусом Торвальдсом

Какая из перечисленных команд не имеет отношения к справочной подсистеме Linux?

Какая из перечисленных строк не может быть именем файла:

Пользователь может управлять фоновым процессом с помощью

(1) предназначенный для совместного хранения файлов несколькими пользователями

(2) из которого пользователь не может удалить не принадлежащий ему файл

(3) в котором пользователь не может модифицировать не принадлежащий ему файл

(4) при просмотре которого пользователем выводятся только имена принадлежащих ему файлов

Что окажется записанным в файле grep.info после такой операции: info grep 2>&1 > grep.info ?

(1) в точности повторяет алгоритм обработки шаблонов

(2) основана на алгоритме обработки шаблонов, однако имеет отличия, связанные со спецификой работы с файлами

(3) использует упрощённый вариант алгоритма обработки шаблонов

(4) использует алгоритм «globbing», который, в отличие от генерации имён файлов в более ранних версиях shell, не основан на понятии «шаблон»

Как, редактируя текст в Vim/Vi, сохранить текст от курсора до конца текущей строки и записать сохранённый фрагмент в самый конец файла?

Команда [someone@localhost someone]$ who am i someone tty4 Oct 13 13:31 (localhost) отдана:

(1) пользователем localhost с любой виртуальной консоли;

(2) пользователем someone с любой виртуальной консоли;

(3) пользователем someone с четвёртой виртуальной консоли;

(1) Собирать файловые системы различных разделов в одно дерево каталогов

(2) Подключать к дереву каталогов содержимое файлов, данные ядра, каталоги на других компьютерах

(3) Использовать журналирование с файловыми системами, в которых оно не предусмотрено

(4) Использовать различные по скорости и надёжности способы доступа к различным подкаталогам

Способ ведения системных журналов Linux называется «централизованным», потому что

(2) С журналами работают различные программы, однако эта работа управляется единым файлом /etc/syslog.conf

Что означают понятия «клиент» и «сервер» на прикладном уровне TCP/IP?

(1) Клиент — тот, кто устанавливает соединение, сервер — тот, кто отвечает на него

(2) Клиент — тот, кто запрашивает данные, сервер — тот, кто передаёт их

(3) Сервер — тот, кто устанавливает соединение, клиент — тот, кто пользуется установленным соединением

(1) Регламентируют доступ к почтовому ящику, при этом SMTP не требует идентификации пользователя, а POP3, в отличие от IMAP4, поддерживает создание пользователем почтовых ящиков на сервере

(2) запуск пользовательского сценария .xinitrc , а при его отсутствии — системного сценария xinitrc

(3) настройку окружения, запуск X-сервера и диспетчера окон или рабочего стола

(4) запуск X-сервера и затем X-приложений, указанных в сценарии .xinitrc пользователя, системном сценарии xinitrc или в командной строке

При использовании алгоритмов сжатия звука «с потерей качества»

(2) Звучание исходного и сжатого файлов на слух неразличимо

(3) Из сжатого файла нельзя получить исходный, а искажения звука зависят от качества сжатия

(4) Достигается очень высокий процент сжатия, но получившийся файл неудобно передавать по каналам с ограниченной пропускной способностью из-за неравномерности сжатия

Необходимость в дистрибутивах Linux возникла, когда

(1) появились пользователи, желающие установить скомпилированное ядро Linux и набор утилит на свой компьютер

(2) появились пользователи, готовые купить операционную систему Linux

(4) немедленно после публикации первой версии ядра Linux

В каком каталоге содержатся файлы, которые не могут совместно использоваться несколькими компьютерами в сети:

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

К сожалению, иногда и обратное неверно: если производитель создаёт новое устройство, управлять которым нужно по-новому, а распознаётся оно как одно из старых, ошибки неизбежны. Многие стандарты внешних устройств предусматривают строгую идентификацию модели, однако хорошего мало и тут: незначительно изменив схемотехнику, производитель меняет и идентификатор, и устройство перестаёт распознаваться до тех пор, пока автор соответствующего модуля Linux не заметит это и не добавит новый идентификатор в список поддерживаемых.

Большинству распознанных устройств, если они должны поддерживать операции чтения/записи или хотя бы управления ( ioctl() , описанный ниже), соответствует файл-дырка в каталоге /dev или одном из его подкаталогов. В зависимости от того, выбрана ли в системе статическая или динамическая схема именования устройств, файлов-дырок в /dev может быть и очень много, и относительно мало. При статической схеме именования то, что ядро распознало внешнее устройство, никак не соотносится с тем, что в /dev имеется для этого устройства файл-дырка:

Здесь Мефодий попытался прочитать что-либо из устройства /dev/sdg14 , что соответствует четырнадцатому разделу SCSI-диска под номером семь. Такого диска в этой машине, конечно, нет, а файл-дырка для него заведён на всякий случай: вдруг появится? Поскольку появиться может любое из поддерживаемых Linux устройств, таких файлов «на всякий случай» в системе бывает и десять тысяч, и двадцать. Файл-дырка не занимает места на диске, однако использует индексный дескриптор, поэтому в корневой фаловой системе, независимо от её объёма, индексных дескрипторов должен быть изрядный запас.

При динамической схеме именования применяется специальная виртуальная файловая система, которая либо полностью подменяет каталог /dev , либо располагается в другом каталоге (например, /sys ), имеющем непохожую на /dev иерархизированную структуру; в этом случае файлы-дырки в /dev заводит специальная служба. Этот способ гораздо удобнее и для человека, который запустил команду ls /dev , и для компьютера (в случае подключения внешних устройств, например, съёмных жёстких дисков, «на лету»). Однако он требует соблюдать дополнительную логику «привязки» найденного устройства к имени, иногда весьма запутанную из-за той же нечёткой идентификации. Поскольку происходить это должно в самый ответственный момент, при загрузке системы, динамическую схему именования используют с осторожностью.

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

Файлы-дырки и другие типы файлов

Кое-какие идеи динамического именования устройств присутствуют и в статической схеме. Так, файлы /dev/mouse или /dev/cdrom , на самом деле — символьные ссылки на соответствующие файлы-дырки. Если тип мыши или лазерного привода изменится, достаточно изменить эти ссылки и перезапустить соответствующие службы.

Файл-дырка, как и всякая дырка, не имеет никакого размера: сколько в неё не записывай, в файл на диске ничего не попадёт. Вместо этого ядро передаёт всё записанное драйверу, отвечающему за файл-дырку, а тот по-своему обрабатывает эти данные. Точно так же работает и чтение из файла-дырки: все запрашиваемые данные в неё подсовывает драйвер. Большинство драйверов — дисковые, звуковые последовательных и параллельных портов и т. п. — обращаются за данными к какому-нибудь внешнему устройству или передают их ему. Но есть и такие, кто сам всё выдумывает: это и /dev/null , чёрная дыра, в которую что угодно можно записать, и оно пропадёт безвозвратно, и /dev/zero , из которого можно считать сколько угодно нулей (на запись оно ведёт себя как /dev/null ), и /dev/urandom , из которого можно считать сколько угодно относительно случайных байтов.

Изучив выдачу команды ls -lL (ключ « -L » заставляет ls выводить информацию не про символьную ссылку, а про файл, на который она указывает), Мефодий обнаружил, что та вместо размера файла-дырки (который равен нулю) выводит два числа. Первое из этих чисел называется старшим номером устройства (major device number), оно, грубо говоря, соответствует драйверу, отвечающему за устройство. Второе называется младшим номером устройства (minor device number), оно соответствует способу работы с устройством, а для дисковых носителей — разделу. В частности, из примера видно, что устройствами /dev/random и /dev/urandom занимается один и тот же драйвер со старшим номером 1 . При этом часть устройств (по преимуществу — дисковые) имеет тип «b», а другая часть — «c» (этот тип имеют, например, терминалы). Тип указан в атрибутах файла первым символом. Это блочные (block) устройства, обмен данными с которыми возможен только порциями (блоками) определённого размера, и символьные (character) устройства, запись и чтение с которых происходит побайтно. Блочные устройства, вдобавок, могут поддерживать команды прямого доступа вида «прочитать блок номер такой-то » или «записать данные на диск, начиная с такого-то блока».

$ mkfifo hole
methody@localhost:

$ ( date >> hole & head -1 < hole ) 2> /dev/null
Птн Дек 3 15:11:05 MSK 2004
methody@localhost:

$ ( cal >> hole & head -1 < hole ) 2> /dev/null
Декабря 2004
methody@localhost:

$ rm hole

Пример 3. Использование именованного канала

Здесь важно, что утилита head показывает начало не «файла» hole а именно последней записываемой порции данных, как и подобает трубе.

канал Объект Linux, используемый в межпроцессном взаимодействии. Доступен в виде двух дескрипторов: один открыт на запись, другой — на чтение. Все данные, записываемые в первый дескриптор, немедленно можно прочитать из второго. Различают неименованный канал, уничтожаемый с закрытием обоих дескрипторов, и именованный канал (FIFO) — файл-дырку, создаваемый в файловой системе.

Что же касается сокетов, то это — более сложные объекты, предназначенные для связи двух процессов и передачи информации в обе стороны. Сокет можно представить в виде двух каналов (один «туда», другой «обратно»), однако стандартные файловые операции открытия/чтения/записи на нём не работают. Процесс, открывший сокет, считается сервером: он постоянно «слушает», нет ли в нём новых данных, а когда те появляются, счтывает их, обрабатывает, и, возможно, записывает в сокет ответ. Процесс-клиент может подключиться к сокету, обменяться информацией с процесом-сервером и отключиться. Точно так же можно передавать данные и по сети, в этом случае указывается не путь к сокету на файловой системе (т. н. unix domain socket), а сетевой адрес и порт удалённого компьютера (например internet socket, если подключаться с помошью сети Internet).

Драйверы устройств

Как уже говорилось в лекции Этапы загрузки системы, часть системы, отвечающая за взаимодействие с каким-нибудь внешним устройством и называемая «драйвер», в Linux либо входит в ядро, либо оформляется в виде модуля ядра, и подгружается по необходимости. Следовательно, файл-дырка, обращение к которому приводило к «no such device or address», вполне может и заработать (в этом одна из причин огромного количества устройств в /dev ). Гуревич наотрез отказался объяснять Мефодию «как добавить новый драйвер» до тех пор, пока тот не будет лучше разбираться в архитектуре компьютеров вообще и в аппаратной части IBM-совместимых компьютеров в частности. Поэтому всё, что смог понять Мефодий, не имея таких знаний, сводилось к следующему. Во-первых, если существуют различия между тем, как по умолчанию загружает модули система и тем, как на самом деле это необходимо делать, различия должны быть описаны в файле /etc/modules.conf . Во-вторых, после изменения этого файла, добавления нового устройства, обновления самих модулей и т. п. следует запускать утилиту depmod , которая заново выстраивает непротиворечивую последовательность загрузки модулей. В-третьих, интересно (но в отсутствие знаний — малопознавательно) запускать утилиту lspci , которая показывает список устройств (распознаваемых по стандарту PCI), найденных на компьютере.

Работа с устройствами

Все файлы-дырки подчиняются одним и тем же правилам работы с файлами: их можно открывать для записи или чтения, записывать данные или считывать их стандартными средствами, а по окончании работы — закрывать. Открытие и закрытие файла (системные вызовы open() и close() ) в командном интерпретаторе не представлено отдельной операцией, оно выполняется автоматически при перенаправлении ввода (открытие на чтение) или вывода (на запись). Это позволяет работать и с устройствми, и с каналами, и с файлами совершенно одинаково, что активно используется в Linux программами-фильтрами. Каждый тип файлов имеет свою специфику, например, при записи на блочное устройство данные накапливаются ядром в специальном буфере размером в один блок, и только после заполнения буфера записываются. Если при закрытии файла буфер неполон, он всё равно передаётся целиком: часть — данные, записанные пользователем, часть — данные, оставшиеся от предыдущей операции записи). Это, конечно, не означает, что из файла, находящегося на блочном устройстве, легко по ошибке прочитать такой «мусор»: длина файла известна, и ядро само следит за тем, чтобы программа не прочла лишнего.

Даже такие (казалось бы) простые устройства, как жёсткие диски, поддерживают гораздо больше различных операций, чем просто чтение или запись. Пользователю, как минимум, может потребоваться узнать размер блока (для разных типов дисков он разный) или объём всего диска в блоках. Для многих устройств собственно передача данных — лишь итог замысловатого общения с управяющей программой или ядром. Скажем, для вывода оцифрованного звука на звуковую карту сначала необходимо настроить параметры звукогенератора: частоту, размер шаблона, количество каналов, формат передаваемых данных и многое другое. Для управления устройствами существует системный вызов ioctl() (iput-output control): устройство надо открыть, как файл, а затем использовать эту функцию. У каждого устройства — свой набор команд управления, поэтому в виде отдельной утилиты ioctl() не встречается, а используется неявно другими утилитами, специализирующимися на определённом типе устройств.

Права доступа к устройствам

Некоторые устройства просто обязаны быть доступны ползователю на запись и чтение. Например, виртуальная консоль, за которой работает Мефодий, доступна пользователю methody на запись и на чтение, именно поэтому команднный интерпретатор Мефодия может посылать туда символы и считывать их оттуда. В то же время, терминал, за которым работает Гуревич, пользователю недоступен, а терминалы, за которыми не работает никто, доступны только суперпользователю:

$ who
methody tty1 Dec 3 16:02 (localhost)
shogun ttyS0 Dec 3 16:03 (localhost)
methody@localhost

$ ls -l /dev/tty1 /dev/tty2 /dev/ttyS0
crw--w---- 1 methody tty 4, 1 Дек 3 16:02 /dev/tty1
crw------- 1 root root 4, 2 Дек 3 15:51 /dev/tty2
crw--w---- 1 shogun tty 4, 64 Дек 3 16:03 /dev/ttyS0
methody@localhost:

$ ls -l /usr/bin/write
-rwx--s--x 1 root tty 8708 Июн 25 14:00 /usr/bin/write

Пример 4. Кому принадлежат терминалы?

Множество устройств в системе, используемой как рабочая станция, также отдаются во владение — на этот раз, первому пользователю, зарегистрировавшемуся в системе. Предполагается, что компьютер служит в качестве рабочей станции именно этого пользователя, а все последующие доступа к этим устройствам не получат.

Что называется, «кто первым встал — того и тапки».

Как правило, так поступают с устройствами, которые могут понадобиться только одному человеку, сидящему за монитором: звуковыми и видеокартами, лазерными приводами, дисководом и т. п.:

$ ls -l /dev | grep methody | wc
665 6649 41459
shogun@localhost

$ ls -lL /dev/
crw-rw---- 1 methody audio 14, 4 Июл 26 16:59 /dev/audio
brw-r----- 1 methody cdrom 22, 0 Июл 26 16:59 /dev/cdrom
brw-rw---- 1 methody floppy 2, 0 Июл 26 16:59 /dev/fd0
brw-rw---- 1 root disk 3, 0 Июл 26 16:59 /dev/hda
crw-r----- 1 root kmem 1, 2 Июл 26 16:59 /dev/kmem

Пример 5. Кому принадлежат устройства?

При этом для того, чтобы обеспечить и другим — псевдо- или настоящим — пользователям, такие устройства также принадлежат определённым группам с соответствующими правами. Практика «раздачи» устройств группам вообще очень удобна: даже если доступ к устройству имеет только суперпользователь, существует возможность написать setGID-программу, которая, не получая суперпользовательских прав, сможет до этого устройства добраться (а можно и просто включить опытного пользователя в такую группу).

семь стандартных типов файлов Unix - это обычные, каталоги, символические ссылки, специальные FIFO, специальные блоки, специальные символы и сокеты, как определено в POSIX . Различные реализации для конкретных ОС допускают использование большего количества типов, чем требуется POSIX (например, Solaris doors ). Тип файла можно определить с помощью команды ls -l , которая отображает тип в первом символе поля разрешения файловой системы .

Для обычных файлов , Unix не навязывает и не предоставляет никакой внутренней файловой структуры; поэтому их структура и интерпретация полностью зависят от используемого программного обеспечения. Однако можно использовать команду file , чтобы определить, какой тип данных они содержат.

Содержание

Представления

Числовые

В структуре статистики тип файла и права доступа (режим ) хранятся вместе в st_mode битовом поле , которое имеет размер не менее 12 бит (3 бита для указания типа из семи возможных типов файлов; 9 бит для разрешений). Макет для разрешений определяется POSIX как минимум 9 битов с наименьшей значимостью, но остальные не определены.

По соглашению, режим представляет собой 16-битное значение, записанное как шестизначное восьмеричное число. без нуля в начале. Часть формата занимает первые 4 бита (2 цифры), а «10» (1000 в двоичном формате) обычно обозначает обычный файл. Средние 3 бита (1 цифра) обычно используются для setuid, setgid и sticky . Последняя часть уже определена POSIX как содержащая разрешение. Пример: «100644» для типичного файла. Этот формат можно увидеть в git , tar и ar , среди других мест.

Тип файла можно проверить с помощью макросы типа S_ISDIR . Такая проверка обычно выполняется путем маскирования режима с помощью S_IFMT (часто восьмеричное число «170000» для соглашения о ведущих 4 битах) и проверки, соответствует ли результат S_IFDIR . S_IFMT - это не основная концепция POSIX, а расширение X / Open System Interfaces (XSI); системы, соответствующие только POSIX, могут использовать некоторые другие методы.

Строка режима

Возьмем, например, одну строку в выводе ls -l :

POSIX определяет формат вывода для длинного формата (параметр -l ). В частности, первое поле (перед первым пробелом) называется «строкой режима файла», а его первый символ описывает тип файла. Остальная часть этой строки указывает на права доступа к файлу .

Таким образом, в этом примере строка режима drwxr-xr-x : тип файла - d (каталог ) и разрешениями являются rwxr-xr-x .

Примеры реализаций

GNU coreutils версия ls использует вызов filemode () , функция glibc (представленная в библиотеке gnulib ) для получения строки режима.

FreeBSD использует более простой подход, но допускает меньшее количество типов файлов.

Обычный файл

Обычные файлы отображаются в ls -l с дефис-минус - в поле режима:

Каталог

Самый распространенный специальный файл - это каталог. Структура файла каталога определяется используемой файловой системой. Поскольку в Unix доступно несколько файловых систем, как собственных, так и неродных, единой структуры файлов каталогов не существует.

Каталог помечается d как первая буква в поле режима в выводе ls -dl или stat , например

Символьная ссылка

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

Символьная ссылка помечается знаком l (нижний регистр L ) как первая буква строки режима, например

FIFO (именованный канал )

Именованные каналы - это специальные файлы, которые могут существовать в любом месте файловой системы. Их можно создать с помощью команды mkfifo , как в mkfifo mypipe .

Именованный канал помечается p как первая буква строки режима, например

Socket

Сокет - это специальный файл, используемый для межпроцессного взаимодействия , который обеспечивает связь между два процесса. Помимо отправки данных, процессы могут отправлять файловые дескрипторы через соединение сокета домена Unix, используя системные вызовы sendmsg () и recvmsg () .

В отличие от именованных каналов, которые допускают только однонаправленный поток данных, сокеты полностью поддерживают дуплексный режим .

Сокет помечается s как первая буква строки режима, например

Файл устройства (блок, символ)

В Unix почти все вещи обрабатываются как файлы и имеют место в файловой системе , даже аппаратные устройства, такие как жесткие диски. Большим исключением являются сетевые устройства, которые не появляются в файловой системе, а обрабатываются отдельно.

Файлы устройств используются для применения прав доступа к устройствам и для направления операций с файлами соответствующим драйверам устройств.

Unix делает различие между символьными устройствами и блочными устройствами. Различие примерно следующее:

  • Символьные устройства обеспечивают только последовательный поток ввода или принимают последовательный поток вывода
  • Блочные устройства доступны произвольно

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

Символьное устройство помечается c как первая буква строки режима. Точно так же блочное устройство помечается b , например

Дверь

Дверь - это специальный файл для межпроцессного взаимодействия между клиентом и сервером, в настоящее время реализованный только в Solaris .

Дверь помечена D (верхний регистр) как первая буква строки режима. , например

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

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

Большинству распознанных устройств, если они должны поддерживать операции чтения/записи или хотя бы управления ( ioctl() , описанный ниже), соответствует файл-дырка в каталоге /dev или одном из его подкаталогов. В зависимости от того, выбрана ли в системе статическая или динамическая схема именования устройств, файлов-дырок в /dev может быть и очень много, и относительно мало. При статической схеме именования то, что ядро распознало внешнее устройство , никак не соотносится с тем, что в /dev имеется для этого устройства файл-дырка :

Здесь Мефодий попытался прочитать что-либо из устройства /dev/sdg14 , что соответствует четырнадцатому разделу SCSI-диска под номером 7. Такого диска в этой машине, конечно, нет, а файл-дырка для него заведен на всякий случай: вдруг появится? Поскольку появиться может любое из поддерживаемых Linux устройств, таких файлов "на всякий случай" в системе бывает и десять тысяч, и двадцать. Файл-дырка не занимает места на диске, однако использует индексный дескриптор , поэтому в корневой файловой системе , независимо от ее объема, должен быть изрядный запас индексных дескрипторов .

При динамической схеме именования применяется специальная виртуальная файловая система , которая либо полностью подменяет каталог /dev , либо располагается в другом каталоге (например, /sys ), имеющем непохожую на /dev иерархическую структуру; в этом случае файлы-дырки в /dev заводит специальная служба. Этот способ гораздо удобнее и для человека, который запустил команду ls /dev , и для компьютера (в случае подключения внешних устройств, например, съемных жестких дисков, "на лету"). Однако он требует соблюдать дополнительную логику "привязки" найденного устройства к имени, иногда весьма запутанную из-за той же нечеткой идентификации. Поскольку происходить это должно в самый ответственный момент, при загрузке системы, динамическую схему именования используют с осторожностью.

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

Файлы-дырки и другие типы файлов

Кое-какие идеи динамического именования устройств присутствуют и в статической схеме. Так, файлы /dev/mouse или /dev/cdrom на самом деле представляют собой символьные ссылки на соответствующие файлы-дырки . Если тип мыши или лазерного привода изменится, достаточно изменить эти ссылки и перезапустить соответствующие службы:

Файл-дырка не имеет размера: сколько в него ни записывай, в файл на диске ничего не попадет. Вместо этого ядро передает все записанное драйверу, отвечающему за файл-дырку , а тот по-своему обрабатывает эти данные. Точно так же работает и чтение из файла-дырки : все запрашиваемые данные в нее подсовывает драйвер. Большинство драйверов - дисковые, звуковые, последовательных и параллельных портов и т.п. - обращаются за данными к какому-нибудь внешнему устройству или передают их ему. Но есть и такие, которые сами все "выдумывают": это и /dev/null , черная дыра, в которую что угодно можно записать, и все пропадет безвозвратно, и /dev/zero , из которого можно считать сколько угодно нулей (на запись оно ведет себя как /dev/null ), и /dev/urandom , из которого можно считать сколько угодно относительно случайных байтов.

Изучив выдачу команды ls -lL (ключ " -L " заставляет ls выводить информацию не о символьной ссылке, а о файле, на который она указывает), Мефодий обнаружил, что та вместо размера файла-дырки (который равен нулю) выводит два числа. Первое из этих чисел называется старшим номером устройства (major device number ), оно, упрощенно говоря, соответствует драйверу, отвечающему за устройство. Второе называется младшим номером устройства (minor device number ), оно соответствует способу работы с устройством, а для дисковых носителей - разделу . В частности, из примера видно, что устройствами /dev/zero и /dev/urandom занимается один и тот же драйвер со старшим номером 1 . При этом часть устройств (по преимуществу - дисковые) имеет тип " b ", а другая часть - " c " (этот тип имеют, например, терминалы). Тип указан в атрибутах файла первым символом. Это блочные ( b lock) устройства, обмен данными с которыми возможен только порциями (блоками) определенного размера, и символьные ( c haracter) устройства, запись и чтение с которых происходит побайтно. Блочные устройства , вдобавок, могут поддерживать команды прямого доступа вида "прочитать блок номер такой-то " или "записать данные на диск, начиная с такого-то блока".

Канал. Объект Linux, используемый в межпроцессном взаимодействии. Доступен в виде двух дескрипторов : один открыт на запись, другой - на чтение. Все данные, записываемые в первый дескриптор , немедленно можно прочитать из второго. Различают неименованный канал , уничтожаемый с закрытием обоих дескрипторов , и именованный канал ( FIFO ) - файл-дырку , создаваемый в файловой системе .

Что же касается сокетов , то это - более сложные объекты, предназначенные для связи двух процессов и передачи информации в обе стороны. Сокет можно представить в виде двух каналов (один "туда", другой "обратно"), однако стандартные файловые операции открытия/чтения/записи на нем не работают. Процесс, открывший сокет , считается сервером: он постоянно "слушает", нет ли в нем новых данных, а когда те появляются, считывает их, обрабатывает, и, возможно, записывает в сокет ответ. Процесс- клиент может подключиться к сокету , обменяться информацией с процессом-сервером и отключиться. Точно так же можно передавать данные и по сети - в этом случае указывается не путь к сокету на файловой системе (так называемый unix domain socket), а сетевой адрес и порт удаленного компьютера (например internet socket, если подключаться с помощью сети Internet).

Драйверы устройств

Как уже говорилось в лекции 10, часть системы, отвечающая за взаимодействие с каким-нибудь внешним устройством и называемая "драйвер", в Linux либо входит в ядро , либо оформляется в виде модуля ядра и подгружается по необходимости. Следовательно, файл-дырка , обращение к которому приводило к "no such device or address", вполне может и заработать (в этом одна из причин огромного количества устройств в /dev ). Гуревич наотрез отказался объяснять Мефодию, как добавить новый драйвер, до тех пор, пока тот не будет лучше разбираться в архитектуре компьютеров вообще и в аппаратной части IBM-совместимых компьютеров в частности. Поэтому все, что смог понять Мефодий, не имея таких знаний, сводилось к следующему. Во-первых, если существуют различия между тем, как по умолчанию загружает модули система и тем, как на самом деле это необходимо делать, различия должны быть описаны в файле /etc/modules.conf . Во-вторых, после изменения этого файла, добавления нового устройства, обновления самих модулей и т.п. следует запускать утилиту depmod , которая заново выстраивает непротиворечивую последовательность загрузки модулей . В-третьих, интересно (но в отсутствие знаний - малопознавательно) запускать утилиту lspci , которая показывает список устройств (распознаваемых по стандарту PCI), найденных на компьютере.

Работа с устройствами

Все файлы-дырки подчиняются одним и тем же правилам работы с файлами: их можно открывать для записи или чтения, записывать данные или считывать их стандартными средствами, а по окончании работы - закрывать. Открытие и закрытие файла ( системные вызовы open() и close() ) в командном интерпретаторе не представлены отдельной операцией, а выполняются автоматически при перенаправлении ввода (открытия на чтение) или вывода (на запись). Это позволяет работать и с устройствами, и с каналами , и с файлами совершенно одинаково, что активно используется в Linux программами- фильтрами . Каждый тип файлов имеет свою специфику, например, при записи на блочное устройство данные накапливаются ядром в специальном буфере размером в один блок, и только после заполнения буфера записываются. Если при закрытии файла буфер неполон, он все равно передается целиком: часть - данные, записанные пользователем, часть - данные, оставшиеся от предыдущей операции записи). Это, конечно, не означает, что из файла, находящегося на блочном устройстве, легко по ошибке прочитать такой "мусор": длина файла известна, и ядро само следит за тем, чтобы программа не прочла лишнего.

Даже такие, казалось бы, простые устройства, как жесткие диски, поддерживают гораздо больше различных операций, чем просто чтение или запись. Пользователю, как минимум, может потребоваться узнать размер блока (для разных типов дисков он разный) или объем всего диска в блоках. Для многих устройств собственно передача данных - лишь итог замысловатого общения с управляющей программой или ядром . Скажем, для вывода оцифрованного звука на звуковую карту сначала необходимо настроить параметры звукогенератора: частоту, размер шаблона, количество каналов , формат передаваемых данных и многое другое. Для управления устройствами существует системный вызов ioctl() ( i nput- o utput c on t ro l ): устройство надо открыть, как файл, а затем использовать эту функцию. У каждого устройства - свой набор команд управления, поэтому в виде отдельной утилиты ioctl() не встречается, а используется неявно другими утилитами, специализирующимися на определенном типе устройств.

Права доступа к устройствам

Некоторые устройства просто обязаны быть доступны пользователю на запись и чтение. Например, виртуальная консоль , за которой работает Мефодий, доступна пользователю methody на запись и на чтение, именно поэтому командный интерпретатор Мефодия может посылать туда символы и считывать их оттуда. В то же время терминал, за которым работает Гуревич, другому пользователю недоступен, а терминалы, за которыми не работает никто, доступны только суперпользователю:

Множество устройств в системе, используемой как рабочая станция, также отдаются во владение - на этот раз первому пользователю, зарегистрировавшемуся в системе. Предполагается, что компьютер служит рабочей станцией именно этого пользователя, а все последующие доступа к этим устройствам не получат 2 Как говорится, "кто первым встал - того и тапки". . Как правило, так поступают с устройствами, которые могут понадобиться только одному человеку, сидящему за монитором: звуковыми и видеокартами, лазерными приводами, дисководом и т.п.:

При этом для того чтобы обеспечить доступ и другим - псевдо- или настоящим - пользователям, такие устройства также принадлежат определенным группам с соответствующими правами. Практика "раздачи" устройств группам вообще очень удобна: даже если доступ к устройству имеет только суперпользователь, существует возможность написать setGID -программу, которая, не получая суперпользовательских прав, сможет до этого устройства добраться (а можно и просто включить опытного пользователя в такую группу).

Читайте также: