ОП.05Файловая система Linuxзанятие 3Материалы

Часть 6 из 8

Типы файлов, inode и ссылки

В этой части рассмотрим типы объектов файловой системы, устройство inode и два вида ссылок: жёсткие и символические.

  1. 6.1 Типы объектов файловой системы
  2. 6.2 inode и жёсткие ссылки
  3. 6.3 Символические ссылки

6.1 Типы объектов файловой системы

Каталоги, устройства и ссылки в Linux тоже являются объектами файловой системы, но разных типов. Тип обозначается первым символом строки в выводе ls -l.

СимволТип объекта
-обычный файл
dкаталог
lсимволическая ссылка
c, bсимвольное и блочное устройство
sсокет — файл для обмена данными между программами

Тип объекта не говорит о содержимом обычного файла: и текстовый документ, и исполняемая программа имеют тип -. Содержимое определяет команда file, которая анализирует сами данные. Расширение имени в Linux на тип и содержимое файла не влияет.

Строка подробного вывода ls -l состоит из нескольких полей. Разберём строку -rw-rw-r-- 1 ubuntu ubuntu 17 Sep 14 18:52 data/info.txt:

ПолеЗначение
-тип объекта: обычный файл
rw-rw-r--права доступа: кто может читать, изменять и запускать файл
1число жёстких ссылок на файл
ubuntu ubuntuвладелец файла и группа
17размер в байтах
Sep 14 18:52дата и время последнего изменения
data/info.txtимя файла
В терминалеТипы объектов
  1. cd ~/linux-fhs-lab
    что делает

    Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.

    По частям:

    cd
    сменить текущий каталог
    ~/linux-fhs-lab
    куда перейти (путь от домашнего каталога)
  2. file data/info.txt /usr/bin/python3 /dev/null# анализ содержимого
    что делает

    Что делает команда. Определяет, что находится в трёх объектах: текст, ссылка и устройство.

    По частям:

    file
    определить, что находится в файле
    data/info.txt
    какой файл проверить (путь относительно текущего каталога)
    /usr/bin/python3
    какой файл проверить (абсолютный путь)
    /dev/null
    какой файл проверить (абсолютный путь)
  3. file -L /usr/bin/python3# содержимое файла, на который указывает ссылка
    что делает

    Что делает команда. Проходит по ссылке python3 и определяет тип самой программы.

    По частям:

    file
    определить, что находится в файле
    -L
    если это ссылка, проверить файл, на который она указывает
    /usr/bin/python3
    какой файл проверить (абсолютный путь)
  4. ls -ld data data/info.txt /bin /dev/null# четыре объекта разных типов
    что делает

    Что делает команда. Показывает четыре объекта разных типов, чтобы сравнить первые буквы строк: d, -, l, c.

    По частям:

    ls
    вывести содержимое каталога
    -l
    подробный список: права, владелец, размер, дата
    -d
    показать сам каталог, а не его содержимое
    data
    что показать
    data/info.txt
    что показать (путь относительно текущего каталога)
    /bin
    что показать (абсолютный путь)
    /dev/null
    что показать (абсолютный путь)
Результат

строки ls начинаются с d, -, l и c.

Снимок 6.1Ubuntu 24.04
  1. 1file определил содержимое как текст
  2. 2символы типа: l, c, d, -
Объекты разных типов и результат команды file.Весь снимок ↗

Объекты разных типов и результат команды file.

Что показывает снимок. Команда file определяет содержимое файлов, а первая буква в выводе ls -ld — тип объекта: l, c, d и -.

Где это пригодится. Если файл не открывается, file подскажет, что в нём на самом деле: текст, архив или программа, — независимо от расширения.

6.2 inode и жёсткие ссылки

Сведения о файле и его имя хранятся в разных местах. Тип, права доступа, владелец, размер, время изменения и расположение данных на диске записаны в структуре, которая называется inode. У каждого inode есть номер. Имени в inode нет: имена хранятся в каталогах. Каталог — это список соответствий «имя — номер inode».

