Загрузка и разгрузка системы
   Изначальный запуск программ, составляющих операционную систему, называется загрузкой ОС, их завершение — ее разгрузкой, а загрузка сразу вслед за разгрузкой — перезагрузкой.
   Эти действия относятся к административным, то есть для их выполнения нужно обладать соответствующими полномочиями.
   Многопользовательские машины и серверы разгружаются обычно лишь перед ремонтом или модернизацией оборудования, а перезагружаются — после обновления ядра, важных системных программ или библиотек.
   Однако на настольных, портативных и мобильных машинах выполнение этих процедур в большинстве случаев делегируется всем пользователям, и нет необходимости регистрироваться в системе в качестве администратора (и даже иметь такую возможность, то есть знать пароль администратора), чтобы выполнить ее разгрузку или перезагрузку. Такие машины часто выключаются по окончании рабочего дня.
   На микрокомпьютерах для загрузки системы обычно не требуется выполнять каких-то специальных действий. При включении машины автоматически выполняется следующая последовательность процедур.
   Загружается в память и начинает исполняться вшитый загрузчик. Это миниатюрная программа, располагающаяся в энергонезависимой памяти (ППЗУ или флэш) на системной плате, которая пытается загрузить следующую программу-загрузчик с устройства, указанного в настройках (также располагающихся в энергонезависимой памяти). Такими устройствами могут быть сетевой адаптер, фиксированный (жесткий) диск или привод съемного носителя информации (дискеты, CD, DVD или ZIP-диска). Бездисковые машины загружаются с сетевого адаптера (для этого в локальной сети должен присутствовать сервер, предоставляющий по запросу загрузчик). Автономные машины загружаются обычно с фиксированного диска. Со съемного носителя загружаются автономные машины при установке на них новой ОС или проведении восстановительных работ.
   Загрузчик ОС (LILO, GRUB или другой) загружает ядро операционной системы. Загрузчик может быть настроен на выдачу перед загрузкой меню, в котором перечислены различные варианты загрузки или даже различные ОС, установленные на фиксированных дисках машины или в локальной сети.
   После этого управление передается загруженному ядру операционной системы, которое выполняет запрограммированную последовательность действий, включая собственное конфигурирование (подгрузку модулей), и запуск корневого процесса, запускающего системные сервисы и программы и т.д.
   Такая (кажущаяся сложной) трехзвенная последовательность загрузки обеспечивает необходимую гибкость в администрировании машины. Для оператора же она сводится в большинстве случаев к тому, что некоторое время машина активно мигает лампочками сетевого контроллера и/или привода фиксированного диска, а на ее консоль (терминал, подключенный непосредственно к машине) выдается серия диагностических сообщений.
   Показателем успешной загрузки системы является вывод на консоль (и на другие терминалы, если таковые имеются) приглашения к регистрации: как правило оно содержит логотип ОС и/или организации, сведения о локальной системе (включая ее имя, тип и тактовую частоту процессора, объем оперативной памяти) и строку «login:».
   Некоторые машины настраиваются на автоматический запуск в ходе загрузки графической оконной системы «Икс». В этом случае (а также при регистрации на икс-терминале) приглашение к регистрации будет иметь вид окна с полями «login» (регистрационное имя) и «password» (пароль).
   Начиная с момента передачи управления ядру (начала загрузки собственно ОС) машину не следует выключать, не выполнив процедуру разгрузки ОС. Разгрузка ОС и выключение машины описаны в документации. В большинстве случаев самым быстрым (хотя и не самым изящным) способом будет одновременное нажатие клавиш Control-Alt-Del и физическое выключение машины при появлении сообщения и/или логотипа вшитого загрузчика (БИОС).
   Вход в систему и выход из системы
   Для того, чтобы взаимодействовать с компьютером, нужно зарегистрироваться в ОС. Регистрируясь («входя» в систему) , вы сообщаете системе, что на определенном терминале (реальном или виртуальном) с ней работает определенный пользователь. Система полагает, что пользователь продолжает работу, пока он явным образом не разрегистрируется (не «выйдет» из системы).
   Время от входа до выхода из системы называют сеансом работы в ней. Сеансом называют также совокупность команд, поданных пользователем за это время.
   Программа регистрации запрашивает регистрационное имя (login) и пароль (password). Регистрационное имя — это имя, под которым пользователь занесен в список пользователей, поддерживаемый в системе. Оно уникально для машины и может быть известно другим пользователям. Пароль — это личный секрет пользователя, он не должен быть известен больше никому.
   Пароли нужны для того, чтобы предотвратить регистрацию в системе под чужим именем. На машине, все пользователи которой абсолютно доверяют друг другу, можно устанавливать пустой пароль, тогда для регистрации в системе достаточно будет ввести регистрационное имя. При этом, если машина включена в сеть, таким пользователям должна быть запрещена «удаленная» регистрация (регистрация с других машин).
   Регистрационные имена не соответствуют однозначно физическим лицам. Во-первых, целый ряд имен не допускают регистрации под собою вовсе; «от их имени» исполняются системные программы и сервисы.
   Во-вторых, одно и то же лицо может регистрироваться на машине «в разных ролях». Если вы сами администрируете систему, то для выполнения административных задач вы регистрируетесь под именем главного пользователя (root). Для решения прикладных задач (чтения почты, получения информации из WWW, редактирования текстов, программирования, чего угодно) вы регистрируетесь под именем «обычного пользователя», учетную запись которого для себя создали.
   Выполнять прикладные задачи, зарегистрировавшись под именем главного пользователя (root), нельзя.
   Если вы легальный пользователь машины, администрируемой другим лицом, администратор сообщит вам (или предложит выбрать) ваше регистрационное имя и пароль.
   Если вы сами администрируете систему, то, скорее всего, уже создали учетную запись для себя при установке системы.
   Далее мы обсуждаем пользовательницу Алису, имеющую учетную запись alice на машине wonderland и знающую свой пароль (мы его не знаем).
