Глава 3. О файлах и файловых системах

Аннотация

После начальной разведки в Главе 2, Быстрый старт, мы готовы более подробно обсудить файлы и каталоги системы Linux. Многие пользователи испытывают трудности с Linux, т.к. они недостаточно изучили, где и какие данные хранятся в системе. Мы постараемся пролить свет на организацию файлов в файловой системе.

Мы также составим список наиболее важных файлов и каталогов, будем использовать разные способы просмотра содержимого тех файлов, и узнаем, как могут быть созданы, перемещены и удалены файлы и каталоги.

После выполнения упражнений этой главы, вы будете уметь:

Общий обзор файловой системы Linux

Файлы

Общее

Простое описание системы UNIX, также применимое к Linux, заключается в следующем:

"В системе UNIX, все есть файл; а если что-то не файл, то это процесс".

Это утверждение правда, т.к. существуют специальные файлы, которые больше, чем просто файлы (именованные каналы и сокеты, например), но для простоты допускают обобщение и говорят, что все есть файл. Система Linux, как и UNIX, не делает никакой разницы между файлом и каталогом, так как каталог - это просто файл, содержащий имена других файлов. Программы, службы, тексты, изображения и т.д. — все это файлы. В системе Linux устройства ввода и вывода и вообще все устройства считаются файлами.

Для того, чтобы организованно управлять всеми этими файлами, человеку удобно представлять их в виде упорядоченной древовидной структуры на жестком диске, что нам известна из MS-DOS (Дисковая Операционная Система), например. Большие ветви содержат больше ветвей, а в конце ветви содержат листья деревьев, т.е. обычные файлы. В настоящее время мы будем использовать это представление о дереве, но потом мы узнаем, почему это не совсем точный образ.

Виды файлов

Большинство файлов просто файлы, называемые обычными файлами; они содержат обычные данные, например, текстовые файлы, исполняемые файлы (или программы), файлы ввода или вывода программ и т.д.

Хотя предположение, что все что вы обнаружите в системе Linux представляет собой файл достаточно верное, есть некоторые особенности.

  • Каталоги: файлы, которые представляют собой списки других файлов.
  • Специальные файлы: механизм использования ввода-вывода. Большинство специальных файлов находятся в /dev, мы их обсудим позже.
  • Ссылки: механизм обеспечения видимости файла или каталога во множестве частей файлового дерева системы. Мы в деталях поговорим о ссылках.
  • (Домены) сокеты: особый тип файла, подобный сокетам TCP/IP, обеспечивающий взаимодействие в сети процессов, защищенных контролем файловой системы на доступ.
  • Именованные каналы: действуют более или менее похоже на сокеты и обеспечивают способ коммуникации между процессами без использования правил поведения сетевых сокетов.

Опция -l команды ls отображает тип файла, на что указывает первый символ в каждой выводимой строке:

jaime:~/Documents> ls -l
total 80
-rw-rw-r--   1 jaime   jaime   31744 Feb 21 17:56 intro Linux.doc
-rw-rw-r--   1 jaime   jaime   41472 Feb 21 17:56 Linux.doc
drwxrwxr-x   2 jaime   jaime    4096 Feb 25 11:50 course

Эта таблица дает обзор символов, характеризующих тип файла:

Таблица 3.1. Типы файлов

Символ Значение
- Обычный файл
d Директория
l Ссылка
c Специальный файл
s Сокет
p Именованный канал
b Блочное устройство

Чтобы не нужно было всегда выводить длинный список для просмотра файлового типа, многие системы по умолчанию выдают не просто ls, а ls -F, который добавляет суффиксы к именам файлов с виде одного из символов “/=*|@”, которые указывают на тип файла. Чтобы было еще легче начинающим пользователям, обе опции и -F и --color обычно комбинируют, см. Раздел, "Дополнительная информация о ls". Для лучшей удобочитаемости в этом документе мы будем использовать ls -F.

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

Теперь, прежде чем мы рассмотрим важные файлы и каталоги, нам нужно узнать побольше о разделах.

О разметке

Зачем разделы?

Большинство людей имеют смутное представление о том, что такое разделы, так как каждая операционная система самостоятельно способна их создавать или удалять. Может показаться странным, что Linux использует более чем один раздел на одном диске, даже когда выполняется стандартная процедура установки; для этого должно быть какое-то объяснение.

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

Этот принцип датируется теми днями, когда у Linux не было журналируемой файловой системы и сбои питания могли привести к катастрофе. По причинам обеспечения надежности и безопасности использование разделов осталось, так нарушение одной части системы, автоматически не означает, что весь компьютер в опасности. В настоящее время это самая важная причина для разметки. Простой пример: пользователь создает скритп, программу или веб-приложение, которые начинают заполнять диск. Если диск содержит только один большой раздел, вся система перестает работать, если диск заполнен. Если пользователь хранит данные на отдельном разделе, то только тот (с данными) раздел будет затронут, в то время как системные разделы и, возможно, другие разделы с данными сохранят функциональность.

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

Схемы и типы разделения

Есть два вида основных разделов в системе Linux:

  • раздел с данными: обычные данные системы Linux, включая корневой раздел, содержащий все данные для старта и запуска системы; и
  • раздел подкачки: расширение физической памяти компьютера, представляет собой дополнительную память на жестком диске.

Большинство систем содержат корневой раздел, один или несколько разделов с данными, и один или несколько разделов подкачки. Системы в смешанных средах, могут содержать разделы данных других систем, такие как разделы файловых системам FAT или VFAT с данными MS Windows.

Большинство систем Linux во время установки используют fdisk, чтобы задать тип раздела. Как вы могли заметить в ходе упражнений к Главе 1, это обычно происходит автоматически. Но однажды вам может так не повести. В таких случаях вам придется выбрать тип раздела вручную и даже вручную сделать настоящее разбиение на разделы. Стандартные разделы Linux имеют номера 82 для раздела подкачки и 83 для данных, который может быть журналируемым (ext3) или обычным (ext2, на старых системах). Утилита fdisk имеет встроенную помощь, на случай если вы забудете эти значения.

Наряду с этими двумя, Linux поддерживает множество других типов файловых систем, такие как относительно новая файловая система Reiser, JFS, NFS, FATxx и многие другие файловые системы, изначально доступные на других (проприетарных) операционных системах.

Стандартный корневого раздела (обозначается одиночной косой чертой, /), составляет около 100-500 МБ и содержит системные конфигурационные файлы, большинство основных команд и серверные программы, системные библиотеки, некоторое временное пространство и домашний каталог пользователя с правами администратора. Стандартная установка для корневого раздела требуется около 250 МБ.

Пространство для подкачки (обозначается как swap) доступно только для самой системы, и скрыто из виду при обычной работе. Раздел подкачки - это механизм, который обеспечивает, как и на обычных системах UNIX, продолжение вашей работы, что бы ни случилось. Из-за этой дополнительной памяти в Linux вы практически никогда не увидите раздражающих сообщений типа "Недостаточно памяти, пожалуйста закройте сначала некоторые приложения и попробуйте еще раз". Процедура подкачки или виртуальной памяти давно принята операционными системами уже вне мира UNIX.

Используемая память на жестком диске естественно медленнее, чем при использовании реальных микросхем памяти компьютера, но обеспечивает дополнительный комфорт. Мы узнаем больше о разделе подкачки, когда будем обсуждать процессы в Главе 4, Процессы.

Linux обычно рассчитывает на использование удвоенного количества физической памяти в пространстве подкачки на жестком диске. При установке системы, вы должны решить, как собираетесь это сделать. Например на системе с 512 Мб RAM:

  • 1-й вариант: один раздел подкачки в 1 Гб
  • 2-й вариант: два раздела подкачки по 512 МБ
  • 3-й вариант: с двумя жесткими дисками: по одному разделу в 512 МБ на каждом диске.

Последний вариант даст лучшие результаты, when a lot of I/O is to be expected.

Читайте документации к программному обеспечению для специфичных установок. Некоторые приложения, такие как базы данных, могут требовать большего пространства подкачки. Другие, такие как портативные системы, могут вообще не иметь никакой подкачки из-за нехватки жесткого диска. Пространство для подкачки может также зависеть от версии вашего ядра.

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

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

  • раздел для пользовательских программ (/usr)
  • раздел, содержащий персональные данные пользователей (/home)
  • раздел для хранения временных данных, таких как очереди печати и почты (/var)
  • раздел для дополнительного программного обеспечения (/opt)

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

Разделение жесткого диска на разделы определяется системным администратором. На больших системах он или она может даже развернуть один раздел на несколько жестких дисков, используя соответствующее ПО. Большинство дистрибутивов при стандартных установках имеют возможность оптимизироваться под рабочие станции (для обычных пользователей), под обычные цели сервера, но также допускают настройку разделов. Во время процесса установки вы можете определить вашу собственную схему разделов, используя либо специфический инструмент вашего дистрибутива, который обычно запускается в начале в графическом интерфейсе, или fdisk, инструмент текстового режима для создания разделов и установки их свойств.

Установка рабочей станции или клиентская установка осуществляется для использования главным образом одним и тем же человеком. Выбранное ПО для установки отражает это и акцент делается на общие пользовательские пакеты, такие как красивые темы рабочего стола, инструменты разработки, клиентские программы для работы с электронной почтой, мультимедийный софт, web и другие службы. Все это объединяется на одном большом разделе, добавляется пространство подкачки в два раза превышает объем оперативной памяти и ваша стандартная рабочая станция готова и обеспечивает наибольший объем дискового пространства для возможности личного пользования, но с недостатком возможной потери целостности данных во время проблемных ситуаций.

На сервере системные данные стремятся отделить от пользовательских данных. Программы различных служб хранятся отдельно от данных, которые они обрабатывают. На таких системах создаются различные разделы:

  • раздел со всеми данными, необходимыми для загрузки машины
  • раздел с конфигурационными данными и серверными программами
  • один или несколько разделов, содержащих серверные данные, такие как таблицы базы данных, почта пользователей, FTP-архив и т.д.
  • раздел с пользовательскими программами и приложениями
  • один или несколько разделов для конкретных пользовательских файлов (домашние каталоги)
  • один или несколько разделов подкачки (виртуальная память)

Службы обычно используют больше памяти и, следовательно, им нужно больше пространства подкачки. Некоторые процессы сервера, такие как связанные с базами данных, могут потребовать больше пространства подкачки, чем обычно; см. специальную документацию для подробной информации. Для повышения производительности swap часто разделяют на несколько разделов.

Точки монтирования

Все разделы подключаются к системе через точки монтирования. Точка монтирования определяет место расположения конкретных данных в файловой системе. Как правило все разделы связаны через раздел root. В этом разделе, который обозначается косой чертой (/), создаются каталоги. Эти пустые каталоги будут начальной точкой разделов, которые подключаются к нему. Например: дан раздел, содержащий следующие каталоги:

videos/		cd-images/	pictures/

Мы хотим подключить этот раздел к файловой системе в каталог /opt/media. Для того, чтобы сделать это, системный администратор должен убедиться, что каталог /opt/media существует в системе. Желательно, это должен быть пустой каталог. Как это делается объясняется далее в этой главе. Затем, используя команду mount, администратор может подключить раздел к системе. Если вы посмотрите на содержимое ранее пустой директории /opt/media, оно будет содержать файлы и каталоги, которые имеются на смонтированном носителе (жестком диске или разделе жесткого диска, CD, DVD, флэш-карте, USB или других устройствах хранения).

Во время запуска системы, именно так монтируются все разделы, которые описаны в файле /etc/fstab. Некоторые разделы не монтируются по умолчанию, если они постоянно не подключены к системе, например устройство хранения, используемое в вашей цифровой камере. Если все правильно настроено, то устройство будет смонтировано, сразу же как система замечает, что оно подсоединено, или оно может быть смонтировано пользователем, тогда вам не нужно быть системным администратором, чтобы подключать и отключать устройства к системе и от нее. Пример есть в Разделе "Использование rsync".

