Символические и жесткие ссылки в Linux. Команда ln
Что такое символические и жесткие ссылки в Linux. Чем они отличаются. Как создавать ссылки. Использование команды ln.
Оглавление
- Что такое ссылка на файл в Linux
- Что такое символические ссылки
- Что такое жесткие ссылки
- Отличия символических ссылок от жестких
Что такое ссылка на файл в Linux
Ссылка на файл в Linux — это указатель на файл. Если проводить аналогию с Windows, то ссылки чем-то похожи на ярлыки. То есть вы создаете ссылку, которая указывает на какой-либо файл или директорию, и можете разместить эту ссылку в другом каталоге. Обращаясь к такой ссылке, вы будете обращаться к настоящему файлу или каталогу.
Ссылки в Linux бывают двух типов: символические и жесткие. Не смотря на то, что оба типа называются ссылками, они имеют существенные отличия друг от друга. Поэтому очень важно понимать, как создавать и использовать тот или иной тип ссылок.
Что такое символические ссылки
Символическая ссылка (symbolic link) — это специальный файл, который является ссылкой на другой файл или каталог (их еще называют целевым файлом, целевым каталогом).
Символические ссылки также называют символьными, мягкими ссылками (soft links) или сим-ссылками (sym-link).
Важно понимать, что символическая ссылка не содержит в себе внутри копии самого файла, на которую она указывает. Она является всего лишь указателем на файл. Не смотря на это, символическая ссылка обладает собственными правами доступа, так как сама является небольшим файлом, который содержит путь до целевого файла.
Возвращаясь к аналогии с ярлыками в Windows, символические ссылки это своего рода ярлыки на файлы. Можно создавать несколько символических ссылок на один файл и эти ссылки могут иметь разные имена.
Связь между символической ссылкой и файлом, на который она указывает, является «мягкой». Если удалить символическую ссылку, то файл, на который она указывает, не удаляется.
Если удалить файл, на который указывает ссылка, то сама ссылка не обновляется и остается на диске. При этом она указывает на уже несуществующий файл. Аналогично, если переименовать или переместить целевой файл, то ссылка не обновляется автоматически.
При создании символических ссылок можно указывать относительный путь до целевого файла. В таком случае ссылка считает, что относительный путь указан относительно каталога, в котором создана сама ссылка (но не относительно каталога, из которого она была создана).
Схематично отношение между файлом, символической ссылкой и данными, которые хранятся в файле, можно показать следующим образом:
Что такое жесткие ссылки
Жесткая ссылка (hard link) является своего рода синонимом для существующего файла. Когда вы создаете жесткую ссылку, создается дополнительный указатель на существующий файл, но не копия файла.
Жесткие ссылки выглядят в файловой структуре как еще один файл. Если вы создаете жесткую ссылку в том же каталоге, где находится целевой файл, то они должны иметь разные имена. Жесткая ссылка на файл должна находится в той же файловой системе, где и другие жесткие ссылки на этот файл.
В Linux каждый файл имеет уникальный идентификатор — индексный дескриптор (inode). Это число, которое однозначно идентифицирует файл в файловой системе. Жесткая ссылка и файл, для которой она создавалась имеют одинаковые inode. Поэтому жесткая ссылка имеет те же права доступа, владельца и время последней модификации, что и целевой файл. Различаются только имена файлов. Фактически жесткая ссылка это еще одно имя для файла.
Жесткие ссылки нельзя создавать для директорий.
Жесткая ссылка не может указывать на несуществующий файл.
Жесткие ссылки появились раньше, чем символические, но сейчас уже устаревают. В повседневной работе жесткие ссылки используются редко.
Схематично отношение между исходным файлом, жесткой ссылкой и данными можно показать следующей схемой:
Отличия символических ссылок от жестких
Кратко подведем итог, написанного выше.
Символическая ссылка:
- Указывает на целевой файл или каталог. Фактически является небольшим файлом, содержащим путь до целевого файла.
- Не содержит внутри себя содержимого самого файла. Содержит путь к целевому файлу.
- Имеет собственные права доступа, которые не распространяются на целевой файл.
- Удаление / переименование / перемещение целевого файла не обновляет автоматически ссылку. Ссылка начинает указывать на несуществующий файл, становится неработающей.
- Изменение прав доступа у целевого файла не обновляет права доступа у ссылки.
- Может быть создана для директории.
- Ссылка и целевой файл имеют разные файловые индексы (inode) в файловой системе.
- Может указывать на несуществующий файл.
- Символическая ссылка может использовать относительный путь до целевого файла.
Жесткая ссылка:
- Является своего рода еще одним именем на файл.
- Не может указывать на директорию.
- Нельзя создавать жесткие ссылки между файлами разных файловых систем.
- Не может указывать на несуществующий файл.
- Жесткая ссылка и файл, для которого она создавалась, имеют одинаковые индексы (inode) в файловой системе.
Как создавать ссылки в Linux. Команда ln
Для создания ссылок в Linux используется команда ln (от слова link).
Синтаксис команды ln :
ln опции целевой_файл имя_ссылки
Обычно используется только одна опция -s . Полный список опций можно получить, выполнив команду man ln.
Создание символических ссылок
Чтобы создать символическую ссылку, нужно выполнить команду ln с опцией -s :
ln -s целевой_файл имя_символьной_ссылки
Например, создадим в текущем каталоге символическую ссылку с именем mylink на файл /home/pingvinus/myfile :
ln -s /home/pingvinus/myfile.txt mylink
Выполнив команду ls -li , можно увидеть, что ссылка myfile указывает на файл /home/pingvinus/myfile
ls -li 792300 -rw-rw-r-- 1 pingvinus pingvinus 13 фев 13 13:07 myfile.txt 787622 lrwxrwxrwx 1 pingvinus pingvinus 10 фев 13 13:08 mylink -> /home/pingvinus/pingvinus/myfile
Обратите внимание, что ссылка и целевой файл имеют разные inode (792300 и 787622. См. число в начале строки).
Если теперь удалить целевой файл, а затем попробовать просмотреть его содержимое, используя ссылку, то получим сообщение о том, что файл не найден:
rm myfile.txt ls -li 787622 lrwxrwxrwx 1 pingvinus pingvinus 10 фев 13 13:08 mylink -> /home/pingvinus/pingvinus/myfile cat mylink cat: mylink: Нет такого файла или каталога
Пример создания и использования символьной ссылки (при создании ссылки используется относительный путь до целевого файла, если такую ссылку переместить, то она будет невалидна):
Создание жестких ссылок
Чтобы создать жесткую ссылку нужно использовать команду ln без опции -s .
ln целевой_файл имя_жесткой_ссылки
Например, создадим жесткую ссылку с именем hardlinktofile на файл myfile.txt :
ln myfile.txt hardlinktofile
Выведем список файлов:
ls -li 787622 -rw-rw-r-- 2 pingvinus pingvinus 13 фев 13 13:19 hardlinktofile 787622 -rw-rw-r-- 2 pingvinus pingvinus 13 фев 13 13:19 myfile.txt
Можно заметить, что hardlinktofile и myfile.txt имеют одинаковый inode=787622, так как являются фактически разными именами для одного файла (inode которого 787622).
Также видно, что на данный inode имеется 2 ссылки (см. цифру 2 в 3-м столбце). Если мы удалим исходный файл, то количество ссылок на него уменьшается на 1, то есть на самом деле файл не удаляется, так как на него больше, чем 1 ссылка. И мы по прежнему можем работать с файлом по имени hardlinktofile.
rm myfile.txt ls -li 787622 -rw-rw-r-- 1 pingvinus pingvinus 13 фев 13 13:19 hardlinktofile cat hardlinktofile Hello World!
Обратите внимание, что после выполнения команды rm, количество ссылок на файл стало равно 1.
Пример создания и использования жесткой ссылки:
Как удалить ссылку
Ссылки, как и обычные файлы, можно удалять, используя команду rm :
rm имя_ссылки
Создание ссылок через файловый менеджер
Некоторые графические файловые менеджеры поддерживают создание символических ссылок. Чтобы создать символическую ссылку в таком файловом менеджере, достаточно кликнуть правой кнопкой мыши по файлу и выбрать в меню пункт Создать ссылку ( Create Link , Make Link ).
Ссылка создается в том же каталоге, где находится целевой файл. После создания ссылку можно переместить в другой каталог.
Резюме
Ссылки — это удобный инструмент при работе с файлами в Linux. Мы рассмотрели два вида ссылок, которые существуют в Linux. Рассмотрели отличия символических ссылок от жестких. Для создания ссылок используется команда ln . При повседневной работе обычно используются символические ссылки, в то время как жесткие ссылки используются редко.
Создание ссылок в Linux
В командной оболочке Linux, чтобы создать еще одну жесткую ссылку на файл, то есть еще одно имя, используется команда ln (от «link» – ссылка, связывать). Первым аргументом указывается существующее имя файла, вторым – имя новой ссылки. Адреса обоих аргументов могут быть как относительными, так и абсолютными.
В примере для файла butt2.png , который находится в каталоге image , создаются две дополнительные жесткие ссылки. Одна – в текущем каталоге ( ./ ), другая – в папке Загрузки . В первом случае файл не переименовывается, т. к. это не обязательно, ведь полные имена файлов различны. Однако можно и переименовать, как это происходит во втором случае.
С помощью команды ls -l можно убедиться, что на файл указывают три жесткие ссылки.
Мы можем посмотреть информацию о каждом имени и убедиться, что это один и тот же файл, так как все данные совпадают.
Символьные ссылки создаются с помощью той же команды ln , однако используется ключ -s (от «symbolic»). В качестве первого аргумента пишется абсолютный адрес файла или каталога, на который делается ссылка, в качестве второго – абсолютный или относительный адрес создаваемой мягкой ссылки.
Здесь на рабочем столе создаются две символьные ссылки: на каталог image и на файл 2018.ods . Имя ссылки можно оставить таким же как у объекта, если ссылка создается в другом каталоге. Команда ls -l среди прочего отображает адрес, на который указывает символьная ссылка. Если бы мы при создании мягкой ссылки использовали относительные адреса источников, то они так бы и хранились, и файлы-ссылки были бы нерабочими.
Практическая работа
Создайте текстовый файл с помощью перенаправления вывода команды cal . Создайте на этот файл дополнительную жесткую ссылку. Внесите изменения в файл, обратившись к нему по второму имени. Изменения можно внести, дописав ( >> ) в файл дату с помощью перенаправления вывода команды date . Посмотрите содержимое файла, воспользовавшись первым именем файла. Тем самым вы убедитесь, что имеете дело с одним и тем же файлом, доступным под разными именами.
Создайте символьную ссылку на каталог. Посмотрите в графической оболочке, как дистрибутив Linux по особому обозначает такой объект (обычно у иконки появляется маленькая черная стрелка).
Курс с ответами к заданиям и дополнительными уроками в PDF
X Скрыть Наверх
Введение в Linux и Bash. Курс
Символические и жёсткие ссылки в Linux
Есть два вида ссылок в Linuх: символические и жёсткие. Ссылки — это особенность файловой системы Linux, которая позволяет размещать один и тот же файл в нескольких директориях.
Типы ссылок сильно отличаются друг от друга и используются для разных целей.
Символическая ссылка
Содержит адрес нужного файла или директории в файловой системе. При клике открывается файл или директория, на которую ссылается ссылка. Если удалить файл, то ссылка останется, но будет указывать в никуда.
- Может ссылаться на файл и каталог.
- После удаления, перемещения или переименования файла ссылка становится недействительной.
- Ссылка имеет собственные права доступа и номер inode. При изменении прав доступа к целевому файлу права ссылки не меняются.
- Можно ссылаться на другие разделы диска.
- Содержат только имя файла или каталога, а не его содержимое.
Создать символическую ссылку можно командой:
ln -s /backup/source/ /opt/prog/mylink
Где /backup/source/ — папка, которая должна существовать и на которую нужно ссылаться.
А /opt/prog/mylink — создаваемая ссылка, не должна существовать на момент выполнения команды.
Жёсткая ссылка
Все жёсткие ссылки — это отдельные файлы, но ведут к одному участку жёсткого диска, где расположены данные файла. Файл можно перемещать между каталогами, все ссылки останутся рабочими.
- Работает только в пределах одной файловой системы.
- Нельзя ссылаться на каталоги.
- Ссылка имеет те же права доступа и номер inode, что и исходный файл. При изменении разрешений файла изменятся права ссылки.
- Можно перемещать и переименовывать и даже удалять файл без вреда для ссылки.
Создать жёсткую ссылку можно командой:
ln -P /backup/source/file1.txt /opt/prog/mylink/file2.txt
Где /backup/source/file1.txt — файл, на который нужно ссылаться.
А /opt/prog/mylink/file2.txt — создаваемая жёсткая ссылка, не должна существовать на момент выполнения команды.
В общем виде
ln опции файл_источник файл_ссылки
- -d разрешить создавать жесткие ссылки для директорий суперпользователю.
- -f удалять существующие ссылки.
- -i спрашивать нужно ли удалять существующие ссылки.
- -P создать жесткую ссылку.
- -r создать символическую ссылку с относительным путем к файлу.
- -s создать символическую ссылку.
Что такое символические ссылки в Linux? Как создать символические ссылки?
Символическая ссылка, также известная как символическая или программная ссылка , представляет собой специальный тип файла, который просто указывает на другой файл или каталог, как ярлыки в Windows. Создание символической ссылки похоже на создание псевдонима для реального файла .
Если вы пытаетесь получить доступ к символической ссылке, вы фактически получаете доступ к целевому файлу, на который указывает символическая ссылка. Изменения, выполненные для содержимого файла ссылки, изменяют содержимое фактического целевого файла.
Если вы используете команду ls с опцией -l , вот как выглядит символическая ссылка:
lrwxrwxrwx 1 abhishek abhishek 23 Jul 2 08:51 link_prog -> newdir/test_dir/prog.py
В большинстве дистрибутивов Linux ссылки отображаются другим цветом, чем остальные записи, так что вы можете отличить ссылки от обычных файлов и каталогов.
Символические ссылки предлагают удобный способ организации и обмена файлами. Они обеспечивают быстрый доступ к длинным и запутанным путям каталогов. Они активно используются при компоновке библиотек в Linux.
Теперь, когда вы немного знаете о символических ссылках, давайте посмотрим, как их создавать.
Как создать символическую ссылку в Linux
Чтобы создать символическую ссылку на целевой файл из имени ссылки , вы можете использовать команду ln с опцией -s, например:
ln -s target_file link_name
Опция -s здесь важна. Определяет, что ссылка является мягкой ссылкой. Если вы не используете его, он создаст жесткую ссылку . Я объясню разницу между мягкими ссылками и жесткими ссылками в другой статье.
Что нужно помнить о символических ссылках
Символические ссылки иногда могут сбивать с толку, поэтому следует помнить о нескольких вещах.
Изменения, внесенные в ссылку, отражаются в исходном файле.
В этом и заключается вся цель ссылок. Вы получаете доступ к целевому файлу, перейдя по ссылке. Вы можете внести изменения в целевой файл по ссылкам. Давайте посмотрим на примере.
У меня есть файл prog.py в newdir / test_dir. Имеет следующие атрибуты:
-rw-r--r-- 1 abhishek abhishek 163 Apr 13 15:07 newdir/test_dir/prog.py
Теперь я создам мягкую ссылку на этот файл в моем текущем каталоге:
ln -s newdir/test_dir/prog.py link_prog
Вот атрибуты вновь созданной ссылки:
lrwxrwxrwx 1 abhishek abhishek 23 Jul 2 08:51 link_prog -> newdir/test_dir/prog.py
Заметьте l (это L, а не один) в начале строки? Если вы знакомы с правами доступа к файлам в Linux , вы должны знать, что «l» означает ссылку и, следовательно, говорит, что этот файл на самом деле является ссылкой. Давайте обновим вашу память, — означает файл, а d означает каталог.
Теперь, если я использую эту ссылку для изменения содержимого или атрибутов, то же самое будет отражено в целевом файле. Например, я использую сенсорную команду в программной ссылке, и вы заметите, что она изменяет временную метку целевого файла.
touch link_prog ls -l newdir/test_dir/prog.py -rw-r--r-- 1 abhishek abhishek 163 Jul 2 10:04 newdir/test_dir/prog.py
Это ссылка на файл или каталог? Вы можете не знать!
Как бы вы узнали, указывает ли ссылка на файл или каталог? Вы не сможете узнать, пока не пойдете по пути и не получите доступ к самому целевому файлу.
Вы можете создавать ссылки на несуществующий файл или каталог
Да, это вполне возможно. Вот почему вы должны быть осторожны при создании программных ссылок в Linux. Целевой файл, на который вы ссылаетесь, не должен существовать. Вы не получите никакой ошибки или предупреждения при создании ссылки на несуществующий файл/каталог.
Вы получите ошибку только при попытке получить доступ к целевому файлу, либо по ссылке, либо самостоятельно. Команда ls все равно будет работать.
ln -s non_existant_dir link_dir less link_dir link_dir: No such file or directory
Символические ссылки создаются с разрешения 777, но это ничего не значит
Заметили ли вы разрешение файла на символическую ссылку? Символические ссылки всегда создаются с разрешением 777 (rwxrwxrwx). Для обычного файла это будет означать, что любой может получить доступ к файлу. Но это не относится к ссылкам.
lrwxrwxrwx 1 abhishek abhishek 23 Jul 2 08:51 link_prog -> newdir/test_dir/prog.py
Если права доступа к файлам для ссылок обрабатываются как есть, любой пользователь может создать символическую ссылку на безопасный файл и получить к нему свободный доступ. Это было бы серьезной проблемой безопасности. К счастью, этого не происходит. Поскольку разрешение на целевые файлы имеет значение, а не разрешение на ссылки.
Вы можете использовать команду chmod, чтобы изменить разрешение для ссылки, но это изменит разрешение связанного файла, а не самой ссылки.
Вы можете сослаться на ссылку ссылки или символическую ссылку
Вы можете сделать символическую ссылку, которая указывает на другую ссылку и так далее. Это называется символической связью. Лучше избегать их, поскольку это создает больше путаницы.
Ну вот и все. Я полагаю, что теперь вы лучше знакомы с программными ссылками и знаете, как создавать символические ссылки в Linux. Вы можете прочитать о команде symlinks, которая может помочь вам найти сломанные символические ссылки в Linux и легко управлять ими.
Свежие записи
- Начало работы с Liquibase
- Укрощение высокой загрузки ЦП cAdvisor
- Понимание действий GitHub
- Добавление собственных бегунов (GitHub Runers)
- VPN, Proxy и Tor: сохранение анонимности в сети в 2022 году
Записи Архивов по месяцам
Рубрики
- Active Directory (1)
- Airflow (2)
- Ansible (1)
- Apache NiFi (3)
- Apache Tomcat (1)
- Apache Zeppelin (3)
- Artifactory (1)
- Astra Linux (4)
- cadvisor (1)
- CentOS8 (33)
- CI/CD (8)
- CMS (3)
- Confluence (1)
- Debian (6)
- DNF (1)
- DNS (1)
- Docker (4)
- ETL (2)
- Fedora (1)
- ftp (5)
- GitHub (4)
- GitLab (1)
- Grafana (8)
- InfluxDB (2)
- InfluxDB 2.0 (1)
- Linux (163)
- liquibase (1)
- MySql (7)
- NextCloud (4)
- Nginx (5)
- Oracle Database (1)
- OwnCloud (3)
- Postgresql (7)
- Prometheus (3)
- Proxy (1)
- RedHat (39)
- SQLite (1)
- SSH (4)
- SVN (1)
- Tor (1)
- Ubuntu (24)
- Ubuntu Studio (1)
- VPN (2)
- Web Panel (2)
- Web Сервер (13)
- Windows (24)
- Zabbix (16)
- Автоматизация обмена данными (3)
- Анализ и Визуализация Данных (3)
- Анализ Кода (1)
- Анонимные ОС (4)
- Антивирусы (1)
- Без рубрики (4)
- Виртуальные Машины (8)
- Клиенты Удаленного Подключения (1)
- Команды (7)
- Менеджер Пакетов (2)
- Облако (6)
- Окружение рабочего стола (1)
- Операционные Системы (184)
- Почтовые Клиенты (4)
- Программное Обеспечение (94)
- Сетевое Хранилище (21)
- Система Wiki (1)
- Система управления версиями (9)
- Системы Автоматизации Развертывания (7)
- Системы Мониторинга (27)
- Системы Управления Базами Данных (22)
- Системы управления проектами (6)
- Системы Управления Проектом (9)
- Служба каталогов (2)
- Средства Разработки (3)
- Удаленное Подключение (11)