headermask image
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

LPI 101: Устройства, файловые системы Linux и стандарт FHS. Жесткие и символические ссылки

Жесткие ссылки

Жесткими ссылками называются указатели на inode. Так, фактически наименование файла является ссылкой на узел inode, содержащий информацию о файле. Как вы уже знаете, с помощью команды ls с параметром -i можно отобразить номера inode для записей файлов и каталогов.

Вы можете использовать команду ln для создания дополнительных жестких ссылок на существующие файлы (но не на каталоги, даже несмотря на то, что в системе . и .. определены как жесткие ссылки). Если на один узел inode указывает несколько ссылок, этот узел будет удален только тогда, когда количество ссылок на него станет равным нулю.

В листинге 58 показано, как создать файл и жесткую ссылку на него. Также там показано, что даже при удалении исходного наименования файла вторая жесткая ссылка предотвращает стирание при этом узла inode.

Листинг 58. Жесткие ссылки

ian@pinguino:~$ echo testing > file1
ian@pinguino:~$ ls -l file*
-rw-r--r-- 1 ian ian 8 2005-12-26 15:35 file1
ian@pinguino:~$ ln file1 file2
ian@pinguino:~$ ls -l file*
-rw-r--r-- 2 ian ian 8 2005-12-26 15:35 file1
-rw-r--r-- 2 ian ian 8 2005-12-26 15:35 file2
ian@pinguino:~$ rm file1
ian@pinguino:~$ ls -l file*
-rw-r--r-- 1 ian ian 8 2005-12-26 15:35 file2
ian@pinguino:~$ cat file2
testing

Жесткие ссылки могут существовать только в рамках определенной файловой системы. Они не могут связывать несколько файловых систем, так как ссылка на файл происходит по номеру inode, который уникален только в рамках файловой системы.

Поиск жестких ссылок

Если вам необходимо узнать, какие файлы ссылаются на определенный узел inode, вы можете использовать команду find и параметр -samefile с указанием имени файла или параметр -inum с указанием номера inode, как показано в листинге 59.

Листинг 59. Поиск жестких ссылок

ian@pinguino:~$ ln file2 file3
ian@pinguino:~$ ls -il file2
172 -rw-r--r-- 2 ian ian 8 2005-12-26 15:35 file2
ian@pinguino:~$ find . -samefile file2
./file2
./file3
ian@pinguino:~$ find . -inum 172
./file2
./file3

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

Другой формой ссылок, используемых в файловой системе Linux, является символические ссылки (чаще называемых просто symlink). В этом случае ссылка указывает на наименование другого объекта, а не на его узел inode. Символические ссылки могут указывать на каталоги и на файлы, расположенные в других файловых системах. Они часто используются для присвоения альтернативных имен системным командам. С помощью длинного листинга каталога можно увидеть объекты, являющиеся символическими ссылками; они обозначены маленькой буквой l в первом символе, как показано в листинге 60.

Листинг 60. Примеры символических ссылок

ian@pinguino:~$ ls -l /sbin/mkfs.*
-rwxr-xr-x 1 root root 14160 2005-09-20 12:43 /sbin/mkfs.cramfs
-rwxr-xr-x 3 root root 31224 2005-08-23 09:25 /sbin/mkfs.ext2
-rwxr-xr-x 3 root root 31224 2005-08-23 09:25 /sbin/mkfs.ext3
-rwxr-xr-x 2 root root 55264 2005-06-24 07:48 /sbin/mkfs.jfs
-rwxr-xr-x 1 root root 13864 2005-09-20 12:43 /sbin/mkfs.minix
lrwxrwxrwx 1 root root 7 2005-12-14 07:40 /sbin/mkfs.msdos -> mkdosfs
-rwxr-xr-x 2 root root 241804 2005-05-11 09:40 /sbin/mkfs.reiser4
-rwxr-xr-x 2 root root 151020 2004-11-25 21:09 /sbin/mkfs.reiserfs
lrwxrwxrwx 1 root root 7 2005-12-14 07:40 /sbin/mkfs.vfat -> mkdosfs
-rwxr-xr-x 1 root root 303788 2005-04-14 01:27 /sbin/mkfs.xfs

В дополнение к типу l вы можете видеть справа стрелку ->, за которой следует имя файла, на которое указывает ссылка. Например, команда mkfs.vfat является символической ссылкой на команду mkdosfs. Вы найдете множество подобных ссылок в /sbin и других системных каталогах. Ещё одной отличительной особенностью символических ссылок является размер файла, равный длине имени файла, на который указывает эта ссылка.

Вы можете создать символическую ссылку с помощью команды ln с параметром -s, как показано в листинге 61.

Листинг 61. Создание символических ссылок