Рис. 1-1
   На алфавитно-цифровом терминале Алиса регистрируется, вводя в ответ на приглашение «login» имя alice и завершая ввод нажатием клавиши Enter, и, затем, вводя свой пароль (пароль при вводе не отображается) и завершая его ввод нажатием той же клавиши (Рис. 1-1).
   После этого программа (это уже не программа регистрации, а программа-оболочка операционной системы) выводит подсказку («приглашение»).
   Достаточно типичная подсказка изображена выше; она состоит из регистрационного имени и имени машины, разделенных знаком «@» (читается «эт»), за которыми следует имя текущего каталога. Все это заключено в квадратные скобки, за которыми следует символ подсказки «$».
   Возможно, на вашей машине строка подсказки выводится в другом формате. Как и почти всё в открытых системах, формат строки подсказки легко настраивается главным пользователем (для всех пользователей машины) или каждым пользователем для себя.
   Чтобы получить строку приглашения, зарегистрировавшись в системе с автоматическим запуском оконной системы «Икс» или на икс-терминале, следует запустить программу эмуляции алфавитно-цифрового терминала (например, поставляемую вместе с «Икс» «xterm»). Способ запуска зависит от конкретного оконного менеджера и/или графической среды, его следует узнать из документации или от администратора.
   Выдача подсказки означает, что оболочка готова принимать команды. Команда — это строка, которая будет принята к исполнению после того, как пользователь, введя ее, завершит ввод нажатием клавиши Enter.
   До того, как клавиша Enter нажата, команда принята не будет. Отменить набираемую команду до нажатия Enter можно, нажав Control-U. Современные оболочки (такие, как «bash») допускают редактирование командной строки до ее ввода. Если при наборе команды допущена ошибка и замечена до нажатия Enter, можно с помощью стрелок переместить курсор на нужное место, удалить ошибочный символ нажатием клавиш Del («удаление», удаление символа над курсором) или Backspace («забой», удаление клавиши слева от курсора) и вставить правильный символ.
   Простые команды состоят из одного слова. Возможно, простейшей (и одной из обязательных к заучиванию) является команда «exit». Эта команда приказывает оболочке немедленно завершиться (Рис. 1-2).
Рис. 1-2
   Таким образом Алиса завершила свой первый сеанс работы в системе, состоящий из одной команды выхода. Этой командой заканчивается любой сеанс работы в системе, хотя не всегда она подается в явном виде.
   Простая команда
   Простая команда — это строка, состоящая из:
   (необязательных) присвоений значений переменным окружения команды;
   (необязательного) имени команды;
   (необязательных и допустимых только после имени команды) аргументов команды.
   Эти три части команды разделяются промежутками, в качестве которых обычно выступает символ пробела[16]. Отдельные аргументы также разделяются промежутками. Промежутки в начале и конце строки игнорируются, так же, как и дополнительные промежутки (например, второй идущий подряд знак пробела).
   Выше мы уже познакомились с командой «exit», которая подавалась (вводилась) без аргументов. Вот еще две команды, которые могут подаваться без аргументов: «date», «cal». Обе они относятся к датам календаря.
   Команда «date» (Рис. 1-3) выводит текущую дату и время.
