Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Операционные системы. Учебное пособие (лабораторный практикум)

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
/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