ian@pinguino:~$ touch file5
ian@pinguino:~$ ln -s file5 file6
ian@pinguino:~$ ln -s file5 file7
ian@pinguino:~$ ls -l file*
-rw-r--r-- 2 ian ian 8 2005-12-26 15:35 file2
-rw-r--r-- 2 ian ian 8 2005-12-26 15:35 file3
-rw-r--r-- 1 ian ian 0 2005-12-26 17:40 file5
lrwxrwxrwx 1 ian ian 5 2005-12-26 17:40 file6 -> file5
lrwxrwxrwx 1 ian ian 5 2005-12-26 17:40 file7 -> file5

Заметьте, что количество ссылок в листинге каталога не обновилось. Удаление ссылки не влияет на файл, на который она ссылается. Символическая ссылка не защищает файл от удаления; в случае, если файл, на который указывает ссылка, перемещается или удаляется, эта ссылка будет испорчена. По этой причине во многих системах для обозначения символических ссылок в листинге каталогов используются различные цвета, чаще всего – светло-голубой для хороших ссылок и красный для испорченных.

Поиск символических ссылок

Если вам необходимо узнать, какие файлы символически ссылаются на определенный файл, вы можете использовать команду find и параметр -lname с указанием имени файла, как показано в листинге 62. В ссылках могут использоваться относительные и абсолютные пути, поэтому полезно поставить подстановочный символ «звездочка» перед именем искомого файла.

Листинг 62. Поиск символических ссылок

ian@pinguino:~$ mkdir linktest1
ian@pinguino:~$ ln -s ~/file3 linktest1/file8
.ian@pinguino:~$ find . -lname "*file3"
./linktest1/file8
ian@pinguino:~$ find . -lname "*file5"
./file7
./file6

Пути и символические ссылки

В большинстве рассмотренных ранее примеров символические ссылки находились в той же каталоги, что и файлы, на которые они указывают, а пути в ссылках, соответственно, были относительные. В листинге 62 мы создали ссылку в подкаталоге linktest1, которая указывала на абсолютное расположение файла which (~/file3). При создании символических ссылок вам необходимо решить, какие пути вы будете использовать, относительные или абсолютные, так как вам доступны оба варианта. На рисунке 3 показано действие перемещения нескольких файлов и символических ссылок в подкаталог.

Рисунок 3. Символические ссылки и пути
fig31.gif

Красный цвет означает, что ссылка linktest1/file8 теперь испорчена. Это неудивительно, поскольку файла ~/file3 больше не существует. Однако две символические ссылки на file5 остаются хорошими, так как файл находится по тому же относительному пути, даже несмотря на то, что сам файл и обе ссылки были перемещены. Жестких и точных правил, которые позволяют выбрать, какие пути использовать в символических ссылках, абсолютные или относительные, не существует; отчасти это определяется вероятностью перемещения ссылок и файлов, на которые они указывают. Просто не забывайте учитывать этот вопрос при создании символических ссылок.

Испорченные символические ссылки

Одно завершающее замечание по нашей испорченной ссылке. Попытка чтения из файла завершится ошибкой, так как файл не существует. Однако попытка записи сработает, если у вас есть достаточно полномочий для записи в файл, на который указывает ссылка, как показано в листинге 63.

Листинг 63. Чтение и запись в испорченную символическую ссылку

ian@pinguino:~$ cat linktest1/file8
cat: linktest1/file8: No such file or directory
ian@pinguino:~$ echo "test file 8" >> linktest1/file8
ian@pinguino:~$ cat linktest1/file8
test file 8
ian@pinguino:~$ find . -name file3
./linktest2/file3
./file3

Поскольку я могу создавать файлы в моем каталоге home, запись в символическую ссылку приведет к созданию отсутствующего файла, на который она указывает.

Источник: ibm developerworks

Похожие посты
  • LPI 101: Устройства, файловые системы Linux и стандарт FHS. Установка владельца и группы файла
  • Описание более 350 команд Linux c примерами.
  • LPI 101: Устройства, файловые системы Linux и стандарт FHS. Монтирование и размонтирование файловых систем
  • Mac4Lin: как Linux превратить в Mac
  • LPI 101: Устройства, файловые системы Linux и стандарт FHS. Дисковые квоты
  • LPI 101: Устройства, файловые системы Linux и стандарт FHS. Целостность файловых систем
  • LPI 101: Устройства, файловые системы Linux и стандарт FHS. Поиск и расположение системных файлов
  • LPI 101. Аппаратные средства и архитектура. Коммуникационные устройства
  • Ubuntu 7.10
  • LPI 101: Устройства, файловые системы Linux и стандарт FHS. Полномочия доступа к файлам и управление доступом