Для сравнения подойдёт записная книжка с телефонами. В книжке записаны имя и номер, а сам человек существует отдельно от записи. Каталог устроен так же: в нём хранится имя файла и номер inode. Сам inode — это сведения о файле и ссылка на его данные.

Поскольку имя отделено от inode, на один inode могут указывать несколько имён. Дополнительное имя называется жёсткой ссылкой и создаётся командой ln. Все имена равноправны. В inode хранится счётчик ссылок; данные файла удаляются, только когда удалено последнее имя.

В той же аналогии жёсткая ссылка — это вторая запись в книжке с другим именем, но с тем же номером телефона. Если удалить одну запись, до человека всё равно можно дозвониться по второй.

Когда программа открывает файл data/info.txt, система выполняет три шага. Сначала в каталоге data находит имя info.txt и номер inode. Затем по номеру читает inode и проверяет, есть ли у пользователя право на чтение. После этого по сведениям из inode находит на диске блоки с данными и читает их.

Схема · имена, inode и ссылки
Каталог linux-fhs-lab
    Каталог data
      inode
      В терминалеСоздание жёсткой ссылки
      1. cd ~/linux-fhs-lab
        что делает

        Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.

        По частям:

        cd
        сменить текущий каталог
        ~/linux-fhs-lab
        куда перейти (путь от домашнего каталога)
      2. stat data/info.txt# сведения из inode
        что делает

        Что делает команда. Выводит все сведения о файле из inode: размер, номер inode, число ссылок, права и даты.

        По частям:

        stat
        вывести сведения о файле из inode
        data/info.txt
        о каком файле (путь относительно текущего каталога)
      3. ls -li data/info.txt# номер inode и число ссылок
        что делает

        Что делает команда. Показывает файл вместе с номером inode и числом ссылок.

        По частям:

        ls
        вывести содержимое каталога
        -l
        подробный список: права, владелец, размер, дата
        -i
        добавить номер inode в начало строки
        data/info.txt
        что показать (путь относительно текущего каталога)
      4. ln data/info.txt data/info-hard.txt# создать второе имя
        что делает

        Что делает команда. Создаёт жёсткую ссылку — второе имя info-hard.txt для того же файла.

        По частям:

        ln
        создать ссылку на файл
        data/info.txt
        файл, на который делается ссылка (путь относительно текущего каталога)
        data/info-hard.txt
        имя новой ссылки (путь относительно текущего каталога)
      5. ls -li data/info*# сравнить два имени
        что делает

        Что делает команда. Показывает все файлы, чьи имена начинаются с info, вместе с номерами inode.

        По частям:

        ls
        вывести содержимое каталога
        -l
        подробный список: права, владелец, размер, дата
        -i
        добавить номер inode в начало строки
        data/info*
        что показать (путь относительно текущего каталога; звёздочка заменяет любые символы)
      Результат

      у обоих имён одинаковый номер inode, число ссылок равно 2.

      Снимок 6.2Ubuntu 24.04
      1. 1номер inode
      2. 2число ссылок до ln
      3. 3одинаковый номер inode у двух имён
      4. 4число ссылок после ln
      Два имени указывают на один inode.Весь снимок ↗

      Два имени указывают на один inode.

      Что показывает снимок. stat показывает сведения из inode, а после ln у двух имён одинаковый номер inode и счётчик ссылок равен 2.

      Где это пригодится. Жёсткие ссылки позволяют сделать один файл доступным под двумя именами без копирования. Этим пользуются программы резервного копирования: неизменённые файлы в новой копии не дублируются, а связываются жёсткими ссылками.

      6.3 Символические ссылки

      Символическая ссылка устроена иначе. Это отдельный объект со своим inode, в котором записан путь к другому файлу. При обращении к ссылке система переходит по записанному пути. Символическая ссылка может указывать на каталог или на файл в другой файловой системе, например /bin указывает на /usr/bin. Если файл по записанному пути удалить, ссылка перестанет работать.

      Символическая ссылка работает как ярлык на рабочем столе Windows. Ярлык хранит только адрес программы. Если программу удалить или перенести, ярлык останется на месте, но открыть через него уже ничего не получится.

      В терминалеСоздание символической ссылки
      1. cd ~/linux-fhs-lab
        что делает

        Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.

        По частям:

        cd
        сменить текущий каталог
        ~/linux-fhs-lab
        куда перейти (путь от домашнего каталога)
      2. ln -s data/info.txt info-link.txt# создать ссылку
        что делает

        Что делает команда. Создаёт символическую ссылку info-link.txt, которая хранит путь data/info.txt.

        По частям:

        ln
        создать ссылку на файл
        -s
        создать символическую ссылку; без -s создаётся жёсткая
        data/info.txt
        файл, на который делается ссылка (путь относительно текущего каталога)
        info-link.txt
        имя новой ссылки (путь относительно текущего каталога)
      3. ls -l info-link.txt
        что делает

        Что делает команда. Показывает ссылку и путь, на который она указывает.

        По частям:

        ls
        вывести содержимое каталога
        -l
        подробный список: права, владелец, размер, дата
        info-link.txt
        что показать (путь относительно текущего каталога)
      4. cat info-link.txt# чтение через ссылку
        что делает

        Что делает команда. Читает файл через ссылку: выводит содержимое файла, на который она указывает.

        По частям:

        cat
        вывести содержимое файла на экран
        info-link.txt
        какой файл вывести (путь относительно текущего каталога)
      5. readlink info-link.txt# путь, записанный в ссылке
        что делает

        Что делает команда. Выводит путь, записанный внутри ссылки.

        По частям:

        readlink
        показать, куда указывает символическая ссылка
        info-link.txt
        какую ссылку проверить (путь относительно текущего каталога)
      6. readlink -f info-link.txt# полный путь цели
        что делает

        Что делает команда. Выводит полный путь к файлу, на который указывает ссылка.

        По частям:

        readlink
        показать, куда указывает символическая ссылка
        -f
        вывести полный путь цели, пройдя все ссылки
        info-link.txt
        какую ссылку проверить (путь относительно текущего каталога)
      Результат

      ls показывает info-link.txt -> data/info.txt, cat выводит текст файла.

      Снимок 6.3Ubuntu 24.04
      1. 1тип l
      2. 2записанный в ссылке путь
      3. 3текст целевого файла
      Символическая ссылка хранит путь к файлу.Весь снимок ↗

      Символическая ссылка хранит путь к файлу.

      Что показывает снимок. Ссылка info-link.txt хранит путь data/info.txt, а cat читает содержимое целевого файла.

      Где это пригодится. Символическими ссылками переключают версии программ и настроек: ссылка указывает на текущую версию, а при обновлении её перенаправляют на новую.

      Разница между двумя видами ссылок видна, если удалить исходное имя data/info.txt. Жёсткая ссылка указывает на тот же inode, поэтому данные остаются доступны. Символическая ссылка хранит путь к удалённому имени и перестаёт работать. После повторного создания имени командой ln она снова работает.

      В терминалеУдаление исходного имени
      1. cd ~/linux-fhs-lab
        что делает

        Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.

        По частям:

        cd
        сменить текущий каталог
        ~/linux-fhs-lab
        куда перейти (путь от домашнего каталога)
      2. ls -li data/info.txt data/info-hard.txt info-link.txt# исходное состояние
        что делает

        Что делает команда. Показывает оба имени файла и ссылку с номерами inode перед опытом.

        По частям:

        ls
        вывести содержимое каталога
        -l
        подробный список: права, владелец, размер, дата
        -i
        добавить номер inode в начало строки
        data/info.txt
        что показать (путь относительно текущего каталога)
        data/info-hard.txt
        что показать (путь относительно текущего каталога)
        info-link.txt
        что показать (путь относительно текущего каталога)
      3. rm data/info.txt# удалить одно имя
        что делает

        Что делает команда. Удаляет имя info.txt. Данные остаются, пока есть второе имя info-hard.txt.

        По частям:

        rm
        удалить файл
        data/info.txt
        какой файл удалить (путь относительно текущего каталога)
      4. ls -li data/info-hard.txt info-link.txt# после удаления имени
        что делает

        Что делает команда. Показывает, что у файла осталось одно имя, а ссылка стала битой.

        По частям:

        ls
        вывести содержимое каталога
        -l
        подробный список: права, владелец, размер, дата
        -i
        добавить номер inode в начало строки
        data/info-hard.txt
        что показать (путь относительно текущего каталога)
        info-link.txt
        что показать (путь относительно текущего каталога)
      5. cat info-link.txt# чтение через символическую ссылку
        что делает

        Что делает команда. Читает файл через ссылку: выводит содержимое файла, на который она указывает.

        По частям:

        cat
        вывести содержимое файла на экран
        info-link.txt
        какой файл вывести (путь относительно текущего каталога)
      6. cat data/info-hard.txt# чтение через жёсткую ссылку
        что делает

        Что делает команда. Читает данные через оставшееся жёсткое имя — текст на месте.

        По частям:

        cat
        вывести содержимое файла на экран
        data/info-hard.txt
        какой файл вывести (путь относительно текущего каталога)
      7. ln data/info-hard.txt data/info.txt# вернуть имя
        что делает

        Что делает команда. Возвращает имя info.txt тому же файлу, после чего символическая ссылка снова работает.

        По частям:

        ln
        создать ссылку на файл
        data/info-hard.txt
        файл, на который делается ссылка (путь относительно текущего каталога)
        data/info.txt
        имя новой ссылки (путь относительно текущего каталога)
      8. cat info-link.txt
        что делает

        Что делает команда. Читает файл через ссылку: выводит содержимое файла, на который она указывает.

        По частям:

        cat
        вывести содержимое файла на экран
        info-link.txt
        какой файл вывести (путь относительно текущего каталога)
      9. ls -li data/info.txt data/info-hard.txt# имён снова два
        что делает

        Что делает команда. Показывает, что у файла снова два имени с одним номером inode.

        По частям:

        ls
        вывести содержимое каталога
        -l
        подробный список: права, владелец, размер, дата
        -i
        добавить номер inode в начало строки
        data/info.txt
        что показать (путь относительно текущего каталога)
        data/info-hard.txt
        что показать (путь относительно текущего каталога)
      Результат

      через жёсткую ссылку текст читается, через символическую — ошибка No such file or directory.

      Снимок 6.4Ubuntu 24.04
      1. 1у файла осталось одно имя
      2. 2ссылка указывает на несуществующий путь
      3. 3ошибка при чтении через символическую ссылку
      4. 4данные доступны через жёсткую ссылку
      После удаления имени жёсткая ссылка сохранила доступ к данным, символическая перестала работать.Весь снимок ↗

      После удаления имени жёсткая ссылка сохранила доступ к данным, символическая перестала работать.

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

      Где это пригодится. Так появляются «битые» ссылки после удаления или переноса файлов. Команда ls выделяет такие ссылки красным цветом.

      Итоги части 6

      • Тип объекта обозначается первым символом в ls -l; содержимое определяет file.
      • Сведения о файле хранятся в inode, имя — в каталоге.
      • Жёсткая ссылка — дополнительное имя того же inode; данные удаляются вместе с последним именем.
      • Символическая ссылка хранит путь и перестаёт работать, если по этому пути нет файла.

      В отчётСнимки ls -li с одинаковыми номерами inode и опыта с удалением имени.

      Открыть в отдельной вкладке ↗