Мягкие (символьные) ссылки




Отчёт по лабораторной работе №5

по дисциплине «Современные операционные системы»

Выполнил: студент группы М091601(72) Креймер Андрей

Москва 2016 г.

Цель

Ознакомиться с ссылками в Linux.

Ход выполнения

В Unix-подобных системах существует два типа ссылок: жёсткие (hardlink) и мягкие или символьные (softlink, symboliclink или symlink).

В файловых системах UNIX-подобных ОС каждый объект имеет целочисленный идентификатор, уникальный в пределах одной файловой системы. Этот идентификатор является номером инода (inode) - структуры данных, хранящей метаданные объекта, такие как: тип, права доступа, размер, время последнего изменения и пр. Именно инод содержит список указателей на блоки данных с содержимым объекта. Символьное имя объекта в иноде не хранится.

Команда ls -l имя_объекта отображает на экране метаданные объекта. Флаг -i отображает номер инода.

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

Жёсткая ссылка - это имя объекта, связывающее его инод и директорию. У каждого объекта файловой системы есть как минимум одна жёсткая ссылка - имя, заданное при создании. Как только число жёстких ссылок становится равным нулю, и ни одна программа не держит объект открытым, он автоматически удаляется из системы (его блоки данных могут быть перезаписаны).

Жёсткие ссылки можно создавать только на файлы, но не на директории. Исключение составляют. и.., являющиеся созданными файловой системой жёсткими ссылками на текущую и родительскую директории соответственно. Поскольку жёсткие ссылки указывают на инод, уникальный в пределах файловой системы, их нельзя использовать для указания на объект другой файловой системы.

Для создания жёсткой ссылки используется команда lnимя_файлаимя_ссылки. Процесс создание демонстрируется ниже:

kran@kran-vb:~$ mkdir lab5

kran@kran-vb:~$ cd lab5/

kran@kran-vb:~/lab5$ touch Report.txt

kran@kran-vb:~/lab5$ echo "This is my report." >> Report.txt

 

kran@kran-vb:~/lab5$ mkdir links

kran@kran-vb:~/lab5$ cd links/

kran@kran-vb:~/lab5/links$ ln ~/lab5/Report.txt hl_Report.txt

 

kran@kran-vb:~/lab5/links$ cd ~

kran@kran-vb:~$ ln ~/lab5/Report.txt hl2_Report.txt

kran@kran-vb:~$ cat hl2_Report.txt

Thisismyreport.

Команда ls с флагом -li отобразит метаданные созданных ранее объектов файловой системы с номерами их инодов:

kran@kran-vb:~$ ls -li hl2_Report.txt ~/lab5/ ~/lab5/links/

5989 -rw-rw-r-- 3 kran kran 19 ноя 7 21:11 hl2_Report.txt

 

/home/kran/lab5/:

итого 8

56635 drwxrwxr-x 2 kran kran 4096 ноя 7 21:13 links

5989 -rw-rw-r-- 3 kran kran 19 ноя 7 21:11 Report.txt

 

/home/kran/lab5/links/:

итого 4

5989 -rw-rw-r-- 3 kran kran 19 ноя 7 21:11 hl_Report.txt

Проанализировав вывод команды ls, можно утверждать, что файлы Report.txt, hl_Report.txt и hl2_Report.txt представляют одни и те же данные (объекты имеют один и тот же номер инода). Число 3, идущее следом за правами доступа, указывает на количество жёстких ссылок для файла.

Чтобы найти все жёсткие ссылки на конкретный файл можно использовать команду find с флагом -samefile и именем файла или с флагом -inum и номером инода:

kran@kran-vb:~$ sudo find. -samefile ~/lab5/Report.txt

./hl2_Report.txt

./lab5/Report.txt

./lab5/links/hl_Report.txt

kran@kran-vb:~$ sudo find. -inum 5989

./hl2_Report.txt

./lab5/Report.txt

./lab5/links/hl_Report.txt