На работающей системе информацию о разделах и их точках монтирования можно получить с помощью команды df (которая показывает используемое пространство диска). В Linux команда df GNU варианта, и поддерживает опцию -h, которая значительно улучшает читаемость. Отметим, что на коммерческих системах UNIX есть свои собственные версии df и многих других команд. Обычно у них такое же поведение, хотя версии обычных инструментов от GNU, часто имеют больше функций и они лучше.

Команда df отображает только информацию об активных разделах (исключая раздел подкачки). Они могут включать разделы других доступных по сети систем, как в примере, приведенном ниже, где домашние каталоги монтируются с файлового сервера по сети, такая ситуация часто встречается в корпоративных средах.

freddy:~> df -h
Filesystem          Size  Used Avail Use% Mounted on
/dev/hda8           496M  183M  288M  39% /
/dev/hda1           124M  8.4M  109M   8% /boot
/dev/hda5            19G   15G  2.7G  85% /opt
/dev/hda6           7.0G  5.4G  1.2G  81% /usr
/dev/hda7           3.7G  2.7G  867M  77% /var
fs1:/home           8.9G  3.7G  4.7G  44% /.automount/fs1/root/home

Подробнее о схеме файловой системы

Обзор

Для удобства файловая система Linux обычно представляется в виде древовидной структуры. В стандартной системе Linux вы обнаружите подобный перечень и расположение, как на схеме приведенной ниже.

Рисунок 3.1. Схема файловой системы Linux

Структура каталогов ОС Linux

Это схема из системы RedHat. В зависимости от системного администратора, операционной системы и назначения UNIX-машины, структура может меняться, и каталоги по желанию могут быть опущены или добавлены. Даже не обязательно соответствие имен, они лишь соглашение.

Дерево файловой системы начинается со слэша, обозначаемого наклоненной вперед косой чертой (/). Это каталог, содержащий все основные каталоги и файлы, также называется корневой директорией или "корнем" файловой системы.

Каталогам, которые ниже корневого каталога лишь на один уровень, зачастую предшествует слэш, для указания их положения и предотвращения путаницы с другими каталогами, которые могут иметь такое же имя. Знакомясь с новой системой, всегда хорошая идея - заглянуть в корневую директорию. Давайте посмотрим, с чем вы можете там столкнуться:

emmy:~> cd /
emmy:/> ls
bin/   dev/  home/    lib/         misc/  opt/     root/  tmp/  var/
boot/  etc/  initrd/  lost+found/  mnt/   proc/    sbin/  usr/

Таблица 3.2. Подкаталоги корневого каталога

Директория Содержимое
/bin Общие программы для совместного использования системой, системным администратором и пользователями.
/boot Загрузочные файлы и ядро, vmlinuz. В некоторых последних дистрибутивах также данные grub. Grub – это большой единый загрузчик, который представляет собой попытку избавиться от многих различных загрузчиков известных нам на сегодняшний день.
/dev Содержит ссылки на все периферийные устройства, которые представлены файлами с особыми свойствами.
/etc Большинство важных системных файлов конфигурации находятся в /etc, этот каталог содержит данные, аналогичные тем что в Панели Управления Windows
/home Домашние каталоги обычных пользователей.
/initrd (в некоторых дистрибутивах) Информация для загрузки. Не удаляйте!
/lib Файлы библиотек, включает файлы для всех разновидностей программ, необходимых системе и пользователям.
/lost+found Каждый раздел имеет lost+found в его верхней директории. Здесь находятся файлы, которые были спасены во время сбоев.
/misc Для разных целей.
/mnt Стандартные точки монтирования для внешних файловых систем, например, CD-ROM'а или цифровой камеры.
/net Стандартные точки монтирования для удаленных файловых систем
/opt Как правило, содержит дополнительное ПО и ПО третьих сторон.
/proc Виртуальная файловая система, содержащая информацию о системных ресурсах. Более подробная информация о назначении файлов в proc можно получить, введя команду man proc в окне терминала. Файл proc.txt рассматривает виртуальную файловую систему в деталях.
/root Домашняя директория администратора. Помните о разнице между / (корневым каталогом) и /root (домашним каталогом пользователя root).
/sbin Программы для использования системой и системным администратором.
/tmp Временное место для использования системой, которое очищается после перезагрузки, так что не используйте ее под сохранение какой-нибудь работы!
/usr Программы, библиотеки, документация и т.д. для всех пользовательских программ.
/var Место хранения всех изменяемых и временных файлов, созданных пользователями, такие как log-файлы, почтовые очереди, the print spooler area, место для временного хранения файлов, загружаемых из Интернета, или сохранения образа CD перед записью.

Как вы можете узнать на каком разделе находится какой-нибудь каталог? Использование команды df с точкой (.) в качестве опции показывает раздел, которому принадлежит текущий каталог, и уведомляет о количестве используемого дискового пространства на этом разделе:

sandra:/lib> df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda7             980M  163M  767M  18% /

Как правило, каждый каталог в корневом каталоге находится на корневом разделе, за исключением когда он имеет отдельный вход в полным листинге команды df (или df -h без каких-либо других опций).

Узнайте больше в man hier.

Файловая система в реальности

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

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

Каждый раздел имеет свой собственный набор индексных дескрипторов; на всей системе с несколькими разделами могут существовать файлы с одним и тем же номером индексного дескриптора.

Каждый inode описывает структуру данных на жестком диске, хранит информацию о свойствах файла, в том числе физическое местоположение его данных. Когда жесткий диск назначается для хранения данных (обычно во время начала процесса установки системы или при добавлении дополнительных дисков к существующей) в разделе создается определенное количество индексных дескрипторов. Этот число будет максимальным количеством файлов всех типов (в том числе каталогов, специальных файлов, ссылок и т.д.), которые могут существовать в одно и то же время на данном разделе. Как правило, мы рассчитываем на 1 inode от 2 до 8 килобайт памяти.

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

  • Владельца и группа-владелец файла.
  • Тип файла (обычный, каталог, ...)
  • Разрешения на файл (Раздел "Права доступа: первая линия обороны Linux")
  • Дата и время создания, последнего открытия и изменения.
  • Дата и время, когда эта информация была изменена в индексном дескрипторе.
  • Количество ссылок на этот файл (см. далее в этой главе).
  • Размер файла
  • Адрес, определяющий фактическое расположение данных файла.

Время создания и время изменения.
В man-страницах вы натолкнетесь на atime (время доступа), ctime (время изменения свойств файла) и mtime (время изменения данных (содержания) файла). Вы не всегда можете узнать время создания файла. Если вы измените права доступа на файл, ctime изменится также и больше не будет отражать реального времени создания.

Единственная информация, не включенная в индексный дескриптор, это имя файла и каталога. Они хранятся в каталогах, этих особенных файлах. Сопоставляя имена файлов и номера inode, система может составлять древовидную структуру, которая понятна пользователю. Пользователи могут отображать номера inode, используя опцию -i команды ls. Индексные дескрипторы имеют свои собственные отдельные места на диске.

Ориентация в файловой системе

Когда вы хотите, чтобы система выполнила команду, вам почти никогда не надо давать полный путь к этой команде. Например, мы знаем, что команда ls находится в каталоге /bin (проверьте командой which -a ls), тем не менее, мы не обязаны вводить команду /bin/ls в компьютер, чтобы получить список содержимого текущей директории.

Дело в том, что об этом заботится переменная окружения PATH. В ней перечисляются те каталоги системы, где могут быть найдены исполняемые файлы, что освобождает пользователя от излишнего ввода символов и запоминания местонахождения команд. Естественно PATH (путь) содержит множество каталогов, обычно содержащих где-то в своих именах bin, что показано ниже. Команда echo используется для отображения содержимого ("$") переменной PATH:

rogier:> echo $PATH
/opt/local/bin:/usr/X11R6/bin:/usr/bin:/usr/sbin/:/bin

В этом примере, каталоги /opt/local/bin, /usr/X11R6/bin, /usr/bin, /usr/sbin и /bin являются местами последовательного поиска нужной программы. Как только она найдена, поиск останавливается, даже если еще не каждый каталог в path проверен. Это может привести к странным ситуациям. В первом примере ниже пользователь знает, что есть программа под названием sendsms для отправления SMS сообщений, и другой пользователь в той же самой системе может ей пользоваться, но не первый пользователь. Разница заключается в конфигурации переменной PATH:

[jenny@blob jenny]$ sendsms
bash: sendsms: command not found
[jenny@blob jenny]$ echo $PATH
/bin:/usr/bin:/usr/bin/X11:/usr/X11R6/bin:/home/jenny/bin
[jenny@blob jenny]$ su - tony
Password:
tony:~>which sendsms
sendsms is /usr/local/bin/sendsms

tony:~>echo $PATH
/home/tony/bin.Linux:/home/tony/bin:/usr/local/bin:/usr/local/sbin:\
/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin

Обратите внимание на использование средства su (переключение пользователей), которое позволяет запускать shell в среде другого пользователя, конечно при условии, что вы знаете пароль этого пользователя.

Обратная косая черта обозначает продолжение данной строки на другую и игнорирует разделение с помощью клавиши Enter.

В следующем примере, пользователь хочет вызвать команду wc (количество слов), чтобы проверить количество строк в файле, но ничего не происходит, и он вынужден прервать ее работу, используя комбинацию Ctrl + C:

jumper:~> wc -l test

(Ctrl-C)
jumper:~> which wc
wc is hashed (/home/jumper/bin/wc)

jumper:~> echo $PATH
/home/jumper/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:\
/usr/bin:/usr/sbin:/bin:/sbin

Использование команды which показывает нам, что у этого пользователя есть bin-каталог в его домашней директории, содержащей программу также под названием wc. Поскольку программа в домашнем каталоге находится первой при просмотре путей при вызове wc, выполняется эта «самодельная» программа, которая, вероятно, не понимает ввод, поэтому потребовалось ее завершить. Для решения проблем подобного рода есть несколько способов (вообще в UNIX/Linux всегда есть несколько вариантов решения проблем): одно решение — это переименовать программу wc пользователя, или пользователь может вводить полный путь к требуемой ему команде, который можно определить, используя опцию -a команды which.

Однако, если пользователь чаще использует программы из других каталогов, то может изменить последовательность просмотра каталогов на свой собственный вариант:

jumper:~> export PATH=/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:\
/usr/bin:/usr/sbin:/bin:/sbin:/home/jumper/bin

Изменения не постоянны!
Обратите внимание, что при использовании в командной строке команды export, изменения носят временный характер и действуют только в данной сессии (до выхода). Открытие новой сессии (даже если текущая первая по прежнему работает) не приводи к наличию в ней новых путей. Мы увидим в Разделе "Ваше текстовое окружение", как можно сделать такого рода изменения окружения постоянными, путем добавления этих строк в конфигурационные файлы оболочки.

Абсолютные и относительные пути

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

В другом случае, путь не начинается со слэша и возможна путаница по сравнению с предыдущим вариантом между ~/bin/wc (в домашнем каталоге пользователя) и bin/wc в /usr. Пути, которые не начинаются со слэша всегда относительные.

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

  • Если вы хотите компилировать исходный код, документация к установке часто инструктирует вас выполнить команду ./configure, которая запускает программу configure, расположенную в текущем каталоге (и которая поставляется с новым кодом), а ни где-то в другом месте системы.
  • В файлах HTML, относительных пути часто используются, чтобы сделать ряд страниц, легко переносимыми в другое место:

<img alt="Garden with trees" src="../images/garden.jpg">

  • Обратите внимание на различие еще раз:
