20 сент. 2000 г.

Азы linux (для детей) урок 24

Процесс загрузки, инициализация и завершение работы

Введение

Одна из наиболее мощных сторон Linux связана с ее открытым методом запуска и остановки операционной системы; Linux загружает определенные программы, используя их особую конфигурацию, что позволяет вам изменять эти конфигурации для контроля процесса загрузки и останавливать работу системы элегантно и организовано.
Помимо задач контроля загрузки и процесса завершения работы, открытый характер Linux облегчает в большинстве случаев точное определение источников проблем, связанных с запуском и остановкой системы. Понимание основ этого является весьма полезным для всех, кто использует Linux.
Множество систем Linux используют lilo (LInux LOader) для загрузки операционных систем. Мы обсудим только GRUB, т. к. он проще в использовании и является более гибким. Если вам необходима информация о lilo, обратитесь к man-страницам и HOWTO. Оба загрузчика поддерживают двойные загрузки; мы ссылаемся на HOWTO по этому вопросу для практических примеров и справочной информации.

Загрузочный процесс

Когда загружается компьютер x86, процессор просматривает конец системной памяти на обнаружение BIOS (Basic Input/Output System) и запускает его. (Программа BIOS записывается в постоянной памяти только для чтения, и всегда доступна для использования.) BIOS обеспечивает низкоуровневый интерфейс для периферийных устройств и контролирует первый шаг процесса загрузки.
BIOS тестирует систему, ищет и проверяет периферию, и затем ищет устройство, чтобы использовать его для загрузки системы. Обычно BIOS проверяет устройство для дискет (или на многих современных системах дисковод CD-ROM) на наличие загрузочного диска, если их там нет, то смотрит на жестком диске. Последовательность устройств, используемых для загрузки, обычно контролируется индивидуальными для системы настройками BIOS. После того, как Linux установлен на жесткий диск, BIOS ищет главную загрузочную запись (Master Boot Record - MBR), начиная с первого сектора первого жесткого диска, загружает его содержимое в память и передает ему управление.
MBR содержит инструкции о том, как загрузить загрузчик GRUB (или LILO), использующий предварительно заданные операционные системы. MBR загружает загрузчик, который принимает на себя процесс (если загрузчик установлен в MBR). В стандартной конфигурации Red Hat Linux GRUB использует настройки в MBR для отображения параметров загрузки в меню. Как только GRUB получил корректные инструкции для запуска операционной системы либо из его командной строки или из файла конфигурации, он находит необходимые загрузочные файлы и удаляется от управления машиной в данной операционной системе.

Особенности GRUB

Этот метод загрузки называется прямой загрузкой, поскольку инструкции используются для непосредственной загрузки операционной системы, без какого-либо промежуточного кода между загрузчиком и основными файлами операционной системы (например, ядром). Процесс загрузки, используемый в других операционных системах, может незначительно отличаться от вышеуказанного. Например, операционные системы Microsoft (DOS и Windows) полностью переписывают MBR, когда они устанавливаются без учета какой-либо текущей конфигурации MBR. Все они стирают любую другую информацию, хранящуюся в MBR от других операционных систем, таких как Linux. Операционные системы Microsoft, также как и другие разные проприетарные операционные системы, загружаются с помощью метода цепной загрузки. При использовании этого метода, MBR указывает на первый сектор раздела, на котором находится операционная система, где находит специальные файлы, необходимые для фактической загрузки данной операционной системы.
GRUB поддерживает оба загрузочных метода, что позволяет использовать его практически с любой операционной системой, наиболее популярными файловыми системами, и практически любым жестким диском, который сможет распознать ваш BIOS.
GRUB содержит ряд других особенностей. Из них наиболее важные:
  • GRUB обеспечивает истинно командное, предшествующее ОС, окружение на машинах x86 для обеспечения максимальной гибкости при загрузке операционной системы с определенными параметрами или сбора информации о системе.
  • GRUB поддерживает режим логической адресации блоков (LBA), необходимый для доступа ко многим IDE и всем SCSI жестким дискам. До LBA жесткие диски могли столкнуться с 1024-цилиндровый пределом, когда BIOS после этого места не может найти файл.
  • Конфигурационный файл GRUB читается с диска каждый раз при загрузке системы, освобождая вас от необходимости писать поверх MBR при каждом изменении параметров загрузки.
Полное описание GRUB можно найти, выполнив команду info grub или на сайте GRUB. В Linux Documentation Project есть мини-HOWTO по мультизагрузке GRUB.

Init

