Файлы, как единицы обеспечения доступа к данным, различаются операционной системой по типам, указывающим источник информации.
Обычные (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 для централизованной журнализации.