theo:~> ls /mp3
ls: /mp3: No such file or directory
theo:~> ls mp3/
oriental/  pop/  sixties/

Наиболее важные файлы и каталоги

Ядро

Ядро является сердцем системы. Оно управляет связью между основной аппаратурой и периферией. Ядро также гарантирует, что процессы и демоны (серверные процессы) начинаются и останавливаются строго в требуемое время. У ядра много других важных задач, так много, что специальная рассылка по разработки ядра существуют только по тому вопросу, где огромные объемы информации являются общими. Мы бы зашли слишком далеко, обсуждая ядро в деталях. Сейчас достаточно знать, что ядро – это самый важный файл в системе.

Оболочка (Shell)

Что такое shell?

Когда я смотрела соответствующее разъяснение по концепции оболочки, это дало мне больше хлопот, чем я ожидала. Все доступные определения, от простого сравнения, что "оболочка - это руль автомобиля", к расплывчатому определению в руководстве Bash, где говорится, что "bash является sh-совместимым интерпретатором командного языка", до еще более неясного выражения "оболочка управляет взаимодействием между системой и ее пользователями". Shell гораздо больше, чем все это.

Самым лучшим сравнением для оболочки может быть представление о способе общения с компьютером, сравнение оболочки с языком. Большинство пользователей знают другой «язык», это язык «укажи-и-щелкни» графического рабочего стола. Но на этом языке компьютер задает беседу, а пользователю отведена пассивная роль выбора задач их тех, что представлены. Для программиста очень трудно включить в GUI-формат все опции и способы применения команд. Поэтому графические интерфейсы почти всегда менее способные, чем команды, стоящие за ним.

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

Типы оболочек

Так же как люди знают различных языки и диалекты, компьютеру известны различные типы оболочек:

  • sh или Bourne Shell: первая оболочка, которая до сих пор используются в системах UNIX. Это базовая оболочка, представляющая собой небольшую программу с незначительным числом функций. В POSIX-совместимом режиме bash будет эмулировать эту оболочку.
  • bash или Bourne Again Shell: стандартная оболочка GNU, интуитивно понятная и гибкая. Наиболее предпочтительная для начинающих пользователей, и в то же время являющаяся мощным инструментом для опытных и профессиональных пользователей. На Linux bash – это стандартная оболочка обычных пользователей. Эта оболочка является так называемой расширенной Bourne shell, с множеством дополнений и плагинов. Это означает, что Bourne Again SHell совместима с Bourne shell: команды, которые работают в sh, также работают в bash. Однако, обратное не всегда соответствует действительности. Все примеры и упражнения в этой книге приведены с использованием bash.
  • csh или C Shell: синтаксис этой оболочки напоминает синтаксис языка программирования Си. Иногда используется программистами.
  • tcsh или Turbo C Shell: расширенный вариант обычной C Shell, обеспечивает большее удобство и скорость.
  • ksh или оболочка Корна: иногда ценится людьми с опытом работы в UNIX. Расширение оболочки Борна; в стандартной конфигурации – кошмар для начинающих пользователей.

Файл /etc/shells дает обзор известных системе Linux оболочек:

mia:~> cat /etc/shells
/bin/bash
/bin/sh
/bin/tcsh
/bin/csh

Хитрость оболочки Борна.
Обратите внимание, что /bin/sh, как правило, ссылка на Bash, которая будет при вызове по этому пути выполнять в оболочке Борна совместимый режим.

Ваша оболочка, которая используется по умолчанию, описывается в файле /etc/passwd, подобно этой строке для пользователя mia:

mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash

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

mia:~> tcsh
[mia@post21 ~]$

Какую оболочку я использую?

Если вы не знаете, какую оболочку используете, либо проверьте строку для вашей учетной записи в /etc/passwd, либо введите команду
echo $SHELL

Ваш домашний каталог

Ваш каталог является вашим местонахождением по умолчанию при подключении к системе. В большинстве случаев это подкаталог /home, хотя это можно изменить. Ваш домашний каталог может находиться на жестком диске удаленного файлового сервера, в этом случае домашнюю директорию можно найти в /nethome/your_user_name. В другом случае системный администратор может сделать выбор в пользу менее понятной схемы и ваша домашняя директория может оказаться на /disk6/HU/07/jgillard.

Каким бы ни был путь к вашей домашней директории, вы не должны слишком беспокоиться об этом. Правильный путь к вашей домашней директории хранится в переменной окружения HOME на случай, если какой-нибудь программе это потребуется. С помощью команды echo вы можете вывести на экран содержимое этой переменной:

orlando:~> echo $HOME
/nethome/orlando

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

pierre@lamaison:/> quota -v
Diskquotas for user pierre (uid 501): none

В случае, если квоты были установлены, вы получите список разделов, на которые распространяются ограничения, и размер последних. Превышение пределов может быть допущено во время льготного периода с меньшими ограничениями или их отсутствием. Детальную информацию можно получить с помощью команд info quota или man quota.

Нет Quota?
Если ваша система не может найти quota, то никаких ограничений в отношении использования файловой системы не применяется.

Ваш домашний каталог обозначается символом тильды (~), это сокращение для /path_to_home/user_name (домашнего каталога пользователя). Этот же путь хранится в переменной HOME, так что вам не нужно набирать лишнее для перехода в домашний каталог. Простое применение: переход из /var/music/albums/arno/2001 в images в вашем домашнем каталоге с помощью одной элегантной команды:

rom:/var/music/albums/arno/2001> cd ~/images

rom:~/images> pwd
/home/rom/images

Далее в этой главе мы поговорим о командах для управления файлами и каталогами, все это поможет сохранить порядок в вашем домашнем каталоге.

Наиболее важные конфигурационные файлы

Как мы уже отмечали ранее, подавляющее большинство конфигурационных файлов хранятся в директории /etc. Содержание файлов может быть просмотрено с помощью команды cat, которая отправляет текст файлов на стандартный вывод (обычно ваш монитор). Синтаксис прямо вперед вами:

cat file1 file2 ... fileN

В этом разделе мы постараемся дать обзор наиболее распространенных конфигурационных файлов. Это, конечно, не полный список. Добавление дополнительных пакетов может также привести к добавлению дополнительных файлов конфигурации в /etc. При чтении конфигурационных файлов, вы увидите, что они, как правило, очень хорошо прокомментированы и не требуют пояснений. У некоторых файлов также имеются man-страницы, которые содержат дополнительную документацию, например man group.

Таблица 3.3. Большинство распространенных конфигурационных файлов

Файл Информация/служба
aliases Файл почтовых псевдонимов для использования с почтовыми серверами Sendmail и Postfix. Запуск почтового сервера на каждой системе давно стал обычным делом в мире UNIX, и почти каждый дистрибутив Linux по-прежнему поставляется с пакетом Sendmail. В этом файле локальные имена пользователей сопоставляются с реальными именами, которые имеют место в E-mail адресах или других локальных адресах.
apache Config-файлы для веб-сервера Apache.
bashrc Общесистемный конфигурационный файл для Bourne Again Shell. Определяет возможности и псевдонимы для всех пользователей. У других оболочек могут быть свои собственные общесистемные конфигурационные файлы, к примеру cshrc.
Каталоги crontab и cron.* Настройка задач, которые должны периодически выполняться - резервное копирование, обновления баз данных системы, очистка системы, изменяющиеся журналы и т.д
default Параметры по умолчанию для некоторых команд, таких как useradd.
filesystems Известные файловые системы: ext3, vfat, iso9660 и т.д.
fstab Список разделов и их точек монтирования.
ftp* Настройка FTP-сервера: кто может подключаться, какие части системы доступны и т.д.
group Файл конфигурации для пользовательских групп. Используйте теневые утилиты groupadd, groupmod и groupdel для редактирования этого файла. Редактируйте вручную, только если точно знаете, что делаете.
hosts Список машин, с которыми можно связаться по сети, но без использования службы доменных имен. Это не имеет ничего общего с сетевой конфигурацией системы, которая настраивается в /etc/sysconfig.
inittab Информация для загрузки: режим, количество текстовых консолей и т.д.
issue Информация о дистрибутиве (версия и/или информация о ядре).
ld.so.conf Места файлов библиотек.
lilo.conf, silo.conf, aboot.conf и т.д. Загрузочная информации для LInux LOader, системы для загрузки, которую в настоящее время постепенно вытесняет GRUB.
logrotate.* Ротация журналов, система предотвращения накопления огромного количества лог-файлов.
mail Каталог, содержащий инструкции для деятельности почтового сервера.
modules.conf Конфигурация модулей, которые включают специальные функции (драйвера).
motd Сообщение дня. Показывается каждому, кто подключается к системе (в текстовом режиме), может быть использована системным администратором для объявления о техническом обслуживании системы и т.д.
mtab Смонтированные в данный момент файловые системы. Рекомендуется никогда не редактировать этот файл.
nsswitch.conf Order in which to contact the name resolvers when a process demands resolving of a host name.
pam.d Конфигурация модулей аутентификации.
passwd Список локальных пользователей. Используйте теневые утилиты useradd, usermod и userdel для редактирования этого файла. Правьте вручную только, когда действительно знаете что делаете.
printcap Устаревший, но по-прежнему часто используемый файл конфигурации принтера. Не изменяйте его вручную, если точно не знаете, что делаете.
profile Система расширенной конфигурации среды shell: переменные, свойства по умолчанию новых файлов, ограничение ресурсов и т.д.
rc* Каталоги, определяющие активные службы для каждой запущенной ступени.
resolv.conf Последовательность, в которой связываются с DNS-серверами (только серверы доменных имен).
sendmail.cf Главный конфигурационный файл сервера Sendmail.
services Соединения, принятые на этой машине (открытые порты).
sndconfig или sound Настройка звуковой карты и звуковых событий.
ssh Каталог, содержащий конфигурационные файлы для защиты оболочки клиента или сервера.
sysconfig Каталог, содержащий системные конфигурационные файлы: мышь, клавиатура, сеть, рабочий стол, системные часы, управление питанием т.д. (характерно для RedHat).
X11 Параметры графического сервера, X. RedHat использует XFree, что находит отражение в имени основного конфигурационного файла, XFree86Config. Также содержит общие каталоги оконных менеджеров, имеющихся в системе, например, gdm, fvwm, twm и т.д
xinetd.* или inetd.conf Конфигурационные файлы для Интернет-сервисов, that are run from the system's (extended) Internet services daemon (servers that don't run an independent daemon).

В данном руководстве мы узнаем больше об этих файлах и изучим в деталях некоторые из них.

Наиболее распространенные устройства

Устройства, под которыми обычно понимается все, что принадлежит периферии ПК, что не является самим процессором, представлены в системе как запись в каталоге /dev. Одним из преимуществ этого UNIX-способа управления устройствами является то, что ни пользователю, ни системе не нужно беспокоиться о спецификации устройств.

Пользователи, которые не знакомы с Linux или UNIX в целом, часто перегруженные количеством новых имен и понятий, должны учиться. Поэтому приведем список обычных устройств, описанных в этом введении.

Таблица 3.4. Основные устройства

Имя Устройство
cdrom CD привод
console Специальный вход для используемой в настоящее время консоли.
cua* Последовательные порты
dsp* Устройства для оцифровки и записи
fd* Записи для большинства видов гибких дисков, по умолчанию это /dev/fd0, дисковод для дискет по 1,44 Мбайт.
hd[a-t][1-16] Стандартная поддержка дисков IDE с максимальным количеством разделов для каждого.
ir* Инфракрасные устройства
isdn* Управление соединением ISDN
js* Джойстики
lp* Принтеры
mem Память
midi* MIDI-плеер
mixer* и music Идеализированная модель миксера (смешивает или добавляет сигналы)
modem Модем
mouse (также msmouse, logimouse, psmouse, input/mice, psaux) Все виды мышей
null Бездонный ящик для мусора
par* Записи для поддержки параллельных портов
pty* Псевдотерминалы
radio* Для радиолюбителей (HAM).
ram* Загрузочное устройство
sd* SCSI диски с их разделами
sequencer Для аудио приложений, использующих особенности синтезатора звуковой карты (контроллер MIDI-устройства).
tty* Виртуальные консоли моделирования терминалов vt100.
usb* USB карта и сканер.
video* Для использования с графической картой, поддерживающей видео.