Изменение данных в файле по одной из его жёстких ссылок отобразится во всех остальных жёстких ссылках:

kran@kran-vb:~$ echo "Update file hl2_Report.txt =)" >> hl2_Report.txt

 

kran@kran-vb:~$ cd lab5/links/

kran@kran-vb:~/lab5/links$ cat hl_Report.txt

This is my report.

Update file hl2_Report.txt =)

То же самое касается изменений прав доступа:

kran@kran-vb:~/lab5/links$ chmod g-rw hl_Report.txt

 

kran@kran-vb:~/lab5/links$ cd..

kran@kran-vb:~/lab5$ rm Report.txt

kran@kran-vb:~/lab5$ mv../hl2_Report.txt.

 

kran@kran-vb:~/lab5$ cat hl2_Report.txt

Thisismyreport.

Update file hl2_Report.txt =)

 

kran@kran-vb:~/lab5$ ls -il links/hl_Report.txt hl2_Report.txt

5989 -rw----r-- 2 kran kran 49 ноя 7 21:46 hl2_Report.txt

5989 -rw----r-- 2 kran kran 49 ноя 7 21:46 links/hl_Report.txt

Как можно заметить, после удаления файла Report.txt (на который "ссылались" другие) и перемещения hl2_Report.txt из домашней директории пользователя в директорию lab5 исходные данные остались невредимыми, а число жёстких ссылок уменьшилось до двух.

Как говорилось выше, создать жёсткую ссылку на директорию невозможно:

kran@kran-vb:~/lab5$ ln links/ hl_links_dir

ln: links/: не допускается создавать жёсткие ссылки на каталоги

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

kran@kran-vb:~/lab5$ cp hl2_Report.txt copy_hl2_Report.txt

 

kran@kran-vb:~/lab5$ ls -li

итого 12

6001 -rw----r-- 1 kran kran 49 ноя 7 22:30 copy_hl2_Report.txt

5989 -rw----r-- 2 kran kran 49 ноя 7 21:46 hl2_Report.txt

56635 drwxrwxr-x 2 kran kran 4096 ноя 7 21:13 links

 

kran@kran-vb:~/lab5$ echo "Second update..." >> hl2_Report.txt

kran@kran-vb:~/lab5$ cat copy_hl2_Report.txt

This is my report.

Update file hl2_Report.txt =)

Мягкие (символьные) ссылки

Симлинки представляют собой файлы особого типа, которые ссылаются на другие объекты по имени, а не по номеру инода (в отличие от жёстких ссылок). Отсюда возникают следующие особенности таких ссылок:

  • Удаление, перемещение или переименование объекта-источника влечёт за собой "поломку" ссылки. Ссылки, которые указывают на несуществующий объект, называются битыми.
  • Удаление символьной ссылки никак не влияет на исходный объект.

Симлинки могут указывать на любой объект файловой системы, а также на объект другой файловой системы.

Для создания мягкой ссылки используется та же команда ln, но с флагом -s:

kran@kran-vb:~/lab5$ ln -s /home/kran/lab5/links../links_dir

kran@kran-vb:~/lab5$ ln -s lab5/links../links_dir2

 

kran@kran-vb:~/lab5$ cd..

kran@kran-vb:~$ ls -li links_dir links_dir2 lab5

7907 lrwxrwxrwx 1 kran kran 21 ноя 7 22:55 links_dir -> /home/kran/lab5/links

7909 lrwxrwxrwx 1 kran kran 10 ноя 7 22:55 links_dir2 -> lab5/links

 

lab5:

итого 12

6001 -rw----r-- 1 kran kran 49 ноя 7 22:30 copy_hl2_Report.txt

5989 -rw----r-- 2 kran kran 66 ноя 7 22:32 hl2_Report.txt

56635 drwxrwxr-x 2 kran kran 4096 ноя 7 21:13 links

 

kran@kran-vb:~$ ls links_dir

hl_Report.txt