Ядро, как только оно загружено, находит init в sbin и выполняет его.
Когда init запускается, то становится родителем и прародителем всех процессов, которые запускаются автоматически в вашей системе Linux. Первое, что делает init, читает его файл инициализации /etc/inittab. Он инструктирует init прочитать первоначальный сценарий конфигурации для окружения, в котором определены пути, запускается своппинг, проверяются файловые системы и так далее. В принципе, этот шаг позаботится обо всем, что ваша система должна сделать при своей инициализации: установка часов, инициализация последовательных портов и т.д.
Затем init продолжает читать файл /etc/inittab, который описывает, каким образом система должна подниматься на каждом уровне запуска и устанавливает уровень выполнения по умолчанию. Уровень выполнения определяет конфигурацию процессов. Все UNIX-подобные системы могут работать в различных конфигурациях, среди них есть однопользовательский режим, который называется уровнем выполнения 1 или S (или s). В этом режиме только системный администратор может подключиться к системе. Он используется для выполнения задач по обслуживанию без риска повреждения системы или пользовательских данных. Естественно, в такой конфигурации нам не следует предоставлять пользовательские службы, так что все они будут отключены. Другой уровень выполнения — это режим перезагрузки, или уровень 6, который завершает все запущенные службы, выполнив надлежащие процедуры, и перезагружает систему.
Используйте who для проверки, каким является ваш текущий уровень выполнения:
willy@ubuntu:~$ who -r
	run-level 2 2006-10-17 23:22		last=S
Подробнее об уровнях выполнения в следующем разделе, см. Раздел "Уровни выполнения Init".
После того, как для вашей системы определяется уровень выполнения по умолчанию, init запускает все фоновые процессы, необходимые для запуска системы, просматривая соответствующую для данного уровня выполнения директорию rc. init выполняет каждый kill-сценарий (их файловые имена начинаются с K) с параметром stop. Затем он проходит все запускающие сценарии (их имена файлов начинаются с S) в соответствующем уровню выполнения каталоге, с тем, чтобы все службы и приложения запустились правильно. На самом деле вы вручную можете выполнить те же сценарии после того, как система завершит загрузку, командами подобными /etc/init.d/httpd stop или service httpd stop, войдя в систему с правами root; в этом случае останавливается веб-сервер.
Особый случай.
Обратите внимание, что при запуске операционной системы скрипты в rc2.d и rc3.d, как правило, выполняются. В этом случае, никакие службы не останавливаются (по крайней мере, не навсегда). Службы только запускаются.
Ни один из сценариев, которые фактически запускают и останавливают службы, не расположен в /etc/rc.d. Вернее, все файлы в /etc/rc.d. являются символическими ссылками, указывающими на реальные сценарии, находящихся в /etc/init.d. Символическая ссылка это не более чем файл, который указывает на другой файл; в данном случае они используются, т. к. их можно создавать и удалять без ущерба для фактических сценариев, завершающих или запускающих службы. Символические ссылки на различные сценарии нумеруются в определенном порядке, в таком порядке они и запускаются. Вы можете изменить порядок запуска и остановки служб, изменив названия символических ссылок, которые ссылаются на сценарий, который фактически управляют службами. Вы можете использовать один и тот же номер множество раз, если хотите, чтобы определенный сервис запускался или останавливался непосредственно перед или после другого; в примере ниже перечислено содержимое /etc/rc5.d, в котором у crond и xfs имя ссылки начинается с "S90". В этом случае, скрипты запускаются в алфавитном порядке.
[jean@blub /etc/rc5.d] ls
K15httpd@     K45named@    S08ipchains@  S25netfs@      S85gpm@
K16rarpd@     K46radvd@    S08iptables@  S26apmd@       S90crond@
K20nfs@       K61ldap@     S09isdn@      S28autofs@     S90xfs@
K20rstatd@    K65identd@   S10network@   S30nscd@       S95anacron@
K20rusersd@   K74ntpd@     S12syslog@    S55sshd@       S95atd@
K20rwalld@    K74ypserv@   S13portmap@   S56rawdevices@ S97rhnsd@
K20rwhod@     K74ypxfrd@   S14nfslock@   S56xinetd@     S99local@
K25squid@     K89bcm5820@  S17keytable@  S60lpd@
K34yppasswdd@  S05kudzu@    S20random@    S80sendmail@
Затем init проходит через уровень выполнения, чтобы задать уровень по умолчанию, сценарий /etc/inittab разветвляется процессом getty для каждой виртуальной консоли (приглашение на вход в текстовом режиме). getty открывает строки tty, устанавливает их режимы, печатает строку входа, получает имя пользователя, и затем начинает процесс входа для данного пользователя. Это позволяет пользователям представится системе и использовать ее. По умолчанию, большинство систем предлагают 6 виртуальных консолей, но, как вы можете увидеть из файла inittab, это можно изменить.
/etc/inittab может также указать init, как тот должен обрабатывать пользовательское нажатие Ctrl + Alt + Delete в консоли. Поскольку система должна надлежащим образом выключаться и перезапускаться, а не прекращать немедленно работу, init сообщается выполнить команду /sbin/shutdown -t3 -r now, например, когда пользователь нажимает эти клавиши. Кроме того, /etc/inittab устанавливает, что init должен делать в случае отключения электропитания, если у вашей системы есть UPS unit, прикрепленный к ней.
В большинстве систем, основанных на RPM, графический экран для входа запускается на уровне выполнения 5, где /etc/inittab запускает скрипт под названием /etc/X11/prefdm. Скрипт prefdm преимущественно работает в графическом менеджере X, основываясь на содержимом каталога /etc/sysconfig/desktop. Это, как правило, gdm, если вы работаете на GNOME или kdm, если вы используете KDE, но они могут быть смешаны, кроме того, есть xdm, который предоставляется при стандартной установке X.
Но есть и другие возможности. В Debian, например, есть initscript для каждого менеджера дисплея, и содержание /etc/X11/default-display-manager используется для определения того, какой из них запустить. Подробнее о графическом интерфейсе можно прочитать в Разделе 7.3. "Графическая среда". В конечном счете, ваша системная документация разъяснит подробности высокоуровневых аспектов init.
Каталоги /etc/default и/или /etc/sysconfig содержат записи для целого ряда функций и служб, все это читается во время загрузки. Местонахождение директории, содержащей системные настройки по умолчанию, может несколько различаться в зависимости от вашего дистрибутива Linux.
Кроме того, графическая среда пользователя, ряд других служб могут быть запущены также. Но если все пойдет хорошо, то когда процесс загрузки завершается, вы видите приглашение для входа или графический экран для входа.
Другие процедуры.
Мы объяснили, как SysV init работ на базе x86. Запуск процедур может различаться на других архитектурах и дистрибутивах. Другие системы могут использовать BSD-стиль init, когда загрузочные файлы не разделяются на множество каталогов /etc/rc.d. Также может оказаться, что ваша система использует /etc/rc.d/init.d вместо /etc/init.d.

