Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Операционные системы. Учебное пособие (лабораторный практикум)
.pdf
/etc/fstab – содержит информацию, необходимую для автомати-
ческого монтирования файловых систем;
/etc/passwd – различная регистрационная информация, включая
пароли;
/etc/profile – глобальный файл профилей – устанавливает пере-
менную $PATH и другие важнейшие переменные; заглянув в него,
вы увидите, что в нем вызываются все файлы из подкаталога
/etc/profile.d, в частности, файл, задающий параметры локализации
системы;
/etc/bashrc – глобальный файл конфигурации bash, устанавливает синонимы (алиасы) и функции, и т. п.;
/etc/issue – содержит сообщение, выдаваемое на терминал перед входом в систему (перед запросом имени и пароля); однако редактировать этот файл с целью изменения текста сообщения не
стоит, потому что сам он формируется инициализационным скриптом /etc/rc.d/rc.local;
/etc/motd – устанавливает сообщение, выдаваемое пользователю после входа в систему (после правильного ввода пароля);
Редактирование файла /etc/fstab. Файловая система – один из
важнейших общесистемных сервисов. Монтирование основных
файловых систем осуществляется на этапе загрузки системы. Другие (дополнительные) файловые системы монтируются командой
mount. Конфигурационным файлом для команды монтирования является файл /etc/fstab.
Одним из неудобств ОС Linux по сравнению с Windows является необходимость монтировать файловую систему при работе с
дискетами и вообще сменными накопителями (CD-ROM, Zip
фирмы Iomega и т. п.). Каждый раз при смене диска приходится заново монтировать и размонтировать файловую систему. Впрочем, и
для получения доступа к некоторым разделам жесткого диска тоже
необходимо выполнять команды монтирования, если только не заставить систему делать это автоматически, изменив соответствующим образом файл /etc/fstab.
Чтобы не повторять одинаковых действий при каждом перезапуске системы и сократить число необходимых символов, которые
приходится вводить с клавиатуры при выполнении операций монтирования, целесообразно выполнить следующее. Сначала создайте
точки монтирования (пустые каталоги) для каждого из устройств
или внешних файловых систем, которые вы будете периодически
81

подключать: гибкого диска, CD-ROM, ZIP-диска, сетевых дисков,
которые будут подключаться по NFS. Это можно сделать из
Midnight Commander или следующими командами:
[root]# cd /mnt
[root]# mkdir floppy; mkdir cdrom; mkdir win; mkdir zip; mkdir
server
Теперь отредактируйте файл /etc/fstab, добавив в него следующие строки, соответствующие тем устройствам, которые имеются в
вашей системе (то, что в файле было до вас, лучше не трогать):
/dev/fd0 /mnt/floppy vfat user,noauto 0 1
/dev/cdrom /mnt/cdrom iso9660 ro,user,noauto 1
/dev/sda4 /mnt/zip vfat user,noauto,exec 0 1
/dev/hda1 /mnt/win vfat user,noauto 0 1
server:/export /mnt/server nfs defaults
Если правильно настроен файл /etc/fstab, то обращение к гибкому диску или дискам CD-ROM осуществляется довольно просто.
В графической среде KDE чтобы смонтировать диск надо просто
щелкнуть правой кнопкой мыши по соответствующему значку и
выбрать в появившемся меню команду Монтировать.
Файлы и разделы подкачки. Выше уже было сказано, что в тех
случаях, когда системе Linux не хватает оперативной памяти, имеется возможность выгрузить часть исполняющихся (но временно
простаивающих) программ и их данных на жесткий диск. Это называется свопированием (swaping). В Linux существует два варианта
организации той области на диске, в которую осуществляется выгрузка данных из ОП: в виде файла подкачки (swap-файл); в виде
отдельного раздела диска (swap partition).
Второй способ несколько эффективнее, поскольку ядру не приходится выяснять через файловую систему, где находится файл
подкачки. Еще лучше, если раздел подкачки находится на отдельном жестком диске, ибо в таком случае меньше времени расходуется на перемещение считывающих головок. Файл подкачки создается с помощью команды dd:
[root]# dd if=/dev/zero of=/swapfile bs=1k count=size,
где size – размер файла подкачки в килобайтах. Некоторое время
назад значение параметра size должно было находиться в пределах
от 40 до 131 073 и, следовательно, размер файла подкачки мог быть
не более 133 890 048 байт (это чуть меньше 128 Мбайт). То же самое
ограничение действовало и для разделов подкачки. Отметим, что
82

