Перейти к содержанию

4.5 Работа со ссылками (Working with Link Files)

Как обсуждалось ранее в этой главе, файловая система Linux поддерживает особый тип файла — файл-ссылку (link file). Файлы-ссылки не содержат данных в том смысле, в каком их содержат обычные файлы. Вместо этого они являются перенаправителями, указывающими на другой файл или каталог в файловой системе. В Linux существует два типа ссылок:

  • Жёсткая ссылка (Hard link) — файл, который непосредственно указывает на индексный дескриптор (inode) другого файла. Индексный дескриптор хранит основную информацию о файле в файловой системе Linux: его размер, устройство, владельца и права доступа. Поскольку оба файла используют один и тот же индексный дескриптор, после создания жёсткой ссылки фактически невозможно определить, какой из файлов является указателем, а какой — целью. Эти два файла ведут себя как один и тот же файл, даже если находятся в разных местах файловой системы.

  • Символьная ссылка (Symbolic link) — файл-ссылка, также указывающий на другой файл в файловой системе. Однако символьная ссылка имеет собственный индексный дескриптор. Благодаря тому что файл-указатель обладает собственным индексным дескриптором, указатель и цель в файловой системе легко различимы. Например, в предыдущей главе вы видели, что файл /usr/bin/vi на самом деле является символьной ссылкой, указывающей на файл /bin/vim. Это показано в следующем примере:

openSUSE:/usr/bin # ls -l vi
lrwxrwxrwx 1 root root 8 Jan 19 10:24 vi -> /bin/vim

Для создания файла-ссылки используется команда ln. Синтаксис: ln целевой_файл файл_ссылки. Вызов ln без параметров создаёт жёсткую ссылку. Для создания символьной ссылки применяется параметр -s. В следующем примере команда ln используется для создания символьной ссылки между файлом myapp в подкаталоге bin домашнего каталога пользователя и исполняемым файлом myapp, расположенным в /var/opt:

rtracy@ openSUSE:~/bin> ln -s /var/opt/myapp myapp
rtracy@ openSUSE:~/bin> ls -l
total 0
lrwxrwxrwx 1 rtracy users 14 2011-02-01 13:15 myapp -> /var/opt/myapp
rtracy@fs2:~/bin>cd ..
rtracy@fs2:~> myapp
This is my new executable script file.

С помощью команды ls -l видно, что myapp фактически указывает на исполняемый файл /var/opt/myapp. Это удобно, если программа /var/opt/myapp используется часто. Поскольку каталог /var/opt не включён в переменную окружения PATH пользователя, для каждого запуска myapp пришлось бы вводить полный путь к исполняемому файлу (либо предварительно переходить в каталог /var/opt). Однако подкаталог bin домашнего каталога автоматически добавляется в переменную окружения PATH файлами конфигурации оболочки bash. Разместив символьную ссылку в этом каталоге, можно запустить /var/opt/myapp, просто введя myapp в приглашении командной строки. Файл символьной ссылки перенаправит оболочку к нужному файлу в /var/opt и запустит его оттуда. Это показано в приведённом выше примере.

Примечание

В главе 6 мы рассмотрим ключевую роль, которую символьные ссылки играют при инициализации системы Linux процессом init.

Давайте закрепим управление файлами на практике в следующем упражнении.

Упражнение 4-3. Управление файлами и каталогами

В этом упражнении вы будете практиковать управление файлами и каталогами с помощью команд оболочки. Выполнить упражнение можно в виртуальной машине, поставляемой с этой книгой. Для подготовки правильно настроенной среды запустите снимок 4-1 (snapshot 4-1).

VIDEO Посмотрите видео к упражнению 4-3, в котором показано, как выполнить это задание.

Выполните следующие действия:

  1. Убедитесь, что система Linux запущена и вы вошли в систему как пользователь student. Откройте сеанс терминала и перейдите в домашний каталог, введя cd в приглашении командной строки.
  2. Создайте новый каталог в домашнем каталоге, введя mkdir MyFiles.
  3. Введите ls и убедитесь, что новый каталог создан.
  4. Создайте новый файл myfile.txt в каталоге MyFiles, введя touch ~/MyFiles/myfile.txt.
  5. Введите ls ~/MyFiles и убедитесь, что файл существует.
  6. Переключитесь на учётную запись суперпользователя root, введя su – и указав пароль student.
  7. Просмотрите системный журнал, введя cat /var/log/messages | more.
  8. Прокрутите несколько страниц файла, затем нажмите Ctrl+C для возврата в приглашение командной строки.
  9. Просмотрите последние записи файла журнала, введя tail /var/log/messages.
  10. Отслеживайте файл /var/log/messages при остановке и запуске служб, выполнив следующее:

    a. В приглашении командной строки введите tail -f /var/log/messages. Убедитесь, что файл журнала теперь отслеживается командой tail.

    b. Откройте новое окно терминала и переключитесь на учётную запись суперпользователя root с помощью команды su – и пароля пользователя root.

    c. Отключите сетевую карту системы, введя ifdown enp0s3 в приглашении командной строки.

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

    e. Переключитесь обратно во второй сеанс терминала и введите systemctl restart network. Снова должны появиться новые строки в файле по мере повторного включения сетевого адаптера в первом окне терминала.

    f. Дважды введите exit, чтобы закрыть второе окно терминала.

    g. Переключитесь в сеанс терминала, где выполняется tail, и нажмите Ctrl+C для выхода из tail.

  11. Вернитесь к своей обычной учётной записи, введя exit.

  12. Удалите каталог MyFiles из домашнего каталога, введя rm -r ~/MyFiles.
  13. Введите ls и убедитесь, что каталог и его содержимое удалены.
  14. Создайте копию файлов и подкаталогов домашнего каталога в /tmp, введя cp -R ~ /tmp.
  15. Просмотрите содержимое /tmp, введя ls /tmp. Убедитесь, что домашний каталог скопирован.
  16. Поработайте с символьными ссылками, выполнив следующее:

    a. Создайте символьную ссылку из каталога docs в домашнем каталоге на каталог /usr/share/doc, введя ln -s /usr/share/doc/ ~/docs.

    b. Введите ls -l. Убедитесь, что файл docs указывает на /usr/share/doc/.

    c. Введите cd docs.

    d. Введите pwd. В каком каталоге вы находитесь?

    e. Введите ls. Вы должны увидеть содержимое каталога /usr/share/doc/, несмотря на то что всё ещё находитесь в ~/docs.