Уровни выполнения Init

Идея функционирования различных служб на разных уровнях выполнения по существу вращается вокруг того факта, что различные системы могут быть использованы по-разному. Некоторые службы не могут быть использованы, пока система находится в определенном состоянии или режиме, таком как быть готовой к более чем одному пользователю или доступной сети.
Бывают периоды, в которые вы можете работать с системой в низкоуровневом режиме. Примеры: решение проблем испорченного диска на уровне выполнения 1, так чтобы у других пользователей не было возможности быть в системе, или оставить сервер на уровне выполнения 3 (без работающей X сессии). В этих случаях, функционирование сервисов, которые зависят от высокоуровневого режима системы, не имеет смысла, т. к. они не будут работать правильно в любом случае. Уже имеющимся службам назначается их запуск, когда будет достигнут определенный уровень выполнения; вы обеспечиваете последовательный запуск процессов, и вы можете быстро изменить режим машины, не беспокоясь о том, что вручную придется запускать и останавливать службы.
Доступные уровни выполнения, как правило, описаны в файле /etc/inittab, содержимое которого частично показано ниже:
#
# inittab   This file describes how the INIT process should set up
#           the system in a certain run-level.

# Default run level. The run levels are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS 
#	(The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:
<--cut-->
Вы можете настроить неиспользованные уровни выполнения (обычно уровень 4) как вы считаете нужным. Многие пользователи настраивают эти уровни выполнения, таким образом, который наиболее подходит для них, оставляя стандартные уровни, поскольку они существуют по умолчанию. Это позволяет им быстро входить в и выходить из их пользовательской конфигурации, не нарушая нормальной установки свойств на стандартных уровнях запуска.
Если ваша машина оказывается в ситуации, когда она не может загрузиться из-за испорченного /etc/inittab или не позволят вам войти, т.к. вы повредили файл /etc/passwd (или если вы просто забыли свой пароль), загрузитесь в однопользовательском режиме.
Без графики?
Когда вы работаете в текстовом режиме, т. к. не был предоставлен экран графического входа на вашей машине, обычно вы можете переключаться на консоль 7. Если это не так, проверить текущий режим работы с помощью команды who -r. Если он установлен на что-нибудь другое, чем есть оригинальные установки по умолчанию в /etc/inittab, то вероятно это может быть причина того, что система не запускается в графическом режиме по умолчанию. В таком случае обратитесь к системному администратору или прочитайте man init. Заметим, что переключение режимов работы осуществляется преимущественно с использованием команды telinit; переключение из текстовой в графическую консоль или наоборот не подразумевает изменение режима выполнения.
Мы стараемся в данном руководстве обсуждать режимы выполнения, скрипты и конфигурации в общих чертах. Существует множество вариаций. Например, Gentoo Linux хранит скрипты в уровнях /etc/run. Другие системы могут запускаться через первый нижний режим выполнения и выполнить все сценарии в нем до прибытия конечного режима выполнения и исполнения его сценариев. Обратитесь к системной документации для получения дополнительной информации. Вы также можете прочитать скрипты, которые относятся к /etc/inittab, чтобы лучше понять, что происходит в вашей системе.

Инструменты

Если в вашей системе установлены утилиты chkconfig или update-rc.d, то они обеспечат простой инструмент командной строки для поддержания иерархии каталога /etc/init.d. Это освобождает системных администраторов от необходимости напрямую управлять многочисленные символическими ссылками в каталогах в /etc/rc[x].d.
Кроме того, некоторые системы предлагают инструмент ntsysv, который предоставляет текстовый интерфейс; вы можете сочти его легче в использовании, чем интерфейс командной строки chkconfig. В SuSE Linux, вы обнаружите инструменты yast и insserv. В Mandriva есть Mandriva Linux Control Center (Центр управления Mandriva Linux).
Большинство дистрибутивов обеспечивают графический пользовательский интерфейс для настройки процессов; обратитесь к вашей системной документации.
Все эти утилиты должны быть запущен под root. Системный администратор также может вручную создать соответствующие ссылки в каждом каталоге режима выполнения для того, чтобы запустить или остановить службы определенного режима.

Shutdown – выключение

UNIX была создана как система, которая не останавливается, но если вам это действительно надо, используйте команду shutdown. Опция -h будет остановить систему, а -r будет перезагружать ее.
Команды reboot и halt теперь способны вызывать shutdown, когда система находится в режимах выполнения 1-5, и таким образом обеспечить надлежащее завершение ее работы, но это плохая привычка, поскольку не во всех версиях UNIX/Linux есть такая возможность.
Пока ваш компьютер сам не выключится, вы не должны выключать его, пока не увидите сообщение с указанием, что система остановилась или все процессы завершились, т. к. система должна отключить все разделы. Нетерпеливость может привести к потере данных.

Азы linux (для детей) урок 23

Глава 4. Процессы

Мы узнаем больше о том, что такое:
  • Многопользовательская работа и многозадачность
  • Типы процессов
  • Контроль процессов различными сигналами
  • Свойства процессов
  • Жизненный цикл процесса
  • Системный запуск и остановка
  • SUID и SGID
  • Системная скорость и ответная реакция
  • Планирование процессов
  • Система Vixie cron
  • Как получить максимум от вашей системы

Многопользовательская работа и многозадачность

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

Типы процессов

Интерактивные процессы

Интерактивные процессы инициализируется и контролируется через терминальную сессию. Иными словами, кто-то должен быть подключен к системе, чтобы эти процессы запустились; они не запускаются автоматически, как часть функциональности системы. Эти процессы могут работать на переднем плане, занимая терминал, который запустил программу, и вы не сможете запускать другие приложения до тех пор, как этот процесс работает таким образом. Иначе они могут работать в фоновом режиме, таким образом, терминал, в котором вы запустили программу, может принимать новые команды, пока та программа тоже работает. До сих пор мы в основном уделяли внимание программам, работающим на переднем плане - продолжительность времени, необходимого для их работы, была слишком короткой, чтобы заметить - но просмотр файлов командой less - хороший пример, когда команда занимает терминал сессии. В этом случае, активная программа ожидает от вас какого-нибудь действия. Программа по-прежнему связана с терминалом, откуда она была запущена, а терминал пригоден только для ввода команд для этой программы, только их он может понять. Другие команды просто приведут к ошибкам или зависанию системы.
Несмотря на то, что процесс выполняется в фоновом режиме, пользователь все равно не имеет возможности делать другие вещи в терминале, в котором он запустил программу, пока программа работает.
Оболочка предлагает функцию управления заданиями, которая позволяет легко обрабатывать множество процессов. Этот механизм переключает процессы между передним и задним фоном. Используя эту систему, программы также могут быть запущены в фоновом режиме сразу же.
Запуск процесса в фоновом режиме, имеет смысл только для программ, которые не нуждаются в пользовательском контроле (через shell). Перевод задания в фоновый режим делается, как правило, когда для его выполнения, как ожидается, потребует длительного времени. Для того, чтобы освободить выдачу терминала после ввода команды, добавляется завершающий амперсанд. В примере, используя графический режим, мы открываем дополнительное окно терминала из имеющегося:
billy:~> xterm &
[1] 26558

billy:~> jobs
[1]+  Running                 xterm &
Подробное описание функции контроля заданий есть в info-страницах bash, так что здесь перечислены только наиболее часто используемые способы управления заданиями:
Таблица 4.1. Управление процессами
Команды (часть из существующих) Значение
regular_command Запуск данной команды на переднем плане.
command & Запуск команды в фоновом режиме (в версии терминала).
jobs Показывает команды запущенные в фоновом режиме.
Ctrl+Z Приостановить (остановить, но не выйти) процесс, выполняемый на переднем плане (засыпание).
Ctrl+C Прервать (прекратить и выйти) процесс, выполняемый на переднем плане.
%n Каждый процесс, выполняемый в фоновом режиме, получает присвоенный ему номер. Используя выражение %, указание может быть отнесено к процессу путем использования его номера, например, fg %2.
bg Возобновить приостановленную программу в фоновом режиме.
fg Поместить фоновое задание на передний план.
kill Завершение процесса (см. также Shell Builtin Commands на info-страницах bash).
Подробные практические примеры можно найти в упражнениях.
Большинство UNIX систем, вероятно, могут быть способны запустить экран, который полезен, когда вам действительно нужна еще одна оболочка для выполнения команд. После вызова экрана, новая сессия создается с сопутствующей оболочкой и/или командами, которые указаны и которые вы можете отложить в сторону. В этой новой сессии вы можете делать все, что вы хотите. Все программы и операции будут работать независимо от выдачи оболочки. Затем вы можете отделить эту сессию, пока программы, которые вы запустили в ней, продолжат работать, даже когда вы выйдите из оболочки давшей начало, и выберите экран снова в любое удобное для вас время.
Эта программа берет свое начало со времени, когда виртуальные консоли еще не придумали, и все должно было быть сделано с помощью одного текстового терминала. Для увлеченных это все еще имеет значение в Linux, хотя уже почти 10 лет у нас есть виртуальные консоли.

Автоматические процессы

Автоматические или пакетные процессы не связаны с терминалом. Скорее, это такие задачи, которые могут быть поставлены в очередь области диспетчера печати, где они ожидают выполнения по принципу FIFO (первый вошел, первый вышел). Такие задачи могут быть выполнены с помощью одного из двух критериев:
  • В определенную дату и время: выполнение, используя команду at, которую мы обсудим во второй части этой главы.
  • В периоды, когда общая загруженность системы достаточно низка, чтобы принять дополнительные работы: делается с помощью команды batch. По умолчанию задачи ставятся в очередь, где они ожидают выполнения в период, когда загрузка системы будет меньше, чем 0,8. В больших средах системный администратор может отдать предпочтение пакетной обработке, когда должны быть обработаны большие объемы данных или когда выполнение задач требуют много системных ресурсов в уже загруженной системе. Пакетная обработка используется также для оптимизации производительности системы.

Демоны

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

Свойства процессов

Процесс имеет ряд особенностей, которые могут быть просмотрены с помощью команды ps:
  • Идентификатор процесса или PID: уникальный идентификационный номер, используемый для обращения к процессу.
  • ID родительского процесса или PPID: номер процесса (PID), который запустил данный процесс.
  • Nice-число: степень дружелюбия этого процесса по отношению к другим процессам (не путать с приоритетом процесса, который рассчитывается на основе этого милого числа и последнего использования процессора этим процессом).
  • Терминал или TTY: терминал, к которому привязан данный процесс.
  • Имя реального и эффективного пользователя (RUID и EUID): владелец процесса. Реальным владельцем является пользователь, который ввел команду, эффективный пользователь — тот, кто определяет порядок доступа к системным ресурсам. RUID и EUID обычно это одно и то же, и процесс имеет те же права доступа, которые есть у пользователя его запустившего. Поясним это на примере: браузер mozilla, находящийся в /usr/bin, принадлежит пользователю root:
theo:~> ls -l /usr/bin/mozilla
-rwxr-xr-x  1 root   root      4996 Nov 20 18:28 /usr/bin/mozilla*

theo:~> mozilla &
[1] 26595

theo:~> ps -af
UID     PID  PPID C STIME TTY       TIME CMD
theo  26601 26599 0 15:04 pts/5 00:00:00 /usr/lib/mozilla/mozilla-bin
theo  26613 26569 0 15:04 pts/5 00:00:00 ps -af
Когда пользователь theo запускает эту программу, сам процесс и все процессы, запущенные им, будут принадлежать пользователю theo, а не системному администратору. Когда mozilla будет требовать доступ к определенным файлам, то доступ будет зависеть от разрешений theo, а не администратора.
  • Реальная и эффективная группы владельца (RGID и EGID): реальной группой- владельцем процесса является основная группа пользователя, запустившего процесс. Эффективная группа-владелец - обычно то же самое, за исключением случаев, когда режим доступа SGID применяется к файлу.

Просмотр информации о процессе

Команда ps является одним из инструментов для визуализации процессов. Эта команда имеет несколько опций, которые могут быть объединены для отображения различных свойств процесса.
При отсутствии конкретных опций ps выдает только информацию о текущей оболочке и возможных процессах:
theo:~> ps
  PID TTY          TIME CMD
 4245 pts/7    00:00:00 bash
 5314 pts/7    00:00:00 ps
Поскольку это не дает достаточно информации - как правило, по меньшей мере сотня процессов запущены в вашей системе – мы обычно будем выбирать отдельные процессы из списка всех процессов, используя команду grep в конвейере , см. Раздел "Выход перенаправления с > и | ", как в этой строке, в которой будут выбраны и отображены все процессы, принадлежащие определенному пользователю:
ps -ef | grep username
Этот пример показывает все процессы с процессорным именем bash, наиболее распространенной оболочкой в системах Linux:
theo:> ps auxw | grep bash
brenda   31970  0.0  0.3  6080 1556 tty2   S  Feb23   0:00 -bash
root     32043  0.0  0.3  6112 1600 tty4   S  Feb23   0:00 -bash
theo     32581  0.0  0.3  6384 1864 pts/1  S  Feb23   0:00 bash
theo     32616  0.0  0.3  6396 1896 pts/2  S  Feb23   0:00 bash
theo     32629  0.0  0.3  6380 1856 pts/3  S  Feb23   0:00 bash
theo      2214  0.0  0.3  6412 1944 pts/5  S  16:18   0:02 bash
theo      4245  0.0  0.3  6392 1888 pts/7  S  17:26   0:00 bash
theo      5427  0.0  0.1  3720  548 pts/7  S  19:22   0:00 grep bash
В этих случаях команда grep находит строки, содержащие строку bash, которые множество раз отображаются также в системах, которые имеют много простоев. Если вы не хотите, чтобы это произошло, используйте команду pgrep.
Bash-оболочки представляют собой особый случай: этот процессорный список также показывает, какие из них являются оболочками входа (где вы должны ввести ваше имя пользователя и пароль, например, когда вы входите в текстовом режиме или же совершаете удаленный вход, в отличие от оболочек не требующих логина, например, нажав значок окна терминала). Такие оболочки, требующие логин, начинаются с дефиса (-).
|?
Мы расскажем об операторе | в следующей главе, см. Главу 5, "Перенаправление ввода/вывода".
Дополнительная информация может быть найдена как обычно: ps --help или man ps. GNU ps поддерживает различные форматы опций; приведенные выше примеры не содержат ошибок.
Заметьте, что ps выдает только сиюминутное состояние активных процессов, это одномоментный срез. Программа top дает более точный обзор путем обновления результатов, определенных ps (с множеством опций), один раз в 5 секунд, создавая новый список процессов, что периодически вызывает большие нагрузки, поэтому используется подключение дополнительной информации о файле подкачки и состоянии процессора; из файла proc системы:
 12:40pm up 9 days, 6:00, 4 users, load average: 0.21, 0.11, 0.03
89 processes: 86 sleeping, 3 running, 0 zombie, 0 stopped
CPU states:  2.5% user,  1.7% system,  0.0% nice, 95.6% idle
Mem:   255120K av, 239412K used, 15708K free, 756K shrd, 22620K buff
Swap: 1050176K av, 76428K used, 973748K free, 82756K cached

  PID USER  PRI NI SIZE  RSS SHARE STAT %CPU %MEM TIME COMMAND
 5005 root  14  0 91572  15M 11580 R    1.9  6.0  7:53 X
19599 jeff  14  0  1024 1024   796 R    1.1  0.4  0:01 top
19100 jeff   9  0  5288 4948  3888 R    0.5  1.9  0:24 gnome-terminal
19328 jeff   9  0 37884  36M 14724 S    0.5 14.8  1:30 mozilla-bin
    1 root   8  0   516  472   464 S    0.0  0.1  0:06 init
    2 root   9  0     0    0     0 SW   0.0  0.0  0:02 keventd
    3 root   9  0     0    0     0 SW   0.0  0.0  0:00 kapm-idled
    4 root  19 19     0    0     0 SWN  0.0  0.0  0:00 ksoftirqd_CPU0
    5 root   9  0     0    0     0 SW   0.0  0.0  0:33 kswapd
    6 root   9  0     0    0     0 SW   0.0  0.0  0:00 kreclaimd
    7 root   9  0     0    0     0 SW   0.0  0.0  0:00 bdflush
    8 root   9  0     0    0     0 SW   0.0  0.0  0:05 kupdated
    9 root  -1-20     0    0     0 SW<  0.0  0.0  0:00 mdrecoveryd
   13 root   9  0     0    0     0 SW   0.0  0.0  0:01 kjournald
   89 root   9  0     0    0     0 SW   0.0  0.0  0:00 khubd
  219 root   9  0     0    0     0 SW   0.0  0.0  0:00 kjournald
  220 root   9  0     0    0     0 SW   0.0  0.0  0:00 kjournald
Первая строка top содержит такую же информацию, которая отображается командой uptime:
jeff:~> uptime
  3:30pm, up 12 days, 23:29, 6 users, load average: 0.01, 0.02, 0.00
Данных для этих программ хранятся среди других в /var/run/utmp (информация о текущих подключенных пользователях) и в виртуальной файловой системе /proc, например, /proc/loadavg (обычная загрузочная информация). Есть разные виды графических приложений для просмотра этой информации, такие как Gnome System Monitor и lavaps. На FreshMeat и SourceForge и вы найдете десятки приложений, которые централизируют эту информацию наряду с другими серверными данными и журналами со множества серверов на один (web) сервер, что позволяет осуществлять мониторинг всей ИТ-инфраструктуры с одной рабочей станции.
Отношения между процессами могут быть отображены с использованием команды pstree:
sophie:~> pstree
init-+-amd
     |-apmd
     |-2*[artsd]
     |-atd
     |-crond
     |-deskguide_apple
     |-eth0
     |-gdm---gdm-+-X
     |           `-gnome-session-+-Gnome
     |                           |-ssh-agent
     |                           `-true
     |-geyes_applet
     |-gkb_applet
     |-gnome-name-serv
     |-gnome-smproxy
     |-gnome-terminal-+-bash---vim
     |                |-bash
     |                |-bash---pstree
     |                |-bash---ssh
     |                |-bash---mozilla-bin---mozilla-bin---3*[mozilla-bin]
     |                `-gnome-pty-helper
     |-gpm
     |-gweather
     |-kapm-idled
     |-3*[kdeinit]
     |-keventd
     |-khubd
     |-5*[kjournald]
     |-klogd
     |-lockd---rpciod
     |-lpd
     |-mdrecoveryd
     |-6*[mingetty]
     |-8*[nfsd]
     |-nscd---nscd---5*[nscd]
     |-ntpd
     |-3*[oafd]
     |-panel
     |-portmap
     |-rhnsd
     |-rpc.mountd
     |-rpc.rquotad
     |-rpc.statd
     |-sawfish
     |-screenshooter_a
     |-sendmail
     |-sshd---sshd---bash---su---bash
     |-syslogd
     |-tasklist_applet
     |-vmnet-bridge
     |-xfs
     `-xinetd-ipv6