для создания файла подкачки нельзя использовать команду cp, поскольку этот файл должен занимать непрерывную область на диске,
что не обеспечивается командой копирования.
После создания области подкачки (будь это хоть раздел, хоть
файл) на ней необходимо создать соответствующую файловую систему, что делается командой mkswap следующим образом:
[root]# mkswap –c swapfile [size]
или
[root]# mkswap –c /dev/hdb3
Опция –c обеспечивает проверку указанной области на наличие
плохих блоков. Если таковые обнаружены, сообщается их количество.
Linux использует страничную организацию памяти и области
подкачки. Размер страницы можно указать в команде mkswap, используя опцию –p. Типичные значения, указываемые после этой опции, 4096 и 8192. Надо сказать, что команда mkswap отказывается
работать с областями подкачки, размер которых менее 10 страниц,
чем и объясняется то, что размер файла подкачки должен быть не
менее 40 Кбайт.
Команда mkswap подготавливает область подкачки к использованию, но чтобы система могла ее использовать, необходимо эту
область инициализировать (эта операция аналогична монтированию обычных файловых систем). Инициализация выполняется с помощью команды swapon. Обычно это делается во время выполнения
инициализационного скрипта /etc/rc.d/rc.sysinit. Но если вы создали
файл подкачки после запуска ОС, надо выполнить эту команду отдельно. Команда swapoff производит демонтаж указанных областей
подкачки. Эта команда необходима для того, чтобы ядро могло
снова считать в память данные из области подкачки.
Запуск демонов. Запуск системных сервисов осуществляется
скриптом /etc/rc.d/rc, который вызывается с параметром, определяющим уровень запуска. В этом скрипте поочередно вызываются на
выполнение все программы и скрипты, ссылки на которые содержатся в особом каталоге /etc/rc.d/rcN.d, где N – номер уровня выполнения. Ссылки в каталоге /etc/rc.d/rcN.d имеют имена KNNname
и SNNname, где NN – порядковые номера, определяющие последовательность запуска скриптов, а name – имя соответствующей программы (это имя приводится, скорее всего, просто для удобства
пользователей, его отсутствие ничего бы не изменило). Скритп
83

/etc/rc.d/rc вначале последовательно (в порядке присвоенных номеров NN) вызывает программы, на которые ссылаются линки
KNNname. При этом программы вызываются с аргументом stop,
т. е. соответствующие службы останавливаются. Затем так же последовательно перебираются ссылки с именами SNNname и соответствующие программы вызываются с параметром start.
Давайте рассмотрим процесс запуска новой службы на примере
запуска Web-сервера Apache. Естественно, что вначале надо установить в системе соответствующий пакет. Находим на дистрибутивном диске или скачиваем из Интернета пакет (пусть это будет
apache-1.3.19-3.i586.rpm). Выполняем установку (для rpmоснованных систем):
[root]# rpm –Uhv apache-1.3.19-3.i586.rpm
При необходимости предварительно устанавливаем требующиеся дополнительные пакеты. После этого надо произвести все необходимые настройки сервера. Мы здесь не рассматриваем вопросы
настройки сервера Apache. Пока вы не закончили с его настройкой,
можно запускать сервер «вручную», чтобы проверить, как все работает. После того, как настройка сервера завершена, можно заняться
организацией его автоматической загрузки при запуске системы.
Для этого переходим в каталог /etc/rc.d/rcN.d и создаем там ссылку
на демон httpd:
[root]# ln –s /usr/sbin/httpd SNNapache
Значение NN для этой ссылки вы можете выбрать сами (в данном случае желательно запускать этот сервер после запуска других
служб, поэтому значение надо брать побольше, например, 98). После этого сервер Apache будет автоматически загружаться при
старте системы. Если потом вы захотите отказаться от его автоматического запуска, просто удалите ссылку SNNapache из каталога
/etc/rc.d/rcN.d.
Управление процессами. Первым делом научимся определять,
какие процессы в системе запущены. Для этого в Linux (как и во
всех UNIX-системах) имеется команда ps. Если ее запустить без
всяких параметров, то она выдает список процессов, запущенных в
текущей сессии. Если вы хотите увидеть список всех процессов, запущенных в системе, надо задать ту же команду с параметром -ax.
Значения, выводимые в большинстве этих полей вы поймете без дополнительных пояснений. В поле Статус процесса, как уже говорилось выше, могут стоять следующие значения:
84