Наиболее распространенные временные файлы

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

В качестве меры безопасности эти файлы обычно хранят отдельно от основных системных файлов, поэтому мы можем закрыть на них глаза, а где нужно устанавливать более строгие разрешения. Многие из этих файлов также требуют больше прав, чем обычно, как /var/tmp, который должен быть доступен для записи для всех. Основную массу пользовательской активности можно обнаружить именно здесь, которая даже может генерироваться анонимными интернет-пользователями, подключенными к вашей системе. Это одна из причин, почему каталог /var, включая все его подкаталоги, обычно делают на отдельном разделе. Таким образом, например, пытаются избежать риска, ведь может случиться почтовая бомба, заполняющая свободную часть файловой системы, содержащей более важные данные, такие как ваши программы и файлы конфигурации.

/var/tmp и /tmp
Файлы в /tmp могут быть удалены без уведомления в процессе выполнения очередных задач системы или в результате перезагрузки. В некоторых (индивидуально настроенных) системах /var/tmp может вести себя непредсказуемо. Тем не менее, поскольку это не так по умолчанию, мы рекомендуем использовать директорию /var/tmp для сохранения временных файлов. Если есть сомнения, обратитесь к системному администратору. Если вы управляете вашей системой сами, то можете быть уверены в безопасности этого места, если целенаправленно не изменяли настройки для /var/tmp (с правами администратора, обычный пользователь этого сделать не может).
Что бы вы не делали, старайтесь придерживаться привилегий, предоставленных обычному пользователю - не сохраняйте файлы непосредственно в корневой каталог (/) файловой системы, не помещайте их в каталог /usr или или его подкаталог или в другое непредназначенное место. Это в значительной степени ограничивает ваш доступ к безопасной файловых систем.

Одной из основных систем безопасности в UNIX, и конечно в каждом дистрибутиве Linux, является журнал учета объектов, который записывает все действия пользователя, процессы, системные события и т.д. Файл конфигурации так называемого syslogdaemon определяет, какая и как долго вошедшая информация будет храниться. По умолчанию все журналы находятся в каталоге /var/log, содержащем различные файлы журналов доступа, серверов, системных сообщений и т.д.

В /var мы обычно находим серверные данные, которые сохраняются здесь с целью отделить их от критически важных данных, таких как сама программа-сервер и ее конфигурационные файлы. Типичным примером в системах Linux является /var/www, который содержит настоящие страницы HTML, скрипты и изображения, которые передал веб-сервер. FTP-дерево сервера FTP (данные, которые могут быть загружены удаленным клиентом) также лучше хранить в одном из подкаталогов /var. Эти данные общедоступны и часто изменяемы анонимными пользователями, поэтому безопаснее их держать здесь, подальше от разделов или каталогов с конфиденциальными данными.

На большинстве установленных рабочих станций /var/spool как минимум будет содержать at и каталог cron, содержащий запланированные задания. В офисных окружениях этот каталог также обычно содержит lpd, который хранит очередь(и) печати и далее файлы конфигурации принтера, а также log-файлы принтера.

На серверных системах мы будем обычно находить /var/spool/mail, содержащий входящую почту для локальных пользователей, отсортированную в один файл для каждого пользователя, "почтовый ящик пользователя". Связанный каталог mqueue, диспетчер очереди для неотправленных почтовых сообщений. Эти компоненты системы могут быть сильно задействованы на почтовых серверах с большим количеством пользователей. Новости серверов также используют пространство /var/spool из-за огромного количества сообщений, которые они должны обработать.

Каталог /var/lib/rpm специфичен для базирующихся на RPM (RedHat Package Manager) дистрибутивов; это те, в которых информация сохраняется в RPM-пакетах. Другие менеджеры пакетов обычно также сохраняют их данные где-то в /var.

Управление файлами

Просмотр свойств файла

Дополнительная информация о ls

Помимо имени файла команда ls может дать много другой информации, например, тип файла (это мы уже обсуждали). Она может также показать права доступа к файлу, его размер, номер индексного дескриптора, дату и время создания, владельцев и количество ссылок на файл. Также использование ls вместе с опцией -a может отобразить файлы, обычно скрытые от глаз. Имена таких файлов начинается с точки. Типичный пример — это конфигурационные файлы в вашем домашнем каталоге. Когда вы проработаете в определенной системе некоторое время, то заметите, что были созданы десятки файлов и каталогов, that are not automatically listed in a directory index. Наряду с этим, каждый каталог содержит файл, именуемый просто точкой (.) и один с двумя точками (..), которые используются в сочетании с номером их индексного дескриптора для определения расположения каталога в древовидной структуре файловой системы.

Вам действительно следует прочитать страницы info о команде ls, так как это часто используемая команда с большим количеством полезных опций. Опции могут быть скомбинированы, как и в случае с большинством команд UNIX и их параметрами. Часто используемая комбинация ls -al; она отображает длинный список файлов и их свойств, а также пути, на которые указывают символические ссылки. ls -latr отображает те же файлы, только теперь в обратном порядке по признаку последнего изменения, так что файл, измененный в самое последнее время, находится в нижней части списка. Вот несколько примеров:

krissie:~/mp3> ls
Albums/  Radio/  Singles/  gene/  index.html

krissie:~/mp3> ls -a
./   .thumbs  Radio     gene/
../  Albums/  Singles/  index.html

krissie:~/mp3> ls -l Radio/
total 8
drwxr-xr-x    2 krissie krissie  4096 Oct 30  1999 Carolina/
drwxr-xr-x    2 krissie krissie  4096 Sep 24  1999 Slashdot/

krissie:~/mp3> ls -ld Radio/
drwxr-xr-x    4 krissie krissie  4096 Oct 30  1999 Radio/

krissie:~/mp3> ls -ltr
total 20
drwxr-xr-x    4 krissie krissie  4096 Oct 30  1999 Radio/
-rw-r--r--    1 krissie krissie   453 Jan  7  2001 index.html
drwxrwxr-x   30 krissie krissie  4096 Oct 20 17:32 Singles/
drwxr-xr-x    2 krissie krissie  4096 Dec  4 23:22 gene/
drwxrwxr-x   13 krissie krissie  4096 Dec 21 11:40 Albums/

В большинстве версий Linux ls является псевдонимом «цветного ls» по умолчанию. Это свойство позволяет увидеть тип файла без использования какой-либо опции ls. Для достижения этого каждому типу файла присваивается свой собственный цвет. Стандартная схема находится в /etc/DIR_COLORS:

Таблица 3.5. Цветовая схема color-ls по умолчанию

Цвет Тип файла
Голубой каталоги
Красный сжатые архивы
Белый текстовые файлы
Розовый изображения
Голубой ссылки
Желтый устройства
Зеленый исполняемые файлы
Мигающий красный неисправные ссылки

Больше информации найдется на man-странице. В прежние дни та же информация отображалась с помощью суффиксов для каждого имени нестандартного файла. При использовании моно-цвета (например, печати списка содержимого каталога) и для общей очевидности эта схема используется до сих пор:

Таблица 3.6. Схема суффиксов по умолчанию для команды ls

Символ Тип файла
Ничего Обычный файл
/ Каталог
* Исполняемый файл
@ Ссылка
= Сокет
| Именованный канал

Полное описание функциональности и особенностей команды ls можно узнать с помощью info coreutils ls.

Дополнительные инструменты

Чтобы узнать больше о типе данных, с которыми имеем дело, мы используем команду file. Применяя определенные тесты, которые проверяют свойства файла в файловой системе, «магические числа» и делают «лингвистические пробы», file пытается догадаться о формате файла. Вот некоторые примеры:

mike:~> file Documents/
Documents/: directory

mike:~> file high-tech-stats.pdf
high-tech-stats.pdf: PDF document, version 1.2

mike:~> file Nari-288.rm
Nari-288.rm: RealMedia file

mike:~> file bijlage10.sdw
bijlage10.sdw: Microsoft Office Document

mike:~> file logo.xcf
logo.xcf: GIMP XCF image data, version 0, 150 x 38, RGB Color

mike:~> file cv.txt
cv.txt: ISO-8859 text

mike:~> file image.png
image.png: PNG image data, 616 x 862, 8-bit grayscale, non-interlaced

mike:~> file figure
figure: ASCII text

mike:~> file me+tux.jpg
me+tux.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI),
            "28 Jun 1999", 144 x 144

mike:~> file 42.zip.gz
42.zip.gz: gzip compressed data, deflated, original filename,
         `42.zip', last modified: Thu Nov  1 23:45:39 2001, os: Unix

mike:~> file vi.gif
vi.gif: GIF image data, version 89a, 88 x 31

mike:~> file slide1
slide1: HTML document text

mike:~> file template.xls
template.xls: Microsoft Office Document

mike:~> file abook.ps
abook.ps: PostScript document text conforming at level 2.0

mike:~> file /dev/log
/dev/log: socket

mike:~> file /dev/hda
/dev/hda: block special (3/0)

Команда file имеет ряд опций, в частности -z, которая просматривает сжатые файлы. Чтобы получить более детальное описание, посмотрите info file. Имейте в виду, что результаты выполнения команды file не являются абсолютно достоверными, это только предположение. Другими словами, file может ошибиться.

Зачем весь этот шум о типах файлов и форматах?
В ближайшее время мы обсудим пару инструментов командной строки для просмотра текстовых файлов. Эти инструменты не будут работать при использовании «неправильного» типа файла. В худшем случае, они создадут аварийную ситуацию в вашем терминале и/или приведут к возникновению множества звуковых сигналов. Если у вас это случится, просто закройте сеанс терминала и начните новый. Но постарайтесь избегать этого, т.к. обычно это нервирует других людей.

Создание и удаление файлов и каталогов

Создание беспорядка...

... к этому легко придти. На сегодняшний день практически каждая система работает в сети, поэтому естественно файлы копируются с одного компьютера на другой. Особенно это происходит при работе в графической среде, где создание новых файлов часто происходит без согласия пользователя. Для иллюстрации этой проблемы здесь полное содержимое каталога нового пользователя, созданного на стандартной системе RedHat:

[newuser@blob user]$ ls -al
total 32
drwx------   3 user 	user        4096 Jan 16 13:32 .
drwxr-xr-x   6 root     root        4096 Jan 16 13:32 ..
-rw-r--r--   1 user 	user      24 Jan 16 13:32 .bash_logout
-rw-r--r--   1 user 	user     191 Jan 16 13:32 .bash_profile
-rw-r--r--   1 user 	user     124 Jan 16 13:32 .bashrc
drwxr-xr-x   3 user 	user    4096 Jan 16 13:32 .kde
-rw-r--r--   1 user 	user    3511 Jan 16 13:32 .screenrc
-rw-------   1 user 	user      61 Jan 16 13:32 .xauthDqztLr

Также на первый взгляд содержание "используемого" домашнего каталога не выглядит так плохо:

olduser:~> ls
app-defaults/ crossover/   Fvwm@     mp3/      OpenOffice.org638/
articles/     Desktop/     GNUstep/  Nautilus/ staroffice6.0/
bin/          Desktop1/    images/   nqc/      training/
brol/         desktoptest/ Machines@ ns_imap/  webstart/
C/            Documents/   mail/     nsmail/   xml/
closed/       Emacs@       Mail/     office52/ Xrootenv.0

Но если учесть все каталоги и файлы, начинающиеся с точки, то в данном каталоге уже обнаруживается 185 объектов. Причина этого в том, что у большинства приложений есть их собственные каталоги и/или файлы в домашнем каталоге этого пользователя, содержащие пользовательские настройки. Как правило, эти файлы создаются при первом запуске приложения. В некоторых случаях вы будете уведомлены, когда несуществующая директория должна быть создана, но по большей части все будет делаться автоматически.

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

В следующем разделе мы обсудим имеющиеся средства для поддержания порядка. Мы только обсуждаем текстовые инструменты доступные в shell, поскольку графические инструменты интуитивны, выглядят и ощущаются также как известный метод «указать-и-щелкнуть» файлового менеджера MS Windows, в том числе графические функции помощи и другие свойства, которые вы ожидаете от такого рода приложений. Ниже приведен обзор наиболее популярных файловых менеджеров для GNU/Linux. Большинство файловых менеджеров могут быть запущены из меню вашей графической среды, щелчком по иконке домашнего каталога или из командной строки с помощью приведенных команд:

  • nautilus. Файловый менеджер Gnome (графической среды GNU) по умолчанию. Отличную документацию о работе с этим инструментом можно найти на http://www.gnome.org.
  • konqueror. Файловый менеджер, обычно используемый в графической среде KDE. Пособие есть на http://docs.kde.org.
  • mc. Midnight Commander, файловый менеджер Unix по образу Norton Commander. Вся документация доступна на http://gnu.org/directory/ или через зеркало, такое как http://www.ibiblio.org.

Несомненно эти приложения стоит попробовать, и они обычно впечатляют новичков Linux даже тем, что существует такой широкий выбор: это только самые популярные инструменты для управления каталогами и файлами, также многие другие проекты находятся в разработке. Теперь давайте выясним, что за всем этим стоит, и посмотрим, как эти графические инструменты используют стандартные команды UNIX.

Инструменты

Создание каталогов

Способ хранения объектов на своих местах - это помещение определенных файлов в специально для них созданные каталоги и подкаталоги (или, если хотите, папки и подпапки). Это делается с помощью команды mkdir:

richard:~> mkdir archive

richard:~> ls -ld archive
drwxrwxrwx  2 richard richard           4096 Jan 13 14:09 archive/

Создание каталогов и подкаталогов за один шаг делается с помощью опции -p:

richard:~> cd archive

richard:~/archive> mkdir 1999 2000 2001

richard:~/archive> ls
1999/  2000/  2001/

richard:~/archive> mkdir 2001/reports/Restaurants-Michelin/
mkdir: cannot create directory `2001/reports/Restaurants-Michelin/':
No such file or directory