Опции -u и -a дают дополнительную информацию. Для знакомства с другими опциями, а также тем, что они делают, направляем к info-страницам.
В следующем разделе мы увидим, как один процесс может создавать другой.

Жизнь и смерть процесса

Создание процесса

Новый процесс появляется вследствие того, что существующий процесс создает точную копию самого себя. У этого дочернего процесса тоже окружение, что и у родителя, отличается только номер ID процесса. Эта процедура называется forking (порождение).
После рождения, адресное пространство дочернего процесса переписывается с новыми данными процесса. Это делается посредством вызова ехес в системе.
Таким образом, механизм fork-and-exec переключает старые команды на новые, пока окружение, в котором выполняется новая программа остается таким же, в том числе конфигурация устройств ввода/вывода, переменные окружения и приоритет. Этот механизм используется для создания всех процессов UNIX, также это относится и к операционной системе Linux. Даже первый процесс, init, с процессорным ID 1, порождается во время загрузки в так называемой процедуре bootstrapping (начальной загрузки).
Эта схема иллюстрирует механизм fork-and-exec. ID процесса изменяется после процедуры порождения:
Рисунок 4.1. Механизм fork-and-exec
Происхождение процессов в Linux
Есть несколько случаев, в которых init становится родителем процесса, хотя процесс не был запущен init, как мы уже видели в примере pstree. Многие программы, например, daemonize - их дочерние процессы, так они могут продолжать работать, когда родитель завершается или его завершают. Оконный менеджер является типичным примером; он запускается процессом xterm, который создает оболочку (shell), принимающую команды. Затем оконный менеджер отстраняется от какой-либо дальнейшей ответственности и передает дочерний процесс init. С помощью этого механизма можно менять оконные менеджеры, не прерывая запущенных приложений.
Время от времени что-то идет не так даже в хороших семьях. В исключительных случаях процесс может закончиться, в то время как родитель не ждет завершения этого процесса. Такой непогребенный процесс называется зомби-процессом.

Завершение процесса

Когда процесс завершается нормально (его не завершили или иным способом неожиданно не прервали), программа возвращает его exit status (статус выхода) родителю. Этот exit status является числом, возвращаемым программой, предоставившей результаты своего выполнения. Система передачи информации об исполненной работе берет свое начало с языка программирования Си, на котором был написан UNIX.
Коды возврата могут быть интерпретированы родителем или скриптами. Значения кодов возврата специфичны для программ. Эту информацию обычно можно найти в man-страницах указанной программы, например команда grep возвращает -1, если не найдено совпадений, при этом в строке может быть выведено сообщение: "Нет найденных файлов". Другим примером является встроенная команда Bash true, которая не делает ничего, кроме возвращения статуса выхода 0, что означает успех.

Сигналы

Процессы заканчиваются, если они получают сигнал. Есть несколько сигналов, которые вы можете отправить процессу. Используйте команду kill, чтобы послать сигнал процессу. Команда kill -i отображается список сигналов. Большинство сигналов предназначены для внутреннего использования системой или для программистов, когда они пишут код. Как пользователю вам потребуются следующие сигналы:
Таблица 4.2. Часто используемые сигналы
Имя сигнала Номер сигнала Значение
SIGTERM 15 Завершить процесс надлежащим образом.
SIGINT 2 Прерывание процесса. Процесс может игнорировать этот сигнал.
SIGKILL 9 Прерывание процесса. Процесс не может игнорировать этот сигнал.
SIGHUP 1 Для демонов: перечитать конфигурационный файл.
Вы можете прочитать больше о действиях по умолчанию, которые предпринимаются при передаче сигнала процессу, в man 7 signal.

SUID и SGID

