Файловая система в Unix


Дерево

Файловай система в Unix/Linux организована в виде дерева:

  • вершинами этого дерева являются файлы
    • директория/каталог — это тоже файл, он содержит список файлов, которые в директории находятся;
      можно считать, что вершины в дереве, у которых есть потомки — это директории
  • корнем дерева является директория /, её так и называют “корень”

Дерево

Пример дерева:

/
├── bin -> usr/bin
├── boot
│   ├── grub
│   └── lost+found
├── dev
├── etc
├── home
├── lib -> usr/lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

Первые команды для работы с файловой системой

С каждой программой в Unix/Linux связана текущая директория этой программы.

В т.ч. в bash можно посмотреть текущую директорию, в которой сейчас работаем:

pwd

С помощью ls(1) без аргументов можно выяснить содержимое текущей директории:

ls
## вывод 

Скрытые файлы

В каждой директории обязательно находятся две особых: . — это сама она же, .. — её родительская.

Ранняя реализация ls хотела скрыть их из вывода такой проверкой:

if (name[0] == '.') continue;

Другие программисты посчитали, что это означает, что файлы, имя которых начинается с точки, — скрытые. Так пошла традиция.


ls -a

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


Пути и имена

Корневой каталог / является началом файловой системы.

Абсолютный путь

Путь к файлу от корня файловой системы называется абсолютным путём.

Пример абсолютного пути:

/boot/grub

Относительный путь

Относительный путь — это такой путь, который не начинается в корне /.

Пример относительного пути:

a/tasks/README.md

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


Примеры путей

С помощью cd перейдём в директорию /usr/bin, пользуясь абсолютным путём:

cd /usr/bin/
pwd
## вывод
/usr/bin/

Примеры путей

Теперь хитрым способом никуда не переместимся (да, просто останемся в той же директории):

cd ../bin/./././../../usr/bin

Поймите почему мы остались в той же директории.

pwd
## вывод
/usr/bin/

Примеры путей

И всё-таки перейдём в корневую директорию:

cd ../..
pwd
## вывод
/

Допустимые символы в имени

Обратите внимание, что в именах файла явно запрещены только правый слеш / и null-byte: \0. Остальные символы разрешены и допустимы.

Так, например, можно создать файл с пробелом в имени или даже с символом переноса строки:

echo 123 >'a
b
c
d
e'

Неправильная обработка таких путей средствами bash может привести к проблемам и некорретной работе ваших скриптов.


Создание, удаление и изменение файлов

  • mkdir - для создания новых директорий
  • rmdir - для удаления пустых директорий
  • rm - для удаления файлов или директорий
mkdir /home/user1/newfolder
rm /home/user1/oldfile.txt

rmdir предпочтительнее использовать для удаления директорий — она удаляет только пустые директории.

Также у этих утилит есть различные и крайне полезные флаги. Обязательно изучайте man-страницы.

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

Или же можно перенаправить в файл вывод какой-нибудь программы.


Ссылки


inode

У каждого файла в системе есть свой уникальный номер, известный как inode. Этот номер используется для идентификации файла на файловой системе.


Виды ссылок

Это дополнительное имя для существующего файла.

Жёсткая ссылка ссылается на тот же inode, что и оригинальный файл.

ln original hardlink

задаст жёсткую ссылку


Это файл, который содержит путь к другому файлу или каталогу. Он является отдельным файлом с собственным inode.

ln -s original symlink

создаст символьную ссылку.


Всё есть файл

Концепция “всё есть файл” в Unix-подобных системах означает, что большинство взаимодействий с данными осуществляется через файловые абстракции.

Файлы, каталоги, устройства, сетевые соединения и даже некоторые внутренние системные ресурсы представлены в виде файлов.

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


Типы файлов

  • Обычные файлы: Это текстовые файлы, медиафайлы, исполняемые файлы и т.д.
  • Каталоги: Представляют собой файлы, которые содержат ссылки на другие файлы или каталоги.
  • Блочные устройства: Например, жесткие диски, представлены файлами, через которые осуществляется доступ к данным на этих устройствах.
  • Символьные устройства: Например, принтеры, управляются через файлы, представляющие устройства.
  • Символические ссылки: Файлы, которые служат указателями на другие файлы.
  • Каналы межпроцессного взаимодействия (PIPE, FIFO) и гнезда: Используются для обмена данными между процессами.
  • другие.

Именитые примеры: /proc and /dev

В Unix и Linux системах, /proc и /dev являются хорошими примерами концепции “всё есть файл”.

Они дают доступ к системной информации и устройствам.


/proc

Этот каталог содержит виртуальную файловую систему, которая предоставляет информацию о процессах и ресурсах системы. Например:

  • Чтение информации о CPU: cat /proc/cpuinfo
  • Просмотр использования памяти: cat /proc/meminfo
  • Доступ к информации о конкретном процессе: ls /proc/[pid]

/dev

Каталог /dev содержит специальные файлы, которые представляют устройства. Примеры взаимодействия:

  • Чтение данных с первого жесткого диска: cat /dev/sda
  • Запись данных на USB-устройство: cat file > /dev/sdb1
  • Просмотр списка доступных устройств: ls /dev/

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

  • /proc: Виртуальная файловая система, предоставляющая доступ к информации о процессах и системных ресурсах.
  • /dev: Содержит файлы устройств, представляющие аппаратные и виртуальные устройства в системе.