R – выполнимый процесс, ожидающий только момента, когда
планировщик задач выделит ему очередной квант времени;
S – процесс «спит»;
D – процесс находится в состоянии подкачки на диске;
T – остановленный процесс;
Z – процесс-зомби.
Рядом с указателем статуса могут стоять дополнительные символы из следующего набора:
W – процесс не имеет резидентных страниц;
< – высокоприоритетный процесс;
N – низкоприоритетный процесс;
L – процесс имеет страницы, заблокированные в памяти.
Команда top. Команда ps позволяет сделать как бы «моментальный снимок» процессов, запущенных в системе. В отличие от
ps команда top отображает состояние процессов и их активность «в
реальном режиме времени». В верхней части окна отображается
астрономическое время, время, прошедшее с момента запуска системы, число пользователей в системе, число запущенных процессов и число процессов, находящихся в разных состояниях, данные
об использовании ЦПУ, памяти и свопа. А далее идет таблица, характеризующая отдельные процессы. Число строк, отображаемых в
этой таблице, определяется размером окна: сколько строк помещается, столько и выводится. Графы таблицы обозначены так же, как
поля вывода команды ps.
Содержимое окна обновляется каждые 5 секунд. Список процессов может быть отсортирован по используемому времени ЦПУ
(по умолчанию), по использованию памяти, по PID, по времени исполнения.
Приоритеты, значение nice и команда renice. Приоритет для
каждого процесса устанавливается в тот момент, когда процесс порождается. Приоритет процесса определяется так называемым «значением nice», которое лежит в пределах от +20 (наименьший приоритет, процесс выполняется только тогда, когда ничто другое не занимает процессор), до -20 (наивысший приоритет). Значение nice устанавливается для каждого процесса в момент порождения этого процесса и при обычном запуске команд или программ принимается равным приоритету родительского процесса. Но существует специальная команда nice, которая позволяет изменять значение nice при запуске программы. Формат использования этой программы:
85

nice [- adnice] command [args],
где adnice – значение (от –20 до +19), добавляемое к значению nice
процесса-родителя. Полученная сумма и будет значением nice для
запускаемого процесса. Отрицательные значения может устанавливать только суперпользователь. Если опция – adnice не задана, то по
умолчанию для процесса-потомка устанавливается значение nice,
увеличенное на 10 по сравнению со значением nice родительского
процесса.
Другая команда, renice, служит для изменения значения nice
для уже выполняющихся процессов. Ее формат таков:
renice priority [[-p] PID] [[-g] grp] [[-u] user]
Например, команда
[root]# renice -1 987 –u daemon –p 32
увеличивает на 1 приоритет процессов с PID 987 и 32, а также всех
процессов пользователя daemon.
Суперпользователь может изменить приоритет любого процесса
в системе. Другие пользователи могут изменять значение приоритета
только для тех процессов, для которых данный пользователь является владельцем. При этом обычный пользователь может только
уменьшить значение приоритета (увеличить значение nice), но не может увеличить приоритет, даже для возврата значения nice к значению, устанавливаемому по умолчанию. Поэтому процессы с низким
приоритетом не могут породить «высокоприоритетных детей».
Сигналы и команда kill. Сигналы – это средство, с помощью
которого процессам можно передать сообщения о некоторых событиях в системе. Сами процессы тоже могут генерировать сигналы, с
помощью которых они передают определенные сообщения ядру и
другим процессам. С помощью сигналов можно осуществлять такие
акции управления процессами, как приостановка процесса, запуск
приостановленного процесса, завершение работы процесса. Всего в
Linux существует 63 разных сигнала, их перечень можно посмотреть по команде
[user]$ kill –l
Сигналы принято обозначать номерами или символическими
именами. Все имена начинаются на SIG, но эту приставку иногда
опускают: например, сигнал с номером 1 обозначают или как
SIGHUP, или просто как HUP.
Когда процесс получает сигнал, то возможен один из двух вариантов развития событий. Если для данного сигнала определена
86