kran@kran-vb:~$ ls links_dir2

hl_Report.txt

 

kran@kran-vb:~$ cd Рабочий\ стол/

kran@kran-vb:~/Рабочийстол$ mv ~/links_dir.

kran@kran-vb:~/Рабочийстол$ mv ~/links_dir2.

kran@kran-vb:~/Рабочийстол$ cd links_dir

kran@kran-vb:~/Рабочийстол/links_dir$ ls

hl_Report.txt

kran@kran-vb:~/Рабочийстол/links_dir$ cd..

kran@kran-vb:~/Рабочийстол$ cd links_dir2

bash: cd: links_dir2: Нет такого файла или каталога

Вывод команды ls подтверждает вышесказанное. Символьные ссылки с именами links_dir и links_dir2 являются новыми (номер инода ссылок отличен от номера инода объекта-источника) особыми (литера l перед правами доступа) файлами, указывающими на директорию с именем links (символ->). Использование абсолютного имени объекта-источника (/home/kran/lab5/links) гарантирует сохранение рабочего состояния ссылки при её перемещении. А ссылка links_dir2 на относительное имя (lab5/links) после перемещения на рабочий стол оказывается битой, поскольку ссылается на несуществующую директорию /home/kran/Рабочий\ стол/lab5/links.

Изменение имени объекта-источника также сделает из рабочей ссылки битую:

kran@kran-vb:~/Рабочийстол$ mv ~/lab5/links/ ~/lab5/dir1

kran@kran-vb:~/Рабочийстол$ cd links_dir

bash: cd: links_dir: Нет такого файла или каталога

"Поломанную" ссылку можно сделать рабочей, создав объект с тем же именем, на которое она ранее указывала (при этом типы нового и старого объектов файловой системы могут не совпадать):

kran@kran-vb:~/Рабочийстол$ echo "New object 'links' (not a dir)" > ~/lab5/links

kran@kran-vb:~/Рабочийстол$ cd links_dir

bash: cd: links_dir: Это не каталог

kran@kran-vb:~/Рабочийстол$ cat links_dir

New object 'links' (not a dir)

Чтобы найти все символьные ссылки на конкретный объект следует использовать команду find с флагом -lname и именем объекта:

kran@kran-vb:~/Рабочий стол$ cd ~

kran@kran-vb:~$ ln -s ~/lab5/links sl_links_nd

 

kran@kran-vb:~$ ls -li sl_links_nd

7912 lrwxrwxrwx 1 kran kran 21 ноя 8 01:13 sl_links_nd -> /home/kran/lab5/links

 

kran@kran-vb:~$ sudo find. -lname ~/lab5/links

./Рабочийстол/links_dir

./sl_links_nd

kran@kran-vb:~$ sudo find. -lname *links

./Рабочий стол/links_dir2

./Рабочий стол/links_dir

./sl_links_nd

Примечание: символ * перед именем объекта позволяет команде find найти ссылки как на относительные имена (links_dir2), так и на абсолютные имена (links_dir и sl_links_nd).

Выводы

В работе продемонстрировано поведение жёстких и мягких ссылок в файловой системе UNIX-подобных ОС в различных ситуациях.

Жёсткие ссылки - это имена объектов, связывающие их иноды с директориями. Их можно создавать только на файлы, но не на директории, а также нельзя использовать для указания на файл другой файловой системы. Каждый объект файловой системы имеет как минимум одну жёсткую ссылку - имя при создании. Если число жёстких ссылок объекта равно нулю, он автоматически удаляется из системы.

Мягкие или символьные ссылки - особый тип файлов, ссылающихся на другие объекты файловой системы по имени (абсолютному или относительному), а не по номеру инода. Удаление, перемещение или переименование объекта-источника влечёт за собой "поломку" ссылки. Удаление символьной ссылки не влияет на исходный объект. Мягкие ссылки могут указывать на любой объект файловой системы, а также на объект другой файловой системы.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: