Символьные ссылки и команда ln
Никак не могу врубиться в понятие символьной ссылки. Ну вот, допустим, я создаю файлы file1.txt с содержанием This is the first file и файл file2.txt с содержанием this is the second file . Далее ввожу команду ln file1.txt file2.txt и на меня ругается Linux, говорит, что не получилось создать жесткую ссылку. Что мне надо добавить в первый файл, чтобы он ссылался на второй ? В интернете почти все примеры с ln -s . Зачем нужен аргумент -s ? Был бы очень благодерн, если кто-нибудь объяснил бы на примере.
5 ответов 5
Пожалуй внесу и свою лепту, так как буквально позавчера разбирался что к чему крепится и конспектировал всё .
Простой исчерпывающий пример — лучшее объяснение: как говорится, лучше один раз пощупать, чем сто раз посмотреть.
Для начала создадим где-нибудь какую-нибудь папку для экспериментов (у меня, например, такая есть всегда — Tests , в домашнем каталоге):
Теперь создадим в ней файл source.txt с текстом 1 :
По умолчанию (при вызове без параметров) команда ln создаёт «жёсткую ссылку» («hard link»):
Жёсткая ссылка — хм . что за фигня.
A hard link is a link file created with the Linux or Unix ln command that points to a file’s inode.
Источник: computerhope.com.
Жёсткая ссылка — это файл, созданный с помощью команды Linux (или Unix) ln , который указывает на «inode» исходного файла.
OK. что такое «inode» файла.
Short for index node, an inode is information contained within a Unix system that contains details about each file, such as the node, owner, file, location of file, etc.
Источник: computerhope.com.
Сокращение от «index node»; inode — это информация внутри Unix-систем (внутри операционной системы), которая содержит детальное описание каждого файла; это описание включает в себя информацию о «node» файла, информацию о владельце файла, некоторую информацию о самом файле, информацию о месте расположения файла, и прочее.
OK. что такое «node» файла.
A node or node address is a name or number that identifies a specific computer or terminal in a group of interconnected computers on a network.
Источник: computerhope.com.
Node или node address — это имя или номер, который идентифицирует конкретный компьютер или терминал в группе взаимосвязанных по сети компьютеров.
То есть это некий идентификатор файла в системе .
Фу-у-у, вроде с теорией более-менее разобрались .
Итак, у нас на данный момент в папке Tests имеется файл source.txt с текстом 1 и жёсткая ссылка на него hard-link.txt .
Изменения как в source.txt , так и в hard-link.txt синхронизируются — ничего удивительного.
Если мы перенесём (удалим из текущей директории) любой из файлов в рамках нашей точки монтирования, то на втором файле это никак не скажется и синхронизация будет работать (имеется в виду если мы переносили файл конечно). Опять же — ничего удивительного: файл продолжает существовать пока на него указывает хоть одна ссылка (жёсткая).
Так в чём собственно прикол? Прикол в том, что как уже упоминалось выше, жёсткая ссылка ссылается на индекс файла (inode). Поэтому, например, если мы удалим любой из файлов, а затем создадим файл в этом же месте файл с таким же именем (и расширением), то кажется, что он должен быть синхронизирован с другим файлом, но не тут то было — связь потеряна: так как новый файл — новый индекс (то же самое и при копировании файла — создаётся новый файл с новым индексом и связь теряется).
Перейдём к символическим ссылкам .
При вызове ln с параметром -s или —symbolic будет создана символическая ссылка:
ln -s source.txt soft-link.txt
Alternatively referred to as a soft link or symlink, a symbolic link is a file that links to another file or directory using its path. Unlike a hard link, a symbolic link can link to any file or directory on any computer. If you are more familiar with Microsoft Windows you can think of a symbolic link as a shortcut in Linux. In Linux and Unix symbolic links are created with the ln command. In the Windows command line you can use the mklink command to create symbolic link from the command line.
Источник: computerhope.com.
Альтернативное название soft link (мягкая/гибкая ссылка) или symlink (симлинк); символическая ссылка — это файл, который связывается с другим файлом или директорией используя путь (адрес места расположения) последнего. В отличие от жёсткой ссылки, символическая ссылка может ссылаться на любой файл или директорию, находящуюся на любом компьютере. Если вы хорошо знакомы с Microsoft Windows, то вы можете думать о символических ссылках как о ярлыках в Linux. В Linux и Unix символические ссылки создаются с помощью команды ln . В командной строке Windows вы можете использовать команду mklink для создания символической ссылки через командную строку.
Иными словами символическая ссылка ссылается на адрес файла, а не индекс файла.
Если мы перенесём (удалим из текущей директории) символическую ссылку soft-link.txt , то это никак не отразится на исходном файле source.txt , однако при попытке открыть ссылку будет показываться сообщение о том, что связь нарушена и предлагаться удалить эту битую ссылку. А вот если мы перенесём (удалим из текущей директории) исходный файл source.txt , то файл soft-link.txt (наша символическая ссылка) станет пустым; однако, если мы создадим новый файл с таким же именем как и исходный файл ( source.txt ) в этой же директории, то синхронизация восстановится и будет работать.
Для начала, в чем ваша ошибка. Вы пытаетесь сделать некоторый файл ссылкой на другой. Но так не бывает. Создание ссылки — это создание нового имени для файла — и это имя не должно быть занято.
Удалите файл file2.txt — и команда ln file1.txt file2.txt заработает.
Параметр -s говорит делать символьную ссылку вместо жесткой.
Жесткая ссылка — это один и тот же файл в двух разных местах. Символьная ссылка — это особый файл, в которым написан адрес другого файла. На уровне пользователя, это по-прежнему один и тот же файл в разных местах.
Основная функциональная разница между ними — в поведении при удалении и замене.
Допустим, у нас есть файл file1.txt и две ссылки на него: жесткая file2.txt и символьная file3.txt .
Во всех трех файлах при открытии виден один и тот же текст. При изменении этого текста все три файла меняются синхронно.
Удалим файл file1.txt . Теперь у нас в файле file2.txt остался текст, который был в файле file1.txt на момент удаления (это же один и тот же файл, просто теперь у него на 1 имя меньше). А вот файл file3.txt больше не открывается — это сломанная (broken) ссылка.
Создадим новый файл file1.txt . Файл file2.txt не изменился — это теперь совсем другой файл. А вот файл file3.txt «починился» у него снова такое же содержимое, что и в file1.txt .
Теперь расскажу почему символьные ссылки применяют намного чаще жестких.
Во-первых, это ограничения. Жесткую ссылку нельзя создать на другом разделе — между разными файловыми системами могут работать только символьные ссылки. Жесткую ссылку нельзя создать на директорию — на директорию создаются только символьные ссылки.
Во-вторых, поведение при удалении. Есть все больше программ, которые вместо перезаписи файла удаляют либо переименовывают старый, после чего создают новый файл на старом месте. Так поступает новый Microsoft Office, так поступает Creation Kit для Скайрима — и это только то с чем я сталкивался недавно. СУБД SQLite может удалить файл журнала базы после зафиксированной транзакции. Поэтому символьная ссылка становится в некотором роде «надежнее», чем жесткая ссылка.
Не только новый офис, но и старый. Да и вообще, как сохранить файл, чтобы в случае сбоя системы не уничтожить данные? Только через переименование.
@NickVolynkin: Не, я имел в виду именно Save. Если я удалю данные из файла, начну писать новые, и произойдёт сбой, то будут потеряны все данные. Если сохраню данные в новый файл и потом переименую, при сбое останутся либо старые, либо новые данные. Такие себе транзакции-для-бедных.
Автор вопроса хочет чтобы file1.txt указывал на file2.txt, то есть в обратном порядке аргументы следует в ln передавать. Жёсткие ссылки на директории существуют и вы ими постоянно пользуетесь ( .. ссылается на родительскую директорию). Верно, что создание обычными пользователями жёстких ссылок на директории как правило запрещено. Учитывая сюрпризы работы с жёсткими ссылками, лучше рекомендовать создание символических ссылок ( ln -s ) и для обычных файлов.
Ссылка предназначена для создания дополнительной точки выхода в один и тот же файл. Пусть в директории first у вас находится файл file1.txt. Вам нужно создать точно такой же файл в директории second, тогда вы можете не копируя файл создать на него ссылку
ln first/file1.txt second/file1.txt
В результате, если вы поменяете содержимое файла в second/file1.txt, он изменится в first/file1.txt. На уровне файловой системы это один и тот же файл, только у него две точки входа. При удалении файла, операционная система следит за счетчиком ссылок, когда он становится равным 0, файл считается полностью удаленным.
Параметр -s позволяет создавать символическую ссылку
ln -s first/file1.txt second/file1.txt
second/file1.txt станет специальным типом файла: ссылкой. Вы можете удалить файл first/file1.txt и тогда ссылка будет вести на несуществующий файл. Кроме того, в отчете команды ls -la , вы будете видеть, что это ссылка на существующий файл, в случае жесткой ссылки (первый вариант) вы не сможете отличить одну точку входа от другой — обе они будут представлять один и тот же файл.
файл может продолжать существовать и без явного имени (процесс, который открыл файл, может продолжать с ним работать, используя file descriptor даже если соответствующее имя уже было удалено или его не было вообще: O_TMPFILE ).
ln file1.txt file2.txt пытается создать жёсткую ссылку (hardlink) между именем file2.txt и cодержимым файла file1.txt .
ln -s создаёт символьную ссылку (symlink) от file2.txt имени к file1.txt имени. Это разные вещи.
В обоих случаях, имя которое вы хотите использовать для ссылки/файла должно быть свободно—директория не должна содержать соответствующую запись (для команды ln file1.txt file2.txt , file2.txt не должен существовать).
Что мне надо добавить в первый файл, чтобы он ссылался на второй ?
Удалить первый файл и вызвать ln -s чтобы создать символьную ссылку на второй:
$ rm file1.txt $ ln -s file2.txt file1.txt
В этом случае: cat file1.txt вернёт this is the second file .
Обратите внимание: у вас аргументы в вопросе перепутаны, если вы хотели создать ссылку на содержимое второго файла. Правильный порядок аргументов:
ln "исходный файл" "новая ссылка на него"
(ссылка — это последний аргумент).
Люди пользуются жёсткими ссылками постоянно даже не зная об этом. Каждый раз создавая новый файл с именем, вы неявно также создаёте жёсткую ссылку на него по этому имени. Обращаясь к обычному файлу по имени, вы неявно используете жёсткую ссылку, чтобы найти его содержимое.
Жёсткая ссылка — это просто связь между именем файла в директории и его содержимым на диске (inode, etc). Если файл не удалён, то он имеет по крайней мере одну жёсткую ссылку ( rm file и unlink file выполняют одну и ту же операцию: удалить ссылку file , если файл имел больше одной жёсткой ссылки, то он продолжает быть доступен под соответствующими другими именами).
Создать «жёсткую ссылку» означает добавить ещё одно имя для файла. Новое имя настолько же реально как и все остальные имена файлов—нет более настоящего имени файла чем другие. Чтобы создать новую жёсткую ссылку для файла, соответствующее имя файла должно быть свободно. В вашем случае file2.txt уже является жёсткой ссылкой на файл с содержимым this is the second file . Если вы хотите чтобы file2.txt был ссылкой на file1.txt или его содержимое, то следует удалить существующую ссылку: unlink file2.txt (или rm file2.txt ) прежде чем создавать новую.
Символьная ссылка — это связь между одним именем файла и другим именем файла (существующим или нет). Это специальный файл, который можно создать, например, ln -s командой, чьё содержимое интерпретируется как имя другого файла. Утилиты, ориентированные на работу с содержимым файлов, обычно автоматически следуют по ссылкам, например, cat some-symlink выведет содержимое файла, на которое some-symlink указывает. С другой стороны утилиты, которые работают с именами файлов, имеют эффект на саму символьную ссылку, например rm some-symlink или unlink some-symlink удаляют some-symlink , не трогая файл, на который она ссылается. Иногда можно выбирать, например, stat -L заставляет stat следовать по ссылкам, в противном случае stat показывает информацию о самом symlink.
В большинстве случаев вы вероятно хотите создать именно symlink, оставляя hardlink для специализированных инструментов, таких как Time Machine на macOS (из-за относительной простоты symlink (меньше сюрпризов) и ограничений на hardlink).