richard:~/archive> mkdir -p 2001/reports/Restaurants-Michelin/

richard:~/archive> ls 2001/reports/
Restaurants-Michelin/

Если у нового файла должны быть другие права, чем те, что присваиваются по умолчанию при его создании, то новые права доступа могут быть установлены одним движением, также используя команду mkdir, см. страницы info для дополнительной информации. Мы собираемся обсудить режимы доступа в следующем разделе, посвященном безопасности файлов.

Имя каталога должно соответствовать тем же нормам, которые применяются для имен обычных файлов. Одним из наиболее важных ограничений является то, что у вас не может быть двух файлов с одинаковым названием в одном каталоге (но имейте в виду, операционная система Linux, как и UNIX, чувствительна к регистру). В сущности нет никаких ограничений на длину имени файла, но обычно оно содержит меньше, чем 80 символов, т. е. может поместиться в одной строке терминала. Вы можете использовать в имени файла любой символ, который вам захочется, хотя рекомендуется исключить символы, которые имеют специальное значение для оболочки. При сомнении сверьтесь с Приложением C, Особенности Shell.

Перемещение файлов

Теперь, когда мы должным образом создали структуру в нашем домашнем каталоге, настало время уборки «несекретных» файлов с использованием команды mv:

richard:~/archive> mv ../report[1-4].doc reports/Restaurants-Michelin/

Эта же команда используется для переименования файлов:

richard:~> ls To_Do
-rw-rw-r--    1 richard richard      2534 Jan 15 12:39 To_Do

richard:~> mv To_Do done

richard:~> ls -l done
-rw-rw-r--    1 richard richard      2534 Jan 15 12:39 done

Очевидно, что изменяется только имя файла. Все остальные свойства остаются неизменными.

Подробные сведения о синтаксисе и особенностях команды mv можно найти в man или info-страницах. Использование данной документации должно всегда быть вашим первым рефлексом при столкновении с проблемой. Вероятно ответ на ваш вопрос найдется в системной документации. Даже опытные пользователи читают man-страницы каждый день, поэтому начинающим пользователям следует читать их все время. Через некоторое время, вы узнаете, наиболее распространенные опции к часто используемым командам, но вам все равно будет нужна документация как основной источник информации. Обратите внимание, что информация, содержащаяся в HOWTO, FAQ, man-страницах и других источниках постепенно сливается на страницах info, которые на сегодняшний день являются наиболее современными источниками online-документации (также как и легко доступным в системе).

Копирование файлов

Копирование файлов и каталогов осуществляется с помощью команды cp. Есть полезная опция рекурсивного копирования (копирования всех файлов и подкаталогов), используйте опцию -R команды ср. Общий синтаксис

cp [-R] fromfile tofile

В качестве примера рассмотрим случай пользователя newguy, который захотелось иметь такие же настройки рабочего стола Gnome, какие есть у пользователя oldguy. Одним из способов решения проблемы является копирование настроек oldguy в домашний каталог newguy:

victor:~> cp -R ../oldguy/.gnome/ .

Это выдает некоторые ошибки, связанные с разрешением на файлы, но все эти ошибки связаны с личными файлами, в которых newguy в любом случае не нуждается. В следующем разделе мы обсудим, как изменить эти разрешения, если это действительно является проблемой.

Удаление файлов

Используйте команду rm для удаления отдельных файлов, rmdir для удаления пустых каталогов. (Используйте ls -a для проверки пуст каталог или нет). Команда rm также имеет опции для удаления непустых каталогов со всеми их подкаталогами, но об этих опасных опциях читайте, пожалуй, info-страницы.

Как пустота может быть каталогом?
Это нормально, что каталоги . (точка) и .. (точка-точка) не могут быть удалены, т.к. они также являются необходимыми в пустой директории для определения расположения каталогов в иерархии файловой системы.

В Linux, как и в UNIX, нет мусорных ящиков, по крайней мере, для shell, хотя есть множество решений для графического использования. Так однажды удаленный, файл действительно исчезает, и, как правило, уже нет возможности вернуть его обратно, кроме случаев, когда у вас есть резервные копии, или вы очень быстры и у вас действительно хороший системный администратор. Чтобы защитить начинающих пользователей от этой напасти, интерактивное поведение команд rm, cp и mv может быть запущено с помощью опции -i. В этом случае система не будет сразу действовать после запроса. Вместо этого, появится запрос на подтверждение, что потребует дополнительного нажатия клавиши Enter для причинения вреда:

mary:~> rm -ri archive/
rm: descend into directory `archive'? y
rm: descend into directory `archive/reports'? y
rm: remove directory `archive/reports'? y
rm: descend into directory `archive/backup'? y
rm: remove `archive/backup/sysbup200112.tar'? y
rm: remove directory `archive/backup'? y
rm: remove directory `archive'? Y

Мы обсудим, как сделать это опцией по умолчанию в Главе 7, «Дом сладкий /home», в которой обсуждается настройка окружения вашей оболочки.

Поиск файлов

Использование возможностей shell

В приведенном ранее примере перемещения файлов мы уже видели, как shell может манипулировать сразу несколькими файлами. В том примере оболочка автоматически понимает, что пользователь имел ввиду требованием между квадратными скобками "[" и "]". Оболочка может заменить диапазоны номеров, а также прописных или строчных буквы. Она также заменяет звездочку на любое количество символов и знак вопроса на любой один.

Все виды замещения могут быть использованы одновременно; оболочка очень последовательна в этом. Оболочка Bash, например, не имеет никаких проблем с такими выражениями как ls dirname/*/*/*[2-3].

В других оболочках, звездочка обычно используется, чтобы свести к минимуму усилия ввода: можно ввести cd dir* вместо cd directory. В Bash однако, это не является необходимым, поскольку у оболочки GNU есть свойство, называемое автозавершением имени файла. Это означает, что вы можете набрать первые несколько символов команды или файла (в текущем каталоге), и если никакой путаницы не может быть, оболочка поймет, что вы имеете в виду. Например, в каталоге, содержащем много файлов, вы можете проверить, если ли какие-нибудь файлы, начинающиеся с буквы A просто набрав ls A и нажать клавишу Tab дважды, вместо нажатия Enter. Если только один файл начинается с "А", то этот файл немедленно отобразится в качестве аргумента ls (или любой другой команды оболочки, если на то пошло).

Which

Самый простой способ просматривать файлы — это использование команды which для посмотра в каталогах, перечисленных в пути поиска пользователя на требуемый файл. Конечно, путь поиска содержит только пути к каталогам, содержащим исполняемые программы, которые не работают для обычных файлов. Команда which полезна при выяснении причины возникновения проблемы "Команда не найдена" ("Command not Found"). В приведенном ниже примере пользователь tina не может использовать программу acroread, а ее коллега не испытывает никаких проблем на той же системе. Эта проблема аналогична проблеме PATH из предыдущей части: коллега tina сказал ей, что он может увидеть нужную программу в /opt/acroread/bin, но этого каталога нет в ее path:

tina:~> which acroread
/usr/bin/which: no acroread in (/bin:/usr/bin:/usr/bin/X11

Проблема может быть решена путем предоставления полного пути к команде запуска, или нужно заново экспортировать содержание переменной PATH:

tina:~> export PATH=$PATH:/opt/acroread/bin

tina:~> echo $PATH
/bin:/usr/bin:/usr/bin/X11:/opt/acroread/bin

Используя команду which также можно проверить, является ли команда псевдонимом другой команды:

gerrit:~> which -a ls
ls is aliased to `ls -F --color=auto'
ls is /bin/ls

Если это не сработает в вашей системе, используйте псевдоним команды:

tille@www:~/mail$ alias ls
alias ls='ls —color'

Find и locate

Кроме перечисления в path, есть инструменты, специально предназначенные для поиска. Есть очень мощный инструмент find, известный из UNIX, который можно расценить, как имеющий достаточно трудный синтаксис. GNU find, однако, имеет дело с синтаксическими проблемами. Эта команда позволяет не только вести поиск имен файлов, она также может принимать размер файла, дату последнего изменения и другие свойства файла в качестве критериев для поиска. Наиболее часто используется поиск файлов по именам:

find <path> -name <searchstring>

Это может быть истолковано как "Просмотреть все файлы и подкаталоги, содержащихся в заданном пути, и выдать имена файлов, содержащих строку поиска в их имени" (но не в содержании).

Другое применение find поиск файлов по определенному размеру, как и в примере ниже, где пользователь peter хочет найти все файлы в текущей директории или одном из ее подкаталогов, которые больше 5 MB:

peter:~> find . -size +5000k
psychotic_chaos.mp3

Если вы покопаетесь в man-страницах, то увидите, что find также может совершать действия над найденными файлами. Типичным примером является удаление файлов. Лучше всего первый тест совершить без опции -exec, когда нужные файлы отобраны, после чего команда может быть повторно запущена для удаления выбранных файлов. Ниже, мы ищем файлы с расширением .tmp:

peter:~> find . -name "*.tmp" -exec rm {} \;

peter:~>