Рис. 1-3
   Команда «cal» выводит календарь (Рис. 1-4).
Рис. 1-4
   Поданная без аргументов, команда «cal» выводит календарь на текущий месяц. Однако она может вывести календарь и на другой месяц, а также на целый год (Рис. 1-5).
Рис. 1-5
   Как мы видим, вывод команды может существенным образом зависеть от аргументов. В данном случае смысл аргументов прозрачен: в первом примере ими были порядковый номер месяца и год, соответствующие месяцу, на который мы хотели получить календарь, а во втором — только год.
   Синтаксис (допустимые значения и, во многих случаях, порядок следования) аргументов зависит от конкретной команды, так же, как их семантика (смысл).
   Нарушение синтаксиса (синтаксическая ошибка оператора) влечет за собой сообщение об ошибке (Рис. 1-6).
Рис. 1-6
   Иногда оператор может ввести команду, корректную синтаксически, но не соответствующую задаче, то есть совершить семантическую ошибку. В следующем примере (Рис. 1-7) Алиса хотела получить календарь на апрель пятого года, но перепутала порядок следования аргументов.
Рис. 1-7
   Результатом выполнения команды стал вывод календаря за май 4 г. У программы, исполняющей команду, во многих случаях нет шанса «догадаться» о семантической ошибке. В данном случае Алиса, возможно, заметит свою ошибку, поскольку календарь предваряется названием месяца и года, но далеко не всегда ошибка будет такой очевидной[17].
   Ситуация, когда команда, допускающая передачу ей параметров, предполагает некоторые значения этих параметров, если они ей не переданы явно, достаточно типична. В этом случае говорят о поведении команды по умолчанию[18]. Например, команда cal по умолчанию выводит календарь на текущий месяц.
   Страницы руководства по простым командам
   Текущая версия стандарта на ОС описывает 176 команд. В различных системах их доступно от нескольких десятков до нескольких тысяч, и выучить детали синтаксиса и семантики каждой практически невозможно. Поэтому для систем, поддерживающих мобильность пользователей, стандартом предусмотрена выдача электронных страниц руководства по команде «man»[19]. Например, «man cal» должна вывести информацию, соответствующую приведенной для команды «cal» в Справочных материалах.
   В некоторых случаях названия сущностей, описанных в различных страницах руководства, совпадает. Например, названию «link» соответствует не только команда операционной системы, но и системный вызов (используемый программистами). В таком случае можно явно указать номер требуемого раздела. Команды ОС описаны в разделе 1, соответственно, получить страницу руководства по команде «link» можно командой «man 1 link»[20].
   В большинстве случаев вывод «man» не поместится на экране терминала. В этом случае вывод будет автоматически пропущен через так называемый фильтр постраничного вывода.
   Подобно текстовому редактору, фильтр постраничного вывода отображает текст на экране, позволяет «пролистывать» его вверх или вниз, но без возможности редактирования. В большинстве случаев в качестве фильтра будет выступать либо стандартная команда «more», либо команда «less». В любой из них прекратить отображение можно нажатием клавиши «q», пролистнуть текст на экран вперед — клавишей «f», на экран назад — «b».

1.5 Файлы и файловые структуры

   Создание и удаление файлов
   Именем файла в открытой ОС может быть любая строка поддерживаемых символов, не содержащая нулевого символа[21] и символа косой черты («/»), но рекомендуется ограничиться символами, входящими в переносимый набор символов имен файлов. Регистр (заглавность или строчность) букв является значимым.
Рис. 1-8
   Далее Алиса будет применять имена из символов, входящих в переносимый набор, а также кириллических букв, входящих в русский алфавит (Рис. 1.8).
   Создать файл можно командой «touch», указав ей в качестве аргумента имя несуществующего файла. До этого стоит удостовериться, что такого файла действительно не существует, с помощью команды «ls» (сокращение от английского «list» («перечислить»)), выводящей список файлов (если они существуют), имена которых перечислены в качестве ее аргументов (Рис. 1-9).
Рис. 1-9
   На Рис. 1-10 среди аргументов, указанных в командной строке, присутствует «-l» («эль»). Аргумент, начинающийся с дефиса, называется ключом команды. Большинство стандартных команд могут применяться с ключами, модифицирующими их действие. Аргумент, не являющийся ключом, называется операндом.
Рис. 1-10
   Ключ «-l» задает «длинный» формат вывода команды. Перед списком файлов выводится строка с количеством блоков (обычно 512-байтных), занимаемых перечисленными файлами. Файлу соответствует при этом строка-список из семи полей (они разделены символом табуляции, отображаемым при выводе на экран пробелом или серией пробелов), перечисленных в таблице на Рис. 1-11.
