Отчёт по лабораторной работе №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-подобных ОС в различных ситуациях.
Жёсткие ссылки - это имена объектов, связывающие их иноды с директориями. Их можно создавать только на файлы, но не на директории, а также нельзя использовать для указания на файл другой файловой системы. Каждый объект файловой системы имеет как минимум одну жёсткую ссылку - имя при создании. Если число жёстких ссылок объекта равно нулю, он автоматически удаляется из системы.
Мягкие или символьные ссылки - особый тип файлов, ссылающихся на другие объекты файловой системы по имени (абсолютному или относительному), а не по номеру инода. Удаление, перемещение или переименование объекта-источника влечёт за собой "поломку" ссылки. Удаление символьной ссылки не влияет на исходный объект. Мягкие ссылки могут указывать на любой объект файловой системы, а также на объект другой файловой системы.