Типы файлов Linux

Автор: | 21.11.2018

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

Обычные (regular) файлы и каталоги (directory) обеспечивают сохранение информации на тех или, иных носителях.

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

В примере ниже в полном (-l, long) выводе команды ls проиллюстрирован признак типа файла.

Символом — обозначается обычный файл, символами b или с — специальные файлы блочного (block) или символьного (character) устройств, символом р — именованный канал (pipe), символом s сокет (socket), а символом l —  символическая ссылка (link).

Признак типа файлов ls

john@ubuntu:~$ ls -l /bin/ls /dev/sda /dev/tty /sbin/halt

-rwxr-xr-x  1  john   john   104508 нояб. 20 2017 /bin/ls

brw-rw—-  1  root   disk        8,  0 марта 23 23:46 /dev/sda

crw-rw-rw- 1  root   tty          6, 0 марта   27 13:47 /dev/tty

lrwxrwxrwx 1 root   root               5 янв.  18   2018 /sbin/halt -> reboot

john@ibuntu:~$ ls -l /run/screen/S-john/11322.pts-5.ubuntu /run/udev/control

prwx——    1 john  john             0 марта 26 13:47 /run/screen/S-john/11322.pts-5.ubuntu

srwxr-xr-x   1  root  root              0 марта 23  23:45 /run/udev/control

Обычные файлы

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

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

Содержание обычных файлов

john@ubuntu:~$ file /usr/share/man/man1/file.1.gz

/usr/share/man/manl/file. 1.gz: gzlp compressed data, from Unix, max compression

john@ubuntu:~$ file /etc/passwd

/etc/passwd: ASCII text

john@ubuntu:~$ file /etc/ls

/bin/ls: ELF 32-blt LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2,6.24,

BuildID[shal]=0x83531f308flfal8221be53eaf399303400cl4638, stripped

john@ubuntu:~$ file /usr/share/sounds/alsa/Noise.wav

/usr/share/sounds/alsa/Noise.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM,

16 bit, mono 48000 Hz

john@ubuntu:~$ file /usr/share/backgrounds/Floorboards_by_Dawe. jpg

/usr/share/b.. .s/Floorb…Dawe.jpg: JPEG image data, JFIF standard 1.01

Создать обычный файл можно при помощи любой программы, сохраняющей информацию в файл, например посредством текстовых редакторов vi, nano или mcedit. Для создания пустого обычного файла можно воспользоваться командой touch. Для удаления обычного файла предназначается команда rm.

Каталоги

Файлы-каталоги, в отличие от обычных файлов, имеют служебное для операционной системы содержимое — таблицу имен файлов и соответствующих им номеров индексных дескрипторов (inode, index node), проиллюстрированных ниже.

Имена и номера индексных дескрипторов файлов

john@ubuntu:~$ ls -ai
20332580  .                            20318930      .bash_logout        20320866     examples.desktop
20316161   . .                          20320868      .bashrc                  20320867      .profile
20320797 .bash_history     20332712        .cache

Каждый индексный дескриптор содержит метаданные — список стандартных свойств файла, в том числе указывающих местоположение данных файла (набора блоков) на файловой системе.

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

Метаданные файла

john@ubuntu:~$ stat .profile

Файл: «.profile»
Размер: 675               Блоков: 8                      Блок В/В: 4096        обычный файл
Устройство: fc00h/64512d             Inode: © 20320867          Ссылки: 1
Доступ:    (0644/-rw-r—)    Uid:  ( 1001/     john)  Gid: ( 1001/    john)
Доступ:   2015-04-01 00:48:07.220999337 +0300

Модифицирован: 2016-03-18 13:54:10.000000000 +0400

Изменён: 2018-06-12 23:36:12.060159729 +0300

Создан: —

Для создания каталогов предназначена команда mkdir, а для удаления rmdir, при этом удалению подлежат только пустые каталоги.

Имена, данные, метаданные и индексные дескрипторы

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

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

Ссылки

Каталог как файл-список имен других файлов, которым сопоставлены номера индексных дескрипторов, не запрещает иметь два разных имени файла, указывающих на одни и те же метаданные . Такой эффект носит название жесткой ссылки, создать которую можно при помощи команды ln.

Жесткая ссылка

 

john@ubuntu:~$ touch  readme

john@ubuntu:~$ ls -li  readme

20318653   -rw-r—r— 1  john john 0  ноя.    1  01:32 readme

john@ubuntu:~$  ln readme readme.txt