Как и было обещано в предыдущей главе, теперь мы будем обсуждать специальные режимы SUID и SGID более подробно. Эти режимы существуют, чтобы обеспечить обычным пользователям возможность выполнять задачи, которые они, как правило, не могут осуществить из-за строгой схемы управления доступом к файлам, используемой в UNIX-системах. В идеальной ситуации специальные режимы используются так редко, насколько это возможно, так как они включают в себя риски для безопасности. Разработчики Linux, как правило, стараются также избегать их по возможности. Версия ps в Linux, например, использует информацию, хранящуюся в файловой системе /proc, которая доступна каждому, что позволяет избегать демонстрации важных системных данных и ресурсов для широкой общественности. До этого (и до сих пор на старых системах UNIX) программа ps нуждалась в доступе к файлам, таким как /dev/mem и /dev/kmem, что имело свои недостатки из-за разрешений и владельцев этих файлов:
rita:~> ls -l /dev/*mem
crw-r-----    1 root     kmem       1,   2 Aug 30 22:30 /dev/kmem
crw-r-----    1 root     kmem       1,   1 Aug 30 22:30 /dev/mem
В более ранних версиях ps не было возможности для запуска программы под обычным пользователем без применения специальных режимов.
Хотя мы обычно стараемся избегать применения каких-либо специальных режимов, иногда бывает необходимо использовать SUID. Примером может служить механизм смены пароля. Очевидно, что пользователи хотят делать это самостоятельно вместо того, чтобы их пароль устанавливал системный администратор. Как мы знаем, имена пользователей и пароли перечислены в файле /etc/passwd, который имеет следующие права доступа и владельцев:
bea:~> ls -l /etc/passwd
-rw-r--r--    1 root     root     1267 Jan 16 14:43 /etc/passwd
Тем не менее, у пользователей должна быть возможность изменять свою информацию в этом файле. Это достигается путем предоставления программой passwd специальных разрешений:
mia:~> which passwd
passwd is /usr/bin/passwd

mia:~> ls -l /usr/bin/passwd
-r-s--x--x    1 root     root    13476 Aug  7 06:03 /usr/bin/passwd*
При вызове команда passwd выполняется с использованием прав доступа root, что позволяет обычному пользователю редактировать файл паролей, который принадлежит системному администратору.
SGID режимы на файл не распространяются так же часто, как SUID, потому что SGID зачастую включает в себя создание дополнительных групп. В некоторых случаях, однако, мы должны пройти через эту неприятность, с тем чтобы выполнить элегантное решение (слишком об этом не беспокойтесь - необходимые группы обычно создаются при установке). Это происходит для программ write и wall, которые используются для отправки сообщений другим пользовательским терминалами (ttys). Команда write выводит сообщение одному пользователю, а wall пишет всем подключенным пользователям.
Отправка текста иным пользовательским терминалам или на графический дисплей, как правило, не допускается. Для того чтобы обойти эту проблему, была создана группа, которая является владельцем всех терминальных устройств. Когда команды write и wall получают SGID разрешения, команды запустятся с помощью прав доступа, применимых к этой группе, tty в примере. Поскольку у этой группы есть право на запись в назначенный терминал, то пользователь, не имеющий разрешения на использование этого терминала, в любом случае может отправлять туда сообщения.
В приведенном ниже примере пользователь joe в начале узнает, с каким терминалом связан его корреспондент, для этого он использует команду who. Затем он отправляет ей сообщение с помощью команды write. Кроме того, иллюстрируются права доступа на программу write и какие терминалы занимает принимающий пользователь: очевидно, что отличные от пользователя-владельца не имеют разрешения на устройство, за исключением владельца-группы, которая может писать в него.
joe:~> which write
write is /usr/bin/write

joe:~> ls -l /usr/bin/write
-rwxr-sr-x    1 root     tty      8744 Dec  5 00:55 /usr/bin/write*

joe:~> who
jenny     tty1     Jan 23 11:41
jenny     pts/1    Jan 23 12:21 (:0)
jenny     pts/2    Jan 23 12:22 (:0)
jenny     pts/3    Jan 23 12:22 (:0)
joe       pts/0    Jan 20 10:13 (lo.callhost.org)

joe:~> ls -l /dev/tty1
crw--w----    1 jenny   tty  4,     1 Jan 23 11:41 /dev/tty1

joe:~> write jenny tty1
hey Jenny, shall we have lunch together?
^C
Пользователь jenny получает это на ее экране:
Message from joe@lo.callhost.org on ptys/1 at 12:36 ...
hey Jenny, shall we have lunch together?
EOF
После получения сообщения, терминал может быть очищен помощью комбинации клавиш Ctrl + L. Для того, чтобы не получать никакие сообщения вообще (кроме тех, что от системного администратора), используйте команду mesg. Чтобы узнать, какие подключенные пользователи принимают сообщения от других, используют who -w. Все особенности полностью разъяснены на info-страницах для каждой команды.
Названия групп могут быть различными.
Групповая схема специфична для дистрибутива. Разные дистрибутивы могут использовать разные имена или различные решения.

Азы linux (для детей) урок 22


Упражнения

Азы linux (для детей) урок 21

Таблица 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

Азы linux (для детей) урок 20

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


Права доступа: первая линия обороны 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-каталог, но были созданы в других местах, сохраняют их первоначальные пользователя-владельца и группу. Это может привести к путанице.

Азы linux (для детей) урок 19

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


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

Дополнительная информация о 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.