подпрограмма обработки, то вызывается эта подпрограмма. В противном случае ядро выполняет от имени процесса действие, определенное по умолчанию для данного сигнала. Вызов подпрограммы
обработки называется перехватом сигнала. Когда завершается выполнение подпрограммы обработки, процесс возобновляется с той
точки, где был получен сигнал.
Можно заставить процесс игнорировать или блокировать некоторые сигналы. Игнорируемый сигнал просто отбрасывается процессом и не оказывает на него никакого влияния. Блокированный
сигнал ставится в очередь на выдачу, но ядро не требует от процесса
никаких действий до разблокирования сигнала. После разблокирования сигнала программа его обработки вызывается только один
раз, даже если в течение периода блокировки данный сигнал поступал несколько раз.
Некоторые сигналы можно сгенерировать с помощью определенных комбинаций клавиш. Но такие комбинации существуют не
для всех сигналов. Зато имеется команда kill, которая позволяет послать заданному процессу любой сигнал. Как уже было сказано, с
помощью этой команды можно получить список всех возможных
сигналов, если указать опцию -l. Если после этой опции указать номер сигнала, то будет выдано его символическое имя, а если указать
имя, то получим соответствующий номер.
Для посылки сигнала процессу (или группе процессов) можно
воспользоваться командой kill в следующем формате:
[user]$ kill [-сигн] PID [PID..],
где сигн – это номер сигнала, причем если указание сигнала опущено, то посылается сигнал 15 (TERM – программное завершение
процесса). Чаще всего используется сигнал 9 (KILL), с помощью
которого суперпользователь может завершить любой процесс. Но
сигнал этот очень «грубый», если можно так выразиться, поэтому
его использование может привести к нарушению порядка в системе.
Поэтому в большинстве случаев рекомендуется использовать сигналы TERM или QUIT, которые завершают процесс более «мягко».
Естественно, что наиболее часто команду kill вынужден применять суперпользователь. Он должен использовать ее для уничтожения
процессов-зомби, зависших процессов (они показываются в листинге
команды ps как <exiting>), процессов, которые занимают слишком
много процессорного времени или слишком большой объем памяти и
т. д. Особый случай – процессы, запущенные злоумышленником.
87

Перевод процесса в фоновый режим. Если вы запускаете какой-то процесс путем запуска программы из командной строки, то
обычно процесс запускается, как говорят, «на переднем плане». Это
значит, что процесс «привязывается» к терминалу, с которого он запущен, воспринимая ввод с этого терминала и осуществляя на него
вывод. Но можно запустить процесс в фоновом режиме, когда он не
связан с терминалом. Для запуска процесса в фоновом режиме в
конце командной строки запуска программы добавляют символ &.
В оболочке bash имеются две встроенные команды, которые
служат для перевода процессов на передний план или возврата их в
фоновый режим. Но прежде, чем рассказывать об этих командах,
надо рассказать о команде jobs. Она всегда вызывается без аргументов и показывает задания, запущенные из текущего экземпляра
shell. В начале каждой строки вывода этой команды указывается порядковый номер задания в виде числа в квадратных скобках. После
номера указывается состояние процесса: stopped (остановлен),
running (выполняется) или suspended (приостановлен). В конце
строки указывается команда, которая исполняется данным процессом. Один из номеров выполняющихся заданий помечен знаком +,
а еще один – знаком -. Процесс, помеченный знаком +, будет по
умолчанию считаться аргументом команд fg или bg, если они вызываются без параметров. Процесс, помеченный знаком -, получит
знак +, если только завершится по какой-либо причине процесс, который был помечен знаком +.
А теперь можно рассказать и о командах fg и bg, которые служат для перевода процессов на передний план или возврата их в фоновый режим. В качестве аргумента обеим этим командам передаются номера тех заданий, которые присутствуют в выводе команды
jobs. Если аргументы отсутствуют, то подразумевается задание, помеченное знаком +. Команда fg переводит указанный в аргументе
процесс на передний план, а команда bg – переводит процесс в фоновый режим. Одной командой bg можно перевести в фоновый режим сразу несколько процессов, а вот возвращать их на передний
план необходимо по одному.
Команда nohup. Предположим, вы запустили из оболочки bash
несколько процессов, часть из них в фоновом режиме. И по какимто причинам завершили текущую сессию работы в оболочке. При
завершении сессии оболочка посылает всем порожденным ею процессам сигнал «отбой», по которому некоторые из порожденных ею
88