Оптимизация!
Эта команда будет вызывать rm так много раз, сколько подходящих к требованию файлов найдется. В худшем случае, это может быть тысячи или миллионы раз. Это довольно сильно загрузит вашу систему.
Более реалистичным подходом к работе будет использование канала (|) и инструмента xargs с командой rm в качестве аргумента. Таким образом, команда rm вызывается только, когда командная строка заполнена, а не для каждого файла. См. Главу 5, «Перенаправление ввода/вывода (I/O)» для дополнительной информации об использовании I/O перенаправления для облегчения повседневных задач.

Позднее (в 1999 году в след за man-страницами, после 20 лет существования find), была разработана locate. Эта программа проще в использовании, но более ограничена, чем find, т.к. ее выдача основана на базе данных файловых индексов, который обновляется только раз в день. С другой стороны, поиск в базе данных locate использует меньше ресурсов, чем find и, следовательно, показывает результаты практически мгновенно.

В наши дни большинство дистрибутивов Linux используют slocate (поиск снабженный безопасностью), современная версия locate позволяет пользователям получать выдачу, которую они не имеют права читать. Так, например, файлы из домашнего каталога root, обычно не доступны для публичного просмотра. Пользователь, который хочет найти того, кто знает об оболочке C, может задать команду locate .cshrc, для просмотра всех пользователей, у которых конфигурационный файл настроен на оболочку C. Если предположить, что пользователи root и jenny находятся под управлением оболочки C, то только файл /home/jenny/.cshrc будет отображен, и не один из домашней директории root. На большинстве систем, locate является символической ссылкой на программу slocate:

billy:~> ls -l /usr/bin/locate
lrwxrwxrwx 1 root slocate  7 Oct 28 14:18 /usr/bin/locate -> slocate*

Пользователь tina могла бы использоваться locate, чтобы найти необходимое приложение:

tina:~> locate acroread
/usr/share/icons/hicolor/16x16/apps/acroread.png
/usr/share/icons/hicolor/32x32/apps/acroread.png
/usr/share/icons/locolor/16x16/apps/acroread.png
/usr/share/icons/locolor/32x32/apps/acroread.png
/usr/local/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/bin/acroread

Каталоги, которые не содержат имя bin
, не могут содержать программы - они не содержат исполняемые файлы. Есть три возможности. Файл в /usr/local/bin
и есть то, что хотела бы tina: это ссылка на shell-скрипт, который запускает настоящую программу:

tina:~> file /usr/local/bin/acroread
/usr/local/bin/acroread: symbolic link to ../Acrobat4/bin/acroread

tina:~> file /usr/local/Acrobat4/bin/acroread
/usr/local/Acrobat4/bin/acroread: Bourne shell script text executable

tina:~> file /usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread: ELF 32-bit LSB 
executable, Intel 80386, version 1, dynamically linked (uses 
shared libs), not stripped

Для того, чтобы сохранить путь как можно короче, и системе не приходилось искать слишком долго каждый раз, когда пользователь хочет выполнить команду, мы добавляем /usr/local/bin
к пути, а не другие каталоги, которые содержат только двоичные файлы одной конкретной программы, также /usr/local/bin содержит другие полезные программы.

Опять же, полное описание возможностей find и locate можно найти на страницах info.

Команда grep

Общая строка фильтрации

Простая, но мощная программа grep используется для фильтрации входных строк и выдачи подходящих к образцу на вывод. Существуют буквально тысячи применений для программы grep. В приведенном ниже примере, jerry использует grep, чтобы посмотреть, что он делал с find:

jerry:~> grep -a find .bash_history
find . -name userinfo
man find
find ../ -name common.cfg

История поиска.
Также полезна в этих случаях функция поиска в bash, которая сразу же запускается нажатием Ctrl + R, как в примере, где мы хотим проверить еще раз, что мы делали в прошлом с командой find:

thomas ~> ^R 
(reverse-i-search)`find': find `/home/thomas` -name *.xml

Введите строку поиска для начала поиска. Чем больше символов вы вводите, тем более ограниченный поиск получаете. Здесь читается история команды для этой сессии оболочки (которая записывается в .bash_history в вашем домашнем каталоге при выходе из той сессии). Показывается самый последний случай строки вашего поиска. Если вы хотите увидеть предыдущие команды, содержащие ту же строку, нажмите Ctrl + R опять.

Чтобы узнать больше, изучайте info-страницы в bash.

Все ОС Unix имеют он-лайн словарь. Так же и Linux. Словарь представляет собой список известных слов в файле под названием words, расположенный в /usr/share/dict. Чтобы быстро проверить правильность написания слова, не графическое приложение, необходимо:

william:~> grep pinguin /usr/share/dict/words

william:~> grep penguin /usr/share/dict/words
penguin
penguins

Словарь против списка слов.
Некоторые дистрибутивы предлагают команду dict, которая предоставляет больше функций, чем просто поиск слов в списке.

Кто является владельцем того домашнего каталога рядом со мной? Эй, есть его номер телефона!

lisa:~> grep gdbruyne /etc/passwd
gdbruyne:x:981:981:Guy Debruyne, tel 203234:/home/gdbruyne:/bin/bash

И какой был адрес электронной почты Arno также?

serge:~/mail> grep -i arno *
sent-mail: To: 
sent-mail: On Mon, 24 Dec 2001, Arno.Hintjens@celeb.com wrote:

find и locate часто используются в сочетании с grep для решения некоторых важных задач. Для получения дополнительной информации см. Главу 5, «Перенаправление ввода/вывода (I/O)».

Специальные символы

Символы, имеющие специальное значение для оболочки должны быть экранированы. Символом экранирования в Bash является обратная косая черта, как и в большинстве оболочек; она придает специальное значение последующему символу. Оболочка знает о многих специальных символов, к числу наиболее распространенных относятся /,.,? и *. Полный список можно найти на info-страницах и документации к вашей оболочке.
Так, например, чтобы сказать, что вы хотите отобразить файл «*» вместо всех файлов в каталоге, вам придется использовать

less \*

То же самое касается имен файлов, содержащих пробел:

cat This\ File

Другие способы просмотра содержимого файла

Общее

Кроме cat, который действительно не делать больше, чем передача файлов на стандартный вывод, есть другие инструменты для просмотра содержимого файла.

Самый простой способ, конечно, будет заключаться в использовании графических инструментов вместо инструментов командной строки. Во введении мы уже мельком видели офисное приложение OpenOffice.org. Другие примеры GIMP (запускается командой gimp из командной строки), GNU программа обработки изображений; xpdf для просмотра файлов формата Portable Document (PDF); GhostView (gv) для просмотра файлов PostScript; браузер Mozilla/FireFox, Konqueror, Opera и многое другое для веб-контента; XMMS, CDplay и других для мультимедийных файлов, AbiWord, Gnumeric, KOffice и т.д. для всех видов офисных приложениях и т.д. Есть тысячи приложений Linux; перечисление их всех заняло бы дни.

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

Итак, давайте посмотрим, какие текстовые инструменты у нас есть, которые полезны, для просмотра содержимого файлов.

Проблемы шрифта.
Инструменты для простого (плоского) текста, такие как те, что мы сейчас будем обсуждать, часто имеют проблемы с "плоскими" текстовыми файлами из-за кодировок шрифта, используемых в этих файлах. Специальные символы, такие как "акцентированные" буквы алфавита, китайские иероглифы и другие символы языков, использующих различные наборы символов, а не по умолчанию en_US кодировку и так далее, будут отображаться неправильно или будут заменены нечитаемым мусором. Эти проблемы обсуждаются в Разделе 7.4. "Региональные специфические настройки".

Меньше (less) значит больше

Несомненно рано или поздно вы услышите как кто-то скажет эту фразу при работе в среде UNIX. Немного истории UNIX объяснит это:

  • Сначала была cat. Поток вывода был неконтролируемым.
  • Потом была pg, которую все еще можно обнаружить на старых версиях Unix. Эта команда выдает текст на вывод по одной странице за раз.
  • Программа more подправленный вариант pg. Эта команда по-прежнему есть в каждой системе Linux.
  • less GNU версия more и включает дополнительные функции, позволяющие подсвечивать строки поиска, прокрутку назад и т.д. Синтаксис очень прост:

less name_of_file

Более подробная информация находится на info-страницах.

К настоящему времени вы уже знаете о пейджерах, поскольку они используются для просмотра man-страниц.

Команды head и tail

Эти две команды отображают соответственно n первых/последних строк файла. Чтобы посмотреть последние десять команд ввели следующее:

tony:~> tail -10 .bash_history 
locate configure | grep bin
man bash
cd
xawtv &
grep usable /usr/share/dict/words 
grep advisable /usr/share/dict/words 
info quota
man quota
echo $PATH
frm

head работает аналогично. У команды tail есть удобная функция, постоянно показывающая последние n строк файла, которые меняются все время. Это опция -f, которая часто используется системными администраторами для проверки файлов журналов. Более подробная информация находится в файлах системной документации.

Связывание файлов

Типы ссылок

Поскольку мы уже знаем достаточно о файлах и их представлении в файловой системе, понимание ссылок (или ярлыков) добавит составляющую в общую картину. Ссылка — это не более чем способ сопоставления двух или более имен файлов с одним и тем же набором данных. Есть два пути достижения этой цели:

  • Жесткая ссылка: Связывает два или более имени файла с одним и тем же индексным дескриптором. Жесткие ссылки определяют одни и те же блоки данных на жестком диске, в то время они продолжают вести себя как независимые файлы.

Существует очевидное неудобство: жесткие ссылки не могут распространяться на разделы, т.к. номера индексных дескрипторов уникальны только в пределах данного раздела.

  • Мягкая или символическая (символьная) ссылка (или для краткости: symlink - симлинк): маленький файл, который является указателем на другой файл. Символическая ссылка содержит путь к целевому файлу, а не указание на физическое расположение данных на жестком диске. Поскольку в данном механизме не задействованы индексные дескрипторы, мягкие ссылки могут существовать между разными разделами.

Поведение этих двух типов ссылок похожее, но не одинаковое, что проиллюстрировано на схеме ниже:

Рисунок 3.2. Механизм жестких и мягких ссылок

Механизм жестких и мягких ссылок в Linux

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

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

Можно утверждать, что существует третий вид ссылок, user-space ссылки, которые похожи на ярлык в MS Windows. Это файлы, содержащие метаданные, которые могут быть интерпретированы только графическим файловым менеджером. Для ядра и оболочки это просто обычные файлы. У них может быть в конце суффикс .desktop или .lnk; например, можно найти ~/.gnome-desktop:

[dupont@boulot .gnome-desktop]$ cat La\ Maison\ Dupont
[Desktop Entry]
Encoding=Legacy-Mixed
Name=La Maison Dupont
Type=X-nautilus-home
X-Nautilus-Icon=temp-home
URL=file:///home/dupont

Этот пример взят из графической среды KDE:

[lena@venus Desktop]$ cat camera
[Desktop Entry]
Dev=/dev/sda1
FSType=auto
Icon=memory
MountPoint=/mnt/camera
Type=FSDevice
X-KDE-Dynamic-Device=true

Создать такого рода ссылку достаточно легко путем использования особенностей вашей графической среды. Если вам нужна помощь, то системная документация должна быть вашим первым источником.

В следующем разделе мы рассмотрим создание символических ссылок в UNIX-стиле с помощью командной строки.

Создание символических ссылок

Символическая ссылка представляет особый интерес для начинающих пользователей: они достаточно очевидны для понимания и вам не нужно беспокоиться о разделах.

Команды для создания ссылок является ln. Для того чтобы создать символические ссылки, следует использовать опцию -s:

ln -s targetfile linkname

В приведенном ниже примере пользователь freddy создает ссылку в подкаталоге своей домашней папки на каталог другой части системы:

freddy:~/music> ln -s /opt/mp3/Queen/ Queen

freddy:~/music> ls -l
lrwxrwxrwx  1 freddy  freddy  17 Jan 22 11:07 Queen -> /opt/mp3/Queen

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

Применение символических ссылок имеет широкое распространение. Они часто используются для экономии дискового пространства за счет создания «копии» файла для удовлетворения требований при установке новой программы, которая ожидает наличие файла в другом месте; они используются для исправления сценариев, которые внезапно запускаются в новых окружениях, в общем могут предотвратить большие затраты. Системный администратор может принять решение перенести домашние каталоги пользователей на новое место, disk2 например, но если он хочет, чтобы все работало, как раньше, в том числе файл /etc/passwd, с минимумом усилий он создаст символическую ссылку из /home на новое место /disk2/home.

Защита файлов

Права доступа: первая линия обороны Linux

Модель безопасности Linux основана на той, которая используется в системах UNIX, и является такой же строгой (и иногда даже более). В системе Linux каждый файл принадлежит пользователю и группе пользователей. Есть также третья категория пользователей, которые не являются пользователем-владелецем и не принадлежат группе, владеющей файлом. Для каждой категории пользователей, разрешение на чтение, запись и выполнение может быть предоставлено или отклонено.

Мы уже использовали "длинный" вариант просмотра файлов с помощью команды ls -l, хотя и по другим причинам. Эта команда также отображает разрешения файла (права доступа) для этих трех категорий пользователей; они указаны девятью символами, которые следуют за первым символом (индикатором типа файла). Как видно из приведенных ниже примеров, первые три символа из этой серии девяти отображают права доступа реального пользователя, который является владельцем файла. Следующие три — предназначены для группы-владельца файла, последние три — для других пользователей. Разрешения всегда описываются в одном и том же порядке: чтение, запись и исполнение (выполнение, запуск) для пользователя, группы и других. Вот некоторые примеры:

marise:~> ls -l To_Do
-rw-rw-r--    1 marise  users      5 Jan 15 12:39 To_Do
marise:~> ls -l /bin/ls
-rwxr-xr-x    1 root    root   45948 Aug  9 15:01 /bin/ls*

Первый файл является обычным (вначале прочерк). Пользователь с именем marise или пользователи, принадлежащие к группе users, могут читать и переписывать (изменять/перемещать/удалять) файл, но они не могут исполнять его (второе и третье тире). Другим пользователям разрешено только читать этот файл, но они не могут изменять или выполнять его (четвертое и пятое тире).

Второй пример — это исполняемый файл; отличие: все могут запустить данную программу, но вам нужно быть суперпользователем, чтобы изменить его.

Info-страницы подробно объясняют, каким образом команда ls управляет отображением прав доступа (см. в разделе What information is listed).

Для удобства работы с командами, как права доступа (или режимы), так и категории пользователей имеют коды. См. таблицы ниже.

Таблица 3.7. Коды режимов доступа

Код Значение
0 или - Права доступа, которые должны были прописаны в данном месте, не предоставляются.
4 или r Предоставляется право на чтение для определенной категории пользователей.
2 или w Право на запись для категории пользователей, определенных в данном месте.
1 или x Право на выполнение для определенной категории пользователей.

Таблица 3.8. Коды группы пользователей

Код Значение
u Права пользователя
g Права группы
o Права для остальных

Использование данного механизма разделения прав обязательно; это позволяет обеспечить высокий уровень безопасности даже без сетевой защиты. Среди прочих функций такая схема безопасности заботится о доступе пользователей к программам, it can serve files on a need-to-know basis и защищает конфиденциальные данные, такие как домашние каталоги и системные конфигурационные файлы.

Вы должны знать ваше имя пользователя. Если вы не знаете, то его можно отобразить, используя команду id, которая также отображает группу по умолчанию, к которой вы принадлежите и, в конечном итоге, другие группы, членом которых вы являетесь:

tilly:~> id
uid=504(tilly) gid=504(tilly) groups=504(tilly),100(users),2051(org)
Ваше имя пользователя, также хранится в переменной окружения USER:
tilly:~> echo $USER
tilly

Инструменты

Команда chmod

Обычным следствием применения строгих правил доступа к файлам, а иногда и неудобством, является то, что права доступа должны быть изменены по тем или иным причинам. Чтобы это сделать, мы используем команду chmod, что привело к тому, что chmod стал почти приемлемым английским глаголом, обозначающим изменение режима доступа к файлу. Команда chmod может быть использована с буквенными и числовыми опциями, что вам больше всего нравится.

В приведенном ниже примере используются буквенные параметры для решения проблемы, с которой обычно сталкиваются начинающие пользователи:

asim:~> ./hello
bash: ./hello: bad interpreter: Permission denied

asim:~> cat hello
#!/bin/bash
echo "Hello, World"

asim:~> ls -l hello
-rw-rw-r--    1 asim    asim    32 Jan 15 16:29 hello

asim:~> chmod u+x hello

asim:~> ./hello
Hello, World

asim:~> ls -l hello
-rwxrw-r--   1 asim    asim    32 Jan 15 16:29 hello*

+ и - используются для разрешения или запрещения конкретного права для определенной категории. Комбинации через запятую не допускаются. Info и man-страницы содержат полезные примеры. Здесь еще один, в котором файл из предыдущего примера становится личным файлом пользователя asim:

asim:~> chmod u+rwx,go-rwx hello

asim:~> ls -l hello
-rwx------    1 asim    asim    32 Jan 15 16:29 hello*

Ситуации, в которых появляются сообщения об ошибках, говорящих, что допуск запрещен, как правило, связаны с проблемой прав доступа. Также, реплики вроде: "Это работало вчера" и "Когда я запускаю это как root, то оно работает", скорее всего, вызваны тем, что не были учтены права доступа к файлам.

При использовании chmod с цифровыми аргументами, значения для каждого предоставляемого права доступа указываются в "месторасположение" категории. Таким образом, получается трехзначное число, которое представляет собой символическое обозначение того, что должна сделать команда chmod. В следующей таблице перечислены наиболее распространенные комбинации.

Таблица 3.9. Защита файлов с помощью chmod

Код Значение
chmod 400 file Защита файла от случайной перезаписи
chmod 500 directory Чтобы защитить себя от случайного удаления, переименования или перемещения файлов из этой директории.
chmod 600 file Личный файл, изменяемый только пользователем, который ввел эту команду.
chmod 644 file Всеми читаемый файл, который может быть изменен только пользователем-владельцем.
chmod 660 file Пользователи, принадлежащие вашей группе, могут изменить этот файл, другие не имеют никакого отношения к нему вообще.
chmod 700 file Защищает файл от любого доступа посторонних, в то же время пользователь-владелец имеет полный контроль.
chmod 755 directory Для файлов, которые должны быть читаемыми и исполняемыми всеми, но изменяемые только пользователем-владельцем.
chmod 775 file Стандартный режим совместного использования файла группой.
chmod 777 file Каждый может делать с этим файлом все, что хочет.

Если в качестве аргумента chmod вы вводите число, состоящее менее чем из трех цифр, опущенные символы заменяются на нули, начиная слева. В системах Linux на самом деле существует четвертая цифра, которая предшествует первому из трех и устанавливает специальные режимы доступа. Все об этом и многом другом находится в info-страницах.

Вступление в другую группу

Когда вы введете id в командной строке, то получите список всех групп, к которым вы можете принадлежать; перед этим будет ваше имя пользователя и ID, а также название группы и ее ID, с которой вы в настоящее время связаны. Однако, во многих системах Linux можно активно входить только в одну группу в одно и то же время. По умолчанию, это активная или первичная группа является первой, которая вам устанавливается из файла /etc/passwd. Четвертое поле в этом файле содержит ID основной группы пользователей, что можно также увидеть в файле /etc/group. Например:

asim:~> id
uid=501(asim) gid=501(asim) groups=100(users),501(asim),3400(web)

asim:~> grep asim /etc/passwd
asim:x:501:501:Asim El Baraka:/home/asim:/bin/bash

asim:~> grep 501 /etc/group
asim:x:501:

В приведенном выше примере четвертое поле в строке из /etc/passwd содержит значение "501", которое представляет собой группу asim. Из /etc/group мы можем получить имя, соответствующие этому идентификатору группы. При первом подключении к системе, это та группа, к которой будет принадлежать asim.

"Механизм" индивидуальной группы пользователя.
В целях обеспечения большей гибкости, большинство систем Linux преследуют так называемую индивидуальную групповую схему пользователей, которая, в первую очередь, присваивает каждому пользователю его собственную группу. Этой группе принадлежит только данный пользователь, отсюда и название "личная группа". Обычно эта группа имеет такое же имя как название логина пользователя, что может приводить к небольшой путанице.

Помимо своей собственной группы, пользователь asim также может быть в группах users и web. Т.к. это вторые группы для данного пользователя, ему придется использовать команду newgrp, чтобы войти в любую из этих групп (сначала используйте gpasswd для установки пароля для группы). В этом примере asim необходимо создать файлы, которые принадлежат группе web.

asim:/var/www/html> newgrp web

asim:/var/www/html> id
uid=501(asim) gid=3400(web) groups=100(users),501(asim),3400(web)

Теперь, когда asim создает новые файлы, они будут находиться в собственности группы web, вместо того, чтобы принадлежать группе asim:

asim:/var/www/html> touch test

asim:/var/www/html> ls -l test
-rw-rw-r--  1 asim web   0 Jun 10 15:38 test

Вход в новую группу освобождает вас от необходимости использовать chown (см. Раздел "Смена владельцев и групп") или вызывать системного администратора для смены владельцев для вас.

См. man-страницу для newgrp для получения дополнительной информации.

Маска файла

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

bert:~> umask
0002

Вместо добавления символических значений друг к другу, как с chmod, для выяснения разрешения на новый файл, необходимо вычесть из суммарной возможности прав доступа. Однако в примере выше мы видим четыре значения, но есть только три категории разрешений: для пользователя, группы и других. Первый ноль — это установленные специальные файловые атрибуты, которые мы будем обсуждать в Разделе "Смена владельцев и групп" и в Разделе "SUID и SGID". Возможно, с тем же успехом, в вашей системе этот первый ноль не отображается при вводе команды umask, и тогда вы видите только три числа, представляющих маску по умолчанию, «накладываемую» на файл.

Каждая UNIX-подобная система имеет системную функцию для создания новых файлов, которая вызывается каждый раз, когда пользователь использует программу, которая создает новые файлы, например, при загрузке файлов из Интернета, при сохранении нового текстового документа и т.д. Эта функция создает как новые файлы, так и директории. Полные права на чтение, запись и выполнение предоставляются всем при создании нового каталога. При создании нового файла, эта функция создаст право на чтение и запись для всех, но прав на выполнение отсутствует для всех категорий пользователей. Таким образом, первоначально применяется маска для каталога с разрешением 777 или rwxrwxrwx, а для обычного файла 666 или rw-rw-rw-.

Значение umask вычитается из этих разрешений по умолчанию, определенных инструментом, создающим новый файл или каталог. Таким образом, каталог будет иметь права доступа 775 по умолчанию, а файл 664, если значение маски (0)002. Это демонстрируется на примере ниже:

bert:~> mkdir newdir

bert:~> ls -ld newdir
drwxrwxr-x    2 bert    bert		4096 Feb 28 13:45 newdir/

bert:~> touch newfile

bert:~> ls -l newfile
-rw-rw-r--    1 bert    bert		   0 Feb 28 13:52 newfile

Файлы по сравнению с каталогами.
Каталог получает больше разрешений по умолчанию: он всегда имеет разрешение на выполнение. Если бы не это, они не были бы доступны. Исследуйте это, изменив режим доступа к каталогу на 644!

Если вы войдете в другую группу, используя команду newgrp, маска остается неизменной. Таким образом, если она установлена на 002, файлы и каталоги, которые вы создаете, находясь в новой группе, также будут доступны для других членов этой группы; вам не придется использовать команду chmod.

Пользователь root обычно имеет более строгую маску по умолчанию:

[root@estoban root]# umask
022

Эти значения по умолчанию — общесистемная установка в конфигурационном файле shell, например /etc/bashrc или /etc/profile. Вы можете изменить их на ваш собственный файл конфигурации shell, см. в Главе 7, “Дом сладкий /home” о настройках окружения оболочки.

Смена владельцев и групп

Если файл находится в собственности не того пользователя или группы, то недочет может быть устранен с помощью команд chown (смена владельца) и chgrp (смена группы). В среде, где файлы должны находиться в коллективном доступе группы, изменение владельца является частой задачей системного администрирования. Обе команды достаточно гибкие, о чем можно узнать с помощью опции --help.

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

Чтобы изменить лишь владельца-пользователя файла, используйте следующий синтаксис:

chown newuser file

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

jacky:~> id
uid=1304(jacky) gid=(1304) groups=1304(jacky),2034(pproject)

jacky:~> ls -l my_report
-rw-rw-r--  1 jacky   project       29387 Jan 15 09:34 my_report

jacky:~> chown jacky: my_report

jacky:~> chmod o-r my_report

jacky:~> ls -l my_report
-rw-rw----  1 jacky   jacky         29387 Jan 15 09:34 my_report

Если jacky захотел бы поделиться этим файлом, без предоставления всем разрешения на запись, то он может использовать команду chgrp:

jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky   jacky   45635 Jan 15 09:35 report-20020115.xls

jacky:~> chgrp project report-20020115.xls

jacky:~> chmod o= report-20020115.xls

jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky   project 45635 Jan 15 09:35 report-20020115.xls

Таким образом, пользователи из группы project смогут работать с этим файлом. У пользователей не из этой группы нет никакого доступа к нему вообще.

Как chown, так и chgrp могут быть использованы для рекурсивной смены владельца с помощью опции -r. В этом случае, все вложенные файлы и подкаталоги данного каталога будет принадлежать указанному пользователю и/или группе.

Ограничения.
На большинстве систем, использование команд chown и chgrp ограничено для непривилегированных пользователей. Если вы не администратор системы, то не можете изменить пользователя или группу по соображениям безопасности. Если использование этих команд не будет ограничено, то злостные пользователи могут назначать владельцами файлов других пользователей и/или другие группы, и изменить поведение окружения пользователей, и даже повредить чужие для них файлы.

Специальные режимы

Чтобы все время не беспокоить системного администратора решением проблем, связанных с правами, специальные права доступа могут быть предоставлены для целых каталогов или отдельных программ. Есть три специальных режима:

  • Режим "липкого бита": После выполнения задания, команда находится в оперативной памяти. Первоначально это была функция, которая использовалась в основном для сохранения памяти: большие рабочие части загружались в память только один раз. Но в наши дни память не такая дорогая и есть технологии, которые управляют ей лучше, поэтому это больше не используются для оптимизации возможностей на отдельных файлах. По отношению к целому каталогу, однако, у липкого бита есть другое значение. В этом случае, пользователь может изменять файлы в данной директории, если является владелец файла или файл имеет соответствующие разрешения. Эта возможность используется для таких каталогов как /var/tmp, которые должны быть доступны для всех, но где нельзя пользователям изменять или удалять данные друг друга. Липкий бит указывает в конце поля прав доступа к файлу:
mark:~> ls -ld /var/tmp
drwxrwxrwt   19 root     root         8192 Jan 16 10:37 /var/tmp/

Липкий бит установливается с помощью команды chmod o+t directory. Историческое происхождение “t” - сохранение возможности Text access (текстовый доступ) в UNIX.

  • SUID (установка ID пользователя) и SGID (установка ID группы): представлены символом s в поле прав доступа пользователя или группы. Когда этот режим установлен на исполняемый файл, то он будет запускаться с правами пользователя и группы, имеющих разрешения на файл, а не под тем пользователем, который ввел команду, таким образом, предоставляется доступ к системным ресурсам. Мы обсудим это далее в Главе 4, Процессы.
  • SGID (установка ID группы) на каталог: в этом конкретном случае все файлы, созданные в данном каталоге, будут иметь туже группу-владельца, что и сам каталог (в то время как нормальным поведением является то, что новые файлы принадлежат пользователям, которые их создают). Таким образом, пользователям не нужно беспокоиться о собственности файла при совместном использовании папок:
mimi:~> ls -ld /opt/docs
drwxrws---  4 root    users          4096 Jul 25 2001 docs/

mimi:~> ls -l /opt/docs
-rw-rw----  1 mimi    users        345672 Aug 30 2001-Council.doc

Это стандартный способ совместного доступа к файлам в UNIX.

Имеющиеся файлы остаются без изменений!
Файлы, которые перемещаются в SGID-каталог, но были созданы в других местах, сохраняют их первоначальные пользователя-владельца и группу. Это может привести к путанице.

Резюме

В UNIX, как и в Linux, все объекты, так или иначе, представлены в системе в виде файлов с соответствующими свойствами. Использование (предопределенных) адресных путей позволяет пользователям и системному администратору находить, читать файлы и управлять ими.

Мы сделали первые шаги, чтобы стать экспертом: мы обсудили реальную и "поддельную" структуру файловой системы, и мы узнали о модели файловой безопасности Linux, а также ряде других мер предосторожности, существующих на каждой системе по умолчанию.

Оболочка (shell) – самый важный инструмент для взаимодействия с системой. В этой главе мы познакомились с некоторыми командами, которые перечислены в таблице ниже.

Таблица 3.10. Новые команды из Главы 3: Файлы и файловая система

Команда Значение
bash Программная оболочка проекта GNU
cat file(s) Отправляет содержимое файла(ов) на стандартный вывод
cd directory Переход в directory. cd является встроенной командой bash
chgrp newgroup file(s) Изменение группы владельцев file(s) на newgroup
chmod mode file(s) Изменение прав доступа к file(s)
chown newowner[:[newgroup]] file(s) Изменение собственника файла и группы владельцев
cp sourcefile targetfile Копирование sourcefile в targetfile
df file Отчеты о использовании дискового пространства раздела, на котором находится файл
echo string Отображение строки текста
export Часть bash, которая объявляет переменные и их значения в системе
file filename Определить тип файла filename
find path expression Поиск файлов в иерархии файловой системы
grep PATTERN file Вывод строк файла, содержащих шаблон поиска
head file Отправить первую часть файла на стандартный вывод
id Вывод имени пользователя и названий групп
info command Чтение документации о command
less file Просмотр файла с помощью специальной программы
ln targetfile linkname Создание ссылки с именем linkname на targetfile
locate searchstring Вывод всех доступных файлов, соответствующих шаблону поиска
ls file(s) Вывод содержимого директории
man command Форматирует и отображает страницы системного руководства для command
mkdir newdir Создает новый пустой каталог
mv oldfile newfile Переименовывает или перемещает oldfile
newgrp groupname Вход в новую группу
pwd Печать текущего рабочего каталога
quota Показывает используемое дисковое пространство и ограничения
rm file Удаление файлов и директорий
rmdir file Удаление директорий
tail file Вывод последней части file
umask [value] Отображает или изменяет режим создания новых файлов
wc file Считает строки, слова и символы в file
which command Показывает полный путь к команде

Мы также подчеркнули тот факт, что вы должны ЧИТАТЬ СТРАНИЦЫ MAN. Эта документация является вашей первой помощью и содержит ответы на многие вопросы. Упомянутый выше список содержит основные команды, которые вы будете использовать ежедневно, но они могут делать гораздо больше, чем выполнение тех задач, о которых мы говорили здесь. Чтение документации предоставит вам необходимый контроль.

Последнее, но не менее значимое. Удобный обзор файловых разрешений:

Таблица 3.11. Файловые разрешения

Кто\Что r(ead) w(rite) (e)x(ecute)
u(ser) 4 2 1
g(roup) 4 2 1
o(ther) 4 2 1

Упражнения

Просто войдите под вашим обычным пользовательским ID.

Разделы

  • На каком разделе находится ваша домашняя директория?
  • Сколько разделов в вашей системе?
  • Каков общий размер вашего установленного Linux?

Пути

  • Отобразите ваши пути поиска программ.
  • Экспортируйте бессмысленный адрес, введя, например, export PATH=blah и попытайтесь получить список содержимого каталога.
  • Каков путь к домашней директории? Как бы другой пользователь достиг вашего домашнего каталога, начиная от своего домашнего каталога и используя относительные пути?
  • Перейти в каталог tmp, находящийся в /var.
  • Теперь перейдите в каталог share, находящийся в /usr, используя только одну команду. Измените на doc. Каков ваш текущий рабочий каталог?

Экскурсияпо системе

  • Перейдите в каталог /proc.
  • На каком процессоре(ах) работает система?
  • Сколько на текущий момент используется оперативной памяти?
  • Каким объемом пространства подкачки вы располагаете?
  • Какие драйверы загружены?
  • Сколько часов уже работает система?
  • С какими файловыми системами «знакома» ваша операционная система?
  • Перейдите в /etc/rc.d | /etc/init.d | /etc/runlevels и выберите каталог соответствующий вашему запущенному режиму.
  • Какие сервисы должны быть запущены на этом уровне?
  • Какие сервисы запускаются в графическом режиме из тех, которые не запускаются в текстовом?
  • Перейдите в /etc.
  • Как долго в системе хранятся лог-файл с мониторингом входов пользователя.
  • Какой релиз вы используете?
  • Есть какие-либо вопросы или сообщения дня?
  • Сколько пользователей определены в вашей системе? Не считайте их, пусть компьютер сделает это за вас!
  • Сколько групп?
  • Где хранится информация о часовом поясе?
  • В вашей системе установлены какие-нибудь HOWTO?
  • Перейдите в /usr/share/doc.
  • Назовите три программы, которые поставляются с пакетом GNU coreutils.
  • Какая версия bash установлена в данной системе?

Манипуляции над файлами

  • Создайте новый каталог в домашней директории.
  • Можно ли переместить эту папку на тот же уровень, что и ваш домашний каталог?
  • Скопируйте все XPM файлы из /usr/share/pixmaps в новый каталог. Что значит XPM?
  • Отобразите список файлов в обратном алфавитном порядке.
  • Перейдите в ваш домашний каталог. Создайте новый каталог и скопируйте в него все файлы из каталога /etc. Убедитесь, что вы также скопировали файлы и каталоги, которые находятся в подкаталогах /etc! (рекурсивное копирование)
  • Перейдите в новый каталог и создайте папку для файлов, начинающихся с большой буквы, и одну — для файлов, начинающихся с символов нижнего регистра. Переместите все файлы в предназначенные для них каталоги. Используйте как можно меньше команд, насколько это возможно.
  • Удалите остальные файлы.
  • Удалить каталог и все его содержимое с помощью одной команды.
  • Используйте grep, чтобы выяснить, какой сценарий запускает сервер шрифтов в графическом режиме.
  • Где находится программа sendmail?
  • Создайте символическую ссылку в вашем домашнем каталоге на /var/tmp. Убедитесь, что она действительно работает.
  • Сделайте еще символическую ссылку в вашем домашнем каталоге на эту ссылку. Также проверьте ее работоспособность. Удалите первую ссылку и отобразите содержимое каталога. Что случилось со второй ссылкой?

Разрешения файлов

  • Вы можете поменять права доступа к файлам в /home?
  • Какой у вас стандартный режим создания файлов?
  • Измените собственника /etc на вашего личные пользователя и группу.
  • Измените права доступа к файлу ~/.bashrc так, чтобы только вы и ваша основная группа могли читать его.
  • Введите команду locate root. Вы заметили что-нибудь особенное?
  • Создайте символическую ссылку на /root. Можно ли ее использовать?