john@ubuntu:~$ touch README

john@ubuntu:~$ ls -li readne readme.txt README

20318653 -rw-r—r— 2 john john 0 ноя. 1 01:32 readme

20319121 -rw-r—r— 1 john john 0 ноя. 1 01:33 README

20318653 -rw-r—r— 2 john john 0 ноя. 1 01:32 readme.txt

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

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

Символическая ссылка

john@ubuntu:~$ ln -s read.me readme.1st

john@ubuntu:~$ ls -li read*

20318653   -rw-r—r—     1  john john  0 ноя. 1  01:32 read.me

20319944  lrwxrwxrwx  1  john john  6 ноя. 2 00:02 readme.1st -> read.me

В случае с символической ссылкой при удалении целевого файла сама ссылка будет указывать в никуда и называться «сиротой» (orhpan). Попытка прочитать такую ссылку приводит к странным, на первый взгляд, результатам: файл «существует» для команды ls, но команда просмотра содержимого Cat говорит об обратном. Ничего удивительного, если помнить, что ls работает с именами файлов, a cat — с их данными (которые действительно не существуют).

Специальные файлы устройств Linux

Специальные файлы устройств предназначены для ввода данных с аппаратных устройств и вывода данных на них. Настоящую работу но вводу и выводу данных проделывает драйвер устройства, а специальные файлы играют роль своеобразных «порталов» связи с драйверами.

Различают символьные и блочные специальные файлы устройств, у которых минимальной единицей обмена информацией с драйверами является блок (обычно размером в 512 байт) или символ (1 байт), соответственно.

Специальные файлы устройств

john@ubuntu:~$ ls  -l /dev/sd* /dev/input/mouse* /dev/video* /dev/snd/pcm*
crw-r——    1 root root       13,  32     марта 24  23:47 /dev/input/mouse0
brw-rw—-    1 root disk        8,    0      марта 27  15:02 /dev/sda
brw-rw—-    1 root disk        8,    1       марта 24  23:48 /dev/sda1
brw-rw—-    1 root disk        8,    2      марта 24  23:47 /dev/sda2

brw-rw—-     1 root disk       8,   5       марта 24 23:45 /dev/sda5
crw-rw—T+  1 root audio  116,  4       марта 27 19:02 /dev/snd/pcmC0D0c
crw-rw—T+  1 root audio  116,  3       марта 27 13:48 /dev/snd/pcmC0D0p
crw-rw—T+  1 root audio  116,  2       марта 24 23:47 /dev/snd/pcmC0D3p
crw-rw—-+  1 root video     81,  0       марта 24 23:45 /dev/videoO

Все драйверы ядра пронумерованы главными (мажорными, major) числами , а аппаратные устройства, находящиеся под их управлением, — дополнительными (минорными, minor) числами.

Именованные каналы и файловые сокеты

Именованные каналы и файловые сокеты являются простейшими средствами межпроцессного взаимодействия (IPC, InterProcess Communication) и служат программам для обмена информацией между собой.

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

Предоставить процессам возможность использовать файловые операции для эффективного! взаимодействия между собой призваны именованные каналы (named pipe) pipe, они же FIFО-файлы (first in first out) fifo и файловые сокеты (socket) unix. Каналы и сокеты используют для передачи данных от процесса к процессу оперативную память ядра операционной системы, а «не память накопителя, как обычные файлы.

Основное отличие именованного канала от сокета состоит в способе передачи данных. Через именованный канал организуется однонаправленная (симплексная) передача без мультиплексирования, а через Сокет — двунаправленная (дуплексная) мультиплексированная передача.

Именованный канал обычно, используют при взаимодействии процессов по схеме «поставщик — потребитель» (producer-consumer), когда один потребитель принимает информацию от одного поставщика (на самом деле от разных, но в различные моменты времени). Например (в некоторых реализациях), программы shutdown, reboot, poweroff и telinit передают посредством именованного канала /dev/initctl команды перезагрузки, выключения питания и пр. диспетчеру init, который выполняет соответствующие действия.

Сокет, используют при взаимодействии по схеме «клиент — сервер» (client-server), т. е. один сервер принимает и отправляет информацию от многих и ко многим (одновременно) клиентам. Например, в целях централизованного сбора событийной информации разнообразные службы операционной системы (в частности служба периодического выполнения заданий сron, служба печати cupsd и даже команда logger) передают посредством файлового сокета /dev/log сообщения о происходящих событиях службе rsyslogd для централизованной журнализации.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *