Философия операционных систем Unix гласит, что все есть файл. Это значит, что вся работа с этой операционной системой сводится к файлам. Поскольку Linux можно считать тоже потомком Unix, то эта концепция применима и здесь. Файлы это объекты, в которые мы записываем информацию и наши данные, исполняемые файлы, но кроме этих привычных нам понятий здесь есть файлы специального назначения - файлы устройств, файлы туннелей, сокетов и многое другое. Эта тема очень слабо освещена в интернете, поэтому в нашей сегодняшней статье мы рассмотрим типы файлов linux.
Пространство нашего жесткого диска занято файлами разных типов. Например, взять даже наш корневой раздел (/), при создании файла, файловая система записывает его в определенном формате на нужное физическое место жесткого диска. Всегда, для работы с файлами используется файловая система, но не всегда она записывает файлы на диск, файловая система может работать на лету, генерируя файлы, например, как procfs, с помощью которой может быть выполнена настройка ядра linux или записывать файлы в оперативную память, как tmpfs расположенная в папке /tmp. Но все это не имеет значения, ведь в любом случае мы имеем дело именно с файлами.
В системе Linux нет различий между каталогами и файлами. Но каталоги могут объединять другие файлы в группы, чтобы их было легче найти и использовать. Все аппаратные устройства представлены в виде файлов и находятся в каталоге dev, только через эти файлы программы могут работать с ними.
Преимущество использования файлов как для обычной информации, так и для устройств, в том, что не нужно реализовать отдельный набор API интерфейсов для каждого устройства, с ним могут работать все стандартные утилиты Linux и API интерфейсы.
Содержание статьи
Типы файлов в Linux
Файлы в операционной системе Linux можно поделить на три основных типа:
- Обычные файлы, для хранения информации
- Специальные файлы - для устройств и туннелей
- Директории
Дальше рассмотрим более подробно эти типы файлов linux.
Обычные файлы
Это файлы, с которыми мы привыкли работать каждый день, они могут содержать текст, исполняемые инструкции для программ, изображения или другую информацию. Это самый распространенный тип файлов, которые вы можете найти в системе Linux. Рассмотрим небольшой список относящихся сюда файлов:
- Текстовые файлы
- Исполняемые файлы
- Файлы изображений
- Файлы архивов
- Файлы библиотек программ
- И другие подобные типы
Утилита ls может определять тип файла в режиме списка, обычные файлы обозначаются черточкой, например:
ls -l /bin/ | grep "^-"
Эта статья была бы неполной, если бы мы рассматривали типы файлов, но не упомянули о форматах. Дело в том, что все обычные файлы сохранены в определенном формате, это нужно, чтобы система знала какой программой нужно открывать файл.
Посмотреть форматы файлов linux можно с помощью утилиты file. Например:
file /bin/tar
Система сообщила что это исполняемый файл, а теперь посмотрим обычный, текстовый:
file /etc/passwd
Утилита умеет распознавать все известные форматы файлов. Чтобы узнать вывести все доступные форматы файлов linux наберите:
file -l
Специальные файлы
Специальные файлы намного интереснее, они предназначены для обмена информации с ядром, работы с устройствами или общения между программами. Такие файлы могут тоже быть нескольких типов, в зависимости от назначения.
Блочные файлы - это файлы устройств, которые обеспечивают буферизованный доступ к аппаратным компонентам. При записи данных на жесткий диск или на флешку нет смысла записывать данные сразу же после их поступления. Так мы будем только понапрасну расходовать ресурс устройства и энергию. Можно подождать пока наберется достаточное количество данных а потом записать их за один раз. Эти данные и собираются в буфере. С помощью таких файлов, файловая система и другие утилиты могут обращаться к драйверам аппаратных устройств. Такие файлы могут передать большой блок данных за небольшой один раз.
Утилита ls обозначает блочные файлы буквой b, например, выберем все блочные файлы из каталога /dev:
ls -l /dev/ | grep "^b"
Утилита file, которую мы рассматривали в предыдущем разделе тоже умеет определять типы файлов:
file /dev/sda
Символьные файлы обеспечивают не буферизованный доступ к аппаратным компонентам и ядру. Поскольку у них нет буфера, они позволяют передавать только по одному символу за один раз. А в остальном, это такие же файлы устройств, как и блочные файлы.
Вы также можете отфильтровать их с помощью ls. Символьные файлы обозначаются буквой c (character):
ls -l /dev/ | grep "^c"
Символические ссылки - это файлы, которые указывают на другие файлы в системе по их имени. Они могут указывать как на обычные файлы, таки на каталоги или другие типы файлов в linux. По сути, это те же ярлыки Windows. В Linux еще есть жесткие ссылки, но они не имеют отношения к типу файлов, потому что реализованы на уровне файловой системы и считаются обычными файлами. Поскольку они указывают на одно и то же место на диске, это два разных файла, с одинаковым содержимым.
Но вернемся к символическим ссылкам. Утилита ls обозначает их буквой l (link):
ls -l /dev/ | grep "^l"
Создавать символические ссылки можно с помощью утилиты ln. Например:
ln -s file1.txt file2.txt
Можете использовать ls чтобы убедиться в том, что это ссылка. Проверьте таким же образом жесткие ссылки, чтобы убедиться, что то что я сказал о них - правда.
Туннели и именованные туннели - это файлы, позволяющие настроить связь между двумя процессами перенаправив вывод одного процесса на вход другого. Именованные туннели используются для связи между двумя процессами и работают так же как и обычные туннели.
Обозначаются такие типы файлов linux буквой p (pipe):
ls -l /dev/ | grep "^p"
Чтобы создать именованный тоннель вы можете использовать утилиту mkfifo:
mkfifo pipe1
echo "test test test" > pipe1
После создания туннеля мы передали в него данные, и оболочка стала не интерактивной. Она будет ожидать пока данные будут прочитаны на другом конце туннеля. Открываем другую оболочку и читаем данные:
while read line ;do echo "Data: '$line' "; done<pipe1
Файлы сокетов - это файлы, обеспечивающие прямую связь между процессами, они могут передавать информацию между процессами, запущенными в разных средах или даже разных машинах. Это значит, что с помощью сокетов программы могут обмениваться данными даже по сети. По сути, сокет работает так же как туннели, но только в обе стороны.
Файлы сокетов обозначаются буквой s:
ls -l /dev/ | grep "^s"
Создать сокет можно с помощью функции socket() на языке программирования Си, чтение и запись выполняется системными вызовами read() и write(). Но нам сейчас не нужно писать реальную программу, будет достаточно немного поиграться. Поэтому воспользуемся утилитой nc. Создаем Unix сокет:
nc -lU socket.sock
Подключаемся к нему из другой консоли:
nc -U socket.sock
Все данные, которые вы будете набирать в одной из консолей будут отправляться на другую после нажатия Enter, связь работает в обоих направлениях.
Каталоги
Это специальные файлы, которые позволяют объединять другие и каталоги в группы для более простой навигации и поиска. Естественно, они могут содержать как обычные, так и специальные файлы, одним словом любые типы файлов ос linux. В системе Linux, файлы организуются в папки начиная от корня (/)
Обозначаются каталоги буквой d (directory):
Создать каталог в linux можно с помощью команды mkdir:
mkdir каталог1
Заключение
Теперь у вас более четкое представление о том, почему в linux все является файлами, а также какие типы файлов в linux существуют в вашей системе. Вы можете найти более подробную информацию по каждому виду файлов в интернете, но если у вас остались вопросы, можете задать их в комментариях!
расскажите лучше подробнее про флаг исполняемости. Как происходит процесс преобразования исполняемого текстового файла в машинный код?
Это тема для отдельной статьи, но вряд-ли я буду ее писать, поэтому попытаюсь рассказать в несколько предложений. Исполняемый файл никак не преобразовуется, он передается как есть. Для процессора нет разницы что это, код или данные. Все исполняемые команды, это всего лишь определенные последовательности байт. Например в DOS есть такое прерывание: int 20, используется для завершения программы, так вот оно состоит только из двух байт CD и 20 (это в кодировке HEX). А байты эти можно понимать как int 20 или же как обычные символы l и пробел. Флаг исполняемости только указывает системе как нужно понимать эти байты из файла, как инструкции или же как обычные данные, и соответственно в какую область памяти загружать их.
Если речь идет о скриптах, обычных текстовых файлах с инструкциями, то здесь все еще проще. Такие файлы открываются интерператорами, это программы, которые способны выполнять инструкции. Программа читает файл срока за строкой и так построчно выполняет каждую инструкцию. Это может быть bash, sh, fish, php, python, perl неважно, все они работают одинаково. А флаг исполняемости только указывает системе что нужно открывать этот файл не с помощью текстового редактора, а с помощью интерпретатора. Какой интерпретатор использовать система узнает из первой строчки такого файла Например #!/usr/bin/bash - указанно что будет использоваться bash. И так для каждого скрипта.
Спасибо за статью. Узнал немного больше, чем было до этого 🙂
nc и netcat не поддерживают создание сокетов, вам надо ncat. По крайней мере в моей версии так.
у меня ссылка на другой файл не отображается. как бы получается если я создаю этот файл с ссылкой, то она отображается как ссылка на саму себя
Лектор учебного курса "Администратор Linux" оставил ссылку на вашу статью в качестве дополнительного изучения. Спасибо, было ценно и полезно.