Рис. 1-11
   Поле «размер» — это размер или длина файла в байтах. Алиса лишь создала файл, но ничего не записала в него; такой файл имеет нулевую длину и называется пустым файлом.
   Тем не менее, у него есть все атрибуты файла, включая время последней модификации (в данном случае «последней модификацией» явилось само создание файла) и собственно имя.
   Удалить существующий файл можно командой «rm» с именем файла в качестве аргумента (Рис. 1-12).
Рис. 1-12
   Каталоги
   Если команда «ls» подается без операндов (т.е. если она подана без аргументов вообще или только с аргументами-ключами), результатом станет вывод списка имен всех файлов в текущем каталоге (Рис. 1-13).
Рис. 1-13
   Дело в том, что в виде файлов хранится вся информация в системе — все программы, данные, необходимые для их работы, данные пользователей (включая тексты, изображения, звук), и даже, как правило, само ядро ОС. В минималистической встроенной системе файлов может быть сотни, в типичной настольной системе — тысячи, на сервере, обслуживающем многих пользователей — десятки, сотни тысяч или даже миллионы.
   Файлы организуются в файловую структуру, задающую их логическое расположение. Файловая структура открытых ОС является иерархической: файлы содержатся в особых файлах — каталогах, каталоги, в свою очередь, могут содержаться в других каталогах и т.д. Вершиной файловой структуры служит каталог «/», называемый корневым каталогом файловой структуры.
   В открытых ОС логическая файловая структура независима от физического размещения файлов на дисках или других носителях. Соответствие физического носителя или его части (раздела жесткого диска) фрагменту файловой структуры системы устанавливается в ходе монтирования этого носителя.
   Несъемные носители (например, жесткие магнитные диски), как правило, монтируются в ходе загрузки ОС по предзаданному сценарию, а демонтируются, соответственно, в ходе разгрузки. Съемные носители должны монтироваться после их установки в привод и демонтироваться перед физическим снятием. Монтирование носителя — административная процедура, но на настольных машинах монтирование съемных носителей, как правило, делегируется пользователю, а некоторые современные ОС (в частности, «ГНУ/Линукс») позволяют его автоматизировать.
Рис. 1-14
   Файловую структуру можно представить в виде дерева с корнем в корневом каталоге и вершинами во вложенных каталогах. На рис. 1-14 пример такого дерева изображен в частично развернутом виде.
   Созданный Алисой файл «1й_файл», так же, как и каталог «tmp/», который выше Алиса наблюдала в выводе команды «ls», поданной без параметров, находятся в каталоге «alice/», который, в свою очередь, находится в каталоге «home/», находящемся в корневом каталоге файловой структуры. Знак «косая черта» («/», часто читается «слэш») завершает имя каталога при указании полного или относительного имени файла.
   В выводе команды «ls -l» файлы-каталоги отличаются от обычных файлов тем, что в первой позиции поля «тип файла и права доступа» стоит буква «d». Тип обычного файла обозначается символом дефиса («-»).
   Полное (или абсолютное) имя файла однозначно идентифицирует конкретный файл в системе. Краткое имя однозначно идентифицирует файл лишь в отдельном каталоге. В вышеприведенном примере каталоги «/bin/tmp/» и «/home/alice/tmp/» имеют совпадающие краткие имена, но различные пути к ним (путем называется часть полного имени, исключающая краткое имя); соответственно, различаются и их полные имена.
   Полное (абсолютное) имя в документации и литературе всегда указывается с ведущим слэшем (т.е. начинается с «/»); таким же образом его следует указывать и в качестве аргумента команд ОС.
   Ранее, когда Алиса знакомилась с командами «ls», «touch», «rm», она указывала имя файла «1й_файл» без ведущего слэша (и без указания каталога вообще). Такое именование называется относительным. При относительном указании имени файла путь к нему указывается относительно текущего каталога. Текущий (рабочий) каталог оболочки определен в каждый момент времени (при вводе каждой команды).
   При регистрации пользователя текущим становится домашний каталог пользователя, определенный администратором при создании учетной записи этого пользователя. Обычно домашние каталоги пользователей создаются в каталоге «/home/» с именами, совпадающими с регистрационными именами пользователей. Для пользовательницы Алисы, таким образом, домашним будет каталог «/home/alice/» (см. соответствующую вершину дерева файловой структуры, изображенной на рис. выше). Узнать свой домашний каталог пользователь может в любой момент, подав команду «echo ~» (описание команды «echo» см. в Справочных материалах).
   В простейшем случае относительное имя файла совпадает с его кратким именем. В примерах с командами «ls», «touch», «rm» выше все имена указывали на файлы в текущем каталоге, которым был домашний каталог Алисы (полное имя этого каталога «/home/alice/»), поэтому выводилась информация о файлах, создавался файл и удалялся файл в этом каталоге.
   Отдельный пользователь, в зависимости от цели, с которой он пользуется системой, может работать с десятками, сотнями, тысячами и более файлов. Держать их все в рабочем каталоге неудобно, поскольку пришлось бы придумывать и применять весьма сложные системы их именования. Разумнее рассредоточить их по каталогам, вложенным в свой рабочий каталог.
   Создать каталог можно, командой «mkdir», а удалить пустой (не содержащий файлов) каталог — командой «rmdir» («mkdir» — это сокращение от англ. словосочетания «make directory» («создать каталог»), а «rmdir» — от «remove directory» («удалить каталог»)) с именем каталога в качестве параметра (Рис. 1-15).
Рис. 1-15
   Сделать каталог текущим можно, командой «cd» (сокращение от англ. словосочетания «change directory» («сменить каталог»)) с именем каталога в качестве параметра (Рис. 1-16).
Рис. 1-16
   Обратите внимание, что, после того, как Алиса сменила текущий каталог, его краткое имя появилось в ее подсказке. В вашей системе это может быть и не так, но узнать полное имя текущего каталога можно в любой момент, подав команду «pwd» без параметров.
   Вместо «текущий каталог в настоящий момент соответствует такому-то» часто говорят «оболочка (или даже пользователь) находится в таком-то каталоге», а вместо «сменить текущий каталог на такой-то» — «перейти в такой-то каталог».
   Подавая команду перехода в каталог, Алиса использовала его относительное имя, совпадающее в данным случае с его кратким именем. Но она могла указать и его полное имя.
   Вернуться обратно (т.е. сменить текущий каталог снова на «/home/alice/») она может, указав его полное имя. На самом деле, есть способ проще. «Подняться» на одну ступень по иерархии каталогов можно, использовав специальное имя каталога «..», содержащееся в любом каталоге. Выше Алиса не видела его в списках файлов, выводившихся по команде «ls», поскольку это имя начинается с точки и, соответственно, файл является «скрытым». Увидеть имена скрытых (наряду с прочими) файлов можно командой «ls -a» (Рис. 1-17).
Рис. 1-17
   В данном случае «пустой» каталог содержит два файла-каталога «.» и «..», первый из которых является самим каталогом, в котором он содержится, а второй — каталогом на ступень выше в иерархии. Обратите внимание, что два ключа (например, «-a» и «-l») можно указать и в сокращенной форме — дефис и следующие за ним буквы ключей без пробела (в данном случае, «-al»).
   И, наконец, перейти в домашний каталог из любой вершины в файловой структуре можно командой «cd» без параметров.
   Копирование, перемещение, переименование файлов
   Командой «cp» можно скопировать файлы, командой «mv» — переименовать (переместить) их. Обе эти команды имеют два отличающихся по семантике варианта.
   1) Если последним операндом является имя существующего каталога, то файлы, имена которых указаны в качестве предшествующих операндов, копируются или перемещаются в этот каталог.
   2) Если последним операндом является имя обычного файла, то файл, имя которого указано в качестве предшествовавшего операнда, копируется или переименовывается в этот файл.
   Указание в этих командах единственного операнда, а также указание более двух операндов в случае, если последний из них не является именем существующего каталога — ошибка.
Рис. 1-18
   Приведенный на Рис. 1-18 пример демонстрирует действие команд «cp» и «mv».
   Чтобы избежать случайного удаления файлов в случае, если при копировании или перемещении файлов имена копируемых или переименовываемых файлов совпадают с именами существующих, можно использовать ключ «-i» (Рис. 1-19).
Рис. 1-19
   Генерация имен файлов
   В качестве операндов чаще всего выступают имена файлов, и во многих случаях операцию желательно выполнить не над одним, а над целым списком файлов. Стандартная оболочка реализует особый механизм для указания списков имен файлов, если эти имена формально-синтаксически схожи (начинаются с одной буквы, заканчиваются одним расширением и т.п.). Этот механизм называется «глоббингом», генерацией имен файлов или раскрытием метасимволов в именах. Он заимствован и многими альтернативными системами, но в отличие от большинства из них, в открытых системах раскрытие метасимвола осуществляется оболочкой, а не командой.