Ссылки в Linux
Введение: Типы файлов в Linux | |
Жёсткие ссылки | |
Символические ссылки | |
Примеры применения | |
Похожие статьи |
Введение: Типы файлов в Linux
В Linux всё является файлами и ссылки не исключение.
Жёсткие ссылки
Выполните
ls -ld /etc
drwxr-xr-x. 85 root root 8192 Mar 15 21:01 /etc
85 в данном примере это значение hard link count - числа жёстких ссылок с таким же значеним метаданных.
-d значит показать сами директории а не их содержимое.
-l значит показывать в режиме long listing
Если добавить флаг -i (--inode), который показывает номер каждого файла - результат будет примерно следующим.
ls -ldi /etc
16777281 drwxr-xr-x. 85 root root 8192 Mar 15 21:013 /etc
К аналогичному результату приведёт команда
ls -ldi /etc/.
16777281 drwxr-xr-x. 85 root root 8192 Mar 15 21:01 /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 Mar 15 21:01 d1
ls -l d1
total 0
ls -la d1
total 8 drwxr-xr-x 2 andrei users 4096 Mar 15 21:01 . drwx------ 60 andrei users 4096 Mar 15 21:01 ..
ls -ldi d1 d1/.
582294 drwxr-xr-x 2 andrei users 4096 Mar 15 21:01 d1 582294 drwxr-xr-x 2 andrei users 4096 Mar 15 21:01 d1/.
Если создать в d1 поддиректорию - количество жёстких ссылок на d1 увеличится с 2 до 3 так как добавится ссылка из поддиректории.
mkdir d1/subd1
ls -la d1
total 12 drwxr-xr-x 3 andrei users 4096 Mar 15 21:01 . drwx------ 60 andrei users 4096 Mar 15 21:01 .. drwxr-xr-x 2 andrei users 4096 Mar 15 21:01 subd1
Можно сделать жёсткую ссылку на обычный файл
echo hi > file1
cat file1
hi
ls -l file1
-rw-rw-r--. 1 andrei andrei 3 Mar 15 21:01 file1
ln file1 file2
ls -l file1
-rw-rw-r--. 2 andrei andrei 3 Mar 15 21:01 file1
ls -li file1 file2
51314587 -rw-rw-r--. 2 andrei andrei 3 Mar 15 21:01 file1 51314587 -rw-rw-r--. 2 andrei andrei 3 Mar 15 21:01 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 Mar 15 21:01 file1 51314587 -rw-rw-r--. 2 andrei andrei 3 Mar 15 21:01 file2 51314588 lrwxrwxrwx. 1 andrei andrei 5 Mar 15 21:01 file3 -> file1
Если удалить файл
file1
то ваш терминал должен начать сигнализировать о том, что символическая ссылка ведёт вникуда. Она может окрасится в красный, а несуществующий файл назначения будет мигать.
Жёсткая ссылка при удалении цели потеряет 1 в графе ссылки.
rm file1
ls -l
-rw-rw-r--. 1 andrei andrei 0 Mar 15 21:01 file2
lrwxrwxrwx. 1 andrei andrei 5 Mar 15 21:01 file3 -> file1
Обратите внимание на то, что у символической ссылки перед правами доступа стоит l
Символические ссылки могут указывать на файлы другой файловой системы
ln -s /boot/vmlinuz-3.10.0-1160.49.1.el7.x86_64 ./link1
ls -l
… lrwxrwxrwx. 1 andrei andrei 41 Mar 15 21:01 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/