процессов могут завершиться, что не всегда желательно. Если вы
хотите запустить в фоновом режиме программу, которая должна
выполняться и после вашего выхода из оболочки, то ее нужно запускать с помощью утилиты nohup. Делается это так:
nohup команда &
Запускаемый таким образом процесс будет игнорировать посылаемые ему сигналы. Стандартный выходной поток и стандартный
поток ошибок при таком запуске команд перенаправляются в файл
nohup.out или $HOME/nohup.out.
Команда nohup имеет побочный эффект, заключающийся в
том, что значение nice для запускаемого процесса увеличивается на
5, т. е. процесс выполняется с более низким приоритетом.
Управление ресурсами. В этом разделе мы рассмотрим только
один аспект управления ресурсами: как сэкономить тот или иной
ресурс, точнее, как поступить в случае, если какого-то ресурса недостаточно. Основными ресурсами компьютера являются память и
дисковое пространство. Того и другого, как известно, всегда не хватает. Вопросы экономии оперативной памяти уже вкратце рассмотрены, поскольку мы уже рассмотрели вопросы управления процессами и swap-файлами. Так что осталось только рассмотреть вопрос
о том, как освободить место на жестком диске.
Сколько осталось места на диске? При установке новых пакетов
очень часто возникает одна проблема, хорошо знакомая всем пользователям компьютеров: недостаток дискового пространства. Поэтому
перед установкой нового пакета надо вначале ответить на вопрос о
том, достаточно ли места на диске для размещения данного ПО?
Программа rpm позволяет определить, сколько места потребуется для установки пакета: для этого надо дать запрос вида rpm -qpi
имя_пакета и в строке Size будет выдано, сколько байт займет пакет. Осталось узнать, есть ли столько свободного места на диске.
Для определения объема свободного пространства на диске вы
можете воспользоваться командой df. Если дать эту команду без аргументов, то она сообщит, каков объем дискового пространства во
всех смонтированных файловых системах, сколько используется и
сколько еще свободно. Единицей измерения при этом служит 1 килобайтный блок. Если вы хотите получить сведения об объеме свободного пространства в более привычных мегабайтах, дайте команду с параметром -h:
[user]$ df -h
89

Сведения о количестве свободного пространства на конкретном диске можно получить, если задать в качестве параметра имя
файла устройства:
[user]$ df -h /dev/hda2
Если вместо имени файла устройства указать полное (с указанием пути) имя произвольного файла или каталога, то вы получите
данные о количестве используемого и свободного места в файловой
системе, содержащей указанный файл (каталог).
Файлы (каталоги) удаляются в том случае, если они (размещенные в них файлы) вам более не нужны. Естественно, что кандидатами на удаление в первую очередь рассматриваются каталоги (или
файлы) самого большого объема, и тут оказывается полезной команда du (disc usage).
Команда du позволяет узнать, сколько места занимает конкретный файл или подкаталог. Для этого надо дать команду следующего
формата (в примере мы узнаем объем каталога /usr/lib)
[user]$ du -ks /usr/lib,
опция k указывает, что объем должен выдаваться в килобайтах. Опция s задана для того, чтобы выводился только суммарный объем
каталога. Если вы ее опустите, то получите данные об объеме каждого подкаталога и файла в указанном каталоге, а это очень много
информации. Впрочем, последней строкой все равно будет выведен
суммарный объем каталога.
Если маленькую s заменить на большую S, то выводиться будет
только информация об объеме подкаталогов (но не файлов), что иногда тоже полезно. О других опциях указанных команд вы можете
узнать на соответствующих man-страницах или по команде info.
Программные средства для конфигурирования системы. Как
вы уже, наверное, поняли, самый эффективный способ настройки
системы в целом и отдельных служб состоит в редактировании конфигурационных файлов. Однако для начинающего пользователя
этот метод не самый лучший, поскольку надо иметь достаточно
большой объем знаний по ОС LINUX, чтобы правильно отредактировать даже простейшие из этих файлов. К счастью, в состав современных дистрибутивов входит так называмая «панель управления»
или «центр управления», который позволяют сильно упростить
большинство задач по реконфигурации Linux.
Оборудование и материалы: см. приложение 1.
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
