Ссылки в Linux
Введение: Типы файлов в Linux | |
Жёсткие ссылки | |
Символические ссылки | |
Примеры применения | |
Похожие статьи |
Введение: Типы файлов в Linux
В Linux всё является файлами и ссылки не исключение.
Жёсткие ссылки
Выполните
ls -ld /etc
drwxr-xr-x. 85 root root 8192 Feb 06 23:25 /etc
85 в данном примере это значение hard link count - числа жёстких ссылок с таким же значеним метаданных.
-d значит показать сами директории а не их содержимое.
-l значит показывать в режиме long listing
Если добавить флаг -i (--inode), который показывает номер каждого файла - результат будет примерно следующим.
ls -ldi /etc
16777281 drwxr-xr-x. 85 root root 8192 Feb 06 23:253 /etc
К аналогичному результату приведёт команда
ls -ldi /etc/.
16777281 drwxr-xr-x. 85 root root 8192 Feb 06 23:25 /etc/.
ls -ldi /etc/. и ls -ldi /etc прилинкованы к одним и тем же метаданным
Таким образом минимальное число жёстких ссылок на диреторию равно двум.
По номеру inode можно найти путь до директории
sudo find / -inum 16777281
/etc
Если создать пустую директорию и изучить ссылки
mkdir d1
ls -ld d1
drwxr-xr-x 2 andrei users 4096 Feb 06 23:25 d1
ls -l d1
total 0
ls -la d1
total 8 drwxr-xr-x 2 andrei users 4096 Feb 06 23:25 . drwx------ 60 andrei users 4096 Feb 06 23:25 ..
ls -ldi d1 d1/.
582294 drwxr-xr-x 2 andrei users 4096 Feb 06 23:25 d1 582294 drwxr-xr-x 2 andrei users 4096 Feb 06 23:25 d1/.
Если создать в d1 поддиректорию - количество жёстких ссылок на d1 увеличится с 2 до 3 так как добавится ссылка из поддиректории.
mkdir d1/subd1
ls -la d1
total 12 drwxr-xr-x 3 andrei users 4096 Feb 06 23:25 . drwx------ 60 andrei users 4096 Feb 06 23:25 .. drwxr-xr-x 2 andrei users 4096 Feb 06 23:25 subd1
Можно сделать жёсткую ссылку на обычный файл
echo hi > file1
cat file1
hi
ls -l file1
-rw-rw-r--. 1 andrei andrei 3 Feb 06 23:25 file1
ln file1 file2
ls -l file1
-rw-rw-r--. 2 andrei andrei 3 Feb 06 23:25 file1
ls -li file1 file2
51314587 -rw-rw-r--. 2 andrei andrei 3 Feb 06 23:25 file1 51314587 -rw-rw-r--. 2 andrei andrei 3 Feb 06 23:25 file2
Как мы уже убедились file1 и file2 это один и тот же файл.
Жёсткие ссылки могут указывать на файлы только внутри своей файловой системы
ln /boot/vmlinuz-3.10.0-1160.49.1.el7.x86_64 ./link1
ln: failed to create hard link './link1' => '/boot/vmlinuz-3.10.0-1160.49.1.el7.x86_64': Invalid cross-device link
Символические ссылки
Помимо жёстких ссылок можно создавать символические ссылки (symbolic links)
ln -s file1 file3
ls -li file1 file2 file3
51314587 -rw-rw-r--. 2 andrei andrei 3 Feb 06 23:25 file1 51314587 -rw-rw-r--. 2 andrei andrei 3 Feb 06 23:25 file2 51314588 lrwxrwxrwx. 1 andrei andrei 5 Feb 06 23:25 file3 -> file1
Если удалить файл
file1
то ваш терминал должен начать сигнализировать о том, что символическая ссылка ведёт вникуда. Она может окрасится в красный, а несуществующий файл назначения будет мигать.
Жёсткая ссылка при удалении цели потеряет 1 в графе ссылки.
rm file1
ls -l
-rw-rw-r--. 1 andrei andrei 0 Feb 06 23:25 file2
lrwxrwxrwx. 1 andrei andrei 5 Feb 06 23:25 file3 -> file1
Обратите внимание на то, что у символической ссылки перед правами доступа стоит l
Символические ссылки могут указывать на файлы другой файловой системы
ln -s /boot/vmlinuz-3.10.0-1160.49.1.el7.x86_64 ./link1
ls -l
… lrwxrwxrwx. 1 andrei andrei 41 Feb 06 23:25 link1 -> /boot/vmlinuz-3.10.0-1160.49.1.el7.x86_64
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы. Если там пусто считайте это рекламой моей телеги
Практические примеры
Если система установлена на диск небольшого размера, например
SSD диск, для хранения мультимедиа имеет смысл подключить более дешёвый HDD диск.
Допустим, сперва вы пользовались директорией
/uploads
на SSD чтобы не менять код в проекте, можно перекинуть содержимое старой
/uploads
на новый HDD и сделать символическую ссылку вида
ln -s /mnt/hdd /uploads
Пример из
Nginx
В конфигурации Nginx есть такие директории как sites-available и sites-enabled
чтобы «включить» сайт нужно добавить в sites-enabled ссылку на сайт из sites-available
ll /etc/nginx | grep sites
drwxr-xr-x 2 root root 4096 tammi 20 18:12 sites-available/ drwxr-xr-x 2 root root 4096 tammi 20 18:12 sites-enabled/