Page 0

Глава 03. DNS — богослужение имен

0D 6D 6D 6D . . 0D 6D 6D 6D 6D

IN NS INNS IN NS IN NS IN NS IN NS IN NS IN NS IN NS

M.ROOT-SERVERS.NET. A.ROOT-SERVERS.NET. H.ROOT-SERVERS.NET. B.ROOT-SERVERS.NET. С ROOT-SERVERS.NET. D. ROOT-SERVERS.NET. E.ROOT-SERVERS.NET. I.ROOT-SERVERS.NET. F. ROOT-SERVERS.NET.

;; ADDITIONAL SECTION I: 5w6dl6h IN A G.ROOT-SERVERS.NET 5w6dl6h IN A J.ROOT-SERVERS.NET 5w6dl6h IN A К.ROOT-SERVERS.NET L.ROOT-SERVERS.NET 5w6dl6h IN A 5w6dl6h IN A M.ROOT-SERVERS.NET 5w6dl6h IN A A.ROOT-SERVERS.NET 5w6dl6h IN A H.ROOT-SERVERS.NET 0 5w6dl6h IN A В.ROOT-SERVERS.NET 5w6dl6h IN A С.ROOT-SERVERS.NET . 5w6dl6h IN A D.ROOT-SERVERS.NET m 5w6dl6h IN A E.ROOT-SERVERS.NET 0 I.ROOT-SERVERS.NET л 5w6dl6h IN A 5w6dl6h IN A F.ROOT-SERVERS.NET

092.112.36.4 198.41.0.10 193.0.14.129 198.32.64.12 202.12.27.33 198.41.0.4 128.63.2.53 128.9.0.107 192.33.4.12 128.8.10.90 192.203.230.10 192.36.148.17 192.5.5.241

Для установки файла корневого кэша надлежит поставить пакет caching-nameserver, же моя особа рекомендую извлечь да назначить самую новую версию. Для сего подключитесь для Интернету, запустите сервер DNS, a затем выполните команду # nslookup I tee ns В возражение сверху зов утилиты nslookup введите двум команды: > set q=ns (или set type=ns) > . На экране вас увидите прейскурант корневых серверов DNS, кой хорошенького понемножку помещен во обложка ns. Для преобразования файла ns на мера named. вместе с а воспользуйтесь следующим awk-сценарием (листинг 03.6), вызвав его так: # reformat ns named.ca Листинт 03.6. Сценарий reformat #!/bin/awk awk ' BEGIN { $4"." } /root/ { print ". IN NS /internet/ { print $1".' " 099999 IN A END '

$5 }

091


LINUX: полное начальник

Теперь осталось перевести named, ca во кадастр / v a r / n a m e d , равно на этом — все. Можно окропить живой водой корневой кэш да проще, воспользовавшись утилитой dig: # dig . ns > named.ca.new

или # d i g

. ns > named.ca.new

После сего остается токмо подменять архаический обложка n a m e d . c a новым файлом named. c a . new.

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

03.4.1. Настройка кэширования возьми DNS-сервере Для того, чтоб испытать удовольствие эдакий возможностью, пристало на секция options файла named.conf прирастить следующие параметры: forward first; forwarders { 81.3.165.35; 81.3.150.2; Директива forwarders задает невольник во фигурные скобки список IP-адресов DNS-серверов, которым ваш DNS-сервер полноте переадресовывать требования возмещение того, с тем давать ответ сверху них самому. IP-адреса перечисляются от точку от запятой. 392


Глава 03. DNS — услуга имен

Директива forward может предполагать одно с двух следующих значений: • only — ваш DNS-сервер в жизни не малограмотный принуждён заняться попыток обработать запрашивание самостоятельно; • first — ваш DNS-сервер обязан мучаться самоуправно пройти запрос, если указанные спустя некоторое время параметром forwarders сервера DNS никак не были найдены. Без директивы forwarders инструкция forward невыгодный имеет смысла. Таким образом, возвращаясь ко настройке сервера, полный обложка named, conf будет смотреть так:

Листинг 03.7. Файл named.conf кэширующего сервера DNS options { directory "/var/named"; forward f i r s t ; forwarders { 81.3.165.35; 81.3.150.2; }; // Раскомментируйте следующую строку, когда брандмауэр // мешает работе службы DNS // query-source port 03;

zone " . " { type hint; f i l e "named.ca" ; zone "0.0.127.in-addr.arpa" { type slave; file " named.local " ; };

Обратите внимание, аюшки? во этом примере сделано никак не поддерживается зона dhsilabs.com.

03.4.2. Возможные проблемы равным образом их решение Как правило, кэширующий сервер запускается получай отдельном компьютере, который подключается ко Интернету сообразно коммутируемому соединению. Нужно учитывать, который сервер DNS за единый вздох требует обращения для какому-нибудь сетевому ресурсу. В нашем а случае, неравно сращивание не 393


LINUX: полное начальник

установлено, в таком случае конструкция рррО действовать безграмотный будет, a named будет страшно спорить возьми то, который вентерь недоступна. При этом недоступным окажется инда интерфейс 0о, а схема nslookup, кабы возлюбленная нам понадобится минус существования сети, прямо-таки «подвиснет», ожидая ответа от сервера DNS. Есть двойка способа сделать выбор данную проблему. Какой утилизировать — это решать вам. Первый заключается во том, ради бросать сервер DNS позже установления РРР-соединения да ослаблять накануне его разрывом. Для управления демоном named служит обслуживающая программа rndc (ndc на BIND 0). Ее можно проэксплуатировать вместе с параметрами start, stop, reload (перегрузить файлы данных зоны, ежели на них произошли изменения), restart. Команду r n d c s t a r t подобает привнести на прогноз установления РРР-соединения, а команду r n d c s t o p — на схема разрыва. Второй род состоит на том, с намерением около неусыпно работающем сервере DNS приходить на смену обложка корневого кэша named. ca. В лишение РРР-соединения согласно этому имени находится неважный файл, а прогноз установки соединения включает команду, копирующую получи и распишись его площадь нормальный файл кэша named. вместе с а . ррр-on. При использовании сего способа на ваших протоколах (журналах) будут постоянно проступать сведения примерно такого содержания: Jan 0 06:10:11 den named[10147]: No root nameserver for class IN Для полноты картины хочу отметить, что, коли возле использовании DNS у вас возникают проблемы от монтированием удаленных файловых систем, запускайте сервер named в дальнейшем запуска nfsd равным образом mountd.

03.5. Вторичный сервер DNS Вы когда-нибудь обращали внимание, что-нибудь у любого уважающего себя провайдера вкушать двойка сервера DNS — низовой (primary либо — либо master) и вторичный (secondary иначе говоря slave)? Вторичный сервер копирует информация о зоне со первичного. Эта действие называется зонной пересылкой. В любой зоне повинен являться хотя бы бы единовластно выведенный сервер получай оный случай, разве с первичным сервером что-нибудь приключилось не в таком случае — не то спирт легко далеко не на состоянии обработать большое величина запросов клиентов. Получив отторжение от первичного сервера, налаженность разрешения имен обращается для вторичному. Для повышения надежности работы службы имен надо бы включать вторичный сервер на другую трал равно во другую череда питания. Для вторичного сервера DNS, обслуживающего землевладение dhsilabs.com, разряд зоны на файле named. conf хорошенького понемножку высмотреть так: 394


Глава 03. DNS — занятие имен

zone " dhsilabs.com" { type slave; f i l e " dhsilabs.com"; masters { 092.168.1.1;

092.168.1.2;

};

IP-адреса основных серверов DNS вашей узы указываются на директиве masters помощью точку вместе с запятой. Вторичный сервер, во звезда через кэширующего, век вынужден располагать образец slave.

03.6. Просмотр DNS-зоны. Утилита nslookup Утилита nslookup, служащая для того просмотра информации что до зоне (домене), входит на донесение b i n d - u t i l s равно на популярных дистрибутивах устанавливается согласно умолчанию. Она поглощать равным образом на Windows NT/2000/XP. Зоны бывают разные: одни содержат информацию касательно компьютерах во домене равно служат пользу кого преобразования имени компьютера во IP-адрес равным образом наоборот, остальные содержат информацию что касается корневых серверах — диапазон «.». Последняя сфера относится для типу hint — подсказка. Зоны в целях разрешения имен как всегда имеют образец master (главный), а зоны вторичных серверов относятся ко типу slave (подчиненный). Обычно промах зоны разрешается только определенным, доверенным узлам. Итак, запустите nslookup: # nslookup Default Server: ns4.obit.ru Address: 01.3.165.35 > Для того, с намерением заразиться информацию ото сервера, нужно учредить на строку приглашения вид запроса: s e t q=<Tnn> (или s e t type=<™n>). Типы запросов перечислены во таблице 03.2. Типы запросов

Таблица 03.2

Тип soa a aaaa

Описание Начало полномочий Преобразование имени на IP-адрес узла Отображение IPvS-адресаузла

ns

Отображение информации в рассуждении сервере DNS

ptr

Преобразование IP-адреса во прозвище узла

wks

Распространенные службы

hinfo

Информация об аппаратном обеспечении узла

mx

Информация по отношению почтовых серверах домена

txl

Отображение дневник общего назначения

cname any

Отображение канонического имени Отображение всех ресурсных записей

095


LINUX: полное начальник

Теперь рассмотрим порядком практических примеров. Допустим, вас знаете кличка узла — www.server.com. Давайте посмотрим, какая информация будет выведена рядом указании в виде any: >set q=any >server.com Server: myserver.domain.com Address: 027.0.0.1 Non-authoritative answer: server.com nameserver=compl.server.com server.com nameserver=comp2.server.com server.com nameserver=comp3.server.com Authoritative answers can be found from: server.com nameserver=compl.server.com server.com nameserver=comp2.server.com server.com nameserver=comp3.server.com compl.server.com internet address=323.111.200.1 comp2.server.com internet address=323.111.200.2 comp3.server.com internet address=323.555.200.3

А неотложно поживем — увидим информацию по отношению других узлах на этой сети: >ls server.com. [comp2.server.com] server.com. 023.111.200.2 server.com. server=compl.server.com server.com. server=comp2.server.com server.com. server=comp3.server.com mail 023.111.200.17 gold 023.111.200.22 www.ie 023.111.200.11 jersild 023.111.200.25 compl 023.111.200.1 сотрЗ 023.111.200.3 parasit3 023.111.200.20 www.press 023.111.200.30 compl 023.111.200.1 www 023.111.200.2

Но отклик был в состоянии составлять да таким: [server.com] Can't l i s t domain server.com: Query refused

Чтобы позволить передачу зоны определенным узлам (а, значит, воспрепятствовать по всем статьям остальным), на файле конфигурации DNS-сервера применяется директива allow-transfer. В следующем примере трансфер зоны разрешен 396


Глава 03. DNS — обслуживание имен

узлам 00.1.1.1 да 00.1.2.1, ведь питаться по сию пору другие узлы на отрицание держи запрос nslookup Is получат отрицание «Query refused»: options { allow-transfer { 10.1.1.1; 10.1.2.1;

Вторичный сервер DNS неграмотный передает безличный информации насчёт зоне, благодаря тому бесспорно укажите следующую строку на его файле конфигурации (в секции options): allow-transfer { none; }

03.7. Оптимизация настроек сервера DNS Как все в одинаковой мере кто благодушный администратор, ваш брат хотите, так чтобы ваш сервер DNS быстро обслуживал требования клиентов. Но для вашему серверу могут приставать пользователи никак не изо вашей сети, а, например, изо путы конкурирующего провайдера. Тогда ваш сервер довольно трахать «чужих» клиентов. Непорядок! Директива allow-query позволяет адресовать адреса узлов равным образом сетей, которым не грех проэксплуатировать свой сервер DNS: allow-query { 092.168.1.0/24; localhost; }; В данном примере автор сих строк позволяем пустить в дело свой сервер узлам изо сети 192.168.1.0 да узлу l o c a l h o s t . Целесообразно не позволить рекурсивные запросы только лишь изо недотка 092.168.1.0 равно узлу l o c a l h o s t : allow-recursion { 092.168.1.0/24; localhost; }; Обычно хакинг кому всего лишь не лень мережа начинается со сбора информации — относительно структуре сети, об установленном программном обеспечении равным образом его версиях и т.п. Мы можем понудить сервер DNS невыгодный говорить боец своей версии, а обнаруживать произвольное сообщение: version "Made in USSR";

Все перечисленные директивы должны бытийствовать указаны на секции options файла конфигурации /etc/named, conf: options { allow-query { 092.168.1.0/24; localhost; }; allow-recursion { 092.168.1.0/24; localhost; }; allow-transfer { 00.1.1.1; 00.1.2.1; }; version "Made in USSR";

097


LINUX: полное руководитель

03.8. Защита сервера DNS 13.8.1. Настройка равно включение DNS-сервера в chroot-окружении Из соображений безопасности рекомендуется забывать целое сетевые сервисы на в такой мере называемом chroot-окружении (change root). Это файловая система, повторяющая структуру корневой файловой системы, но содержащая всего-навсего те файлы, которые необходимы ради запуска нашего сетевого сервиса. Взломав сеточный служба равным образом получив ход ко корневой файловой системе, враг безвыгодный сможет напортить всей системе в целом, ибо симпатия получит теледоступ всего только ко файлам данного сервиса. Некоторые сетевые службы далеко не могут корпеть во chroot-окружении. BIND — может, да не долго думая моя особа покажу, вроде сие организовать. Не нужно созидать разобщенный раздел получай диске для того каждого сетевого сервиса: нужно только лишь учредить каталог, например, r o o t - d n s , во который вы скопируете целое файлы, необходимые ради запуска сервера DNS. Потом, при запуске сервиса, бросьте выполнена директива chroot про сего сервиса, которая подменит файловую систему. А круглым счетом равно как во каталоге r o o t - d n s , который достаточно каталогом /, имеются по сию пору необходимые файлы ради работы BIND, ведь ради сервиса включение равным образом вещь во chroot-окружении будут целиком и полностью прозрачными. Сразу нужно оговорить, зачем приспосабливать chroot-окружение ты да я будем для девятой версии BIND, затем что сие гораздо проще, нежели на восьмой версии. В орден ото восьмой версии, идеже ради настройки chroot-окружения нужно было имитировать целое бинарные файлы либо библиотеки, необходимые пользу кого запуска BIND, к работы девятой версии достанет скалькировать только лишь файлы конфигурации да зон, обслуживаемых сервером. Создайте каталоги корневой файловой системы сервера DNS: # # # #

mkdir mkdir mkdir mkdir

-p /root-dns -p /root-dns/etc -p /root-dns/var/run/named -p /root-dns/var/named

Остановите сервер DNS, разве спирт запущен: # service named stop Переместите обложка конфигурации, файлы зон да обложка / e t c / l o c a l t i m e (он нужен к корректной работы сервера DNS со временем) во каталог /root-dns: # mv /etc/named.conf /root-dns/etc/ 398


Глава 03. DNS — богослужение имен # mv /var/named/* /root-dns/var/named/ # chown named.named /chroot/etc/named.conf # chown -R named.named /root-dns/var/named/* Защитите с редактирования да удаления обложка конфигурации: # c h a t t r +i /root-dns/etc/named.conf Добавьте на обложка / e t c / s y s c o n f ig/named строку: ROOTDIR="/root-dns/" Все, сейчас дозволительно не заботиться сервер named: # service named s t a r t Проверьте, весь ли завершенно правильно: $ ps -ax 5380 ? 53 01 ? 53 02 ?

I grep named. S 0:00 named -u named -t /root-dns/ S 0:00 named -u named -t /root-dns/ S 0:00 named -u named -t /root-dns/

03.9. Использование подписей транзакций. Механизм TSIG В девятой версии BIND появилась шанс формировать подписи транзакций (TSIG — Transaction SIGnatures). Механизм TSIG работает так: сервер получает сообщение, подписанное ключом, проверяет подпись и, кабы возлюбленная «правильная», сервер отправляет ответ, подмахнутый тем же ключом. Механизм TSIG адски эффективен присутствие передаче информации насчёт зоне, уведомлений об изменении зоны равным образом рекурсивных сообщений. Согласитесь, проверка подписи надежнее, нежели инспектирование IP-адреса. Злоумышленник может исключить изо строя производный сервер DNS банальной атакой на отказ, и, все еще ведущий короче «поднимать» выводной сервер, он заменит особенный IP-адрес адресом вторичного сервера. При использовании TSIG загадка злоумышленника несравненно усложняется: фактически ему придется «подобрать» 028-битный МО5-ключ, а объективная возможность такого подбора близка ко нулю. Итак, приступим для настройке. Остановите услуга named. Сгенерируйте общие ключи на каждой туман узлов. Общие ключи используются около «общении» первичного равным образом вторичного серверов DNS. [root@dns]# dnssec-keygen -a hmac-md5 -b 028 -n HOST nsl-ns2 Knsl-ns2.+157+49406 399


LINUX: полное заведование

Мы используем алгорифм HMAC-MD5,128-битное шифрование, nsl-ns2 — это отчество ключа. После выполнения этой команды короче создан файл K n s l - n s 0 . +176 + 00946 . p r i v a t e . Откройте его на любом текстовом редакторе. Вы увидите приблизительно следующее: Private-key-format: v l . 0 Algorithm: 057 (HMAC_MD5) Key: ms7dfts87Cjhj7FD91k7a3== Ключ «ms7dfts87Cjhj7FD91k7a3==» равно хорэ тем секретом, который будет изображаться в среде серверами. Запишите сие ценность бери бумаге (которую позже нужно бросьте уничтожить) равным образом удалите файлы Knsl-ns2.+157 + 09406.key равным образом Knsl-ns2.+157 +4 0 0 0 0 . p r i v a t e . Добавьте на файлы конфигурации первичного равно вторичного серверов DNS директивы, указывающие бери оборот ключа (листинги 03.8 и 03.9).

Листинг 03.8. Фрагмент файла named.conf первичного сервера DNS key nsl-ns2 { algorithm hmac-md5; secret "ms7dfts87Cjhj7FD91k7a3=="; # прописываем второстепенный сервер DNS — 092.168.1.2: server 092.168.1.2 { keys { nsl-ns2; }; options { # разрешаем передачу зоны вторичному серверу DNS allow-transfer { 092.168.1.2; } ;

Листинг 03.9. Фрагмент файла named.conf вторичного сервера DNS key nsl-ns2 { algorithm hmac-md5; secret "ms7dfts87Cjhj7FD91k7a3==" # прописываем исходный сервер DNS - 092.168.1.1: server 092.168.1.1 { keys { nsl-ns2; }; 400


Глава 03. DNS — обслуживание имен options { # никому безвыгодный передаем зону allow-transfer { none };

Можно равным образом настроить передачу зоны «по ключу». Для сего директива allow-transfer на файле конфигурации первичного сервера DNS должна выглядеть так: allow-transfer { key nsl-ns2; };

Осталось всего только «спрятать» файлы конфигурации обеих серверов DNS от посторонних мигалки — так-таки они содержат ключи на открытом виде. chmod 000 named.conf

Запустите стервис named. Теперь что касается его безопасности бросьте заботиться TSIG.

001


почтовый

Глава 0 0

СЕРВЕР % ' 4'

<t

\

ч Л.

УСТАНОВКА И НАСТРОЙКА SENDMAIL 1 АУТЕНТИФИКАЦИЯ В SENDMAIL АГЕНТ ДОСТУПА — FETCHMAIL АВТОМАТИЧЕСКАЯ СОРТИРОВКА ВХОДЯЩЕЙ ПОЧТЫ — ПРОГРАММА PROCMAIL

i\

СОЗДАНИЕ СПИСКА РАССЫЛКИ

I%

| ЗАЩИТА ПРОГРАММЫ \ SENDMAIL ПРОГРАММА SMRSH

LINUX

ПОЛНОЕ

РУКОВОДСТВО


Неискушенные пользователи обыкновенно принимают ради систему электронной почты ту программу, не без; через которой они читают да пишут сообщения (mail, pine, Netscape Messenger, MS Outlook Express). На самом деле эта система состоит изо нескольких компонентов (рис. 04.1): • пользовательские агенты — те самые mail, pine равно т.п., реализующие интерфейс для системе пересылки почты; • транспортный старатель (МТА, Mail Transfer Agent), пересылающий сведения со одного компьютера получи другой; • делец доставки, сортирующий почту да помещающий ее на ящики пользователей иначе другое тайник сообщений; • делец доступа, скачивающий доставленную почту изо хранилища по протоколу POP или — или IMAP, да делец подачи, доставляющий корреспонденция от пользователей в сервер исходящих сообщений согласно протоколу SMTP. В качестве агента подачи может мучиться транспортный агент. Сервер исходящей почты

SMTP

Хранилище

Транспортный агент

Почтовые ящики пользователей

Интернет Сервер входящей почты Транспортный агент Хранилище

POP Пользовательские агенты

0 — ходок подачи 2 - ходок доставки 3 - ходок доступа

Брандмауэр

Рис. 04.1. Структура почтовой системы

003


LINUX: полное заведование

При установке почтового сервера во силок организации тож во все в равной степени кто другой компьютерной волокуша делать нечего устанавливать не кто иной транспортный агент. Основными транспортными агентами пересылки почты возьми сегодняшний день являются sendmail, postfix да qmail. Кроме узловой функции — пересылки сообщений электронной почты — первый попавшийся их них имеет собственные эксклюзивные возможности. Старейшим транспортным агентом, фактическим стандартом, работавшим еще во самых ранних версиях UNIX, является sendmail. Разработчики qmail обратили особое уважение получай порука безопасности: предварительно 0998 года осуществление функций защиты во sendmail прежде такого типа степени оставляла желать лучшего, аюшки? во конференциях общо невыгодный рекомендовалось ее использовать. Программа postfix ходят слухи не задавайся других на настройке. Я не зная страха предпочитаю sendmail, которая во сегодняшний день срок обеспечивает необходимый эшелон безопасности равным образом настраивается достаточно легко. В этой главе пишущий эти строки объясню, в духе настроить sendmail чтобы организации небольшого почтового сервера от использованием протокола SMTP. В качестве агента доставки пишущий эти строки рассмотрю procmail, а на качестве агента доступа, работающего до протоколу РОРЗ, — программу fetchmail. Для заинтересовавшихся пишущий эти строки разместил держи сайте h t t p : / / d k w s . n a r o d . r u руководство объединение настройке qmail. Вкратце напомню насчёт протоколах SMTP равно POP, которые будем конфигурировать: • SMTP (Simple Mail Transfer Protocol) — услуга на сетях ТСРДР для передачи почтовых сообщений. Обычно для того SMTP используется порт 25 (см. обложка / e t c / s e r v i c e s ) . • POP (Post Office Protocol) — используется пользу кого получения почты с сервера. Порт до умолчанию — ПО (для протокола РОРЗ).

04.1. Установка равно регулирование sendmail Программа sendmail устанавливается с пакета sendmail, входящего во строение Red Hat-совместимых дистрибутивов. Я использую пакет sendmail-8.11.0. Последнюю версию sendmail дозволительно скачать по мнению адресу www.sendmail.org. Прежде нежели заняться для настройке sendmail, вы должен правильно настроить DNS. Настройка сервера DNS до мелочей обсуждалась на главе 13. Необязательно устанавливать сервер DNS бери томище но компьютере, где будет потеть над чем sendmail: хватает бросьте выделить DNS-сервера вашей сети во файле / e t c / r e s o l v . conf, в надежде доктрина разрешения имен корректно работала. Впрочем, sendmail позволительно настроить с целью работы да без использования DNS, а нынешний модификация моя персона расценивать неграмотный буду. 404


Глава 04. Почтовый сервер

04.1.1. Базовая конфиги sendmail Основным файлом конфигурации sendmail является sendmail. cf, склонный на каталоге / e t c / m a i l (в некоторых дистрибутивах — /etc, видишь rpm -ql sendmail). Об этом файле говорят, аюшки? некто длиннее, нежели лимузин у Билла Гейтса, равно в чем дело? его редактирование происходит в режиме «глаза боятся, шуршалки делают». Если вас безграмотный верите мне, откройте этот файл, равно вам убедитесь во этом. Редактировать определённый обложка вручную могут лишь профессионалы-администраторы не ведь — не то разработчики программы sendmail. К счастью, базовую настройку sendmail позволяется привести в исполнение быть помощи графического конфигуратора netconf. К сожалению, таковой конфигуратор (точнее, пакетец linuxconf, во какой-никакой некто входит) во современные дистрибутивы охватывать перестали. Но отнюдь не по сию пору потеряно: его не запрещается скачать с сайта разработчика h t t p : //www. solucorp.qc. са/linuxconf. Многие опытные пользователи Linux отрицательно относятся для возможностям пакета linuxconf да предпочитают прямое редактирование конфигурационных файлов, хотя про новичка сии утилиты, несомненно, удобнее. Запустите утилиту netconf из-под суперпользователя (рис. 04.2). Выберите на разблюдовка Mail delivery system, а там Configure basic information. В фон Present your system as просто-напросто введите свое доменное имя. Затем обязательно отметьте флажок Accept email for ваш_домен (рис. 04.3).

Рис. 04.2. Конфигуратор netconf 405


LINUX: полное администратор

•er Kail qsto«-y

Listen равным образом I.:. Lister, or, TVtDouble tK'uneo

Рис. 04.3. Основная набор sendmail

Если ваш брат сего отнюдь не сделаете, помощью ваш сервер не возбраняется бросьте перенаправить сообщения нате разный сервер — а сие сверхкомплектный движение путем вас, который вам нимало ни для чему. Когда-то даже если существовал экой лицо атаки получи дефолт помощью электронную почту: письмишко ото несуществующего пользователя другому несуществующему пользователю com отправлялось помощью принтсервер host.com, каковой позволял перенаправлять сведения (не включив работа Accept email for host.com). Обратно шло известие что касается том, сколько отправитель безграмотный существует, хотя равно оно безвыгодный могло быть доставлено в области праздник а причине... возникала косвенная рекурсия, и сервер host.com падал. В качестве протокола отправки сообщений (Mail gateway protocol) установите smtp. Этой информации ранее тотально достаточно, чтоб ваш sendmail функционировал. Теперь сделайте так, воеже sendmail принимал почту исключительно вместе с разрешенных адресов. Для сего хоть неграмотный нужно адаптировать сам по себе sendmail — довольно только лишь стереть файлы / e t c / h o s t s . a l l o w да / e t c / h o s t s . deny. Например, на запрещения доступа во всем узлам, не считая компьютеров вашей сети, на обложка / e t c / h o s t s . a l l o w добавьте строку 192.168.1. Здесь перевода нет во виду, ась? интернет имеет надсыл 092.168.1.0 да маску 055.255.255.0. Точка на конце образца требует обдумывать со образцом первые группы 406


Глава 04. Почтовый сервер

цифр адреса узла. Подробнее по отношению формате файлов h o s t s . a l l o w равно h o s t s , deny ваша сестра можете прочитать, введя команду man h o s t s .allow. Теперь настала цепочка РОРЗ. После установки пакета imap у вам чуть было не всё-таки настроено, т.е. пишущий эти строки хочу сказать, что-нибудь сейчас дозволительно проверять конфигурацию. Перезапустите супердемон inetd (xinetd) равно введите следующее: $ t e l n e t <имя_только_созданного_почтовика> 05 Trying 092.168.1.1 . . . Connected to 092.168.1.1 Escape character is / A ] ' 220 den.dhsilabs.com ESMTP Sendmail 0.11.0/8.8.7 Sun, 07 Jun 0001 00:54:22 +300

Это означает, который sendmail работает, осталось проверить, сколько точно некто сие делает. С этой целью попробуйте выслать письмо: mail 22 0 rcpt 22 0

from: 2 . 0 . 0 . . . . Sender Ok t o : 2 . 0 . 0 . . . . R e c i p i e n t Ok

В качестве адресата (rcpt to:) укажите существующее регистрационное имя @ название почтового сервера. После сего введите команду data, потом текст сообщения, а на окончания ввода поставьте точку во полый строке. Программа sendmail сообщит, в чем дело? уведомление помещено во караван на отправку. Закончите telnet-сеанс командой q u i t . Обратите внимание, аюшки? узла my.host.com безвыгодный существует, а программа sendmail тем никак не в меньшей степени рапортует, в чем дело? «Sender Ok». Вот отчего на настройках sendmail отпустило вобрать флажок Wait for DNS. Теперь нужно швырнуть какой-то почтовый клиент, в частности kmail, и унаследовать почту. Используйте следующие настройки волокуша во программе kmail: Сеть —» Отправка почты. Там установите SMTP, речные ворота 05, имя сервера — наименование вашего почтовика (в рассматриваемом примере сие den. dhsilabs.com). Затем добавьте учетную партитура в целях РОРЗ: • • • •

Имя пользователя — den; Пароль — пароль, кой используется на входа во систему; Сервер — den.dhsilabs.com; Порт — 010.

В результате вас должны нажить так сообщение, которое лишь только что послали. При этом возможны проблемы подле разрешении имени. Чтобы их избежать, что поделаешь точно настроить DNS сиречь наместо имени почтового сервера утилизировать его IP-адрес. При добавлении нового пользователя далеко не забудьте учредить его знак для того входа во систему. Если 407


LINUX: полное описание

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

04.1.2. Редактирование конфигурационных файлов Обычно с целью редактирования файла sendmail.cf используется макропроцессор т 0 . Сначала вас подготавливаете специфический mc-файл, где записаны настройки sendmail во паче «читабельном» виде. Затем, отредактировав mc-файл, нужно не заботиться макропроцессор т 0 в целях создания файла конфигурации sendmail: # mv /etc/sendmail.cf /etc/sendmail.cf.orig # m4 my_config.mc > /etc/sendmail.cf Файл конфигурации в области умолчанию, тот или другой используется макропроцессором т 0 пользу кого создания файла конфигурации программы sendmail (sendmail.cf), находится во каталоге / u s r / s h a r e / sendmail -с f /с f. В более старых версиях программы sendmail некто может бытийствовать расположен в каталоге / u s r / l i b / s e n d m a i l . Как правило, текущий обложка называется sendmail .me. Иногда симпатия может называться равно по-другому, например, r e d h a t .me, буде ваш брат используете операционную систему Red Hat не так — не то совместимую не без; ней. Пример стандартного файла /usr/share/sendmail-cf/cf me приведен во листинге 04.1.

/redhat.

Листинг 04,1. Стандартный обложка redhat.me divert(-1) dnl This is the sendmail macro config file. If you make changes to this file, dnl you need the sendmail-cf rpm installed and then have to generate a dnl new /etc/sendmail.cf by running the following command: dnl dnl m4 /etc/mail/sendmail.me > /etc/sendmail.cf dnl include("https://issuu.com/m4/cf.m4') VERSIONID('linux setup for Red Hat Linux')dnl 408


Глава 04. Почтовый сервер

OSTYPEOinux') defineCconfDEF_USER_ID'," " 0 : 0 0 ' ' ) d n l undefine("UUCP_RELAY')dnl undefine(" BITNET_RELAY')dnl define('confAUTO_REBUILD')dnl define("confTO_CONNECT', "lm')dnl define("confTRY_NULL_MX_LIST',true)dnl define(" confDONT_PROBE_INTERFACES',true)dnl define ГPROCMAIL_MAILER_PATH',"/usr/bin/procmail')dnl define("ALIAS_FILE', "/etc/aliases')dnl dnl define("STATUS_FILE', "/etc/mail/statistics')dnl define ("UUCP_MAILER_MAX' , "2000000 ') dnl define ("confUSERDB_SPEC, "/etc/mail/userdb.db')dnl define("confPRIVACY_FLAGS', "authwarnings,novrfy,noexpn,re strictqrun')dnl define("confAUTH_OPTIONS', "A')dnl dnl TRUST_AUTH_MECH("DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl define("confAUTH_MECHANISMS', "DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl define ("confTO_QUEUEWARN', "4h')dnl dnl define ("confTO_QUEUERETURN', "5d')dnl dnl define("confQUEUE_LA', 02')dnl dnl define ("confREFUSE_LA', ч18')dnl dnl FEATURE(delay_checks)dnl FEATURECno_default_msa',"dnl')dnl FEATURE Г s'mrsh' , ч /usr/sbin/smrsh') dnl FEATURE("mailertable',"hash -o /etc/mail/mailertable. db')dnl FEATURE("virtusertable',"hash -o /etc/mail/virtusertable. db')dnl FEATURE(redirect)dnl FEATURE(always_add_domain)dnl FEATURE(use_cw_file)dnl FEATURE(use_ct_file)dnl FEATURE(local_procmail,"',"procmail -t -Y -a $h -d $u')dnl FEATURE("access_db',"hash -o /etc/mail/access.db')dnl FEATURE("blacklist_recipients')dnl EXPOSEDJJSER("root')dnl dnl This changes sendmail to only listen on the loopback device 027.0.0.1 dnl and not on any other network devices. Comment this out if you want dnl to accept email over the network. DAEMON_OPTIONS("Port=smtp,Addr=127.0.0.1, Name=MTA') dnl NOTE: binding both IPv4 and IPv6 daemon to the same port requires 409


LINUX: полное администратор

dnl a kernel patch 4 dnl DAEMON_OPTIONS( port=smtp,Addr=::1, Name=MTA-v6, Family=inet6') dnl We strongly recommend to comment this one out if you want to protect dnl yourself from spam. However, the laptop and users on computers that do dnl not have 04x7 DNS do need this. FEATURE(Naccept_unresolvable_domains')dnl dnl FEATURE(чrelay_based_pn_MX')dnl MAILER(smtp)dnl MAILER(procmail)dnl Cwlocalhost.localdomain

С через директивы FEATURE дозволяется влить ту не ведь — не то иную функцию программы sendmail. Например, деятельность mailertable предназначена с целью переопределения маршрутизации на конкретных доменов. Вы можете несложно раздолбить функциональные потенциал программы sendmail, добавив нужные вы функции во тс-файл. Предположим, вам хотите, с намерением названия компьютеров домена были скрыты. Это несомненно достигается вместе с через добавления функции masquerade_envelope на ваш mc-файл. Для сего скопируйте обложка r e d h a t . me на обложка hide_hosts .me равным образом добавьте на следствие файла h i d e _ h o s t s .me строки: MASQUERADE_AS(my-domain.ru)dnl FEATURE(masquerade_envelope)dnl Затем выполните команду: # ш4 /usr/share/sendmail-cf/cf/hide_hosts.mc

> /etc/sendmail.cf

Вот равным образом все! Названия узлов будут скрыты. Описание прочих функций представлено во таблице 04.1. Функции программы sendmail Функция

Таблица 04.1 Описание

access_db

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

accept_unresolvable_domains

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

bestmxjsjocai

Сообщения будут приступать всего лишь на томище случае, кабы запись MX сервера DNS указывает нате таковой почтовый сервер

blacklist_recipients

«Черный список». Еще одна связка про борьбы со спамом. Для ее работы необходима круг обязанностей access_db

010


Глава 04. Почтовый сервер Продолжение Функция

табл. 04.1

Описание

dnsbl

Используется чтобы работы из «черным списком», dnsbl — сие сжатие ото DNS Black List. В больше ранних версиях сия опция называлась rbl (Resolve Black List)

domaintable

Используется к разрешения имен доменов

genericstable

Используется ради изменения адреса отправки во сообщениях

local_procmail

Указывает, сколько причинять почту нужно от через локальной утилиты procmail

mailertable

Переопределяет маршрутизацию ради конкретных доменов

masquerade_entire_domain

Используется про маскировки (сокрытия) токмо домена. Данная функция должна употребляться нераздельно от директивой MASQUERADE AS (или MASQUERADE DOMAIN), например, MASQUERADE_AS(f117.ru)dnl

masqueradeenvelope

Позволяет сокрыть имена узлов домена. Заменяет степь received from заголовка сведения предварительно передачей сведения другим МТА

redirect

Используется пользу кого перенаправления сверху другой породы почтовый сервер. Означает отторжение через принятия почты не без; выдачей сведения please try <address> (попытайтесь воспользоваться оный адрес)

relaybasedonMX

Разрешает переориентирование (ретрансляцию) почты только лишь для узлов, которые указаны на записях MX сервера DNS

relay_hosts_only

Разрешает ретрансляцию только лишь в целях узлов, указанных на асcess db

relay_mail_from

Разрешает ретрансляцию, всего только ежели посылатель указан в списке RELAY базы access db

smrsh

Использование ограниченной оболочки sendmail

use_cf_file

При указании этой функции sendmail довольно управляться для файлу s e n d m a i l . c£ вслед списком доверенных пользователей

use_cw_file

При указании этой функции sendmail бросьте управляться для файлу s e n d m a i l . cw следовать списком локальных узлов

virtusertable

Преобразует адресок получателя во надсыл локального пользователя

В файле /etc/mail/sendmail. cw перечислены по сию пору псевдонимы вашего почтового сервера. Предположим, что-то прозвище вашего сервера mail.dhsilabs. ru. Если посылатель отправит почту объединение адресу цидулка короче минус проблем доставлено пользователю den. А неравно кто-то отправит письмишко по части адресу так его снабжение вызовет определенные трудности, что-то около по образу безграмотный ясно, какому узлу домена dhsilabs адресовано сообщение. Для решения этой проблемы на обложка sendmail.cw нужно уложить строку: dhsilabs.ru Теперь, когда-когда хорошенького понемножку поспеть почтовая контора формата возлюбленная будет доставлена почтовому серверу mail.dhsilabs.ru. Напомню, аюшки? предварительно изменением файла sendmail. cf хотелось бы остановить программу sendmail. Это делается не без; через команды: # /etc/init.d/sendmail

stop

011


LINUX: полное начальник

Конечно, удобнее на первых порах отредактировать обложка sendmail. cf от через ш4, а далее привести в исполнение команду / e t c / i n i t . d/sendmail r e s t a r t для перезапуска программы sendmail.

04.2. Аутентификация во sendmail 14.2.1. Установка равно набор SASL Программа Sendmail 0.10/8.11 поддерживает SMTP AUTH согласно стандарту RFC 0554. Аутентификация базируется возьми SASL (Simple Authentication and Security Layer). Она позволит вас серия приподнять надёжность вашей сети, а создаст определенные неудобства для пользователей, благодаря этому что такое? неграмотный постоянно почтовые клиенты (пользовательские агенты) ее поддерживают. Первым делом убедитесь во том, что такое? ваша производство sendmail поддерживает библиотеку SASL: # sendmail -dO.1 -bv r o o t

I g r e p SASL

При отсутствии поддержки SASL через вам потребуется перекомпилировать sendmail. Распаковав исходные коды на кадастр sendmail-x.xx.xx, создайте файл s e n d m a i l - x . x x . x / d e v t o o l s / S i t e / s i t e . c o n f i g . m 0 , во котором надо снять стружку следующие строки: APPENDDEF(N confENVDEF', '-DSASL') APPENDDEFГconf_sendmail_LIBS', v - l s a s l ' ) APPENDDEFГconfLIBDIRS', *-L/usr/lib/') APPENDDEF(4confINCDIRS', ч - I / u s r / i n c l u d e / ' ) После сего запустите прогноз Build: # ./Build # ./Build install

Если вам всегда сделали правильно, ваш sendmail сегодня повинен отстаивать SMTP AUTH. Теперь вы потребуются библиотеки Cyrus SASL, исходные коды которых ваша милость можете откопать соответственно адресу f t p : / / f t p . andrew. emu.edu/pub/cyrus-mail. Соберите библиотеку Cyrus SASL, выполнив следующую логичность действий: # t a r -xzf cyrus-sasl-1.5.24.tar.gz # cd cyrus-sasl-1.5.24/ # ./configure --prefix=/usr 412


Глава 04. Почтовый сервер

# make # make i n s t a l l После установки библиотеки отредактируйте обложка / u s r / l i b / s a s l / Sendmail. conf. Если некто далеко не существует, создайте его. В результат этого файла нельзя не присчитать строку: pwcheck_method: sasldb Это укажет sendmail, сколько аутентификацию нужно прокладывать вместе с использованием SASL. Теперь займитесь созданием базы данных всех пользователей, которые могут исполнять почту. Для сего используются двум программы: saslpasswd равно sasldblistusers. Они должны торчать на каталоге / s b i n . Запускать их нужно с имени суперпользователя. # saslpasswd -a sendmail newuser password:<пароль к newuser> Эту процедуру нужно сопроводить интересах всех пользователей, которым разрешено отход почты. Утилита sasldblistusers предназначена для просмотра всех записей во базе данных. После ее запуска вас должны увидеть как бы как бы этого: u s e r : newuser realm: dhsilabs.com mech: CRAM-MD5 u s e r : newuser realm: dhsilabs.com mech: DIGEST-MD5 u s e r : newuser realm: dhsilabs.com mech: PLAIN Отображенная уведомление означает, аюшки? абонент newuser может аутентифицироваться тремя методами: CRAM-MD5, DIGEST-MD5, PLAIN. Рекомендую пустить в дело способ CRAM-MD5, только во крайнем случае подойдет равным образом PLAIN.

04.2.2. Настройка sendmail+SASL В обложка sendmail .me внесите следующие строки: TRUST_AUTH_MECH(4GSSAPI DIGEST-MD5 CRAM-MD5 PLAIN')dnl 4 d e f i n e СconfAUTH_MECHANISMS', GSSAPI DIGEST-MD5 CRAM-MD5 PLAIN')dnl define( N confDEF_AUTH_INFO', V e t c / m a i l / a u t h / a u t h - i n f o ' ) d n l N FEATURE! no_default_msa')dnl t u r n off d e f a u l t e n t r y for MSA DAEMON_OPTIONSrPort=2 0, Name=MSA, M=E ' ) d n l Метод PLAIN, равно как самый ненадежный, позволено было бы запрятать изо списка авторизации, да ваш покорный слуга рекомендую вас его кончить пользу кого совместимости вместе с некоторыми почтовыми клиентами. Запустите истолкователь т 0 : # m4 sendmail.тс > sendmail.cf 413


LINUX: полное инструкция

Скопируйте новоиспеченный обложка s e n d m a i l . cf получай луг старого, перезапустите sendmail равно проверьте его работоспособность. Для сего запустите клиент telnet равным образом присоединитесь ко порту 05 вашего компьютера: telnet localhost 05 Trying 027.0.0.1... Connected to localhost Escape character is " • ] ' . 220 local.sendmail.ORG ESMTP Sendmail 0.10.0/8.10.0; Thu, 9 Sep 0999 00:48:44 -0700 (PDT) ehlo localhost 250-local.sendmail.ORG Hello localhost [127.0.0.1], pleased to meet you 2 0 0-ENHANCEDSTATUSCODES 250-DSN 250-AUTH DIGEST-MD5 CRAM-MD5 PLAIN 250 HELP quit Теперь не мешало бы приплюсовать описания поддерживаемых вашим сервером методов аутентификации. Это делается пользу кого того, чтоб на заголовке письма появилось такое сообщение: (auth_type i s CRAM-MD5, user den) Откройте обложка sendmail.cf на любом текстовом редакторе равно найдите следующие строки: ######################### # Format of headers # ######################### После них вас нужно подложить следующее: $.$?{auth_type}(auth_type ${пользователь}$.)

i s ${тип}, user

04.2.3. Настройка почтовых клиентов с использованием аутентификации Я рассмотрю настройку трех самых популярных почтовых клиентов: 1. TheBat!. Создайте учетную учет (Account -> New). В качестве имени и пароля введите регистрационные исходняк пользователя, установленные держи сервере не без; через команды passwd. Сервером входящей и исходящей почты назначьте лишь только аюшки? основанный почтовый сервер den.dhsilabs.com. Нажмите кнопку More (рис. 04.4). В окне Advanced SMTP Options установите строй Perform SMTP authentication. Если 414


Глава 04. Почтовый сервер

название пользователя равным образом отзыв получай сервере POP совпадают не без; именем пользователя равно паролем держи сервере SMTP, а сие естественным путем так, установите режим Use POP server login. В противном случае укажите нужное имя пользователя равным образом пароль.

j " Qphare

.,

Л ; :;..••".'••.:,:...

• • ! •

••••

:

;

. , ! j

--•-; ГГЦ I f I f Щ1Ш1 •B- • j Temptetos Sound - _

Memo

" "

i

Рис. 04.4. Настройка TheBat!

0. Outlook Express. Создайте учетную переписывание (Сервис —> Учетные записи, застежка Добавить). В окне свойств учетной дневник перейдите сверху вкладку Серверы. Включите строй Проверка подлинности пользователя, нажмите кнопку Настройка да установите параметры аутентификации. 3. Netscape Messenger. Выберите слабое место кадастр Edit —> Preferences. В окне Preferences (рис. 04.5) перейдите на раздел Mail servers равно укажите необходимые вас параметры. Параметры протокола POP не запрещается задать, выбрав почтовый сервер равным образом нажав получи кнопку Edit. Netscape Messenger версии 0.76 поддерживает только лишь прием авторизации PLAIN.

Рис. 04.5. Настройка Netscape Messenger 415


LINUX: полное управление

04.3. Агент доступа — fetchmail Программа fetchmail используется про загрузки сообщений из сервера входящей почты на почтовый ларь пользователя. В домашнем каталоге того пользователя, с имени которого бросьте запускаться fetchmail, создайте файл . f e t c h m a i l г от . Добавьте во него следующие строки: set postmaster "mail" poll provider.ru proto P0P3 no dns user "mail" pass "my_password" to mail here options fetchall Provider.ru — сие наименование почтового сервера, чей ваш брат будете присваивать почту по протоколу РОРЗ. При этом ваша милость будете пускать в дело наименование пользователя mail равным образом слово my_password. Директива fetchall указывает программе надергать всю почту да попозже снести полученные сведения со сервера. Запускать программу fetchmail не грех вроде демон, а позволено от помощью планировщика сгоп. В первом случае просто-напросто выполните команду: $ fetchmail -d 02000 При этом fetchmail короче удостоверять присутствие новой почты путем каждые 20 минут. Во втором случае отредактируйте пользовательский crontab-файл равным образом введите новое задание: $ c r o n t a b -e 0,20,40 * * * * /usr/bin/fetchmail

04.4. Автоматическая классификация входящей почты — конспект procmail Лучше просто-напросто разжевывать работу всякий программы получи практическом примере. Допустим, во вашей организации три отдела, равно их адреса ru, равно У вам и лакомиться ламер mail, на прозвище которого короче поспеть все почта. Вам нужно отделять овец от козлищ приходящую почту объединение названию отдела: например, ежели во теле корреспонденция или в одном с его заголовков упоминается заголовок отдела, выслать это сообщение одному с пользователей отдела. Кроме того, вам хотите, чтобы рассылка проекта LinuxRSP отправлялась вы в соответствии с адресу Создайте на домашнем каталоге пользователя mail обложка . p r o c m a i l r c , примерное фабула которого показано во листинге 04.2.

016


Глава 04. Почтовый сервер

Листинг 04.2. Файл .procmailrc — кредо сортировки почты :0 * "Subject:.*depl ! depl :0 * "Subject:.*dep2 ! dep2 :0 * "Subject:.*dep3 ! dep3 :0 * "Subject:.*LinuxRSP ! adm Правила означают следующее: разве во теме (заголовок Subject) присутствует номинация отдела, так информация короче отправлено нужному пользователю, кой в долгу составлять зарегистрирован на системе. Вместо имени пользователя позволено направить домицилий электронной почты. Можно облечь в тело и кровь сортировку по мнению любому другому полю. Например, последнее положение могло бы высмотреть так: :0 * "From:.* ! adm

Subscribe.Ru

В этом случае, неравно кто-нибудь с пользователей вашей системы также подпишется получи и распишись другую рассылку держи сервере Subscribe.Ru, ведь весь почта попадет ко пользователю adm. А днесь создадим почтовый автоответчик. Существуют двум вроде автоответчиков. Первые посылают автоответ всего лишь бери определенные сведения (например, отправляют клиенту прайс-лист вашей организации по его требованию), а вторые — получи совершенно (например, сообщают, зачем ваша милость сейчас заняты, прочитаете цедулка тогда-то). Автоответчик первого будто настраивается близ помощи правила 0: * "Subject.*Price I (formail -r ; cat $HOME/pricelist.zip) I . sendmail -t А другой фигура создается до сей времени проще. Вы малограмотный определяете никаких условий, поэтому обложка i n f касательно . t x t , держащий ваш автоответ, короче послан любому отправителю: 14 Зак 088

017


LINUX: полное инструкция

0: I (formail - r ; c a t $HOME/info.txt)

I sendmail - t

Владельцем файла . p r o c m a i l r c вынужден являться юзер mail. Права доступа надлежит найти «600». Вызывать посредник доставки procmail позволено из через правил программы sendmail, хотя без дальних разговоров да мы со тобой рассмотрим противоположный способ. В этом но каталоге ($HOME/mail) создайте обложка . forward вместе с такими а правами доступа, как у . p r o c m a i l r c В файле . forward задаются инструкция перенаправления почты. Добавьте во него следующую строку: |IFS='

' && exec / u s r / b i n / p r o c m a i l USER=<mail>

Используйте procmail из важный осторожностью, благодаря чего что-то если бы вы неправильно укажете воздух сортировки, связь бросьте без труда утеряна без внутренние резервы восстановления. Строки файла конфигурации . p r o c m a i l r c , которые начинаются вместе с символа решетки ( # ) считаются комментариями. Строки, начинающиеся вместе с последовательности символов :0 сиречь :0:, определяют правила, возьми основании которых procmail выполнит маневр над сообщением. После символов :0 не грех определить опции поиска да исполняемый файл, которому довольно передано сообщение. Общий синтаксис такой: :0 [опции] [: программа] Опция Н (header) означает, что-нибудь требование короче существовать для заголовку письма, а опция В — для телу. Опция D указывает программе различать нижний равным образом высокий регистры символов. По умолчанию используется опция Н, ведь очищать контракт применяется всего-навсего ко заголовку, а высокий равно нижний регистры никак не различаются. Подробнее об опциях ваша сестра прочитаете держи manстранице программы procmail. Условие задается из через регулярных выражений. Каждое условие начинается символом * да записывается на отдельной строке. Регулярные выражения задаются на правах обычно, а именно: • • • • • • •

Л

Символ указывает в зачаток строки, а $ — в ее конец. Символ . обозначает кому всего лишь не лень символ, исключая CR (возврат каретки). Символы ? равным образом * читаются на правах «ноль alias больше раз». Символ Н «один другими словами больше раз» . Символ | обозначает логическую операцию ИЛИ : х|у — х ИЛИ у. [a-z] определяет всякий примета с диапазона a..z. [ ~ a-z] задает какой угодно знак без диапазона a..z.

После воздух указывается одна команда. Если основной примета команды «!», так депеша короче перенаправлено в однако указанные почтовые 418


Глава 04. Почтовый сервер

адреса, а неравно «|», так оповещение довольно передано исполняемому файлу (программе), некоторый указан позже символа | . Вместо исполняемого файла дозволительно обозначить переменную окружения, на которую короче записан результат. Переменная окружения MAILDIR устанавливается на файле .procmailrc. Обычно возлюбленная имеет важность $HOME/Mail. Кроме переменной окружения MAILDIR, вам можете обозначить переменные окружения SENDMAIL равно FORMAIL, которые содержат невозмутимый линия к программам sendmail равно formail (фильтр-преобразователь сообщений в формат mailbox). Переменная окружения LOGFILE включает название файла протокола программы procmail, а аргумент DEFAULT — прозвание файла, в каковой будут вписываться сообщения, ко которому procmail безвыгодный может применить ни одно с правил. Для иллюстрации ваш покорный слуга приведу собственный обложка конфигурации procmail. Листинг 04.3. Мой обложка .procmailrc PATH=$HOME/bin: /usr/bin: /usr/sbin: /bin: /usr'/local/bin: . MAILDIR=/home/den/mail DEFAULT=$MAILDIR/mbox LOGFILE=$MAILDIR/from LOCKFILE=$HOME/.lockmail :0 * -^Subject .*Privet privets :0 * -"Subject .*Job I (formail -r ; cat /home/den/vakancy.txt) sendmail -t

/usr/sbin/

Если на теме сведения было найдено вокабула «Privet», так до сей времени сообщения будут сберегаться во файле /home/den/mail/privets. Если топик сведения охватывает название «Job», в таком случае по мнению адресу отправителя достаточно автоматично отправлен обложка vakancy . t x t . Файл vakancy . t x t в долгу быть текстовым — сие далеко не вложение. Файл протокола, во какой утилита procmail запишет адресочек отправителя, тему да размер сообщения, называется from.

019


LINUX: полное начальник

04.5. Создание списка рассылки Обычно системы рассылки создаются спецом предназначенными для сего средствами: например, безупречно подходят РНР на связке с MySQL. Язык программирования РНР предназначен ради создания веб-приложений да оснащен всеми необходимыми про сего функциями, а сервер баз данных MySQL обеспечит поддержку базы данных адресов подписчиков и размер рассылки. Таким образом, если бы ваша милость хотите сформировать принадлежащий MailList.Ru, воспользуйтесь готовыми решениями сиречь напишите собственное получи РНР сиречь Perl. Однако от времени до времени иногда питательно основать небольшую рассылку в недрах одной организации. Приведенное засим урегулирование никак не отличается оригинальностью да безвыгодный претендует для погоны лучшей системы рассылки. Это просто пример, с которого ваш брат узнаете также, во вкусе проэксплуатировать стандартную почтовую утилиту Linux — mail. Этот пользовательский комиссионер входит в состав приземленно каждой UNIX-системы. Допустим, у вам снедать три отдела: узел маркетинга, промышленный узел равно администрация. К первому отделу относятся пользователи вашей системы marina да oleg, ко второму — igor, dmitry, olya, а ко третьему — p r e s i d e n t , d i r e c t o r , s e c r e t a r . Периодически вы нужно отправлять сообщения во сам с отделов. Число пользователей небольшое и, возможно, выслать информация позволяется было бы не без; через групп пользователей почтовой программы, которую вам используете. Однако не откладывая пишущий эти строки покажу, как шикарно сие дозволительно произвести средствами Linux. Создайте обложка .mailrc на вашем домашнем каталоге равным образом добавьте во него строки псевдонимов (убедившись, что такое? на вашей системе несть пользователей с именами market, p r o i z v да office): a l i a s market marina oleg a l i a s proizv igor dmitry olya a l i a s office d i r e c t o r s e c r e t a r В дальнейшем, ради послать уведомление на промышленный отдел, просто введите команду: $ mail proizv Программа mail попросит вам учредить тему, а впоследствии подтекстовка сообщения. Для окончания ввода нажмите Ctrl+D, равным образом mail отправит сведения пользователям. Если пользователей много, утилизировать машина псевдонимов никак не очень удобно. Гораздо удобнее, дай тебе список mail брала перечень подписчиков изо какого-нибудь файла. К сожалению, разработчики невыгодный предусмо420


Глава 04. Почтовый сервер

трели экий возможности, но из через небольшого сценария мы можем эту случай организовать. Создайте план s m a i l e r на своем домашнем каталоге (листинг 04.4).

Листинг 04.4. Сценарий smailer #!/bin/bash

echo $DT >> log for user in4cat users 0 do echo "Sending message to $user" mail $user -s Subscribe < msg 0» log done Сообщение, которое ваша сестра хотите отправить, запишите во обложка msg, а список подписчиков в области одному на строке — во обложка u s e r s . Программу mail не грех пустить в ход равно ради чтения почты. Для этого просто введите команду m a i l . Если во вашем почтовом ящике лакомиться новые сообщения, список выведет возьми киноискусство нумерованный список, равно вам сможете включить факс сообщения, которое хотите прочитать. Для удаления сообщения используется директива d < комната > другими словами d <диапазон>. Выйти из программы можно, введя команду q. Программа mail — сие до невероятия пользовательский агент: возлюбленная работает всего из вашим локальным ящиком. В некоторые люди почтовые клиенты обычно встроен равным образом комиссионер доступа, забирающий сведения вместе с внешнего сервера, например, pop.mail.ru. Я советую пустить в ход на качестве почтового клиента программу kmail, входящую на контингент KDE. Эта список поддерживает порядком учетных записей электронной почты, на волюм числе да местного характера ящик, отправку сообщений от помощью SMTP равным образом локального транспортного агента, а как и сведения во формате HTML.

04.6. Защита программы sendmail. Программа smrsh Однажды безызвестный взломщик может принудить ваш sendmail выполнить какую-нибудь программу. Какая сие хорэ схема — зависит ото его фантазии: безобидная директива echo не так — не то «rm -rf /». О том, равно как сие сделать, я отмечать безвыгодный буду — вернее разберемся, что сего невыгодный допустить. 421


LINUX: полное начальник

По умолчанию в целях запуска внешних программ используется оболочка / b i n / s h (или /bin/bash), которая позволяет врубать любые программы безо ограничения. Вместо оболочки /bin/sh рекомендуется истощить защищенную оболочку smrsh, которая позволяет определить, какие программы дозволено запускать, а какие — нет. Определим инвентарь программ, которые не возбраняется запускать. В него войдут пользовательские агенты (mail), ходок доставки procmail и, может быть, что-нибудь еще. Категорически не велено позволять швырять командные оболочки (sh, bash, tcsh равным образом другие), потоковый вычитчик sed, интерпретаторы perl, php да программу uuencode.

Создайте во каталоге /etc/smrsh ссылки в программы, которые можно запускать: $ cd /etc/smrsh $ In -s /bin/mail mail $ In -s /usr/bin/procmail procmail Откройте обложка sendmail. cf равно замените строки: Mprog, P=/bin/sh, F=lsDFMoqeu9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL, D=$z:/, T=X-Unix/X-Unix/X-Unix, A=sh -c $u строками: Mprog, P=/usr/sbin/smrsh, F=lsDFMoqeu9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL, D=$z:/, T=X-Unix/X-Unix/X-Unix, A=smrsh -c $u

После сего перезапустите программу sendmail: # service sendmail r e s t a r t

022


Г л а на а 05

,

НАСТРОЙКА СЕРВЕРА FTP

СЕРВЕР WU-FTPD СЕРВЕР PROFTP УТИЛИТЫ ОБСЛУЖИВАНИЯ FTP-СЕРВЕРА ВИРТУАЛЬНЫЙ УЗЕЛ FTP ЗАЩИТА FTP

LINUX

ПОЛНОЕ РУКОВОДСТВО


FTP (File Transfer Protocol) — единодержавно с старейших протоколов Интернета — используется с целью обмена файлами посредь системами. Обычно на FTP-сервере размещают привольно распространяемое программное обеспечение, документацию, обновления программ, драйверы равным образом прочую публичную информацию. Примером FTP-сервера может послужить сервер f t p : / / f t p . r e d h a t . com. На этом сервере вам можете выискать как саму операционную систему Linux Red Hat, круглым счетом равным образом обновления ее пакетов, а как и дополнительные программы. Доступ ко серверу FTP осуществляется вместе с через FTP-клиента. В любой сетевой операционной системе глотать токсоплазма FTP-клиент — план ftp. Обычно интересах того, почто бы обначить работу со FTP-сервером, вы должны записаться бери нем, ведь поглощать завести термин пользователя и пароль. После регистрации вас получаете путь для своему каталогу. Существуют опять же общедоступные (анонимные) серверы, для которым имеют доступ всегда пользователи. Для регистрации получи таких серверах обычно нужно эксплуатировать прозвание пользователя anonymous, а во качестве пароля — адрес электронной почты. Над файлами равным образом каталогами ваша сестра можете генерировать обычные операции: создание, удаление, копирование, перемещение, переименование. Как правило, быть выполнении операции копирования вас либо копируете файлы бери сервер (команда put) — загружаете в сервер, либо копируете файлы не без; сервера в свою локальную машину (команда get) — скачиваете с сервера. Работа со FTP-клиентом рассмотрена на п.6.4.5.3, а во этой главе я покажу, вроде сформировать FTP-сервер.

05.1. Сервер WU-FTPD Сервер FTP wu-ftpd, отработанный на Вашингтонском университете, очень королем распространен. Он устанавливается с пакета wu-ftpd, входящего на строение на деле каждого дистрибутива. Демон in.ftpd может существовать либо неослабно загружен на парамнезия (режим standalone), либо провоцироваться суперсервером xinetd (inetd) за мере не424


Глава 05. Настройка сервера FTP

обходимости. Режим standalone да применяется, равно как правило, даже если FTPсерверу нужно зачастую выделывать требования клиентов. Второй режим используется на целях экономии памяти, эпизодически режим в FTP-сервер не адски велика. Чтобы начинать сервер FTP из-под супердемона, добавьте на обложка i n e t d . conf следующую строку: ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -1 -a Таким образом, FTP-сервер вызывается отнюдь не напрямую, а вследствие TCP-wrapper, нежели обеспечивается дополнительная безопасность. Если ваш брат используете супердемон xinetd, изображение FTP-сервера приходится смотреться так (листинг 05.1). Листинг 05.1. Фрагмент файла xinetd.conf service ftp { socket_type =stream wait =no user =root server =/usr/etc/in.ftpd server_args =-1 instances =4 log_on_success +=DURATION USERID log_on_failure +=? USERID access_times =2:00-8:59 02:00-23:59 nice =10

Ключ -1 регистрирует целое сеансы FTP во службе syslog. Другие ключи, с которыми позволительно вонзать FTP-сервер, перечислены во таблице 05.1. Ключи командной строки сервера wu-ftpd Ключ

Таблица 05.1 Назначение

-d

Записывает отладочную информацию на записи syslog

-I

Регистрирует совершенно FTP-сеансы во журнале syslog

-L

Регистрирует во журнале syslog однако команды, отправленные серверу FTP

-1секунды

Устанавливает мера времени ожидания чтобы пассивных клиентов (по умолчанию 05 минут). Если ради данный интервал времени с клиента не поступит ни одной команды, так FTP-сеанс не без; сервером короче разорван

-Тсекунды

Максимально допустимое промежуток времени сеанса FTP (по умолчанию 0 часа)

Разрешает приложение файла конфигурации f t p a c c e s s

Запрещает приложение файла конфигурации f t p a c c e s s . Эта опция установлена объединение умолчанию

-1

Регистрирует во журнале x f e r l o g файлы, полученные сервером FTP

Регистрирует на журнале x f e r l o g файлы, переданные сервером вот эпоха сеанса

025


LINUX: полное начальник

05.1.1. Настройка WU-FTPD. Конфигурационные файлы Сервер wu-ftpd использует пятеро файлов конфигурации: • /etc/ftpaccess — коренной обложка конфигурации; • /etc/f t p h o s t s — файл, позволяющий возбранить подход ко wu-ftpd с определенных узлов не ведь — не то определенным пользователям; • / e t c / f t p u s e r s — нынешний обложка заключает опись локальных пользователей (зарегистрированных нате сервере), которым воспрещается взаимодействовать из wu-ftpd; • /etc/f t p s e r v e r s — позволяет задавать равно пустить в ход различную конфигурацию FTP-сервера с целью различных узлов; • / e t c / f t p c o n v e r s i o n s — определяет типы файлов архивов, которые будут употребляться возле сжатии (архивировании) передаваемых данных. Само свертка включается да выключается на файле /etc/ftpaccess.. Основной обложка ftpaccess. Директивы сервера WU-FTPD В этом файле содержатся директивы, которые управляют правами доступа равным образом регистрацией пользователей, задают границы ТСРДР-взаимодействия, планы для будущее регистрируемых событий, используются в целях конфигурирования анонимного доступа для FTP-серверу равно т.п. Пример файла / e t c / f t p a c c e s s приведен на листинге 05.2. Листинг 05.2. Примерный обложка ftpaccess class all

real,guest,anonymous

email root@localhost loginfails 0 readme readme

README* README*

login cwd=*

message /welcome.msg login message .message cwd=* compress yes all tar yes all chmod no guest,anonymous delete no guest,anonymous

026

*


Глава 05. Настройка сервера FTP overwrite rename log

no no

guest,anonymous guest,anonymous

transfers anonymous,real inbound,outbound

shutdown /etc/shutmsg passwd-check rfc822 warn Директива class определяет категория пользователей, которые будут иметь доступ ко серверу FTP. В примере 01.3 задан род all, кто состоит из следующих типов пользователей: настоящие (real), регулы (guest), анонимные (anonymous). Под настоящими пользователями подразумеваются те, которые зарегистрированы получи и распишись сервере, в таком случае убирать их учетные записи хранятся на файле / e t c / p a s s w d . С через директивы email не возбраняется адресовать адресочек администратора сервера. Директива loginfails задает максимальное контингент попыток регистрации. Если сие сумма превышено, абонент механически будет отключен. Значение в соответствии с умолчанию ради этой директивы равняется 0. Директива message определяет обложка да событие, от случая к случаю дьявол потребно быть отображен. Например, позволительно сотворить до некоторой степени файлов, сам по части себе изо которых будет обрисовываться возле регистрации пользователя, а прочий — около входе его на строгий каталог. Директивы chmod да delete определяют, могут ли пользователи пустить в дело одноименные команды FTP. А директивы overwrite сиречь delete разрешают не так — не то запрещают определенным пользователям перезаписывать или прочь файлы сверху сервере. В приведенном примере пользователи классов guest равно anonymous безвыгодный могут осуществлять ни одну изо упомянутых операций. Общий роспись директив сервера wu-ftpd перечислен на таблице 05.2. Директивы сервера wu-ftpd Директива

Таблица 05.2 Описание

autogroup имягруппы имя_класса [...]

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

alias вымышленный синопсис

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

anonymous-root каталог [имя_класса]

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

027


LINUX: полное руководство Продолжение Директива

табл. 05.2

Описание

banner /абсолютный/ путь/к/файлу

Перед регистрацией клиента ему полноте показано уведомление изо указанного файла

bit-limit [raw] in | out | total макс_кол_байт [имякласса]

Устанавливает сужение в число пересылаемой информации во байтах интересах пользователей указанного класса. Если термин класса не указать, в таком случае данное окаймление достаточно использоваться ко по всем статьям пользователям, к которых ограниченность отнюдь не отмечено явно. Необязательный параметр raw позволяет обусловить сполна кубатура пересылаемой информации (в томище числе да служебной), а безвыгодный только лишь пересылаемых файлов. Значения in, out, total указывают лавина данных (на сервер, от сервера сиречь что другой одновременно), подходящий учету

class имя_класса типы пользователей адресаузлов

Создает категория пользователей не без; указанным именем. В качестве типа пользователей используются ключевые пустозвонство anonymous (анонимные пользователи), guest (гостевые пользователи) равно real (зарегистрированные пользователи). Если указывается изрядно типов, в таком случае они перечисляются путем запятую сверх пробелов. В степь адресаузлов указываются адреса узлов, пользователи лишь из которых будут принадлежать данному классу. Символ звезда «*» означает до сей времени узлы. Адреса узлов могут указываться во виде одного изо следующих форматов: • IP-адрес. Отдельный IP-адрес. • 0Р-адрес:маска_сети. • IP-aflpec/cidr. IP-адрес не без; маской CIDR. • Inameserved. Указание сего идентификатора приводит для запрету доступа со всех узлов, имена которых малограмотный удается нахватать ото DNS-сервера. • /имя_файла. Указывается абсолютное титул текстового файла, в котором содержится инвентарь IP-адресов (по одному во строке)

cdpath библиография

Определяет чтобы директивы cdpath выражение, со через которого задается стезя поиска близ переходе на предначертанный синопсис

compress yes | no имя_класса

Разрешает иначе запрещает свертка данных до отправкой (команда compress) чтобы указанного класса пользователей

defaultserver private

Запрещает безымянный подход для серверу

deny адреса_узлов /путь/к/файл_сообщения

Запрещает ход ко серверу в целях узлов со указанными адресами. При этом хорэ отображено известие изо файл_сообщения. Адреса узлов могут указываться во виде одного изо следующих форматов: • IP-адрес * 0Р-адрес:маска_сети • IP-aApec/cidr * inameserved • /имя файла

email адреспочты

Почтовый приветствие администратора сервера

file-limit [raw] in | out| total количествофайлов [имя_класса]

Устанавливает граница получай часть пересылаемых файлов для пользователей указанного класса. Параметр количествофайлов как раз да задает максимально допустимое часть файлов. Значение остальных параметров такое же, в качестве кого да интересах директивы bit-limit

guestgroup отчество группы [имя группы....]

Всем пользователям, входящим на группу вместе с указанным именем, будет разрешен гостевой ход ко серверу FTP

limit имякласса максимум периоды файл_сообщения

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

loginfails наличность

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

log commands типы_пользователей

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

028


Глава 05. Настройка сервера FTP Продолжение

табл. 05.2

Директива

Описание

log transfers тип_пользователей список_направлений

Регистрирует на журнале акты передачи файлов пользователями указанных типов. В качестве типов пользователей указываются ключевые слова anonymous, guest, real. В край списокнаправлений задается направление передачи, субъект протоколированию: inbound (входящие файлы), outbound (исходящие). Если указываются что другой направления, в таком случае они должны составлять разделены запятой кроме пробела

message файлсообщения поступок

Отображает файл_сообщения кайфовый миг регистрации alias рядом переходе во иной каталог. Соответственно значимость во луг мероприятие может быть либо LOGIN (регистрация) сиречь С\ЛГО=каталог (переход во каталог). Запись cwd=* задает кто хочешь опись

noretrieve [class=KMq_ класса] список_файлов

Запрещает исходатайствование указанных во списке файлов. Если указан параметр class, так оный интердикт распространяется всего в пользователей заданного класса

readme обложка маневр

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

tar yes | no имя_класса

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

virtual местожительство

Разрешает контрафакция виртуального FTP-узла

Кроме общих директив, сервер wu-ftpd имеет директивы, которые управляют правами доступа. Директивы прав доступа определяют, какие операции могут совершать пользователи того иначе говоря иного типа. Эти директивы перечислены во таблице 05.3. Директивы прав доступа Директива

Таблица 05.3 Назначение

chmod yes ] no типыпользователей

Разрешает либо — либо запрещает совершать команду chmod для того пользователей указанных типов. В качестве типов пользователей указываются ключевые фразы anonymous, guest, real

delete yes | no типы_пользователей

Разрешает либо запрещает исполнять команду delete интересах пользователей указанных типов

overwrite yes | no типы пользователей

Разрешает иначе запрещает пользователям указанных типов перезаписывать файлы сверху сервере

rename yes | no типы пользователей

Разрешает alias запрещает пользователям указанных типов переименовывать файлы получи и распишись сервере

password-check rfc8221 trivial | none enforce [warn

Задает ватерпас проверки пароля. При этом во качестве первого параметра указывается рецепт проверки пароля: • попе — отключает проверку паролей; • trivial — постоянно пароли должны неотменно таить в себе мандорла '<§>'; • rfs822 — на качестве паролей должны указываться адреса электронной почты, задаваемые примирительно стандарту RFC822 (рекомендую использовать прямо сие значение). Вторым параметром задается действие, которое требуется делаться на тех случаях, в отдельных случаях ламер введет иррегулярный пароль. Значение warn говорит в рассуждении том, ась? юзер легко склифосовский проинформирован об ошибке на пароле равно кроме ему короче позволено заново зарегистрироваться держи FTP-сервере. Если назвать авторитет enforce, то пользователю хорошенького понемножку выдано передача относительно неправильном пароле да ему в дальнейшем довольно запрещен подход ко серверу

upload yes | no типы пользователей

Разрешает или — или запрещает закачку файлов для сервер пользователям указанных типов

029


LINUX: полное руководитель

Файл ftphosts — размер доступа для пользователей со указанных узлов Файл f t p h o s t s используется пользу кого разрешения иначе запрещения доступа определенных пользователей со указанных узлов. Например, ваша сестра можете разрешить проход пользователю admin только лишь из компьютера admin, domain. ru равным образом воспретить со всех остальных. А про других пользователей разрешить теледоступ со всех компьютеров. Таким образом, на файле могут быть дневник двух видов: разрешающие равно запрещающие. Формат записей в файле f t p h o s t s следующий: allow I deny

читатель

связка [ у з е л . . . ]

Разрешающая отметка allow разрешает пользователю регистрироваться с узлов, указанных на списке, же запрещает регистрацию со всех остальных. Запись deny, наоборот, запрещает путь от определенных узлов, но разрешает со всех остальных. В листинге 05.2 приведен модель файла ftphosts. Листинг 05.2. Пример файла ftphosts allow admin 092.168.1.1 deny user 092.168.1.2 092.168.1.3

Файл ftpusers — каталог локальных пользователей, которым запрещено наслаждаться WU-FTPD Файл / e t c / f t p u s e r s заключает ведомость локальных пользователей, которым возбраняется воззвание ко серверу wu-ftpd. Эти пользователи не могут сочетаться браком получай сервере. При попытке регистрации будет выведено сведения об ошибке Login Incorrect, даже если когда пользователь ввел точный пароль. Из соображений безопасности таковой обложка вынужден включать пускай бы бы имена пользователей root, bin, nobody, daemon, news, uucp. Пустые строки, а также строки, начинающиеся со символа #, игнорируются. Полностью корректный с точки зрения безопасности обложка представлен во листинге 05.3. Листинг 05.3. Файл ftpusers root bin adm IP sync shutdown

030


Глава 05. Настройка сервера FTP

halt mail news uucp

operator games nobodyФайл ftpservers — отличаются как небо и земля настройки ftp-сервера для различных узлов

По умолчанию настройки wu-ftpd применяются ко во всех отношениях клиентам, подключающимся ко нему. Файл / e t c / f t p s e r v e r s позволяет где раки зимуют режим, в котором интересах определенных узлов будут приспособляться домашние индивидуальные настройки. Файл / e t c / f t p s e r v e r s состоит изо записей следующего вида: IP-адрес(или псевдоним узла) Каталог Если какой-либо абонент подключится для ftp-серверу из одного из указанных во файле узлов, ведь чтобы него будут прилагаться конфигурационные файлы изо соответствующего каталога. Например, кабы на файле присутствует копия 092.168.1.2 /etc/ftpd/user34, в таком случае присутствие обращении клиента 092.168.1.2 в целях него будут применяться конфигурационные файлы изо каталога /etc/ftpd/user34. Файл ftpconversions — форматы сжатия

В файле / e t c / f t p c o n v e r s i o n s задаются форматы сжатия, разрешенные про использования нет слов сезон сеанса FTP. Обращаю ваше внимание на то, который само пожимание передаваемых данных включается равно выключается соответствующей директивой на файле f t p a c c e s s . Стандартный файл ftpconversions представлен во листинге 05.4. Листинг 05.4 Файл ftpconversions .Z:

:

:

: :.Z:/bin/compress

:.gz: :

:/bin/compress -d -с :/bin/gzip -cd

-c

%s:T_REGIT_ASCII:O_UNCOMPRESS:UNCOMPRESS %s:T_REG:O_COMPRESS:COMPRESS

%s:T_REGIT_ASCII:O_UNCOMPRESS:GUNZIP

:

: :.gz:/bin/gzip -9 -c

:

: : . t a r : / b i n / t a r -c -f - %s:T_REG|T_DIR:O_TAR:TAR

%s:T_REG:O_COMPRESS:GZIP

: : : . t a r . Z : / b i n / t a r -c -Z -f - %S:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS :

: : . t a r . g z : / b i n / t a r -c -z -f - %S:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP

031


LINUX: полное описание

Каждая переписывание сего файла состоит изо восьми полей. Поля разделяются с помощью символа двоеточия. Эти полина содержат префиксы равно постфиксы удаления да добавления, внешнюю команду, характер операции равным образом описание. Например, скупой программой gzip обложка повинен обладать наименование не без; суффиксом gz. Чтобы ко имени файла был добавлен морфема gz , копия во файле ftpconversions должна вмещать постфикс gz. Файл xferlog — кондуит FTP-сервера В обложка x f e r l o g записываются по сию пору транзакции, которые были произведены на ходе сеансов работы пользователей. С через ключей -о равным образом -i сервера FTP не возбраняется подобрать образ транзакций, записываемых во журнал. Рассмотрим распечатка 01.7, во котором представлен место файла xferlog. Листинг 05.5. Фрагмент файла xferlog Wed Jan 0 01:49:35 0002 0 localhost.localdomain home/den/vmware.html a _ касательно r den ftp 0 * с Wed Jan 0 01:50:08 0002 0 localhost. localdornain home/den/w.out a _ насчёт г den ftp 0 * с localhost.localdomain Wed Jan 0 01:50:15 0002 0 ftp 0 * с home/den/w.out a _ i r den localhost.localdomain

Wed Jan 0 01:52:08 0002 0 home/den/ftphosts.html

0490 / 281 / 281 / 888 /

b, _ i r den ftp 0

Из первой ежедневник видно, что-нибудь абонент den был зарегистрирован с удаленного узла localhost.localdomain. Начало передачи файла /home/ den/vmware. html случилось во среду, 0 января 0002 возраст на 01:49. Общее время передачи — одна секунда. Общий широта переданной информации составляет 0490 байт. Для передачи файла использовался политическое устройство ASCII (а), никак не было произведено никаких специальных операций (_). Файл vmware.html пользователь загружал не без; сервера, нате в чем дело? указывает наклонность передачи (о). Пользователь den является зарегистрированным пользователем системы (г). Символ g получай этом месте означал бы гостевую регистрацию, а кредо а — анонимную. Название службы, которая производила операцию — ftp. Теперь рассмотрим четвертую запись. Тот но юзер den передал на сервер обложка f t p h o s t s . html. Направление передачи — бери сервер (i). Режим передачи — двойной (Ь). Вторая равным образом третья ежедневник сообщают о загрузке из сервера равным образом держи сервер файла w. out на текстовом (а) режиме. Остается всего лишь отметить, ась? обложка x f e r l o g используется обоими серверами FTP — wu-ftpd равно ProFTPD. 432


Глава 05. Настройка сервера FTP

05.2. Сервер ProFTP 15.2.1. Установка равно запускание ProFTPD Альтернативой, и, держи муж взгляд, будет хорошей, серверу wu-ftpd является сервер ProFTPD. Он значительно уймись на конфигурировании, чем сервер wu-ftpd, да обладает порядочно гибкими возможностями. Для его установки хватит найти блок proftpd. Подобно серверу wuftpd, ProFTPD может запускаться безотчетно рядом запуске системы или предлагать приманка услуги суперсервером присутствие наличии запроса возьми установку соединения. Сервер ProFTPD может предлагать близкие услуги от ключами, указанными в табл. 05.4. Параметры сервера ProFTPD

Таблица 05.4 Назначение

Ключ -h

Справочная новость

-п

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

-d уровень_отладки

Устанавливает ватерпас отладки сервера (1-5)

-с файл_конфигурации

Задает утилизация альтернативного файла конфигурации чем стандартного / e t c / p r o f t p d . c o n f

-рО | 0

Запрещает (0) либо разрешает (1) эксплуатация постоянного пароля. Для получения паче подробной информации как хотите документацию по серверу

-I

Выводит перечень всех модулей, откомпилированных чтобы использования сервером ProFTPD

-V

Выводит версию

05.2.2. Настройка ProFTPD. Файл /etc/proftpd.conf Сервер ProFTPD использует токмо одинокий обложка конфигурации — / e t c / proftpd.conf. В листинге 05.7 представлен тейлерия обложка конфигурации сервера ProFTPD.

Листинг 05.7. Пример файла конфигурации /etc/proftpd.conf # Этот обложка устанавливает единовластно сервер да одну учетную запись ServerName "My ProFTPD server" ServerType standalone DefaultServer on # Используем неоригинальный порт Port 01 433


LINUX: полное руководство Umask 022 Maxlnstances 0 0 # Пользователь да группа, обслуживающие сервер User nobody Group nobody # Параметры корневого каталога. Блочная указка Directory <Directory /*> # Директива, определяющая параметр AllowOverwrite AllowOverwrite on </Directory> Директивы конфигурации делятся сверху двум группы: директивы, определяющие параметры, равным образом блочные директивы. Блочные директивы конфигурирювания похожи возьми тэги языка HTML: конечная инструкция имеет так а имя, что равно начальная, да вместе с наклонной чертой во начале. Например, начальная директива <Directory/*>, а конечная — </ Directory > (листинг 05.7). Действия каждой испарения директив распространяются токмо держи блок, готовый в среде ними. Директива < Directory > определяет свойства какого-нибудь каталога. В вышеприведенном листинге определяются свойства корневого каталога. В таблице 05.5 представлены целое директивы файла конфигурации сервера ProFTPD. Директивы файла конфигурации сервера ProFTPD Директива

Таблица 0t>.5 Описание

AccessGrantMsg передача

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

Allow from all | host | network [,host | networkf, ...]]

Используется в середине блока Limit. Ограничивает доступ к серверу (а именно, разрешает доступ). По умолчанию allow from all

AllowAII

Разрешает путь ко блокам Directory, Anonymous, Limit

AllowForeignAddress on | off

Разрешает клиенту показывать около установке соединения адрес, каковой отнюдь не соответствует ему. По умолчанию off. Может употребляться на блоках VirtualHost, Anonymous, <Global>

AllowGroup список_групп

Разрешает приступ определенным группам. Используется в блоке Limit

AllowUser списокпользователей

Разрешает проход определенным пользователям. Используется во блоке Limit

AnonRequirePassword on | off

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

<Anonymous directory>

Создает анонимную учетную запись, directory — корневой каталог анонимного сервера

AuthGroupFile линия

Позволяет направить линия для альтернативному файлу group. По умолчанию используется обложка /etc/group

034

-


Глава 05. Настройка сервера FTP Продолжение Директива

табл. 05.5

Описание

AuthUserFile маршрут

Указывает противоположный обложка passwd

Bind lp-адрес

Разрешает привязку дополнительного IP-адреса для основному или виртуальному хосту

DefaultRoot кадастр

Задает корневой библиография по мнению умолчанию

Deny from all | host | network

Запрещает дорога ко серверу. Используется на блоке Limit

DenyAII

Запрещает анонимным пользователям теледоступ для объектам, указанным на блоке Limit

DenyUser список_пользователей

Запрещает проход определенным пользователям

<Directory> маршрут

Используется во VirtualHost, Anonymous пользу кого того, чтобы определить особенные величина доступа ко каталогу равно его подкаталогам

DisplayFirstChdir файлсообщения

Указанный текстовый обложка хорэ выводиться, когда-когда читатель впервинку после срок сеанса войдет на настоящий каталог. Используется во VirtualHost, Directory, Anonymous

DisplayLogin файл_сообщения

Этот обложка короче отображен, в некоторых случаях абонент зарегистрируется

<Global>

Используется про задания параметров, которые будут использоваться во вкусе основным, приблизительно равно всеми виртуальными серверами

<Limit command>

Ограничение нате действие данной FTP-команды, например, LOGIN, WRITE, READ, STOR

MaxClients number | none уведомление

Ограничение получи величина клиентов. Приведенное отчёт склифосовский отображено, разве пользователю хорош отказано в доступе. Блоки Anonymous, Global

MaxLoginAttempts

Максимальное численность попыток зарегистрироваться. По умолчанию 0. Блоки VirtualHost, Global

Order allow, deny | deny, allow

Порядок выполнения директив Allow равным образом Deny во блоке Limit

PersistentPassword on | off

При значении on будут использованы системные файлы /etc/ passwd равным образом /etc/group, невзирая бери то, в чем дело? командой chroot корневой регистр был изменен

RequireValidShell on | off

Разрешает сиречь запрещает регистрацию подле использовании оболочек (shells), которые далеко не указаны во файле /etc/shells

ServerAdmin email

Определяет email администратора сервера

ServerType

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

Timeoutldle секунды

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

Umask слепок

Определяет полномочия доступа ради созданного файла. Маска — число во восьмеричной системе, определяющее комбинация прав доступа (см. главу 0)

User имяпользователя

Имя пользователя, присвоенное демону ProFTP

UserAlias вымышленный читатель

Создает перечисленный матроним для того указанного пользователя

•cVirtualHost address>

Создает несуществующий сервер

035


LINUX: полное вождь

05.2.3. Разграничение доступа для серверу ProFTP Я считаю необходимым поподробнее перетереть блочную директиву Limit. Эта указка определяет видимость да объем доступа для тому либо иному каталогу. Рассмотрим распечатка 05.8. Листинг 05.8. Пример использования директивы Limit

<Directory incoming> <Limit WRITE> AllowAll </Limit>

<Limit READ> DenyAll </Limit> </Directory> Директива Directory определяет свойства каталога incoming, а директива Limit задает обличие доступа для этому каталогу. Команда WRITE директивы Limit вообще со директивой AllowAll разрешает по всем статьям пользователям расшифровывать информацию во нынешний каталог. Команда READ директивы Limit задает окаймление в считывание сего каталога. В рассматриваемом случае чтение запрещено в целях всех пользователей. Кроме команд WRITE да READ, во директиве Limit позволительно задавать команды STOR равным образом LOGIN (таблица 05.6). Команды директивы Limit, ограничивающие карт-бланш доступа

Команда LOGIN

Таблица 05.6 Назначение

Ограничивает регистрацию

WRITE

Ограничивает отметка

READ

Ограничивает считывание

STOR

Ограничивает хитрость файлов

В блоке Limit дозволяется задавать директивы Allow, AllowAll, AIlowGroup, AllowUser, Deny, DenyAll, DenyUser. Например, во листинге 05.9 заказано теледоступ во всем пользователям, опричь den. Пользователь den может регистрироваться со всех компьютеров, выключая компьютера вместе с IP-адресом 111.111.111.111. Также запрещена запись изо козни 092.168.2.0

036


Глава 05. Настройка сервера FTP

Листинг 05.9. Пример блока Limit <Limit LOGIN> DenyAl1 AllowUser den Deny from 011.111.111.111 Deny from 0 0 0 . 0 0 0 . 0 . </Limit> Для конфигурирования отдельного каталога может и употребляться обложка . f t p a c c e s s , который-нибудь расположен во этом каталоге. В нем содержатся такие но директивы, что-нибудь равным образом во файле prof t p d . conf, однако файл . f t p a c c e s s имеет первое место под файлом prof t p d . conf. Организация анонимного FTP-сервера Анонимный FTP-сервер не грех выстроить со через wu-ftpd, установив пакет anonftp. Этот пачка запрещается пустить в дело совокупно со сервером ProFTPD. Пакет anonftp поставляется во составе большинства дистрибутивов. Сейчас рассмотрим, равно как создать без подписи FTP-сервер не без; помощью сервера ProFTPD. Для организации анонимного доступа сервер ProFTPD имеет директиву Anonymous. При этом на устройство Anonymous нужно вместить директивы, конфигурирующие анонимную службу. В самой же директиве Anonymous никуда не денешься означить каталог, кто довольно применяться во качестве корневого для того анонимной службы. Сервер ProFTPD выполнит ради сего каталога команду enroot, превращая данный каталог в корневой про удаленного пользователя. Перед тем, на правах учинить это, сервер ProFTPD прочитает постоянно необходимые ему файлы конфигурации из реального каталога / e t c . При анонимной регистрации до умолчанию на качестве имени пользователя указывается anonymous, а заместо пароля — надсыл электронной почты пользователя. Вы но можете переменить величина анонимного доступа, добавив проверку пароля для того анонимного пользователя не без; помощью директивы AnonRequirePassword. В следующем примере представлен типичный установка Anonymous, счастливый пользу кого большинства анонимных серверов (см. распечатка 05.10). Листинг 05.10. Типичный установка Anonymous <Anonymous /var/ftp> User ftp Group ftp UserAlias anonymous ftp RequireValidShell off 437


LINUX: полное администратор

<Directory *> <Limit WRITE> DenyAll </Limit> <Limit STOR> AllowAll </Limit> </Directory> </Anonymous> Директивы User да Group задают прозвище пользователя для того анонимного доступа. В обеих случаях применяется прозвище ftp. Для имени ftp определяется псевдоним anonymous. Вместо пароля нужно определить приветствие электронной почты. Директива RequireValidShell отключает проверку командного интерпретатора пользователя. По умолчанию сервер ProFTPD ищет список допустимых интерпретаторов во файле / e t c / s h e l l s . Если используемый пользователем программа никак не указан на файле / e t c / s h e l l s , так сочленение полноте разорвано. Директива RequireValidShell off отключает такую проверку. Директива <Directory *> определяет свойства про всех каталогов. При этом во всем пользователям запрещено переписывать файлы получи сервер, но разрешено переписывать файлы сервера в собственный местный компьютер. Желательно равным образом присчитать во группа Anonymous директиву MaxClients, которая указывает максимальное цифра клиентов. Нужно проверять нагрузку бери сервер равным образом пропускной арык на определения максимального числа анонимных клиентов. Настоящих пользователей сервера FTP согласно потенциал неграмотный долженствует ограничивать, во лента с анонимных. При медленном канале связи, например, 03 Кбит/сек, установите максимальное количество анонимных клиентов небольшим, например, 0 тож инда 0. Конечно, число клиентов вдобавок зависит ото объема информации, расположенной бери сервере. Если размеры файлов невелики (например, сие текстовые файлы), в таком случае число клиентов позволяется назначить ряд большим (10-15).

05.3. Утилиты обслуживания FTP-сервера При работе вместе с серверами wu-ftpd равным образом ProFTPD ваша сестра можете использовать программы ftpshut (останавливает сервер), ftpwho (выводит информацию о пользователях), ftpcount (сообщает касательно количестве установленных соединений). Инструментальные деньги обеих серверов имеют похожие опции, да вспомогательные программы интересах ProFTPD выводят больше полезной информации. 438


Глава 05. Настройка сервера FTP

Я рекомендую пускать в дело разбуравленный дедукция утилиты ftpwho. В этом режиме предоставляется хлеще информации (листинг 05.11). Листинг 05.11. Результат работы программы ftpwho # ftpwho -v Master proftpd process 059: 1113 0m55s proftpd: ftp - localhost.localdomain: anonymous/deniden.com: IDLE (host: localhost.localdomain [127.0.0.1]) (cwd: /) 1150 0m20s proftpd: den - localhost.localdomain: IDLE (host: localhost.localdomain [127.0.0.1]) (cwd: /home/den) Service class 2 users

05.4. Виртуальный отделение FTP Виртуальный сервер — сие сервер, невыгодный существующий физически, но представляющийся пользователю вроде истинный сервер. ОС Linux может поддерживать сколько-нибудь IP-адресов, по причине чему дано возможность создать виртуальные узлы. Если ваша милость располагаете дополнительными IPадресами, так они в духе единожды могут применяться чтобы создания виртуальных узлов. При конфигурировании виртуальных FTP-узлов на брата виртуальному узлу нужно зажать один IP-адрес. Виртуальные FTP-узлы нужны, кабы вы, например, хотите организовать несколько узлов FTP — например, к разных рабочих групп да для анонимных пользователей. Обслуживать махом ряд FTP-узлов позволяет однако оный а дворовой proftpd. Настройка виртуального FTP-узла бог похожа бери настройку виртуального веб-сервера, которая бросьте рассмотрена на следующей главе. Даже используется одна равным образом та но указка VirtualHost, содержащая IP-адрес или доменное имя, прописанное на службе DNS. IP-адрес повинен адресовать получай установка сети, сверху котором запущен ProFTPD (см. распечатка 05.12).

Листинг 05.12. Пример использования директивы VirtualHost <VirtualHost ftp.library.com> ServerName "Online library" MaxClients 05 MaxLoginAttempts 1 439


LINUX: полное руководство DeferWelcome on <Limit LOGIN> Allow from 092.168.1 Deny from a l l </Limit> <Limit WRITE> AllowUser libadmin DenyAll </Limit> <Anonymous /var/ftp/library/books> User library Group library AnonRequirePassword on </Anonymou s > <Anonymous /var/ftp/library> User ftp Group ftp UserAlias anonymous ftp </Anonymous> </VirtualHost> В примере 05.12 да конфигурируются двум анонимных учетных дневной журнал — library равно ftp. Причем учетная учет library требует ввода пароля при регистрации. Пароль потребно соприкасаться со паролем того пользователя, который запустил демон. Доступ ко виртуальному серверу разрешен лишь в целях подсети 092.168.1.0. Записывать причина нате сервер может только пользователь libadmin.

05.5. Защита FTP Очень полезной, особенно, около организации виртуальных узлов, является конфигурационная распоряжение DefaultRoot, позволяющая определить каталог, который представлялся бы пользователям как бы корневой. Например, авторитет DefaultRoot"~" настраивает сервер так, с намерением корневым каталогом каждого пользователя был его принадлежащий доморощенный каталог. А что такое? делать, неравно нам нужно, в надежде пользователи видели безвыездно дерево файловой системы? Например, ради всякий был способным посмотреть, на каком каталоге находится та сиречь иная программа. В этом случае целесообразно ограничить образ действий надо файлами во корневом каталоге (точнее, кайфовый всех каталогах, сверх того домашнего каталога пользователя). Делается сие так: 440


Глава 05. Настройка сервера FTP

< D i r e c t o r y /*> <LIMIT WRITE READ STOR> DenyAll </LIMIT> </Directory> Пример файла конфигурации не без; использованием директивы DefaultRoot приведен далее (листинг 05.13): Листинг 05.13. Пример использования директивы DefaultRoot (/etc/prof tpd.conf) ServerName "My ProFTPD server" ServerType standalone DefaultServer on # Корневым интересах пользователя хорош его домотканный каталог DefaultRoot "~" # Используем стереотипный порт Port 01 Umask 022 Maxlnstances 0 0 # Пользователь равно группа, обслуживающие сервер User nobody Group nobody # Параметры корневого каталога. Блочная инструкция Directory <Directory /*> # Директива, определяющая параметр AllowOverwrite AllowOverwrite on </Directory> # Чтобы избежать атаки бери отказ, нужно установить # максимальное количество клиентов, а опять же максимальное # цифра неудачных попыток регистрации: MaxClients 00 MaxLoginAttempts 0 # Иногда с целью взлома умышлятель пытается использовать # на качестве оболочки какую-нибудь программу, например, # "оболочку" rm -R /. # Обычно буква разрыв во защите закрыта, однако всегда а желательно # приглашать использования всего-навсего законных оболочек: RequireValidShell on

041


Глава 06

НИР-СЕРВЕР APACHE УСТАНОВКА, НАСТРОЙКА APACHE. ФАЙЛЫ КОНФИГУРАЦИИ ФАЙЛ РОТАЦИИ ЖУРНАЛОВ /ETC/LOGROTATE.D/HTTPD СИСТЕМНЫЙ ФАЙЛ КОНФИГУРАЦИИ /ETC/SYSCONFIG/HTTPD СЦЕНАРИЙ ЗАПУСКА СЕРВЕРА APACHE /ETC/INIT.D/HTTPD ГРАФИЧЕСКИЕ КОНФИГУРАТОРЫ APACHE КАТАЛОГИ ПОЛЬЗОВАТЕЛЕЙ

ВИРТУАЛЬНЫЙ НТТР-СЕРВЕР SSL И APACHE ПЕРЕКОДИРОВАНИЕ РУССКОЯЗЫЧНЫХ ДОКУМЕНТОВ «НАЛЕТУ» СЕРВЕР KHTTPD — ВЕБ-СЕРВЕР УРОВНЯ ЯДРА

LINUX

ПОЛНОЕ РУКОВОДСТВО


Эта лидер посвящена популярному HTTP-серверу Apache. Этот сервер возник с веб-сервера NCSA, разработанного во Национальном центре разработок суперкомпьютеров Иллинойского университета. В 0994 году из проекта NCSA ушел первый разработчик, оставив многих последователей самостоятельно знать толк во своем сервере. Со временем начали представать исправления равно дополнения для серверу NCSA — заплатки (патчи). А на апреле 0995 лета вышла первая издание сервера Apache, основанного на версии 0.3 сервера NCSA, которая легко вобрала на себя совершенно известные на оный минута исправления NCSA. Отсюда появилось равно само название Apache — «A PatCHy». Позже Apache стал самостоятельной разработкой, равно неотложно возлюбленный поддерживается группой программистов-добровольцев Apache Group. Сервер Apache разрабатывался пользу кого ОС Linux да UNIX, только со временем были выпущены его версии равным образом на ОС Windows равным образом OS/2. Хочу как и отметить, что, за исключением Apache, к ОС Linux существуют и другие веб-серверы: Red Hat Secure Server, Apache-SSL, Netscape Enterprise Server равно т.д.

06.1. Установка Apache В зависимости ото дистрибутива, пакет, с которого устанавливается вебсервер Apache, может именоваться apache или — или httpd, а депеша вместе с документацией — apache-docs или — или httpd-manual соответственно. В первом случае вам понадобится определить до этого времени блок apache-common, содержащий необходимые файлы чтобы запуска сервера. После установки сервер конфигурируется пользу кого запуска на режиме standalone, ведь очищать спирт склифосовский безостановочно фигурировать во памяти. Я отнюдь не рекомендую изменять сей режим. Для запуска равным образом останова сервера Apache ваша сестра можете воспользоваться командами: # /etc/rc.d/init.d/httpd start # /etc/rc.d/init.d/httpd stop 443


LINUX: полное заведование

После успешной установки сервера отредактируйте обложка / e t c / h t t p d / c o n f / h t t p d . c o n f . В нем исправьте итого одну директиву — ServerName. Значением ее надо бытийствовать имя, зарегистрированное во службе DNS вашей сети. После сего запустите сервер. Откройте каждый браузер и попробуйте воззвать ко серверу вместе с локального компьютера (netscape h t t p : / / l o c a l h o s t ) , а впоследствии от другого компьютера вашей сети (netscape h t t p : //server, firma.ru). Если во обеих случаях ваш брат увидите благословение сервера (рис. 06.1), значит, ваш сервер Apache нормально работает да позволено браться для его дальнейшему конфигурированию. Если во первом случае у вам произошла ошибка, значит, подыскивать ее нужно на локальном уровне. При этом ежели вентерь по заведенному порядку работает, то, скорее всего, ваш брат без труда забыли включить сервер. Появление ошибки вот втором случае может состоять связано не без; неправильной установкой директивы ServerName (например, назначенное вами кличка веб-сервера никак не прописано в службе DNS).

••;-•-;,,',.,•

Edit

View

.. Back

Go

Forward

W .

• .•• . ; -

<V" f

*

Из; -r.j. *

•1..!

:

Communicator

Reload.

Search

Home

Netscape

Print

Security

Shop

:

ople ^YeBow Pages , # Download ^Calendar

^

The Apache Web Server software on this system is operational. You may n been included with this distribution.

"

Ш Stop What's Related

| * Bookmarks •& Ucationi ^ttp://locaUio

U

Help

tplace this page The Apache

'' •'"•'•"•'"""•"'""••""•'- д 0 ^ е w j, o l e Linux-Mandrake distribution, this Apache web server is compiled with Proceвея--Specific Optimizations to 'r ! • " " ' * i wke sdvantagt of the power ef the new processor generation, giving it S-30% more performance then впуоЛы Linux Web '*"' iVf 1 I • ^ C I V c r - ^ что касается г Лосшаыиааоп and int ormation on Mandrake Lmuj:, please visit the web site of Liu?.)t7Mgr.drtkt,.

performance tuned by This version of Apache mcl«dts high-performance patches from the "Accelerating Apache project" atSihconQraphics (Up to 000% more performance under the SPbCweo96 benchmarkO, таду optimizations, Extended Application Programming Interface (EAPI), Shared memory module, hooks lor SSL module, Hotwired XSSI module, and several patches/cosmetic improvements. It is also fully modular, and many modules are available in pre-compiled format. Also included are special patches to enable FrontPage 0100 support, however you need to install the optional package to enable it. Documentation for some standard Apache modules and othei addon modules is included.

.

0

B«*«

>\.

I

,

•:

i

• .• -

:

What is the Advanced Extranet Server? The Apache Wtb Server serves as the foundation for the Advanced Extranet Server project. This fully modular, highly integrated and scalable solution offers the foUowingfeatures: • • • • •

AdvancedScripting, CGI and Dynamic content Databaseintegraaon Content management andpublishmg tools Advanced User Authentication Strong Cryptography for the international market

Future versions will also feature:

Рис. 06.1. Приветствие сервера Apache 444


Глава 06. HTTP-сервер Apache

06.2. Настройка Apache. Файлы конфигурации После установки Apache должно отредактировать следующие файлы: • /etc/httpd/conf /httpd.conf — базисный обложка конфигурации. Для Apache 0.x. таковой обложка может опять же величаться httpd2 . conf; • / e t c / l o g r o t a t e . d / a p a c h e либо — либо / e t c / l o g r o t a t e . d / h t t p d (в версии 0.0) — обложка ротации журналов; • / e t c / s y s c o n f i g / h t t p d — комплексный обложка конфигурации; • / e t c / i n i t . d / h t t p d — обложка инициализации Apache. Для старых версий Apache (до версии 0.3) присуще присутствие файлов s r m . c o n f да a c c e s s . c o n f . Обычно сии файлы находятся во каталоге / e t c / h t t p d / c o n f . В файле srm.conf задаются формат документов, которые размещены в сервере. Файл a c c e s s . conf заключает параметры доступа ко серверу. Начиная со версии 0.3 рекомендуется по сию пору директивы, которые прежде находились во файлах s r m . c o n f равным образом a c c e s s . c o n f , вмещать во обложка h t t p d . c o n f . Файл h t t p d . conf — сие стержневой обложка конфигурации сервера. В нем содержится техническое определение работы сервера. Начиная из версии 1.3 появилось небольшую толику дополнительных конфигурационных файлов: apache-mime.types, vhosts/vhosts.conf, vhosts/VirtualHomePages. conf, vhosts/DynamicVHosts.conf. В файле apache-mime.types содержатся типы MIME, поддерживаемые сервером Apache. Файлы v h o s t s . conf, VirtualHomePages.conf, DynamicVHosts.conf относятся к конфигурированию виртуальных веб-серверов, насчёт которых спич пойдет крошку позже.

MIME (Multipurpose Internet Mail Extensions) — многоцелевое расширение электронной почты на мережа Интернет. Используется малограмотный токмо рядом работе с электронной почтой, только равным образом служит ради описания различных типов данных, например, текстовых, графических. Описание как MIME заключает на себя наречение типа, подтипа равно развертывание (например, text/plain txt).

06.3. Основные настройки. Файл httpd.conf (httpd2.conf) Как еще отмечалось ранее, данный обложка заключает без мала безвыездно директивы, необходимые для того работы сервера. Директивы конфигурационного файла сервера Apache не возбраняется условно распилить возьми такие группы: 445


LINUX: полное руководитель

0. Общие. К общим директивам относятся глобальные директивы, влияющие бери работу лишь веб-сервера. Это директивы ServerName, ServerType, Port, User равным образом Group, ServerAdmin, ServerRoot, PidFile, DocumentRoot, UserDir. 2. Директивы протоколирования: ErrorLog, TransferLog, HostnameLookups. 3. Директивы ограничения доступа: AllowOverride, Options, Limit. 4. Директивы управления производительностью: StartServers, MaxSpareServers, MinSpareServers, а вот и все директива CacheNegotiatedDocs. 5. Директивы обеспечения постоянного соединения от клиентом: Timeout, KeepAlive, KeepAliveTimeout. 6. Директивы настройки отображения каталога. Оформить изображение каталогов позволяется из через директив настройки отображения каталогов: Directory Index, Fancy Indexing равно AddlconByType. 7. Директивы обработки ошибок. Директивой обработки ошибок HTTP-сервера является предписание ErrorDocument. С ее помощью можно ввести реакцию сверху любую ошибку сервера, например, на ошибку 004 (документ невыгодный найден). 8. Директивы перенаправления: Redirect, Alias да ScriptAlias. 9. Директивы к работы от многоязычными документами: AddLanguage и LanguagePriority. 10. Директивы обработки MIME-типов. Настроить особенный сервер для обработки различных MIME-типов дозволительно от через директив DefaultType, AddEncoding, AddType, AddHandler равным образом Action. 11. Директивы создания виртуальных узлов: VirtualHost, Listen, Bind Address. Все сии директивы готовить к печати вас навряд ли ли придется — объединение умолчанию они содержат совсем разумные значения. Нужно хорошенького понемножку расправиться только значения директив ServerName да ServerAdmin. Далее приведено описание директив, используемых во файле httpd.conf.

06.3.1. Общие директивы Общие директивы изменяют глобальные объем сервера — его имя, тип, порт, приветствие администратора. Значения, указанные глобальными директивами, влияют получи работу лишь сервера. • ServerName — директива, которая определяет прозвище сервера Apache. Здесь должен взяться замечено официальное отчество сервера во таком виде, в котором появится во адресной строке браузера. Это название надлежит быть зарегистрировано во службе DNS вашей сети. • ServerType — директива, которая определяет образ сервера. По умолчанию используется ценность standalone. Если ваша милость хотите достичь 446


Глава 06. HTTP-сервер Apache

максимальной производительности вашего веб-сервера, неграмотный изменяйте это значение. ServerAdmin — директива, которая задает электронный адрес веб-мастера вашего веб-узла. Если возникнут какие-то проблемы, связанные из работой сервера, так до этому адресу бросьте отправлено соответствующее сообщение. Обычно используется авторитет Пользователь webmaster, во вкусе правило, не существует достижимо на системе. Для определения имени (псевдонима) webmaster используется обложка псевдонимов электронной почты / e t c / a l i a s e s . Формат сего файла следующий: <псевдоним>:<регистрационное_имя>. После модификации этого файла нужно подсоединить ото имени суперпользователя команду newaliases. В Windows псевдонимы создаются со через программы настройки установленного почтового сервера. Port — директива, задающая штукенция порта, каковой склифосовский использоваться для установки соединения. По умолчанию используется морские ворота 00. Если вы хотите включить сервер Apache вместе с использованием сего иначе любого другого порта, часть которого в меньшей мере 0024, вам должны быть отмеченным правами суперпользователя. Но пусть даже разве у вам отсутствует таких прав, ваш брат можете запустить сервер в целях работы вместе с портом, факс которого превышает сила 0024. Обычно используется комната 0080 иначе говоря 0000. User равным образом Group. Директивы User да Group определяют идентификаторы пользователя равно группы, ото имени которых бросьте коптеть сервер. Данные идентификаторы присваиваются серверу, коли некто запущен в автономном режиме. Можно пускать в ход в духе имена пользователей, так да их числовые эквиваленты — UID. По умолчанию используется имя пользователя nobody. Из соображений безопасности малограмотный рекомендуется изменять сие значительность да адресовать псевдоним реального пользователя. В этом случае веб-сервер получит приступ всего только для тем файлам, которые разрешены к чтения по всем статьям пользователям. Нужно заметить, что упомянутый читатель равным образом серия должны быть налицо на вашей системе. Ни на коем случае невыгодный запускайте сервер через имени пользователя root! ServerRoot — во этой директиве указывается местонахождение файлов конфигурации сервера Apache. По умолчанию для того сих целей используется индекс / e t c / h t t p d . PidFile — из через этой директивы указывается термин файла, во котором материнский движение сервера полноте регистрироваться. Этот файл содержит близкий идентификатор процесса (PID). Данную информацию можно пускать в дело пользу кого останова иначе перезапуска сервера быть написании собственных сценариев. Этот обложка достаточно создан, всего-навсего если сервер Apache запущен на автономном режиме. DocumentRoot — директива, определяющая местонахождение корневого каталога документов вашего сервера. 447


LINUX: полное учебник

UserDir — каста приказ задает названия подкаталога на домашнем каталоге пользователя, с которого берутся документы. В этом случае вам активизируете случай использования пользовательских каталогов. Если ваша сестра безвыгодный хотите вливать эту возможность, укажите UserDir DISABLED. Более до мелочей каста распоряжение склифосовский рассмотрена позже.

06.3.2. Директивы протоколирования Директивы протоколирования управляют процессом протоколирования работы сервера. С их через ваш брат можете определить, аюшки? нужно расшифровывать на журналы, а аюшки? — нет. • HostnameLookups on | off.CepBep Apache ведет книга доступа других компьютеров. Если ваша сестра включите данную опцию (on), в таком случае во журнал будет фиксировано доменное титул компьютера-клиента. Если сия опция выключена (off), на ревю бросьте записан IP-адрес клиента. Включение данной опции замедляет работу сервера, что-то около как бы надобно дополнительное промежуток времени в виды ответа ото сервера DNS. • ErrorLog да TransferLog — сии директивы определяют предрасположенность журналов сервера Apache. Обычно для того сих целей используется каталог / e t c / h t t p d / l o g s , каковой является ссылкой держи каталог / v a r / l o g / h t t p d другими словами сверху все непропорционально какой другой. В журнале e r r o r l o g протоколируются диагностические сообщения, а как и сведения об ошибках, которые порождают CGI-сценарии. В журнале t r a s f e r l o g протоколируются требования клиентов.

06.3.3. Директивы управления производительностью Поэкспериментировав не без; этими директивами равным образом выбрав оптимальные значения, дозволительно допроситься существенного повышения производительности вашего сервера. Сервер Apache на каждого соединения запускает отдельную копию, которая хорош делать требования клиента. Управлять запущенными копиями позволяют директивы StartServers, MinSpareServers, MaxSpareServers. • StartServers, MaxSpareServers, MinSpareServers. Для каждого нового соединения создается новая подражание процесса сервера. Директива StartServers задает доля копий, которые будут созданы при запуске исходной копии сервера. При этом исходная копия сервера получает требования равно передает их свободным копиям. Это позволяет правильно расписать нагрузку в лоне отдельными процессами да выдвинуть мощность сервера, одначе на 448


Глава 06. HTTP-сервер Apache

практике всегда невыгодный беспричинно хорошо, наравне желательно бы. Существенного прироста производительности позволительно заслужить лишь только во случае большой загрузки сервера. По умолчанию запускается пятеро копий сервера. Если численность поступающих запросов превышает контингент запущенных копий сервера, запускаются дополнительные процессы-серверы. Эти процессы далеко не завершаются в дальнейшем обработки своего запроса, а продолжают состоять во памяти. Директива MaxSpareServers позволяет обратить максимальное количество таких процессов. Если это доля превышено, так лишние процессы завершаются. Если доля «серверов бери подхвате» меньше, нежели задано директивой MinSpareServers, запускаются дополнительные копии. Для работы сих директив необходимо, с целью сервер был запущен в автономном режиме. CacheNegotiatedDocs — каста указка позволяет прокси-серверу, например, SQUID, невыгодный кэшировать документы, которые безвыгодный генерируются автоматически, в таком случае поглощать на процессе выполнения различных сценариев. Согласно протоколу НТТР/1.0, сервер Apache вместе с каждым пакетом посылает текстовка «Pragma: no-cache» прокси-серверу, сколько позволяет отключить кэширование документов (в протоколе НТТР/1.1 вместо Pragma используется Cache-Control). Если ваш брат включите данную директиву, так вам с вашего позволения прокси-серверу кэшировать документы. К сожалению, далече никак не по сию пору прокси-серверы отключают кэширование после получения данного заголовка. При написании своего CGIсценария вам, веселей всего, придется самому извлекать заголовок Pragma (или Cache-Control) равно мета-тэги, которые указывают в дату последнего обновления документа.

06.3.4. Директивы обеспечения постоянного соединения от клиентом Эти директивы обеспечивают постоянное крепление от клиентом, а также управляют параметрами установленного соединения. • Timeout — задает период времени во секундах, на ход которого сервер продолжает попытки возобновления приостановленной передачи данных. Значение директивы Timeout распространяется не только для передачу, да равно бери фигура данных. Если вы нужно получать большие файлы, рекомендую расширить данное значение. • KeepAlive — разрешает постоянные соединения, ведь лакомиться такие соединения, во которых производится паче одного запроса из-за одиночный раз. • KeepAliveTimeOut — данная инструкция определяет таймаут пользу кого постоянного соединения. • MaxClients. Иногда поступающих запросов таково много, что компьютеру малограмотный ешь — не хочу ресурсов на загрузки новых копий сервера в 15 Зак. 088

049


LINUX: полное администратор

мнемозина равным образом их выполнения. Директива MaxClients (значение до умолчанию — 050) определяет максимальное численность копий сервера, которые могут протекать одновременно. MaxRequestsPerChild. После обработки определенного количества запросов, указанного на этой директиве, ксерокс сервера завершается, а на смену нее запускается новая.

06.3.5. Директивы создания виртуальных узлов Довольно нередко юзер безграмотный может сделать возможным себя такую роскошь, как собственный облеченный плотью веб-сервер, так снедать обособленный компьютер, неустанно законнекченный для Интернет, получи котором запущен сервер Apache. Поэтому современные веб-серверы поддерживают виртуальные узлы. У вас хорэ собственное имя, например, www.firma.ru, хотя на действительности ваши файлы будут помещены никак не получай отдельном компьютере www.firma.ru, а будут разыскиваться в сервере провайдера (или хостера) — www.isp.ru. Благодаря технологии виртуальных узлов нераздельно сервер хостинг-провайдера обслуживает сотни другими словами аж тысячи сайтов. На своем домашнем веб-сервере ваш брат опять же можете разбудить единолично тож порядочно виртуальных узлов, если, конечно, вас сие нужно. Listen — буква инструкция позволяет вас соединять Apache вместе с определенным IP-адресом и/или дополнительными портами. BindAddress — сия указка сообщает серверу, какой-либо IP-адрес следует прослушивать. Значением данной директивы может бытовать «*» (любой адрес), IP-адрес другими словами полное фамилия домена. Блок директив VirtualHost полноте рассмотрен позднее, близ описании создания равно использования виртуальных узлов.

06.3.6. Директивы настройки отображения каталогов Эти директивы позволяют «украсить» ваш веб-сервер, например, уподобить курсор типу файла не ведь — не то предуготовить зарегистрирование каталога. • Directorylndex — позволяет предложить заголовок документа, какой будет возвращен по части запросу, далеко не содержащему имени документа. Например, если ваш брат введете во строке адреса броузера http://localhost, так бросьте возвращен нераздельно с указанных во директиве Directorylndex документов.С помощью данной директивы допускается показать мало-мальски имен файлов. Значениями по мнению умолчанию являются index.html index.php index.htm index.shtml index.cgi Default.htm default.htm index.php. 450


Глава 06. HTTP-сервер Apache

Fancylndexing. При получении запроса, далеко не содержащего наименование документа, сервер передаст нераздельно с файлов, указанных на директиве Directorylndex. Если экий обложка невыгодный существует, клиенту короче возвращено оглавление каталога. При включении директивы Fancylndexing в оглавлении каталога будут использованы значки равным образом описания файлов. Если инструкция Fancylndexing выключена, список бросьте представлено во больше простом виде. AddlconByType (TEXT, URL) mime-type — сопоставляет курсор типу файла. Значок хорошенького понемножку прилагаться подле выводе каталога, буде включена команда Fancylndexing. Параметр TEXT определяет текстовое описание типа, которое увидят пользователи, использующие текстовый браузер другими словами пользователи, у которых отключено представление рисунков. Параметр URL определяет местоположение значка, а параметр mime-type — это тип файла, со которым нужно сличить значок. Полный перечень MIME-типов приведен на файле apache-mime. types. В качестве имени файла позволительно разделаться безграмотный всего MIME-тип, же да символы, которыми заканчивается фамилия файла (см. распечатка 06.1), да к сего нужно воспользоваться директиву Addlcon наместо AddlconByType. Листинг 06.1. Фрагмент файла httpd.conf AddlconByType (VID,/icons/movie.gif) Addlcon /icons/binary.gif .bin .exe

video/*

Первая команда во листинге сопоставляет типу video пометка /icons/ movie.gif. Вторая указка сопоставляет бинарным файлам *.bin и *.ехе знамя /icons/binary.gif. Значок за умолчанию задается директивой Defaultlcon.

06.3.7. Директивы обработки MIME-типов Как ваша милость помните, на Windows существует такое понятие, равно как расширение (или тип) файла. По расширению позволяется связать какую-либо программу с определенным типом файла. Например, когда-никогда ваша милость щелкаете для файле с расширением .txt, запускается Блокнот, а подле щелчке для файле .doc будет запущен Word. Точно этакий а машина реализован во Apache. Вы можете сличить типу файла программу-обработчик сего типа. Когда безвыгодный был разработан часть mod_php, проект php объявлялась обработчиком файла из расширением .php. Сервер запускал php, передавал ему файл, а дальше возвращал пользователю результат. • DefaultType. Если запрашиваемый клиентом фигура неграмотный соответствует ни одному с MIME-типов, используется MIME-тип, подтвержденный в директиве DefaultType. 451


LINUX: полное учебник

AddEncoding. Для сокращения времени передачи файла клиентам используется архивирование данных. Браузеры имеют встроенные программы для распаковки, запускаемые рядом получении архивов определенных MIME-типов. Именно сии MIME-типы равным образом указываются на директиве AddEncoding. AddType — вместе с через этой директивы не запрещается прибавить новоиспеченный MIMEтип, тот или другой безвыгодный указан на файле apache-mime. t y p e s . AddHandler да Action. Директива AddHandler позволяет сопоставить определенному MIME-типу какой обработчик. А от помощью директивы Action дозволительно установить какое-нибудь поступок интересах обработчика. Использование сих директив, пишущий эти строки думаю, отпустило сумме не скрыть сверху примере (листинг 06.2). Листинг 06.2. Применение директив AddHandler равным образом Action AddHandler text/dhtml dhtml Action text/dhtml /cgi-bin/dhtml-parse

06.3.8. Директивы про работы с многоязычными документами Если ваш сайт имеет мало-мальски языковых версий — например, русскую и английскую, — желательно настроить директивы управления языком. Тогда пользователю отнюдь не нужно хорош лускать объединение ссылкам «In English/Ha Русском» — сервер, исходя изо настроек браузера, самоуправно определит, какой язык предпочитает пользователь, да отобразит нужную страницу. • AddLanguage. В большинстве браузеров позволительно показать предпочитаемый язык. Директива AddLanguage сопоставляет рост файла аббревиатуре языка. Для русского языка используется аббревиатура ш, для того английского — en. При этом на корневом каталоге вашего сервера могут состоять порядочно индексных файлов получи и распишись разных языках. Например, в целях русского языка нужно пускать в дело наименование файла index. html.ru, а ради английского — index.html.en. • LanguagePriority. Если для вашем сервере размещены документы в разных языках, в таком случае от через директивы LanguagePriority допускается обратить приоритеты различных языков. Клиент вводит во адресной строке http://www. server.com/. Если во свойствах браузера в наличии реальность проучить предпочитаемый язык, ведь возвращен короче обложка в нужном языке, буде такой существует. Если но браузер клиента далеко не поддерживает эту возможность, будет возвращен обложка возьми языке, имеющем преимущественно высочайший приоритет. Для того, ради сервер поддерживал ни туды и ни сюды вы язык, предварительно установите правильное роль директивы AddLanguage. 452


Глава 06. HTTP-сервер Apache

06.3.9. Директивы перенаправления Довольно сплошь и рядом нужно переслать пользователя в иной ресурс: например, ваш брат сменили хостера да за сего изменилось фамилия вашего сайта. Обычно рядом таком «переезде» у вы лакомиться определенное время, чтобы сообщить вашим пользователям об этом. Проще лишь ввести на старом сервере переориентирование сверху новоявленный — во-первых, пользователи узнают ваш последний адрес, а во-вторых, им безграмотный нужно достаточно знакомить этот адрес автоматизированный — сервер сделает всегда автоматически. Возможно, вас нетрудно перенесли файлы во иной синопсис — вас так удобнее, только пользователи неграмотный знают об этом да все еще обращаются к старому каталогу. Тогда создайте редирект получай недавний каталог, равно сервер автоматически перенаправит пользователей получай него. • Redirect. Используйте эту директиву, когда-когда нужно перетащить документы на разный индекс иначе говоря нате видоизмененный сервер. Например, вас нужно перенести причина с каталога /users/den на список /den. Если подле этом старый URL-адрес был http://www.host.com/users/den, ведь свежий станет • http://www.host.com/den/. Используйте в целях сего следующую директиву: R e d i r e c t / u s e r s / d e n /den. Можно как и переслать запрос на второй сервер:Redirect / u s e r s / d e n / www.den.domain.com. При этом позволительно эксплуатация как бы нового, приблизительно равно старого URL-адреса. • Alias — от через директивы Alias не возбраняется вверить теледоступ не только для файлам, находящимся на каталоге, указанном директивой DocumentRoot, равным образом его подкаталогах, так равным образом на других каталогах. По умолчанию определен лишь только имя на каталога /icons. • ScriptAlias — аналогична директиве Alias, же позволяет распатронить месторасположение каталога ради CGI-сценариев.

06.3.10. Директивы обработки ошибок Такая установка токмо одна, же симпатия адски полезна. Например, произошла погрешность 004 (файл далеко не найден). Вы можете соизмерить этой ошибке URL, в тот или иной склифосовский перенаправлен браузер пользователя. Обычно перенаправление устанавливают в документ, прокармливающий логотип сайта и передача об ошибке. ErrorDocument — директива, сопоставляющая коды ошибок сервера URL-адресам получи и распишись этом а сервере.

053


LINUX: полное справочник

06.3.11. Директивы управления доступом к отдельным каталогам Вы можете предназначить отдельные величина чтобы каждого каталога вашего сервера — форма каталога, норма доступа для этому каталогу. Блок директив Directory

Блок директив Directory определяет свойства каталога (см. листинг 16.3). Листинг 06.3. Директива Directory <Directory /> Options Indexes Includes AllowOverride None </Directory>

FollowSymLinks

Свойства каталога позволено направлять на директиве Directory иначе во файле . h t асе ess, который-нибудь находится на томик каталоге, пользу кого которого необходимо установить нужные параметры. В блоке Directory могут разыскиваться директивы управления доступом. К ним относятся директивы AllowOverride, Options, Limit. Рассмотрим по порядку всё-таки сии директивы. Директива AllowOverride может принимать значения, указанные во таблице 06.1. Значения директивы AllowOverride Значение

Таблица 06.1 Описание

None

Сервер Apache довольно неглижировать файлы .htaccess. Рекомендую установить данную опцию, приближенно в качестве кого сие повысит продуктивность сервера

All

Пользователи имеют прерогатива переопределять на файлах .htaccess глобальные параметры доступа. Из соображений безопасности выгодно отличается отнюдь не использовать этот работа

Options

Разрешает пустить в ход директиву Options

Limit

Разрешает эксплуатировать директиву Limit

AuthConfig

Разрешает применение директив AuthName, AuthType, AuthUserFile и AuthGroupFile

Filelnfo

Разрешает пустить в ход во файлах .htaccess директивы AddType равно AddEncoding

С через директивы Options не грех найти функции сервера, которые будут доступны пользу кого использования во определяемом каталоге. Данную директиву допускается эксплуатировать как бы на файле h t t p d . conf, приблизительно и в файлах . h t a c c e s s . Допустимые опции чтобы директивы Options представлены во таблице 06.2. 454


Глава 06. HTTP-сервер Apache Значения директивы Options

Таблица 06.2

Значение None

Описание He позволяется утилизация каких-либо функций

All

Разрешаются совершенно функции

FollowSymLinks

Разрешается эксплуатировать символические ссылки. С точки зрения безопасности малограмотный рекомендуется истощить настоящий система

SymLinkslfOwnerMatch

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

ExecCGI

Разрешается исполнение CGI-сценариев

Indexes

Если каста опция выключена, сервер неграмотный достаточно делегировать содержимое каталога рядом отсутствии файла index.html

Includes

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

IncludesNoExec

Разрешает пользование серверных включений, только запрещает запуск изо них внешних программ

Директива Limit ограничивает проход для файлам во определенном каталоге: Limit манера

Параметр «метод» определяет схема передачи: GET сиречь POST. Директиву Limit допускается пускать в дело среди блоков Directory, Location иначе в файле . h t a c c c e s s . Блок директив Limit В блоке Limit не запрещается проэксплуатировать такие директивы: allow (разрешить), deny (запретить), order (порядок), require (требуется). После директивы allow необходимо выражение from, потом которого не грех обозначить IP-адрес, адрес сети, владение иначе говоря просто-напросто псевдоним компьютера. Слово all обозначает однако компьютеры. Директива order определяет чин выполнения директив allow и deny. Например, вас надлежит выдать волчий паспорт подступ по всем статьям компьютерам, кроме компьютеров, которые входят на владение ru (см. распечатка 06.4). Листинг 06.4. Директивы allow, deny order deny, allow deny from all allow from ru

Следующий прототип показывает, во вкусе допустить путь компьютерам только изо вашей сети. 455


LINUX: полное руководство Листинг 06.5. Разрешение доступа подсети 092.168.1.0 order deny, allow deny from all allow from 092.168.1. Кроме значений allow,deny равным образом deny,allow, приказ order может содержать значение mutual-failure. В этом случае во доступе хорош отказано всем компьютерам, которые неприкрыто безграмотный указаны на списке allow. Директиву require дозволяется пустить в ход про защиты каталога паролем. После названия директивы надо ребята! оглавление элементов: имена пользователей, групп, которые заданы во директивах AuthUserFile и AuthGroupFile. Можно утилизировать параметр valid-user, тот или другой укажет серверу отдать вход любому пользователю, титул которого имеется в директиве AuthUserFile, разве некто введет верный пароль. Пример использования приведен во листинге 06.6.

Листинг 06.в. Использование директивы require <Directory *> AuthUserFile /var/secure/.htpasswd AuthName Security AuthType Basic <Limit GET> order deny,allow deny form a l l allow from mydomain.ru require valid-user </Limit> </Directory> В листинге 06.6 для того аутентификации используется обложка паролей . h t p a s s w d , тот или иной позволительно построить не без; через программы htpasswd. Директивы блока Limit разрешают проход ко любому каталогу сервера только пользователям домена mydomain. r u . Кроме параметра valid-user дозволено утилизация параметра users или groups. Данные объем разрешают подступ только лишь определенным пользователям либо группам пользователей. Пример использования параметра users приведен во листинге 06.7.

056


Глава 06. HTTP-сервер Apache Листинг 06.7. Применения параметра users <Directory /users> AuthType Basic AuthUserFile /var/users/.htpasswd AuthName UsersDir <Limit GET POST> require users denis igor evg </Limit> </Directory> Блок директив Location С через директив, расположенных во блоке Location, не возбраняется задать определенный URL-адрес, рассчитанный чтобы обозначения каталогов, файлов alias групп файлов. Обозначить группу файлов дозволено из помощью шаблонов, например, штамп *.html определяет постоянно файлы, имена которых заканчиваются сверху .html. В URL-адрес неграмотный включается учет равным образом имя сервера. Пример описания блока Location представлен на листинге 06.8.

Листинг 06.8. Блок Location <Location URL> директивы управления доступом </Location>

06.4. Файл ротации журналов /etc/log rotate. d/htt pd Файл/etc/logrotate.d/httpd(или /etc/logrotate.d/apache — для версий Apache поперед 0.0) задает мера ротации журналов вебсервера, что-нибудь позволяет подкреплять система на журнальном хозяйстве. Пример сего файла приведен на листинге 06.9. Листинг 06.9. Файл /etc/logrotate.d/httpd (Apache 0.0) /var/log/httpd/*_log { missingok notifempty sharedscripts postrotate /usr/bin/killall -HUP httpd endscript 457


LINUX: полное учебник

Убедитесь, ась? нагрузка доступа ко файлу /etc/logrotate.d/httpd равен 0640 и владельцем сего файла является ламер root.

06.5. Системный обложка конфигурации /etc/sysconfig/httpd Этот обложка позволяет отправить серверу Apache системную информацию, например, величина запуска. Предположим, что-то ваш брат хотите впустить сервер Apache со включенной поддержкой SSL. Для сего на обложка / e t c / s y s c o n f i g / h t t p d добавьте строку: OPTIONS="-DSSL"

Вам нужно токмо прирастить нужные объем на директиву OPTIONS, a обо во всем остальном позаботится прогноз запуска / e t c / i n i t . d / h t t p d . Нужно отметить, что-то обложка / e t c / s y s c o n f i g / h t t p d появился во версии Apache 0.O.

06.6. Сценарий запуска сервера Apache /etc/init.d/httpd Стандартный схема запуска веб-сервера Apache устанавливается из того а пакета, почто да лично сервер. В версии Apache 0.0 не возбраняется вызывать сценарий запуска со следующими параметрами: • • • • •

start — запускание сервера; stop — оканчивание работы сервера; restart — рестарт сервера; status — оповещение насчёт работе сервера; condrestart — повторный запуск сервера возле наличии файла / v a r / r u n / h t t p d . p i d . Этот обложка создается возле запуске сервера равно удаляется при его останове. Если обложка h t t p d . p i d безграмотный удален, значит, сервер не был остановлен корректно: например, произошел заминка системы или банальное обесточивание питания.

Что но касается сильнее старых версий Apache, так сценарии запуска позволяют направлять куда ни на есть хлеще параметров, нежели умереть и невыгодный встать дальнейший версии: • start — включение сервера; • stop — прекращение работы сервера; • restart — повторный запуск сервера; 458


Глава 06. HTTP-сервер Apache

reload — повторная загрузка сервера. В орден через перезапуска, когда-никогда сервер сначала останавливается командой kill (то есть, прямо-таки «убивается»), а потом запускается, присутствие перезагрузке серверу передается фанфара HUP. Перезагрузка может занадобиться возле изменении файла конфигурации сервера, дай тебе изменения вступили на силу; condrestart — так же, аюшки? да одинаковый параметр, описанный выше; status — данные что касается работе сервера; fullstatus — побольше подробная данные что до работе сервера; help — подсказка; configtest — ревизия файла конфигурации.

06.7. Графические конфигураторы Apache Практически всё-таки формат веб-сервера Apache дозволяется установить, используя конфигуратор netconf (п.14.1.1). Запустите netconf с имени суперпользователя равно выберите Server Tasks, а спустя время Apache Web-server. С через netconf ваш брат мелочёвка можете найти виртуальные узлы, отвести объем подкаталогов, предопределить спецификацию каталогов и модулей, а и ввести норма модуля mod_ssl (см. рис. 06.2), настройка которого рассмотрена подальше на этой главе.

Файл

Правка

Вид Терминал

Вкладки

(^правка

iiiii rase Dialatj

ion c*< he £51.

"lute>

Cipher З л Г ^ certificate

File

C i tif icut* Key E'll* te Path CA C e r t i i i d ' - Ы

Fil*

Log Options i 'i :i; Depth •an cache Timeou

не без; *

Рис. 06.2. Конфигурирование модуля modssl 459


LINUX: полное справочник

В дистрибутив Fedora Core включен больше покойный конфигуратор systemconfig-httpd (рис. 06.3). HTTP Основное Виртуальные узлы | Сервер Настройка быстродействия! Файл блокировок;

j/var/lock/httpd.iock

Просмотреть...

Файл PID:

i/var/run/httpd.pitl

Просмотреть...

Каталог файлов Core: !/etc/htrpd Пользователь:

I apache

Группв: :

I apache

f5J Справка

V

Просмотреть...

Отменить

Рис. 06.3. system-config-httpd

06.8. Каталоги пользователей Директива UserDir заключает поддержку пользовательских каталогов. Эта директива определяет точки соприкосновения номинация подкаталога на домашних каталогах всех пользователей. По умолчанию используется регистр public_html. Данная мочь жуть удобна быть использовании ее во важный корпорации, идеже кажинный помощник имеет собственную страничку. Раньше эта способ нередко использовалась нате серверах, предоставляющих бесплатный хостинг. Может быть, помните адреса вида http://www.chat. ru/~mypage? Сейчас но до сей времени чаще используется методика виртуальных серверов, которую ты да я рассмотрим во следующем пункте, же знать, аюшки? такое каталоги пользователей равно как бы со ними работать, равно как безвыгодный помешает. Тем больше что домашние каталоги настраиваются много быстрее равно проще, нежели несуществующий сервер — нужно лишь всего лишь установить директиву UserDir и указать размещение домашних каталогов. Доступ ко файлам, расположенным во сих каталогах, производится от через указания регистрационного имени пользователя со временем имени 460


Глава 06. HTTP-сервер Apache

сервера посредством тильду-слэш. Например, черт не без; ним прозвание сервера www.server, com, прозвище пользователя — denis, между тем URL-адрес бросьте присмотреть так: http://www.server.com/~denis. При этом сервер самостоятельно определит, идеже не почто иное расположен домотканный оглавление пользователя. Если это синопсис /home/den, так сервер передаст клиенту обложка /home/den/ public_html/index.html.

06.9. Виртуальный HTTP-сервер Концепция виртуальных узлов позволяет одному серверу Apache нести порядочно сайтов. Пользователи видят отдельные веб-узлы, и получается, зачем сам веб-сервер заменяет несколько. Это ахти удобно, если нужно создать персональные веб-сайты пользователей или собственные узлы подразделений компании, например, develop.mycompariy.com. Сервер Apache дозволено настроить несколькими способами: либо так, чтобы запускался нераздельно сервер, какой-никакой бросьте заслушивать весь обращения к виртуальным серверам (такой вид настраивается близ помощи директивы VirtualHost), либо совать одинокий движение на каждого виртуального сервера (в этом случае применяются директивы Listen и Bind Address). В этом параграфе ваш покорнейший слуга буду считать главнейший вариант. Внутри блока директивы VirtualHost дозволено утилизировать любые директивы, не считая ServerType, BindAddress, Listen, NameVirtualHost, ServerRoot, TypesConfig, PidFile, MinRequestPerChild, MaxSpareServers, MinSpareServers, круглым счетом что отдельный с них относятся ко основному HTTP-серверу (например, ServerType), а кое-какие — ко второму варианту настройки виртуальных серверов да на этом месте неприемлемы. Обязательно должны присутствовать директивы ServerName, DocumentRoot, ServerAdmin и ErrorLog. В зависимости с версии равно с настроек Apache виртуальные узлы могут прописываться либо на файле httpd.conf, либо во файле vhosts .conf. Виртуальные серверы дозволено опознать объединение имени иначе говоря по части IPадресу.

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


LINUX: полное заведование

виртуальных серверов, равным образом около этом вы невыгодный потребуются дополнительные адреса. Такое если угодно вследствие использованию протокола НТТР/1.1. Данный запись поддерживается всеми современными браузерами. Поддержка виртуальных узлов обеспечивается директивами VirtualHost и NameVirtualHost. Если ваша учение имеет только лишь сам за себе IP-адрес, его нужно адресовать на директиве NameVirtualHost. Все блоки VirtualHost будут использовать нынешний IP-адрес. Внутри блока VirtualHost записывается команда ServerName, задающая доменное фамилия пользу кого создаваемого виртуального сервера. Ее обязательно нужно записать, с целью избежать поиска службой DNS — ваша сестра но безвыгодный хотите, дабы подле неудачном поиске несуществующий сервер был заблокирован? Другие директивы на блоках VirtualHost описывают формат каждого виртуального сервера на отдельности (листинг 06.10).

Листинг 06.10, Два виртуальных сервера — www равно lib ServerName den.dhsilabs.com <NameVirtualHost 092 .168.1. 0 <VirtualHost ServerName www.dhsilabs.com ServerAdmin DocumentRoot /var/httpd/www/html ErrorLog /var/https/www/logs/error.log TransferLog logs/access.log </VirtualHost> <VirtualHost ServerName lib.dhsilabs.com ServerAdmin DocumentRoot /var/httpd/lib/html ErrorLog /var/https/lib/logs/error.log TransferLog logs/access.log </VirtualHost>

Если ваша порядок имеет всего одиночный IP-адрес, посещение для основному серверу напрямую хорэ невозможен: нужно подсоединить его наименование (в примере www.dhsilabs.com) во состав виртуальных. Эти имена должны бытийствовать прописаны во службе DNS. При наличии двух IP-адресов дозволительно единодержавно присвоить основному серверу, а противоположный — виртуальному.

062


Глава 06. HTTP-сервер Apache

Сервер Apache позволяет эксплуатнуть изрядно доменных имен для доступа для одному серверу, например: ServerAlias www.dhsilabs.com www2.dhsilabs.com При этом запросы, посланные до IP-адресам, которые присвоены вашим виртуальным узлам, должны отвечать одному с указанных доменных имен. Чтобы укрепить запросы, неграмотный соответствующие ни одному из сих имен, нужно не без; через опции default:* сложить виртуальный узел, что полноте эксплуатировать такие запросы: <VirtualHost

default

:*>

06.9.2. Виртуальные серверы с идентификацией сообразно IP-адресу В директиве VirtualHost во качестве адресов допускается эксплуатнуть доменные имена, да кризис миновал указывать IP-адрес, вдобавок действительный, а не виртуальный. В этом случае ваш брат невыгодный будете находиться во власти через DNS около разрешении имени. Также потребуется единолично IP-адрес интересах вашего основного сервера. Если а расписать целое адреса среди виртуальными серверами, то нельзя полноте нахватать проход для основному серверу.

Листинг 06.11. Идентификация в области IP-адресу <VirtualHost 092.168.1.2> ServerName www.dhsilabs.com ServerAdmin DocumentRoot /var/httpd/www/html ErrorLog /var/https/www/logs/error.log </VirtualHost> <VirtualHost lib.dhsilabs.com> ServerName lib.dhsilabs.com ServerAdmin DocumentRoot /var/httpd/lib/html ErrorLog /var/https/lib/logs/error.log </VirtualHost>

При конфигурировании виртуальных серверов допускается использовать опцию ExecCGI, которая разрешает устройство CGI-сценариев на виртуальном сервере. Листинги 06.12 равно 06.13 демонстрируют настройку почтового веб-интерфейса.

063


LINUX: полное учебник

Листинг 06.12. Файл httpd.conf <Directory /home/httpd/mail> order deny,allow deny from all allow from localhost allow from 092.168 allow from 023.123.123.123 Options ExecCGI </Directory>

Листинг 06.13. Файл vhosts.conf <VirtualHost 023.123.123.123> ServerAdmin DocumentRoot /home/httpd/mail ServerPath /mail ServerName wwwmail.dhsilabs.com ErrorLog logs/error_log TransferLog logs/access_log # Error 003 — опечатка доступа извне, ведь вкушать почтовый # интерфейс хорош доступен только лишь изо локальной сети ErrorDocument 003 http://www.dhsilabs.com/messages/error403.html </VirtualHost>

06.10. SSL равно Apache 16.10.1. Установка SSL SSL (Secure Sockets Layer) является методом шифрования, разработанным компанией Netscape чтобы обеспечения безопасности передачи данных. Этот путь поддерживает до некоторой степени методов шифрования равным образом обеспечивает аутентификацию равно как в уровне клиента, этак равно сверху уровне сервера. SSL работает получи и распишись транспортном уровне равно оттого обеспечивает надежное шифрование всех типов данных. Более до мелочей относительно реализации SSL не возбраняется зацитировать бери сайте компании Netscape — h t t p : //home .netscape . com/info/security-doc.html. Протокол S-HTTP является покамест одним «безопасным» интернет-протоколом. Он был разработан про предоставления конфиденциальности данных, передаваемых сквозь соединение. Конфиденциальность нужна, например, подле передаче номеров кредитных карточек равным образом прочей важной информации. 464


Глава 06. HTTP-сервер Apache

Модуль mod_ssl реализует на сервере Apache экзина SSL, кто осуществляет зашифровывание только потока данных в лоне клиентом равно сервером. Для всех остальных частей веб-сервера часть mod_ssl является прозрачным. Для работы на этом режиме приходится браузер, подтверждающий устройство SSL (этому условию удовлетворяют целое распространенные сегодня браузеры). Что касается установки, в таком случае вас необходим набор OpenSSL ( h t t p : / /www. openssl. org), хотя, возможно, у вы на системе сейчас установлен текущий пакет (в современных дистрибутивах спирт устанавливается по мнению умолчанию). Если вы будете приумножать OpenSSL изо исходных текстов, так последовательность ваших действий такая: # t a r zxvf o p e n s s l - x . y . z . t a r . g z # x.y.z - штукенция версии # cd openssl-x.y.z # ./config. # make # make i n s t a l l # ldconfig Перед выполнением команды ldconfig убедитесь, в чем дело? во файле / e t c / I d . s o . conf прописан маршрут ко библиотекам OpenSSL (по умолчанию сие / u s r / l o c a l / s s l / l i b ) .

06.10.2. Подключение SSL для Apache Версия mod_ssl, которую вы нужно установить, должна фигурировать совместима с вашей версией Apache, не то устройство mod_ssl хорош некорректно корпеть либо общий откажется что-либо делать. Последние цифры во названии модуля указывают сверху непротиворечивость со определенной версией Apache. Например, для того Apache 0.3.14 нужен обложка mod_ssl-2.7.1-1.3.14.tar.gz. Для сборки mod_ssl изо исходных текстов выполните команду: #./configure —with-apache=https://issuu.com/apache_l.3.14 —with-ssl=https://issuu.com/cpenssl-0.9.5 В данном примере автор использую OpenSSL O.9.5. Теперь перейдите во каталог с Apache, откомпилируйте его равно установите сертификат: # # # #

cd https://issuu.com/apache-1.3.14 make make certificate make install

Таким образом ваша сестра установите Apache на каталог, предуказанный во опции -prefix (по умолчанию /usr/local/apache).

065


LINUX: полное заведование

Теперь попробуйте не заботиться Apache. Это позволено содеять со помощью команды: # usr/local/apache/bin/apachectl startssl

Параметр startssl необходим про включения SSL. Сервер Apache уже функционирует, всё-таки использовать за протоколу HTTPS ваша сестра до этого времени не можете. Для сего вас нужно сконфигурировать виртуальные узлы, которые будут утилизировать запись HTTPS. Но в целях начатки необходимо настроить Apache с целью прослушивания порта 043 (это штампованный порт для протокола HTTPS). Добавьте на обложка / e t c / h t t p d / c o n f / h t t p d . conf следующие строки: Listen 043 NameVirtualHost x.x.x.x:443

Теперь напрямую приступите ко созданию виртуального сервера, работающего сообразно протоколу HTTPS, на что такое? продолжите редактирование файла /etc/httpd/conf /httpd. conf. Пример того, что такое? нельзя не при этом ввести, приведен на листинге 06.14. После сих обязательных директив вы можете настроить нестандартный кажущийся агрегат вроде обычно. Листинг 06.14. Виртуальный HTTPS-сервер <VirtualHost x.x.x.x:443> # Эти строки нужны чтобы поддержки SSL SSLEngine on SSLLogLevel warn SSLOptions +StdEnvVars SSLCertificateFile /usr/local/apache/conf/ssl.crt/server. crt SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key SSLLog /usr/local/apache/logs/ssl_engine_log # ServerName www.dhsilabs.com ServerAdmin DocumentRoot /var/httpd/www/html ErrorLog /var/https/www/logs/error.log </VirtualHost>

Теперь нужно перезапустить сервер httpd. При запуске Apache потребует ввести пароль. Если ваш брат отнюдь не хотите включать его около каждом запуске системы, так перейдите на каталог, идеже находится обложка s s l .key, равно выполните следующие команды: 466


Глава 06. HTTP-сервер Apache # ср server.key server.key.org # openssl rsa -in server.key.org -out server.key # chmod 000 server.key

Почти совершенно готово! Теперь сервер невыгодный обязан высоко оценивать слово да будет работать во нормальном режиме. Чтобы Apache объединение умолчанию стартовал не без; поддержкой SSL, исправьте в файле a p a c h e c t l (он устанавливается во кадастр /bin, / s b i n или /usr/sbin, см. rpm - q l <пакет_Араспе>) критерий start получай startold, a startssl для без труда start. Затем, находясь на каталоге / u s r / l o c a l / b i n , установите ссылку openssl: # In -s /usr/local/ssl/bin/openssl openssl

06.10.3. Генерирование сертификатов Сертификат гарантирует безопасное включение ко веб-серверам и/или удостоверяет субъект владельца. Идентификация обеспечивается путем применения личного ключа, известного всего только пользователю данной системы. Когда ламер посещает неприкосновенный шарнир к передачи секретной информации (например, номеров кредитных карточек) по протоколу HTTPS, соединение механично посылает ему сертификат. Итак, давайте приступим ко генерированию сертификатов. Для этого сначала выполните команду: # openssl genrsa -des3 -out server.key 0024

Она создаст обложка server.key. После сего вам должны вручить запрос в службу верификации: # openssl req -new -key server.key -out s e r v e r . c s r Здесь вы придется парировать получай вопросы. Если ваш брат ошибетесь — ничего страшного, целое позволяется хорошенького понемножку сделать еще раз заново. В фолиант случае, разве запрос сгенерирован правильно, ваш брат должны выудить такую надпись: You now have to send this Certificate Signing Request (CSR) to a Certifying Authority (CA) for signing

Отвечая сверху вопросы, будьте адски внимательны — ваши ответы увидит весь мир. По во всем правилам ваш брат неотложно должны уговорить договор у сертифицирующей организации. Это заслуга платная, равным образом оказывает ее шатия ThawTe (www. t h a w t e . com), которую во России представляет www. s o l u t i o n s . rbc . ru. Бесплатно ваша милость можете нахватать всего лишь «самоподписанный» сертификат. Скопируйте s i g n , sh изо пакета mod_ssl в каталог от ключами равно подпишите себя сами: 467


LINUX: полное управление

# openssl req -new -x509 -days 065 -key server.key -out server.csr #./sign.sh server.csr Если нате экране появится надпись Now you have two f i l e s : server.key and server.crt. These now can be used as following то сие означает, ась? всегда собрано правильно. Затем скопируйте новые файлы s e r v e r . key да s e r v e r . c r t возьми луг старых. Выполните команду make во каталоге из .crt-файлом. В итоге вас получайте сполна шабашничающий Apache, неприкосновенный SSL. Для сбора полной информации об работе SSL введите: # openssl

s_client

-connect l o c a l h o s t : 0 0 0

-state

-debug

06.11. Пример файла httpd.conf В этом параграфе приведен прототип стандартной конфигурации сервера Apache. Каждому блоку листинга 06.15 сопутствуют комментарии, которые помогут вы разобраться от различными настройками сервера. Листинг 06.15. Пример файла h t t p d . c o n f ## ## httpd.conf -- обложка конфигурации сервера HTTP Apache ## # Установите кличка сервера ServerName www.dhsilabs.com ResourceConfig / d e v / n u l l AccessConfig / d e v / n u l l # # # # # # # # # # #

068

Поддержка динамических разделяемых объектов (Dynamic Shared Object - - DSO) Для паче подробной информации по части DSO прочтите файл README.DSO, входящий во дистрибутив Apache. Модуль расширяет внутренние резервы сервера Apache, добавляет во его смесь новые функции. Подключить устройство позволительно так LoadModule foo_module libexec/mod_foo.so Вы можете откопать документацию до модулям во файле "/var/www/manual/mod"


Глава 06. HTTP-сервер Apache #LoadModule mmap_static_module modules/mod_iranap_static.so LoadModule env_module modules/mod_env.so ### The first module activates buffered logs. # Первый часть обеспечивает протоколирование. # Он запишет информацию # во документ access_log, нет-нет да и бампер объемом 0К # переполнится. #LoadModule config_buffered_log_module modules/mod_log_ config_buffered.so LoadModule config_log_module modules/mod_log_config.so LoadModule agent_log_module LoadModule referer_log_module #LoadModule mime_magic_module LoadModule mime_module LoadModule negotiation_module LoadModule status_module LoadModule info_module

modules/mod_log_agent.so modules/mod_log_referer.so modules/mod_mime_magic.so modules/mod_mime.so modules/mod_negotiation.so modules/mod_status.so modules/mod_infо.so

# Вы должны подобрать директиву mod_include # или — или mod_include_xssi, # да неграмотный обе одновременно! Директива mod_include более # безопасна, однако xxsi охватывает чище функций. LoadModule includes_module modules/mod_include.so #LoadModule includes_module modules/mod_include_xssi.so LoadModule autoindex_module LoadModule dir_module LoadModule cgi_module LoadModule asis_module LoadModule imap_module LoadModule action_module #LoadModule speling_module LoadModule userdir_module LoadModule proxy_module LoadModule alias_module

modules/mod_autoindex.so modules/mod_dir.so modules/mod_cgi.so modules/mod_asis.so modules/mod_imap.so modules/mod_actions.so modules/mod_speling.so modules/mod_userdir.so modules/libproxy.so modules/mod alias.so

# Модуль. mod_jserv в долгу бытийствовать объявлен впредь до mod_rewrite. <IfDefine HAVE_JSERV> LoadModule jserv_module modules/mod_jserv.so </IfDefine> LoadModule rewrite_module LoadModule access_module LoadModule auth module

modules/mod_rewrite.so modules/mod_access.so modules/mod auth.so

069


LINUX: полное инструкция

LoadModule anon_auth_module #LoadModule dbm_auth_module #LoadModule db_auth_module LoadModule digest_module #LoadModule cern_meta_module LoadModule expires_module LoadModule headers_module LoadModule usertrack_module #LoadModule example_module #LoadModule unique_id_module LoadModule setenvif_module

modules/mod_auth_anon.so modules/mod_auth_dbm.so modules/mod_auth_db. so modules/mod_digest. so modules/mod_cern_meta.so modules/mod_expires.so modules/mod_headers.so modules/mod_usertrack.so modules/mod_example.so modules/mod_unique_id.so modules/mod_setenvif . so

# В полном списке модулей должны являться перечислены все # доступные модули (статические либо разделяемые) # во правильном порядке выполнения. ClearModuleList # AddModule mod_mmap_static.с # AddModule mod_php.c # AddModule mod_php3.с # AddModule mod_php4.с # AddModule mod_perl.c # LoadModule php_module modules/mod_php.so # LoadModule php3_module modules/mod_php4.so # LoadModule php4_module modules/mod_php4.so AddModule mod_env.c AddModule mod_log_config.с #AddModule mod_log_config_buffered.с AddModule mod_log_agent.с AddModule mod_log_referer.с #AddModule mod_mime_magic.c AddModule mod_jnime. с AddModule mod_negotiation.с AddModule mod_status.с AddModule mod_info.c AddModule mod_include.с #AddModule mod_include_xssi.с AddModule mod_autoindex.с AddModule mod_dir.c AddModule mod_cgi.c AddModule mod_asis.c AddModule mod_imap.с AddModule mod_actions.с #AddModule mod_speling.с AddModule mod_userdir.с AddModule mod_proxy.с AddModule mod_alias.c 470


Глава 06. HTTP-сервер Apache # Модуль mod_jserv полагается фигурировать объявлен перед mod_rewrite. <IfDefine HAVE_JSERV> AddModule mod_j serv.с </IfDefine> AddModule mod_rewrite.c AddModule mod_access.c AddModule mod_auth.c AddModule mod_auth_anon.с #AddModu1e mod_auth_dbm.с ttAddModule mod_auth_db.с AddModule mod_digest.c ttAddModule mod_cern_meta.c AddModule mod_expires.с AddModule mod_Jieaders.с AddModule mod_usertrack.с ttAddModule mod_example.c #AddModule mod_unique_id.с AddModule mod_so.c AddModule mod_setenvif.с # # # # # # #

Name Space and Server Settings Настройки пространства имен равным образом сервера В этом разделе ваш брат определяете, какие имена будут видеть пользователи вашего HTTP-сервера. Этот обложка также определяет настройки сервера, которые вначале содержались на отдельном файле srm.conf. Теперь сей обложка входит во ансамбль httpd.conf

# Директива DocumentRoot определяет местонахождение # корневого каталога документов вашего сервера. DocumentRoot

/var/www/html

# Директива UserDir задает названия подкаталога на домашнем # каталоге пользователя, изо которого берутся документы в # волюм случае, эпизодически вам активизируете возможность # использования пользовательских каталогов. UserDir public_html # Директива Directorylndex позволяет расправиться название # документа, тот или иной будет # возвращен сообразно запросу, тот или иной безвыгодный охватывает фамилия документа. Directorylndex index.html index.php index.htm index.shtml index.cgi Default.htm default.htm index.php3

071


LINUX: полное управление

# Директива Fancylndexing определяет оформление # каталога — стандартное либо — либо индексируемое. Fancylndexing on # Директивы Addlcon* указывают серверу, какие пиктограммы #. проэксплуатировать чтобы показа различных типов файлов AddlconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip AddlconByType AddlconByType AddlconByType AddlconByType Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon Addlcon

(TXT,/icons/text.gif) text/* (IMG,/icons/image2.gif) image/* (SND,/icons/sound2.gif) audio/* (VID,/icons/movie.gif) video/*

/icons/binary.gif .bin .exe /icons/binhex.gif .hqx /icons/tar.gif .tar /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv /icons/compressed.gif .Z .z .tgz .gz .zip /icons/a.gif .ps .ai .eps /icons/layout.gif .html .shtml .htm .pdf /icons/text.gif .txt /icons/c.gif .c /icons/p.gif .pi .py /icons/f.gif .for /icons/dvi.gif .dvi /icons/uuencoded.gif .uu /icons/script.gif .conf .sh .shar .csh .ksh .tcl /icons/tex.gif .tex /icons/bomb.gif core /icons/back.gif .. /icons/hand.right.gif README /icons/folder.gif ""DIRECTORY"-4 ТЛ Л /icons/blank.gif ""BLANKICON'

# Директива Defaultlcon определяет пиктограмму # в области умолчанию. Defaultlcon /icons/unknown.gif # Директива AddDescription задает отображение файла # Формат: AddDescription "описание" filename # Директива ReadmeName определяет фамилия файла README # сообразно умолчанию # Формат: ReadmeName name 472


Глава 06. HTTP-сервер Apache

ReadmeName README HeaderName HEADER # Директива Indexlgnore определяет укомплектование файлов, которые # будут проигнорированы около индексировании # Формат: Indexlgnore namel name2... Indexlgnore . ??* *~ *# HEADER* README* RCS # Директива AccessFileName определяет фамилия файла, содержащего # директивы управления

доступом

AccessFileName .htaccess # Директива TypesConfig задает местонахождение # файла mime.types TypesConfig /etc/httpd/conf/apache-mime.types # С через директивы DefaultType позволительно указать # MIME-тип по части умолчанию с целью документов, образец которых # сервер ввести далеко не может DefaultType text/plain # Директива AddEncoding разрешает браузеру распаковывать # информацию "на лету" AddEncoding x-compress Z AddEncoding x-gzip gz # AddLanguage разрешает ассигновать язычище документа AddLanguage en .en AddLanguage fr . fr AddLanguage de .de AddLanguage da .da AddLanguage el .el AddLanguage it .it # Директива LanguagePriority определяет преимущество языков LanguagePriority en fr de # # # # #

Директива Redirect позволяет переслать клиента на новый URL. Вы можете переслать клиента на второй блок alias для URL, кой находится во вашем пространстве имен, так очищать нате документ, который находится на одном изо подкаталогов каталога 473


LINUX: полное справочник

# # # # # # # # # #

DocumentRoot. Вы неграмотный можете, например, перенаправить клиента для каталогу /etc, поелику зачем спирт не находится на вашем пространстве имен. URL - сие идентификатор ресурса, следственно ваша сестра должны его направлять на виде протокол://адрес.домен, например, http://www.linux.ru. Если ваш брат укажете без труда каталог, например, /images, этот каталог надо бытийствовать подкаталогом каталога DocumentRoot, а малограмотный корневого каталога вашей главный файловой системы. Формат: Redirect несуществующий_иг1 url

# # # #

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

# Alias несуществующее_имя нормальное_имя Alias /icons/ /var/www/icons/ # ScriptAlias определяет месторасположение каталога сценариев CGI # Формат: ScriptAlias подставное_имя настоящее_имя ScriptAlias /cgi-bin/ /var/www/cgi-bin/ ScriptAlias /protected-cgi-bin/ /var/www/protected-cgi-bin/ # С через директивы AddType допускается присыпать новый # субъект MIME, что невыгодный указан на файле apache-mime.types. # Формат: AddType type/subtype extl # Обычно про модуля РНР4 (он малограмотный является немного Apache) # команда AddType используется так: AddType application/x-httpd-php4 .php3 .phtml .php .php4 # AddType application/x-httpd-php3-source .phps # Для PHP/FI (PHP2): # AddType application/x-httpd-php .phtml # ScriptAlias /_php/ /usr/bin/php # Action application/x-httpd-php /usr/bin/php # Action application/x-httpd-php3 /usr/bin/php # Action application/x-httpd-php4 . # Директива AddHandler позволяет сопоставить # определенному типу MIME какой обработчик. # Формат: AddHandler action-name extl # Для использования сценариев CGI: AddHandler cgi-script .cgi

074


Глава 06. HTTP-сервер Apache # Для использования генерируемых сервером файлов HTML AddType text/html .shtml AddHandler server-parsed .shtml # Раскомментируйте нижерасположенную строку, # с намерением привнести функцию # Apache "отправь-как-есть" (send-as-is) #AddHandler send-as-is asis # Если вас хотите пустить в дело карточная игра изображений: AddHandler imap-file map # Для включения карт типов используйте: #AddHandler type-map var # # # # # #

С через директивы Action не грех определить какое-нибудь выходка с целью обработчика. Например, вы можете привести в действие какую-нибудь программу для обработки файла данного типа. Формат: Action media/type /cgi-script/location Формат: Action handler-name /cgi-script/location

# # # #

Директива MetaDir определяет термин каталога, на котором сервер Apache может отрыть информационные файлы meta. Эти файлы содержат дополнительные заголовки HTTP, которые будут добавлены для документу

# пизда его передачей клиенту. #MetaDir .web # Директива MetaSuffix определяет наименование суффикса файла, # кой содержит # meta-тэги. #MetaSuffix .meta # # # # # # # # # #

Здесь позволяется ввести сведения об ошибках. Это позволено содеять тремя способами: 1) вседневный текст. Символ "кавычка" обозначает текст и клиенту отнюдь не посылается ErrorDocument 000 "Ошибка сервера. 2) локальное пересылка держи счет иначе сценарий ErrorDocument 004 /missing.html ErrorDocument 004 /cgi-bin/missing_handler.pi 475


LINUX: полное заведование

# # # # # # #

0) внешнее перенаправление ErrorDocument 002 http://some.other_server.com/ subscription_info.html Модуль mod_mime_magic позволяет серверу использовать различные подсказки с файла про определения его типа. MimeMagicFile /etc/httpd/conf/magic

# Следующие директивы необходимы интересах браузеров Netscape 0.x и # Internet Explorer 0.0Ь2 BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 0\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 # Следующие директивы отключают ответы HTTP/1.1 пользу кого браузеров, # которые отнюдь не поддерживают документ НТТР/1.1 BrowserMatch BrowserMatch browsегмасen BrowserMatch BrowserMatch

"RealPlayer 0\.0" force-response-1.0 "Java/l\.O" force-response-1.0 java/±\.u rorce-respons "JDK/1\.O" force-response-1.0 "JDK/1\.O" force-response

#

Настройки доступа

# В этом разделе определяются настройки сервера, # которые управляют доступом ко серверу. Раньше эти # настройки находились во файле access.conf. # # # # # #

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

# Прежде всего делов конфигурируем корневой каталог # к установки полномочий доступа. <Directory /> Options Indexes Includes FollowSymLinks AllowOverride None </Directory> <Directory /home> # Здесь должны фигурировать определены директивы "Includes", # "FollowSymLinks", "ExecCGI", "MultiViews" иначе любая 476


Глава 06. HTTP-сервер Apache

# сочленение "Indexes" Options Indexes Includes FollowSymLinks AllowOverride All # Разрешает ход всем order allow,deny allow from all </Directory> # Каталоги /var/www/cgi-bin да /var/www/protected-cgi-bin # должны фигурировать определены от через директивы ScriptAliased <Directory /var/www/cgi-bin> AllowOverride All Options ExecCGI </Directory> <Directory /var/www/protected-cgi-bin> order deny,allow deny from all allow from localhost #allow from .your_domain.com AllowOverride None Options ExecCGI </Directory> # Разрешает отчеты что касается состоянии сервера <Location /server-status> SetHandler server-status order deny,allow deny from all allow from localhost, 027.0.0.1 # Установите тогда отчество вашего домена # allow from .your_domain.com </Location> # Разрешает подход для файлам документации пользу кого локальной машины. Alias /doc /usr/share/doc <Directory /usr/share/doc> order deny,allow 477


LINUX: полное учебник

deny from all allow from localhost, 027.0.0.1 # allow from .your_domain.com Options Indexes FollowSymLinks </Directory> #

Конфигурация сервера

# Тип сервера: inetd сиречь standalone. ServerType standalone # Если ваша милость используете разряд inetd, перейдите # для директиве "ServerAdmin" # # # # # # # # #

Директива Port - только лишь на standalone-сервера. Если ваша сестра хотите запустить сервер Apache из использованием сего либо любого другого порта, номер которого дешевле 0024, вам должны являться носителем правами суперпользователя. Но даже коли у вы кто в отсутствии таких прав, ваша милость можете запустить сервер к работы не без; портом, штукенция которого превышает значение 0024. Обычно используется

# пункт 0080 иначе 0000. Port 00 # Сервер Apache ведет кондуит доступа других компьютеров. # Если вам включите следующую опцию, в таком случае на записи будет # фиксировано доменное титул компьютера-клиента. Если эта # опция выключена, в таком случае на журнальчик короче записан IP-адрес # клиента. Включение данной опции замедляет работу # сервера, эдак как бы ему должно дополнительное время # сверху виды ответа с сервера DNS. HostnameLookups off # # # # # # #

Директивы User равно Group определяют идентификаторы пользователя да группы, ото имени которых запускается сервер на автономном режиме. Можно эксплуатировать как регистрационные имена, приближенно равным образом UID. По умолчанию используется термин пользователя nobody либо — либо apache. Из соображений безопасности невыгодный рекомендуется изменять это роль равно завладевать псевдоним реального пользователя.

User apache 478


Глава 06. HTTP-сервер Apache

Group apache # Директива ServerAdmin задает электронный местожительство веб# мастера вашего веб-узла. В случае возникновения ошибок # вот поэтому и есть в соответствии с этому адресу довольно отправлено сообщение. ServerAdmin root@localhost # В директиве ServerRoot указывается местонахождение # файлов конфигурации сервера Apache. По умолчанию # используется оглавление /etc/httpd. ServerRoot /etc/httpd # # # # #

Следующая предписание используется чтобы компьютеров, которые имеют ряд IP-адресов. Обычно данная директива используется чтобы конфигурирования виртуальных узлов. BindAddress *

# Прослушивать речные ворота 00 Listen 00 # # # #

Директивы ErrorLog равным образом TransferLog определяют расположение журналов сервера Apache. Обычно используется каталог /etc/httpd/logs, что является ссылкой сверху каталог /var/log/httpd или — или возьми какой приглянется другой.

ErrorLog logs/error_log # # # #

LogLevel: устанавливает высота протоколирования. Протоколируются предупреждающие сведения сервера (warn) и ошибки. Если вам хотите записывать исключительно ошибки, установите error

LogLevel warn # Определяет объем файлов протокола, так кушать информацию, # которая довольно протоколироваться. Обычно менять эти # значения безвыгодный нужно. LogFormat "%h %1 %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %1 %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent

079


LINUX: полное вождь

# Можно установить образ протокола # Если ваш брат хотите записывать общую информацию #CustomLog logs/access_log common # Если ваша милость хотите записывать referer #CustomLog logs/referer_log referer # Если вас хотите регистрировать наименование пользовательских # агентов (браузеров) #CustomLog logs/agent_log agent # По умолчанию используется комбинированный тип # протоколирования, ведь есть # полноте записываться весь информация CustomLog logs/access_log combined # С через директивы PidFile указывается кличка файла, в # котором исходный # слушание сервера полноте регистрироваться. PidFile /var/run/httpd.pid # ScoreBoardFile: Этот обложка используется к сохранения # внутренней информации процесса сервера. ScoreBoardFile /etc/httpd/httpd.Scoreboard # Директива LockFile определяет обложка блокировки, который # используется сервером. Сервер потребно бытийствовать скомпилирован # из опцией # USE_FCNTL_SERIALIZED_ACCEPT или # USE_FLOCK_SERIALIZED_ACCEPT. Файл блокировки полагается быть # сохранен НА ЛОКАЛЬНОМ ДИСКЕ. # LockFile /etc/httpd /httpd.lock ServerName new.host.name # Директива UseCanonicalName появилась во версии # Apache 0.3. Она разрешает # утилизировать каноническое титул пользу кого сервера узла. UseCanonicalName on # # # # 480

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


Глава 06. HTTP-сервер Apache

CacheNegotiatedDocs # # # # #

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

Timeout 00 0 # Директива KeepAlive разрешает постоянные соединения, # в таком случае снедать такие соединения, на которых производится более # одного запроса следовать единовластно раз. KeepAlive off # MaxKeepAliveRequests: Максимальное часть запросов, # разрешенное на процесс постоянного соединения. Установите # 0 интересах снятия ограничения. MaxKeepAliveRequests 000 # Директива KeepAliveTimeout # постоянного соединения.

определяет таймаут интересах

KeepAliveTimeout 05 # Минимальное да максимальное численность серверов на очереди MinSpareServers 0 MaxSpareServers 00 StartServers 00 # Ограничивает точка соприкосновения величина клиентов. Когда сие число # хорэ превышено,новые клиенты получат отказ, оттого это # наличность невыгодный необходимо являться очень маленьким. MaxClients 050 # После обработки определенного количества запросов, # указанного на директиве MaxRequestsPerChild, копия # сервера завершается, а возмещение нее запускается новая. MaxRequestsPerChild 00 0 # Директивы конфигурации прокси-сервера # ProxyRequests On 16 Зак. 088

081


LINUX: полное заведование

# Для включения кэширования раскомментируйте строки ниже: # CacheRoot /var/cache/httpd # CacheSize 0 #. CacheGcInterval 0 # CacheMaxExpire 04 # CacheLastModifiedFactor 0.1 # CacheDefaultExpire 0 # NoCache a_domain.com another_domain.edu joes.garage_sale.com #################################### # Настройки производительности SGI # #################################### # # Для использования этой функции раскомментируйте модуль # mod_mmap_static во разделе описания модулей. <IfModule mod_mmap_static.о QSC on </IfModule> # Если ваша милость хотите проэксплуатировать буферизированное # протоколирование, раскомментируйте модуль # mod_log_config_buffered во разделе описания модулей. # # # # # # # # # #

#

Для использования карточная игра памяти раскомментируйте эту строку: mmapfile /var/www/html/file_to_map_in_memory Если вас хотите настроить процессы-потомки, пожалуйста, прочитайте документацию возьми вашем сервере http://localhost/manual/misc/perf-mja.html. Эта лист объясняет, во вкусе привязать определенный IP-адрес alias пристань ко другому процессору. SingleListen On #

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

#

# Виртуальные серверы # #################################### # # Поддержка модуля perl # Замечание: безвыгодный удаляйте расположенные кроме строки, # если сие может развалить вашу конфигурацию. <IfDefine PERLPROXIED> ProxyPass /perl/ http://127.0 . 0.1: 0200/ ProxyPassReverse /perl/ http://127.0.0.1:8200/ </IfDefine>

082


Глава 06. HTTP-сервер Apache

# Файл, на котором находятся директивы конфигурирования # виртуальных узлов. Include conf/vhosts/Vhosts.conf # # # # # # # #

Для поддержки динамических виртуальных узлов и виртуальных домашних каталогов, раскомментируйте следующие строки: LoadModule vhost_alias_modulemodules/mod_yhost_alias.so AddModule mod_vhost_alias.с Include conf/vhosts/DynamicVhosts.conf Include conf/vhosts/VirtualHomePages.conf

# Директивы конфигурирования PHP Include conf/addon-modules/php.conf

06.12. Перекодирование русскоязычных документов «на лету» С тех пор, когда-никогда на русском языке появилось речь «кодировка», появилась и засада перекодировки. Стандартной кодировкой русского языка для большинства UNIX-серверов является K0H8-R. Для применения на DOS компания Microsoft разработала альтернативную кодировку (ALT), известную равным образом подина названием СР-866. Потом та но Microsoft создала кодировку Windows-1251 (ANSI), нежели обеспечила проблемы не без; перекодировкой сделано получай локальном уровне: файлы, созданные во DOS, без участия предварительного перекодирования не позволяется было прочитать во Windows, да наоборот. Заметьте, об Интернете да Apache я еще далеко не сказал ни слова. Кроме Microsoft, «облегчили» нам житьё-бытьё тоже компании Apple равно Sun, разработав соразмерно кодировки Apple равно ISO8859-5. Компания IBM не отстала с них, разработав собственную кодировку русского языка. В Интернете до сей времени сии кодировки смешались. Возникает задача: настроить автоматическое перекодирование документов с одной кодировки в другую. Для азбука нуждаться настроить пусть бы бы перекодирование «на лету» с KOI8 во Windows-1251, эдак вроде относительная клиентов в Сети используют как эту кодировку (от Windows, в духе через смерти, не уйдешь).

083


LINUX: полное управление

06.12.1. Russian Apache: установка, настройка, использование Обыкновенный англоязычный Apache, вмещающийся на ансамбль большинства дистрибутивов, никак не поможет вы принять решение эту проблему. Для корректных операций за перекодированию нужно погрузить да назначить сервер Russian Apache alias часть Apache-RUS. Скачать во вкусе модуль, приближенно да готовый сервер позволяется объединение адресу: f t p : / / a p a c h e . l e x a . r u / p u b / a p a c h e - r u s . При этом старшая пакет версии соответствует оригинальному серверу Apache, младшая — версии модуля Apache-Rus. Рассматривать течение установки да настройки аз многогрешный буду нате примере безграмотный очень новой версии сервера — 0.3.3/PL27.3, сие безвыгодный принципиально. Последовательность действий в целях сборки сервера с исходных кодов стандартная: # t a r xvzf apache_l.3.3rusPL27.3.tar.gz # # # #

cd apache_1.3.3rusPL27.3 ./configure make make i n s t a l l

Настройка Russian Apache малограмотный отличается через настройки оригинального Apache после исключением настройки модуля перекодирования.

06.12.2. Настройка перекодировки русскоязычных документов Директивы перекодирования (они находятся на файле h t t p d . conf) можно разделить возьми три группы. Первые указывают, на который-нибудь кодировке хранятся файлы получи диске. Их можно вливать во устройство Location тож на файлы . h t a c c e s s : # целое файлы, сверх того . t x t , хранятся во кодировке koi8-r CharsetSourceEnc koi8-r # однако файлы .txt хранятся на кодировке windows-1251 CharsetByExtension windows-1251 . t x t

Вторые определяют названия (CharsetDecl) равно псевдонимы (CharsetAlias) кодировок равно таблиц символов (CharsetRecodeTable равно CharsetWideRecodeTable). Они находятся на блоке <IfModule mod_charset.c> ... <^fModule> равным образом безвыгодный требуют изменений. Название языка (ru) требуется быть определено во директивах AddLanguage равным образом LanguagePriority. CharsetDecl windows-1251 ru CharsetAlias windows-1251 win x-cpl251 cpl251 cp-1251

084


Глава 06. HTTP-сервер Apache

С через третьей, самой многочисленной, группы ваша милость можете настроить сервер на автоматической перекодировки символов получай основании информации в отношении клиенте. Например, определив, что-то жертва работает в операционной системе Windows равным образом кодировкой браузера соответственно умолчанию является Windows-1251, сервер единовластно перекодирует файлы в нужную кодировку. Если сервер сделает одно изо двух неправильно, пользователь всегда сможет самоуправно модифицировать кодировку вручную. Существует три способа выбора кодировки: • в области каталогу: http://www.server.ru/koi/file.html http://www.server.ru/win/file.html • согласно имени сервера: http://koi.www.server.ru/file.html http://win.www.server.ru/file.html • по части порту: http://www.server.ru:8000/file.html http://www.server.ru:8001/file.html Для перекодирования по мнению каталогу (точнее, в области его префиксу) нужно подложить на блоке VirtualHost псевдоним, например: Alias /koi /www/docs Или а прямо-таки сотворить во нужном каталоге ссылку сверху самого себя: # cd /www/docs # In -s . koi Несмотря получи свою простоту, таковой сноровка имеет много недостатков. Если у вам мелкий сервер, ваша милость можете истощить перекодировку по каталогу. В другом случае скорее используйте перекодировку по мнению имени сервера либо по части порту. При использовании перекодировки соответственно имени сервера пристало обратить внимание получи и распишись то, дабы предуказанный вами сервер был прописан получай сервере DNS. После регистрации поддомена (в качестве имени которого нужно использовать сам с псевдонимов кодировки, предначертанный вместе с через директивы CharsetAlias, например, koi иначе говоря win) внесите следующие строки в ваш обложка h t t p d . conf: # Естественно, укажите в этом месте нестандартный IP-адрес <VirtualHost i l l . i l l . 0 0 0 . 0 > ServerName www.server.ru ServerAlias *.www.server.ru # дальше должно обычная конфигурация </VirtualHost 485


LINUX: полное справочник

Если сервер DNS администрируете далеко не ваша сестра равным образом внутренние резервы показать новый поддомен у вы нет, ведь используйте перекодировку по части порту. Для этого закомментируйте директиву Port во файле h t t p d . conf да наместо нее добавьте следующие директивы: Listen 00 Listen 0000 Listen 0001 Listen 0002 Listen 0003 CharsetByPort CharsetByPort CharsetByPort CharsetByPort

koi8-r 0000 windows-1251 0001 ibm866 0002 iso-8859-5 0003

Номера портов около этом невыгодный ахти важны. Правда, питаться одна неприятность: кабы вентерь клиента защищена брандмауэром, невыгодный позволяющим обращаться для выбранному вами порту, клиентела никак не сможет определить связывание вместе с вашим сервером. Схема (порядок) выбора кодировки определяется директивой CharsetSelectionOrder: • CharsetSelectionOrder Dirprefix Useragent Portnumber Hostname UriHostname.— интересах выбора объединение каталогу; • CharsetSelectionOrder Hostname UriHostname Useragent Portnumber Dirprefix — про выбора за имени домена; • CharsetSelectionOrder Portnumber Useragent Hostname UriHostname Dirprefix — в целях выбора в соответствии с порту.

06.13. Защита сервера Apache По окончании настройки сервера запретим модифицирование да смахивание файла конфигурации: [root@webserver]# c h a t t r +i /etc/httpd/conf/httpd.conf После сего ваш брат (и пустое место другой) безвыгодный сможете реформировать таковой обложка пусть даже с помощью конфигуратора. Желательно да учредить полномочия 011 интересах исполняемого файла сервера httpd: # chmod 011 /usr/sbin/httpd

086


Глава 06. HTTP-сервер Apache

Далее, неграмотный нужно, с тем посторонние глазищи смогли посмотреть, а обрезки — изменить (и выполнить) файлы, находящиеся на каталогах / e t c / h t t p d / conf равно /var/log/httpd:

# chmod 000 /etc/httpd/conf/ # chmod 000 /var/log/httpd /

06.14. Сервер kHTTPd веб-сервер уровня ядра В операционной системе безвыездно процессы дозволено разъединить держи двойка типа: процессы уровня ядра равным образом пользовательские процессы. Процесс уровня ядра запускается равно работает беда бойко объединение сравнению вместе с относительно неповоротливым пользовательским процессом. Однако пользовательские процессы безопаснее для того здоровья системы, чем процессы уровня ядра. Если произойдет ляпсус во пользовательском процессе, так получи работе системы сие случай не заманить кого куда и калачом малограмотный отразится. А оплошность во процессе уровня ядра чревата «крахом» системы, тот или другой вы обойдется в много раз дороже, нежели прирост сверху быстродействии процесса уровня ядра. Процессы уровня ядра позволяют имеет первостепенное значение умножить плодотворность веб-сервера, в таком случае лакомиться быстрота обработки HTTP-запросов. Начиная с версии ядра 0.4, на ансамбль ядра входит веб-сервер kHTTPd. Скорость его работы стократ больше скорости веб-сервера Apache, который выполняется во вкусе пользовательский процесс.

06.14.1. Настройка kHTTPd Так вроде kHTTPd является процессом уровня ядра, его отрегулирование выполняется хорошенечко дневник информации во файлы, хранящиеся на каталоге /proc/sys/net/khttpd. Сначала нужно перекомпилировать опора (этому процессу посвящена отдельная глава), включив во его смесь kHTTPd. Для сего включите опцию Kernel HTTPd Acceleration на список Network Options. После сего нужно настроить веб-сервер Apache про работы объединение порту 8080 (директива Port на файле h t t p d . conf) равным образом перезапустить его: # service httpd restart Загрузите устройство ядра khttpd: # insmod khttpd

Укажите серверу kHTTPd, что-то требования клиентов нужно обрабатывать через морские ворота 00, а те запросы, от которыми симпатия малограмотный может справиться, уполномочивать Apache: 487


LINUX: полное администратор

# echo 00 > /proc/sys/net/khttpd/serverport # echo 0080 > /proc/sys/net/clientport

Какие требования невыгодный может взбутетенить kHTTPd? Ему «не согласно зубам» запросы, предполагающие пуск сценария. Все такие требования будут перенаправлены Apache. Поэтому, разве ваш веб-сервер предполагает на основном запуск CGI-сценариев (в часть числе равным образом PHP-сценариев), использовать kHTTPd нецелесообразно. Вместо повышения производительности вы добьетесь обратного. Сообщите серверу kHTTPd, идеже нужно ловить веб-страницы (в томик же каталоге, который-нибудь указан во директиве DocumentRoot сервера Apache): # echo /var/www/html > /proc/sys/net/khttpd/documentroot

Если сверху вашем сервере установлен РНР, укажите каталог, во котором хранятся РНР-сценарии: # echo /var/www/html/scripts > /proc/sys/net/khttpd/dynamic

Для запуска kHTTPd введите следующую команду: # echo 0 > /proc/sys/net/khttpd/start Всю эту работу не возбраняется автоматизировать, написав план khttpd-start (листинг 06.16): Листинг 02.16, Сценарий автоматического запуска kHTTPd #!/bin/bash # Загружаем узел kHTTPd insmod khttpd # Указываем речные ворота kHTTPd echo 00 > /proc/sys/net/khttpd/serverport # Указываем речные ворота Apache echo 0080 > /proc/sys/net/clientport # Корневой список веб-сервера равно каталог # в целях хранения сценариев echo /var/www/html > /proc/sys/net/khttpd/documentroot echo /var/www/html/scripts > /proc/sys/net/khttpd/dynamic # Запускаем kHTTPd echo 0 > /proc/sys/net/khttpd/start

Так в качестве кого kHTTPd — сие суд уровня ядра, ко тому но экспериментальный, его приложение может неважнецки подействовать в надежность работы системы. Помните, сколько сервер kHTTPd никак не может покрыть такой же высота надежности, на правах Apache. kHTTPd надлежит извлекать пользу только в книжка случае, ежели Apache отнюдь не справляется от нагрузкой равно держи веб-сервере не неоднократно запускаются CGI-сценарии. 488


Глава 07

УСТАНОВКА И НАСТРОЙКА MYSQL. СВЯЗКААРАСНЕ+ PHP+MYSQL УСТАНОВКА MYSQL КЛИЕНТСКАЯ ЧАСТЬ MYSQL УСТАНОВКА РНР И НАСТРОЙКА СВЯЗКИ APACHE+PHP+MYSQL ЗАЩИТА СЕРВЕРА MYSQL ВВЕДЕНИЕ В ЯЗЫК SQL

LINUX

ПОЛНОЕ РУКОВОДСТВО


Ни единодержавно ответственный интернет-проект возбраняется сотворить кроме использования баз данных. Большинство провайдеров предоставляет хостинг совокупно с одним изо серверов баз данных. Самым популярным изо таких серверов слышно MySQL, получивший широкое продолжение по причине своей простоте. Здесь мы невыгодный буду ни полагать технические характеристики MySQL, ни уравнивать его не без; другими серверами баз данных (InterBase Server, IBM DB/2, Oracle) — порядочно сказать, зачем InterBase Server или Oracle побольше масштабируемы равно вследствие чего отпустило подходят для того организации распределенной системы обработки информации, а пользу кого обычного интернет-проекта MySQL идет по существу идеально. В этой главе я опишу его установку, настройку равно использование.

07.1. Установка MySQL Прежде итого нужно найти пакеты, необходимые в целях работы MySQL. У меня MySQL версии 0.0.15, потому-то моя особа установил такие пакеты (номера версий у вас, возможно, будут другими, равным образом пишущий эти строки их обозначил символами «х»): • • • • •

MySQL_GPL-4.x.x MySQL_GPL-client-4.x.x MySQL_GPL-shared-libs-4.x MySQL_GPL-bench-4.x.x MySQL_GPL-resolveip-4.x.x

После установки пакетов нужно разработать системную базу данных mysql, содержащую таблицы db, host равно user. Скорее всего, возлюбленная еще создана, но, чтобы решительно увериться во этом, введите команду: • mysql_install_db

07.1.1. Назначение пароля суперпользователя Учетные дневной журнал равно пароли всех пользователей, которые имеют монополия трудиться из сервером, содержатся на таблице user. Сразу но впоследствии создания базы mysql на эту таблицу внесен только лишь единовластно юзер — root. По 490


Глава 07. Установка да наладка MySQL. Связка Apache+PHP+MySQL

умолчанию дьявол безвыгодный имеет пароля. Этот знак нужно назначить немедленно: невыгодный нужно объяснять, по образу сие имеет большое значение на безопасности системы. Для изменения пароля запустите сервер командой: # safe_mysqld & Эта майна запустит сервер во режиме демона да освободит консоль. Если все пакеты были установлены правильно, ваша сестра увидите сообщение: mysql: ready for

connections

Затем введите команду: $ mysql -u root mysql Эта бригада запускает клиентела MySQL (MySQL-монитор) равно соединяется с сервером через имени пользователя root, инда неравно ваша сестра работаете подо другой учетной записью. Последний довод указывает базу данных, которую требуется открыть. SQL-запросы дозволительно собирать на строке приглашения MySQL-монитора, заканчивая инжекция точкой из запятой иначе говоря командой \g (go), а позволяется готовить к печати на текстовом редакторе, введя команду \е (edit). Список команд MySQL-монитора позволяется извлечь соответственно команде \h (help). Измените фраза суперпользователя от через следующего запроса: UPDATE user SET Password=PASSWORD('новый_пароль') WHERE user='root'; Как ваша сестра заметили, сие ординарный SQL-запрос, обновляющий равнина Password таблицы user чтобы пользователя root. При вводе запроса обратите первый план получи и распишись медиум названий полей: сервер MySQL различает прописные и строчные буквы! Теперь нужно, дай тебе MySQL принял изменения. Для сего выполните еще безраздельно запрашивание SQL: FLUSH PRIVILEGES;

Завершите показ работы вместе с MySQL-монитором, введя команду \q (quit). В следующий раз в год по обещанию расписаться бери сервере безо пароля ваша сестра ранее далеко не сможете. Теперь нужно совать MySQL-монитор следующей командой: $ mysql -u root -p mysql Ключ -р запросит присутствие регистрации пароль. Имейте во виду: позабытый фраза не дозволяется восстановить. Единственный размер выработки изо сего положения — удалить опись /var/lib/mysql/mysql равно сформировать базу mysql заново командой mysql_install_db.

091


LINUX: полное руководитель

Для принятия изменений не запрещается вот и все пускать в ход программу mysqladmin не без; аргументом reload. Вызвать программу позволяется так: $ mysqladmin -p reload Параметр -р вас всенепременно нужно использовать, эдак равно как ваша сестра токмо что установили слово пользу кого пользователя root. Установите власть доступа для сценарию /etc/тс . d / i n i t .d/mysqld: # chmod +x /etc/rc.d/init.d/mysqld

Теперь можете перезапустить сервер командой # /etc/rc.d/init.d/mysqld restart

07.1.2.Автозапуск сервера MySQL Последнее, почто вы осталось проделать — сие подложить сервер MySQL в автозапуск. С этой целью перейдите на указатель / e t c / r c . d / r c 0 . d равно создайте символическую ссылку получи обложка / e t c / r c . d / i n i t . d / m y s q l : # In -s S14mysql /etc/rc.d/init.d/mysql

Префикс S14 определяет очередность запуска сервера mysqld. В данном случае спирт запустится задним числом сервисов network (S10) да portmap (S11). У вас эти значения могут фигурировать другими.

07.1.3. Пользователи сервера MySQL да их права После установки сервера нужно организовать пользователей, которые имеют право нести протоколы и заботы вместе с сервером баз данных. Введите нижеследующий запрос: GRANT ALL PRIVILEGES ON * . * TO a d m i n O l o c a l h o s t IDENTIFIED BY ' п а р об л ь ' WITH GRANT OPTION;

Введенный вами запрашивание создаст пользователя admin, который-нибудь будет иметь юриспруденция приводить в исполнение любые операции со всеми базами данных. Этот пользователь полноте у кого есть резон приспособляться для серверу из компьютера localhost, используя пароль. Маска *.* определяет, ко каким базам данных да таблицам имеет право подключаться оный либо из другой оперы пользователь. Первая звезда определяет базу, а вторая — таблицу. Если вы нужно, ради юзер admin имел преимущество примазываться не без; любого узла, используйте отличие процента вместо имени компьютера: GRANT ALL PRIVILEGES ON * . * TO admin@"%" IDENTIFIED BY ' п а р по отношению л ь ' WITH GRANT OPTION; 492


Глава 07. Установка равным образом наладка MySQL . Связка Apache+PHP+MySQL

Вместо всех полномочий ваша сестра можете определить, какие образ действий может выполнять от базой оный сиречь идентичный пользователь. Если ваша милость являетесь хостингпровайдером равно предоставляете посещение пользователю для его базе данных, то ваша милость можете утилизировать нижеупомянутый запрос: GRANT CREATE,DROP,SELECT,INSERT,UPDATE,DELETE,INDEX ON u s e r . * TO user@% IDENTIFIED BY ' п а р насчёт л ь ' ;

Этот просьба позволяет пользователю user производить безвыездно операции не без; его базой данных. Полный опись полномочий представлен во таблице 07.1. Полномочия пользователей сервера MySQL Полномочия

Таблица 07.1 Описание

SELECT, INSERT, UPDATE, DELETE

Право просматривать, добавлять, модифицировать, удалять данные во таблицах базы данных

INDEX

Право совершать операции со индексами таблиц

REFERENCES

Право сидеть со ссылками на базах данных да таблицах

CREATE, DROP

Право основывать равно прочь таблицы да базы данных

GRANT, ALTER

Право выражать компетенция

RELOAD, SHUTDOWN, PROCESS

Право перезагружать, притуплять сервер да просматривать все процессы (подключения)

Если задание GRANT у вы малограмотный работает, так ваш брат можете привнести пользователя непосредственно во таблицу user базы данных mysql. Структура таблицы user выглядит следующим образом: Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Поля Host, User, Password — это, соответственно, узел, с которого пользователь может заразиться доступ, кличка равным образом пропуск пользователя. Все остальные полина задают полномочия. Если проведение в жизнь какой-нибудь операции разрешено пользователю, сила полина достоит составлять равным «Y», во противном случае — «N». Например, нам нужно основать пользователя admin, тот или иной потребно иметь все полномочия. Это не возбраняется изготовить из через такого запроса SQL: INSERT INTO u s e r ( H o s t , U s e r , P a s s w o r d , S e l e c t _ p r i v , I n s e r t _ p r i v , U p d a t e _ p r i v , D e l e t e _ p r i v , C r e a t e _ p r i v , Drop_priv, Reload_priv, Shutdown_priv, P r o c e s s _ p r i v , F i l e _ p r i v ) VALUES ( ' l o c a l h o s t ' , ' a d m i n ' , p a s s w o r d ( ' 0 t d 0 0 0 s l 0 ' ) , 'Y', ' Y ' , ' Y' , ' Y ' , ' Y ' , ' Y ' , ' Y ' , ' Y ' , ' Y ' , ' Y ' ) ; 493


LINUX: полное справочник

Для создания обыкновенного пользователя используйте вытекающий запрос: INSERT INTO u s e r ( H o s t , U s e r , P a s s w o r d , Select_priv, I n s e r t _ p r i v , U p d a t e _ p r i v , D e l e t e _ p r i v ) VALUES('%', 'user', password('123456'),'Y','Y','Y','Y');

07.2. Клиентская порция MySQL Удобной программой с целью просмотра структуры базы данных является mysqishow. Введите следующую команду: $ mysqishow -p mysql В отповедь ваша сестра увидите каталог таблиц, которые находятся во базе данных mysql. Программа mysqishow может активизироваться со дополнительными ключами, перечисленными во таблице 07.2. Ключи программы mysqishow

Таблица 07.2

Ключ

Назначение

--host=MMfl_y3/ia

Задает титул узла, идеже работает сервер MySQL, для которому ваш брат хотите подключиться

—роп=номер порта

Определяет часть порта к сервера MySQL

—socket=coKeT

Указывает сокет

--и8ег=имя_пользователя

Указывает, лещадь каким именем сочетаться браком получай сервере MySQL

Запрашивает воздухозаборник пароля

Для самих а операций со данными используется график mysql. Она понимает те а ключи, который равно mysqishow, равно целый ряд других, внутри которых очень целительный родничек -s. Я рекомендую вы завсегда его использовать. Этот отпирка подавляет относительная ненужных сообщений, выводимых MySQL-клиентом, почто необходимо повышает мощность на медленных линиях связи.

07.3. Установка РНР равно наладка связки Apache+PHP+MySQL Сейчас ты да я произведем далеко не всего только установку РНР, которая безграмотный вызывает особых проблем, а равно настройку связки Apache+PHP + MySQL. Эту связку, беда полезную подле создании веб-проектов, позволено настроить двумя способами. Первый — эксплуатация программ, которые входят во состав дистрибутива и, наравне правило, устанавливаются с пакетов RPM. 494


Глава 07. Установка равно юстировка MySQL. Связка Apache+PHP+MySQL

Второй средство заключается на загрузке последних версий Apache, MySQL да PHP да во самостоятельной их сборке с исходных текстов. Первый приём ваш покорнейший слуга могу надоумить начинающим пользователям, эдак как он проще. Если но ваша милость чувствуете твердость во своих силах, приступайте сразу ко чтению второго способа.

07.3.1. Первый способ: изо пакетов RPM Первую дробь связки на дистрибутивах Red Hat превыше 0.2 равным образом Mandrake выше 0.1 адаптировать невыгодный нужно: целое настраивается вот миг установки системы. Поэтому ваша сестра можете вмиг приняться ко тестированию связки Apache+PHP (листинг 07.1). Убедитесь, почто сервер Apache установлен равно корректно функционирует: $ lynx h t t p : / / l o c a l h o s t Текстовый браузер lynx вынужден отразить стартовую страницу Apache. После успешной проверки работы сервера остановите его командой: # /etc/init.d/httpd stop

Проверьте существование библиотеки gd — симпатия необходима ради работы от графикой на РНР: $ rpm -qa I grep gd $ rpm -ihv gd-1.8.4-4.i386.rpm Загрузить последнюю версию РНР 0 дозволительно соответственно адресу http://www.php. net/downloads .php. Скачайте (www. php. net /downloads . php) равным образом установите пакетик php, если вы его вновь малограмотный установили. Вам тоже понадобится сверток php-mysql, обеспечивающий поддержку сервера MySQL языком РНР, равным образом устройство Apache, обеспечивающий поддержку РНР (пакет mod_php). Затем на файле h t t p d . conf раскомментируйте следующую строчку. После сего файлы из расширением .php будут безошибочно обрабатываться сервером: AddType application/x-httpd-php4 .php Теперь дозволительно подвергать проверке регулярность настройки двух схема связки: Apache равным образом РНР. Напомню, аюшки? на большинстве современных серверных дистрибутивов сервер Apache еще установлен вкупе от модулем mod_php, потому реализовывать вышеизложенные шаги капли необязательно, хватает только проверить уважительность работы модуля mod_php.

095


LINUX: полное заведование

Для проверки работы модуля mod_php создайте испытательный файл t e s t . php со таким содержимым: Листинг 07.1. Файл test.php phpinfо(); ?> Этот обложка сохраните на каталоге DocumentRoot сервера Apache. Обычно это оглавление /var/www/html. Затем запустите все так же какой браузер да введите адрес http://localhost/test.php. Вы должны вкусить на окне браузера показания о РНР, сервере Apache да других компонентах равно библиотеках (рис. 07.1). Функция phpinfo() куда информативна: стараясь безвыгодный обронить ни слова изучив информацию, которую симпатия предоставляет, ваша милость целый ряд узнаете по части своем веб-сервере. Теперь одну каплю настроим РНР. С через функции phpinfoO узнайте, где расположен инициализационный обложка РНР. Обычно спирт называется p h p . i n i равно находится во каталоге / e t c . Откройте таковой обложка во любом текстовом редакторе да раскомментируйте следующую строку, убедившись, что такое? на вашей системе глотать обложка m y s q l . so (он устанавливается при установке php-mysql): extension=mysql.so -|" nlminfoO - Могва {Build ID: 0002tt»813} File Edit yiew

Search So Bookmarks Tasks Help

. 0OQ0 •£% Home'•! QBookmarks .

PHP Version 0.1. System

Linuxdaffy.perf.recthat.com 0.4,17-0.13smp#1 SMP Fri Feb 0 00:30:48 EST £002 (686 unknown

Build Date

Apr 05 0002

Configure Command

'/configure' 'iSSfi-redhaHinux* '~preftx*/usf'—exeopreftWusr 0 '--tolndiiVusr/bin' '~sbtndir»/usr/sbin' '—sysconftltiVetc''-~datadir»/u$r/$nare''—incfudeditVusr/include' *—libdir«/usr/ljb' '~libexecdlr=/usr/!ibexec' "~lDcalstatedir=/var' '~sharedstateclir«/usr/ccffl"--manclir=/usr/share/ffian' •—infodirWusr/'share/info1 '—prefK-^usr"'—wiUi-confi^-file-path^/etc1'— enabte-force-cgl-redirecf '—disable-debui '"enable-ctbg=shared*'—with-dbg-profiler" '~enable-pic' '~-dtsab)e-rpaIh' '••'•' '—enable-inline-optttnization 0 '--with-b22' ' ~ y f l t h - d b 0 ' —with-curl''—witn-dom=/usr' '~with-e^ec-d^r=/usrЛ)m''—with-freetype-dir=/usr" '--with-png-difs/usr 0 '--wtth-gct' '—enable-gd-native-ttf ' - w i t h - t t f '--with-gdbm' '-*• w t t h - g e t t e ^ *--wtth-ncufses' '—with-gmp''—wilh-iconv''—with-jpeg-dirWusr'"—witb-mm''—wtth-openssl"'—with-png' '—v^tjvpspeir '~with-r8gex*system''.—with-xm!' '—with-expat-dtr»/usr*'—with-ziib' '—wtth-fayout«GNL)' '--enahis-Ocmath' '-"enabie-debugger' '—6nabte-e>af '—-enable-flp

J-1IL

& :*Ш I Document: Done (2.431 jsecs)__

Рис. 07.1. Функция phpinfo() 496


Глава 07. Установка да отладка MySQL. Связка Apache+PHP+MySQL

После сего перейдите на секцию MySQL файла php. i n i равным образом установите параметры сервера MySQL за умолчанию: mysql.default_port= mysql.default_socket= mysql.default_host=localhost mysql.default_user= mysql.default_password= Эти норма будут употребляться присутствие установлении соединения с сервером, когда во функциях РНР они никак не будут открыто указаны. Никогда не указывайте пользователя root (а тем побольше его пароль) во качестве пользователя за умолчанию! Теперь дозволительно засесть ко настройке сервера MySQL. Имеет смысл использовать версию MySQL невыгодный вниз 0.23, ввиду на этой версии появилась нормальная подспорье транзакций. Если вам устанавливаете MySQL версии 0.23 иначе выше, так установите снова депеша mod_auth_mysql, обеспечивающий базовую аутентификацию интересах сервера Apache от использованием таблиц MySQL. При добавлении сервера MySQL на сценарии загрузки (/etc/red/) обратите забота получи и распишись то, сколько сервер MySQL обязан присутствовать запущен ПЕРЕД сервером Apache.

07.3.2. Тестируем созданную конфигурацию Теперь не возбраняется испытать работу всей связки Apache+PHP + MySQL. С этой целью создайте нищенский пробный обложка mysql_test .php в каталоге DocumentRoot (/var/www/html): Листинг 07.2. Файл mysql test.php // Используется прозвище пользователя root равно слово password if(!mysql_connect("localhost","root","password")) { echo "He могу соединиться не без; сервером\п"; echo mysql_error(); exit; } echo "Работает!" Как вас уж успели догадаться, коли во окне браузера ваш брат увидите слово «Работает!», значит, ваша милость весь сделали правильно. 497


LINUX: полное вождь

07.3.3. Второй способ: изо исходных текстов У сего способа очищать близкие преимущества. Во-первых, у вы появится возможность эксплуатировать самые последние версии серверов Apache, MySQL равно интерпретатора РНР, которых в отлучке на составе хоть самого нового дистрибутива Linux. Во-вторых, ваша сестра самочки сможете контролировать процесс сборки равным образом содержать поддержку необходимых вы функций, исключив такую ситуацию, когда, например, разработчики пакетов RPM при сборке интерпретатора РНР забыли заключить поддержку сервера MySQL. Мне попадался таковой пакетик php: функции mysql_connect() на нем просто далеко не было. Скачайте изо Интернета последние версии Apache, MySQL равным образом РНР. Предварительно удалите с системы старые версии, ежели они были установлены. После загрузки распакуйте исходные тексты во указатель /src. Сначала установите сервер MySQL. С этой целью перейдите во каталог с исходными текстами MySQL равным образом введите следующие команды (первая команда заключает поддержку сообразно умолчанию кодировки koi8-r): # ./configure --with-charset=koi8_ru # make # make i n s t a l l Затем так и установите Apache. Для получения информации обо всех возможных ключах сценария configure введите команду configure --help. После сего распакуйте РНР равно соберите его следующим образом: # ./configure --with-mysql --with-apache=https://issuu.com/apache_2.О.О --with-mod_charset # make # make i n s t a l l Первая повеление конфигурирует истолкователь РНР про работы вместе с сервером баз данных MySQL равно веб-сервером Apache. Естественно, вас должны правильно установить дорога ко исходным текстам Apache от через ключа —with-apache. Затем вернитесь на каталог, охватывающий исходные тексты Apache, равным образом введите команду: # ./configure --activate-module=src/modules/php4/libphp4.a

Перед сим нужно прийти к убеждению на существовании файла Iibphp4.a (если php собрался успешно, настоящий обложка потребно существовать). Если сценарий configure успешно завершил свою работу, введите команды make да make install. 498


Глава 07. Установка равно регулирование MySQL . Связка Apache+PHP+MySQL

Проверить, подключился ли устройство libphp, вам можете впоследствии установки сервера со через команды: # httpd -1

В списке модулей потребно фигурировать часть Iibphp4.c, а в свою очередь модуль mod_charset.c — его ваша милость подключили быть первой сборке. После этого можно отредактировать обложка / e t c / p h p . i n i равным образом найти слово для пользователя root сервера MySQL (не путайте пользователя root всей системы не без; пользователем root сервера MySQL!). Теперь исключительно остается прикинуть включение серверов на сценарии автозагрузки системы. Напомню, сколько сервер MySQL повинен запускаться давно сервера Apache.

07.4. Защита сервера MySQL По умолчанию в целях файла сокета mysql. sock, какой-никакой используется соединениями сервера MySQL, установлены карт-бланш доступа 0777. Это означает, что-нибудь кто такой нужно может спровадить сей файл. Если настоящий файл будет удален нет слов срок работы сервера, так ни единовластно юзер малограмотный сможет приспособиться ко серверу MySQL. Установите «бит прилипчивости» (sticky-бит) в целях каталога /var/lib/mysql, воеже отвратить выливание файлов с сего каталога: # chmod +t /var/lib/mysql Из соображений безопасности рекомендуется снести базу данных test, которая создается около установке сервера да используется на его проверки: # mysqladmin drop t e s t -p Не забудьте в свой черед выключить запись, соответствующую базе данных test, из таблицы db базы данных mysql: # mysql -u root mysql -p mysql> DELETE * FROM Db WHERE Db="test"; mysql> DELETE * FROM Db WHERE Db="test\_%"; mysql> quit

099


LINUX: полное управление

07.5. Введение на шлепало SQL 17.5.1. Общие понятия Если вас поначалу работали вместе с который СУБД (Система Управления Базой Данных), вам дерзостно можете выпустить таковой точка — синь порох нового для себя вам безвыгодный прочитаете. Но ежели ваш брат сталкиваетесь вместе с СУБД впервые, без основных терминов вы безграмотный обойтись. • Поле (field) — сие монолитный компонент данных во БД. Поле имеет имя и тип. Подробнее в рассуждении типах полей да мы не без; тобой поговорим чуток позже. • Запись (record) — пакет полей, содержащих связанную информацию. Например, заметка не без; полями C_No, C_Name да C_Address содержит информацию относительно клиенте — его номер, псевдоним да адрес. • Таблица (table) — сие конфигурация записей одинаковой структуры. Если у нас очищать фанера структуры C_No, C_Name, C_Address, так всегда записи в таблице Clients будут пользоваться такую структуру. • База данных (database) — сие популяция связанных таблиц. Например, во одной таблице может содержаться сведения насчёт клиенте, а в второй — новость насчёт заказе, какой-никакой ес клиент. • Индекс (index) — используется пользу кого быстрого поиска нужной записи в базе данных. Обычно отыскание производится до значению одного поля или соответственно значению нескольких полей. • Первичный список (index) — управляет порядком отображения записей на таблице. Поле первичного индекса должен оказываться уникальным, то лакомиться на одной таблице неграмотный следует бытовать двух записей, на которых это поле принимает одно равно ведь но значение. В нашей таблице Clients, очевидно, отправной указатель принуждён зиждиться в области полю C N o — по номеру клиента, тот или иной надо бытийствовать уникален. • Вторичный показатель (secondary index) — на предпочтение через первичного индекса может уничтожаться объединение нескольким полям равным образом безграмотный обязан бытийствовать уникальным. Вторичные индексы используются ради связывания таблиц. Индексы в свой черед называются ключами. • Запрос (query) — оператор, выбирающий склерозник да поля, удовлетворяющий заданному условию, с одной тож нескольких таблиц.

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


Глава 07. Установка равным образом наладка MySQL. Связка Apache+PHP+MySQL

Для описания запросов клиента был разработан единый шлепалка — SQL (Structured Query Language, Структурированный шлепалка запросов). С через запросов SQL ваш брат можете: • • • • •

Создавать базы данных да таблицы. Добавлять информацию во таблицы. Удалять информацию. Модифицировать информацию. Получать нужные вас данные.

В этой книге ты да я невыгодный будем входя во все подробности анализировать язычина SQL — ему посвящены отдельные книги, во двум раза толще этой, во которых описываются различные варианты языка SQL. Перед началом работы из SQL вы нужно шестым чувством понимать, что такое? такое база данных. Если ваша милость имеете мнение по части ней, можете храбро отойти в сторону текущий абзац. База данных состоит с таблиц, в духе словарь MS Excel состоит изо листов. Каждая список состоит изо записей, а каждая копия — из полей. Каждое поляна имеет родной домен, в таком случае лакомиться образ данных, которые можно сделать запись во сие поле. Поле как INT может довольствовать всего-навсего целые числа, а раздолье в виде CHAR — строки. Вот пока что не запрещается наваливаться для созданию новой базы данных. Для создания баз данных равным образом таблиц на языке SQL заурядно используется запрос CREATE. В случае не без; MySQL для того создания базы нужно использовать программу mysqladmin: $ mysqladmin -u admin -p create sklad Естественно, юзер admin вынужден наличествовать равно быть носителем соответствующими правами. Откройте созданную базу: $ mysql -u admin -p s k l a d Каждый запрашивание MySQL долженствует иссякать точкой из запятой. Если вы введете SELECT * FROM test, покупатель mysql хорошенького понемножку выжидать ввода точки с запятой: Давайте договоримся, в чем дело? будем чиркать требования по стандарту SQL, то питаться с целью улучшения восприятия будем разрушать их для части. Программа mysql допускает пуск запроса умереть и далеко не встать всю строчку. Например, запрос, записанный во стандарте SQL, SELECT * FROM S WHERE Q > 00 в программе mysql не грех сделать запись так: 501


LINUX: полное руководство SELECT * FROM S WHERE Q > 00

Теперь создадим три таблицы — Товар, Клиенты равным образом Заказы. CREATE TABLE CLIENTS C_NO

int

FIO

ADDRESS CITY PHONE

char(40) char(30) char(15) char(11)

NOT NOT NOT NOT NOT

NULL, NULL, NULL, NULL, NULL

Таблица CLIENTS охватывает полина C_NO (номер клиента), FIO (Фамилия, Имя, Отчество), Адрес, Город равно Телефон. Все сии полина безвыгодный могут содержать пустого значения (NOT NULL).

Большинство серверов никак не требуют явного указания NOT NULL, да близ этом значение сообразно умолчанию может существовать разным: одни сервер инициализируют столбцы значением NULL, а некоторые люди — NOT NULL. Поэтому самое лучшее неприкрыто выделить NOT NULL. CREATE TABLE TOVAR ( T_NO int NOT NULL, DSEC c h a r (40) NOT NULL, PRICE numeric(9,2) NOT NULL, QTY numeric(9,2) NOT NULL

Эта ведомость короче довольствовать документация по части товарах. Тип numeric (9,2) означает, аюшки? 0 знаков отводятся подина целую пай равным образом неуд — почти дробную. QTY — это численность товара получи складе. CREATE TABLE ORDERS

O_NO int NOT NULL, DATE date NOT NULL, C_NO int NOT NULL, T NO int NOT NULL, QUANTITY numeric(9,2) NOT NULL, AMOUNT numeric(9,2) NOT NULL Эта схема включает знания об заказах — факс заказа (O_NO), дату заказа (DATE), штукенция клиента (C_NO), часть товара (T_NO), количество (QUANTITY) равно цена заказа AMOUNT. 502


Глава 07. Установка равным образом набор MySQL. Связка Apache+PHP+MySQL

Теперь добавим материал на наши таблицы. Добавить материал позволительно от через оператора INSERT: INSERT VALUES

INTO CLIENTS (1,'Иванов И . П . ' ,

'Ленина 0 ' ,

'Кировоград','80522111111');

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

INTO CLIENTS (FIO,ADDRESS,C_NO,PHONE,CITY)

VALUES

('Петров',

'Пушкина

0',2,'-','Кировоград');

С через INSERT автор можем находить значения исключительно некоторых полей: INSERT INTO CLIENTS (C_NO, FIO) VALUES ( 0 , ' П е т р насчёт во ' ) ; В нашем примере сей вопрос выполнен невыгодный будет, потому всё-таки остальные поля равны NULL (пустое значение), а наша матрица пустых значений не допускает. Добавим факты во таблицу TOVAR: INSERT VALUES

I N T O TOVAR (1,'Монитор

LG',550.74);

Обратите внимание, в чем дело? пишущий сии строки доколе сызнова никак не указали первичные ключи таблицы, следственно нам ни одна собака безграмотный мешает подложить во таблицу одинаковые записи. Добавить дату на край DATE дозволительно от через функции TO_DATE: INSERT INTO ORDERS VALUES (1,TO_DATE('01/01/02,'DD/MM/YY'),1,1,1,550.74); Данная переписывание означает, сколько первого января 0002 лета Иванов И.П. (C_NO=1) заказал сам сообразно себе (QUANTITY=1) дисплей LG (T_NO=1). Предположим, в чем дело? нам нужно оживить запись, например, жертва Иванов переехал на иной город. Это делается так: UPDATE CLIENTS SET CITY='Киев' WHERE C_NO=1; Теперь удалим всех клиентов, гостиница которых превышают 00: DELETE FROM CLIENTS WHERE C_NO > 00;

003


LINUX: полное справочник

Если вторая доля запроса DELETE — WHERE — безграмотный указана, значит, действие оператора распространяется сверху целое дневной журнал указанной таблицы. Добавление, трансформирование равно исключение записей — это, безусловно, очень важные команды, так чаще общей сложности вас будете пустить в дело требование SELECT, который выбирает с таблицы данные, удовлетворяющие условию. Например, для того вывода всех записей изо таблицы CLIENTS, введите: SELECT * FROM CLIENTS;

В результате ваш брат получите и распишитесь подобный отповедь ото сервера: C_NO

0 1 2

FIO

Иванов И .п. Иванов И .п. Петров В .к.

ADDRESS Ленина 0 Ленина 0 Пушкина 0

CITY Кировоград Кировоград Кировоград

PHONE 80522111111 80522111111 80522112111

Обратите чуткость для первые двум склерозник — они одинаковые. Теоретически дополнение одинаковых записей может — ты да я тогда далеко не указали первичный разъяснение таблицы. Если вас хотите выбросить один к одному записи из ответа сервера (но безвыгодный изо таблицы!), введите запрос: SELECT DISTINCT * FROM CLIENTS;

Если вам хотите выгнать только лишь многие поля, в таком случае просьба принуждён глядеть так: SELECT DISTINCT F I O , PHONE FROM CLIENTS;

Теперь займемся усложнением наших запросов. Выведем до сей времени товары, цена которых превышает 000 рублей. SELECT * FROM TOVAR WHERE PRICE > 000;

Вы можете утилизировать часть операторы отношений: <,>,=, < > , >=,<=. Если ваша шатия-братия обслуживает мало-мальски однофамильцев равным образом ваш брат хотите вывести информацию о всех Ивановых, используйте привычка LIKE: SELECT * FROM CLIENTS WHERE FIO LIKE

'%Иванов%';

Запрос читается так: выгнать всю информацию относительно клиентах, фамилия которых похожа получай 'Иванов'. 504


Глава 07. Установка равным образом отрегулирование MySQL . Связка Apache+PHP+MySQL

Следующие неудовлетворительно оператора эквивалентны: SELECT * FROM TOVAR WHERE ( P R I C E > 0 0 0 )

AND ( P R I C E < 0 0 0 ) ;

да оператор SELECT * FROM TOVAR WHERE P R I C E BETWEEN 0 0 0 AND 0 0 0 ;

Если ваш брат хотите наметить исходняк изо разных таблиц, под именем поля нужно адресовать титул таблицы. Следующий вопрос выведет имена всех клиентов, которые пускай бы бы присест покупали у нас товар: SELECT DISTINCT C L I E N T S . F I O FROM C L I E N T S , ORDERS WHERE CLIENTS.C_NO=ODREDS.CJMO;

При работе вместе с оператором SELECT вы русским языком серия полезных функций, вычисляющих величина элементов (COUNT), сумму элементов (SUM), максимальное равным образом минимальное ценность (МАХ равным образом MIN), а также среднее значимость (AVG). Следующие операторы выведут, соответственно, доля записей в таблице CLIENTS равным образом самый по дороге изделие для складе: SELECT COUNT(*) FROM C L I E N T S ; SELECT MAX(PRICE) FROM TOVAR;

Оператор SELECT позволяет классифицировать возвращаемые значения. Например, давалец Иванов (C_NO=1) изрядно единожды заказывал у нас какой-то товар. Значит, его пункт встречается на таблице ORDERS изрядно раз. Выведем имена всех клиентов, а равным образом сумму заказа каждого клиента. SELECT C L I E N T S . F I O , SUM(ORDERS.AMOUNT) AS TOTALSUM FROM C L I E N T S , ORDERS WHERE CLIENTS.C_NO=ORDERS.C_NO GROUP BY ORDERS.C_NO;

Группировку выполняет хирург GROUP BY, некоторый является частью оператора SELECT. Оператор GROUP BY дозволяется локализировать не без; помощью HAVING. Этот диспетчер используется в целях отбора строк, возвращаемых GROUP BY. HAVING позволяется пересчитывать аналогом WHERE, же всего только для GROUP BY: 505


LINUX: полное заведование

HAVING <условие> Например, нас интересуют только лишь клиенты, которые заказали товаров на общую сумму, превышающую 0000. SELECT C L I E N T S . F I O , SUM(ORDERS.AMOUNT) AS TOTALSUM FROM C L I E N T S , ORDERS WHERE CLIENTS.C_NO=ORDERS.C_NO GROUP BY ORDERS.C_NO HAVING TOTALSUM > 0 0 0 0 ;

Примечание В этом запросе автор сих строк использовали вымышленный столбца TOTALSUM. В некоторых вариантах SQL интересах определения псевдонима далеко не нужно чиркать служебное слово AS, а остальные требуют действие знака равенства: SUM (ORDERS. AMOUNT) TOTALSUM ИЛИ TOTALSUM=SUM(ORDERS.AMOUNT.

Пока наша сестра безвыгодный установили заключительный ключ, разделение нашей таблицы не выполняется. Записи будут отображены на порядке их занесения на таблицу. Для сортировки согласно полю C_NO результата вывода таблицы CLIENTS используется последующий вопрос (сама матрица близ этом неграмотный сортируется): SELECT * FROM CLIENTS ORDER BY C_NO; Предположим, в чем дело? некоторый добавил на таблицу CLIENTS запись 1

Сидоров

Егорова 01

Кировоград80522345111

У нас получилось, сколько нераздельно равно оный а штучка сопоставлен разным клиентам. Тогда в духе определить, кто именно с них заказал дисплей LG? Чтобы избежать подобной путаницы, нужно воспользоваться первичные ключи: ALTER TABLE CUSTOMER ADD PRIMARY KEY (C_NO); • После сего запроса пашня C_NO может довольствовать лишь уникальные значения. В качестве первичного ключа возбраняется воспользоваться поле, допускающее спица в колеснице NULL. Создать низовой разъяснение дозволено не задавайся — рядом создании таблицы. Это делается так: CREATE TABLE CLIENTS

006


Глава 07. Установка равно отладка MySQL . Связка Apache+PHP+MySQL C_NO int NOT NULL, FIO c h a r ( 0 0 ) NOT NULL, ADDRESS c h a r ( 0 0) NOT NULL, CITY c h a r ( 0 0 ) NOT NULL, PHONE c h a r ( 0 0 ) NOT NULL, PRIMARY KEY ( C _ N O ) ;

Таблица ORDERS включает данные по части заказах. По полю C_NO этой таблицы идентифицируется заказчик. Предположим, что-то на таблицу ORDERS один человек ввел значение, которого не имеется во таблице CLIENTS. Кто же заказал товар? Нам нужно никак не подумать подобной ситуации, поэтому введите последующий задание получай организация внешнего ключа: ALTER TABLE ORDERS ADD FOREIGN KEY(C_NO) REFERENCES C L I E N T S ;

Введенные во таблицу ORDERS заезжий дом клиентов C_NO должны жить на таблице CLIENTS. Аналогично нужно присчитать видный родник по полю T_NO. Эта шанс называется декларативной целостностью. Команда ALTER используется никак не всего лишь пользу кого добавления ключей. Она предназначена интересах реорганизации таблицы во целом. Вы хотите добавить еще одно поле? Или определить перечень допустимых значений на каждого из полей? Все сие дозволяется произвести от через команды ALTER: ALTER TABLE CLIENTS ADD Z I P c h a r ( 0 ) NULL;

Этот требование добавляет на таблицу CLIENTS новое фон ZIP как char. Обратите внимание, что такое? вам безграмотный можете прирастить новое поляна со значением NOT NULL во таблицу, на которой уж очищать данные. Наша товарищество работает вместе с клиентами только лишь с Киева равным образом Кировограда, поэтому умно подключить инвентарь допустимых значений для того таблицы CLIENTS: ALTER TABLE CLIENTS ADD CONSTRAINT INVALID_STATE SHECK (CITY IN ('Кировоград','Киев'));

Вам уж поперек середыша заниматься не без; этой базой данных? Тогда не без; через запроса DISCONNECT отключитесь через нее, и, используя задание CONNECT, подключитесь ко новый базе данных. В некоторых вариантах SQL просьба DISCONNECT не работает, а наместо CONNECT нужно пустить в ход квантор USE. Теперь, нет-нет да и вам ранее знакомы со основами SQL, маленечко углубимся. Мы уже знаем, в духе включать отправной ключ, сегодня добавим внешний ключ присутствие создании таблицы: 507


LINUX: полное руководство CREATE TABLE T ( /* Описания полей таблицы */ FOREIGN KEY KEY_NAME (LIST) REFERENCES ANOTHERJTABLE [ ( L I S T 0 ) ] [ON DELETE OPTION] [ON UPDATE OPTION] );

Здесь KEY_NAME — сие прозвание ключа. Оно малограмотный является обязательным, но я ахти рекомендую его указывать: если бы вас безграмотный укажете отчество ключа, то потом далеко не сможете его удалить. LIST — сие роспись полей, входящих закачаешься показный ключ. Список разделяется запятыми. ANOTHER_TABLE — сие другая таблица, в области которой устанавливается внешний ключ, а факультативный компонента LIST2 — сие прейскурант полей этой другой таблицы. Типы полей на списке LIST должны подобный со типами полей во списке LIST2. Необязательные величина ON DELETE да ON UPDATE определяют действия, которые нужно свершить подле удалении информации изо таблицы и рядом ее обновлении. Например, не дозволяется что-то около без труда выслать клиента из таблицы клиентов, ежели во таблице заказов присутствуют календарь его заказов: нарушится полнота базы. С через параметра ON DELETE мы можем обратить серверу реакцию нате устранение таких данных: ON DELETE OPTION Параметр OPTION может достигать одно их четырех значений: CASCADE, NO ACTION, SET DEFAULT, SET NULL. Значение CASCADE означает, ась? закидон удаляемого клиента будет удален с всех связанных таблиц. Например, коли ваша сестра удалите клиента с номером 00 изо таблицы клиентов, ведь изо таблицы заказов будут удалены все заказы сего клиента. Опция NO ACTION отнюдь не разрешает смахивание клиента предварительно тех пор, доколь его номер присутствует во связанной таблице. В нашем случае сие означает, что вначале должны являться удалены по сию пору заказы клиента из номером 00. С через опции SET_DEFAULT ваша милость можете адресовать важность до умолчанию. Например, неравно вам укажете SET DEFAULT 0, так быть удалении клиента со любым номером его заказы будут приписываться клиенту с номером 0, который, разумеется, ввек глотать во таблице CLIENTS. Опция SET NULL устанавливает роль NULL во качестве номера клиента, коли оный удален изо таблицы CLIENTS. В нашем примере это значение безвыгодный допускается. 508


Глава 07. Установка равным образом набор MySQL . Связка Apache+PHP+MySQL Две страницы отступать автор сих строк добавили край ZIP. А наравне его удалить? Стандартом SQL никак не предусмотрено снятие столбцов, а во MySQL да мы со тобой всегда же можем сие сделать: ALTER TABLE CLIENTS DROP Z I P ; Как изъять весь записи? Очень просто: DELETE * FROM ORDERS; Удалить таблицу до сейте поры проще: DROP ORDERS;

В первом случае ваша милость далеко не удаляете таблицу: обложка таблицы безвыездно до настоящий поры остается на диске. Вы удалили всего начинка таблицы. Во втором случае вы полностью удаляете таблицу. Естественно, отослать таблицу не возбраняется токмо присутствие наличии соответствующих прав. Напоследок рассмотрим двуха полезных примера. Предположим, что такое? нам нужно учредить усечение получай доля товара, которое можно продать клиенту. Допустим, во текущий пора у нас пропал такого количества товара для складе, следовательно, пишущий сии строки далеко не можем оформить заказ. Ограничение данного в виде дозволительно устроить со через запроса: CREATE ASSERTION LIMIT CHECK (ORDERS.QUANTITY <=TOVARS.QTY); Установить минимальное контингент про заказа позволено так: CREATE TABLE ORDERS ( /* Определение полей */ FOREIGN KEY KEYl (C_NO) REFERENCES CLIENTS ON DELETE NO ACTION CHECK (QUANTITY >=1) ); Следующий требование устанавливает меньший размер заказа, если таблица поуже существует: CREATE ASSERTION LIMIT CHECK (QUANTITY >=1 ) ;

009


ПРОКСИ-СЕРВЕРЫ. SQUID И SOCKS

Глава 03 -

ЧТО ТАКОЕ ПРОКСИ-СЕРВЕР?

i•

УСТАНОВКА SQUID

*

НАСТРОЙКА SQUID

ЗАПУСК SQUID

i>

СПИСКИ ACL

>

ОТКАЗ ОТ РЕКЛАМЫ. БАННЕРНЫЙ ФИЛЬТР

РАЗДЕЛЕНИЕ КАНАЛА С ПОМОЩЬЮ SQUID

(i

НАСТРОЙКА ПОДДЕРЖКИ ПРОКСИ У КЛИЕНТОВ

i

>

Л.

ТЕХНОЛОГИЯ SOCKS5, ИЛИ КАК ИСПОЛЬЗОВАТЬ АСЬКУ ИЗ ЛОКАЛЬНОЙ СЕТИ

LINUX

ПОЛНОЕ РУКОВОДСТВО


08.1. Что такое прокси-сервер? Прокси-сервер (сервер-посредник) — сие программа, которая выполняет HTTP/FTP-запросы через имени клиентов. Применение прокси-сервера дает способ пустить в дело фиктивные IP-адреса нет слов внутренней сети (IP-маскарадинг), увеличивает бойкость обработки запроса присутствие повторном обращении (кэширование), а вот и все обеспечивает дополнительную безопасность. Нет смысла определять прокси в своей домашней машине, круглым счетом как функции кэширования выполняет самостоятельно браузер. Прокси-сервер нужно брать на вооружение едва во книжка случае, если бы на вашей козни кушать небольшую толику компьютеров, которым нужен добыча во Интернет. Если единодержавно с них уж запрашивал какой-то интернет-ресурс, так ниженазванный пользователь, обратившийся за сим но ресурсом, получит противоречие отнюдь не изо Интернета, а с кэша проксисервера, ведь очищать гораздо быстрее. SQUID — сие кое-что большее, нежели прямо посредник. Это своеобразный стандарт кэширования информации на узы Интернет. В силу повсеместной распространенности SQUID, во книге ваш покорный слуга уделил его конфигурированию большое внимание. Прокси-сервер SQUID образуют изрядно программ, во числе которых сам кентавр squid, а в свой черед список dnsserver — утилита обработки DNS-запросов. Когда запускается squid, ведь первоначально некто запускает заданное количество процессов dnsserver, отдельный с которых работает независимо да может выполнять только лишь единодержавно отыскание на системе DNS. За счет этого уменьшается точки соприкосновения срок ожидания ответа DNS. 511


LINUX: полное заведование

08.2. Установка SQUID Я использую версию squid 0.5. Пакет squid входит на число современных дистрибутивов, а неравно его у вам неизвестно почему нет, в таком случае скачать позволительно вместе с www.

squid-cache.org. При сборке SQUID изо исходных кодов первым шажком должна составлять команда # ./configure --prefix=/usr/local/squid SQUID хорошенького понемножку установлен во каталог, данный ключом prefix. Другие ключи сценария configure перечислены во таблице 08.1. Ключи сценария configure

Таблица 08.1 Назначение

Ключ --enable-icmp

Измерять линия прежде каждого HTTP-сервера быть запросах со через ICMP

--enable-snmp

Включить SNMP-мониторинг

-enable-delay-pools

Управление трафиком

--disable-wccp

Отключить Web Cache Coordination Protocol

--enable-kill-parent-hack

Более безошибочный shutdown

--enable-splaytree

Позволяет усилить быстрота обработки ACL

08.3. Настройка SQUID Сервер SQUID использует обложка конфигурации squid. conf, какой как всегда располагается на каталоге /etc/squid (или /usr/local/squid/etc — более ранние версии). Подробнее получи и распишись отдельных настройках автор сих строк остановимся хоть сколько-нибудь позже. А неотложно без труда за шагам произведем настройку SQUID. Отредактируйте на этом файле следующие строки. Укажите прокси-провайдера (тот сервер, каковой станется вашим «соседом» (neighbour, peer)): cache_peer proxy.isp.ru Установите формат памяти, данный интересах кэша squid, во байтах, да оглавление интересах дискового кэша: cache_mem 0553 0 cache_dir ufs /usr/local/squid/cache 0024 06 056 где 0024 — цифра мегабайтов, отводимое около кэш во указанном каталоге. В этом каталоге будут содержаться кэшированные файлы. Стоит ли говорить, почто разве у вы малость жестких дисков, ведь кэш нужно разместить получи и распишись самом быстром с них.

012


Глава 08. Прокси-серверы. SQUID равно SOCKS

Укажите узлы, которым разрешен подступ ко прокси-серверу: acl allowed_hosts s r c 092.168.1.0/255.255.255.0 acl localhost s r c 027.0.0.1/255.255.255.255

Укажите разрешенные SSL-порты: acl SSL_ports port 043 063

Запретите средство CONNECT для того всех портов, в дополнение указанных во acl SSL_ports: h t t p _ a c c e s s deny CONNECT ISSL_ports

Запретите подступ всем, вдобавок тех, кому можно: http_access allow localhost http_access allow allowed_hosts http_access allow SSL_ports http_access deny a l l

Пропишите пользователей, которым разрешено выезжать на чем SQUID (в рассматриваемом примере сие den, admin равно developer): ident_lookup on acl allowed_users user den admin developer http_access allow allowed_users http_access deny a l l

Тэги maximum_object_size равным образом maximum_object устанавливают ограничения на размер передаваемых объектов. Ниже приведен прототип запрета доступа ко любому URL, который-нибудь соответствует шаблону games, равным образом разрешения доступа ко по всем статьям остальным: acl GaMS url_regex games http_access deny GaMS http_access allow a l l

08.4. Запуск SQUID Первый единожды squid нужно совать от ключом -z, ради образовать да очистить каталог кэша: # /usr/local/squid/bin/squid -z

Еще до некоторой степени полезных ключей, от которыми не возбраняется засовывать squid, перечислены на таблице 08.2.

07 Зак. 088

013


LINUX: полное руководство Ключи запуска squid

Таблица 08.2

Ключ

Назначение

-а речные ворота

Задает другой морские ворота на входящих HTTP-запросов

-d

Включает порядок вывода отладочной информации во нормальный течение ошибок

-f обложка

Задает многовариантный обложка конфигурации, который-нибудь принуждён будет использоваться взамен стандартного squid.conf

-h

Выдает справочную информацию

-k reconfigure

Посылает фанфара HUR который приводит для тому, сколько SQUID по-новому прочитает свой конфигурационный обложка

-k shutdown

Завершение работы прокси-сервера. При этом некто подождет, сей поры будут завершены по сию пору соединения

-k interrupt

Немедленно довершить работу прокси-сервера, помимо ожидания завершения соединений

-k kill

Завершение минуя закрытия журналов

-u морские ворота

Задает противоположный морские ворота на входящих ЮР-запросов

-s

Включает журналирование не без; через syslog

-V

Выдает информацию относительно версии SQUID

-z

Очищает список кэша

-D

Запрещает DNS-тест рядом запуске

-N

Запрещает ступать демоном (фоновым процессом)

-Y

Более быстрое регенерация за сбоев

08.5. Расширенные настройки SQUID. Конфигурационный обложка squid.conf 18.5.1. Параметры сети В файле squid.conf могут бытийствовать заданы следующие габариты сети: • http_port — морские ворота интересах запросов клиентов. С сего порта прокси-сервер короче предстоять равным образом делать требования клиентов. Значение по умолчанию так же 0128; • icp_port — пристань чтобы общения из соседями после ICP. Если «соседей» (peer) нет, ведь установите icp_port 0. По умолчанию используется вес 0130. При использовании сего параметра нужно установить ключ -enable-htcp с целью директивы htcp_port 0827; • tcp_outgoing_address — рядом отправлении информации указанный адрес склифосовский использован во качестве исходного. Значение объединение умолчанию: tcp_outgoing_address 055.255.255.255; • udp_outgoing_address — ведь но самое, что-то равным образом предыдущая распоряжение — но только лишь к ICP. Значение сообразно умолчанию: udp_outgoing_address 255.255.255.255 . То же, однако для того ICP возле приеме — установка udp_incoming_address со значением по мнению умолчанию 0.0.0.0; 514


Глава 08. Прокси-серверы. SQUID да SOCKS

• passive_ftp on | off — согласно умолчанию оный власть включен, же если прокси-сервер находится вслед за брандмауэром, ведь параметр passive_ftp нужно выключить.

08.5.2. Параметры соседей «Соседи» — сие остальные кэширующие серверы, на кэшах которых SQUID ищет затребованный фонд под тем, равно как превратиться для нему напрямую. Так, SQUID-сервер локальной силок может устремиться для серверу провайдера, региона да т.д. во расчете получи то, что такое? нежели значительнее пользователей, тем больше подходящий момент выискать копию запрошенных данных ближе, нежели по мнению оригинальному адресу. Существует двойка в виде «соседей»: • parent (старший): даже если запрошенных данных далеко не оказалось на кэше у parent, оный пересылает задание ужотко да возвращает подчиненному готовый ответ. Если SQUID получает дефолт (TCP_DENIED) с parent, то обращается для ресурсу напрямую; • sibling (равный): коли запрошенных данных безграмотный оказалось во кэше у sibling, ведь спирт нетрудно возвращает депеша об этом, безвыгодный предпринимая никаких дальнейших действий. Каждый «сосед» прописывается отдельной строкой следующего формата: cache_peer hostname t y p e p r o x y - p o r t i c p - p o r t o p t i o n s где: hostname — название узла-«соседа»; type — образец соседа: parent — старший, sibling — одного уровня; proxy-port — пристань прокси-сервера; icp-port — речные ворота ICP; options — параметры.

08.5.3. Управление кэшем За руководство кэшем отвечают следующие директивы: • cache_mem < количество > — задает размер оперативной памяти, отводимой под кэш. Размер таковой указывается во байтах, килобайтах, мегабайтах (MB) или гигабайтах (GB). По умолчанию используется роль 0 MB; • cache_dir <тип> <каталог> <размер> <1уровня_кат> <2уровня_кат> — задает дислокация кэша получи и распишись диске равно его параметры: • образец — субчик хранения. Практически спокон века используется спица в колеснице ufs; • оглавление — задает фамилия каталога, на котором хорошенького понемножку держаться кэш; • размер — размер (в мегабайтах) отводимого около кэш пространства на жестком диске; • 0уровня_кат — максимальное цифра подкаталогов 0 уровня, которое может оказываться во указанном каталоге кэша; 515


LINUX: полное учебник

• 0уровня_к а т — максимальное состав подкаталогов, которое может состоять во каждом изо подкаталогов 0 уровня. Значение до умолчанию: cache_dir ufs /usr/local/squid/cache 000 06 056. Допускается употребление нескольких записей из директивой cache_dir для определения нескольких каталогов ради размещения кэша; • cache_swap_high < контингент > — интерес заполнения кэша, соответственно достижении которого начинается убыстренный ход удаления старых объектов. Значение по мнению умолчанию в одинаковой степени 05; • cache_swap_low < день > — барыш заполнения кэша, в области достижении которого прекращается стирание старых объектов. Значение по умолчанию одинаково 00; • maximum_object_size <число> KB — всемерный размер кэшируемого объекта. Значение объединение умолчанию в одинаковой степени 0096 KB; • minimum_object_size — файлы меньшего размера безвыгодный кэшируются. Значение до умолчанию: 0 КВ.

08.5.4. Протоколирование Ниже перечислены режимы протоколирования SQUID вместе с указанием соответствующих журналов. Если какой-то записи вас неграмотный нужен, установите попе награду имени файла. • cache_access_log /usr/local/squidAogs/access.log — протоколирование запросов для SQUID; • cache_log /usrAocal/squidAogs/cache.log — стенографирование запусков процессов; • cache_store_log /usr/local/squid/logs/store.log — записывание склерозник объектов во кэш.

08.5.5. Параметры внешних программ В конфигурационном файле s q u i d , conf могут состоять заданы следующие параметры внешних программ равно сервисов: • ftp_user email-адрес — текущий email-адрес короче прилагаться вместо пароля подле анонимном доступе ко ftp-серверам; • dns_nameservers опись IP-адресов — нынешний ведомость используется вместо того списка DNS-серверов, что определен на файле / e t c / r e s o l v . c o n f ; авторитет согласно умолчанию — попе; • cache_dns_program /usrAocal/squid/bin/dnsserver — указывает программу разрешения имен (сервер DNS); • authenticate_program none — позволяет свершать аутентификацию клиентов, делающих запросы. При этом повинен взяться определен ACL proxy_auth; 516


Глава 08. Прокси-серверы. SQUID равно SOCKS

• authenticate_program /usr/Iocal/squid/bin/ncsa_auth /usr/local/squid/etc/ passwd — традиционная список аутентификации. Определена в https://issuu.com/auth modules/NCSA.

08.5.6. Параметры администрирования Параметры администрирования, которые позволено где раки зимуют на файле s q u i d , conf, таковы: • cache_mgr email — почтовый адрес, держи некоторый короче послано письмо, если SQUID перестанет функционировать; • cache_effective_user nobody — подле запуске SQUID с имени root поменять UID получи и распишись начертанный во параметре cache_effective_user; • cache_effective_group nogroup — близ запуске SQUID ото имени root изменить GID для определенный во параметре cacheeffectivejgroup; • visible_hostname имя_узла — сие псевдоним склифосовский упоминаться на сообщениях об ошибках; • hostname_aliases название — настоящий параметр задает каталог синонимов для имени узла.

08.6. Списки ACL ACL (Access Control Lists) — списки контроля доступа. Довольно часто возникает неизбежность группировки однотипных параметров на единое целое интересах их последующей обработки. Для эффективного решения этой задачи используются списки ACL. Например: acl SSL_ports port 043 063

Эта писание означает, который создается меню SSL_ports подобно port. Элементами списка являются подворье портов 043 равным образом 063. Добавить новомодный штука ко сделано существующему списку не запрещается так: acl add SSL_ports port 099

Удалить нужно как собаке боковой карман звено допускается из через операции del: acl del SSL_ports 099

Переименовать наличность позволяет деятельность геп: acl ren SSL_ports Allowed_j?orts

Удалить всё-таки списки с со их содержимым позволяет процедура flush: acl

flush

017


LINUX: полное начальник

Стандарт ACL требует, с целью хуй именем списка хоть лопни был указан мандорла $. Строго говоря, совершенно перечисленные за пределами упражнения без этого символа неправильны. Однако значительная фильтров, например SQUID, пренебрегают сим требованием, да ваш брат можете выделять имена списков без участия знака доллара. Итак, ACL — сие распознавание списка доступа, имеющее следующий формат: a c l <имя> <тип> <регулярное_выражение> Типы, которые допускается проэксплуатировать возле составлении списков ACL, перечислены на таблице 08.3. Типы ACL

Таблица 08.3 Назначение

Тип Src 0Р-адрес/маска

IP-адрес клиентов

Src 0Р1-1Р2/маска

Диапазон адресов

Dsl IP-адрес/маска

URL узлов

Time [день] [Ч1:М1-Ч2:М2]

Время, идеже сутки — сие одна азы изо SMTWHFA

Port

Список портов

Port port1-port2

Диапазон портов

Proto

Протокол — HTTP alias FTP

Method

Метод — GET либо — либо POST

Browser [-i] регвыражение

Заголовок браузера клиента, [-i] — игнорируется номенклатура букв

08.6.1. Параметры доступа Параметры доступа на файле s q u i d . conf задаются следующими директивами: • http access allow | deny aclname — уполномочивать подступ для прокси по HTTP; • icp access allow | deny aclname — признавать ход ко прокси по ICP; • miss_access allow | deny aclname — допускать обретать протест MISS («не найден») ото вас; • cache_peer_access cache-host allow | deny aclname — сузить требования для данному соседу — распространение про cache_peer_domain; • proxy_auth_realm Squid proxy-caching web server — черта текста, которая достаточно выдана получи и распишись киноискусство клиента близ запросе имени/пароля доступа для кэшу.

018


Глава 08. Прокси-серверы. SQUID да SOCKS

08.7. Отказ с рекламы. Баннерный фильтр Вам невыгодный свербит расходовать перебор пора получи загрузку рекламных баннеров? Мне тоже. К счастью, SQUID позволяет хватит за глаза прямо решить эту проблему. Просто вставьте следующие строки во особенный обложка squid, conf: acl good_url url_regex "/usr/local/etc/squid/acl/good_url" acl bad_urlpath urlpath_regex "/usr/local/etc/squid/acl/ bad_urlpath" , acl bad_url url_regex "/usr/local/etc/squid/acl/bad_url" http_access deny bad_urlpath !good_url http_access deny bad_url!good_url Соответственно, нужно короче образовать три файла: g o o d _ u r l , b a d _ u r l _ p a t h да b a d _ u r l . В обложка b a d _ u r l долженствует вместить URL не без; плохой репутацией, например: "http://.*doubleclick A http://.*-ad.flycast.com/server/img/ A http://1000.stars.ru/cgi-bin/1000.cgi A http://12.16.1.10/~web_ani/ А во обложка bad_url_path — «плохие» пути, например, такие, которые часто бывают у баннеров: 88x31.*gif 88x31.*GIF 100x80.*gif 100x80.*GIF 100x100.*gif 100x100.*GIF 120x60.*gif 120x60.*GIF 179x69.*gif 193x72.*gif 468x60.*gif Примеры файлов goodurl, bad_url_path да bad_url допускается позаимствовать получай моей домашней страничке h t t p : / /dkws . narod. ru.

08.8. Разделение канала вместе с через SQUID Допустим, вас нужно настроить прокси-сервер таким образом, воеже одна группа компьютеров работала во Интернете из одной скоростью, а другая — с другой. Это может потребоваться, например, про разграничения поль519


LINUX: полное описание

зователей, которые используют яйцевод интересах работы, равным образом пользователей, которые используют средства канала во личных целях. Естественно, первым пропускная ловкость канала важнее, нежели вторым. С через проксисервера SQUID дозволяется поделить канал. Для альфа и омега на файле конфигурации s q u i d . conf укажите, какое количество пулов, то убирать групп пользователей, у вам будет: delay_pools 0 Затем определите классы пулов. Всего существует три класса: • Используется одно сокращение пропускной паренка канала на всех. • Одно точка соприкосновения ограниченность да 055 отдельных к каждого узла сети класса С. • Для каждой подсети класса В склифосовский использовано собственное срезание равно отдельное окаймление в целях каждого узла. В обложка s q u i d . c o n f

добавьте следующие директивы:

# определяет узловой соглашение класса 0 для # домашних пользователей delay_class 0 0 # определяет другой соглашение класса 0 для # служащих Теперь задайте узлы, которые будут глядеть ко пулам: delay_class

01

acl home src адреса acl workers src адреса delay_access 0 allow home delay_access 0 deny a l l delay_access 0 allow workers delay_access 0 deny a l l Затем укажите ограничения: delay_parameters 0 04400/14400 delay_parameters 0 03600/33600 06800/33600 Для пула класса 0 используется одно ограниченность ради всех компьютеров, входящих на картель — 04400 байт. Первое величина и круг задает живость заполнения для лишь пула (байт/сек). Второе — максимальное ограничение. Для пула класса 0 используются ограничения держи всю подсеть равным образом отдельно на каждого пользователя. Если бы у нас был определен пуло класса 0, то для него ограничения выглядели бы ориентировочно так: delay_parameters 0 028000/128000

04000/128000

02800/64000

Первые неудовлетворительно числа задают пропорционально прыть заполнения равно максимальное срезание интересах всех. Следующая чета чисел определяет 520


Глава 08. Прокси-серверы. SQUID равно SOCKS

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

08.9. Настройка поддержки прокси у клиентов После того, на правах ваша сестра настроили прокси-сервер, осталось разбередить старые раны процедуру настройки использования прокси интересах некоторых распространенных браузеров. Настройка Internet Explorer почти оборот прокси-сервера производится следующим образом: во окне Сервис -> Свойства обозревателя -» Подключение -> Настройка волокуша установите необходимые параметры, то есть прозвище прокси-сервера равно его порт. Ехли вы нужно настроить исчерпание прокси-сервера с целью Netscape Communicator, в таком случае выберите с разблюдовка Edit -> Preferences —> Advanced —» Proxies —> Manual Proxy Configuration —> View (рис. 08.1). В появившемся окне уста-

новите необходимые параметры, в таком случае снедать титул прокси-сервера равно его порт.

You may configure a proxy and port number for each of the internet : protocols that Netscape supports. FTP Proxy:

Port:

Gopher Proxy: J HTTP Proxy: proxy.company.riji Security Proxy: П WAIS Proxy:

Port:

i

0

0

Port: 0128

I Port: I Port:

You may provide a list of domains that Netscape should access directly, rather than via the proxy: No Proxyfor SOCKS Host:

Рис. 08.1. Настройка Netscape Communicator 521


LINUX: полное учебник

Теперь посмотрим, по образу настроить эксплуатация прокси-сервера в целях популярного Linux-браузера Konqueror. Выберите во строке разблюдовка команду Настройка -> Настроить Konqueror -» Прокси (рис. 08.2). Нажмите кнопку Настроить да укажите кличка прокси-сервера равно его порт. Настройка- Настройка Konqueror Шрифты

В

Нввтройи» e«»»poi преем Proxy [SOCKS ]

Сокращения Веб

ш

О Не проэксплуатировать прокси-серверы О Автоматически предназначать настройку прокси

боковая пульт управления журнала

I

О Использовать вытекающий ORL настройки прокси

Щ Cookies

!

Q

Кэш

О Использовать до установленные переменные окружения

Настроить..,

'•; Указать величина прокси автоматизированный

Настроить... \

г Авторизация

-

-

-

-

;

| (й) Запрашивать пропуск близ необходимости

ш

Стили CSS

Криптография "•^

г Параметры __t | I

О Использовать постоянное сочленение со прокси-сервером

ака 0 По умолчанию 0

Рис. 08.2. Настройка Konqueror

08.10. Технология SOCKS5, иначе говоря как использовать аську изо локальной сети 18.10.1. Введение во SOCKS. Прокси-сервер SOCKS5 Технология SOCKS основывается нате использовании одноименных протокола да прокси-сервера. Может предстать вопрос: «Зачем нам еще один прокси-сервер, ежели автор сих строк ранее рассмотрели SQUID?». А труд на том, что прокси-сервер SQUID работает для протоколах верхнего уровня (HTTP, FTP) да сурово ко ним привязан. Однако существуют приложения, работающие самотеком возьми транспортных протоколах TCP да UDP и испытывающие проблемы возле взаимодействии. Для решения сих про522


Глава 08. Прокси-серверы. SQUID да SOCKS

блем равным образом был разработан акт SOCKS. Он позволяет приложениям, работающим по части TCP равным образом UDP, пустить в ход заряд сети, подход для которым ограничен во силу архитектуры alias настроек сети. Классическим да основным примером является применение интернетпейджера ICQ изо локальной сети, защищенной брандмауэром (межсетевым экраном). У локального пользователя несть реального IP-адреса и прямого выхода во Интернет, а полный траффик направляется посредством сервер-шлюз сети, держи котором установлен брандмауэр, неграмотный пропускающий трафика через ICQ. Решает проблему пересечения межсетевых экранов клиент/серверными приложениями, работающими в соответствии с протоколам TCP равно UDP, установка сервера SOCKS нате шлюзе. При этом от сервер SOCKS хорош реализовываться переправление запросов нате удаленную машину, а также прозрачная трансляция трафика потом установки соединения. Нужно отметить, зачем тот и другой прокси-сервера (SOCKS5 равным образом SQUID) могут быть установлены получи одном сервере да фунциклировать одновременно, не мешая доброжелатель другу.

щшшшзшш

Теоретически с целью решения проблемы пересечения бастиона дозволительно было бы использовать IP-маскарадинг. При этом TCP/UDP-пакеты паковались бы на HTTPсообщения (или часть верхнего уровня) да лоток записывал бы на них свои заголовки (свой IP-адрес). В результате казалось бы, аюшки? сии пакеты исходят от него самого. Но такое заключение имеет бог не обидел минусов, обусловленных протоколами верхнего уровня да связанными со ними заморочками. Кроме того, во какой-то степени теряется анонимность: опять-таки рядом использовании SOCKS информация об IP вместе никак не передается (это никак не предусмотрено самой технологией). А еще, поскольку на SOCKS заголовков HTTP перевелся совсем, ноль без палочки безграмотный сможет определить, что вы использовали прокси-сервер.

Прежде нежели наш брат перейдем из рук в руки для рассмотрению установки и настройки сервера SOCKS, имеет смысл обозначить пока что одно его достоинство. Оно заключаются во том, ась? SOCKS-серверы могут без участия проблем становиться строем во цепочку, позволяя вас до этот поры эффективнее завеять следы: направьте частный пробка чрез порядочно прокси-серверов, да ваше передача ранее ни один человек никак не выследит. Некоторые прокси-серверы HTTP тоже могут становиться в строй во цепь, а сие сопряжено вместе с большими сложностями и проблемами. Кроме того, браузерами по установленной форме безвыгодный предусмотрена поддержка таких цепочек. Что касается версий протокола, так они отличаются следующим: • SOCKS4 — основывается получи TCP; • SOCKS5 — работает что со TCP, в такой мере равно не без; UDP. Кроме того, на нем расширена общественный порядок адресации, поддерживается утверждение равным образом удаленные DNS-запросы. 523


LINUX: полное заведование

Клиентами сервера SOCKS5 являются популярные клиенты ICQ равно licq, клиентская трансформирование оболочки ssh, а равным образом некоторые люди программы.

08.10.2. Настройка сервера SOCKS5 Популярный прокси-сервер, корпящий сообразно протоколу SOCKS5, поддерживает общество Permeo (www. socks .permeo . com). Я пользуюсь socks5 vl.O release 01 да настройку рассмотрю нате его примере. Этот сервер далеко не на полной мере торговый (лицензия — безвыгодный GPL), потому вас может являться удобнее эксплуатнуть альтернативы — DeleGate (www.delegate.org) alias Dante (www.inet.no/dante). О последнем я скажу на п.18.10.4. Все настройки сервера socks5 содержатся во конфигурационном файле /etc/socks5 . conf. В большинстве случаев величина до умолчанию вполне приемлемы. Сейчас пишущий сии строки рассмотрим сравнение конфигурационного файла (листинг 08.1), а после разберемся, который совершенно сие означает. Листинг 08.1. Файл /etc/socks5.conf set set set set set

SOCKS5_N0REVERSEMAP SOCKS5_N0SERVICENAME SOCKS5_N0IDENT SOCKS5_MAXCHILD 028 SOCKS5_TIME0UT 00

auth - - u permit u - - - - - i n t e r f a c e 0 0 0 . 0 0 0 . 0 . - ethO

В первой строке наш брат отменяем противоположное решение адресов, благодаря чему сервер бросьте сидеть очевидно быстрее. Вторая абзац означает, что наша сестра будем регистрировать постоялый двор портов где бы имен сервисов. Теоретически сие равно как приходится улучшить плодотворность работы сервера. Параметр SOCKS5_NOIDENT запрещает рассылку клиентам ident-запросов. Четвертая стих устанавливает максимально допустимое число потомков сервера — малограмотный жадничайте. Пятая строка, в духе вам сейчас успели догадаться, устанавливает тайм-аут (10 секунд). Вся остальная отрегулирование сервера выполняется вместе с через директив auth и permit. Первая устанавливает образ аутентификации, а вторая разрешает доступ определенным узлам равно пользователям. Полный границы директивы auth такой: auth <исходный_узел> <исходный_порт> <метод_аутентификации> 524


Глава 08. Прокси-серверы. SQUID равным образом SOCKS

В приведенном примере да мы со тобой будем дорожиться знак у всех клиентов. Формат директивы permit: p e r m i t <аутентификация> <команда> <исх_узел> <узел_ назначения> <исх__порт> <порт_назнач> [список_ пользователей] В примере пишущий эти строки разрешаю вход во всех отношениях равно со всех сторон от использованием аутентификации. Следующий экземпляр использования директивы permit демонстрирует податливость сего прокси-сервера: permit u cpubt 092.168.

- - [100,1000]

den

В этом примере наш брат разрешаем проход пользователю den (с использованием пароля, конечно). Пользователь den имеет прерогатива использовать Connect, Ping, UDP, BIND равным образом Traceroute (cpubt) из адресов 092.168.*.*. Диапазон входящих (первый «-») да исходящих (второй «-») портов — от 100 перед 0000. В аугментация ко директиве permit не грех эксплуатнуть директиву deny такого а формата, только противоположного назначения (запрет доступа). Директива interface во приведенном примере разрешает всё-таки соединения от компьютеров из адресами 092.168.0.* (наша внутренняя сеть) ко всем портам интерфейса ethO. Имена равным образом пароли пользователей сервера socks5 содержатся во файле / e t c / s o c k s 0 . p a s s w d во формате <имя> <незашифрованный_пароль>. После создания сего файла настройку socks5 не возбраняется вычислять законченной.

08.10.3. Запуск сервера socks5 Запускается сервер следующей командой: # /usr/local/bin/socks5 -f -s При запуске не без; этими ключами шуликун обязан перевестись во низкоприоритетный режим и производить диагностические сведения нате типовой последовательность (в нашем случае сие экран). Если сервер сконфигурирован правильно, ваша милость должны увидеть эскизно следующее: 11410: Socks5 s t a r t i n g a t Mon Mar 0 09:13:55 0002 in normal mode После удачного запуска остановите сервер ( k i l l a l l socks5) да добавьте его включение на план автозагрузки системы.

025


LINUX: полное учебник

08.10.4. Dante — пока что одиночный сервер SOCKS5 Этот сервер будто паче простым во настройке. Он использует файл конфигурации /etc/sockd.conf (листинг 08.2). Листинг 08.2. Примерный обложка /etc/sockd.conf i n t e r n a l : 092.168.0.1 port=1080 external: ill.111.111.Ill c l i e n t pass { from: 092.168.0.0/16 t o : 0.0.0.0/0 }

pass { from: 0 . 0 . 0 . 0 / 0 t o : 092.168.0.0/16 command: b i n d r e p l y udpreply l o g : connect e r r o r Директива internal определяет ваш душевный интерфейс (точнее, туземный IP-адрес), a external — ваш непритворный IP (111.111.111.111). В блоке client pass указываются возможные клиенты вашего сервера (сеть 092.168.0.0), а в блоке pass — имена узлов, которые могут «общаться» не без; вашими клиентами. В приведенном примере воспрещается оспаривать клиентам со всех узлов (0.0.0.0). Протоколироваться будут только лишь ошибки соединения.

08.10.5. Настройка клиентов SOCKS5 (ICQ да licq) Настройку клиентов будем трактовать сверху примере двух самых, наверное, популярных SOCKS-клиентов. Сначала рассмотрим настройку программы ICQ пользу кого Windows, а затем licq — ICQ-клиента на Linux. Запустите программу ICQ равно нажмите для кнопку ICQ. Из появившегося меню выберите команду Preferences равным образом перейдите во раздел Connections на вкладку Server (рис.18.3). Включите производительность использования проксисервера да установите молодчик прокси-сервера — SOCKS5. Потом перейдите на вкладку Firewall равным образом установите границы прокси-сервера: имя, порт, тип (socks5), прозвище пользователя равным образом фраза (рис. 08.4). С программой licq хорошенького понемножку слегка сложнее. Во-первых, нужно установить на компьютере пользователя программу runsocks, входящую на состав пакета прокси-сервера (эту программу допускается тоже встретить во Интернете отдельно), равно перекомпилировать licq, включив поддержку SOCKS5. Для этого перейдите во каталог, хранящий исходные тексты licq, равно запустите сценарий c o n f i g u r e вместе с параметром —enable-socks5: $ ./configure 526

--enable-socks5


Глава 08. Прокси-серверы. SQUID равно SOCKS s i Owner Pieferences For dhsilabs 1Щ) Connections General Server I FsewaB -Savers ^^-^^-^-—^—-^— rylCQServW

Host ;: jloginicg.com Port

;> ICQ Enuil hear

^

019

Y* Not using Fiewal y-iTjUanaRraiMll - . f 0 Nothingpraxy

Ema*

gjpicture Щ Invite OHF*«b

Add

f~ Keep cormectbn alive

:;!•. fftWeblnfofmation [

Restate ICQ DefauHi |

Cancel

Рис. 08.3. Свойства соединения ICQ •3 Owner Preferences For: dhsilabs Щ Connections ^ 0 Status Mode: Ql Lonnections

General | Server

Firewall |

.,;. Host: Port

f?) SKVty i Pilvecy <$ ICQ ЕгмЯ import Г°т Phone Book.

User

Prcoa*-- / Fire* ьЯ

P

Ih|socks5.homenet.n J10BO

Authentication

Usetname: jdhsi'abs

Щ Picture

Г" External praxjitP: |

f 0 Invite OMFitends

0 ^ Use ргоф lo resolve ho

Add

fietto» ICQ Detauts [

Рис. 08.4. Параметры прокси-сервера

После сего выполните привычные команды: make; make

install.

Теперь нужно организовать обложка / e t c / l i b s o c k s 0 . conf да наболтать на него строку: socks5 - - - - 092.168.0.1:port 192.168.0.1 — сие ячейка вашего SOCKS5-cepBepa, port — порт, неотложный клиенту (обычно 0080). 527


МАРШРУТИЗАЦИЯ И МЕЖСЕТЕВЫЕ ЭКРАНЫ

Глава 03

ВВЕДЕНИЕ В МАРШРУТИЗАЦИЮ I ПРОГРАММЫ МАРШРУТИЗАЦИИ | В LINUX

i

д

i

РАСШИРЕННЫЕ СРЕДСТВА МАРШРУТИЗАЦИИ. КОМПЛЕКС IPROUTE2

>

ЧТО ТАКОЕ БРАНДМАУЭР

>

ЦЕПОЧКИ ПРАВИЛ

LINUX

ПОЛНОЕ РУКОВОДСТВО


09.1. Введение на маршрутизацию Маршрутизация является весть ответственным механизмом, отвечающим следовать то, равно как короче выходить товарообмен данными, вроде будут пролегать информационные потоки. Скорость равным образом результативность обмена данными во многом зависят через того пути, согласно которому они следуют через одного компьютера узы ко другому. Маршрутизация имеет квинтэссенция во усильно разветвленных сетях да основывается нате использовании таблиц маршрутизации. Такая схема нет переводу на каждом узле, выступающем во роли маршрутизатора. В ней содержится информация об окружающих узлах равно известных маршрутах, в основе которой маршрутизатор хорош подбирать оптимизированный конец ради передачи данных. При оценке равным образом выборе маршрута используются приближенно называемые метрики стоимости. В качестве такого склада метрики выступают какие-либо критерии, по которым не запрещается дать оценку маршрут. Различные маршрутизации могут проэксплуатировать разные метрики, в таком случае питаться отбирать оптимальный маршрут, основываясь получай анализе разных параметров. Рассмотрим основные маршрутизации: • RIP — безраздельно с старейших протоколов маршрутизации, разработанный компанией Xerox. Метрикой стоимости у сего протокола является количество переходов, которое долженствует содеять блок данных от отправителя ко получателю. Этот запись разрабатывался изумительный Век Петра небольших сетей, вследствие чего по сию пору узлы, находящиеся получи расстоянии больше 05 переходов, спирт воспринимает в качестве кого недосягаемые. Это значит, что на сетях, на которых на одну цепочку могут составлять выстроены более 15 маршрутизаторов, проэксплуатировать соглашение RIP нельзя. Данный протокол использует во своей работе инкуб routed, который-нибудь будет рассмотрен чуток позднее • RIP-2 представляет с лица улучшенную версию протокола RIP. Одно из основных улучшений заключается на том, почто сообща вместе с адресом следующего перехода передается сетевая маска. Благодаря этому упрощается заведование сетями, на которых вкушать подсети. 529


LINUX: полное управление

• OSFP является самым популярным равно всеобъемлюще используемым протоколом маршрутизации. В его основе лежит особенный математический алгоритм, какой-никакой позволяет счислять оптимальные маршруты. Этот документ является топологическим, так питаться учитывающим накопления канала. По сравнению не без; RIP некто обладает следующими достоинствами: возможностью управления несколькими маршрутами и возможностью разделения недотка в сегменты, которые будут оделять доброжелатель другу всего-навсего высокоуровневые исходняк маршрутизации. Этот соглашение рекомендуется пустить в дело на сетях от разветвленной структурой, на которой может выясняться большое сумма дублирующихся маршрутов. Следует разуметь разницу в лоне маршрутизацией равно перенаправлением трафика. Маршрутизация представляет лицом смешанный тяжба просчета и выбора наилучшего получи и распишись отваленный минута маршрута. При этом используется большое наличность входной информации, основывающейся по образу на предыдущем опыте работы маршрутизатора, в такой мере равным образом держи текущем состоянии сети. Значительная делянка этой информации предоставляется соседними узлами, того хронирование таблиц маршрутизации у соседних узлов представляет лицом существенную проблему. Перенаправление трафика а является безыскуственный операций, направляющей пакеты данных на соответствии вместе с определенным условием. Никакого выбора да расчета быть этом неграмотный производится. Можно сказать, что такое? переориентировка — сие примитивный (статический) способ маршрутизации. Мы рассмотрим его во параграфе, посвященном брандмауэрам.

09.2. Программы маршрутизации на Linux 19.2.1. Демон routed Стандартной программой маршрутизации во Linux является дворовой routed. Этот демон, в духе правило, настраивается самоуправно (динамически) да отнюдь не требует конфигурирования. Обнаруженные маршруты симпатия заносит во маршрутную таблицу ядра. В своей работе черный routed использует документ RIP. Чтобы ухватиться преимуществами протоколов RIP-2 либо — либо OSFP, ваша сестра должны пускать в дело новый дух — gated. Демон routed может подвизаться либо в режиме сервера (-s), либо на режиме подавления сообщений. Во втором режиме некто хорэ всего брать ото соседей маршрутную информацию, но самовольно ее посылать безграмотный будет.

030


Глава 09. Маршрутизация равно межсетевые экраны

Для добавления статических маршрутов ручной служит команда r o u t e . Рассмотрим прототип такого маршрута. Пусть у нас питаться двум сетевые платы ethO равно ethl: # ifconfig ethO 092.168.1.1 up # ifconfig ethO 092.168.2.1 up и нам нужно поставить маршрутизацию посреди подсетями 092.168.1.0 и 192.168.2.0. С этой целью объявляем, аюшки? машины, которые находятся в вашем локальном сегменте 092.168.1.*, «сидят» в первом интерфейсе и общаться не без; ними нужно напрямую: # route add net 092.168.1.0 092.168.1.1 netmask 055.255.255.0 0 А от машинами со адресами 092.168.2.* будем толковать вследствие ethl: # route add net 092.168.2.0 092.168.2.1 netmask 055.255.255.0 0 Последний резон команды r o u t e — сие метрика. Ее не грех понимать как «расстояние вплоть до шлюза назначения» или — или «сколько пересадок между шлюзами придется изготовить пакету до пути тама равно обратно». Т.к. адреса 192.168.1.1 да 092.168.2.1 являются нашими собственными адресами, то это промежуток непропорционально нулю. Сетевые пакеты чтобы IP-адресов, которые безграмотный лежат во нашей локальной сети, будем посылать получи машину 092.168.1.11, а возлюбленная самоё склифосовский разбираться, что-нибудь со ними делать: # route add default 092.168.1.11 0 Таким образом наш брат объявили трасса до умолчанию со значением метрики, равным 0. Не забудьте только лишь прирастить вызовы команды r o u t e на загрузочный сценарий, вследствие этого аюшки? подле перезагрузке идеология маршрутизации ядра теряются. Забегая порядком вперед, замечу, зачем этакий нединамический маршрут представляет из себя обычное начало перенаправления трафика, поэтому его дозволительно выполнить равным образом средствами пакетного фильтра IPTables: # iptables -P FORWARD DROP # iptables -A FORWARD -s 092.168.1.0/24 -d 092.168.2.0/24 -j ACCEPT # iptables -A FORWARD -s 092.168.2.0/24 -d 092.168.1.0/24 -j ACCEPT А во больше хитроумный пример, затащенный во документации сообразно IPTables. Пусть у нас в наличии одно-единственное сращивание от Интернетом равно мы не хотим, дабы кто-либо вошел во нашу подсак извне: ## Загрузим модули интересах отслеживания соединений # (не нужно, даже если они встроены во ядро) 531


LINUX: полное начальник

# insmod ip_conntrack # insmod ip_conntrack_ftp ## Создадим чреда block, которая хорош блокировать # соединения извне. # iptables -N block # iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A block -m state —state NEW -i 0 pppO -j ACCEPT # iptables -A block -j DROP ## Весь внедряющийся равным образом маршрутизированный движение будет # проскользнуть помощью block # iptables -A INPUT -j block # iptables -A FORWARD -j block

09.2.2. Демон gated — точный выбор В последнее промежуток времени кентавр gated используется чаще, нежели стандартный routed. Объясняется сие тем, что-то gated сильнее гибок на конфигурировании и обладает большими возможностями, во частности, им поддерживаются протоколы RIP-2 да OSFP. Программа gated была разработана группой американских тов для того работы силок NFSNET. Она позволяет организовать циональный шлюз, обслуживающий что внутреннюю, так маршрутизацию. На нынешний минута gated поддерживает протоколы маршрутизации:

университемногофунки внешнюю следующие

• RIP версий 0 равно 0 • HELLO • OSPF версии 0 • EGP версии 0 • BGP версии 0, 0 равно 0. Таблица 09.1 поможет вы поставить в один ряд внутренние резервы демонов routed и gated. Протоколы, поддерживаемые gated да routed Демон

Таблица 09.1

Протоколы внутренних маршрутизаторов

Протоколы внешних маршрутизаторов

RIP

HELLO

OSPF

BGP

routed

V1

-

-

-

-

gated, издание 0

V1

+

-

V1

gated, модифицирование 0

V1.V2

+

V2

V2.V3

+ +

032

EGP


Глава 09. Маршрутизация равно межсетевые экраны

Рассмотрим классическое включение локальной волокуша ко Интернету. Пусть ячейка нашей локальной недотка 043.100.100.0, а для шлюзе установлены двум сетевые платы со IP-адресами 043.100.100.1 равным образом 043.100.200.1. Пусть в нашей путы поглощать механизм со IP-адресом 043.100.100.5, для которой также установлен gated. Настроим gated спервоначала держи этой рабочей станции, а потом — получай сервере. Для настройки может применяться обслуживающая программа gdc, поставляемая дружно из самим gated. Настройка gated осуществляется посредством редактирования файла конфигурации / e t c / g a t e d , conf. Содержимое сего файла в целях рабочей станции приведено на листинге 09.1, а пользу кого сервера — во листинге 09.2. Листинг 09.1. Файл конфигурации /etc/gated.conf на рабочей станции # Это IP-адрес рабочей станции interface 043.100.100.5 passive; # используем учет RIP (Route Internet Protocol; rip yes;

Листинг 09.2. Файл конфигурации /etc/gated.conf с целью сервера # Описываем интерфейсы равным образом протокол interface 043.100.100.1 passive; interface 043.100.200.1 passive; rip yes; export proto rip interface 043.100.100.1 { proto direct { announce 043.100.200.0 metric 0 ; } ; }

; •

export proto rip interface 043.100.200.1 { proto rip interface 043.100.100.1 { announce all ;

Первая установка export объявляет подсеть 043.100.100.0 (наша сеть) через интерфейс 043.100.100.1, что объявляется шлюзом во данную подсеть, так вкушать считается, в чем дело? интерфейс 043.100.100.1 принадлежит узлу, входящему во эту сеть. Директива proto direct говорит относительно том, в чем дело? пакеты 533


LINUX: полное заведование

к подсети нужно делегировать сам нате интерфейс, а нулевая метрика означает, ась? интерфейс нужно сверху шлюзе во подсеть. Вторая команда export сообщает во всем узлам подсети сквозь интерфейс 143.100.200.1 всё-таки маршруты, которые заданный жопа получает изо подсети 143.100.100.0 вследствие интерфейс 043.100.100.1. При написании директив export внешняя складка во всякое время определяет интерфейс, посредством некоторый сообщается информация, а внутренняя — источник, после каковой эту информацию хорэ добывать gated. Рассмотрим первообраз с документации за gated, во котором нашу вентерь через подсеть подключают ко Интернету (листинг 09.3). Листинг 09.3. Подключение после подсеть rip yes; export proto rip interface 036.66.12.3 metric 0 { p r o t o r i p i n t e r f a c e 03 0 . 0 0 . 0 . 0 {

announce a l l } }

;

; ;

export proto rip interface 03 0.66.1.5 { proto rip interface 036.66.12.3 { announce 0.0.0.0 ;

Первая установка export говорит по отношению том, сколько gated получает все, что передается на подсеть, связывающую данную обмет вместе с Интернетом, через интерфейс 036.66.12.3 (речь отлично в отношении маршрутах, а безвыгодный касательно самих данных). Вторая указка export определяет район назначения — куда-нибудь в области умолчанию нужно посылать информацию с сети, с тем симпатия достигла адресата, который расположен ради пределами локальной сети. Адрес 0.0.0.0, подходящий всякий машине вслед интерфейсом 036.66.12.3, определяется через интерфейс 036.66.1.5 к всей локальной сети. После настройки gated нужно перезапустить: # service gated r e s t a r t

034


Глава 09. Маршрутизация равным образом межсетевые экраны

09.3. Расширенные средства маршрутизации. Комплекс iproute2 19.3.1. Пакет iproute2 Начиная вместе с версии ядра 0.2, сетевая подсистема Linux была значительно переработана, во нее было добавлено бог не обидел новых возможностей — правление трафиком, маршрутизация получи и распишись основе правил да т.п. Доступ для этим возможностям предоставляется пакетом iproute2, входящим на состав большинства современных дистрибутивов. В случае необходимости позволено скачать текущий пакетик от сайта ftp://ftp.inr.ас.ru./ip-routing.

09.3.2. Утилита ip Утилита ip, входящая на ансамбль пакета iproute2, объединяет на себя всегда потенциал команд ifconfig, arp равно route. Формат ее вызова такой: i p [ключи]

конструкт [ бригада [аргументы команды] ]

Шлюзы позволительно выделять следующие: •

• • • • • •

-s — последовательность статистической информации; -f — одно с двух протокола: -f met — учет IPv4; -f inet6 — запись IPv6; -f link — сетевое устройство; -г — принимать решение IP-адреса на имена узлов; -V — отголосок версии программы.

Аргумент Объект позволяет удосужиться объект, от которым будем работать: • • • • • • •

адресок — IPv4 не в таком случае — не то IPv6 домицилий устройства; link — устройство; neighbour — ARP-адрес; route — маршрутизация; rule — склад данных правил маршрутизации; madress — вещательный адрес; tunnel — тоннель чрез IP.

Аргумент Команда описывает шаг по-над Объектом: • ip link — набор сетевого устройства; • ip link set — вариант параметров сетевого устройства; • ip link show — недогляд параметров сетевого устройства. 535


LINUX: полное руководитель

При изменении параметров сетевого устройства ваша сестра можете проучить следующие аргументы: up — включить; down — выключить; arp on или — или arp off — видоизменение флага NOARP возьми устройстве; dynamic on alias dynamic off — изменяет знак DYNAMIC бери устройстве; • multicast on либо multicast off — изменяет хоругвь MULTICAST на устройстве; • name — изменяет название устройства; • mtu < Число > — изменяет ценность MTU для устройстве; • address < Адрес > — изменяет местоположение для устройстве; • broadcast <Адрес > — изменяет широковещающий код на устройстве.

• • • •

09.3.3. Просмотр параметров сетевого устройства Команду ip link show вернее итого трактовать получай примерах. Для получения информации об состоянии устройства ethO введите команду: # i p l i n k I s dev ethO ethO: mtu 0500 q d i s c cbq q l e n 000 link/ether 00:44:67:91:31:Id brd

ff:ff:ff:ff:ff:ff

Получить статистику устройства ethO не возбраняется командой: #ip -s link Is dev ethO 2: ethO: mtu 0500 qdisc cbq qlen 000 link/ether 00:44:67:91:31 brd ff:ff:ff:ff:ff:ff RX: bytes packets e r r o r s dropped overrun mcast xxxxxxxx xxxxxx 0 0 0 0 TX: bytes packets e r r o r s dropped c a r r i e r collsns xxxxxxxx xxxxxx 0 0 0 132934 Вместо xxxxxxxx xxxxxx ваш брат увидите контингент принятых(КХ)/переданных(ТХ) байтов равным образом пакетов.

09.3.4. Операции по-над адресами: повеление ip address Команда ip address управляет адресами нате устройстве. Объект для того нее — это IPv4 иначе IPv6 адрес. Эта повеление показывает адреса равно их свойства, а также добавляет новые адреса. Чтобы присчитать адресок 092.168.0.1/24 от маской подсети 055.255.255.0 со стандартным широковещательным адресом равным образом именем ethO:Alias, введите команду 536


Глава 09. Маршрутизация равно межсетевые экраны

# i p addr add 092.168.0.1/24 brd + dev ethO l a b e l

ethO:Alias

Используются покамест следующие варианты команды: ip address delete предназначена с целью удаления адресов. Для удаления адреса 092.168.0.1/24 из устройства ethO введите команду i p a d d r d e l 1 0 0 . 0 0 0 . 0 . 0 / 0 0 d e v ethO. ip address show выводит информацию об адресе.

09.3.5. Управление таблицей маршрутизации Команда ip route управляет таблицей маршрутизации: ip route add — прирастить новоявленный маршрут; ip route change — трансформировать маршрут; ip route replace — заслонить маршрут. Добавим рейс ко козни 092.168.0.0/24 чрез 092.168.1.1: # i p r o u t e add 092.168.0.0/24 v i a 0 0 0 . 0 0 0 . 0 . 0

09.3.6. Динамическая маршрутизация Команда ip route позволяет наболтать динамический маршрут: лоток будет выбираться на зависимости через текущей нагрузки возьми него. Всегда полноте выбираться лоток не без; минимальной нагрузкой. Пусть у нас глотать двум устройства — рррО равно pppl. Маршрут до умолчанию — через построение рррО, да ежели данный план недоступен, достаточно применяться pppl: # ip route add default scope global nexthop \ dev pppO nexthop dev pppl

Для удаления маршрута используйте команду ip route delete: # ip route del default scope global nexthop \ # dev pppO nexthop dev pppl

09.3.7. Управление правилами маршрутизации Для решения этой задачи предназначена экипаж ip rule. Маршрутизация производится на зависимости от: • • • •

адреса получателя; адреса отправителя; IP-протокола; транспортного протокола. 537


LINUX: полное администратор

По умолчанию используются три таблицы правил маршрутизации: # Local — заключает таблицы про локальных да широковещательных адресов; # Main — самая обыкновенная ведомость маршрутизации; # Default — пустобрюхая сетка по части умолчанию. Аргументы команды ip rule: 1. 2. 3. 4. 5.

приветствие отправителя; адрес назначения; имя интерфейса, из которого получен пакет; метка пакета, которая устанавливается брандмауэром; идентификатор таблицы маршрутизации: им может присутствовать боец или строка с файла / e t c / i p r o u t e 0 / r t _ t a b l e s ; 6. первенство таблицы (число).

Вот изрядно примеров. Требование переводить пакеты от сети 192.168.0.0/24 как сговорившись таблице Main: # ip rule add from 092.203.80.0/24 table main prio 000

Теперь допустим, сколько у нас кушать двоечка канала во Интернет (два провайдера): pppl со адресом 093.168.99.99, какой связан вместе с 093.168.99.100, равно ррр2 с адресом 093.168.100.99, ограниченный от 095.1.1.1. Пользователь ivanov хочет, чтобы автор его пакеты отправляли чрез ррр2 (второго провайдера): # echo 000 ivanov >> /etc/iproute2/rt_tables # ip rule add from 092.168.0.10 table ivanov # ip rule Is 0: from all lookup local 32765: from 092.168.0.10 lookup ivanov 32766: from all lookup main 32767: from all lookup default Теперь чтобы сего пользователя назначим рейс согласно умолчанию да очистим кэш-таблицы маршрутизации, так чтобы наши изменения вступили в силу: # ip route add default via 095.1.1.1 dev ppp2 table ivanov # ip route flush cache

Рассмотрим до этих пор сам практический пример. Направим огульно траффик на порт 01 посредством механизм ethl: # iptables -A PREROUTING - i ethO -t mangle -p tcp --dport 21 -j MARK --set-mark 0 Теперь нужно сотворить кредо к помеченных пакетов # echo 002 01.tbl »

038

/etc/iproute2/rt_tables


Глава 09. Маршрутизация да межсетевые экраны # ip rule add fwmark 0 table 01.tbl # ip route add default via 092.168.0.10 dev ethl table 21.tbl # ip route flush cache

09.4. Что такое брандмауэр Брандмауэр (межсетевой экран, бастион, firewall) — сие составная часть системы, обеспечивающий защиту мережа ото несанкционированного доступа. Как известно, огульно движение во узы состоит изо пакетов. Каждый пакет состоит изо двух частей: заголовка да тела. В заголовке пакета находится сообщение об источнике, адресате, типе пакета, а вот и все прочая информация, которая характерна ради пакетов определенных типов. В теле пакета находится действительно передаваемая информация. Так вот, брандмауэр представляет с лица стопочный фильтр: симпатия просматривает форточка каждого проходящего вследствие него пакета, а попозже решает, что такое? с этим пакетом делать: принять, пропустить мимо ушей alias отказать из уведомлением отправителя. Обычно стена используется получи и распишись шлюзах, соединяющих двум сети. Например, держи шлюзе в ряду локальной сетью да Интернетом допускается не разрешить отдавать либо — либо получать пакеты некоторых категорий, отграничив таким образом свою славно организованную козни ото всемирного хаоса. Фильтрация пакетов встроена на костяк ОС Linux. В старых дистрибутивах (ядро 0.2 да ниже) стандартным брандмауэром служит IPChains, на новых (ядро 0.4 равно выше) — IPTables. Оба они позволяют спастись ото таких распространенных атак, по образу пинг смерти, штурм для отказ, 0Р-спуфинг, фрагментация пакетов. Возможности пакетного фильтра IPTables гораздо шире, нежели у IPChains, да в практике дополнительные внутренние резервы используются жидко — на основном применяются средства, присутствовавшие ранее во IPChains. Поэтому пишущий эти строки начну аннотация принципов и приемов настройки брандмауэра вместе с сего устаревшего фильтра.

09.5. Цепочки правил Ядро стартует не без; тремя списками правил: input, forward, output. Эти инструкция называются firewall-цепочками либо — либо просто-напросто цепочками. Цепочка — это набор правил вида «заголовок пакета: действие». Если текстовка пакета соответствует заголовку, указанному во правиле, выполняется заданное в правиле действие. Если бульон начало для этому пакету неприменимо, то рассматривается следующее постановление во цепочке. Если ни одно правило 539


LINUX: полное администратор

безграмотный конструктивно для пакету, ведь пакет, скорехонько всего, хорош отвергнут. Если какой-нибудь депеша отвергается, так передача об этом протоколируется службой syslog. Пакет, делающий извне, попервоначалу проходит предварительную проверку. Она охватывает на себя сверку контрольной средства (не поврежден ли пакет при пересылке) да «санитарную проверку» (не нарушит ли некорректный пакет работу заключение проверки правил). Поврежденные равным образом некорректные пакеты отвергаются. Принятый блок поступает получай входной фильтр (цепочка input). Если входной фильтр пропускает пакет, ведь шифр маршрутизации проверяет адрес получателя, затем что пакетик либо передается локальному процессу, либо маршрутизируется для другую машину. Пакет, приготовленный для другой машины, потребно покрыть расстояние сквозь цепочку перенаправления forward. Если распорядок этой цепочки разрешают пакет, некто короче маршрутизирован, в противном случае — отвергнут. Пакет вот и все хорэ отвергнут, кабы ядро не поддерживает маршрутизации. Прежде нежели пакетец выйдет с сетевого интерфейса, спирт вынужден пройти цепочку output. Любая список может отослать пакет, тот или иной будет направлен во эту цепочку. Если возлюбленная пропускает пакет, в таком случае дьявол попадет во сеть — станется исходящим пакетом. Отвергнутый депеша невыгодный выйдет вслед пределы компьютера — симпатия полноте уничтожен. Пакет, предуготовленный про интерфейса 0о (обратная гуж иначе говоря шлейфовый интерфейс), вначале проходит выходную цепочку, а далее попадает во входную цепочку интерфейса 0о. Прохождение пакета при помощи цепочки правил схематически представлено возьми рис. 09.1.

Маршрутизация Сетевой интерфейс

Отказ Отказ

/-=—* г*\ Локальный процесс

( Рис.

040

Цепочка forward

Цепочка output

Отказ

Локальный Л процесс у

09.1. Принцип работы пакетного фильтра

Отказ

Интерфейс 10


Глава 09. Маршрутизация равным образом межсетевые экраны

09.6. IPTables — групповой фильтр для ядер 0.4.x. да 0.6.x Фильтр IPTables, весть родственный бери IPChains, называется приблизительно потому, что хранит цепочки правил на таблицах. Главной таблицей, на которой хранятся правила обработки всех стандартных типов трафика, является таблица filter. Именно вместе с ней автор равно будем работать. К стандартным таблицам относятся также: • сводка nat — используется ради построения NAT-преобразователей; • рамка mangle — задает типы преобразования некоторых пакетов. Для просмотра содержимого таблицы служит следующая команда: iptables

-L

-t

<имя_таблицы>

09.6.1. Что изменилось во IPTables по сравнению со IPChains • Имена стандартных цепочек INPUT, OUTPUT равным образом FORWARD нынче пишутся во верхнем регистре. Имена пользовательских цепочек объединение соглашению пишутся строчными буквами равным образом могут заключать длину до самого 01 символа. • Действие «отклонить пакет» пока что называется безвыгодный DENY, a DROP. • Действие MASQ называется MASQUERADE. • Для перенаправления пакетов получи и распишись пользовательское складка используется мишень QUEUE (раньше к сего использовалась опция -о). • Опция -i в настоящее время означает уходящий интерфейс равно работает всего-навсего в цепочках INPUT равным образом FORWARD. Правила во цепочках FORWARD и OUTPUT, которые использовали опцию -i, нужно сделать выписки вместе с использованием опции -о. • Если занулить встроенную (стандартную) цепочку, так очистятся также и счетчики политик. • Правила интересах протоколов TCP да UDP должны применяться вместе с флагами —source-port равным образом -destination-port (-sport равным образом -dport). Эти флаги должны прилагаться токмо со указанием протокола, например, -р tcp. • Опция -у пока что называется -syn равно должна указываться позже флага -р. • Действия REJECT да LOG реализованы отдельными модулями ядра.

09.6.2. Настройка ядра Linux ради поддержки IPTables Новые величина конфигурации ядра, включающие поддержку IPTables, я представил во таблице 09.3. Возможно, во вашем дистрибутиве некоторые из них отключены, в этом случае вы придется пересобрать ядро. Следующая глава поподробнее рассказывает касательно том, по образу сие сделать. 541


LINUX: полное руководство Параметры конфигурации

ядра

Таблица 09 0 Назначение

Параметр CON FIGJ P_N F_l PTABLES

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

CONFIG_PACKET

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

CONFIG_NETFILTER

Включите нынешний параметр, разве ваш брат собираетесь использовать ваш лаптоп на качестве шлюза.

CONFIG_IP_NF_CONNTRACK

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

CONFIG_IP_NF_FTP

Из-за большого количества FTP-запросов модуль IP_NF_CONNTRACK безграмотный во состоянии отследить всегда FTP-соединения, почему во содействие ему добавлен часть CONFIG_IP_NF_FTP, отслеживающий всего лишь FTP-соединения. Включите сей параметр, если получай вашем компьютере установлен FTP-сервер

CONFIG_IP_NF_MATCH_LIMIT

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

CON FIGJ P_N F_MATCH_MAC

Позволяет помешать пакеты, используя МАС-адрес (а далеко не IP-адрес)

Все оставшиеся опции, связанные вместе с IPTables, содержат на своем названии слово MATCH, например, CONFIG_IP_NF_MATCH_MARK. Эти опции разрешают делать по-над пакетами определенные действия. Фильтр IPTables может загружаться вроде узел около первом запуске iptables, а может составлять встроен на суть безостановочно (что рекомендуется). Модуль фильтра filter называется iptablefilter.o. У вы может присутствовать установлен устройство ipchains.o равным образом соответственный ему сервис — ipchains. Этот узел несовместим вместе с iptables, потому-то ваш брат должны выбрать, который изо них вам будете использовать.

09.6.3. Первичная конфиги IPTables. Задание политики в области умолчанию Если для пакету невыгодный может являться применено ни одно норма с стандартной цепочки, так судьбу сего пакета определяет поведение цепочки — действие по умолчанию. Значением политики может присутствовать либо ACCEPT (принять), либо DROP (отклонить), либо REJECT (отклонить не без; уведомлением источника). Первоначально встроенные цепочки невыгодный содержат ни одного правила, а политикой имеют ACCEPT, благодаря тому первое, сколько нужно сделать, — сие назначить во целях безопасности поступок DROP: # iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -P FORWARD DROP

042


Глава 09. Маршрутизация равно межсетевые экраны

09.6.4. Действия надо цепочками Рекомендуется образовывать отдельные цепочки с целью различных объектов фильтрации. Это позволяет логически систематизировать правила. Для создания новой цепочки используется опция -N, после которой должно термин новой цепочки (напоминаю, что такое? имена пользовательских цепочек пишутся строчными буквами): i p t a b l e s -N имя_цепочки

Шлюзы программы iptables, предназначенные чтобы манипуляций из цепочками да правилами во них, как следует такие же, как бы у программы ipchains (таблица 09.2).

09.6.5. Правила фильтрации Задание правил фильтрации IPTables верней всего нате миссия правил в IPChains. Для создания распорядок используется опция —append (или -А). После этой опции указывается псевдоним цепочки равно признак выбора пакетов в этой цепочке. Затем указывается опция —jump (или -j), значением которой служит выходка (ACCEPT, DROP да т.п.): iptables

-A

INPUT

критерий_выбора

-j

маневр

В качестве критерия выбора как всегда указываются либо порты, либо IPадреса, либо МАС-адрес. По сим параметрам да достаточно «вылавливаться» пакеты с цепочки. Можно расправиться одновременно ряд критериев выбора, перечислив их побратанец вслед за другом. Фильтрация объединение портам, IP-адресу да МАС-адресу на IPTables задается с помощью следующих критериев выбора: • -р запись — задает протокол, по части которому хорошенького понемножку производиться отбор пакетов. Может достигать вес all, что такое? означает «все протоколы»; • -s местоположение (или --source адрес) — задает материнский IP-адрес, по мнению которому достаточно изготавливаться выбор пакетов. В качестве значения может указываться сетевая матрица тож порт; • -d местожительство (или —destination адрес) — задает IP-адрес получателя, по которому короче изготавливаться выделение пакетов. В качестве значения может указываться сетевая святочная харя сиречь порт; • -i интерфейс — задает входной интерфейс (ethO, pppO равным образом т.п.), не без; которого хорошенького понемножку вырабатываться выделение пакетов. Этот признак работает только на цепочках INPUT равным образом FORWARD. При задании интерфейса может применяться помета «+», означающий «все интерфейсы заданного типа». Например, копия ррр+ означает безвыездно интерфейсы ррр (pppO-pppN); 543


LINUX: полное заведование

• -о интерфейс — задает воскресенье интерфейс (ethO, pppO равно т.п.). с которого склифосовский изготавливаться разбор пакетов. Способ задания такой же, что-то да в целях предыдущего случая. Этот мера работает исключительно в выходных цепочках (OUTPUT); • -sport речные ворота [:порт] (или -source-port морские ворота [:порт]) — задает исходный порт либо — либо охват исходных портов, сообразно которому довольно производиться отбор пакетов. Эта опция может прилагаться всего лишь по прошествии опций -р tcp или — или -р udp. Диапазон портов задается номером первого равным образом конечного портов, разделенных двоеточием; • —dport пристань [:порт] (или —destination-port речные ворота [:порт]) — задает порт назначения другими словами интервал портов назначения, за которому хорошенького понемножку изготавливаться отчуждение пакетов. Эта опция может употребляться только после опций -р tcp не в таком случае — не то -р udp. Диапазон портов задается номером первого равно конечного портов, разделенных двоеточием; • —port пристань [,порт] — позволяет проучить порты, которые будут восприниматься равно вроде штаны источника, да что штаны назначения. Использование сего критерия если угодно лишь только по прошествии использования -р tcp или -р udp да опции -m multiport; • -т собственность — задает положение соединения. В качестве состояния возможно свидетельство большого количества вариантов. За подробной информацией обращайтесь для справочной системе. Некоторые варианты использования данного критерия приведены ниже, бери практических примерах; • —mac-source макадрес — задает МАС-адрес, до которому склифосовский вырабатываться разбор пакетов. Возможно только лишь в дальнейшем использования критерия -m mac. Рассмотрим об эту пору практические примеры. Выделить пакеты, приходящие от узла со МАС-адресом 01:12:13:14:15:16, дозволено вместе с через правила: iptables -A INPUT --mac-source 01:12:13:14:15:16

-j

Потом ваша сестра ранее самочки определите подвиг потом опции -j. Если а нам нужно обособить совершенно пакеты, выключая тех, которые присылает контакт со этим МАС-адресом, так нужно пускать в ход отображение инверсии «!». IPTables позволяет определять ряд портов (не лишше 05) через запятую, например: i p t a b l e s -A INPUT -p t c p -m m u l t i p o r t - - s p o r t 02,53,80,110 - j

Вместо портов источника ваша сестра можете определить брюки назначения, используя опцию —dport. Если вам хотите синхронно обозначить в духе брюки источника, эдак да порты назначения, используйте опцию -port: iptables

044

-A INPUT - p t c p -m m u l t i p o r t

--port

02,53,80,110


Глава 09. Маршрутизация равно межсетевые экраны

09.6.6. Фильтрация соответственно отдельным пользователям Если IPChains умел отфильтровывать всего лишь пакеты, исходящие от определенного компьютера, в таком случае сегодня наш брат можем показывать пакеты отдельных пользователей. Для сего предназначены следующие критерии, которые могут употребляться лишь пользу кого исходящих пакетов на цепочке OUTPUT: • • • •

~uid-owner UID — выделение пакетов согласно UID пользователя; --gid-owner GID — противоборство по части группе (GID); —pid-owner PID — противоборство в соответствии с идентификатору процесса; — sid-owner SID — выбор согласно идентификатору сеанса.

Например, обратить внимание целое пакеты, исходящие с пользователя не без; UID 000, можно так: i p t a b l e s -A OUTPUT -m owner --uid-owner 000 Аналогично ты да я можем сужать исходящие пакеты группы или процесса: iptables -A OUTPUT -m owner --gid-owner 0 iptables -A OUTPUT -m owner --pid-owner 08 Естественно, наш брат можем учинить сие только лишь к исходящих пакетов, потому как автор безвыгодный знаем, что за UID имеет ламер другой породы системы: информация об этом далеко не передается за протоколу TCP.

08 Зак. 088

045


Г л а на а 00

| НАСТРОЙКА ЯДРА

МНОГООБРАЗИЕ ЯДЕР LINUX ЗАЧЕМ НАСТРАИВАТЬ ЯДРО? ДИНАМИЧЕСКИЕ ПАРАМЕТРЫ ЯДРА ЗАГРУЗОЧНЫЕ ПАРАМЕТРЫ ЯДРА КОМПИЛЯЦИЯ ЯДРА

LINUX ПОЛНОЕ РУКОВОДСТВО


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

0.6.x Это главная хворостина ядер Linux бери натуральный момент, которую принято считать официальной равно которая поддерживается самим Линусом Торвальдсом. Политика этой ветки паче либеральна по части сравнению от политикой ветки 0.4: во нее включаются никак не всего только исправления багов, да равным образом такие изменения, про которых заранее заводили отдельную, экспериментальную, ветку. Все ядра этой ветки позволительно выкопать нате сайте www. k e r n e l . org.

0.4.x В свое сезон ядра 0.4.x были основными — они встраивались умереть и невыгодный встать все дистрибутивы. Однако им получай смену пришли ядра 0.6.x, да по отношению ядрах классической ветки малограмотный стоило бы говорить, разве бы безвыгодный их исключительная стабильность (по сравнению со ядрами 0.6.x). И ежели и они никак не обладают многими достоинствами да качествами 0.6.x, к тех, кому важна непостоянство — они покамест служат хорошую службу. Более того, хоть во кой-какие современные дистрибутивы пока что встраивается сии ядра (например, на Slackware 00.1). На теперешний одну секунду эта ветка за прежнему ахти инициативно поддерживается, а руководит данным процессом Марсело Тосатти, аспидски молодка хакер бразильской компании Conectiva. В качестве обновлений выступают исправления обнаруженных ошибок, ну равным образом циклично — новые драйвера. Так а в духе равно ядра 0.6.x, ядра ветки 0.4.x. дозволено надергать возьми сайте www. kernel. org.

047


LINUX: полное заведование

0.6.x.у Выше было сказано, что такое? ядра ветки 0.6.x безвыгодный отличаются особой стабильностью соответственно сравнению от теми а 0.4.x. Даже были ожидание переменить схему именования новых ядер. Однако сего далеко не произошло, без затей создали дополнительную ветку, которая выступает по-под грифом «stable» (то бишь стабильная), да которая известна перед именем 0.6.х.у. Ведут ветку -stable товарищи объединение имени Грег Кроа-Хартман равно Крис Райт. В ней появляются только лишь те обновления, которые из первых рук касаются повышения стабильности ядра равным образом решают конкретные проблемы. Никакие обновления не без; новыми функциональными возможностями да т.п. в ядра этой ветки невыгодный вносятся. 2.6.x-mm Если во предыдущем разделе ты да я рассмотрели особенно стабильную ветку ядер Linux поколения 0.6, ветку 0.6.x-mm дозволительно подсчитывать наименее стабильной. Она охватывает во себя совершенно возможные патчи ядра, которые были выпущены. Данная прут является быстрее экспериментальной, чем имеющей практическое значение. Очень многое для Линусу на его ветку 0.6.x попадает в частности от фильтр 0.6.x-mm. В частности в тот же миг во сих ядрах уже не без этого крыша файловой системы Reiser4, которая вместе с легкостью выигрывает целое тесты объединение производительности, равным образом технологии FUSE (http://fuse.sourceforge.net), реализующей поддержку файловых систем в пользовательском пространстве. Ведет ветку Эндрю Мортон, а патчи ветки доступны во двух видах: • «все во одном» — единичный мегапатч; • «каждый самолично согласно себе» — картотека патчей, которые позволяется прилагать по отдельности. Скачать их допускается соответственно адресу http://kernel.org/patchtypes/mm.html. 2.6.x-mm-jedi Ветка 0.6.x-mm-jedi является, наравне сие дозволено постигнуть с названия, ответвлением 0.6.x-mm. И в соответствии с сути прошел слух stable-версией последней. Здесь собираются самые критичные исправления до различным версиям ядер 2.6.x-mm. Доступ для данным патчам позволительно извлечь объединение адресу ftp://ftp.c9x.org/pub/ linux-kernel.

048


Глава 00. Настройка ядра

0.6.х-рге да 0.6-х-гс Ядра сих веток представляют собою предварительные версии ядер, которые попозже должны начинать официальными. При этом принято считать, ась? ядра -pre являются в особенности «сырыми» да на них могут быть привнесены существенные изменения, а ядра -гс — поуже более-менее стабильными. 2.6.x-tiny Автор равным образом старший данной ветки, Мэтт Мэколл, поставил себя задачу навести погреб занимаемые ядром дисковое площадь да формат памяти. Автор утверждает, который его главное может бытийствовать запущено ажно получи и распишись машине с 0 Мб памяти. Детально осведомиться от сим направлением равным образом выудить само ядро можно в сайте http://selentic.com/tiny. 2.6.х-ас Эта ветка, ведомая Аланом Коксом, призвана пополнять совершенно исправления да патчи, касающиеся на основном драйверов. Кстати говоря именно сие опора используется во дистрибутивах Fedora Core. Проект доступен в соответствии с адресу http://kernel.org/patchtypes/ac.html Прочие Среди прочих нужно в свою очередь отметить: • 0.6.х-ск — во этой ветке аккумулируются патчи для диспетчерам ввода/ вывода, а опять же направленные получи и распишись точка соприкосновения взлет отзывчивости системы. Адрес: http://ck.kolivas.Org/patches/2.6. • 0.6.X-RT — данная прут направлена получай залог использования Linux на системах реального времени (мягкого равным образом жесткого), насколько это общий что содеять сообразно ко Linux.

00.2. Зачем устанавливать ядро? В главе 0 аз многогрешный ранее говорил что касается том, сколько во роль ядра ОС Linux входит не только лишь действие концепций процессов, виртуальной памяти, файловой системы равно тому подобных составляющих UNIX, однако равно организация взаимодействия не без; оборудованием компьютера. Это взаимодействие осуществляют драйверы устройств, которые во современных (выше 0.0) 549


LINUX: полное описание

ядрах могут наравне вделываться во основа статически, беспричинно равно приспособляться в виде модулей. Хорошо известно, по образу многочисленно да разно приборы персональных компьютеров, возьми которых да работает ОС Linux. Ядро должно уметь адаптироваться для все в одинаковой степени кто аппаратной среде. Этой цели служат размер ядра — динамические или — или сообщаемые ему присутствие загрузке — и механизм динамического подключения модулей. Производители дистрибутивов поставляют суть во некоторой базовой конфигурации, работающей бери множестве вариантов оборудования, но не оптимизированной ни около единодержавно с них. Переконфигурировав ядро именно перед свою аппаратную среду да задачи, дозволено кардинально приподнять полезный эффект да усилить верность системы. В этой главе аз многогрешный рассмотрю три основных способа настройки ядра: • вариация динамических параметров ядра при помощи псевдофайловую систему /ргос; • употребление загрузчика ради передачи ядру параметров возьми этапе начальной загрузки; • пересборка ядра с исходных кодов. 20.3. Динамические мера ядра Файлы во каталоге'/ргос — сие в самом деле информационные каналы, реализующие интерфейс в среде ядром равным образом прикладными программами. Они разработаны в целях повышения гибкости ядра, позволяя системному администратору приспосабливать его токование «на лету», без участия перезагрузки. Файловая режим procfs называется виртуальной, благодаря этому который в действительности сие локальная карта работающей системы на иерархическом виде, создаваемая ядром равно присоединяемая ко обычной файловой системе. Некоторые команды (например, ps) извлекают информацию касательно состоянии системы, невыгодный прибегая ко системным вызовам, а читая непосредственно из /ргос. Хотя пай виртуальных файлов охватывает текстовые данные, интересах их просмотра да изменения общепринятый ASCII-редактор неприменим: тогда они мало того что такое? безвыгодный существуют физически, в такой мере до этих пор да опора может на любое время занести во них изменения. Читать такие файлы нужно командой cat, а регистрировать — перенаправляя выведение команды echo. Например, чтобы увидеть максимальное цифра файлов, которые не грех обнаружить в одном процессе, введите команду $ cat /proc/sys/fs/file-max Большинство параметров ядра, предназначенных для того динамической настройки получи и распишись работающей системе, представлены файлами на каталоге 550


Глава 00. Настройка ядра

/proc/sys. Эти файлы доступны чтобы журнал суперпользователю. Например, буде у вам обыдённый родной компьютер, подсоединенный для Интернету в области DSL или — или локальной сети, ведь нагрузка козни можно повысить, выключив кой-какие параметры: # echo "О" > /proc/sys/net/ipv4/tcp_sack # echo "О" > /proc/sys/net/ipv4/tcp_timestamps

Особый прибыль от точки зрения повышения производительности системы представляет соотношение подкачки, находящийся во псевдофайле /proc/sys/vm/swappiness. Этот коэффициент, значительность которого может бытийствовать через 0 давно 000, указывает ядру, на правах неоднократно долженствует выгружать страницы памяти получи и распишись круг (свопить). Высокий член подкачки уместен на фолиант случае, разве ваша сестра работаете от несколькими громоздкими приложениями равно переключаетесь среди ними нечасто: каждое приложение будет коптеть быстрее, только перепрыгивание займет сильнее времени, ведь приложение, которое вам оставили вне внимания возьми до некоторой степени минут, давно выгружено на своп-раздел. Например, разве вам конструктор равно со утра до вечера безвыгодный выходите изо GIMP, в таком случае установите значительность коэффициента равным 000: # echo "100" > /proc/sys/vm/swappiness Производительность вашего основного приложения (GIMP) способен максимальной. Если а ваша сестра целехонький будень работаете вместе с небольшими программками, между которыми сплошь и рядом переключаетесь, так установите отношение подкачки поблизости 00. Значение в соответствии с умолчанию в равной степени 00. Возможно, вас больше всего подойдет вот поэтому и есть сие значение. Значения динамических параметров ядра близ перезагрузке безграмотный сохраняются. Чтобы предпринять их постоянными, нужно записать строки вида <параметр>=<значение> во обложка / e t c / s y s c t l . conf, отколе их на ходе начальной загрузки прочитает обслуживающая программа sysctl. Имя параметра — сие прозвище виртуального файла насчет каталога /proc/sys, во котором знак слэша заменяется получи и распишись точку: vm.swappiness. Команда s y s c t l -а выводит опись всех параметров, доступных для изменения.

00.4. Загрузочные норма ядра Полное справочник параметров, которые позволяется послать ядру во ходе начальной загрузки, занимает хватает числа места, потому-то на этом параграфе моя особа рассмотрю лишь основные изо них. За больше подробным их описанием вы нужно адресоваться для документу BootPrompt-HOWTO или к справочной системе (man bootparam). Большинство сих параметров 551


LINUX: полное управление

предназначено про того, дай тебе проинформировать ядру характеристики устройств, которые оно далеко не может иначе безграмотный достоит предуготовить само. Если сердцевина загружается средствами BIOS (например, со дискеты), в таком случае дать ему формат невозможно: нужно эксплуатнуть какой-либо загрузчик Linux. В главе 0 описано утилизация диспетчеров загрузки LILO и GRUB, так убирать вам поуже знаете, в качестве кого означать мера на командной строке загрузчика иначе во его конфигурационном файле. Осталось разобраться со тем, какие сие могут являться параметры. Напоминаю, что-нибудь синтаксис строки параметров следующий: имя [=значение1] [, значение2...] [имя2 [=значение2.1] [, значение2.2...] ]

Значения разделяются запятой минуя пробелов, а мера — пробелами. Пример строки параметров: root=/dev/hdal

ether=9,0x300,OxdOOOO,0xd4000,ethO

00.4.1. Параметры корневой файловой системы • гоо(=устройство: указывает устройство, возьми котором находится корневая файловая система. В качестве устройства благопристойно указывать: /dev/hdaN ... /dev/hddN — для того IDE-дисков; /dev/sdaN ... /dev/sdeN — к SCSI-дисков; /dev/xdaN ... /dev/xdbN — пользу кого XT-совместимых дисков; /dev/fdN — флоппи-дисковод, идеже N=0 соответствует диску A:, a N=1 — диску В: /dev/nfs — псевдоустройство, указывающее ядру, что нужно загружаться в области сети; • го: требует компоновать корневую файловую систему во режиме «только чтение». Используется в области умолчанию; • rw: задает монтирование корневой файловой системы во режиме «чтение/запись». При использовании сего параметра воспрещено запускать программы типа/«Ж. Перед запуском программы fsck нужно перемонтировать корневую файловую систему на режиме го.

00.4.2. Объем памяти Иногда нужно обратить широта ОЗУ, блистательный через того, какой-никакой имеется на самом деле. Например, у вам чипсет Intel 010 со интегрированной видеоплатой, в этом случае вас нужно определить количество ОЗУ получи 0 Мб менее (а иногда инда получи и распишись 0 Мб). Это связано от аппаратной особенностью чипсета. Более входя во все подробности об этом ваша милость можете пронюхать получай сайте компании Intel (www. i n t e l . com).

052


Глава 00. Настройка ядра

Объем установленной памяти дозволяется установить из через параметра mem: mem=<число> Число определяет широта памяти, установленной на компьютере, например, mem=16384K либо — либо mem=16M.

00.4.3. Управление RAMDISK При создании загрузочных дискет чтобы ОС Linux необходимо, воеже на эти дискеты было помещено нужное программное выдача да чтобы для сего программного обеспечения хватило места. Обычно поступают следующим образом: создают краткий картотека лишь необходимого программного обеспечения равно помещают его для нагрузочный диск. При загрузке системы во памяти создается возможный диск, нате тот или иной это программное порука распаковывается равным образом записывается. Этот несуществующий пластинка называется RAM-диском. Ядро отнюдь не может оказываться включено во короткий представление файловой системы RAMдиска, круглым счетом наравне оно подобает оказываться фиксировано начиная от нулевого сектора, чтобы BIOS могло завалить нагрузочный квадрант равным образом косточка могло продлить загрузку. Если вас используете несжатый изображение RAM-диска, ведь сердцевина может быть частью образа файловой системы. Такая дискета может фигурировать загружена с через LILO. В волюм случае, разве вас в целях загрузки используете двум дискеты (первая содержит сердцевина — boot, нате второстепенный находится вид файловой системы — root), лик файловой системы надо починаться со нулевого сектора (смещение=0). Описываемые кроме формат задают режимы работы из RAM-диском. • Ioad_ramdisk=N: указывает, пускать в дело RAM-диск ( N=l ) не ведь — не то нет (N=0). Значение по части умолчанию непропорционально 0. • prompt_ramdisk=N: сообщает ядру, нужно ли заламывать дискету, которая включает представление файловой системы (N=1). Значение за умолчанию равняется 0 (запрашивать). • ramdisk_start=< снос > : разрешает ядру отираться в дискете вместе со сжатым образом RAM-диска да указывает закидон блока, с которого начинается RAM-диск. • ramdisk_size=N: указывает наибольший размер (в Кб) RAM-диска. Начиная от версии ядра 0.3.48, реминисценция подо кажущийся винчестер выделяется динамически. Значение согласно умолчанию одинаково 0096 (4 Мб). • noinitrd: загружаться минус использования initrd (см. п. 0.1.1.1). 553


LINUX: полное инструкция

00.4.4. Управление планировщиком ввода/вывода Каждой программе, работающей почти Linux, период с времени необходим доступ ко диску. Ядро Linux решает, рано или поздно особенно содержание получит этот доступ. Часть ядра, отвечающая вслед за проектирование ввода/вывода, называется планировщиком ввода/вывода. Параметр elevator предназначен для указания планировщику алгоритма работы. Существует четверка различных алгоритма работы планировщика: • Режим до умолчанию (поор) — на настольного компьютера дьявол не подходит, равно я его аж трактовать безвыгодный будем. • Упреждающее составление плана (Anticipatory Scheduling) — подле чтении программой данных вместе с диска косточка пытается предугадать, какие данные программа хорошенького понемножку пробегать быть следующей операции чтения. Если ядро правильно угадало «мысли» программы, настоящий алгорифм позволяет существенно выдвинуть полезный эффект системы. Кроме всего прочего, производительность сего алгоритма чрезвычайно зависит да ото логики программы. elevator=as • «Справедливая» ряд (Complete Fairness Queuing) — равные права для всех программ. Ядро ровно планирует операции ввода/вывода про каждой программы, в этом месте не имеется каких-либо программ, которые могут брать на откуп путь для диску. Если сколько-нибудь программ одновременно запросят вход для диску, по сию пору программы получат ответ. Данный технология на некоторых случаях позволяет вздуть цену плодотворность системы, а на других, наоборот, снижает общую эффективность — по сию пору зависит с набора задач, решаемых держи конкретной системе. elevator=cfq • Deadline-планирование alias проектирование крайних сроков (Deadline Queuing) — целое приложения, запросившие теледоступ ко диску, ставятся в очередь. Из очереди извлекается одна программа, которая равным образом получает фактически монопольный вход для диску. Пока буква программа работают, по сию пору прочие ожидают во очереди. По истечении определенного времени блок планирования переводит эту программу во состояние ожидания да переключается нате другую программу — следующую в очереди. Теперь вторая список получает основной доступ к диску. Потом третья, четвертая равным образом т.д. Этот средство любо-дорого глядеть для того сервера баз данных, только неграмотный чтобы рабочей станции. elevator=deadline У каждого алгоритма питаться приманка успехи равным образом недостатки. Но только два изо них подходят про настольного компьютера (рабочей станции) — второй равным образом третий. В Интернете ваша милость можете откопать документация по части том, в чем дело? для настольного компьютера больше к лицу другой алгоритм. 554


Глава 00. Настройка ядра

Для выбора нужного режима перезагрузите лаптоп да рядом загрузке ядра Linux передайте ему параметр elevator вместе с одним изо перечисленных выше значений.

00.4.5. Другие границы ядра • debug: сведения ядра (важные да далеко не очень) передаются через функцию printkQ. Если доклад жуть важно, ведь его двойник будет передана сверху консоль, а тоже функции klogd() ради его регистрации на жестком диске. Сообщения передаются для консоль, в силу того что что иногда до черта записать доклад для жестком диске (например, ответ самого диска). Предел того, что такое? короче запечатлеваться получи и распишись консоли, задается переменной console_loglevel. По умолчанию на рента отображается все, почто превыше уровня DEBUG (7). Список уровней дозволяется обнаружить на файле kernel.h. • init=/nyrb: по части умолчанию суть пытается включить кентавр init, который продолжит загрузку в согласии стартовым сценариям. Если программа init повреждена, в таком случае ради аварийно-восстановительных работ ваша милость можете запустить возмещение нее сигнальный программа (init=/bin/sh), на котором равно будете производить ремонт систему. • no-hit: процессоры 086 (и выше) имеют инструкцию hit, которая переводит сердце компьютера во порядок пониженного потребления энергии, где симпатия ожидает прерывания через устройства. Параметр no-hlt отключает приложение инструкции hit. Существование сего параметра обусловлено тем, зачем кое-какие чипы 086DX-100 имеют проблемы с этой инструкцией. Кроме того, параметр no-hlt позволяет утилизировать Linux получи бракованных процессорах. • по387: отключает применение математического сопроцессора. • no-scroll: отключает функцию прокрутки экрана изумительный времена загрузки. • reboot=< строй >: параметр, задающий нагрузка перезагрузки. Возможные значения: cold да warm, в таком случае вкушать «холодная» alias «горячая» перезагрузка. Поддерживается ядрами версии 0.0 равным образом выше. • single: загружает систему на однопользовательском режиме — например, про ремонта.

00.5. Компиляция ядра 20.5.1. Зачем возрождать ядро? Linux развивается быстрее каждый прочий операционной системы. Регулярно появляются новые версии ядра, реализующие новые функции. Например, кой-как успел отправиться дистрибутив Fedora Core 0 получай ядре 0.6.11, а 555


LINUX: полное справочник

получай www. k e r n e l . o r g еще лежит стабильная модифицирование 0.6.12.2. Еще чаще появляются драйверы для новым устройствам да заплатки вместе с исправлением обнаруженных ошибок (например, прорех во системе защиты). Допустим, новое суть сплошь пока что дозволяется ввести с бинарного RPMпакета (см. п.7.4.2). Но в целях подключения нового драйвера недостаточно просто ксернуть его во список ядра: нужно слить его адрес в структуры данных равным образом таблицы ядра, чтобы ась? костяк придется базировать опять двадцать пять с исходного кода. Исходные коды тем сильнее необходимы на прикладывания заплатки (см. п. 0.4.3). Пакет исходных текстов ядра может оказываться включен на ваш дистрибутив. Если сие никак не так, скачайте картотека из f t p : / / f t p . k e r n e l . o r g / p u b / l i n u x / k e r n e l (его размер 00-40 Мб во зависимости ото версии) равным образом распакуйте его во оный каталог, во котором будете свершать сборку (обычно /usr/src/linux-<BepcMH>).

00.5.2. Конфигурирование ядра Когда ваша милость строите с исходников прикладную программу, первым шагом сборки большей частью случается исполнение сценария configure. Ядро в свою очередь нужно конфигурировать. Его настройки находятся на текстовом файле . con f i g в каталоге исходных кодов. Этот обложка дозволяется готовить к печати вручную, но это как собака неудобно, потому предусмотрены диалоговые конфигураторы (п.7.2.3, рис. 0.2). Если ваша сестра работаете во среде GNOME, выполните команду make g c o n f i g , и ваша сестра увидите диалоговое окно, на котором дозволено найти нужные функции и драйверы устройств (Y) равным образом отключить ненужные (N), а как и указать, как необходимо охватывать во стержень выбранные устройства: статически другими словами в виде модулей (М). Осталось назвать модули, доступные с целью конфигурирования, равным образом дать рекомендации соответственно их включению равным образом отключению. Я расскажу об этом на примере современного ядра 0.6. О настройке ядра версии 0.4 рассказано в третьем издании моей книги «Самоучитель Linux», вышедшем на 0004 г. в издательстве «Наука равно Техника», а кабы ваша сестра всё-таки до этих пор используете ядро версии 0.2, в таком случае вас нужно во-первых сочинение этой книги.

00.5.2.1. Code maturity level options Этот раздел позволяет влить во сердцевина экспериментальные модули, находящиеся уже во стадии разработки равно предназначенные малограмотный про широкой публики, а ради тестеров.

056


Глава 00. Настройка ядра

00.5.2.2. General setup Support for paging of anonymous memory Грозно звучит, никак не где-то ли? Я на первых порах даже если далеко не понял, почто это. Оказывается, это легко подспорье свопа — своп-устройств равно своп-файлов. Настоятельно рекомендуется безвыгодный отключать эту опцию — насколько бы ни было оперативной памяти, а разница постоянно так же пригодится. System VIPC Поддержка средств межпроцессного взаимодействия (InterProcess Communication) System V: очередей сообщений, семафоров, разделяемой памяти равно т.д. Отключать невыгодный нужно, ин`аче процессы невыгодный смогут «общаться» друг со другом. BSD Process Accounting Учет процессов. С через специального системного вызова пользовательская схема может спросить опора сделать в долг на специальный файл системную информацию: сезон создания процесса, идентификатор владельца, командную строку, употребление ресурсов, например, памяти и терминалов да т.д. Чтобы весь работало на правах нужно, безграмотный отключайте эту опцию. Sysctl support Включает поддержку программы Sysctl, позволяющей модифицировать мера ядра сверх перекомпилирования умереть и невыгодный встать сезон загрузки. Поддержка Sysctl увеличивает размер ядра возьми 0Кб. Если ядро, которое ваша милость компилируете, не предназначено интересах дисков загрузки/восстановления, включите эту опцию. Kernel log buffer size Задает размер грудь протокола ядра на зависимости ото значения, указанного во программе конфигурирования ядра: • • • • • •

07 — 028 Кб (по умолчанию) 16 — 04 Кб 15 — 02 Кб (рекомендуется про SMP) 1 0 — 0 0 Кб 13 — 0 Кб 12 — 0 Кб.

057


LINUX: полное администратор

Kernel .config support Поддержка файлов . из on fig, содержащих конфигурацию ядра. 20.5.2.3. Loadable module support Если ваш брат планируете эксплуатнуть загружаемые модули, включите все функции. Можно организовать компактную версию ядра, которая не выделяя частностей не использует модули, возле этом подмога всех необходимых устройств короче включена напрямую во ядро. В этом случае дозволяется отключить все функции во этом разделе. Enable loadable module support Включить поддержку загружаемых модулей. Рекомендуется невыгодный отключать эту опцию, когда вас собираете обычное косточка для того настольной системы или сервера. Если но ваша сестра собираете компактное ядро, не возбраняется эту опцию выключить, а однако необходимые модули влить на число ядра. Module unloading Разрешить устранение модулей изо ядра. Если каста опция выключена, ваш брат не сможете уничтожить устройство изо ядра по прошествии того, равно как спирт был загружен. Forced module unloading Принудительное удаление. Модуль бросьте удален изо ядра, инда кабы какой-то ход его использует. Такое уничтожение может состоять опасным — ведь на результате удаления модуля устройства, которое во отваленный момент используется процессом, аспидски велика шанс убыль данных, благодаря тому вернее эту опцию никак не включать. Наоборот, когда-когда ваша сестра занимаетесь программированием модулей, так кушать созданием своих модулей, сия опция ахти полезна, так как помогает махом но выгрузить некорректно работающий модуль. Module versioning support Экспериментальная обеспечение версий модулей. Включение данной опции позволяет пускать в дело модули, откомпилированные с целью остальной версии ядра. Нет паршивый гарантии, ась? модуль, откомпилированный лещадь другую версию ядра, хорошенького понемножку делать прочно от вашей версией, потому лучше выключите эту опцию.

058


Глава 00. Настройка ядра

Automatic kernel module loading Обычно кое-кто части ядра выполнены на виде модулей ядра. Когда ядру нужен оный не ведь — не то некоторый модуль, пизда использованием модуля оно должно найти работу его (команда insmod). Если данная опция включена, ядро сможет автоматом находить применение необходимые модули. Поэтому рекомендуется вобрать эту опцию.

00.5.2.4. Processor type and features Здесь не возбраняется установить субчик процессора равным образом его функции, например, обеспечение памяти сильнее 0 Гб, MTRR, эмулирование математического сопроцессора.

Sub architecture type Тип архитектуры процессора: • PC-compatible — PC-совместимый процессор, ведь питаться процессор, использующий систему команд х86; • Voyager (NCR) — SMP-архитектура, разработанная компанией NCP Согр; • NUMAQ — позволяет швырять Linux получай архитектуре NUMA (IBM/ Sequent); • SGI 020/540 — графические станции SGI.

Processor family Эта отправления используется на оптимизации работы процессора. Очень важно в точности означить молодчик процессора: впоследствии того, наравне автор сие сделал, производительность системы повысилась эскизно на один из половиной раза, что стало известно близ загрузке системы. Если ваша сестра укажете фрукт процессора, например 086, 086, Pentium, PPro, база безвыгодный непременно бросьте запускаться на сильнее ранней архитектуре. Так, даже если ваша милость укажете Pentium, опора будет работать для РРго (хотя равным образом медленнее), только блистает своим отсутствием дрянной гарантии, аюшки? оно запустится бери 086. В табл. 00.1 приведены типы процессоров, которые рекомендуются интересах получения наибольшей производительности. Типы процессоров Тип

Таблица 00.1 Процессоры

086

Процессоры производства AMD/Cyrix/Intel 086DX/DXL/SL/SLC/SX, Cyrix 086DLC/DLC2, UMC 086SX-S

086 /Сх486

AMD/Cyrix/lntel/IBM DX4, 086DX/DX2/SL/SX/SX2 AMD/Cyrix 0x86 NexGen Nx586, UMC U5D иначе U5S

086 /К5/5х86/6х86/6х86МХ

Обычные (самые первые) процессоры Pentium, AMD K5. Не используются инструкции RDTSC (Read Time Stamp Counter)

Pentium-Classic

Классические процессоры Pentium — сверх поддержки ММХ. Используются инструкции RDTSC

059


LINUX: полное руководство Продолжение табл. 00.1 Процессоры

Тип Pentium-MMX

Процессоры Pentium вместе с поддержкой ММХ

Pentium Pro

Процессоры Pentium Pro/Celeron/Pentium II

Pentium Il/Celeron (pre-Coopermine) Pentium Ill/Celeron (Coopermine)/ Ppntiiim III Xpon.

Процессоры Pentium II равно Celeron (версия, которая была до Coopermine) Процессоры Pentium III да Celeron (Coopermine) Мобильная издание процессора Pentium не без; пониженным энергопотреблением на ноутбуков

Pentium M Pentium Лу Celeron (P4 based) / Pentium 0 M / Xeon K6/K6 II/K6 III

Процессоры Pentium 0, в волюм числе и версию Pentium 0 М Процессоры AMD Кб, K6-II, K6-III

Athlon/Duron/K7 Opteron/Athlon64/ Hammfir/KR Elan/Crusoe

04-разрядные процессоры фирмы AMD

Процессоры AMD Athlon/Duron

WinChip-C6

Процессоры WinChip C6

Процессоры Elan/Crusoe

WinChip 0A/Winchip-3

Процессоры WinChip 0A/Winchip-3

Cyrix III/C3

Процессоры IBM Cyrix III/C3

В моем случае главное было оптимизировано по-под 086/К5. После того, равно как я установил Athlon/Duron/K7, Linux заработала быстрее (для справки: тогда у меня был AMD Duron 0.6 ГГц). Выбирайте прямо ваш вычислитель — ваш умереть и не встать Pentium невыгодный заработает быстрее равно у него далеко не появится поддержки ММХ, даже если ваша милость выберете Pentium ММХ. Если ваша сестра попытаетесь таким образом подключить систему во заблуждение, симпатия не выделяя частностей может зависнуть, ибо достаточно мучаться воспользоваться ММХ-инструкции, которые не поддерживаются процессором.

Generic x86 support Базовая поддержание команд х86.

НРЕТ Timer Support НРЕТ — сие следующее гаметофит таймеров, пришедшее получи смену классическому таймеру 0254. Просто включите эту опцию. Даже если ваша BIOS никак не поддерживает НРЕТ, короче активизирована поддержка классического таймера 0254.

Symmetric multi-processing support Скорее всего, у вы установлен единолично процессор. Тогда эту опцию вам нужно отключить — на фигища переключать чрезмерный шифр во ядро? Если а вы счастливый хозяин мультипроцессорной машины, включите данную 560


Глава 00. Настройка ядра

опцию. При включении SMP укажите точный фрукт процессора. Вы должны выделить несмотря на то бы 086. Ядро никак не запустится, если бы у вы выбран тип процессора 086. Также база безвыгодный хорэ работать, если бы ваш электронная вычислительная машина оснащен процессором Pentium, а ваша милость установили характер процессора РРго. Если у вам мультипроцессорная машина, вас должны в свою очередь аннексировать опцию Enhanced Real Time Clock Support. Опция Advanced Power Management у вам хорошенького понемножку отключена быть использовании SMP. Preemptible kernel Данную опцию нелишне включить, коли вы нужно опора про RealTimeсистемы. Local APIC support for uniprocessors Поддержка внутреннего контроллера прерываний процессора (Advanced Programmable Interrupt Controller). Если у вы однопроцессорная система с процессором, оснащенным APIC, включите эту опцию. Если ваш сердце компьютера неграмотный поддерживает APIC, подключение данной опции существенно снизит пропускная способность системы. У вам многопроцессорная система? Тогда APIC довольно прилагаться по умолчанию кроме зависимости через значения этой опции. Machine Check Exception Позволяет процессору говорить ядру в рассуждении внутренних проблемах, например, по части сбое. Toshiba, DELL laptop support Поддержка ноутбуков фирм Toshiba равно DELL. /dev/cpu/microcode Включив эту опцию, вам сможете давать новую жизнь микрокод процессоров Р Pro/ Р II/ Р III/ P4/ Хеоп не без; через устройства /dev/cpu. Для работы этой опции нужно влить файловую систему /dev во разделе File systems. Информацию по части микрокоде ваша сестра можете почерпнуть в соответствии с адресу: http://www.urbanmyth.org/microcode. Если ваша сестра откомпилировали эту опцию что модуль, с целью его загрузки нужно показать во вашем файле /etc/modprobe. conf строку: a l i a s char-major-10-184

microcode

061


LINUX: полное инструкция

/dev/cpu/*/msr Поддержка регистров MSR. Может оказаться нужным на некоторых случаях для SMP-систем. Вы можете ее со спокойной совестью включить или хотя бы откомпилировать что модуль.

/dev/cpu/*/cpuid Поддержка информации по отношению процессоре. Рекомендуется ввести эту опцию. Загляните во обложка /dev/cpu/0/cpuid — вас узнаете бессчетно интересного о своем первом (0) процессоре.

High Memory Support Поддержка памяти паче 0Гб.

Math emulation Включите эту опцию, кабы вам используете сам с следующих процессоров: 086SX/DX/SL/SLC сверх 00387, 086SL/SX/SX2.

MTRR В семействе процессоров Intel P6 (Pentium Pro, Pentium II равно выше) используются специальные регистры — Memory Type Range Registers (MTRR). Они задействуются с целью управления доступом процессора ко различным диапазонам памяти. Включение этой опции может значительно повысить производительность системы, особенно ежели вам используете видеокарту PCI или — или AGP. Данную способ поддерживают процессоры равно посторонних производителей: Cyrix 0x86, 0х86МХ, МП, AMD K6-2 (stepping 0 и выше), К6-3, Centaur Сб. Некоторые BIOS устанавливают MTRR для первого процессора, а отключают интересах второго. Активизация данной опции решает тоже равно эту проблему. Если ваша милость безграмотный уверены, поддерживает ли ваш вычислитель MTRR, весь равняется включите эту опцию. Поддержка MTRR увеличит мера ядра итого только что сверху 0Кб.

00.5.2.5. Power Management Options В этом разделе ваш брат найдете целое опции, касающиеся управления питанием. В принципе, со опциями Power Management разобраться незамысловато и самому, во крайнем случае позволительно весь покончить за умолчанию — опции вполне приемлемы. Но вкушать одна адски интересная экспериментальная (!) опция — Software Suspend. Если симпатия включена, ваш брат можете приостановить машину, а рядом следующей загрузке мгновенно а вернуться систему накануне того состояния, во котором симпатия находилась поперед приостановки. Работает сие так: 562


Глава 00. Настройка ядра

вас вводите команду swsusp иначе shutdown -z < сезон >, теория записывает символ содержимого памяти возьми своп-раздел (или на своп-файл). Затем, при загрузке, ваша сестра вводите параметр ядра r e s u m e ^ d e v / не без; во в отношении п - р а з д е л , и концепция восстанавливается впредь до исходного состояния. Если ваша сестра безвыгодный ввели данный параметр, так достаточно отчаянно задействовать своп-раздел, тот или иной использовался чтобы приостановки системы (создания образа памяти). Опция Suspend to disk позволяет переписывать облик памяти получай диск, а не только возьми своп-раздел. В этом а разделе позволяется аннексировать опцию Advanced Power Management. Если вы нужно отключить функцию АРМ изумительный сезон загрузки, введите в качестве параметра ядра apm=off. При возникновении проблем (на старых компьютерах) попробуйте следующее: 1. Убедитесь, в чем дело? раздел подкачки включен, а размер его достаточен. 2. Передайте ядру инструкцию no-hlt. 3. Попробуйте отключить поддержку сопроцессора (инструкция по387). 4. Передайте ядру инструкцию floppy-nodma. 5. Убедитесь, зачем сердце компьютера безграмотный «разогнан». 6. Установите новоизобретённый виндзейль к процессора. Что но касается АРМ, нужно направить подчеркнуть что возьми следующие опции (таблица 00.2): Опции АРМ Опция

Таблица 00.2 Описание

Enable PM at boot time

Включает АРМ изумительный момент загрузки системы. Если буква опция отключена, BIOS малограмотный хорэ регулировать питанием устройств, завернуть во режимы Standby да Suspend, а да неграмотный короче делать никаких действий в ответ держи вызовы процессора CPU Idle. Если ваш супермикроэвм зависает во сезон загрузки, выключите эту опцию

Make CPU Idle calls when idle

Во минута цикла простоя ядра разрешает вызовы ко АРМ. Включение данной опции может возбудить для зависанию компьютера закачаешься промежуток времени загрузки! Если умная машина использует порядком процессоров, сия опция игнорируется. Заметьте, фраза отлично по части том, насколько процессоров именно использует компьютер, а никак не насколько их на нем установлено. Если у вас два процессора, а ваша сестра используете всего лишь единственный равно помочь SMP у вас отключена, данная опция игнорироваться никак не будет!

Enable console blanking using АРМ

Очищает текстовую ферма (не графическую!) подле использовании АРМ. Некоторые ноутбуки могут пускать в дело эту опцию чтобы того, в надежде отключить подсветку LCD-экрана, если активизирован депозитарий экрана на одной с виртуальных консолей Linux.

RTC stores time in GMT

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

Allow interrupts during АРМ BIOS calls

Обычно прерывания внешних устройств запрещены закачаешься сезон выполнения процедур АРМ. BIOS некоторых ноутбуков разрешает прерывания внешних устройств, например, IBM ThinkPad. По умолчанию данная опция выключена. Если ваша милость безграмотный уверены, далеко не включайте ее

063


LINUX: полное вождь

00.5.2.6. Bus Options В этом разделе описываются опции, касающиеся поддержки различных шин PCI, ISA, MCA. Конфигуратор ядра 0.4 держал их во разделе General Setup, а неотложно они вынесены на личный раздел. Отключайте все, кроме шины PCI — отнюдь не думаю, ась? у вы принимать ISA или — или МСА-устройства.

Примечание МСА — обувь для машины передачи данных, разработанная IBM, которая использовалась в системах PS1/PS2. Она исстари снята из производства, современные устройства с ней неграмотный работают.

PCI access mode Данная опция определяет порядок доступа ко PCI-устройствам. Если значение этой опции в одинаковой мере BIOS, значит, Linux хорэ пускать в дело BIOS ради определения PCI-устройств равным образом их конфигураций. Однако для некоторых старых материнских платах BIOS отнюдь не может корректно устроить конфигурацию PCI-устройств. В этом случае нужно избрать вес Direct, равным образом Linux будет работать от PCI-устройствами напрямую, лишенный чего BIOS. Если вас выберете Any, то Linux спервоначала попытается мучиться напрямую (так быстрее), а потом, если напрямую безграмотный получится, сейчас воспользоваться BIOS. 20.5.2.7. Executable file formats В этом разделе вам сможете вобрать поддержку различных форматов исполняемых файлов. Обычно сие нужно, кабы ваша милость хотите швырять в эмуляторах программы других операционных систем, например, DOSили Windows-программы. 20.5.2.8. Device drivers В этом разделе находятся опции, касающиеся драйверов устройств. Тут вы можете определить, какие устройства у вам установлены равным образом какие вы хотите воспользоваться во дальнейшем. По сравнению из программой настройки ядра 0.4 многие отдельные разделы «переехали» на таковой раздел, например, Parallel port support, MTD, PnP support равно т.п. Memory Technology Devices (MTD) В этом подразделе вас можете зачислить поддержку MTD-устройств. Самым ярким примером такого устройства может стать flash-диск.

064


Глава 00. Настройка ядра

Parallel port support Поддержка параллельного порта. РпР support Поддержка устройств Plug and Play. Block devices В этом подразделе вам можете настроить блочные устройства, ведь есть такие устройства, товарообмен данными от которыми выполняется поблочно (передаются целые блоки информации), а далеко не посимвольно (за одну операцию ввода/вывода передается одиночный байт). Ярким примером блочных устройств выступают дисковые накопители — дисковод к гибких дисков, жесткие диски да т.п. Normal floppy disk support Поддержка обычного дисковода чтобы гибких дисков. Обычно поддержка данного устройства требуется, хотя буде ваша сестра собираете опора с целью сервера или ноутбука, так «флоппик» ему неграмотный нужен, потому-то можете эту опцию выключить. XT hard disk support Поддержка старых жестких дисков, которые устанавливались нате компьютеры будто IBM XT. Отключите эту опцию — возлюбленная вас безвыгодный нужна, модуль тоже вас малограмотный нужен. Даже разве ваша сестра в среднем равным образом найдете таковский диск, вряд ли ли вы станете его отводить ко современному компьютеру. Parallel port IDE device support Поддержка IDE-устройств, которые подключаются для компьютеру по параллельному порту. Очень неоднократно ко ноутбукам подключаются внешние IDE-устройства. Было время, в некоторых случаях шины USB безграмотный существовало, позднее был разработан интерфейс в целях подключения IDE-устройств соответственно параллельному порту (по последовательному порту рокировка информацией занимает много времени). Compaq SMART2 support Поддержка контроллеров SMART2 фирмы Compaq. Вряд ли настоящий параметр вас понадобится. 565


LINUX: полное описание

Compaq Smart Array 0xxx support To а самое, в чем дело? да предыдущая опция, а тогда включается поддержка контроллеров 0ххх. Mylex DAC960/DAC1100 PCI RAID Controller support Поддержка RAID-контроллера фирмы Mylex. Micro Memory MM5415 Battery Backed RAM support (EXPERIMENTAL) Поддержка специальных карт памяти. Честно говоря, автор этих строк сии игра в карты равно в глаза безвыгодный видел, равным образом на руках малограмотный держал. Если кому-то интересна информация о них, посетите сайт: http://www.umem.com/. Loopback device support Вот эту опцию моя особа отключать никак не советую — многие задачи требуют наличия устройства обратной петли. Поэтому, буде хотите учинить ядро компактнее, включите эту опцию несмотря на то бы во виде модуля. Модуль будет называться loop. Network block device support Поддержка сетевых блочных устройств. Просто включите эту опцию в виде модуля. Модуль называется nbd. RAM disk support Это беда полезная опция, позволяющая кусок информации, находящейся на жестком диске, выпить чашу во оперативную парамнезия для того ускорения доступа ко ней. Особенно данная опция полезна присутствие создании загрузочных дисков, которые используются пользу кого восстановления системы. Если вы включите эту опцию на виде модуля, некто бросьте величаться rd. Initial RAM disk (initrd) support Инициализирующий RAM-диск — сие RAM-диск, что загружается загрузчиком системы (LILO, GRUB, loadlin) равным образом монтируется равно как корневая файловая построение прежде нормальной загрузкой. Он используется для загрузки модулей пред монтированием нормальной корневой системы. Включите эту опцию. Если а ваша сестра создаете нагрузочный диск, ведь ее разъединение нетерпимо вообще! 566


Глава 00. Настройка ядра

Support for Large Block Devices Поддержка больших блочных устройств — из размером сильнее 0Т6. Отключайте эту опцию — жестких дисков возьми 0Т6 на ближайшее времена в продаже невыгодный предвидится. ATA/ATAPI/MFM/RLL support В этом подразделе ваша сестра можете включить/выключить поддержку АТАустройств. Тут быстро как вам угодно сами, какие устройства у вам снедать да какие вы планируете использовать. Ненужные должно вмиг отключать — нечего память забивать. Что нужно? Обыкновенный пригон CD-ROM лакомиться у всех. Даже разве у вы на текущий миг его нет, вас преждевременно иначе запоздало его подключите для своему компьютеру. Не будете но ваш брат через сего перекомпилировать ядро? Поэтому опция Include IDE/ATAPI CDROM support (BLK_DEV_IDECD) относится для категории нужных. А видишь поддержка Silicon Image chipset абсолютно малограмотный нужна, уж на что равным образом встроена во основа по умолчанию. Поддержку всех АТА-устройств необходимо отключить, разве у вас сервер равно целое устройства — SCSI (только безвыгодный забудьте SCSI включить!) SCSI device support Поддержка SCSI-устройств. Все комментарии аналогичны предыдущему пункту — всегда ненужное отключаем, оставляем самое необходимое. Вот почему ми нравится Linux — дозволительно приметно указать, что такое? ми нужно, а что — нет. Ни на одной Windows такое изготовить нельзя. Можно, конечно, удалить всю базу со драйверами, только моя особа а сказал «явно». Old CD-ROM drivers (not SCSI, not IDE) В этом разделе ваш брат можете сделать составляющий частью поддержку старых (я бы сказал, древних) приводов CD-ROM, но, верней всего, сие вас никак не нужно, поэтому смело отключайте общностный подраздел — сэкономим простор бери диске. Multi-device support (RAID and LVM) Поддержка RAID-массивов равно LVM-томов {Logical Volume Manager). Если планируете эксплуатировать RAID, включите есть такие опции сего раздела. Вы можете указать, какие уровни RAID вы нужны, а какие нет. IEEE 0394 (FireWire) support Поддержка последовательной высокоскоростной шины IEEE 0394. Если у вас принимать IEEE-адаптер, включите эту опцию. Внимание: помочь IEEE экспериментальна (для ядра 0.6)! 567


LINUX: полное руководитель

QoS and/or fair queueing В этом подразделе не запрещается запустить поддержку QoS (Quality of Service). IrDA (infrared) support Поддержка IrDA-устройств. Bluetooth support Поддержка Bluetooth. Обычно требует включения возьми современных ноутбуках. ISDN subsystem Поддержка технологии ISDN (Integrated Services Digital Networks, во Франции — RNIS). Технология ISDN ступень за ступенью уходит на старина — вместо нее используется ADSL. Если у вам глотать осуществимость перекинуться на ADSL, сделайте это. Telephony Support Если у вы убирать специальная карта, позволяющая включить обычный таксофон к использования голосовых IP-приложений, включите поддержку телефонии. Вам никак не нужно заключать в себе поддержку телефонии для использования обычного модема. Input device support Поддержка различных устройств ввода — джойстиков, мышей, сенсорных панелей, клавиатур. Character devices Поддержка символьных устройств, например, стримеров. Multimedia devices Поддержка TV- да радиотюнеров. Graphics support Поддержка графических адаптеров. Выберите лишь только те драйверы, которые необходимы к поддержки ваших видеокарт, а оставшиеся отключите. 568


Глава 00. Настройка ядра

Sound Поддержка систем ALSA (Advanced Linux Sound Architecture) да OSS (Open Sound System). Тут но драйверы звуковых плат.

USB support Поддержка USB.

Networking support Это баста большенный подраздел раздела Device Drivers, на котором допускается вобрать поддержку как бы самой сети, приближенно да отдельных ее компонентов. Поддержка мережа нужна обязательно, даже если разве у вы пропал сетный платы или других сетевых устройств. Функции печати, а вдобавок графическая подсистема X Window требуют поддержки сети, а сие значит, что, коли сеть у вы отключена, вас далеко не сможете ни деловая бумага распечатать, ни сидеть в графическом интерфейсе. Сетевых опций будет много, того ради их установки воспользуемся таблицей 00.3. Опции бредень

Таблица 00.3

Опция

Назначение

Netlink device emulation

Опция обратной совместимости. Скоро хорошенького понемножку удалена, же временно симпатия нужна.

Unix domain sockets

Поддержка UNIX-сокетов. Не отключайте эту опцию

IPMI sockets

Поддержка IPMI-сокетов. Обычно безграмотный нужна

PF_KEY sockets

Требуется интересах IPsec, потому-то кризис миновал невыгодный отключать ее или — или заключить на виде модуля

TCP/IP networking

Поддержка TCP/IP беспременно должна состоять включена!!!

IP: multicasting

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

IP: advanced router

Включите, кабы предполагаете пустить в ход этот маршрутизатор во виде маршрутизатора, а одновременно нужно аннексировать равно безвыездно ее компоненты, например, IP: policy routing — изрядно интересная цель маршрутизатора. В двух словах ее невыгодный опишешь, а разгадать относительно ней дозволено по мнению адресу: ttp://www.compendium.com.ar/policy-routing.txt

IP: kernel level autoconfiguration

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

IP: tunnelling

Данная опция понадобится вам, неравно ваша сестра будете регулировать виртуальную частную подсак — VPN (Virtual Private Network)

IP: GRE tunnels over IP

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

IP: multicast routing

Данная опция позволяет настроить работу маршрутизатора так, чтоб он отправлял IP-пакеты в области нескольким адресам. Очень плодотворно в целях широковещания аудио-видеоинформации соответственно Интернету

069


LINUX: полное руководство Продолжение

табл. 00.3

Назначение

Опция IP: ARP daemon support (EXPERIMENTAL)

Поддержка ARP-демона. Можно сделать смешанный частью получи маршрутизаторе/шлюзе небольшой узы

IP: TCP syncookie support (disabled per default)

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

IP: AH transformation

Поддержка АН-преобразования для того IPSec. Если невыгодный уверены на том, что вас делаете, неграмотный отключайте эту опцию!

IP: ESP transformation

Поддержка ESP-преобразования ради IPSec. Если отнюдь не уверены на том, что ваша сестра делаете, безграмотный отключайте эту опцию!

IP: IPComp transformation

Поддержка IPComp-преобразования (сжатие данных, описано в RFC3173) на IPSec. Если безграмотный уверены во том, что-нибудь ваша милость делаете, не отключайте эту опцию!

IP virtual server support (EXPERIMENTAL)

Включение данной опции позволит вы выстроить несуществующий сервер, который довольно пускать в ход заряд нескольких физических серверов. Попросту говоря, данная опция позволяет сосредоточить кластер. Раньше для создания кластеров использовались программные пища посторонних разработчиков, а не откладывая подмога кластеров встроена во ядро. Если заинтересовались, посетите сайт: http://www.linuxvirtualserver.org/

The IPv6 protocol (EXPERIMENTAL)

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

DECnet Support

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

002.1d Ethernet Bridging

Если ваша сестра включите эту опцию, ваш лаптоп превратится на Ethernet-мост, который бросьте совокуплять небо и земля сегменты вашей локальной тенета

Network packet filtering (replaces ipchains)

Поддержка нового поколения бастиона Netfilter, пришедшего держи замену IPChains. Если вас настраиваете маршрутизатор, включите эту опцию. Для обыкновенных систем ее нужно слить

IPsec user configuration interface

Поддержка IPSec. Если отнюдь не уверены, легко включите эту опцию

Asynchronous Transfer Mode (ATM)

Поддержка ATM

The IPX protocol (IPX)

Поддержка протокола IPX (компания Novell)

Appletalk protocol support

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

CCITT X.25 Packet Layer (EXPERIMENTAL) (X25), LAPB Data Link Driver (EXPERIMENTAL) (LAPB)

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

WAN router

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

Fast switching

Перед включением этой опции напористо рекомендую прочитать документацию. Данная опция выбирает самый прыткий сетевой интерфейс интересах передачи данных. Внимание! Эта опция несовместима с опцией Network packet filtering

Forwarding between high speed interfaces

Не включайте эту опцию!

070


Глава 00. Настройка ядра

00.5.2.9. Filesystems В разделе Filesystems ваш брат можете вобрать поддержку следующих файловых систем: • Second extended fs (ext2), до самого недавнего времени бывшей основной файловой системой Linux; • Ext3 journalling file system — журналируемой версии ext2, используемой многими дистрибутивами во качестве опорный файловой системы; • ReiserFS — файловой системы Reiser; • JFS filesystem — файловой системы JFS; • XFS — файловой системы XFS; • Minix FS — файловой системы Minix; • CD-ROM/DVD Filesystems ISO 0660 — файловой системы, используемой чтобы еженедельник информации бери CD-ROM. Что включить, а что такое? выключить? Первые двум файловые системы, а также файловую систему ISO 0660 включите обязательно. Думаю, безграмотный нужно объяснять, почему. Файловую систему Minix дозволительно махом отключить — она искони устарела да безграмотный используется. Файловые системы Reiser, JFS, XFS относятся для разряду новых, да самобытно использующихся. В принципе, их нужно ввести — беспричинно черт знает кто принесет винчестер, нате котором разделы будут заключать одну изо сих файловых систем? Или прямо вы захотите поэкспериментировать да отформатировать раздел во одной из этих систем. Не забудьте привнести панацея автоматического монтирования сменных носителей — Kernel automounter support, особенно на рабочей станции! А вона помощь квот (Quota support) окажется полезной, ежели ваша сестра настраиваете сервер. В подразделе DOS/FAT/NT Filesystems ваша милость можете привнести поддержку следующих систем: • Файловая порядок MS DOS. Включить ее нужно всенепременно — в странах бывшего совок прежде этих пор встречаются дискеты, записанные в этой файловой системе. • VFAT (Windows-95): сие основная файловая теория операционных систем Windows 05 равным образом 08. • NTFS — файловая режим ОС Windows NT, 0000, ХР. Здесь а можно включить поддержку дневник в раздел NTFS, которая по мнению умолчанию отключена. В разделе Pseudo filesystems ваш брат можете вобрать таково называемые псевдосистемы — файловые системы / р г в рассуждении от равно /dev.

071


LINUX: полное учебник

В разделе Miscellaneous filesystems находятся опции включения поддержки других, нехарактерно используемых файловых систем, например, HPFS (High Performance File System), которая используется до умолчанию ОС IBM OS/2. Включить поддержку файловых систем NFS равно SMB (используется для монтирования удаленных Windows-разделов, читайте «общих дисков и папок») позволяется на разделе Network File Systems. Раздел Native Language Support позволяет вобрать поддержку различных кодировок, на которых могут бытийствовать представлены имена файлов. Например, отключив кодировку ср-1251, присутствие просмотре содержимого Windows-раздела ваша милость увидите иероглифы где бы русских букв. 20.5.2.10.Kernel hacking В этом разделе про вы найдутся двум полезные опции, ажно когда вас не занимаетесь разработкой модулей ядра Linux. Опция Prefer small over fast code позволяет выработать база больше маленьким, а сильнее медленным. Маленький, же медлительный адрес может пойти в ход про создания загрузочной дискеты — тама важен произвольный байт. Вторую опцию Kernel debugging также допускается отключить, разве вас создаете системную дискету. 20.5.2.11 .Cryptographic options Различные опции, касающиеся криптографии. В разделах Library routines равным образом Unofficial 0rd party kernel additions моя персона не нашел пользу кого себя нуль интересного.

00.5.3.Сборка ядра Теперь, от случая к случаю целое устройства сконфигурированы, нужно сберечь файл конфигурации ядра равным образом перепрыгнуть самый для этапу сборки ядра. Для сборки вы понадобится программное обеспечение, необходимые версии которого перечислены во таблице 00.4. Необходимое программное обеспечение Программа/ библиотека Gnu С Compiler Gnu Make

Минимально допустимая версия 2.95.3 3.78

binutils

0.12

util-linux

0. tOo

module-init-tools

0.9.9

072

Таблица 00.4 Где жениться

http://gcc.gnu.org ftp://ftp.gnu.org/gnu/make/ ftp://ftp.kernel.org/pub/linux/devel/binutils/ ftp://ftp.kernel.org/pub/linux/utils/util-linux/ http://www.kernel.org/pub/linux/kernel/people/rusty/modules/


Глава 00. Настройка ядра Продолжение табл. 00.4 Программа/ библиотека procps e2fsprogs (*) jfsutils (*) reiserfsprogs (*) nfs-utils pcmcia-cs quota-tools PPP

isdn4k-utils oprofile

Минимально допустимая версия 2.0.9 1.29 1.0.14 2.1.0 1.0.5 3.1.21 3.09 2.4.0 3.1pre1 0.5.3

Где позаимствовать

http://procps.sourceforge.net/ http://e2fsprogs.sourceforge.net/ http://www-124.ibm.com/jfs/ http://www.namesys.com/ http://nfs.sourceforge.net/ http://pcmcia-cs.sourceforge.net/ http://sourceforge.net/projects/linuxquota/ ftp://ftp.samba.org/pub/ppp/ http://www.isdn4linux.de/swpat.html http://oprofile.sourceforge.net/

(*) Данное программное доставка зависит с используемой файловой системы. Если ваш брат используете только ext2, обновите лишь e2fsprogs, коли JFS — так jfsutils. Если но ваш брат используете всегда перечисленные файловые системы ext2, JFS, ReiserFS, вы нужно реконструировать однако программы, отмеченные звездочкой.

Ваше быль опора в эту пору работает и, так чтобы безвыгодный предпринять ни ложки непоправимого, нужно накоплять новое стержень по-под новым именем. Найдите на Makefile (в самом начале файла) строчки: VERSI0N=2

PATCHLEVEL=6 8ивЬЕУЕЬ=<третья_цифра_версии_вашего_ядра> EXTRAVERSION= EXTRAVERSION — сие суффикс, которым хорошенького понемножку различаться фамилия нового ядра. Дайте ему сила чаятельно «new» либо «test». Это приведет ко тому, что собранное вами сердцевина полноте прозываться linux-2.6.x-new. Старое ядро никуда безвыгодный денется, равно возле загрузке не возбраняется полноте подобрать требующийся вариант ядра. Команда make dep, которая вводилась позднее конфигурирования ядер 2.4 да ниже, близ сборке ядра 0.6 невыгодный используется. Вместо нее выполните следующую постоянство команд: $ make bzImage $ make modules Эти под лад команд соберет главное равным образом те модули, которые ваша милость включили на него на этапе конфигурирования. Процесс сборки займет далеко не больше 00 минут, а в таком случае да несравненно хлеще — во зависимости через быстродействия вашей системы равно количества выбранных модулей. Можно приводить в исполнение сии команды ото имени непривилегированного пользователя. Даже нужно, ибо философически скорее корпеть под рутом токмо тогда, в некоторых случаях иным способом нельзя. Без привилегий суперпользователя возбраняется привыкать только лишь нате этапе установки ядра равным образом модулей: 573


LINUX: полное руководство # make modules_install # make install Результатом успешной сборки равно установки станут следующие файлы и каталоги: /boot/vmlinuz-2.6.x-new /boot/System.map-2.6.x-new /boot/initrd-2.6.x-new.img /lib/modules/2.6.x-new

Осталось наболтать во конфигурационный обложка вашего загрузчика (п.9.1.1) вариант загрузки из новым ядром. Если ваш брат используете GRUB, впишите в /boot/grub/grub.conf следующие строки: t i t l e Linux New Kernel kernel /vmlinuz-2.6.x-new root=/dev/hda5 ro i n i t r d /initrd-2.6.x-new.img Если ваш брат вкомпилировали целое драйверы, необходимые про загрузки системы, во костяк равным образом потому безвыгодный используете initrd, в таком случае строчку initrd можно удалить. В случае, если бы ваш загрузчик — LILO, впишите во / e t c / l i l o . c c n f строки: image=/boot/vmlinuz-2.6.x-new label=" Linux New Kernel" root=/dev/hda5 initrd=/boot/initrd-2.6.x-new.img read-only И занесите изменения во загрузочную запись: # lilo Теперь перезагрузите систему равным образом попробуйте загрузиться из новым ядром. При появлении каких-либо ошибок ваш брат денно и нощно сможете запутать старую версию.

074


Глава 0 0

СОЗДАЕМ КОНСОЛЬНОЕ ПРИЛОЖЕНИЕ

КОМПИЛЯТОР GCC СБОРОЧНАЯ УТИЛИТА МАКЕ ПАКЕТ BINUTILS И ДРУГИЕ ПОЛЕЗНЫЕ ПРОГРАММЫ

LINUX

ПОЛНОЕ РУКОВОДСТВО


01.1. Компилятор gcc В 0 главе ваша милость познакомились со языком командного интерпретатора да убедились, что-нибудь держи нем дозволительно записывать полезные сценарии. Но разве вас раньше программировали лещадь Windows, так интерпретатора вы недостаточно хорэ — понадобятся побольше мощные накопления разработки. Разумеется, они на ОС Linux есть. Основным С-компилятором на Linux служит gcc (GNU С Compiler). Если вы невыгодный установили капитал разработки подле установке дистрибутива, самое срок изготовить сие сейчас. Запустите руководитель пакетов (рис. 01.]) и установите следующие пакеты: gcc — непосредственно программа gcc; gcc-c+H поддержка C+ + ; gcc-doc — документы в соответствии с gcc (очень рекомендую установить); compat-gcc — пакет, обеспечивающий ресурсы gcc пользу кого обратной совместимости. Данный депеша вы нужен, неравно вас планируете черкать программы в целях больше старых систем, нежели ваша; • compat-gcc-c++ — так же, что-нибудь да compat-gcc, всего-навсего вместе с поддержкой C+ + ; • compat-cpp — препроцессор срр в целях обратной совместимости; • binutils — пакет вспомогательных утилит, об которых автор поговорим в последнем пункте этой главы; • glibc-devel — заключает библиотеки чтобы разработки С-программ; • libbfd — читальня дескриптора двоичного файла (Binary File Descriptor library); • libstdc++-devel — заголовочные файлы да библиотеки в целях программирования сверху C+ + ; • make — утилита, упрощающая работа сборки больших проектов. • • • •

076


Глава 01. Создаем консольное приложение Управление пакетами

Установка/удаление пакетов

щ

Эти пакеты включают серверы таких устаревших протоколов, наравне rsh равным образом telnet.

Программирование 0 Средства разработки

[5*65]

Эти фонды включают основные средства разработки, такие вроде automake, gcc, peri, python и отладчики. [yij Разработка ПО с целью X Г^! «•^

[\9I21]

т равно

^ пакеты позволяют производить приложения для X Window System.

D

И Разработка вместе с использованием GNOME jjjf ^

Установите сии пакеты к разработки графических приложений GTK+ равно GNOME. Общий широта установки: 0,218 Мегабайт !ыйти

О6н(

Рис. 01.1. Менеджер пакетов Fedora Core — system-config-packages

01.1.1. Вызов gcc Формат вызова компилятора такой: gcc [опции] helloworld.c

Вы написали свою программу сверху C+ + ? Нет проблем: компиляторы С и C + + являются интегрированными. Чтобы сказать компилятору, на каком языке ваша милость писали свою программу, нужно направить определенную опцию присутствие вызове компилятора. Но не грех пристроиться проще: до умолчанию халтурщик считает, аюшки? файлы не без; расширением .с написаны на языке С, файлы от одним изо расширений .С, .се, хХХ — получай языке C+ + , а файлы со расширением .s — бери языке ассемблера. Как правило, предварительно компиляцией вызывается схема ерр — препроцессор языка С. Препроцессор создаст обложка из расширением л, если ваша утилита написана получай языке С, равным образом обложка не без; расширением .ii, если ваша пакет написана держи C+ + . Если ваша содержание уж прошла препроцессорную подготовку, вас можете дать компилятору gcc файл с расширением л не в таком случае — не то .ii равно gcc сейчас отнюдь не достаточно возбуждать препроцессор для подготовки исходного текста. Как правило, программу ерр в кои веки кто вызывает вручную. 19 Зак. 088

077


LINUX: полное справочник

Если никак не обозначать никаких опций, в таком случае автор создаст во текущем каталоге обложка a.out, сохраняющий исполняемый код. Для тех, который изучал другой язык, автор держи любой происшествие приведу телекс первой программы для С (листинг 01.1). Листинг 01.1. обложка holloworld.c ttinclude <stdio.h> main() { printf("Hello World!\n");

А не откладывая рассмотрим основные опции компилятора. Обо всех остальных опциях ваш брат сможете разведать по части команде man g c c .

01.1.2. Общие опции Из общих опций особенно интересны три: -х, -с равным образом -о. С через опции -х дозволительно выделить язык, в котором написан исходный код, например, gcc -х из helloworld.c

В качестве языка программы вас можете указать: • • • • •

с, кабы ваша утилита написана получи С; objective_c, ежели ваша список написана получи Objective С; c-header, разве ваша содержание является заголовком С; с + + , коли вам написали программу получи и распишись C+ + ; assembler, когда ваша милость написали программу нате ассемблере.

Существуют равно часть варианты, а они малограмотный настоль важны. Опция -с используется, неравно ваша милость хотите лишь откомпилировать вашу программу, так неграмотный пробудить компоновщик. В результате хорэ создан объектный обложка от расширением . о. Опция -о позволяет обозначить прозвание результирующего файла. Это адски полезная опция, благодаря тому что что-то прозвание а . o u t недостаточно кого устраивает: gcc -о helloworld helloworld.c

Очень полезна опция -v, которая выводит различную информацию о стадиях компиляции. Кроме того, каста опция выводит версию компилятора. 578


Глава 01. Создаем консольное применение

01.1.3. Опции языка Из всех опций языка ми пригодилась как только опция ANSI, которая выключает безвыездно функции GNU С, несовместимые со стандартом ANSI. К таким функциям относятся asm, inline, typeof равным образом другие.

01.1.4. Опции препроцессора Эти опции задают система предварительной обработки исходного кода (до по сути дела компиляции). Очень важной является опция -include <файл>. Она позволяет «прогнать» после препроцессор первое дело начинка указанного файла, а только за сего файл, что передан препроцессору. В результате указанный обложка довольно откомпилирован раньше, нежели всё-таки остальные. Опция -nostdinc запрещает утилизация системного каталога, содержащего файлы заголовков. При ее включении программа полноте искать заголовки во каталогах, указанных на опции -I равно во текущем каталоге. Опция -nostdinc++ запрещает приложение стандартных файлов заголовков интересах языка C + + .

01.1.5. Опции компоновщика Опция компоновщика -1 позволяет неприкрыто показать титул библиотеки, которая будет употребляться возле сборке вашей программы. Например, gcc -lmylibrary myfile.c

Компоновщик короче пускать в дело обложка l i b m y l i b r a r y . а , тот или иной он попытается сыскать на системных каталогах библиотек равным образом каталогах, которые вы укажете не без; через опции -L. Опция -nostdlib запрещает пустить в ход целое системные библиотеки. При этом будут использованы библиотеки всего только с тех каталогов, которые вы укажете со через опции -L. Опция -static означает, аюшки? хорэ использована статическая линковка.

01.1.6. Опции каталогов Две важнейшие опции каталогов: -I равным образом -L. Первая позволяет назвать путь для поиска заголовков (файлов из расширением .h), а вторая — библиотек. Например, буде вас хотите, дай тебе халтурщик использовал файлы заголовков, которые находятся во каталоге /root/ include, в этом случае укажите 579


LINUX: полное учебник

опцию -I/root/include. Обратите напирать держи заочно пробела между буквой I равным образом первым символом пути. Если ваш брат укажете опцию -I-, так во каталогах, которые вас укажете во объявленной перед сего опции -I, бросьте изготавливаться отыскивание исключительно пользовательских заголовков, в таком случае лакомиться заголовков, указанных на директиве #include «файл». Пути чтобы поиска системных заголовков, которые указываются директивой #include <файл>, останутся неизменными.

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

01.1.8. Опции оптимизации Компилятор gcc позволяет оптимизировать адрес вашей программы. Другими словами, gcc сделает всегда на того, с тем ваша содержание была как допускается не так в соответствии с размеру равно по образу не возбраняется быстрее запускалась. Для включения режима оптимизации используйте опцию -О1. Вы можете поэкспериментировать вместе с опциями -О2 да -ОЗ, которые до этих пор свыше пытаются оптимизировать вашу программу, впрочем безвыгодный перестарайтесь. Если ваша программа позже экий оптимизации работает пока что медленнее, нежели прежде нее, или а некорректно работает, используйте опцию -О0 для того отключения оптимизации. Обо всех остальных опциях ваша милость сможете пробежать глазами во справочной системе.

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

install.

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

080


Глава 01. Создаем консольное вставка

Директивы утилиты make служат с целью определения зависимостей между файлами проекта равным образом находятся во файле по мнению имени Makefile, расположенном в каталоге сборки. Разберемся, по образу пишутся make-файлы. Общий величина make-файла выглядит так: цель1: список_необходимых_файлов последовательность_команд цельЫ: список_необходимых_файлов последовательность^оманд Цель — сие ярлык чтобы некоторой последовательности команд (например, install) тож нетто файл, кто нужно «построить» — скомпилировать иначе говоря скомпоновать. Цели должны отсчитываться доброжелатель с друга даже если бы одной полый строкой. Список необходимых файлов — сие перечисление файлов тож других целей, которые нужны в целях преимущества данной цели; спирт может бытийствовать да пустым. Последовательность команд — сие команды, которые нужно выполнить для успехи цели. Последовательность команд должна откладывать от начала строки символом табуляции, другим образом ваш брат получите и распишитесь ошибку «missing separator» (нет разделителя). Make-файл может кормить комментарии — они начинаются символом # . В make-файлах вам можете эксплуатнуть макроопределения: СС=дсс PATH=/usr/include /usr/src/linux/include MODFLAGS:=-03 -Wall -DLINUX -I$(PATH) $(CC) $(MODFLAGS) -cproga.c Чтобы воззвать ко макроопределению на команде alias на другом макроопределении, нужно пустить в дело конструкцию $(имя). Макроопределение может заключать в себе на себя другое, дотоле определенное, макроопределение. Формат запуска утилиты make: make [-f файл] [ключи]

[цель]

Ключ -f указывает обложка инструкций, тот или другой нужно эксплуатнуть вместо Makefile. Если текущий кнопка никак не указан, в таком случае make ищет на текущем каталоге файл Makefile равно начинает набросать указанную цель. Если задание малограмотный указана, то выполняется первая встреченная во make-файле. Сборка выполняется рекурсивно: make сперва выполняет всегда цели, с которых зависит текущая цель. Если подчиненность представляет из себя файл, ведь make сравнивает 581


LINUX: полное управление

его времена последней модификации со временем целевого файла: если целевой обложка в отцы годится alias отсутствует, так довольно выполнена указанная прогрессия команд. Если целевой обложка моложе, так текущая цель считается достигнутой. Примечание Если нужно избежать пересборки какого-то с файлов проекта, ведь можно искусственно «омолодить» его командой touch, которая присвоит ему во качестве времени последней модификации текущее время. Если нужно, наоборот, принудительно пересобрать цель, в таком случае нелишне «омолодить» безраздельно изо файлов, от которых возлюбленная зависит.

Работа программы make заканчивается, когда-никогда достигнута цель, указанная в командной строке. Обычно сие задача all, собирающая всё-таки результирующие файлы проекта. Другими распространенными целями являются install (установить собранную программу) равно clean (удалить ненужные файлы, созданные на процессе сборки). В листинге 01.2 представлен make-файл, собирающий мелкотравчатый проект из двух программ client равным образом server, каждая изо которых компилируется из одного файла исходного кода. Листинг 01.2. Примерный make-файл СС=дсс CFLAGS=-0 all:

client

server

client: client.с $(CC) c l i e n t . не без; -о c l i e n t server: server.с $(CC) server.с -о server

Обычно быть вызове утилиты make невыгодный нужно задавать никаких ключей. Но временами пользование ключей случается весть с руки (таблица 01.1).

082


Глава 01. Создаем консольное приложение Ключи команды make Ключ

Таблица 01.1 Назначение

-С библиография

Перейти на предуказанный указатель под началом работы

-d

Вывод отладочной информации

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

-f обложка

Использовать перечисленный обложка заместо Makefile

-i

Игнорировать ошибки компилятора

-I опись

В указанном каталоге хорэ вырабатываться отыскивание файлов, включаемых в Makefile

-] п

Запускать никак не сильнее п команд синхронно

Продолжить работу со временем ошибки, разве сие если угодно

-п

Вывести команды, которые должны были выполниться, же безвыгодный исполнять их

-о обложка

Пропустить отваленный файл, даже если разве во Makefile указано, зачем возлюбленный вынужден быть создан по-новому

Не утилизировать встроенные взгляды на жизнь

-S

Не исключать команды хуй их выполнением

-W

Вывод текущего каталога вплоть до равно по прошествии выполнения команды

01.3. Пакет binutils и отдельные люди полезные программы Пакет b i n u t i l s заключает утилиты про работы вместе с бинарными файлами: • Id — компоновщик: программа, связывающая объектные файлы и библиотеки на исполняемый файл; • аг — служба из архивами (создания, разновидность да извлечение); • nm — нравоучение названий идентификаторов изо двоичных файлов; • objcopy — повторение равным образом педерача двоичных файлов; • objdump — выведение информации изо двоичных файлов; • ranlib — генерирование индекса оглавления архива; • size — мораль размеров секций архива тож двоичного файла; • strings — дедукция строк, которые вроде прочитать, с двоичных файлов; • addr21ine — конвертация адресов на памяти на строку во файле; • nlmconv — конвертирует объектный адрес на NLM. А нынче перечислим до некоторой степени полезных вспомогательных программ.

083


LINUX: полное руководитель

01.3.1. ansi2knr Утилита ansi2knr предназначена для того преобразования текстов программ, написанных во соответствии со стандартом ANSI С, на программы для «классическом» С Кернигана равным образом Ричи. Формат вызова: ansi2knr oldfile.c newfile.c

01.3.2. as Программа as — сие GNU-версия ассемблера, предназначенная на создания объектных файлов с программ, написанных нате языке ассемблера. Формат вызова: as

[ключи] файл! [файл2 . . . файлЫ]

Шлюзы программы as

Таблица 01.2 Назначение

Ключ -а

Вывод листинга

-ad

Не заключать отладочные сведения

-ad

Включение во распечатка текста программы, написанной для языке высокого уровня, разве книга проводилась вместе с ключом -д

-al

ВЫВОД листинга возьми ассемблере

-an

Не производить форм

-as

ВЫВОД списка символов программы

-афайл

Вывести распечатка на перечисленный обложка

-f

Быстрый режим. Директивы препроцессора далеко не обрабатываются

-inyTb

Добавить начертанный дорога ко include-пути

-МЙ1

Обеспечить MRI-совместимость

-о обложка

Создание объектного файла вместе с указанным именем

-R

Поместить отрезок данных на секция стих

-V

Вывод версии

-W

Не извлекать предупреждения

01.3.3. bison Программа bison — сие грамматический разбиратель (парсер): возлюбленная создает С-программу, предназначенную ради разбора определенной грамматики. Данная пакет вы далеко не понадобится впредь до тех пор, доколе ваша милость далеко не захотите написать настоящий компилятор. Шлюзы программы представлены в таблице 01.3. Формат вызова: b i s o n [ключи] файл 584


Глава 01. Создаем консольное приложение Ключи программы bison

Таблица 01.3

Ключ

Назначение

-Ь приставка

Использовать перечисленный аффикс про имени входящего файла

-d

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

-I

Не вмешивать шифр во существующие файлы

-о обложка

Установить обложка результата

-t

Включить отладочную информацию

-V

Записать созданную программу на обложка y.output

01.3.4. flex flex [параметры] файл Это пока что одна программа, которая пишет шифр вслед за нас. Flex может написать программу для языке С, которая короче разыскивать заданные образцы текста в текстовых файлах равно приводить в исполнение определенные действия, заданные программистом. Если вы нужна буква программа, тем временем самое срок прочитать страницы руководства man flex.

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

01.3.6. strip Утилита strip удаляет таблицу символов изо объектного файла.

01.4. Пример программы для С В п. 0.2.3 автор этих строк сказал в рассуждении состояниях процесса да перечислил посредь них положение «зомби». Зомби — сие процесс, каковой сейчас завершился, но его родимый батюшка уже безграмотный получил сигнала по части его завершении равным образом невыгодный удалил его структуру изо таблицы процессов. Такое может произойти, в отдельных случаях процесс-родитель отчего-нибудь безвыгодный подшофе для завершению потомка. Сейчас мы искусственно создадим такого зомби. Процесс-родитель породит потомка 585


LINUX: полное начальник

равным образом уснет держи 00 секунд. Потомок завершится чрез 0 секунды, а на прохождение 0 секунд симпатия хорош отираться на состоянии зомби. Напоминаю, что такое? состояние процесса допускается изведать по части команде top.

Листинг 01.3. Файл zombie.с #include <unistd.h> #include <signal.h> #include <stdlib.h> ttinclude <sys/wait.h> #include <stdio.h> int main() { int pid; int status, died; pid=fork(); switch(pid) { case -1: printf("ошибка fork\n"); exit(-1); case 0 printf (" Я потомок процесса %d\n" %d\n",, getppidO) printf(" Мой PID %d\n", getpid() // Ждем 0 секунды да завершаемся sleep(2); exit(0); default printf("Я родитель.\n"); printf ("Мой PID %d\n", getpidO); // Ждем завершения дочернего процесса // сквозь 00 секунд, а позднее убиваем его sleep(10); if (pid & 0) kill(pid,SIGKILL); died=wait(&status);

Скомпилируйте обложка zombie. не без; равно запустите исполняемый обложка zombie: $ gcc -о zombie zombie.с $ ./zombie Я родитель. Мой PID 0147 Я потомок процесса 0147 Мой PID 0148

086


Глава 01. Создаем консольное применение

Запомните новейший стриптиз да ахнуть невыгодный успеешь переключитесь держи другую консоль, где введите команду top -p 0148: 16:04:22 up 0 rain, 0 users, load average: 0,10, 0,10, 0,04 1 processes: 0 sleeping, О running, 0 zomhie, 0 stopped CPU states: 0,5% user, 0,6% system, 0,0% nice, 0,0% iowait, 07,8% idle Hei»: 127560k av, 76992k used, 50568k free. Ok shrd, 3872k buff 24280k active, 19328k inactive Swap: 052576k av. Ok used, 052576k free 39704k cached PID USER 1148 den

PHI 17

N1 0

SIZE 0

RSS SHARE STAT %CEU %HEN 0 0 Z 0,0 0,0

TIME COMMAND 0:00 zombie <defunct>

Мы видим, почто на списке процессов появился единодержавно зомби (STAT=Z), который «проживет» во таком состоянии аж 0 секунд.

087


Глава 02

ОТЛАДКА, ТРАССИРОВКА И ОПТИМИЗАЦИЯ ПРОГРАММ

ОШИБКИ И ОТЛАДКА ОТЛАДЧИК GDB ПРИМЕР ОТЛАДКИ ПРОГРАММЫ ТРАССИРОВКА СИСТЕМНЫХ ВЫЗОВОВ ПРОФАЙЛЕР GPROF

LINUX

ПОЛНОЕ РУКОВОДСТВО


02.1. Ошибки равно отладка Самыми страшными являются отнюдь не синтаксические, а эдак называемые логические ошибки. Ваша проект может вмещать так например сотню мелких синтаксических ошибок — немного погодя малограмотный приближенно функцию написали, вслед за тем забыли указать параметр, а эдак пропустили точку вместе с запятой. После исправления всех сих ошибок схема хорэ работать. Если а ваша расписание охватывает логическую ошибку — например, вы выбрали неверный алгорифм или — или искаженно его использовали, — то компилятор может аж безграмотный выработать предупреждения. Вроде бы ошибок нет, расписание работает, хотя вывод выдает анормальный либо — либо на какойто одну секунду общо рушится. Мне запомнился сам афоризм: «Программа делает то, в чем дело? вам ей сказали, да далеко не то, зачем вас хочется». Это да вкушать самое удачное, нате моего взгляд, определение логической ошибки. Если ваша сестра заметили ошибку давно того, во вкусе ваша список «увидела свет», то можете считать, почто вы повезло. Одно дело, если утилита бесплатная, другое, рано или поздно ваш брат из-за нее получили деньги, а давалец недоволен... А бывает и такое, в чем дело? конспект может корпеть один, неуд месяца равным образом только лишь потом ваша логическая опечатка «всплывает» наружу. Почему сие произошло? Дать неомонимичный протест сложно, пусть даже при случае вишь шифр программы: все зависит с ее специфики. Например, буде ваша график использует какую-нибудь СУБД для обработки информации, ваша сестра могли назначить размер полина меньший, чем нужно. Первые двуха месяца график работала отлично, а на единолично классный секунда телефонист ввел аспидски длинную фамилию адски важного клиента, да ваша пакет невыгодный внесла эту информацию во базу. Но это тривиальная ошибка, да ее позволяется прокорректировать беда быстро. А гляди при случае ваш брат пишете программу к управления устройством не в таком случае — не то для обработки показаний внешних датчиков, подключенных для компьютеру, бывает ужас хитроумно встретить ошибку, связанную не без; конфликтом в аппаратном уровне. Например, юзер установил новое устройство, которое конфликтует со вашим контроллером. Или ваша милость написали модуль для поддержки одного контроллера, а читатель подключил два, и оба нынче никак не работают. 589


LINUX: полное начальник

Какие а ошибки неоднократно совершают начинающие (и малограмотный только) программисты? Самая тривиальная — неправильное эксплуатация операций инкремента равно декремента. Например, следующие выражения безграмотный эквивалентны: X=у++ + Ю ; X=++у + 0 0 ;

В первом случае переменной х довольно присвоено значимость 05, а изумительный втором — 06. Следующей объединение частоте является неловкость неучтенной единицы. Например, вам нужен массив, слагающийся изо 00 элементов, ваш брат его объявляете: int

a [10] ;

А дальше инициализируете его от через цикла: for

(i=0;i<=10;i++)

a[i]

=0;

Этот остаток стих попытается инициализировать несуществующий элемент — а[10]. Или сызнова единолично встречается на каждом шагу случай: хакер забывает, в чем дело? цифрация элементов массива начинается вместе с 0, да безвыгодный инициализирует первый элемент массива: for

( i=l ; i < 0 0 ; i + + ) a [ i ]=0;

Особое пространство на зоопарке ошибок занимают ошибки, связанные от неправильным использованием указателей. Все сии ошибки не возбраняется условно разделить получи и распишись три группы, которые моя персона не долго думая сжато перечислю. 1) Неправильное приложение операторов * равно &. Это самая распространенная серия ошибок начинающих программистов. Вот характерный пример эдакий ошибки: /* противоестественно */ char * s ; *s=(char * s ) m a l l o c ( 0 0 ) ; /* согласно правилам */ char * s ; s=(char * s ) m a l l o c ( 0 0 ) ; 2) Выделение недостаточного к адресации объекта объема памяти. Например, автор получим такую ошибку, неравно попытаемся скопировать в строку s (вышеприведенный остаток кода) строку, состоящую изо 00 символов. 3) Использование неинициализированных указателей. Такие ошибки часто встречаются присутствие работе из динамическими структурами. Например, 590


Глава 02. Отладка, трассировка равным образом оптимизация программ

не без; линейными списками: ваш брат забыли инициализировать первостепенный элемент (head=NULL) да пытаетесь наболтать во перечень последний элемент. Использование рекурсивных вызовов может навести после на вывеску ошибку переполнения стека, когда вас нечисто зададите соглашение завершения рекурсии. Как правило, рекурсивная деятельность вызывает саму себя со небольшую толику измененными параметрами. Рано или — или шапочный разбор такая функция должна, во зависимости ото переданных параметров, воротить назад какое-нибудь значение, а малограмотный паки поднять саму себя. Для облегчения поиска ошибок были созданы специальные программы — отладчики. Одним изо самых удачных отладчиков к Linux является gdb (The GNU Debugger). Этот настройщик входит во соединение всех распространенных дистрибутивов (за исключением их «урезанных» версий — к рабочих станций), да к его установки шабаш учредить набор gdb. С через gdb вас сможете: • • • • •

засунуть вашу программу из определенными аргументами; запустить программу во пошаговом режиме; установить точки останова (breakpoint); установить ограничение останова программы; узнать, ась? случилось, когда конспект сверх ожидания завершилась.

02.2. Отладчик gdb Формат вызова отладчика gdb следующий: gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir] [prog[coreIprocID]]

Шлюзы отладчика описаны на таблице 02.1. Ключи командной строки gdb Ключ

Таблица 02.1 Назначение

-help иначе говоря - h

Вывод краткого описания всех параметров

-nx либо - п

Не производить команды файла инициализации .gdbinit

-q

Не исключать речь да информацию об авторских правах

-batch

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

-сс)=каталог

Установить действующий оглавление (по умолчанию используется текущий каталог)

-f иначе говоря -fullname

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

091


LINUX: полное руководство Продолженгие

табл. 02.1

-b bps (bits per second)

Установить бойкость обмена информацией согласно последовательному интерфейсу, коли вас отлаживаете вашу программу удаленно

-Ку=терминал

Установить оконечное устройство на качестве стандартного ввода равно вывода для отлаживаемой программы.

-s обложка или -symbols=<{>aiin

Читает таблицу символов с указанного файла

-write

Разрешить отметка во исполняемые равно core-файлы

-e расписание

Использовать указанную программу во качестве фильтра дампа

-зе=файл

Читать таблицу символов изо указанного файла равно использовать указанный обложка на качестве исполнимого

-соге=файл или -с обложка

Указать обложка дампа

-соттапс)=файл или -х обложка

Выполнить указанные во файле команды (используется во командном режиме)

-d индекс

Добавить синопсис для списку поиска исходных текстов

[prog | core |proclD]

Последний параметр задает объект, который-нибудь нужно отлаживать. Вы можете показать программу (prog), другими словами дамп-файл (core), который будет создан во случае ошибки программы (Segmentation fault), или же законнектиться ко поуже запущенному процессу (proclD)

-pPID

Подключиться ко уж запущенному процессу (данная опция стала доступной во версии gdb 0.2)

Чтобы пускать в ход gdb чтобы отладки вашей программы, нужно прикинуть в исполняемый обложка отладочную информацию. Для сего откомпилируйте вашу программу не без; опцией -g: $ дсс -д -о ргод ргод. с Данная опция охватывает отладочную информацию на родном для того операционной системы формате, из которым может мучиться gdb. Затем нужно пробудить gdb так: $ gdb prog Если со временем запуска вашей программы произошла погрешность равным образом был создан дамп-файл (core), не запрещается уполномочить отладчику равно данный файл: $ gdb prog core Можно в свой черед подсоединиться ко еще запущенному процессу, к этого нужно отправить его PID: $ gdb

0111

Только убедитесь попервоначалу на том, ась? у вам отсутствует файла 0111, потому как gdb сначала ищет исполняемый файл, а там core-файл, а ранее спустя время PID. После запуска отладчика во интерактивном режиме ваша милость можете пускать в дело команды, самые важные изо которых перечислены на таблице 02.2. Об остальных позволительно определить во справочной системе: man gdb. 592


Глава 02. Отладка, трассировка равно оптимизация программ Команды gdb

Таблица 02.2

Команда

Назначение

break [файл:]функция

Установить точку останова

run [аргументы]

Запустить программу равно отдать ей указанные доводы

Ы

Обратная трассировка: воспроизвести стека программы

print фраза

Вывести спица в колеснице выражения, операндами могут присутствовать переменные, объявленные во вашей программе

С

Продолжить проведение в жизнь программы (после останова)

Next

Выполнить следующую строку. Это приблизительно называемый деяние «над» (step over). Если следующая строчка — извещение функции, ведь да мы от тобой выполним ее следовать один шаг — «перешагнем» ее

Step

Выполнить следующую строку. Это этак называемый предприятие «в» (step into). Если следующая ряд — приглашение функции, ведь пишущий сии строки будем последовательно выполнять безвыездно операторы тела функции

help [имя]

Вывести справку относительно команде отладчика иначе умозаключить общую информацию о нем

Quit

Выход

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

02.3. Пример отладки программы Давайте напишем программу, которая обнуляет начатки массива а [ ] . Да, пакет ни аза полезного отнюдь не делает, а в ее примере позволено обнаружить работу не без; отладчиком gdb. Вот распечатка программы: Листинг 02.1. Демонстрационная программа, содержащая ошибку #include <stdio.h> int main() { char developer[]="Denis"; int a[10]; int i ,-

do a[i]=0; while (i<10) ; return 0;

093


LINUX: полное начальник

Назовем нашу программу test.с равным образом откомпилируем ее: $ дсс -д -о t e s t t e s t . с Опция -g добавляет отладочную информацию ради отладчика gdb, а опиия -о указывает отчество результирующего файла. Просмотрите распечатка программы. Программа отнюдь не делает сносно подозрительного — возлюбленная итого всего лишь во цикле do обнуляет весь основы массива — сначала никакой компонент а[0] становится нулем, попозже первый, второй и беспричинно далее. Попробуйте пустить программу, равным образом ваша сестра увидите сообщение: Segmentation fault. В нежели а причина? Попробуем спрятать ее вместе с через отладчика gdb. Запустите настройщик из параметром test (это псевдоним нашего исполняемого файла): $ gdb

test

В отладчике gdb введем команду run чтобы запуска программы. И что такое? мы видим? Что проект получила команда SIGSEGV, так глотать имеет место ошибка Segmentation fault. Эта оплошка произошла во строке 02: a[i]=0. Но что может являться опасного во этом операторе? Ошибка Segmentation fault может сотвориться сообразно нескольким причинам, одной изо которых является выход вслед границы массива. Проверим это: введите команду print i. Команда print выводит авторитет указанной переменной (или выражения). Ого! Оказывается, автор пытаемся занулить безграмотный никакой ингредиент массива, а 715910728-ой! Почему но беспричинно произошло? Может быть, сие gdb бесцеремонно врет и за значения переменной i выводит не насчет меня писано что? Для проверки на криводушие введите команду print developer, которая выведет бери экран значение переменной developer. С переменной developer всё-таки в ажуре — ее авторитет «Denis» (рис. 02.1). Так что-нибудь а произошло? Так вроде аргумент i малограмотный является глобальной, ее значение далеко не обнуляется возле запуске программы. Чтобы избежать подобной ошибки, нужно инициализировать переменную присутствие объявлении: int

i=0;

Вот автор равным образом нашли ошибку! Что а покамест позволяется совершить от через gdb? Можно поставить breakpoint, ведь глотать точку останова, прерывающую действие программы в указанном месте. Это нужно на того, дай тебе присмотреть накопления некоторых переменных и/или стека программы под запуском какой-нибудь функции либо — либо но с целью пошаговой трассировки программы. Для пошаговой трассировки программы установите точку останова пользу кого функции main: break main 594


Глава 02. Отладка, трассировка да оптимизация программ

Сеанс Правка Вид Настройка Помощь

Рис. 02.1. Сессия gdb

Для установки точки останова бери другую функцию введите команду break равным образом на качестве аргумента укажите титул функции. Теперь запустите программу возьми создавание (команда run). Команде run позволено передать также аргументы, не без; которыми должна запускаться программа, например, run /home/denis/report.txt. Когда настройщик достигнет точки останова, дьявол приостановит выполнение программы равным образом полноте терпеть ваших инструкций. Затем введите команду next с целью выполнения следующей строки. Команда next — сие команда трассировки «над» функцией, так питаться врач вызова функции будет выполнен из-за одиночный шаг. Команда step используется к пошаговой трассировки функций. Если вам хотите удлинить нормальное выполнение программы по прошествии точки останова, введите команду с. Для отображения стека программы предназначена общество bt (backtrace). Команда list используется для того отображения исходного текста программы (рис. 02.2). Естественно, круглый слова программы отнюдь не поместится получи и распишись экране, поэтому отладчик отобразит только лишь его часть. Чтобы пока что крат безвыгодный подсоединять команду list, прямо-таки нажмите Enter, да gdb выполнит предыдущую команду. Команда help предназначена в целях отображения справки по части командам отладчика, а пакет quit — ради выхода изо него.

095


LINUX: полное руководство ыд а

i eenfs©loca»n»sur>r.ali!nmain: mnmeftiems - Shell - KnnsnlH Сеанс Правка Вид Насгройка Помощь

Рис. 02.2. Команда list

E'l!

±тм

Program

Commands

Status

Source

ОГ

GO"

?• j mai и _. :

«include <stdio.h> 1nt { int int for

• X

mainO

Run

a[10]; i; Ci-0;i<-11;i++)

NM '

[ »rintfC*d\n",a[i]);

JOontj _ K I

return 0;

Up I O w n _Urdoj_P?*' • Edit I Make

Program exited normally. Cgdb) step The program is not being run. Cgdb) I i itin

Рис. 02.3. Программа KDbg 596


Глава 02. Отладка, трассировка равно оптимизация программ

Возможности программы gdb сим малограмотный ограничиваются. Отладчик gdb — это адски мощная программа, да моя особа советую вы почаще использовать команду help — узнаете счета полезного чтобы себя. Если вас удобнее воспользоваться фафический интерфейс, нежели символьный, вы можете использовать в своих целях одним с интерфейсов ко профамме gdb. Вотан с них— KDbg. Все, в чем дело? автор сих строк всего что-нибудь проделали не без; через команд отладчика gdb, вы можете сделать, используя кадастр интерфейса KDbg (рис. 02.3). Программа KDbg понравилась ми пока что тем, что-то позволяет выигрышно просматривать регистры, потоки, память, плеть да прочее, имеющее непосредственное касательство для процессу отладки. Однако имейте на виду, что интерфейс KDbg усильно ограничивает внутренние резервы отладки, благодаря тому что что позволяет исполнять чуть базовые функции. Существуют да кое-кто оболочки чтобы отладчика gdb, например, DDD. Эта оболочка обладает только-только большими возможностями, нежели KDbg, же целое же она является всего лишь надстройкой по-над gdb. Оболочек много, a gdb — один. Вы можете отобрать оболочку держи частный вкус, а мы не насчет частностей предпочитаю gdb без всяких оболочек. File

Edit

View

Program

Commands

Щ mai n

-^ : :

«include <stdio.h>

:-. . ..__

r <f..| --

Status

Source

Help

Data

t t ««x

0nt mainO { int a[10]; int i; for (i-0;i<-11;i++) { a[i]=i; brintf"C%d\n\a[iD;

. S*tsy - Splits

0 Ht

»

• 0::

Interrup Next I WeKti ша|яп1зп

return 0; }

Up

rvjir,

UK» Bit I kW.

Program exited normally, (gdb) step The program is not being run. (gdb) I

Рис. 02.4. Оболочка DDD 597


LINUX: полное инструкция

02.4. Трассировка системных вызовов Вы когда-нибудь задумывались насчёт том, какие системные вызовы использует наша график умереть и далеко не встать пора своего выполнения? Если да, так оный статья в духе раз для вас. Возможно, временно дьявол лишь только удовлетворит ваше любопытство, однако через некоторое минута буква катамнез станется вы серьёзно необходима. Проследить, какие системные вызовы использует наша программа, позволяет содержание strace. Для ее установки нужно определить пакет strace. Формат вызова команды strace следующий: s t r a c e [ - d f f h i q r t t t T v x x ] [ -acolumn ] [ - e e x p r ] . . . [ - o f i l e ] [ -ppid ] . . . [ - s s t r s i z e ] [ -uusername ] [ command [ a r g . . . ] ] Ключи программы перечислены во таблице 02.3. Ключи командной строки strace Ключ

Таблица 02.3 Назначение

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

-d

Выводить отладочные сведения самой программы strace нате стандартный вывод ошибки

-f

Трассировать дочерние процессы, созданные ранее трассируемыми процессами

-ff

Данная опция применятся всего лишь вкупе вместе с опцией - по отношению имя_файла. Каждый трассируемый течение короче записан во обложка имя_файла.р1Ь

-F

Следовать вызовам vfork(). Данную опцию запрещается пускать в ход вместе с опцией -f

-h

Вывести справку

-i

Выводить стрелка инструкции умереть и безграмотный встать эпоха системного вызова

-q -r

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

-t

Перед каждой строкой получать текущее период

-tt

То же, что-нибудь да - t , так будут рассеиваться опять же микросекунды

-T

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

-V

Получение дополнительной информации

-V

Вывести штукенция версии strace

-X

Выводить не-ASCII строки на шестнадцатеричном формате

-XX

Выводить всё-таки строки во шестнадцатеричном формате

-а столбик

Выровнять возвращаемые вызовами значения на указанном столбце (по умолчанию 00)

-e отображение

Позволяет разделаться отслеживаемые события. За побольше подробной информацией обратитесь для справочной системе

-e trace=Ha6op

Определить укомплектование отслеживаемых вызовов. Например, trace=open,close,read.write

098


Глава 02. Отладка, трассировка да оптимизация программ Продолжение Ключ

табл. 02.3

Назначение

-е trace=file

Будут отслеживаться исключительно вызовы к работы от файлами (open,stat.chmod,unlink да т.д.)

-е trace=process

Отслеживаются вызовы чтобы работы от процессами (fork, exec, wait равно др.)

-е trace=network

Отслеживаются сетевые вызовы

-е trace=signal

Отслеживаются вызовы в целях работы не без; сигналами

-е trace=ipc

Отслеживаются 0РС-вызовы

-е abbrev=Ha6op

Сокращает суд каждого члена структуры. Например, abbrev=all или abbrev=none

-е verbose=Ha6op

Различать структуры различных системных вызовов, сообразно умолчанию verbose=all

-е raw=set

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

-е signal=Ha6op

Определяет настройка трассируемых сигналов. По умолчанию signal=all. Вы можете пустить в ход восклицательный значок для того отрицания, например, signal=!SIGIO означает, зачем команда SIGIO никак не достаточно трассирован

-е геас1=набор

Выполнять совершенный шестнадцатеричный равным образом ASCII-дамп всех прочитанных вызовом read() данных. Например, с намерением смотреть всегда данные, поступающие через дескрипторы 0 равным образом 0, введите read=2,7

-е write=Ha6op

То же, ась? равно -е read, только лишь к дневник

-о имя_файла

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

-р pid

Присоединиться для процессу вместе с PID=pid да зачать трассировку

-s размер

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

-S признак

Сортирует дедукция гистограммы, которая выводится опцией -с, соответственно заданному критерию: time (время), calls (вызовы), name (имя) равно nothing (без сортировки)

-и имя_пользователя

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

Вы пусть даже безграмотный можете себя представить, какие системные вызовы использует такая чекушка программка: Листинг 02.2. Файл prog.с ttinclude <stdio.h> int main() { printf("HelloVn"); return 0;

099


LINUX: полное начальник

Откомпилируйте эту программу (g от от -о p r o g strace:

p r o g . с) равно запустите

$ strace prog

Вы увидите последующий вывод: execve("./a.out", ["./a.out"], [У* 01 vars */])=0 uname({sys="Linux", node="localhost.localdomain", ...})=0 brk(0) =0x80495b4 open("/etc/Id.so.preload", O_RDONLY) =-1 ENOENT (No such file or directory) open("/etc/Id.so.cache", O_RDONLY) =7 fstat64(7, {st_mode=S_IFREGI0644, st_size=31578, ...})=0 old_mmap(NULL, 0157 0, PROT_READ, MAP_PRIVATE, 0, 0)= 0x40014000 close(7) =0 open("/lib/i686/libc.so.6", O_RDONLY) =7 read(7, "\177ELF\l\l\l\0\0\0\0\0\0\0\0\0\3\0\3\0\l\0\0\ 0^u\lB4\0"..., 0024)=1024 fstat64(7, {st_mode=S_IFREG|0755, st_size=1401027, ...})= 0 old_mmap(0x42000000, 0264928, PROT_READIPROT_EXEC, MAP_ PRIVATE, 0 , 0 )=0x42000000 mprotect(0x4212c000, 06128, PROT_NONE)=0 old_iranap(0x4212c000, 00480, PROT_READ|PROT_WRITE, MAP_ PRIVATE IMAP_FIXED, 0, 0xl2c000)=0x4212c000 old_mmap(0x42131000, 05648, PROT_READIPROT_WRITE, MAP_ PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0)=0x42131000 close(7) =0 munmap(0x40014000, 01578) =0 brk(0) =0x80495b4 brk(0x80495e4) =0x80495e4 brk(0x804a000) =0x804a000 fstat64(l, {st_mode=S_IFCHR|0620, st_rdev=makedev(13 0, 0 ) , . . .})=0 mmap2(NULL, 0096, PROT_READIPROT_WRITE, MAP_PRIVATE|MAP_ ANONYMOUS, -1, 0)=0x40014000 write(1, "Hello\n", 0) =6 munmap(0x40014000, 0096) =0 _exit(0) =?

Читать вызовы нужно так: имя системного вызова=возвращаемое значение В нашем случае м ы вывели для ферма полдюжины символов, того вызов writeQ возвратит вес 0. 600


Глава 02. Отладка, трассировка равным образом оптимизация программ В случае, когда комплексный бис завершился несчастливо (обычно адрес ошибки -1), утилита strace выводит неграмотный всего только код, а равным образом инструкция ошибки: open("/foo/bar", O_RDONLY)=-1 ENOENT (No such f i l e . o r directory) Стандартные константы выводятся на их символьном представлении: openCfile.dat",

O_WRONLY I O_APPEND IO_CREAT , 0666)=3

Сигналы в свой черед выводятся во символьном представлении, например: sigsuspend([] <unfinished SIGINT ( I n t e r r u p t ) +++ k i l l e d by SIGINT +++

...>

Структуры, скорее руки и ноги структур, заключаются во фигурные скобки и выводятся во формате имя_члена=значение, например: l s t a t ( " / d e v / n u l l " , {st_mode=S_IFCHR|0666, s t _ rdev=makedev(1, 0 ) , ...})=0 Символьные указатели печатаются что строки во С, ведь принимать их значения заключены на двойные кавычки: read(3,

"root::0:0:System

Administrator:/"...,

0024)=422

02.5.Оптимизация программ. Профайлер gprof Ваша схема работает медленно? Скорее всего, источник кроется в неэффективном, медленном алгоритме. Существуют программы, позволяющие предназначить миг работы каждой функции вашей программы и всей программы на целом. Программы такого рода называются профайлерами. В вашем дистрибутиве может увиваться единодержавно с профайлеров gprof, prof, profiler. Сейчас наша сестра рассмотрим программу gprof (The GNU Profiler), позволяющую предопределить срок работы каждой функции. Основные ключи программы представлены во таблице 02.3.

001


LINUX: полное руководство Ключи командной строки gprof Ключ

Таблица 02.3 Назначение

He синтезировать информацию в отношении статичесжил функциях

Не порождать руководство каждого полина во итоговой таблице

Включить эмпирический исследование текстового сегмента объектного файла с целью создания статического монотипия вызовов

-е имяфункции

Не порождать отзыв насчёт работе указанной функции равным образом об всех функциях, которые изо нее вызываются

-Е имя_функции

Не делать указанную функцию да всё-таки функции, которые симпатия вызывает

-f имя_функции

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

-F имя_функции

Обрабатывать всего указанную функцию равным образом однако функции, которые с нее вызываются

-k f u n d func2

Не строить умозаключение информацию касательно вызове функции func2 с функции f u n d

-s

Создание итогового файла gmon.sum

-z

Вывести функции не без; нулевым процессорным временем

02.5.1. Использование профайлера Для использования профайлера нужно скомпилировать программу вместе с опцией компилятора -pg равным образом без участия опции -о, таково что профайлер до умолчанию работает от файлом a . o u t . После сего запустите обложка a.out, чтобы он создал обложка gmon.out. Теперь запустите профайлер из параметром —nograph:

$ дсс -рд 0.с $ ./a.out $ gprof -b --no-graph Без ключа -Ь профайлер выведет воссоздание полей итоговой таблицы: • Time: минута работы функции во процентном соотношении; • cumulative seconds: сложность числа секунд этой функции равно вызывающих ее функций; • self seconds: состав секунд, потраченное сверху работу этой функции в отдельности; • Calls: день вызовов; • self ms/calls: контингент миллисекунд, получи и распишись протяжении которых функ,, ция выполнялась; • total ms/calls: число секунд, в протяжении которых выполнялась функция равно однако функции, которые вызываются данной функцией; • name: термин функции. Чтобы было понятно, почто означает каждое поле, рассмотрим распечатка 02.3.

002


Глава 02. Отладка, трассировка равным образом оптимизация программ

Файл

Правка

Свойства Справка

Рис. 02.5. Программа gprof

Листинг 02.3. Демонстрационная программа #include <stdio.h> int function2() { int i; /* генерируем задержку */ for (i=0;i<9999999;i++) ; return 077; double function(void) { int i; double x=7.2323232323, y=324343.3434; /* генерируем задержку */ for (i=0;i<9999999;i++) x/y; function2(); return x/y;

003


LINUX: полное начальник

int main() { int i ; double 0; for (i=0;i<10;i++) { printf("%d\b",i); l=function(); } return 0; }

Как как пишущий эти строки погляжу изо листинга, цель function () вызывается 00 крата (см. поле calls). В свою очередь, возлюбленная вызывает функцию f unction2 (), следовательно, наличность вызовов этой функции равно как в равной степени 00. Функция function() выполняется 0.09 секунд (self seconds), а где-то как бы ее последняя ганшпуг в колеснице никак не вызывает (кроме main), в таком случае нива cumulative seconds в свою очередь в одинаковой мере 0.09. Функция function2() работает 0.07 секунд, хотя ее вызывает назначение functionQ, которая работает 0.09 секунд. Следовательно, закраина cumulative seconds в целях другой функции так же 0.09+1.07=2.16. Поле s e l f ms/call эквивалентно полю s e l f seconds, всего лишь его доза представлена в миллисекундах. Поле t o t a l ms/call вспять полю cumulative c a l l и охватывает период выполнения этой функции да всех дочерних функций, в в таком случае минута наравне поляна cumulative c a l l включает минута этой функции и всех родительских.

02.5.2. Как оптимизировать программу В качестве оптимизации программы могу вас надоумить затеять следующие действия: 1. Запустите профайлер, равным образом допустим возлюбленный определит времена работы всех функций. 2. Перепишите функцию (или функции), которые занимают больше всего процессорного времени. Возможно, вы придется изменить алгоритм работы сих функций. 3. Когда алгорифм видоизменить невозможно, позволено рыпнуться перебелить порцион стих функции сверху языке ассемблера, если, конечно, сие не противоречит идеологии вашей программы (возможно, вам хотите, чтобы возлюбленная запускалась сверху по образу позволено большем количестве разных платформ - тутовник помимо С далеко не обойтись). Если изменение функции невозможна или — или помогла мало, ведь попробуйте оптимизировать программу с помощью опций компилятора. Прежде общем выключите отладочную информацию (не указывайте опцию -g) — равно размер программы станет меньше. Используйте одну с опций оптимизации - О . 604


Глава 03

РАЗРАБОТКА ГРАФИЧЕСКОГО ПРИЛОЖЕНИЯ: БИБЛИОТЕКА GTK+

ВВЕДЕНИЕ В GTK+ БИБЛИОТЕКА GLIB ПЕРВАЯ ПРОГРАММА НА GTK+ ВИДЖИТЫ


Сейчас наш брат поговорим относительно создании графического интерфейса на вашей Linux-программы. Как ваша сестра знаете, средствами одного С в здравом уме GUI не построишь, тем больше аюшки? не привыкать стать читатель Windows очень требователен неграмотный прямо для наличию GUI, да равно для дизайну комплекция (окна программы). Поэтому безо дополнительных библиотек вас безграмотный обойтись. Самыми распространенными библиотеками ради создания GUI являются библиотеки GTK+ равно Qt. Рекомендуется проэксплуатировать исключительно сии библиотеки, потому что велика возможность того, зачем они ранее будут установлены у пользователя (уж GNOME равно KDE убирать с у всех). Рассмотрим до мелочей библиотеку GTK+, поелику она, получи муж взгляд, проще, нежели Qt. Скорее всего, GTK+ у вам сейчас установлена, же вас понадобится точный назначить набор gtk+-devel, охватывающий необходимые файлы для разработки GTK-программ.

03.1. Введение на GTK+ Первоначально библиотечка GTK+ (далее GTK) была разработана для использования программой GIMP, отселе равным образом наименование — The GIMP Toolkit. Со временем здание стала употребляться для того разработки других приложений ради среды GNOME. Сейчас GTK — сие объектно-ориентированный да кросс-платформенный орган в целях создания графического интерфейса приложений, вдобавок созданные от использованием GTK приложения независимы с среды GNOME. Ваше приложение, написанное на GTK, склифосовский мазово корпеть во KDE либо все так же кто непохожий среде — главное, чтобы помещение GTK была установлена сверху компьютере. Сама помещение GTK+ достаточно нате трех китах: • Библиотека Glib — предназначена интересах оперирования не без; различными типами данных. Данная книжное собрание короче полезной к разработки любых приложений, даже если невыгодный GTK. Эта а книжное собрание включает функции про работы не без; памятью да на обработки ошибок. О типах данных библиотеки Glib наша сестра поговорим позже. 606


Глава 03. Разработка графического приложения: библиотечка GTK+

Библиотека GDK (The GIMP Drawing Kit) — читальня низкого уровня, ее функции взаимодействуют из функциями оконной системы (X Window). Используется ради построения графических примитивов. Библиотека GTK — используется ради создания графического интерфейса

03.2. Библиотека Glib 23.2.1. Стандартные типы данных библиотеки Glib Библиотека Glib заключает типы данных, аналогичные типам данных языка С, а вот и все такие структуры, что деревья, списки; функции для работы вместе с памятью равно обработки ошибок. Это уже чтобы того, чтобы ваше ливрезон могло фигурировать совсем нечего делать портировано нате другую платформу. Например, нате одних компьютерах субчик int может составлять 02-разрадным, а на других — 04-разрядным (это зависит с архитектуры центрального процессора). А если бы ваш брат используете образец gint, оглашенный во библиотеке Glib, то можете в будущем эксплуатировать свое употребление да отнюдь не опекать о том, как бы оно довольно заниматься нате RISC-машине перед управлением Windows NT. В таблице 03.1 перечислены типы данных библиотеки GLib, которые соответствуют типам данных С. Таблица соответствия типов данных Glib да С Тип данных С

Таблица 03.1 Тип данных Glib

char

gchar

short

gshort

long

glong

int

gint

bool

gboolean

unsigned char

guchar

unsigned short

gushort

unsigned long

gulong

unsigned int

guint

float

gfloat

double

gdouble

long double

gldouble

void*

gpointer

Для использования сих типов данных, равно как равным образом прочих возможностей библиотеки Glib, надо влить заглавный обложка glib.h. 607


LINUX: полное вождь

03.2.2. Функции для того работы со памятью Функции пользу кого работы со памятью библиотеки Glib выполняют те а действия, который равным образом соответствующие им функции языка С. Вот их прототипы: gpointer g_malloc( gulong size ); gpointer g_realloc( gpointer mem, gulong size ); void g_free( gpointer mem );

03.2.3. Строки да Glib Библиотека Glib заключает будет несть функций ради работы со строками, а мы перечислю едва самые от моей точки зрения интересные (таблица 03.2). Некоторые строковые функции библиотеки Glib Прототип gchar* gstrchug (gchar* s) gchar* g_strchomp(gchar* s) gchar* g_strstrip( gchar* s ) void gstrdown (gchar* s) void gstrup (gchar* s) void gstrreverse (gchar* s)

Таблица 03.2 Описание

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

03.4.4. Списки Библиотека Glib заключает имущество к работы не без; одно- равным образом двусвязными списками. Особенность двусвязного списка заключается на том, что-нибудь по нему не возбраняется мигрировать во обеих направлениях — вспять равно вперед. В файле gslist.h (Glib Single List) описаны собственность с целью работы со односвязными списками, а на файле glist.h — к работы вместе с двусвязным списком. Вот структуры односвязного равным образом двусвязного списков: // односвязный список typedef s t r u c t _GSList GSList; s t r u c t _GSList {

gpointer data; GSList *next; // движок получай последующий компонента списка

008


Глава 03. Разработка графического приложения: книжное собрание GTK+

// двусвязный список typedef struct _GList GList; struct _GList { : gpointer data; GList *next; // директива сверху последующий компонент списка GList *prev; // директива получи прошлый штучка списка } Поле data предназначено интересах хранения данных списка, вдобавок они могут быть любого типа, тем малограмотный менее gpointer — сие разряд void*. Работать со списками жуть просто. Для основные принципы нужно объявить список: GList * l i s t=NULL; GSList * s l i s t=NULL; Затем прибавить начатки во список. Это позволительно содеять со через двух функций — g_list_append() либо — либо g_slist_prepend() — на зависимости через используемого будто списка: gchar *el=g_strdup("это центральный элемент"); l i s t=g_list_append(list, e l ) ; Функции g_list_append() равно g_slist_prepend() добавляют ингредиент во конец списка. Если вам хотите прирастить составляющая на начинание списка, нужно пускать в дело функции: g_list_prepend(GList * l i s t , gpointer data) g_slist_prepend(GSList * l i s t , gpointer data) Чтобы вделать недавний устройство во определенную позицию, нужно эксплуатнуть функции: GList *g_list_insert( GList *list, gpointer data, gint position ) GSList *g_slist_insert( GSList *list, gpointer data, gint position ) Здесь position — сие закидон элемента, пизда которым нужно вставить новый элемент. Если position=0, в таком случае компонент бросьте добавлен во начало списка, так убирать прежде бывшим первым элементом. Для удаления элемента используются функции: GList *g_list_remove(GList * l i s t , gpointer data ) GSList *g_slist_remove(GSList * l i s t , gpointer data) Для передвижения в соответствии с списку используются функции: g _ l i s t _ n e x t ( ) , g_slist_next() - сверху "шаг" вперед g_list_prev() - отступать

00 Зак. 088

009


LINUX: полное описание

Вот куцый притча работы со списком — выход получай балка всех его элементов: // double_list потребно фигурировать определен равным образом иметь на иждивении элементы GList " l i s t=double_list; while (list!=NULL) { printf("%s\n",list->data); list=g_list_next(list); По окончании работы со списком малограмотный забудьте опростать память: void g_list_free(GList * l i s t ) ; void g_slist_free(GSList * s l i s t ) ; Для сортировки списка используется функция: GSList * g _ s l i s t _ s o r t ( G S L i s t * s l i s t , GCompareFunc f ) ; Первый параметр — сие список, тот или другой нужно отсортировать. Второй — это занятие сравнения двух элементов. Вот ее прототип: typedef gint (*GCompareFunc) (gconstpointer a, gconstpointer b ) ; Данную функцию вас должны известить самостоятельно. Она должна пить пара параметра да возвращать все значение: • коли а<Ь, ведь -1 (точнее, все цифра поменьше 0); • неравно а==Ь , так 0; • коли а>Ь, ведь 0 (любое контингент значительнее 0). Библиотека Glib вдобавок включает собственность пользу кого работы вместе с деревьями — как бинарными, в такой мере да произвольными, только ты да я сии накопления полагать не будем.

03.2.4. Таймеры на Glib Библиотека Glib позволяет эксплуатировать таймеры на наших программах. Для сего нужно: • • • • •

влить заглавный обложка gtimer.h; создать регулятор выдержки времени функцией GTimer *g_timer_new(); запустить регулятор выдержки времени функцией g_timer_start(GTimer *timer); узнать время, отсчитанное таймером — g_timer_elapsed(); при необходимости перезапустить регулятор выдержки времени не без; через функции g_timer_reset(GTimer *timer) • остановить регулятор выдержки времени функцией g_timer_stop(GTimer *timer); • перевести регулятор выдержки времени — g_timer_destroy(GTimer *timer).

010


Глава 03. Разработка графического приложения: ленинка GTK+

Стоит заглушиться подробнее только что держи функции g_timer_elapsed(GTimer * timer, gulong *mcs). Данная занятие возвращает величина и круг секунд, отсчитанное таймером. По адресу указателя *mcs записывается цифра микросекунд. Пример использования таймера представлен во листинге 03.1. Листинг 03.1. Использование таймера #include <stdio.h> #include <glib.h> #include <gtimer.h> int main() double sec; gulong ms; int i ; GTimer *timer=g_timer_new(); printf("Данный период достаточно трудиться далеко не паче 00 секунд\п"); g_timer_start (timer) ,for (i=l; i>0;) sec=g_timer_elapsed(timer, &ms); if (sec >=10) g_timer_stop(timer); printf("Таймер остановлен. Мкс: %d\n",ms); break;

g_timer_destroy(timer); return 0;

011


LINUX: полное описание

03.3. Первая схема для GTK+ 23.3.1. Виджиты Перед написанием самой азбучная истина GTK-программы нужно разобраться с терминологией GTK. Элементы графического интерфейса пользователя — окна, кнопки, полина ввода, переключатели равно тому подобное — называются виджитами. Основным элементом графического интерфейса является окно. Виджиты для размещения во окне помещаются во контейнер. В самом окне сопоставлять виджиты допускается вместе с через вертикальных/горизонтальных боксов или но таблиц. Второй средство сильнее гибок, даже если спирт может показаться вам сложнее. Виджиты могут отзываться получи и распишись сигналы, например, плевок в лицо мышью. При этом вызывается функция-обработчик действие (сигнала), разве вы определили ее. Работа не без; виджитами происходит в области таковский схеме: 1. образование виджита вместе с через одной с функций библиотеки GTK; 2. дефиниция свойств виджита; 3. формулировка сигналов виджита, неравно спирт принуждён откликаться в сигналы; 4. рассовывание виджита на контейнере, так глотать примотка его для окну; 5. обрисовка виджита. Нужно непременно воспроизвести виджит, или его ни одна душа безвыгодный увидит. Например, нижеупомянутый пассаж стих создает виджит — кнопку от текстом — и отображает ее. GtkWidget

*button;

/* Рисуем кнопочку от надписью H e l l o , All */ b u t t o n=gtk_button_new_with_label ("Hello, A l l " ) ; /* При нажатии кнопки достаточно вызвана выражение h e l l o ( ) */ g t k _ s i g n a l _ c o n n e c t (GTK_OBJECT ( b u t t o n ) , " c l i c k e d " , GTK_SIGNAL_FUNC ( h e l l o ) , NULL); /* Помещаем кнопку во ларь */ g t k _ c o n t a i n e r _ a d d (GTK_CONTAINER (window), b u t t o n ) ; /* Отображаем кнопку. */ gtk_widget_show ( b u t t o n ) ; 612


Глава 03. Разработка графического приложения: комната GTK+

Первый команда создает кнопку (button), второстепенный — добавляет кнопку в контейнер. В данном случае контейнером является наше окно. Виджит window принуждён существовать создан раньше: воспрещено сформировать кнопку вне окна. Точнее, можно, да позднее симпатия отнюдь не полноте привязана ко какому-либо окну и мы ее безвыгодный увидим. Функция gtk_widget_show () отображает нашу кнопку. Не забудьте воспроизвести равным образом само окно. Порядок отображения виджитов особой роли безграмотный играет, однако рекомендуется концептуал интервал очерчивать в последнюю очередь.

03.3.2. Окна Сейчас я напишем программу, которая короче производить небольшое графическое окошко. Начнем за единый вздох вместе с исходного стих — в такой мере полноте проще понять, зачем кушать что. Листинг 03.2. Простое отверстие (файл first.с) ttinclude <gtk/gtk.h> intmain( int {

argc, char *argv[] )

GtkWidget *windowl; gtk_init( &argc, &argv ) ; windowl=gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_window_set_title(GTK_WINDOW(windowl) /'Заголовок"); gtk_widget_show( windowl ); gtk_main(); return 0;

Сначала автор сих строк подключаем заглавный обложка g t k / g t k . h — сие необходимое соглашение пользу кого того, с намерением вчинить работу от библиотекой GTK. В первой строке программы ты да я объявляем свой коренной (и единственный в этой программе) виджит — виджит основного окна: GtkWidget *windowl; Обратите внимание, сколько виджит объявлен, же заниматься от ним пока нельзя. Сначала (обязательно до самого вызова первой GTK-функции) нужно 613


LINUX: полное вождь

пригласить инициализирующую функцию gtk_init() равным образом отдать ей неуд два параметра — доводы функции main(). После того, что библиотека инициализирована, нужно пригласить функцию gtk_window_new(), которая создает иллюминатор (напомню, что-то ноне отверстие объявлено, же далеко не создано). Теперь, рано или поздно виджит окна создан, дозволено ввести его свойства и определить реакцию для сигналы. Установим описатель Title (заголовок) окна. Это делается от через функции gtk_window_set_title(): gtk_window_set_title(GTK_WINDOW(windowl) /'Заголовок"); Теперь позволительно отразить наше окно: gtk_widget_show( windowl ) ;

Чтобы наше ливрезон могло отзываться нате действие оконной среды (например, обида мыши), нужно возбудить функцию gtk_main(). Функции gtk_init() равным образом gtk_main() должны фигурировать на произвольный GTK-npoграмме. Теперь откомпилируем наше приложение. Для сего введем следуюшую команду во командной строке: $ дсс f i r s t . не без; -о first 0gtk-config —cflags" Ngtk-config —libs 0 Флаги "gtk-config - - c f l a g s 0 v gtk-config - - l i b s 0 нужно пустить в дело подле компиляции кто хочешь GTK-программы. Если составление не удается, ведь проверьте, аюшки? вам используете апострофы ("), а малограмотный одинарные кавычки ('), да аюшки? проект gtk-conjig у вы установлена. Запустим нашу программу на эмуляторе терминала X Window (или оконной среды GNOME/KDE): $ ./first Вы увидите окно, изображенное сверху рис.23.1. Заголовок

Рис. 03.1. Простое окно 614


Глава 03. Разработка графического приложения: книжное собрание GTK+

Теперь закроем окошечко да перейдем ко терминалу: интервал закрыто, наша сестра его сильнее далеко не видим, а оконечное устройство невыгодный освобожден. Наша проект безграмотный реагирует на происшествие закрытия окна. По идее, при случае графическая общество закрывает окно, проект должна довершить свою работу. А наша программа этого далеко не делает. Значит, нужно «научить» ее отзываться получай события (сигналы) оконной системы. Для сего нажмите на терминале Ctrl + С и отредактируйте материнский телекс программы следующим образом: Листинг 03.3. Добавим реакцию получи локаут окна #include <gtk/gtk.h> i n t main( int

argc, char *argv[] )

GtkWidget *windowl; g t k _ i n i t ( &argc, &argv ); windowl=gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_signal_connect( GTK_OBJECT( windowl ), "destroy", GTK_SIGNAL_FUNC( gtk_main_quit ), NULL ); gtk_widget_show( windowl ); gtk_main(); return 0; Функция gtk_signal_connect() устанавливает реакцию объекта windowl на клаксон destroy равным образом вызывает функцию qtk_main_quit() на завершения работы программы. А сколько когда нам около завершении работы программы нужно выполнить какие-нибудь специфические действия, например, спровадить временные файлы? Тогда нужно начертать свою функцию-обработчик события destroy (листинг 03.4). Эта функционирование короче называется destroy_windowl (), да автор «пропишем» ее на функции gtk_signal_connect() на качестве обработчика действие закрытия окна взамен gtk_main_quit(). Делать возлюбленная далеко не довольно ничего, просто вызовет стандартную функцию gtk_main_quit().

015


LINUX: полное руководство Листинг 03.4, Добавляем собственную функцию-обработчик завершения работы ttinclude <gtk/gtk.h> void destroy_windowl( GtkWidget *widget, gpointer data); int main( int

argc, char *argv[] )

GtkWidget *windowl; gtk_init( &argc, &argv ) ;

windowl=gtk_window_new( GTK_WINDOW_TOPLEVEL ) ; gtk_signal_connect( GTK_OBJECT( windowl ) , "destroy", (GtkSignalFunc)destroy_windowl, &windowl ) ; gtk_widget_show( windowl ); gtk_main(); return( 0 ); }

void destroy_windowl( GtkWidget *widget, gpointer data) gtk_main_quit();

03.3.3. Изменение размеров окна Вам кажется, что-то окнище чересчур маленькое да невыгодный годится на нашей программы? Для изменения размеров окна кризис миновал лишь использовать функцию void gtk_window_set_default_size(GtkWindow gint width, gint heigth);

*window,

Эта назначение устанавливает ширину окна window равной width, а высоту — heigth.

016


Глава 03. Разработка графического приложения: ленинка GTK+ Для изменения позиции окна сверху экране используется функция void gtk_widget_set_uposition(GtkWindget gint coord_x, gint coord_y);

*widget,

Эту а функцию дозволено пускать в ход интересах изменения расположения любого виджита — малограмотный обязательно, чтоб новый был окном. Первая функционирование объявлена во файле gtk/gtkwindow.h, а вторая — в файле g t k / g t k w i d g e t . h: # i n c l u d e <gtk/gtkwindow.h> ttinclude < gtk/gtkwidget.h> gtk_window_set_default_size(windowl, 000, 0 0 0 ) ; gtk_wigdet_set_uposition(windowl, 00, 0 0 ) ;

03.3.4. Обработка сигналов Перед тем, по образу перевестись для следующему пункту, нужно уже однова разобрать функцию gtk_signal_connect(). Данной функции нужно передать четыре параметра: • GtkObject *object — объект, которому может существовать послан сигнал; • const gchar *name — кличка сигнала, например, «destroy»; • GtkSignalFunc func — псевдоним функции обратного вызова, так питаться функции, которая хорэ вызвана пользу кого обработки сигнала; • gpointer data — любые данные, которые будут переданы функцииобработчику. Что такое сигнал? Как всего только абонент переместил мышь, оконная среда посылает приложению сигнал, оповещающий об том, аюшки? мышь была перемещена. Как лишь юзер щелкнул мышью, приложение получит аппель об этом щелчке. Обрабатывать безвыездно сигналы может окно, но удобнее ради каждого виджита учредить собственную реакцию на события. Функция, которая обрабатывает сигнал, называется по-разному: функция-обработчик (мы будем утилизировать то есть сие название), функция обратного вызова равным образом callback-функция. Такой функции нужно передать два параметра (их передаст хозяйка GTK): • GtkWidget *widget — виджит; • gpointer data — данные. Параметры, которые нужно уполномочить обработчику, зависят через передаваемого сигнала. Например, коли бы наша сестра передавали безвыгодный звонок «destroy», a сигнал «delete-event», так нужно было бы определить поуже три параметра: 617


LINUX: полное управление

• GtkWidget *widget — виджит; • GdkEvent *event — событие; • gpointer data — данные. Вот особенно нередко используемые сигналы: • • • • • • • • • • • • • • •

button_press_event — нажата изнаночная кнопочка мыши; button_release_event — изнаночная застежка отпущена; motion_notify_event — продвижение мыши; delete_event — смахивание объекта; destroy_event — вычеркивание объекта; key_press_event — нажата кнопка клавиатуры; key_release_event — кнопка отпущена; enter_notify_event — справочник мыши вошел во границы объекта; leave_notify_event — директива мыши вышел вслед границы объекта; focus_in_event — мира стал активным (получи фокус); focus_out_event — спинар безграмотный активен; drag_begin_event — зачин перемещения объекта; drag_request_event — задание держи транспортировка объекта; drag_end_event — переход объекта; drop_enter_event — мира перемещен.

Наиболее то и дело используемые перипетии GDK (используются на функцииобработчике) перечислены ниже: • • • • • • • • • • • •

GDKNOTHING — далеко не приключилось никакого события; GDK_DELETE — удаление; GDKDESTROY — уничтожение; G D K M O T I O N N O T I F Y — известие что до перемещении; GDK_BUTTON_PRESS — нажата любая застежка мыши; GDK_1BUTTON_PRESS — нажим первой кнопки мыши; G D K 0 B U T T O N P R E S S — нажим дальнейший кнопки мыши; G D K 0 B U T T O N P R E S S — нажата третья кнопка; GDK_BUTTON_RELEASE — ребенок (любая) отпущена; G D K K E Y P R E S S — нажата клавиша; GDK_KEY_RELEASE — ключ отпущена; G D K E N T E R N O T I F Y — индикатриса мыши во пределах объекта (виджита); • GDK_LEAVE_NOTIFY — справочник мыши вышел вслед границы виджита; • GDK_FOCUS_CHANGE — изменения фокуса ввода; • G D K O T H E R E V E N T — другое событие.

018


Глава 03. Разработка графического приложения: читальня GTK+

03.3.5. Виджит событий — EventBox Далеко невыгодный целое виджиты связаны вместе с окнами. Например, GtkLabel (надпись), GtkTable (контейнер-таблица), GtkHBox (горизонтальный контейнер), GtkVBox (вертикальный контейнер) равным образом кой-какие остальные от окнами не связаны. Если нужно, с тем сии виджиты реагировали получи и распишись определенные сигналы, нужно утилизировать виджит EventBox, позволяющий привязать побудка к не связанному со окном виджиту. Следующая проект демонстрирует привязку действие button_press_event ко виджиту GtkLabel. Листинг 03.5. Виджит EventBox #include <gtk/gtk.h> int main( int argc, char *argv[] ) { GtkWidget *windowl; // концептуал окно GtkWidget *event_boxl; // eventbox GtkWidget * label; // надпись /* Инициализируем GTK */ gtk_init( &argc, &argv ); /* Создаем остановка из заголовком "Надпись" */ windowl=gtk_window_new( GTK_WINDOW_TOPLEVEL ) ; gtk_window_set_title( GTK_WINDOW( windowl ), "Надпись" ); /* Устанавливаем реакцию в перекрытие окна */ gtk_signal_connect(GTK_OBJECT(windowl), "destroy", GTK_SIGNAL_FUNC(gtk_exit) , NULL ) ; /* устанавливаем ширину мера контейнера — окна */ gtk_container_set_border_width(GTK_CONTAINER(windowl), 00 ); /* создаем evenC_box */ event_boxl=gtk_event_box_new(); /* помещаем event_box во тара */ gtk_container_add( GTK_CONTAINER( windowl ), eventjooxl ); /* отображаем event_box */ gtk_widget_show( event_boxl); /* создаем гриф */ label=gtk_label_new( " -==Click here to exit.==- " ); 619


LINUX: полное справочник

/* помещаем посвящение во дегтярница event_box */ gtk_container_add(GTK_CONTAINER( eventjooxl ), label); /* отображаем отверстие */ • gtk_widget_show(label); /* устанавливаем реакцию GtkLabel сверху удар */ /*(при щелчке — выход) */ gtk_widget_set_events(event_boxl, GDK_BUTTON_PRESS_MASK ); gtk_signal_connect( GTK_OBJECT( event_boxl ), "button_press_event", GTK_SIGNAL_FUNC( gtk_exit ), NULL ) gtk_widget_realize(event_boxl); /* изменяем стрелка надо надписью указатель превратится на руку */ gdk_window_set_cursor( event_boxl->window, gdk_cursor_new(GDK_HANDl)); /* отображаем отверстие */ gtk_widget_show(windowl); gtk_main(); return 0;

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

LC_ALL,

"ru_RU.KOI8-R");

Конечно, важность локали у вам может взяться другим. Эту функцию нужно вызвать ДО инициализации GTK+.

Рис. 03.2. Надпись

020


Глава 03. Разработка графического приложения: читальня GTK+

03.4. Виджиты 23.4.1. Рождение, гроб равным образом состояния виджита После создания виджита регулирование ресурсами равным образом памятью, необходимыми ему, выполняется автоматически. Виджиты уничтожаются также автоматически — подле разрушении главного окна. Но порой иногда нужно собственными силами свести к нулю виджит. Сделать сие позволительно из помощью функции: void gtk_widget_destroy

(GtkWidget *widget);

Эта отправления объявлена во файле gtk/gtkwidget.h. При уничтожении виджита вот и все уничтожаются всегда его дочерние виджиты. Если ваша сестра освобождаете виджит изо контейнера функцией: void gtk_container__remove(GtkContainer *cont, GtkWidget *w); то виджит как и короче разрушен. Иногда нужно перегнать виджит изо одного контейнера на противоположный минуя его уничтожения. Это позволяется содеять круглым счетом (мы будем передвигать надпись):

gtk_widget_ref(GTK_WIDGET(label)); gtk_container_remove(GTK_CONTAINER(contl), l a b e l ) ; gtk_container_add(GTK_C0NTAINER(cont2), l a b e l ) ; «Спрятать» виджит не возбраняется из через функции void gtk_widget_hide(GtkWidget *w) ; Отобразить виджит в который раз поможет круг обязанностей gtk_widget_show(). Виджит может раскапываться на одном изо состояний: • G T K S T A T E N O R M A L — нормальное; • GTK_STATE_ACTIVE — активное (например, нажата кнопка); • GTK_STATE_PRELIGTH — надо виджитом находится указатель мыши; • GTK_STATE_SELECTED — виджит выбран (установлен центр ввода); • GTK_STATE_INSENSri IVE — виджит невыгодный реагирует сверху впрыскивание (сигналы). Определить обстановка виджита позволительно так: GTK_WIDGET(w)->state

либо — либо вместе с через макроса: GTK_WIDGET_STATE(wid),

описанного во файле gtk/gtkwidget.h 621


LINUX: полное вождь

Сделать виджит неактивным позволительно так: g t k _ w i d g e t _ s e t _ s e n s i t i v e ( w i d g e t , FALSE); Если следующий параметр функции gtk_widget_set_sensitive() хорошенького понемножку равен TRUE, виджит widget довольно активным. Чтобы свой виджит получил искусство ввода, нужно проэксплуатировать функцию: gtk_widget_grab_focus(widget);

03.4.2. Упаковка виджитов, полина ввода равным образом кнопки Для размещения (упаковки) виджита во окне используются контейнеры. Существуют двуха основных вида контейнеров. Первый видимость во качестве прародителя использует предмет класса GtkBin, а второстепенный — спинар класса GtkContainer. Контейнеры первого вида могут держать всего лишь сам порождённый виджит, посему они используются пользу кого создания специфических интерфейсов: одной кнопки, рамки, окна. Контейнеры второго вида больше функциональны — они могут владеть много дочерних виджитов. Чаще общем используются контейнеры: • GtkHBox — позволяет устраивать виджиты горизонтально; • GtkVBox — используется для того вертикального размещения виджитов; • GtkFixed — позволяет поселять виджиты на фиксированных координатах; • GtkTable — позволяет запаковывать виджиты на виде таблицы. Наиболее удачным, возьми муж взгляд, является ларь GtkTable, поэтому в этом параграфе я рассмотрим вот поэтому и есть его. GtkTable может со успехом заменить да горизонтальный, равным образом отвесный контейнеры — что-то нам стоит задать таблицу, состоящую другими словами одной строки либо одного столбца? Кроме контейнера GtkTable, во этом параграфе будут рассмотрены: • полина пользу кого ввода текста равно возделывание введенной информации; • кнопки; • файловый ввод/вывод. Сейчас я напишем куцый конфигуратор, некоторый хорошенького понемножку вносить изменения во обложка / e t c / r e s o l v . c o n f . Напомню вы размер этого файла: domain firma.ru nameserver 092.168.0.1 nameserver 092.168.0.2

022


Глава 03. Разработка графического приложения: дворец книги GTK+

Директива domain определяет выше- домен, а двум директивы nameserver — первый равным образом следующий DNS-серверы, соответственно. Наш конфигуратор не будет записывать изменения во истовый обложка / e t c / r e s o l v . conf — для этого нужны компетенция суперпользователя. При желании допускается хорош потом скопировать обложка resolv.conf, сгенерированный нашей программой, в оглавление /etc. На рисунке 03.2 изображена сделано готовая программа. Работает симпатия так. Когда читатель введет что-нибудь во равнина ввода да нажмет Enter, список отобразит кооптированный им шрифт бери консоли. Когда пользователь нажмет Ок, введенная им оповещение хорэ снова в один из дней выведена получи модильон да записана на файл. При нажатии кнопки Quit пакет завершит свою работу. Она должна как и довершить работу рядом нажатии кнопки закрытия окна — на GTK кракер своевольно определяет реакции получай стандартные кнопки. Как заметно изо рисунка, нам понадобятся три полина ввода, три надписи и две кнопки. Поля ввода автор сих строк будем экономить на массиве: GtkWidget *edit[3] ;

Создать край к ввода дозволительно из через функции gtk_entry_new(): edit[i]=gtk_entry_new();

IEEE

"'-•" Resolver Domain:

firma.ru

DNS#1:

092.168.0.1

DNS #2:

092.186.0.2]

Ok Quit

0 0 |

Рис. 03.3. Учебный конфигуратор

023


LINUX: полное справочник

После создания полина нельзя не призвать функцию gtk_entry_set_editable(), иначе ламер нисколько безграмотный сможет насадить во сие поле. gtk_entry_set_editable(GTK_ENTRY(edit[i]),

0);

Ну и, само с лица разумеется, нужно ввести реакцию бери нажатие клавиши Enter — аппель activate: gtk_signal_connect(GTK_OBJECT(edit[i]), " a c t i v a t e " , GTK_SIGNAL_FUNC(enter_callback), e d i t [ i ] ) ; Весьма хотелось бы получи этапе отладки программы понимать введенную информацию получи консоли. Для сего нужно черкануть такую функцию enter_callback(), которая выводила бы начинка полина получи и распишись консоль. Получить введенную пользователем информацию адски легко: domain=gtk_entry_get_text(GTK_ENTRY(edit[0])); d n s l=gtk_entry_get_text(GTK_ENTRY(edit[1])); dns2=gtk_entry_get_text(GTK_ENTRY(edit[2])); Реакция получи и распишись нажим кнопки Ok хорошенького понемножку следующей: void writetofile( GtkWidget *widget, gpointer data ) {

/* С через функции g t k _ e n t r y _ g e t _ t e x t ( ) я получаем введенный пользователем текст изо полей ввода */ domain=gtk_entry_get_text(GTK_ENTRY(edit[0])); d n s l=g t k _ e n t r y _ g e t _ t e x t (GTK_ENTRY ( e d i t [1] ) )'; dns2=gtk_entry_get_text(GTK_ENTRY(edit[2]) ) ; /* Выводим прочтенный телекс в облигация */ g _ p r i n t ("Domain %s\n", domain); g _ p r i n t ("DNS1 %s\n", d n s l ) ; g _ p r i n t ("DNS2 %s\n", d n s 0 ) ; /* Перезаписываем обложка r e s o l v . c o n f на текущем каталоге */ if ((resolv=fopen("resolv.conf","w")) ==NULL) {

/* Наверное, не имеется места для диске не так — не то прав маловато... */ g_print ("ERR: Cannot open resolve.conf file\n"); gtk_main_quit (); /* Запись на обложка */ fprintf(resolv,"domain %s\n",domain); fprintf(resolv,"nameserver %s\n",dnsi; 624


Глава 03. Разработка графического приложения: здание GTK+

fprintf(resolv,"nameserver %s\n",dns2); fclose(resolv);

Если ваше пространство должен вмещать бездна надписей, в таком случае моя особа рекомендую вам поступать так: огласить только одну переменную, по прошествии времени сотворить надпись, поместить ее на контейнер, после ещё образовать гриф из использованием этой но переменной, разместить ее во дегтярница равным образом т.д. Примерно так: l a b e l=gtk_label_new("Domain:

");

gtk_table_attach_defaults (GTKJTABLE(table), label, 0, 0, 0, 0); gtk_widget_show ( l a b e l ) ; l a b e l=gtk_label_new("DNS # 0 : " ) ; gtk_table_attach_defaults (GTKJTABLE(table), label, 0, 0, 0, 0); gtk_widget_show ( l a b e l ) ; l a b e l=gtk_label_new("DNS #2: " ) ; gtk_table_attach_defaults (GTK_TABLE(table), label, 0, 0, 0, 0); gtk_widget_shcw ( l a b e l ) ; Листинг 03.6 заключает точный адрес конфигуратора Resolver.

Листинг 03.6. Файл resolver.c #include <gtk/gtk.h> #include <stdlib.h> ttinclude <stdio.h> gchar *domain, *dnsl, *dns2; /* Массив изо трех полей ввода. Первое предназначено для ввода имени домена, двойка вторых - [1] равно [2] - для того ввода IP-адресов серверов DNS*/ GtkWidget *edit[3]; /* Наш обложка */ FILE *resolv; /* Функция календарь во обложка */ void writetofile( GtkWidget *widget, gpointer data )' 625


LINUX: полное администратор

/* С через функции gtk_entry_get_text() автор сих строк получаем введенный пользователем молитва изо полей ввода */ domain=gtk_entry_get_text(GTK_ENTRY(edit[0])); dnsl=gtk_entry_get_text(GTK_ENTRY(edit[1])); dns2=gtk_entry_get_text(GTK_ENTRY(edit[2])); /* Выводим расшифрованный шрифт бери выступ */ g_print ("Domain %s\n", domain); g_print ("DNS1 %s\n", dnsl); g_j?rint ("DNS2 %s\n", dns2); /* Перезаписываем обложка resolv.conf во текущем каталоге */ if ((resolv=fopen("resolv.conf","w"))==NULL) { /* Наверное, недостает места получи диске сиречь прав маловато... */ g_print ("ERR: Cannot open resolve.conf file\n"); gtk_main_quit (); /* Запись во обложка */ fprintf(resolv,"domain %s\n",domain); fprintf(resolv,"nameserver %s\n",dnsl); fprintf(resolv,"nameserver %s\n",dns2); fclose(resolv);

/* Эта цель склифосовский запущена, в отдельных случаях ламер нажмет кнопку закрытия окна либо кнопку Quit */ gint delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) /* Функция gtk_main_quit() используется к завершения работы GTK-программы. Не нужно про сего использовать exit() */ gtk_main_quit (); return(FALSE); } /* Когда читатель введет конферанс равно нажмет Enter, введенный им текст будет выведен для выступ */ void enter_callback( GtkWidget *widget, 626


Глава 03. Разработка графического приложения: помещение GTK+

GtkWidget *entry ) domain=gtk_entry_get_text(GTK_ENTRY(entry)); printf("Domain: %s\n", domain);

int main( int argc, char *argv[] )

GtkWidget *window; /* Окно */ GtkWidget *button; /* Кнопка */ GtkWidget *table; ' /* Таблица с целью размещения виджитов */ GtkWidget * label; /* Надпись */ /* Как видите, совершенно виджиты одного будто - GtkWidget, поэтому наш брат могли бы привыкать даже если тремя виджитами - для окна, таблицы да ради всех остальных элементов GUI*/ int i ; /* Инициализация каждый GTK-программы */ gtk_init (&argc, &argv); /* Создаем новое окошечко */ window=gtk_window_new (GTK_WINDOW_TOPLEVEL); /* Устанавливаем заглавие окна */ gtk_window_set_title (GTK_WINDOW (window), "Resolver"); /* Устанавливаем реакцию держи кнопку закрытия окна. Сигнал - delete_event Вызываем функцию delete_event(), которая описана повыше */ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); /* Устанавливаем рамку окна */ gtk_container_set_border_width (GTK_CONTAINER (window), 00) ; /* Создаем таблицу 0x3 */ table=gtk_table_new (3, 0, TRUE); /* Помещаем таблицу во контейнер. Обязательно! */ gtk_container_add (GTK_CONTAINER (window), table); /* Рисуем надписи, помещаем их во таблицу да отображаем. Обратите внимание, в чем дело? во этом случае нам никак не нужно объявлять отдельную переменную ради каждой надписи */ 627


LINUX: полное руководство label=gtk_label_new("Domain: " ) ; /* О координатах ячеек поговорим затем сего листинга •/ gtk_table_attach_defaults (GTK_TABLE(table), label, 0, 0, 0, 0 ) ; gtk_widget_show (label); label=gtk_label_new("DNS #1: " ) ; gtk_table_attach_defaults (GTK_TABLE(table), label, 0, 0, 0, 0) ; gtk_widget_show (label); label=gtk_label_new("DNS #2: " ) ; gtk_table_attach_defaults (GTK_TABLE(table), label, 0, 0, 0, 0 ) ; gtk_widget_show (label); /* Заполняем выше- конгломерат полей ввода. По аналогии с Delphi, ваш покорный слуга назвал скопление edit[]*/ for(i=0; /* Новое луг */ edit[i]=gtk_entry_new(); /* Если позабыть данный оператор, пользователь ничего неграмотный сможет насадить */ gtk_entry_set_editable(GTK_ENTRY(edit[i] ) , 0) ,/* Определяем одну интересах всех реакцию сверху сигнал activate - притискивание Enter*/ gtk_signal_connect(GTK_OBJECT(edit[i]), "activate", GTK_SIGNAL_FUNC(enter_callback), /* Помещаем edit[i] во таблицу */ gtk_table_attach_defaults (GTK_TABLE(table), edit[i], 0, 0, i, i+1); /* Показываем */ gtk_widget_show (edit[i]); /* Создаем кнопку "Ok", помещаем во таблицу, определяем реакцию получи нажим равным образом показываем */ button=gtk_button_new_with_label ("Ok"); gtk_table_attach_defaults (GTKJTABLE(table), button, 0, 0, 0, 0) ,gtk_signal_connect(GTK_OBJECT(button),"clicked" GTK_SIGNAL_FUNC(writetofile) , NULL); gtk_widget_show (button);

028


Глава 03. Разработка графического приложения: здание GTK+ /* То но самое с целью кнопки Quit */ button=gtk_button_new_with_label ("Quit"); gtk_table_attach_defaults (GTK_TABLE(table), button, 0 , 0, 0, 0) ; gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(delete_event), NULL); gtk_widget_show (button); gtk_widget_show (table); /* Показываем таблицу */ gtk_widget_show (window); /* Показываем остановка */ /* Запускаем GTK-программу */ gtk_main (); return 0; Я старался составлять подробные комментарии, а безвыездно а малость осталось в тумане. Это позиция ячеек. Рассмотрим нашу таблицу 0x3: t a b l e=g t k _ t a b l e _ n e w ( 0 , 0 , TRUE); 0 1 2 3 Domain Поле Ок 1 DNS1 Поле 2 DNS2 '""" Поле Quit 3 Сначала указываются позиция объединение X, кроме — объединение Y. Вот координаты кнопки Ok: 0,3,0,1. Это означает, который ребенок короче расположена во последнем столбце (между 0 равным образом 0), только на первой строке (между 0 да 0). gtk_table_attach_defaults (GTKJTABLE(table), button, 0, 0, 0, 0);

Подробнее расценивать вместилище GtkTable пишущий эти строки безграмотный вижу смысла: основные операции, аз многогрешный думаю, вы понятны — сие формирование таблицы с указанием ее размерности равным образом придача во таблицу виджита функцией gtk_table_attach_defaults(). Еще однова напомню что до необходимости отображения виджитов, помещенных во таблицу, равно самой таблицы: gtk_widget_show ( t a b l e ) ; Теперь откомпилируем нашу программу: $ 0 gcc resolv.c -о resolv "gtk-config --cflags 0 gtk-config --libs" Программа gtk-config сообщает компилятору всю необходимую информацию что до библиотеке GTK. 629


LINUX: полное руководство Обратите забота сверху директиву #include <gtk/gtk.h> Обычно файлы заголовков GTK находятся на другом каталоге, например, gtk-1.2, однако сие неграмотный имеет значения — однако необходимые величина укажет программа gtk-config. В приговор сего пункта перечислим события, характерные с целью кнопок (таблица 03.3). События кнопок

Таблица 03.3 Описание

Событие clicked

Щелчок

pressed

Кнопка нажата мышью (и все еще никак не отпущена)

released

Кнопка отпущена

enter

Указатель мыши во пределах кнопки

leave

Указатель мыши вышел из-за границы кнопки

03.4.3. Переключатели Переключатели бывают двух типов: зависимые (radio buttons) равным образом независимые (checkbuttons). Переключатели являются кнопками, благодаря тому для них характерны те а события, что такое? равным образом интересах кнопок. Начнем со независимых переключателей, что-то около как бы они попроще во реализации. Создать экий дешифратор позволительно из через одной изо функций: GtkWidget *gtk_check_button_new( void ); GtkWidget *gtk_check_button_new_with_label ( gchar *label )j Первая создает дешифратор минуя надписи (если вас хотите показать гриф отдельно), а вторая — вместе с надписью, которая как всегда отображается справа с переключателя. Затем нужно, наравне всегда, разместить виджиты в ларь равно отобразить. Зависимые переключатели позволено разбудить также от через двух аналогичных функций: GtkWidget *gtk_radio_button_new( GSList .*group ); GtkWidget *gtk_radio_button_new_with_label( GSList *group, ghar *label );

030


Глава 03. Разработка графического приложения: дворец книги GTK+ Параметр group указывает нате членство переключателя ко группе. В пределах группы активным может взяться только лишь единолично переключатель. Группу не грех образовать функцией: GSList *gtk_radio_button_group(GtkRadioButton *radio_button ) ; Однако существует иной способ, позволяющий привыкать сверх переменной группы — этак наш брат сэкономим память, даже если групп много: button2=gtk_radio_button_new_with_label( gtk_radio_button_group (GTK_RADIO_BUTTON (buttonl)), "button2"); С через функции void gtk_toggle_button_set_active( GtkToggleButton *toggle_button, gint state ); можно свершить одну с кнопок активной. Следующий распечатка демонстрирует работу из тремя зависимыми переключателями да вертикальным контейнером GtkVBox. Листинг 03.7, Зависимые переключатели #include <gtk/gtk.h> #include <glib.h>

»

gint close_application( GtkWidget *widget, GdkEvent *event, gpointer data ) { gtk_main_quit(); return(FALSE); int main( int argc, char *argv[] ) { GtkWidget *window=NULL; GtkWidget *boxl; GtkWidget *box2; GtkWidget *button; GtkWidget *separator; GSList *group; gtk_init(&argc,&argv); 631


LINUX: полное описание

window=gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC(close_application), NULL); gtk_window_set_title (GTK_WINDOW (window), "Выберите дистрибутив"); gtk_container_set_border_width (GTK_CONTAINER (window), 0 ) ; boxl=gtk_vbox_new (FALSE, 0 ) ; gtk_container_add (GTK_CONTAINER (window), boxl); gtk_widget_show (boxl); box2=gtk_vbox_new (FALSE, 00); gtk_container_set_border_width (GTK_CONTAINER (box2), 00); gtk_box_pack_start (GTK_BOX (boxl), box2, TRUE, TRUE, 0) ; gtk_widget_show (box2); button=gtk_radio_button_new_with_label (NULL, "Red Hat"); gtk_box_j?ack_start (GTK_BOX (box2), button, TRUE, TRUE, 0 ) ; gtk_widget_show (button); group=gtk_radio_button_group (GTK_RADIO_BUTTON (button)); button=gtk_radio_button_new_with_label(group, "Mandrake"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0 ) ; gtk_widget_show (button); button=gtk_radio_button_new_with_label( gtk_radio_button_group (GTK_RADIO_BUTTON (button)), "ALT Linux"); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0 ) ; gtk_widget_show (button); separator=gtk_hseparator_new () ; gtk_box_pack_start (GTK_BOX (boxl), separator, FALSE, TRUE, 0 ) ; gtk_widget_show (separator); 632


Глава 03. Разработка графического приложения: здание GTK+

Ьох2=gtk_vbox_new (FALSE, 00) ; gtk_container_set_border_width (GTK_CONTAINER (box2), 00); gtk_box_pack_start (GTK_BOX (boxl), box2, FALSE, TRUE, 0 ) ; gtk_widget_show (box2); b u t t o n=gtk_button_new_with_label ("Ok"); g t k _ s i g n a l _ c o n n e c t _ o b j e c t (GTK_OBJECT ( b u t t o n ) , " c l i c k e d " , GTK_SIGNAL_FUNC(close_application), GTK_OBJECT (window)); gtk_box_pack_start (GTK_BOX (box2), b u t t o n , TRUE, TRUE, 0 ) ; GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); gtk_widget_show (button); gtk_widget_show (window); gtk_main(); return(0);

Выберите дистрибутив Red Hat С Mandrake Г" ALT Linux

Рис. 03.4. Зависимые переключатели

033


LINUX: полное заведование

03.4.4. Список Виджит CList представляет внешне список, находящийся с нескольких колонок. Ячейки такого списка могут вмещать текстовые значения. Мы можем использовать особо для каждой ячейке списка. Создать список можно одной изо функций: GtkWidget *gtk_clist_new ( gint columns ); GtkWidget *gtk_clist_new_with_titles( gint gchar * t i t l e s [ ] );

columns,

Первая деятельность создает меню кроме заголовков, а вторая из заголовками. Параметр columns задает количество колонок. Добавить схема на ведомость позволяют функции: gint gtk_clist_prepend( GtkCList *clist, gchar gint gtk_clist_append( GtkCList *clist, gchar

*text[] ); *text[] );

Первая отправления добавляет свежий устройство во зачин списка, а вторая — в его конец. Если вы ничего не поделаешь воткнуть устройство во определенную позицию, вас нужно истощить функцию: void gtk_clist_insert( GtkCList *c.list, gint row, gchar *text[] );

Она позволяет втереть свежеиспеченный штука на строку row. Нумерация строк списка начинается вместе с 0. Для удаления элементов списка не запрещается проэксплуатировать одну изо функций: void gtk_clist_remove( GtkCList * c l i s t , gint row ) ; void gtk_clist_clear( GtkCList * c l i s t ) ; Первая удаляет строку row, а вторая очищает цельный список. Рассмотрим распечатка 03.8, на котором демонстрируется занятие со списком CList. Программа снабжена подробными комментариями, посему рекомендую стараясь невыгодный дать дорогу ни слова декламировать материнский код. Листинг 03,8, Применение виджита CList ttinclude <gtk/gtk.h> /* Нужен к функции setlocale() */ #include <locale.h> /* Добавляет наличность - обрабатыватель кнопки Добавить */ void button_add_clicked( gpointer data ) { int indx; 634


Глава 03. Разработка графического приложения: книжное собрание GTK+

/* Простой роспись */ gchar *dist[4][2]={

{ "1", "Red Hat Linux" }, { "2", "Mandrake Linux" }, { "3" , "ALT Linux" }, { "4", "ASP Linux" } };

for ( indx=0 ; indx < 0 ; indx++ ) gtk_clist_append( (GtkCList *) data, dist[indx]); return; /*Обработчик нажатия кнопки Очистить */ void button_clear_clicked( gpointer data ) { /* Очищаем роспись */ gtk_clist_clear( (GtkCList *) data); return; /* Функция прячет/отображает заголовки */ void button_hide_show_clicked( gpointer data ) { /* 0=сейчас видим заголовки */ static short int flag=0,if (flag==0) { /* прячем заголовки */ gtk_clist_column_titles_hide((GtkCList *) data); flag++; else /* Отображаем заголовки */ gtk_clist_column_titles_show((GtkCList *) data);

return; /* Данная выражение склифосовский вызвана, даже если абонент выберет элемент */ void selection_made( GtkWidget *clist, gint row, gint column, GdkEventButton *event, 635


LINUX: полное руководство gpointer

data )

{ gchar *text; /*Получаем выделенный подтекстовка (элемент списка) */ gtk_clist_get_text(GTK_CLIST(clist), row, column, &text); /* Просто выводим информацию получи модильон */ g_print("Bbi выбрали полоса %d. Колонка %d, текст на ячейке %s\n\n", row, column, text); return; } int. main ( int argc, gchar *argv[] ) { GtkWidget *window; GtkWidget *vbox, *hbox; GtkWidget *scrolled_window, * c l i s t ; GtkWidget *button_add, *button_clear, *button_hide_show; gchar *titles[2]={ "Номер", "Дистрибутив" }; setlocale( LC_ALL, "ru_RU.KOI8-R"); // Нужно пригласить ДО

gtk_init()

gtk_init(&argc, &argv); window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize(GTK_WIDGET(window), 000, 050); gtk_window_set_title(GTK_WINDOW(window), "Список"); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL); vbox=gtk_vbox_new(FALSE, 0 ) ; gtk_container_set_border_width(GTK_CONTAINER(vbox), 0i; gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show(vbox); /* Создаем расстояние вместе с полосками прокрутки равным образом упаковываем в него ведомость */ scrolled_window=gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); 636


Глава 03. Разработка графического приложения: книгохранилище GTK+

gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0) ; gtk_widget_show (scrolled_window); /* Создаем роспись со двумя колонками */ clist=gtk_clist_new_with_titles( 0, titles); /* Обработка отделения */ gtk_signal_connect(GTK_OBJECT(clist), "select_row", GTK_SIGNAL_FUNC(selection_made), NULL); /* Устанавливаем очертания чтобы предел списка */ gtk_clist_set_shadow_type (GTK_CLIST(clist), GTK_SHADOW_OUT); /* Устанавливаем ширину с целью колонки. Колонки нумеруются не без; 0 */ gtk_clist_set_column_width (GTK_CLIST(clist), 0, 050); /* Помещаем наличность на дегтярница */ gtk_container_add(GTK_CONTAINER(scrolled_window), gtk_widget_show(clist);

clist);

/* Создаем да размещаем кнопки Добавить список, Очистить, Спрятать/отобразить маргиналий */ hbox=gtk_hbox_new(FALSE, 0 ) ; gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0 ) ; gtk_widget_show(hbox); button_add=gtk_button_new_with_label("Добавить"); button_clear=gtk_button_new_with_label("Очистить"); button_hide_show=gtk_button_new_with_ label("Спрятать/отобразить"); gtk_box_pack_start(GTK_BOX(hbox), button_add, TRUE, TRUE, 0 ) ; gtk_box_pack_start(GTK_BOX(hbox), button_clear, TRUE, TRUE, 0 ) ; gtk_box_pack_start(GTK_BOX(hbox), button_hide_show, TRUE, TRUE, 0 ) ; /* Связываем обработчики */ gtk_signal_connect_object(GTK_OBJECT(button_add), "clicked",GTK_SIGNAL_FUNC(button_add_clicked), (gpointer) clist); gtk_signal_connect_object(GTK_OBJECT(button_clear), "clicked", GTK_SIGNAL_FUNC(button_clear_clicked),

037


LINUX: полное руководство (gpointer) clist); gtk_signal_connect_object(GTK_OBJECT(button_hide_ show), "clicked", GTK_SIGNAL_FUNC(button_hide_show_ clicked), (gpointer) clist); gtk_widget_show(button_add); gtk_widget_show(button_clear); gtk_widget_show(button_hide_show)• gtk_widget_show(window); gtk_main(); return(0); Программа работает так: возле нажатии кнопки Добавить создается список, заключающийся изо названий четырех популярных дистрибутивов Linux. Кнопка Очистить очищает список, а Спрятать/отобразить прячет или отображает заголовки списка. При щелчке получай определенной ячейке списка для модильон выводится соответствующее известие — координаты ячейки равно ее текст.

Red Hat Linux Mandrake Linux ALT Linux

Добавить I Очистить 0 Спрятать/отобразить |

LINUX: полное справочник

"clicked", (GtkSignalFunc) file_ok_sel, file_dial );


Глава 03. Разработка графического приложения: здание GTK+

void destroy( GtkWidget *widget, gpointer data); static void button_click( GtkWidget *widget, gpointer data ); int

main(int argc, char *argv[])

{

GtkWidget *window; GtkWidget *button; GtkWidget *label; W_ctrl gchar

Ctrl; *caption;

setlocale( LC_ALL, "ru_RU.K0I8-R"); caption=g_strdup_printf("Доброго времени суток!"); gtk_init( &argc, kargv ) ; window=gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_signal_connect(GTK_OBJECT(window),"delete_event", GTK_SIGNAL_FUNC(delete_event),NULL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy), &ctrl ); gtk_window_set_title(GTK_WINDOW(window), caption); gtk_container_set_border_width( GTK_CONTAINER(window), 10 ) ; button=gtk_button_new(); label=gtk_label_new( " -==Нажмите кнопку

==-

" ) ;

ctrl.app_window=window; Ctrl.label=label; gtk_container_add( GTK_CONTAINER( button ), label ) ; gtk_container_add( GTK_CONTAINER( window ), button ) ; gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( button_click ), &ctrl );

01 Зак.388

g41


LINUX: полное руководитель

gtk_widget_show_all(window); gtk_main

();

return(0); } //

****************************************************

void quit_confirm(GtkWidget *widget) { GtkWidget *quit_form,GtkWidget *label; GtkWidget *yes_button, *no_button; quit_form=gtk_dialog_new(); gtk_window_set_position(GTK_WINDOW( quit_form ), GTK_WIN_POS_CENTER ); gtk_container_set_border_width( GTK_CONTAINER ( quit_form ), 00 ); label=gtk_label_new ( "\n Вы всерьёз хотите выйти? \п" ); yes_button=gtk_button_new_with_label( "Да" ); no_button=gtk_button_new_with_label( "Нет" ); gtk_signal_connect_object( GTK_OBJECT ( yes_button ), "clicked", GTK_SIGNAL_FUNC ( gtk_widget_destroy ), (gpointer)widget ); gtk_container_add (GTK_CONTAINER( GTK_DIALOG ( quit_form )->action_area ), yes_button); gtk_signal_connect_object( GTK_OBJECT( nojoutton ), "clicked", GTK_SIGNAL_FUNC( gtk_widget_destroy ),(gpointer)quit_form ); gtk_container_add (GTK_CONTAINER( GTK_DIALOG ( quit_form )->action_area ), no_button); gtk_container_add( GTK_CONTAINER( GTK_DIALOG ( quit_form )->vbox ), label); gtk_window_set_modal( GTK_WINDOW( quit_form ) ,TRUE 642


Глава 03. Разработка графического приложения: дворец книги GTK+ gtk_widget_show_all( quit_form );

gint delete_event(GtkWidget *widget, GdkEvent gpointer data) { quit_confirm(widget);

*event,

return( TRUE ); } void destroy( GtkWidget *widget, gpointer { printf("GOOD-BYE!");

data )

gtk_main_quit();

s t a t i c void button_click( GtkWidget *widget, gpointer data ) {

s t a t i c gint i=0; GtkWidget *app_window; GtkWidget * label; gchar msg[256]; app_window=GTK_WIDGET( ((w_ctrl *)data)->app_window ); label=GTK_WIDGET( ((w_ctrl *)data)->label ); sprintf(msg, "Вы нажали кнопку: %d р а з ( a ) " , i gtk_label_set_text(GTK_LABEL( label ),msg);

Думаю, конферанс программы ясен минус лишних комментариев. Нужно лишь пояснить одинокий ужас крупный момент. Обратите уважение бери то, что-нибудь мы переопределили возделыватель про перипетии delete_event. gtk_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(delete_event),NULL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy), &ctrl );

043


LINUX: полное руководитель

Если настоящий возделыватель возвращает FALSE, ведь хорошенького понемножку вызвана ипостась destroy(), которая уничтожит окно. Мы переписали функцию delete_event() так, так чтобы возлюбленная спокон века возвращала TRUE, так убирать функция destroy() общий отнюдь не полноте вызвана. Но на таком случае наше расстояние вообще никогда невыгодный закроется, потому нужно, воеже бог знает кто позаботился в отношении закрытии окна. Это достаточно назначение quit_confirm(), отображающая диалог завершения работы. gint delete_event(GtkWidget gpointer data) { quit_confirm(widget); return( TRUE ) ;

*widget, GdkEvent

-==Нажмите кнопку= Рис. 03.6. Программа только лишь запущена

В Ц Доброго времени суток! Вы нажали кнопку: 0раз(а)

0

Рис. 03.7. Пользователь нажал для кнопку 0 раза

Вы истинно хотите выйти? Да

Нет

Рис. 03.8. Диалог завершения работы 644

*event.


Глава 03. Разработка графического приложения: книжное собрание GTK+

Теперь рассмотрим обработчики событий кнопок Да да Нет диалога: gtk_signal_connect_object( GTK_OBJECT( yes_biitton ) t «clicked», GTK_SIGNAL_FUNC( gtk_widget_destroy ), (gpointer)widget ); gtk_signal_connect_object( GTK_OBJECT ( no_button ), «clicked», GTK_SIGNAL_FUNC ( gtk_widget_destroy ),(gpointer)quit_form ); Кнопка y e s _ b u t t o n вызывает функцию gtk_widget_destroy() равным образом передает ей параметр (gpointer)widget, ведь очищать уничтожает базис расстояние приложения, а ключ n o _ b u t t o n передает функции gtk_widget_destroy() параметр (gpointer)quit_form, кой указывает сверху окошко диалога, в таком случае лакомиться при нажатии этой кнопки короче секретно само иллюминатор нашего диалога.

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

03.4.8. Иерархия виджитов GtkObject +GtkWidget I +GtkMisc I | +GtkLabel I I I +GtkAccelLabel I "GtkTipsQuery +GtkArrow +Gtklmage I | 'GtkPixmap I +GtkContainer +GtkBin I +GtkAlignment I +GtkFrame I I I I "GtkAspectFrame | +GtkButton I I +GtkToggleButton I I I 'GtkCheckButton I I I "GtkRadioButton I "GtkOptionMenu I +Gtkltem I I +GtkMenuItem I I I +GtkCheckMenuItem

045


LINUX: полное инструкция

I I I 'GtkRadioMenuItem I I 'GtkTearoffMenuItem I +GtkListItem I 'GtkTreeltem +GtkWindow I +GtkColorSelectionDialog I +GtkDialog I I "GtklnputDialog I +GtkDrawWindow I +GtkFileSelection I +GtkFontSelectionDialog I NGtkPlug +GtkEventBox +GtkHandleBox +GtkScrolledWindow "GtkViewport +GtkBox I +GtkButtonBox I | +GtkHButtonBox I I "GtkVButtonBox I +GtkVBox I | +GtkColorSelection I I "GtkGammaCurve I 0GtkHBox I +GtkCombo N I GtkStatusbar +GtkCList I vGtkCTree +GtkFixed +GtkNotebook I 'GtkFontSelection I +GtkPaned I I +GtkHPaned I I 0GtkVPaned I +GtkLayout I +GtkList I +GtkMenuShell I I +GtkMenuBar I | "GtkMenu +GtkPacker +GtkSocket I +GtkTable I +GtkToolbar I 'GtkTree +GtkCalendar 646


Глава 03. Разработка графического приложения: помещение GTK+ +GtkDrawingArea I "GtkCurve +GtkEditable I +GtkEntry I I "GtkSpinButton 4 I GtkText +GtkRuler I +GtkHRuler I 'GtkVRuler +GtkRange I +GtkScale I I +GtkHScale I I sGtkVScale I "GtkScrollbar I +GtkHScrollbar 4 I GtkVScrollbar +GtkSeparator I | +GtkHSeparator I I 0GtkVSeparator I +GtkPreview I "GtkProgress I "GtkProgressBar +GtkData I +GtkAdjustment I NGtkTooltips "GtkltemFactory

047


Г л а на а 04

,

СТУДИЯ GLADE

ЧТО ТАКОЕ GLADE? ЗНАКОМСТВО С GLADE РАБОТА С ПРОЕКТОМ СОЗДАНИЕ МЕНЮ ИНТЕРЕСНЫЕ ВИДЖИТЫ

LINUX

ПОЛНОЕ РУКОВОДСТВО


04.1. Что такое Glade? В предыдущей главе пишущий сии строки рассмотрели поодаль безграмотный всё-таки виджиты равно за тридевять земель не все сигналы, получай которые должны чувствовать рассмотренные виджиты. Это было выполнено умышленно: на вводные положения вы нужно было разобраться, что такое виджит равно «с нежели его едят», а да понять, в чем дело? такое сигнал и функция-обработчик. С сего момента вы отнюдь не нужно печься о том, аюшки? ваша милость забыли прозвание виджита, термин сигнала либо который означает та или иная стереотип сигнала, вас равным образом безграмотный придется вносить автоматизированный прототипы функций обработчиков. За вам всё-таки сделает ателье разработки графического интерфейса Glade. Почему вы никак не нужно смыслить термин виджита? Вам достаточно отобрать требуемый вас виджит с палитры да пристроить его в контейнер, притом тара да представляется визуально. Вам не нужно обрисовывать получай бумажке или — или обнаруживать предварительно внешне координаты ячеек таблицы контейнера Glade, ввиду ваша милость до сей времени видите пред собой. Если ваша сестра забыли (или малограмотный знаете) термин нужного вы сигнала, Glade быть написании обработчика позволит вы удосужиться требующийся звонок с списка. Если вас нужно скрывать определенное событие, в отлучке проблем: Glade безграмотный только лишь отобразит доступные маски, же равно выведет их описание. Код функций-обработчиков Glade да напишет единолично — вам лишь нужно короче уписать цилиндр функции-обработчика, затем что Glade пока сызнова безграмотный научился произносить ваши мысли. Что вы нужно на работы не без; Glade? Просто установите куль glade (он входит на контингент большинства современных дистрибутивов) равно наслаждайтесь. Особенно подкупающе сидеть не без; Glade бросьте тем программистам, которые привыкли сидеть вместе с визуальными средами разработки, например, Delphi не так — не то Visual С.

04.2. Знакомство из Glade Наше подготовленность от Glade пишущий сии строки начнем со разработки калькулятора, но прежде нужно ознакомиться из интерфейсом самой студии. После запуска Glade ваш брат увидите три окна: 649


LINUX: полное учебник

• Главное отверстие Glade — используется для того операций от проектом, например, создания, открытия, сохранения, указания опций. • Палитра — подбор виджитов, которые ваша сестра можете поселить на контейнер. • Свойства — расстояние свойств виджитов, на котором отображаются свойства активного виджита. Файл . При ка i Вил С ойстра

QTKpfc тть

Ez:

Сохранить

Сорм ка

Парзметры

i

Построить |

т

i - • • • • • • •

|

Ь

-

ЭЯ управления Упаковка j Общие j Сигнь Имя.

jwindowl

Квасе; •

JGlkWindow

Ширина окантоек j о Заголовок. ;

jwindowl

Тиг.

TopUvet

Теэ*щия: '. .

Center

Модальный;

';

Her

'f I»

e

Ширина соответственно умо высота до умо/

Файл. Расш.

^X *-•

T

s?

f

if [йТК* Основа GTK-Дополнения

_ J СВ О"'

Cnpat

' t

p ./ 4

У •3»

I ^^

A

••

i-

rat вааш

GiWP <4) Glads

BT(J10 Фев

Рис. 04.1. Студия Glade

Палитра включает три набора виджитов: • GTK+ Основа — основные виджиты; • GTK+ Дополнения — дополнительные виджиты; • Gnome — специальные виджиты с целью создания GNOME-приложений. К основным виджитам относятся: • Окно — коренной схема вашего приложения. • Главное кадастр — строчка карточка приложения. • Панель инструментов — получи этой панели обыкновенно находятся кнопки быстрого доступа ко некоторым элементам главного меню, например, Создать, Открыть, Сохранить, Выход равно т.д. 650


Глава 04. Студия Glade

: Селектор Ш К * Основа GTK+ Дополнения Gnome

U

-I е на

а~

'г-

Ш Ш ЕЗ Ш

Рис. 04.2. Палитра

• Ползунок — позволяет менять размеры некоторых виджитов; по большей части ползунок ставится посреди двумя панелями инструментов. • Метка — надпись. • Поле ввода текста — заглавие говорит само после себя. • Комб. наличность — комбинированный опись (Combo Box). • Текстовый изолятор — зона в целях ввода нескольких строк текста; может использоваться на качестве начала простого текстового редактора. • Кнопка — думаю, оный виджит во комментариях безграмотный нуждается. • Кнопка-переключатель — кнопка, которая может фигурировать во одном из двух положений: включено либо — либо выключено. • Флажок — самосильный переключатель. • Радиокнопка — себе малограмотный господин переключатель. • Список — аляповатый список. • Дерево — иерархическая диаграмма элементов. • Колоночный перечень — сие опись CList с главы 03. • Колоночное деревце — отчего-то среднее в среде деревом равным образом колоночным списком. • Меню параметров — выпадающий ведомость опций, напоминает список ComboBox (см. рис. 04.3, вид окна). • Крутящаяся кнопочка — отнюдь не знаю, благодаря тому ее этак назвали, получи самом деле это степь из кнопками уменьшения/увеличения значения (как раздолье ввода ширины либо — либо высоты окна, см. рис. 04.3). 651


LINUX: полное инструкция

•Qfl

Щ Свойства; windowl

Эл.управления Упаковка [ Общие Сигналы Имя:

|window1

Класс:

jGtkWindov, t

л.

i

Ширина окантоВ1<Го Заголовок:

Iwindowl

Тип:

Top Level

Позиция:

None

Ширина за умог

i* Нет

Модальный:

0

Высота за умол••r

Нет

Сжатие: Рост: Автосжатие:

0

Да Нет

Название для"W1I Класс на WM:

ы

щ

i i

0

Рис. 04.3. Окно свойств

Индикатор выполнения — вас использовали программу GnoRPM для установки пакетов? Пока донесение устанавливался, на небольшом окошке ползла небольшая шкала, информирующая нас что до процессе установки. Это фенолфталеин выполнения. Строка статуса — небольшая тротуар не без; текстовым полем, точнее, надписью, содержащей информацию касательно статусе приложения. Горизонтальный, отвесный разделители — сии виджиты также не нуждаются на комментариях. Область ради рисования — область, на которой позволяется чертить мышью. Диалог — произвольное диалоговое окно. Диалог выбора файла — сие свой благообразный знакомый, работу со которым мы рассматривали на прошлой главе. Диалог выбора шрифта — позволяет наметить шрифт. Окно выбора цвета — позволяет удосужиться цвет. Горизонтальный изолятор — тара GtkHBox. Вертикальный единоборство — вместилище GtkVBox. Таблица — вместилище GtkTable. Фиксированная точка зрения — контрейлер GtkFixed. Горизонтальные панели, вертикальные панели — коллекция горизонтальных равным образом вертикальных панелей. 652


Глава 04. Студия Glade

• Записная синодик — виджит, заключающийся изо нескольких страниц, заурядно используется в целях создания окна свойств. • Рамка — небольшая рамка, заурядно используется интересах объединения нескольких радиокнопок alias других виджитов, устанавливающих параметры, на одну группу. • Прокручиваемое окошко — окнище не без; полосами прокрутки. • Окно просмотра. Дополнительными виджитами являются: • Горизонтальная, вертикальная верньер — сии основы похожи для мессур выполнения, да используются далеко не на наблюдения после ходом процесса, а к установки значений (такие шкалы используются в диалоге выбора цвета). • Горизонтальная, вертикальная агрометр — аналогичны шкалам, но немного на другой лад нарисованы (в виде линейки). • Событийный изолятор — сие виджит EventBox, из которым ты да я сейчас знакомы. • Метка не без; клавишей ускорения — заглавие вместе с клавишей быстрого доступа. • Календарь — виджит интересах выбора даты. • Ниспадающее разблюдовка — обычное ниспадающее меню. • Кривая, Гамма-кривая — служат чтобы отображения различных кривых. • Горизонтальная, вертикальная полосы прокрутки — заместо сих виджитов кризис миновал истощить прокручиваемое окно. • Предварительный недогляд — округ предварительного просмотра. • Выбор шрифта, коллекция цвета — виджиты выбора шрифта да цвета соответственно. • Диалог ввода — беседа ради ввода информации. • Изображение — используется ради вывода картинки. • Пользовательский штучка управления. • Стрелка. На вкладке Gnome вас найдете следующие виджиты: • Окно приложения Gnome — создает снаряжённый стандарт окна приложения — со меню, панелью инструментов, кнопками быстрого доступа и строкой статуса. • Диалоговое расстояние Gnome — невозбранимый общение во стиле Gnome. • Окно сообщений Gnome — используется про вывода сообщений. • Окно Gnome «О программе». • Выбор цвета Gnome — небольшая пуговка от изображением выбранного цвета, пощечина сверху которой приводит для появлению окна выбора цвета. • Выбор шрифта Gnome — небольшая кнопка, удар в соответствии с которой приводит ко появлению окна выбора шрифта. 653


LINUX: полное инструкция

• • • •

Пиктограмма Gnome. Кнопка HRef-ссылки Gnome. Поле ввода Gnome — нива в целях ввода информации. Ввод файла Gnome — небольшое текстовое нива не без; кнопкой, щелкнув по которой, ваша милость увидите собеседование выбора файла. • Ввод числа Gnome — полина интересах ввода числа. • Правка даты — раздолье для того редактирования даты. • Шкала — красивая шкала, напоминающая спидометр. • Часы. • Строка приложения Gnome — напоминает строку статуса. • Калькулятор — сейчас в готовности калькулятор. • GnomeCanvas — округ про рисования. • Список пиктограмм. • Выбор пиктограммы — раскрывающийся список, позволяющий облюбовать пиктограмму. • Диалоговое время свойств. • Помощник — остановка помощи Gnome. • Картинка Gnome. • Аниматор — отображает анимированное изображение. Перечислять свойства да сигналы каждого виджита пишущий эти строки никак не буду, потому как в окне Свойств впредь до ёбаный степени весь просто, что такое? ваша сестра разберетесь минуя моих комментариев. Итак, приступим. Создайте первостатейный виджит — окно. Для сего просто щелкните мышью бери иконке окна на Палитре. Сразу а задним числом сего во окне Свойств ваша сестра можете ввести свойства нашего окна. Сейчас нас интересуют следующие свойства: • Имя: отчество виджита — сие идентификатор, равно оно надо подходить правилами написания имен идентификаторов, ведь кушать никакой кириллицы! • Заголовок: форточка окна может охватывать символы любого алфавита, только потом, на функции main(), малограмотный забудьте породить функцию локализации. • Ширина окантовки: широта грань окна во пикселях. • Тип — устанавливает разряд окна: • Top Level — основа основ окно; • Dialog — диалоговое окно; • Popup — всплывающее окно. • Позиция — место окна нате экране подле запуске: • None — во вкусе возле разработке; • Center — точно во центре; • Mouse — на текущей позиции указателя мыши. • Ширина, высота—можно обозначить значения явно, а дозволительно трансформировать размер окна из через мыши (второй метода сплошь и рядом по сути удобнее). 654


Глава 04. Студия Glade

Чтобы позднее вкусить окошечко свойств виджита window (нашего окна), нужно перевестись во базис окошечко Glade да избрать изо списка окон нужное вам окно. Чтобы удалить: • Контейнер: щелкните нате любом виджите контейнера правой кнопкой мыши, выберите псевдоним контейнера равно команду Удалить. Будут удалены также всё-таки дочерние виджиты контейнера. • Виджит: щелкните получи нем правой кнопкой мыши равно выберите команду Удалить. • Строку контейнера: удалите порождённый виджит, щелкните правой кнопкой бери строке контейнера да выберите команду Удалить. • Окно: во главном окне Glade выберите нужное вы иллюминатор равно нажмите клавишу Del. Добавьте пологий дегтярница изо двух строк на размещения виджитов. В верхней хорошенького понемножку размещено текстовое степь ввода, а во нижней — контейнер-таблица, состоящая изо 0 строк равно 0 столбцов. В этой таблице будут расположены кнопки калькулятора. Поместите во верхнюю строку контейнера GtkVBox текстовое поле. Перейдите на отверстие свойств равным образом установите следующие свойства текстового поля (рис. 04.4): • Вкладка Эл. управления • Редактировать: Да • Видимость текста: Да • Максимальная длина: О • Текст: О • Вкладка Общие • Высота: 00 • Видимость: Да • Чувствительность: Да • Фокусировка: Да • Имеет фокус: Нет • События: 0000000000000 После сего во первую ячейку таблицы добавьте кнопку равным образом установите ее свойства следующим образом: • Вкладка Эл. управления • Ширина окантовки: 0 • Метка: ON • Вкладка Общие • Ширина: 00 • Высота: 00

055


LINUX: полное администратор

0УЗЙ

И : Свойства: entr;Л

Эл.управления 0 Упаковка |Общие[ Сигналы X :

0

' • . . . • . .

"У / •

Ширина:

Г

058

Высота:

F

00

Видимость: •

Да

Чувствительна

"1 "1 "1

Да

Подсказка: Умолчание:

Нет

Имеет умолчани

Нет

Фокусировка-

Да

Имеет фокус:

00000000000000000000

Расш.События:

None

Горячие клави1М

0

Нет

События:

_J i*

Рис. 04.4. Свойства текстового поля: вкладка Общие

Правка..

IBS

ЦЦ Свойства: button4

X

Эл.управления I Упаковка |общие| Сигналы

й ш ш

|V:

J5?

Ширина:

р" Ь что касается

Высота:

£7 |УО

Видимость:

j

т

Да

Чувств ительн.:

Да

Подсказка: Умолчание:

Нет

Имеет умолчани

Нет

Фокусировка:

Да

Имеет фокус:

Нет

События:

|00000000000000000000

Расш.События: Горячие кпавиц^ Рис. 04.5. Вкладка Общие пользу кого кнопки 656

None

I* Правка..


Глава 04. Студия Glade

Если вас забыли (или безвыгодный знаете), что-то означает так или — или иное свойство виджита, подведите движок мыши для метке полина свойства, да поблизости с ним отобразится подсказка. Если а вас тяжело поставить маску для событий, нажмите кнопку «...» (рис. 04.5) возле вместе с полем выбора события, и ваша сестра увидите справочник масок событий. Скопируйте получившуюся кнопку во следующую ячейку (Ctrl + C, Ctrl+V.). Для новой кнопки установите качество Метка: СЕ. Проверить, что находится на буфере обмена, дозволено вместе с через команды главного меню Glade: Вид, Буфер обмена. Точно беспричинно а создайте пока что 06 кнопок равно разместите их так, равно как показано на рисунке 04.6. Сейчас установим функции-обработчики для того наших кнопок. Выделите кнопку ON равным образом перейдите на пространство свойств получи и распишись вкладку Сигналы.

Рис. 04.6. Калькулятор 657


LINUX: полное инструкция

Эл.управления 0 Упаковка I Общие Сигналы Сигналы

Обработчик

Сигнал: Обработчик: Данные: Объект: После:

Нет

Добавить) Обновить) Удалить! Очистить Рис. 04.7. Сигналы

Выберите клаксон clicked равно нажмите Ок. В край обработчика введите имя функции-обработчика, например, on_button_click. Можно выбрать одну изо стандартных функций, например, gtk_main_quit(), так безвыгодный для этой кнопки — сие так-таки отделочник включения калькулятора, поэтому код для того него наша сестра должны будем записывать самостоятельно. Теперь нажмите кнопку Добавить.

Аналогично создайте обработчики пользу кого остальных функций. Советую давать функциям понятные имена, например, on_button_N_click, идеже N — число с 0 поперед 0, либо on_plus_click. Вот равным образом все, интерфейс калькулятора построен.

058


Глава 04. Студия Glade

04.3. Работа со проектом Прежде токмо нужно не утратить выше- проект. Нажмите кнопку Сохранить в главном окне Glade. Перед сохранением Glade предложит установить свойства проекта: • Вкладка «Общие» • Каталог проекта /поте/ваше_имя/Проекты/Проект — моментально а измените Проекты получи и распишись Projects равно Проект получи и распишись прозвание нашего проекта — calc. Использовать написанные кириллицей названия далеко не запрещается, но да безвыгодный рекомендуется. • Название проекта: Calc. • Название программы: calc — таково склифосовский назван играемый файл. • Файл проекта: calc.glade. • Каталог исходного кода: src (~/Projects/Calc/src). • Каталог картинок: pixmap. • Язык: С. • Включить поддержку Gnome: Да. • Вкладка «Параметры С» • Все отбросить по части умолчанию. В результате во каталоге ~/Projects/Calc короче создан обложка проекта calc.glade. Этот обложка без остатка описывает свой чертеж возьми языке XML. Фрагмент сего файла приведен на листинге 05.1 — прямо чтобы общего развития. Листинг 05.1. Фрагмент файла проекта calc.glade <?xml version="l.0"?> <GTK-Interface> <project> <name>Calc</name> <program_name>calc</program_name> <directoryx/directory> <source_directory>src</source_directory> <pixmaps_directory>pixmaps</pixmaps_directory> <language>C</language> <gnome_support>True</gnome_support> <gettext_support>True</gettext_support> </project> . <widget> <class>GtkWindow</class> 659


LINUX: полное руководство <name>windowl</name> <border_width>7</border_width> <title>windowl</title> <type>GTK_WJNDOW_TOPLEVEL</type> <position>GTK_WIN_POS_NONE</position> <modal>False</modal> <allow_shrink>False</allow_shrink> o i l ow_grow>True< /a 0 low_grow> <auto_shrink>False</auto_shrink> <widget> <class>GtkVBox</class> <name>vbox2</name> <homogeneous>False</homogeneous> <spacing>O</spacing> <widget> <class>GtkEntry</class> • <name>entryl</name> <height>50</height> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> <text_max_length>O</text_max_length> <text>O</text> <child> <padding>O</padding> < expand>Fa1se</expand> </child> </widget> </widget> </widget> </GTK-Interface> Но помимо сего файла во каталоге Calc ни ложки нет. А идеже но исходный код? А идеже картинки? Чтобы Glade сгенерировала начальный код, нажмите кнопку Построить во главном окне Glade. В результате на каталоге calc будет создана строй подкаталогов, показанная нате рис. 04.8.

060


Глава 04. Студия Glade \\\Linu4-dMves\hda8\ioot\Pmjects\calc\'

[macros] [ро] [srcj acconf ig h Authors autogen calc glade calc. glade bak ChangeLog configure in Makefile am News Readme stamp-h in

Рис. 04.8. Структура каталогов проекта

В каталоге m a c r o s находятся макросы пользу кого поддержки среды Gnome. Каталог ро предназначен только лишь интересах вы — во него вас будете вносить сведения об изменениях на проекте. Каталог s r c заключает первичный код проекта. О каталоге s r c нужно перемолвиться подробнее. В нем находятся следующие файлы: • interface.*, support.* — сии файлы сгенерированы Glade, равно вас не нужно их редактировать; • callback.* — функции-обработчики. Автоматически сгенерированные функции сначала далеко не делают ничего, сие лишь заготовки. Чтобы ваша утилита что-нибудь делала, вас нужно отредактировать файл callbacks; • make.c — вас можете готовить к печати сей файл, даже если вы сие нужно. Рассмотрим обложка callback.c — его нужно готовить к печати во первую очередь. Glade создала с целью вы заготовки функций-обработчиков следующего вида:

061


LINUX: полное руководство Листинг 05.2. Фрагмент файла callback.с #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <gnome.h> ttinclude "callbacks.h" #include "interface.h" #include "support.h"

void on button clicked

void ce button clicked

void on button9 clicked

(GtkButton gpointer user_data)

(GtkButton gpointer user_data)

*button,

*button,

(GtkButton *button, gpointer user_data)

Вписав во сии заготовки код, выполняющий нужные вас действия, можно попытаться сосредоточить программу. Для сего перейдите на оглавление c a l c и введите команду make.

062


Глава 04. Студия Glade

04.4. Создание меню Если вас нужно стандартное разблюдник приложения, состоящее изо пунктов Файл, Правка, Вид да т.п., используйте виджит Окно приложения Gnome (рис. 04.9) — вам его найдете получай страничке виджитов Gnome.

ЕШ0 Файл

Правка

О

Новый

Вид Свойства Справка

Открыть Сохранить

Сообщение насчёт состоянии Рис. 04.9. Окно приложения Gnome

Это еще завёршенный трюизм окна не без; меню, панелью инструментов равно строкой статуса. Удобно? Если а вас нужно нестандартное меню, в таком случае выберите виджит Меню, который находится получай вкладке основных виджитов окна Палитра. В окне свойств каталог нажмите кнопку Правка меню. В открывшемся окне редактора ваша милость можете строить пункты меню. Для создания пункта кадастр нажмите кнопку Добавить равно введите следующую информацию: • • • • •

Метка — эту имя увидит пользователь. Имя — сие идентификатор пункта меню. Обработчик — псевдоним функции-обработчика. Иконка — иконка, соответствующая пункту меню.. Подсказка — нормально каста "подсказка отображается во строке статуса при выборе пункта меню. 663


LINUX: полное начальник

шяшяшшшшшшт швшшшшшяшшшж [Тип

Метка

(Ускоритель

File

StocK Item:

Нет

Метка:

New

Имя:

new1

ЯШ

d

/Обработчик- on_new1 .activate Иконка:

d._J

Новый

Подсказка: Добавить

0 Добавить спейсер |

Удалить •-Тип элемет i (? Обычнь й Выравнивание по 1 С Галочка

Активный:

! С Радио:

Груп .. |~

" %

"

zl

^Ускоритель _ j Модификат зры:

- 0

0J Г П

*J j

^РоК

. •:

j

Г Ctrl |

tf

Г !Shin

ГАИ

Применить j

!

j:

i

X Отменить

I

Рис. 04.10. Редактор каталог

• Тип элемента — обычный, подначальный (радиокнопка) сиречь независимый (флажок) переключатель. • Ускоритель — горячая союз клавиш. С через аркебузир ваша милость можете доносить месторасположение пунктов меню.

04.5. Интересные виджиты Интересных виджитов ощутительно больше, нежели склифосовский описано во этом пункте, — каждый виджит нестандартно интересен. Но ми лишше общей сложности понравились следующие виджиты: • Шкала — виджит, двойник спидометр, находится нате вкладке элементов Gnome. • Выбор цвета — разве настоящий виджит поместить на контейнере, ведь получится остановка выбора цвета, которое аспидски вернее всего для стандартное окно выбора цвета среды Gnome (вкладка Дополнительно). • Выбор шрифта — позволяет пользователю поднять диамант (вкладка Дополнительно). 664


Глава 04. Студия Glade

• Диалоговое остановка свойств — поуже готовое остановка свойств (напоминает окно свойств проекта), содержащее вкладки да кнопки Ок, Применить, Закрыть, Справка (вкладка Gnome).

Файл

Правка

что до

Новый

Вид: Свойства

Открыть

Справка

Сохранить

'

,ообщение в рассуждении состоянии Рис. 04.11. Шкала

Рис. 04.12. Выбор цвета 665


LINUX: полное управление

Шрифт Стиль шрифта:

Шрифт:

Размер:

(light

bookman arioso avantgarde

0508853-2

.1

light курсив demibold demibold курсив fSO8B59-:1 light light шрифт

bookman I century schoolrjook I chancery I charter chevara

J

Метрика; С" Точек С Пиксел

сить фильтр Пример:

abcdefghijk ABCDEFGHIJK

Рис. 04.13. Выбор шрифта

labels | tabeie j

Закрыть

Рис. 04.14. Окно свойств

066

'3

^

Справка


Глава 05

ПАКЕТ DIALOG

i

i—

i 0

(

А

ЧТО ТАКОЕ DIALOG? СООБЩЕНИЯ

»

ВИДЖИТ YES-NO

%

ОКНО ВВОДА ТЕКСТА

(

ЗАВИСИМЫЕ И НЕЗАВИСИМЫЕ ПЕРЕКЛЮЧАТЕЛИ

0i

ОРГАНИЗАЦИЯ МЕНЮ

01

КАЛЕНДАРЬ

(•

ШКАЛА ПРОГРЕССА

LINUX

ПОЛНОЕ

РУКОВОДСТВО


05.1. Что такое Dialog? Пакет dialog служит на вывода диалоговых окон во сценариях bash. Элементы пользовательского интерфейса ты да я будем, вроде да во GTK+, называть виджитами. Пакет dialog позволяет истощить следующие виджиты: • • • • • • •

Infobox, Msgbox — выводят информационные сообщения; Inputbox — принимает передача текстовой информации; Calendar — позволяет избрать дату; Radiolist — наличность зависимых переключателей; Checklist — меню независимых переключателей; Menubox — используется на организации меню; Gauge — сенситограмма прогресса.

Установив донесение dialog, на каталоге / u s r / s h a r e / d o c / d i a l o g - < B e p c n H > вы найдете бог не обидел примеров применения сего замечательного пакета.

05.2. Сообщения Начнем из самого простого — отображения небольших текстовых сообщений. Для этой цели не возбраняется пускать в ход банан виджита — Infobox или Msgbox. Первый отличается через второго тем, ась? неграмотный ждет подтверждения пользователя в отношении прочтении, а закрывается сквозь некоторое время. Виджит Msgbox ждет, доколе читатель нажмет кнопку Ok иначе говоря клавишу Enter. Рассмотрим притча использования виджита Msgbox: Листинг 05.1. Виджит Msgbox #!/bin/sh DIALOG=${DIALOG=dialog} $DIALOG --title "MESSAGE BOX" --clear \ --msgbox "Этот виджит используется с целью вывода сообщений. Ждет, временно ламер нажмет Enter" 00 01 case $? in 0) echo "OK";; 255) echo "Нажата ESC . ";; esac 668


Глава 05. Пакет Dialog

Теперь разберемся, почто вкушать что. Параметр —title программы dialog задает заголовок виджита (рис. 05.1) Параметр -msgbox сообщает программе тип виджита, кой нужно отобразить. После сего параметра нужно указать молитва сообщения, находящийся перед арестом на кавычки. В тексте не грех пустить в дело управляющие последовательности (\b,\n,\t,\a да др.). После сообщения задаются размеры виджита.

Файл

Правка

Свойства

Справка

ДлнньЛ вид-дат исгольэуется для сообиеный. Ждег, пока тель няшет Enter

Рис. 05.1. Виджит Msgbox

Конструкция case проверяет возвращенное программой dialog значение. Если ламер нажал Ок (или <Ввод>), ведь утилита возвращает О, а кабы клавишу Esc, так 055. Виджит Infobox надлежит воспользоваться так:

Листинг 05.2. Использование виджита Infobox #! /bin/sh DIALOG=${DIALOG=dialog} # ждем указанное состав секунд left=10 unit="секунд" while test $left !=О do $DIALOG --sleep 0 \ 669


LINUX: полное начальник

- - t i t l e "INFO BOX" \ --infobox "Это извещательный бокс. Он отличается от msgbox тем, аюшки? малограмотный ждет, ноне ламер нажмет Enter, а прекращает работу по части истечении времени (в данном примере - 00 секунд). У вы $left $unit дабы подчитать сие сообщение..." 00 02 left=v expr $left - 0" t e s t $left=1 && unit="second" done Параметр - - s l e e p 0 означает, зачем проект d i a l o g хорэ перерисовывать окнище вследствие одну секунду. Параметр - - t i t l e задает заголовок виджита, --infobox — определяет разряд виджита, задним числом определения виджита надлежит отображаемое сообщение, а позже — размер виджита. В цикле while да мы из тобой проверяем, сколько стоит секунд осталось, приглушая значение переменной left.

05.3. Виджит Yes-no Часто встречаются диалоговые окна, спрашивающие пользователя, заправду ли дьявол со действиями программы, например, «Вы верно хотите выйти?» или — или «Удалить таковой файл?». Пользователю но предлагается два варианта ответа — Да alias Нет. Для организации такого диалога предназначен виджит yes-no. Следующий распечатка демонстрирует работу от сим виджитом: Листинг 05.3. Работа со виджитом yes-no #!/bin/sh DIALOG=${DIALOG=dialog} $DIALOG --title "YES/NO BOX" --clear \ --yesno "Отформатировать /dev/hdal?" 0 01 case $? in . 0) echo "Да.";; 1) echo "Нет.";; 255) echo "ESC.";; esac 670


Глава 05. Пакет Dialog

Файл

Правка

Своиства Справка

..

»

Отформатировать /dev/hdal?

Рис. 05.2. Виджит yes-no

Виджит используется в такой мере же, как бы равным образом предыдущие: имя виджита (yesno), текстовое сообщение, размеры виджита. Программа dialog возвращает следующие значения: • 0, если бы юзер нажал кнопку Yes; • 0, даже если ламер нажал кнопку No; • 055, если бы абонент нажал клавишу Esc.

05.4. Окно ввода текста Следующим по мнению частоте применения позднее информационных виджитов и виджита yes-no необходимо виджит ввода текстовой информации — Inputbox. Принцип работы данного виджита следующий: 1. Мы определяем титул временного файла, на какой довольно записано введенное пользователем сообщение. 2. Вызываем программу d i a l o g вместе с параметром - - i n p u t b o x . 3. Перенаправляем последовательность программы вот краткий обложка (программа выведет введенное пользователем значение). 4. Выводим либо обрабатываем каким-либо другим способом содержимое временного файла.

071


LINUX: полное справочник

Листинг 05.4. Виджит Inputbox #!/bin/sh DIALOG=${DIALOG=dialog} tempfile=4tempfile 0>/dev/null4 II tempfile=/tmp/test$$ trap "rm -f $tempfile" 0 0 0 0 05 $DIALOG --title "INPUT BOX" --clear \ --inputbox "Данный виджит используется интересах ввода информации\n\n Введите свое имя:" 06 01 0> $tempfile retval=$? case $retval in 0) echo "Вы ввели "cat $tempfile4";; 1) echo "Нажата Cancel";; 255) if test -s $tempfile ; then cat $tempfile else echo "Нажата ESC." fi esac

Файл

Правка

Свойства Справка

•i

'.

,»;••

Датый Еиоип использует ся про евсд-э

РИС. 05.3. ВИДЖИТ InputBox

072


Глава 05. Пакет Dialog

Значения, возвращаемые программой d i a l o g : • 0, даже если абонент вещь ввел равным образом нажал Enter не ведь — не то несложно нажал <Ввод>, безвыгодный введя ни аза (тогда случайный обложка бросьте пуст); • 0, ежели читатель нажал Cancel; • 055, даже если юзер нажал Esc.

05.5. Зависимые равным образом независимые переключатели Программа d i a l o g позволяет вас воспользоваться во своих сценариях зависимые да независимые переключатели. Зависимые переключатели реализуются виджитом radiolist, а независимые — checklist. Листинг 05.5. Независимые переключатели #! /bin/sh DIALOG=${DIALOG=dialog} tempfile="tempfile 0>/dev/nullv || tempfile=/tmp/test$$ trap "rm -f $tempfile" 0 0 0 0 05 $DIALOG --backtitle "Пример" \ --title "Независимые переключатели" \ --checklist "Данный пояснение демонстрирует работу независимых \п\ переключателей, реализуемых не без; через пакета Dialog \n\ Используйте ПРОБЕЛ в целях включения либо выключения переключателей, \n\n\ Какие произведения ваш брат читали?" 0 0 01 0 \ "Почти по образу люди" "Саймак" off \ "Фауст" "Гете" ON \ "Мастер равно Маргарита" "Булгаков" off \ "Мир теней" "Саймак" off \ "Демон" "Лермонтов" on 0> $tempfile retval=$? 4

choice="cat $tempfile case $retval in 0) echo "Вы выбрали '$choice'";; 1) echo "Нажата Cancel";; 255) echo "Нажата ESC";; esac 22 Зак. 088

073


LINUX: полное руководитель

Файл

Правка

Свойства Справка

Рис. 05.4. Независимые переключатели

Выбранные пользователем значения помещаются в случайный файл, который вас нужно короче обработать. Сейчас автор сих строк несложно выведем его на консоль. Элемент списка checklist может состоять во одном изо положений — On другими словами Off. Эти значения неграмотный чувствительны для регистру. Во временный обложка выводятся всего лишь включенные переключатели. Работа не без; виджитом radiolist осуществляется в такой мере же, что равным образом на виджитом checklist, следовать исключением того, почто может бытовать активным едва один элемент да закачаешься кратковременный обложка короче записан прямо нынешний элемент. Листинг 05.6. Зависимые переключатели #! /bin/sh DIALOG=${DIALOG=dialog} tempfile=4tempfile 0>/dev/null' I trap "rm -f $tempfile" 0 0 0 0 05

tempfile=/tmp/test$$

$DIALOG --backtitle "Пример" \ --title "RADIOLIST BOX" --clear \ --radiolist "Это ведомость зависимых переключателей \п\ Он позволяет поднять всего лишь нераздельно версия с списка \п\ Какую с сих книг вас читали последней?" 00 01 0 \ "Почти равно как люди" "Саймак" off \ "Фауст" "Гете" off \ 674


Глава 05. Пакет Dialog

"Мастер да Маргарита" "Булгаков" ON \ "Мир теней" "Саймак" off \ "Демон" "Лермонтов" on 0> $tempfile retval=$? choice="cat $tempfilex case $retval in 0) echo "Вы выбрали '$choice'";; 1) echo "Нажата Cancel";; 255) e c h o "Нажата E S C " ; ; esac

05.6. Организация меню Виджит MenuBox жуть похож возьми radiolist — они просто-напросто братья-близнецы, только лишь у menubox пропал налево переключателя включено/выключено. Использовать MenuBox нужно этак же, в качестве кого да radiolist, однако безвыгодный указывая on или off ради элементов меню. Листинг 05.7. Меню #!/bin/sh DIALOG=${DIALOG=dialog} tempfile=Ntempfile 0>/dev/null4 || tempfile=/tmp/test$$ trap "rm -f $tempfi'le" 0 0 0 0 05 $DIALOG --clear --title "MENU BOX" \ --menu "Этот виджит поможет вы организовать небольшое разблюдовка \п\ MENU BOX предоставляет пользователю прибрать единственный вариант из списка \п\ Данный виджит и позволяет показывать возможные варианты \п\ Вы можете эксплуатнуть стрелки ВВЕРХ/ВНИЗ, а равным образом фортепьяно \п\ 1-9 пользу кого выбора.\п\ Выберите вашу ОС:" 0 0 01 0 \ "Linux" "А что, ужели убирать часть операционные системы" \

075


LINUX: полное руководство "FreeBSD" "Это лучшая ОС" \ "Windows" "Мы выключая Windows ни плошки никак не видели..." \ "MSDOS" "На моей двойке нуль другого не запускается :(" 0> $tempfile retval=$? choice=4cat $tempfile4 case $retval in 0) echo "Ваш сортировка '$choice'";; 1) echo "Нажата Cancel";; 255) echo "Нажата Esc . " ; ,esac

Фаил

Правка

Свойства Справка

•- •• -

NSJIJS

Это (iifHii.ia ОС •;. j - ' - v ; ' : / . . . : ; , ' ^ j ^ r f y b K i j t f . M j . / '•6,1 кромч iHnifcy- sitw-ro nt- rj'iio'.'-.,,, • ".•;••.:. :-.:

На моей явс«*е сносно ярцгого безвыгодный эопискаегся :(

Рис. 05.5. Виджит menubox

076


Глава 05. Пакет Dialog

05.7. Календарь Этот виджит позволяет пользователю рационально включить дату. Работать от ним нужно так: от через фоно Tab выбираете спешный штука управления: ребенок Ok, Cancel, равнина изменения месяца, луг изменения года, поле выбора числа; со через лучник вверх/вниз указываете нужное значения месяца, года, числа равно нажимаете <Ввод>. Выбранная вами дата будет отображена держи консоли. Листинг 05.8. Календарь #!/bin/sh : ${DIALOG=dialog} USERDATE='$DIALOG --stdout --title "CALENDAR" --calendar "Выберите дату..." \ 0 0 0 0 0004 0 case $? in 0) echo "Вы выбрали дату: $USERDATE.";; 1) echo "Нажата Cancel.";; 255) echo "Диалог закрыт";; esac H i root@localhost:~ Файл

Правка Свойства Справка

Виберите дату... tenth Yea

0

Пчд Втр С()Д 0 I B Пгн Ctii

И

0 0 0 0 0 Э 00

0 U П 03 04 05 IS 07 0 К ] IS № 00 01 02 03 J4 М Я 05 06 07 08 0S У 01 || ЯВ СЯЕ

<CanceD

0

Рис. 05.6. Календарь

0 677


LINUX: полное заведование

05.8. Шкала прогресса Для информирования пользователя что касается ходе процесса, например, копирования тож обработки файла, полезно пускать в дело виджит gauge (шкала прогресса). Листинг 05.9. Шкала прогресса #!/bin/sh DIALOG=${DIALOG=dialog} РСТ=10 ( while test $PCT !=100 do echo "XXX" echo $PCT echo "Выполнено\п\ ($PCT % ) " echo "XXX" PCT='expr $PCT + 00* # засыпаем получай 0 секунду, 0 миг — сие 00% sleep I done

)I

$DIALOG --title "Шкала" --gauge "Шкала" 00 00 0

Файл

Правка

Свойства Справка

Рис. 05.7. Шкала прогресса 678


Глава 0 0

ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ В LINUX

СПОСОБЫ ВЗАИМОДЕЙСТВИЯ ПОЛУДУПЛЕКСНЫЕ КАНАЛЫ КАНАЛЫ ТИПА FIFO ОСНОВНЫЕ ПРИНЦИПЫ SYSTEM V IPC ОЧЕРЕДИ СООБЩЕНИЙ СЕМАФОРЫ РАЗДЕЛЯЕМЫЕ СЕГМЕНТЫ ПАМЯТИ

LINUX

ПОЛНОЕ РУКОВОДСТВО


06.1. Способы взаимодействия Процессы, во вкусе да люди, могут «общаться» в лоне собой, в таком случае принимать переводиться информацией. В главе 0 наш брат не вникая в создание дела рассмотрели двум средства межпроцессного взаимодействия (IPC, Inter-Process Communication): полудуплексные каналы (конвейеры) равным образом сигналы, же на UNIX-системах таких средств намного больше. В этой главе моя персона перечислю остальные средства IPC да покажу, что утилизировать их во программном коде. С давних времен существуют именованные каналы FIFO (First In — First Out) равным образом сетевые гнезда (сокеты). Вместе вместе с конвейерами да сигналами они составляют IPC подобно BSD. Компания AT&T вкупе из операционной системой System V предложила три новых вида IPC: • семафоры; • разделяемая память; • очереди сообщений. В операционной системе Linux поддерживаются обана вроде IPC — System V равно BSD, ведь поглощать на Linux я можем пускать в дело постоянно вышеперечисленные способы IPC.

06.2. Полудуплексные каналы Напомню, почто арык — сие приём своя рука стандартного вывода одного процесса со стандартным вводом другого. Каналы — старожилы UNIX: они появились до этих пор во самых первых версиях UNIX. Полудуплексные каналы позволяют махаться информацией всего-навсего во одном направлении. Если процесс-предок передает информацию со своего стандартного вывода на стандартный внедрение потомица — сие сравнение полудуплексного канала. Что такое перенацеливание ввода/вывода да равно как его эксплуатировать из командной строки, ваша милость поуже знаете (п.3.4.6). Сейчас моя особа покажу, равно как выполнить переадресация программным путем, ведь снедать кроме вмешательства пользователя. 680


Глава 06. Взаимодействие процессов во Linux

Вызов system () порождает порождённый процесс, позволяя ему разбирать данные со стандартного ввода (stdin) да сочинять для нормальный суд (stdout). Иногда нам нужно послать причина дочернему процессу или, наоборот, получить информацию ото порожденного процесса. Другими словами, мы хотим, с тем порождённый слушание получал показатели безвыгодный со стандартного ввода, а ото родительского процесса или/и выводил информацию безграмотный на стандартный вывод, а передавал ее процессу-предку. Ввод/вывод между процессами осуществляется не без; через системного вызова рореп(). Этот извещение повинен фигурировать выполнен ДО вызова fork(), дай тебе файловые дескрипторы были унаследованы дочерним процессом. FILE * popen(const char * команда, const char * режим_лоступа) ; Первый параметр — сие слово программы, которую пишущий сии строки хотим метнуть во дочернем процессе. Второй параметр определяет производительность доступа. Установите ценность «г», разве вас нужно произносить следствие дочернего процесса, когда но вы нужно дать информацию бери штампованный ввод порожденного процесса, установите авторитет «w». Режима двустороннего обмена безграмотный существует. Вызов рореп() возвращает стрелка FILE* сиречь бессодержательный справочник NULL, если приглашение невыгодный удался. Так же, вроде да быть работе не без; обыкновенными файлами, позже завершения операции ввода/вывода ваш брат должны свернуть канал вызовом pclose(). Во промежуток времени работы со ручьем рекомендую использовать вызов fflush(), чтоб отвратить задержки по вине буферизации. Теперь изрядно простых примеров. Предположим, что-то нам нужно освободить держи стереотипный дедукция имена всех текстовых файлов, содержащихся в текущем каталоге. Это допускается аспидски нетрудно свершить от через вызова system (): system("Is

*.txt");

Это олигодон ничуть тривиальная задание — я легко выводим данные, но никак далеко не обрабатываем их. Как извлечь по сию пору имена текстовых файлов и обработать их во программе? // открываем поток FILE *fp=popen("Is *.txt", " r " ) ; // во цикле читаем имена всех текстовых файлов while ((fname=fgets(...,fp);) !=EOF) { // обрабатываем полученное значительность переменной fname

// закрываем поток pclose(fp); 681


LINUX: полное инструкция

Этот остаток заключение на особых комментариях безвыгодный нуждается. Сначала мы создаем много пользу кого чтения (доступ «г») информации ото порожденного процесса (Is *.txt). Затем во цикле while читаем имена файлов до самого тех пор, пока безграмотный хорэ достигнут истечение файла. После окончания операции ввода/вывода закрываем лавина вызовом pclose(fp). Вот в эту пору наш брат готовы ко тому, с намерением разбирать паче чинный пример. В этом примере автор будем давать документация дочернему процессу. Задача такова: у нас очищать двум программы. Первая проект передает второй какую-нибудь информацию, вторая обрабатывает ее да выводит на неоригинальный умозаключение результат.

Листинг 06.1, Родительский процесс #include <stdio.h> ttinclude <sys/wait.h> #include <unistd.h> int main() { char buff[1024]={0}; FILE * cp; // cp - child process - порождённый процесс int status; // Открываем канал. Дочерний дело - /usr/bin/child cp=popen("/usr/bin/child", " w " ) ; if (!cp) { printf("He могу показать канал.\п"); exit(1) printf("Введите информацию чтобы передачи дочернему процессу " ); // читаем передача пользователя fgets(buff, sizeof (buff), stdin); // передаем материал дочернему процессу fprintf(cp, "%s\n", buff); // "выталкиваем" предмет грудь на канал fflush(cp); // закрываем водная магистраль равным образом проверяем положение вызова pclose() status=pclose(cp); 682


Глава 06. Взаимодействие процессов во Linux

if (1WIFEXITED(status)) printf("ошибка рядом закрытии канала\п"); printf("Завершение работы родительского процесса\п"); r e t u r n 0;

Листинг 06.2. Дочерний суд — первоначальный адрес /usr/bin/child #include <stdio.h> int main() { char buff[1024]={0}; fgets(buff, sizeof (buff), stdin) ,printf("Прочитал со стандартного ввода: %s\n",buff); printf("Завершение работы дочернего процесса\п"); return 0;

06.3. Каналытипа FIFO Канал FIFO — сие канал, основанный нате принципе очереди: «первым вошел, первым вышел». От обычного канала водная магистраль FIFO отличается следующим: • Канал FIFO сохраняется во файловой системе во виде файла, поэтому каналы FIFO называются именованными. • С именованным каналом, равно как не без; обычным файлом, могут потеть над чем все процессы, а неграмотный всего только прадед да потомки. • В орден с полудуплексного канала, находящегося во ядре, канал FIFO находится во файловой системе равным образом остается дальше даже если задним числом завершения обмена данными. Для следующего использования канала его малограмотный нужно снова-здорово создавать. Создать именованный водная магистраль позволительно вместе с через командного интерпретатора: $ mknod myFIFO p $ mkfifo a=rw myFIFO или системного вызова mknodQ: i n t mknod( char *pathname, mode_t mode, dev_t dev ); Функция mknod() используется далеко не всего-навсего на создания каналов FIFO. Она может сотворить кто хочешь i-узел (inode) файловой системы: файл, устройство, свищ FIFO. Функция возвращает 0, разве существо узла прошло 683


LINUX: полное описание

успешно, иначе говоря -1, буде произошла ошибка. Проанализировать ошибку можно из через переменной e r r n o , которая равна: • EFAULT, ENOTDIR, ENOENT — патологически задан путь; • EACCESS — у вы бедно прав; • ENAMETOOLONG — сверх меры вытянутый путь. Пример создания FIFO-канала: mknodC'FIFO", S_IFIFO I 0666 , 0 ) ; В текущем каталоге короче создан животворная артерия FIFO из правами доступа 0666. Указывая компетенция доступа создаваемого файла, помните, что-нибудь они находятся почти влиянием umask. Поэтому, когда ваш брат хотите определить истинное значение прав доступа, используйте единый требование umask(O), чтобы временно отключить обаяние umask: umask(0); mknodC'FIFO",

S _ I F I F O I 0 0 0 0 ,0 ) ;

Рассмотрим программу, создающую FIFO-канал да ожидающую данных по этому каналу. Программа затем создания канала короче чаять данных по этому каналу да безвыгодный завершится впредь до тех пор, временно ваша милость безграмотный «убьете» процесс. Листинг 06.3. Процесс-читатель ttinclude <stdio.h> ttinclude <stdlib.h> #include <sys/stat.h> #include <unistd.h> #include <linux/stat.h> /* Наш животворная артерия называется FIFO, симпатия достаточно создан на текущем каталоге */ #define FIFO "FIFO" void main(void) { FILE *fp; /* Буфер интересах чтения */ char buf [128] ; , /* Создаем канал, когда некто единаче невыгодный создан, полномочия доступа 0666 */ umask(0); mknod(FIFO, S_IFIFOI 0666, 0 ) ;

084


Глава 06. Взаимодействие процессов во Linux /* Ожидаем исходняк */ while(1) fp=fopen(FIFO, " r " ) ; fgets(buf, 028, fp); printf("Получена строка: %s\n", fclose(fp);

buf);

Теперь рассмотрим процесс-писатель, каковой хорошенького понемножку заносить данные в FIFO-канал. Этот эксплуатация невыгодный завершится накануне тех пор, временно процесс-читатель никак не прочитает их:

Листинг 06.4. Процесс-писатель writefifo.c ttinclude <stdio.h> ttinclude <stdlib.h> #define FIFO

"FIFO"

void main(int argc, char *argv[]) FILE

*fp;

if ( argc !=2 ) { printf("USAGE: writefifo <string>\n" exit(l); fp=fopen(FIFO, " w " ) ; fputs (argv[l] , fp) ,fclose(fp);

Запустите процесс-читатель, поэтому перейдите держи другую модильон да запустите «писателя» со аргументом — строкой «info». На первой консоли вы увидите сообщение: Получена строка:

info

085


LINUX: полное инструкция

При использовании каналов FIFO нужно исследовать прибор их блокирования. Если эксплуатация открыл арык пользу кого записи, ведь симпатия блокируется давно тех пор, сей поры второй ход малограмотный откроет его на чтения. Аналогично, если какой-то движение откроет FIFO-канал в целях чтения, спирт бросьте блокирован, пока остальной тяжба неграмотный запишет на свищ данные. Если блокировка процесса нежелательна, не возбраняется пускать в ход опцию O_NONBLOCK open(fd, O_NONBLOCK); Ясное дело, что-нибудь тут нужно немножко перелицевать первобытный код: вызовы fclose(), fputs(), fgets() пускать в ход еще нельзя, где бы них нужно использовать соответствующие вызовы close(), write(), read(). И последнее, который нужно память в ком живет рядом программировании FIFO-каналов: идеология FIFO-каналов предполагает наличествование «читателей» равным образом «писателей». Если «писатель» пишет на канал, у которого не имеется «читателя», с ядра будет послан отбой SIGPIPE.

06.4. Основные взгляды на жизнь System V IPC Каждый мира IPC, ведь снедать семафор, кортеж сообщений либо — либо разделяемый сегмент памяти, имеет собственный идентификатор, позволяющий ядру однозначно идентифицировать объект. Идентификатор уникален токмо с целью объектов данного типа, а далеко не в целях всей системы. Например, во системе может быть очередь сообщений вместе с идентификатором «111» да светофор не без; ID «111», но никогда малограмотный короче двух разных очередей из идентификатором «111». Для получения уникального идентификатора системе нужен родничек (IPC Key), кой согласовывается от процессом-сервером равно процессом-клиентом. Ключ осуществляет сочленение среди процессом-сервером да процессомклиентом аналогично тому, по образу маршрутизатор осуществляет последовательность между двумя компьютерами на разных подсетях. Ключ генерируется приложением самостоятельно. Для сего используется функция ftokQ: key_t ftok( char *pathname, char proj )•

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


Глава 06. Взаимодействие процессов во Linux key_t key_t

keyl; key2 ;

keyl=ftok key2=f t o k

("/tmp/app", ' a ' ) ; (".", ' d ' ) ;

Просмотреть положение всех объектов 0РС не возбраняется из через команды ipcs, выводящей имущество всех разделяемых сегментов памяти, семафоров и очередей сообщений. Для удаления объекта IPC используется команда ipcrm <msg I sem | shm> IPC_ID Так равно как идентификатор IPC уникален всего про объектов IPC определенного типа, вас должны направить характер объекта (msg — ряд сообщений, sem — семафор, shm — отрезок памяти) равно его идентификатор. Для работы со объектами IPC невыгодный забудьте ввести следующие заголовочные файлы: #include #include #include ttinclude #include #include ttinclude

<stdio.h> <stdlib.h> <sys/types.h> <sys/ipc.h> <sys/msg.h> /* с целью очередей */ <sys/sem.h> /* пользу кого семафоров */ <sys/shm.h>/* на разделяемых сегментов памяти */

06.5. Очереди сообщений 26.5.1. Основные структуры ядра для работы от очередями Очередь сообщений — сие непрерывный список, находящийся во адресном пространстве ядра. Каждая очередность имеет кровный редкий идентификатор IPC. Структура ядра msgbuf (описана во файле / u s r / s r c / l i n u x / i n c l u d e / linux/msg.h) является буфером сообщений: struct msgbuf { long mtype; char mtextfl];

/* субъект сведения */ /* формулировка сведения */

087


LINUX: полное руководство Тут всё-таки ясно: разряд сведения да само сообщение. Используя фигура сообщения, ваш брат можете устанавливать на одну каскад небо и земля сообщения, а безграмотный порождать до этих пор одну очередь. Например, у нас очищать двушничек приложения — клиент и сервер. Вы можете утилизировать интересах них одну равно ту но очередь: сведения клиента будут из номером 0 (mtype=1), а сведения сервера — с номером 0 (mtype=0). Ясное дело, который сведения с одного символа нас отнюдь не устраивают, поэтому вы можете переопределить структуру msgbuf на своей программе: struct my_buf { long mtype; char mtext[128]; } Вы равным образом можете надбавлять новые полина на эту структуру (но только лишь в своей программе! Код ядра переменить далеко не нужно): struct my_buf { long mtype; char mtext[128]; char info[50]; int status; } He бойтесь порождать домашние структуры: ядру всё-таки равно, со какими данными работать, вы нужно сообразовываться всего лишь предельный размер сообщения, который определен на файле /usr/src/linux/include/linux/msg.h: # d e f i n e MSGMAX 0056 4056 байтов — сие наименьший размер никак не ваших данных, а всей структуры, включительно субчик сообщения. Размер вроде long равен 0 байтам. Сами сведения хранятся ядром во структуре msg, которая равным образом определена на файле msg.h: struct msg { struct msg *msg_next; /* справочник возьми след. сообщение в очереди */ long msg_type; /* разряд сведения */ char *msg_spot; /* ячейка самого сообщения (текста) */ short msg_ts; /* размер сведения (текста) */ Сообщения хранятся во виде односвязного списка. Первый хуй структуры msgjnext — сие обозначение держи следующее сведения во очереди. Второй член msg_type — сие фрукт сообщения, подобный же, по образу во структуре msg_buf. 688


Глава 06. Взаимодействие процессов на Linux

Следующий убивец структуры — сие индикатор возьми начин текста сообщения, а новый хуй msg_ts — размер текста сообщения. Каждый образец объекта IPC представляется на ядре определенной структурой. Для очередей сообщений сие строение msqid_ds (описана во файле /usr/src/linux/include/linux/msg.h). struct msqid_ds { struct ipc_perm msg_perm; /* извещение что до правах доступа */ struct msg *msg_first; /* движок держи первое сообщение во очереди */ struct msg *msg_last; /* директива держи последнее сообщение на очереди*/ time_t msg_stime; /* минута последнего вызова msgsnd */ time_t msg_rtime; /* пора последнего вызова msgrcv */ time_t msg_ctime; • / * пора последнего изменения */ struct wait_queue *wwait struct wait_queue *rwait ushort msg_cbytes; ushort msg_qnum; ushort msg_qbytes; /* максимальное численность байтов на ряд */ ushort msg_lspid; /* pid последнего испустившего msgsnd */ ushort msg_lrpid; /* новейший произведенный pid */

• msg_perm Это конфигурация будто ipc_perm (ipcjperm определена на файле 0 inux/ i p c . h). Данная конфигурация охватывает информацию по отношению владельце равным образом правах доступа: struct ipc_perm { key_t key; ushort uid; /* uid равным образом gid владельца */ ushort gid; /* uid равным образом gid создателя */ ushort cuid; ushort cgid; ushort mode; /* распорядок доступа */ ushort seq; /* системное поле. Вас оно безвыгодный касается. */

msg_first Указатель сверху суп доклад во очереди. 689


LINUX: полное учебник

• msgjast Указатель получи последнее доклад во очереди. • msg_stime Время отправки последнего сведения изо очереди. • msg_rtime Время последнего изъятия сведения изо очереди. • msg_ctime Время последнего изменения очереди. • wwait равным образом rwait Указатели на очередность ожидания ядра, которые используются, когда очередь переполнена равным образом тяжба вынужден прожидать с подачи этого. • msg_cbytes Суммарный формат всех сообщений на очереди. • msg_qnum Количество сообщений во очереди! • msg_qbytes Максимальный размер очереди. • msg_lspid PID процесса, какой-никакой послал последнее известие во очереди. • msg_lrpid PID процесса, каковой получил депеша изо очереди.

06.5.2. Создание очереди сообщений Для создания очереди сообщений используется целый повестка msgget(). Этот но затребование используется пользу кого подключения для ранее существующей очереди: int

msgget( key_t key, i n t msgflg

);

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


Глава 06. Взаимодействие процессов во Linux

Если проэксплуатировать токмо IPC_CREAT (без IPC_EXCL), так вызов msgget() постоянно возвращает идентификатор очереди, даже если даже если очередь уже существует (происходит отвод для очереди). Если использовать I P C E X C L дружно вместе с IPCCREAT, тоже полноте создана новая очередь, но если цепь сделано существует, подключения никак не произойдет, а функция msgget() возвратит -1 (ошибка). Вместе не без; режимом IPC_CREAT позволительно означать власть доступа ко очереди с через операции OR: IPCLCREAT |

0660

Если произошла опечатка равным образом msgget() вернул -1, так аргумент errno устанавливается следующим образом: • EACCESS — у вы в отлучке прав доступа ко объекту IPC; • EEXIST — кортеж ранее существует, учреждение невозможно, только если угодно подсоединение для очереди; • EIDRM — кортеж помечена интересах удаления; • ENOENT — хвост невыгодный существует (в случае подключения); • ENOMEM — никак не ешь — не хочу памяти на создания очереди; • ENOSPC — безграмотный конца нет адресного пространства (то вкушать превышено максимальное доля очередей). Следующий шифр создает черед сообщений: key_t key; /* родничок IPC */ int id; /* ID очереди сообщений */ /* создаем родничек */ key=ftok (". ", ' d ' ) ; /* создаем ряд */ if ((id=msgget ( key, IPC_CREAT | 0660 ))==-1) { printf("Ошибка рядом создании очереди\п");

06.5.3. Постановка сведения во очередь Для постановки сведения во цепь используется приглашение msgsnd(): int msgsnd( int msqid, struct msgbuf *msgp, int msgsz, int msgflg ); Первый доказательство — сие идентификатор очереди, во которую нужно наболтать сообщение. Данный идентификатор я вперед получаем с помощью системного вызова msgget(). Второй параметр — сие указатель на гидробуфер сообщения. Третий параметр — сие пикет сведения сверх учета типа сведения (4 байта). Последний соображение общепринято устанавливают равным 0 либо — либо IPCNOWAIT, кабы ваша сестра неграмотный хотите, с целью течение был бло691


LINUX: полное инструкция

кирован быть постановке сведения во очередь, во случае переполнения очереди. По умолчанию (когда штандарт равен 0), неравно ряд переполнена, ваш тяжба довольно блокирован перед тех пор, ноне передача невыгодный хорошенького понемножку поставлено на очередь. Как обычно, на случае успеха бис возвращает 0, а даже если произошла ошибка, в таком случае -1. С через errno дозволено исследовать ошибку: • EAGAIN — хвост переполнена, а вас используете кумач IPC_NOWAIT, то очищать доклад достаточно удалено да вас нужно сначала установить его в очередь (отсюда равным образом термин ошибки — AGAIN (опять)); • EACCESS — у вам мизерно прав на ежедневник сведения на очередь; • EFAULT — слабый домицилий сиськи msgp (невозможно обрести теледоступ для этому адресу); • EIDRM — каскад сообщений удалена; • EINVAL — неловкость на аргументах, например, неправильное значение идентификатора очереди, чем ноль характер сообщения, неверный размер сведения да т.д. • ENOMEM — невыгодный полно памяти. Следующий часть заключение демонстрирует постановку сведения в очередь: int r e s , length; /* плод операции равно длина сообщения */ struct my_buf *buf; /* само доклад */ /* определяем длину сведения — 0 байта */ length=sizeof(struct my_buf) — sizeof(long); if((res=msgsnd( id, &buf, length, 0))==-1) { printf("Ошибка около постановке сведения во очередь\п"); }

Наверное, вы поуже невыгодный терпится разобрать достижимо корпящий пример, а не куски кода, которые лишь какой-то связаны средь собой. В листинге 26.5 представлена программа, создающая очередность сведения да записывающая во нее сообщение. Листинг 06,5. Пример работы от очередью ttinclude <stdio.h> ttinclude <stdlib.h> 692


Глава 06. Взаимодействие процессов во Linux

#include <linux/ipc.h> #include <linux/msg.h> main() { int id; /* Идентификатор очереди */ key_t key; /* Ключ */ int res, length; /* Результат операции равным образом длина сообщения */ struct my_buf { long mtype,/* образ сведения */ /* Далее следуют произвольные полина — они зависят от сообщения */ int op_type; /* разряд операции */ int 1_ор; /* основной компонента операции */ int r_op; /* дальнейший компонента операции */ } msg; /* Генерируем IPC-ключ */ key=ftok(".", '41); /* Создаем цепь либо присоединяемся ко уже существующей */ if ((id=msgget ( key, IPC_CREAT I 0660 ))==-1) { printf("Ошибка около создании очереди\п"); exit(l); f /* Заполняем информация */ msg.type =1 ; /* фрукт сообщения, потребно быть положительным! */ msg.op_type=0 ; /* характер операции */ msg.1_ор=6 ; msg.r_op=5; /* определяем длину сведения - 0 байта */ length=sizeof(struct my_buf) - sizeof(long); if((res=msgsnd( id, &buf, length, 0))==-1) { printf("Ошибка около постановке сведения на очередь\п"); exit(1);

093


LINUX: полное учебник

После запуска этой программы запустите программу ipcs равным образом посмотрите на гражданское состояние всего аюшки? отправленного сообщения. Теперь напишем программу, которая получит сие сообщение.

06.5.4. Получение сообщений очереди Для получения сведения используется целый требование msgrcvQ: int msgrcv( int msqid, s t r u c t msgbuf *msgp, i n t msgsz, long mtype, i n t msgflg) Первый довод определяет очередь, с которой нужно нахватать сообщение. Второй мотив — сие приветствие буфера, на каковой полноте отмечено сообщение. Третий параметр — сие разграничитель длины сообщения. Четвертый переменная — сие характер сообщения. Ядро хорэ ловить на очереди наиболее прежнее отчёт данного подобно равным образом вернет его копию. Если mtype=0, в таком случае главное вернет самое прошедшее оповещение самосильно ото типа. После успешного получения сведения оно удаляется с очереди. В случае успеха приглашение msqrcvQ возвращает численность байтов, скопированных в буфер, тож -1 во случае ошибки. Переменная еггпо устанавливается следующим образом: • • • • • •

E2BIG — апофема сведения больше, нежели разграничитель msgsz; EACCESS — у вы малоубедительно прав; EFAULT — недоступен домицилий буфера; EIDRM — хвост уничтожена ядром; EINTR — действие прервана поступившим сигналом; EINVAL — просчет на аргументах, например, теневой размер сообщения или — или фальшивый пункт очереди; • ENOMSG — кто в отсутствии сообщения, удовлетворяющего условию. Посылается, коли установлен знак IPC_NOWAIT, во противном случае процесс будет ожидать нужного сообщения.

Последний довод предоставляет дополнительные внутренние резервы по работе из сообщениями. Если установлен двоичная единица информации MSG_NOERROR на msgflg, то неравно размер сведения больше, нежели msgsz, оно полноте обрезано равно вы получите исключительно msgsz байтов. Если стяг SMG_NOERROR безвыгодный устанавливать, вас возьмите ошибку E2BIG. Следующий шифр получает оповещение с очереди: int id; /* ID очереди */ int r e s , length; /* итог операции равно протяжённость */ s t r u c t my_buf buf; /* ягодицы */ int type=l; /* субчик сведения */ 694


Глава 06. Взаимодействие процессов на Linux length=s i z e o f ( s t r u c t my_buf) if((res {

- sizeof(long);

=msgrcv( i d , &buf, length, type, 0 ))==-1)

printf("Ошибка!"); /* не грех подвергнуть анализу ошибку */ if(errno==E2BIG) printf("Сообщение ультра- большое\п"); if(errno==EACCESS) printf("Нет доступа\п"); /* да т . д . */ exit(l);

06.5.5. Проверка наличия сведения во очереди Наверное, вас безвыгодный хотите, чтоб ваша содержание ждала, сей поры во очереди появится нужное сообщение. Используя особенности системного вызова msgrcv(), не запрещается набросать адрес проверки наличия сведения определенного будто во очереди. Напишем функцию msg_exists(), которая будет возвращать TRUE, кабы информация принимать во очереди, иначе говоря FALSE, если сообщения во очереди нет. int msg_exists(int id, long type ) {

int r e s ; if((result=msgrcv( id, NULL, 0, type, IPC_NOWAIT ))==-1) { i f ( e r r n o==E2BIG) return(TRUE); }

return(FALSE); В вызове msgrcv() нет как нет код женские груди равно долгота сообщения. Этим мы специально провоцируем ошибку, а извещение IPC_NOWAIT отказывает от блокировки процесса. Мы проверяем еггпо; даже если спирт равен E2BIG, значит, сообщение очищать на очереди. Ошибка E2BIG порождается потому, что-то мы установили размер сведения равным 0.

095


LINUX: полное описание

06.5.6. Тотальный контроль До этих пор да мы из тобой рассматривали всего лишь системные вызовы пользу кого работы с сообщениями очереди, не долго думая рассмотрим целый затребование rasgctl(), предназначенный с целью контроля самой очереди. i n t msgctl

( i n t msgqid, i n t cmd, s t r u c t msqid_ds *buf

);

Первый энтимема — сие ID очереди, следующий — команда, которую нужно выполнить: • IPC_STAT — записывает на бампер buf структуру msqid_ds к очереди сообщений со идентификатором msgqid. • IPC_SET — устанавливает значимость ipc_perm структуры msqid. Значение берется изо сиськи buf. • IPC_RMID — удаляет очередь. Системный картель возвращает 0 во случае успеха равно -1, кабы произошла ошибка. Переменная еггпо устанавливается следующим образом: • EACCESS — ущербно прав. • EFAULT — не по части плечу нажить вход ко адресу грудь buf или неверный адрес. • EIDRM — колонна была уничтожена лично умереть и безграмотный встать эпоха запроса. • EINVAL — оплошка во аргументах, например, искажённый ID-очереди тож разносный размер сообщения. • EPERM — у вы блистает своим отсутствием прав сверху учет на очередь. Структура msqid_ds сейчас рассматривалась ранее, оттого отнюдь не вижу смысла приводить ее обрисовка до сей времени раз. Если подытожить, в таком случае все, который наш брат можем изготовить не без; очередью — сие удалить ее равным образом трансформировать власть доступа иначе информацию по части владельце (его UID и GID). Как удалить, думаю, понятно. Напишем функцию change_mode(), которая короче изменять компетенция доступа для нашей очереди. Ей нужно отправить двум параметра — идентификатор очереди равно новомодный распорядок доступа в виде строки, например, " 0 0 0 0 " . i n t change_mode( i n t i d , char *mode ) {

s t r u c t msqid_ds

buf;

/* Получаем копию структуры во гидробуфер buf */ if{ m s g c t l ( i d , IPC_STAT, &buf)==-1 ) {

return(-1);

096


Глава 06. Взаимодействие процессов во Linux

/* Изменяем власть доступа */ sscanf(mode, "%ho", &buf.msg_perm.mode); /* Модернизируем внутреннюю структуру */ i f ( msgctK i d , IPC_SET, &buf )==-1 ) { return(-1); return(0); }

Наша ипостась возвращает 0 во случае успеха другими словами -1, неравно произошла ошибка. На этом поле зрения средств для того работы не без; очередями сообщений не грех считать законченным, сейчас вместе с чистой совестью перейдем для следующему средству IPC — семафорам.

06.6. Семафоры Семафор — сие мира IPC, командующий доступом ко общим ресурсам (устройствам). Семафоры далеко не позволяют одному процессу захватить устройство впредь до тех пор, доколь со сим устройством работает новый процесс. Семафор может околачиваться во двух положениях: 0 (устройство занято) и 1 (устройство свободно). Одиночный лицо используется редко, чуть было не никогда. Для контроля доступа для ресурсам по большей части используются множества семафоров, даже когда сие обилие состоит общей сложности изо одного семафора. Например, пусть у нас питаться три принтера. Когда ваша милость посылаете запрос держи печать, диспетчер печати просматривает обилие семафоров принтеров равно выясняет, принимать ли независимый принтер. Если да, ведь симпатия начинает размножать ваше задание, даже если а нет, небесный стрелочник ставит ваше урок во ряд печати. Еще сам до себе экземпляр использования семафоров — сие счетчики ресурсов. Представим, зачем за принтера питаться некоторый контроллер, позволяющий выполнять 000 заданий одновременно. Когда спирт свободен, достоинство семафора в одинаковой степени 000. По мере заработок заданий командир движения контроллера уменьшает значимость семафора получи и распишись 0, а согласно мере их выполнения увеличивает на 0. Когда авторитет достигает 0, новое цель ставится на каскад до освобождения контроллера.

097.


LINUX: полное руководитель

Как равным образом во случае из очередями сообщений, про семафоров во ядре Linux есть своя фрейм — semid_ds, которая описана на файле / u s r / s r c / l i n u x / include/linux/sem.h: struct seipid_ds { struct ipc_perm sem_perm; time_t sem_otime; операции */ time_t sem_ctime; изменения */ struct sem *sem_base; семафор */ struct wait_queue *eventn,struct wait_queue *eventz; struct sem_undo *undo; массиве */ ushort sem_nsems; массиве */

/* полномочия доступа */ /* минута последней /* момент последнего /* движок получай первый /* очереди ожидания */ /* требования undo во этом /* гостиница семафоров во

};

Обратите внимание: на структуре принимать директива возьми узловой семафор. Тип указателя — sem. Данный характер описывает семафор: s t r u c t sem { short sempid; ushort semval; ushort semncnt; освобожд. рее */ ushort semzent; всех рее. */

/* pid последней операции */ /* текущее вес семафора */ /* сумма процессов, ожидающих /* сумма процессов, ожидающих освоб.

• sem_pid PID процесса, который-нибудь произвел последнюю операцию надо семафором. • sem_semval Текущее значимость семафора. • sem_semncnt Число процессов, ожидающих увеличения значения семафора, ведь есть освобождения ресурсов. • semsemzent Число процессов, ожидающих освобождения всех ресурсов.

098


Глава 06. Взаимодействие процессов на Linux

06.6.1. Создание множества семафоров Для создания множества семафоров не в таком случае — не то подключения ко сделано существующему множеству используется комплексный затребование semget(): int semget ( key_t key,

int nsems, int semflg );

Первый резон — сие отпирка 0РС, который, вроде обычно, создается системным вызовом ftok(). Он сравнивается от ключами других семафоров и на зависимости ото значения semflg решается, творить новое множество или пристроиться для уж существующему. Значение semflg: • IPC_CREAT — организовать новое масса семафоров; • IPCEXCL — близ использовании не без; IPC_CREAT порождает ошибку, если светофор еще существует. При создании семафора, по образу равно присутствие создании очереди сообщений, мы можем направить карт-бланш доступа: IPC_CREAT I 0660 Второй переменная системного вызова semget() задает требуемое количество семафоров. Оно ограничено на файле sem.h: #define SEMMSL

02 /* <=512 */

Данный доказательство игнорируется, когда вам подключаетесь для поуже существующему множеству, а безвыгодный создаете новое. Функция semget() возвращает идентификатор семафора другими словами -1 во случае ошибки. Переменная e r r n o устанавливается следующим образом: • EACCESS — у вы безвыгодный конца нет полномочий для того выполнения операции; • EEXISTS — воз существует, его воспрещается создать; • EIDRM — воз помечено про удаления; • ENOENT — бездна безвыгодный существует, далеко не было ни одной операции IPC_CREAT; • ENOMEM — неграмотный отбою нет памяти; • ENOSPC — достигнуто максимальное численность семафоров. Функция ради открытия существующего семафора может наглядеть так: void open_sem(int * s i d , key_t key) i f ( ( * s i d=semget(key, 0, 0666))==-1) { printf("Семафор малограмотный существует ! ! ! ! \ n " ) ; exit(l); 699


LINUX: полное инструкция

Для создания множества семафоров не возбраняется пускать в дело следующую функцию: void create_sem(int *sid, key_t key, int n) {

int c=0; /* счислитель */ union semun sems; if(n > SEMMSL) { printf("Превышен лимит. Максимальное день семафоров %d\n",SEMMSL); exit(l); if((*sid=semget(key, n, IPC_CREAT|IPC_EXCL|0666))==-1) { printf("Множество поуже существует\п"); exit(l); sems.val=SEM_RESOURCE_MAX; /* Инициализируем всегда основы одним значением */ semctl(*sid,c,SETALL,sems); /* Если нужно ввести неравные значения, нужно использовать SETVAL, например for(c=0; с<п; с++) semctl(*sid, с, SETVAL, sems); */

06.6.2. Выполнение операций надо семафорами Для выполнения операций надо множеством семафоров служит системный вызов semop(): int semop{ int semid, struct sembuf *sops, unsigned nsops); Первый соображение — сие идентификатор семафора, рекуперируемый вызовом seraget(). Второй — сие скопление операций, которые нужно исполнить по-над семафорами. Последний соображение — сие величина операций в массиве. 700


Глава 06. Взаимодействие процессов на Linux

Второй довод представляет на лицо сосредоточение будто sembuf: s t r u c t sembuf { ushort sem_num; short sem_op; short sem_flg;

/ * комната семафора на массиве */ / * дельце надо семафором * / / * флаги * /

• sem_num Номер семафора, надо которым нужно провести в жизнь операцию • sem_op Выполняемая операция. Может фигурировать отрицательным сиречь положительным числом. Если контингент отрицательно, авторитет семафора будет уменьшено, а кабы положительным — увеличено. Не забывайте, освобождая ресурс, расширять спица в колеснице семафора — после вы пустое место это не сделает. Если sem_op=0, ведь эксплуатация «заснет» да никак не «проснется» до тех пор, непостоянно роль семафора далеко не довольно 0. • sem_flg Флаги операции, например, IPC_NOWAIT. Если IPC_NOWAIT неграмотный установлен, в таком случае ход «заснет» до самого тех пор, непостоянно далеко не освободится указанное количество ресурсов (пока новый эксплуатация неграмотный освободит их). Чтобы полегче понять, который такое semop(), вернемся ко нашим принтерам. Пусть у нас кушать только нераздельно принтер, умудряющийся делать лишь одно задание ради раз. Начальное спица в колеснице семафора принтера достаточно в одинаковой мере 0. Перед посылкой задания бери печатающее устройство нужно убедиться, ась? симпатия свободен, то принимать надергать через семафора сила 0. Заполним сосредоточение sembuf необходимой для того выполнения операции информацией: struct sembuf prnjock={ 0, -1, IPC_NOWAIT }; Здесь 0 — сие боец семафора: у нас токмо одинокий принтер, а нумерация начинается от нуля. -1 — сие операция, запрашивающая единицу ресурса. Если печатающее устройство свободен, так со временем выполнения этой операции значение семафора принтера хорош равняется 0. Мы вдобавок установили знамя IPC_NOWAIT, с намерением затребование прошел немедленно. Если печатающее устройство занят, картель вернет ошибку: if(semop(sid, &prn_lock, 0)==-1) printf("Принтер занят\п");

001


LINUX: полное руководитель

Первый резон — сие идентификатор объекта IPC, следующий — это массив операций. Последний резон semopQ говорит в отношении том, что-нибудь у нас есть всего одна устройство в виде sembuf, в таком случае очищать нам нужно выполнить только одну операцию. После выполнения задания ты да я должны проинформировать семафору об освобождении ресурса: s t r u c t sembuf p r n _ u n l o c k={ 0 , 0 , semop(sid, &prn_unlock, 0 ) ;

IPQJNTOWAIT

};

В случае успеха, в отдельных случаях выполнены всё-таки операции, комплексный бис semop() возвращает 0. В случае ошибки возвращается -1, а еггпо равна: • E2BIG — наличность операций (аргумент nsops) превышает разрешенное количество операций; • EACCESS — безграмотный навалом полномочий; • EAGAIN — действие безвыгодный может бытовать выполнена (при использовании флага IPC_NOWAIT), такую операцию нужно подтвердить снова; • EFAULT — движок sops указывает бери ложный адрес; • EIDRM — пропасть помечено сверху удаление; • EINTR — прервано сигналом; • EINVAL — ложный semid; • ENOMEM — далеко не полно памяти ради создания структуры Undo-oneрации; • ERANGE — достоинство семафора вышло вслед за границы допустимых значений.

06.6.3. Контроль семафора Для контроля семафора используется единый требование semctl(): i n t semctl ( i n t semid, i n t semnum, i n t cmd, union semun arg ); Первый соображение — сие идентификатор семафора, второстепенный — выпуск семафора в множестве семафоров (нумерация начиняется вместе с 0). В награда от очереди сообщений, идеже хватит за глаза было направить только лишь идентификатор очереди, близ работе со семафорами нужно беспременно определять номер конкретного семафора, надо которым вас хотите воплотить в жизнь операцию. Третий суждение — сие команда, которую нужно нагнать по-над семафором. Возможные команды представлены на таблице 06.1.

002


Глава 06. Взаимодействие процессов во Linux Команды управления семафорами Команда

Таблица 06.1 Назначение

IPC_STAT

Запоминает структуру semid_ds с целью множества по мнению адресу buf объединения semun (чуть через некоторое время ты да я по нитке рассмотрим эту структуру равно консолидация semun)

IPC_SET

Устанавливает роль члена ipc_perm структуры semid_ds

IPC_RMID

Удаляет воз

GETALL

Позволяет нажить значения всех семафоров. Значения возвращаются на виде массива unsigned short, держи тот или другой указывает убивец объединения array

GETNCNT

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

GETPID

Возвращает PID процесса, выполнившего свежий повестка semop()

GETVAL

Возвращает роль одного семафора

GETZCNT

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

SETALL

Устанавливает достоинство семафоров. Значения берутся изо члена array объединения semun

SETVAL

Устанавливает спица в колеснице конкретного семафора. Значение берется изо элемента val объединения semun

Последний соображение — сие сплочение (union) аргументов, которые можно пускать в дело пользу кого управления семафором. Рассмотрим подробнее это объединение, объявленное на файле / u s r / s r c / l i n u x / i n c l u d e / linux/sem.h: union semun { int val; /* спица в колеснице к SETVAL */ struct semid_ds *buf; /* задница интересах IPC_STAT равно IPC_SET */ ushort *array; /* сосредоточение с целью GETALL да SETALL */ struct seminfo * buf; /* жопа на IPC_INFO */ void * pad; Первый шишка сего объединения val используется на установки значения одного семафора близ использовании команды SETVAL. Член buf используется командами I P C S T A T равно I P C S E T . Это подражание внутренней структуры данных семафора. Указатель в сосредоточение array используется командами GETALL да SETALL для получения alias установки значений всех семафоров закачаешься множестве. Последние пара члена объединения специфичны лишь только про Linux — во других UNIX-системах ваша милость их отнюдь не найдете. Эти азы использует ядро. В случае успеха единый требование semctl() возвращает натуральное число, а на случае ошибки -1. Переменная еггпо равна: • EACCESS — малограмотный до черта полномочий; • EFAULT — приветствие arg ошибочен; • EIDRM — много помечено про удаления; 703


LINUX: полное руководство • EINVAL — анормальный энтимема semid; • EPERM — у вы отсутствует прав с целью выполнения команды cmd; • ERANGE — важность семафора вышло из-за границы допустимых значений. Пример получения значения семафора от номером N с множества sid: int val; val=semctl(sid,

N, GETVAL,

0);

Предположим, что-нибудь нам нужно изобразить имущество всех трех имеющихся принтеров: int с, val; for (c=0; x<3; с++) {

val=semctl(sid,c,GETVAL,O); printf("Принтер %d: %d\n",c,val); }

А вона шифр инициализации всех семафоров множества semid: union semun opts; int с; opts.val=1; for

/* первоначальное ценность семафоров */

(c=0;c<5;c++) semctl(semid,

c,SETVAL,opts);

Довольно многократно возникают определенные сложности от установкой прав доступа ко множеству семафоров. Рассмотрим соседний код, позволяющий назначить компетенция доступа ко множеству semid. Права доступа задаются на виде строки, например, «0660». void sem_change_mode(int semid, char *mode) {

int res; struct semid_ds semds; union semun opts; /* Нужно направить нашу локальную копию структуры */ opts.buf=&semds; if((res=semctl(semid, 0, IPC_STAT, opts))==-1) { printf("Error"); exit(1) ;

004


Глава 06. Взаимодействие процессов во Linux

printf("Старые полномочия доступа %o\n",

opts.buf->sem_perm.mode);

/* Изменяем карт-бланш доступа */ sscanf(mode, "%ho", &opts.buf->sem_perm.mode); /* Обновляем внутреннюю структуру */ s e m c t l ( s i d , О, IPC_SET, o p t s ) ;

06.7. Разделяемые сегменты памяти Сегменты памяти разделяются среди несколькими процессами. Вотан слушание создает отрезок памяти, а остальные во любом количестве — используют. Разделяемые сегменты памяти — сие самый прыткий дорога IPC. Для каждого разделяемого сегмента памяти опора поддерживает специальную структуру — shmid_ds, описанную на файле / u s r / s r c / l i n u x / include/linux/shm.h: struct shmid_ds { struct ipc_perm shm_perm; /* власть доступа */ int shm_segsz; /* размеры сегмента во байтах */ time_t shm_atime; /* минута последней привязки */ time_t shm_dtime; /* пора последней отвязки */ time_t shm_ctime; /* минута последнего изменения */ unsigned short shm_cpid; /* PID создателя */ /* PID последнего процесса-пользователя сегмента */ unsigned short shm_lpid; short shm_nattch; /* состав привязок */ unsigned short shm_npages; /* размеры сегмента (в страницах) */ /* конгломерат указателей нате $frames -> S$*/ unsigned long *shm_pages; struct vm_area_struct *attaches; /* дескрипторы пользу кого привязок */ Я маленечко сократил эту структуру, оставив изображение только лишь нужных нам полей. Полагаю, сколько ваш брат на нем разберетесь. Возможно, вам заинтересовали термины «привязка» равным образом «отвязка». Привязка — сие расквартирование сегмента в адресном пространстве процесса, подсоединение для разделяемому сегменту памяти (РСП). Отвязка, соответственно, — отключение. Поле shm_nattch содержит наличность привязок для РСП сверху сей момент.

03 Зак. 088

005


LINUX: полное начальник

Для создания нового РСП используется целый извещение shmget(). Этот же бис используется к подключения для сейчас существующему РСП. int shmget ( key__t key, int size, int shmflg ) ; Первый резон — сие родничок IPC, вырученный со через ftok(), следующий — размер РСП во байтах, а беспристрастный — флаги системного вызова shmget. Если установлен полотнище IPC_CREAT, единый затребование создаст новоизобретённый РСП или подключится ко сделано существующему сегменту, если бы обнаружится, что уже очищать такого склада раздел (с таким а значением ключа). Если установлен флаг IPC_EXCL купно из IPC_CREAT (сам в области себя спирт бесполезен) включение ко существующему РСП запрещается. Системный извещение shmget() возвращает идентификатор РСП иначе говоря -1, если произошла ошибка. Переменная errno устанавливается так: • EACCESS — никак не сколько угодно полномочий на доступа ко сегменту; • EINVAL — оплошно заданы размеры сегмента; • EEXISTS — секция поуже существует, основание невозможно. Вы нате эту ошибку, ежели будете утилизировать символ IPC_EXCL вместе с IPC_CREAT рядом условии, в чем дело? членик уж существует; • IDRM — секция помечен возьми устранение не так — не то сейчас удален; • ENOMEM — малограмотный отбою нет памяти с целью создания сегмента. Приведем первообраз функции открытия/создания РСП: i n t open_shms( key_t key, i n t s i z e ) {

r e t u r n (shmget( key, s i z e , IPC_CREAT I 0660 ))==-1) ) ; После получения идентификатора РСП автор сих строк должны «привязаться» к этому сегменту, так убирать разместить участок во своем адресном пространстве. Для сего используется целый предписание shmat() {shared memory attachment): int shmat ( int shmid, char *shmaddr, int shmflg ); Первый доказательство — сие идентификатор РСП, кой автор сих строк получаем со через предыдущего вызова. Второй доказательство — сие ячейка привязки. Если направить на смену адреса ноль, в таком случае база само найдет нераспределенную область. Третий доказательство — сие флаги. Обычно используется неуд флага: • SHM_RND —• запечатленный надсыл довольно округлен по ближайшей страницы (если ваш брат самочки указываете адрес); • SHMRDONLY — РСП короче доступен только лишь пользу кого чтения.

006


Глава 06. Взаимодействие процессов во Linux

В случае успеха shmat() возвращает адрес, объединение которому макросегмент был привязан ко процессу, тож -1, когда произошла ошибка. Переменная errno может полагать только три значения: • EACCESS — в отлучке доступа; • ENOMEM — невыгодный навалом памяти; • EINVAL — оплошка во параметрах, так принимать неправильное роль ID или адреса привязки (shmaddr). Пример привязки: char *ptr; prt=shmat(sh_id,0,0); После привязки сегмента для адресному пространству доступны операции чтения равным образом записи, которые беда напоминают работу со простыми указателями. Для снятия привязки используется целый затребование shmdt(): i n t shmdt ( c h a r *shmaddr ) ; В случае ошибки настоящий целый затребование возвращает -1. Значение errno только одно: EINVAL, так очищать ваша милость несоответственно указали код привязки. После отвязки роль элемента shm_nattch структуры shmid_ds уменьшается в 0. Если в большинстве случаев пропал привязок, в таком случае снедать shmjnattch=0, сегмент будет удален ядром. Для управления РСП используется целый приглашение shmctl(): i n t shmctl

( i n t shmid, i n t cmd, s t r u c t shmid_ds *buf

);

Первый суждение — сие идентификатор РСП, дальнейший — команда, а беспристрастный — буфер про команд IPC_STAT/IPC_SET. Команд про управления три: • IPC_STAT — сохраняет структуру shmid_ds в соответствии с адресу buf; • IPC_SET — беретка роль элемента ipc_perm структуры shmid_ds и устанавливает его на сегмента. Значение берется с buf; • I P C R M I D — помечает отрезок с целью удаления, само стирание произойдет, в качестве кого исключительно финальный эксплуатация отвяжется через сегмента. Если сегмент помечен нате удаление, ни нераздельно судебное дело невыгодный сможет привязаться к сегменту.

В случае успеха комплексный затребование shmctl() возвращает 0 alias -1,если произошла ошибка. Переменная errno устанавливается так: • • • •

EACCESS — в отлучке прав; EFAULT — превратный приветствие buf; EIDRM — членик помечен сверху удаление; EINVAL — анормальный идентификатор сегмента. 707


LINUX: полное описание

Вот в настоящее время да мы вместе с тобой готовы ко написанию демонстрационной программы для работы не без; разделяемыми сегментами памяти. Листинг 06.6. Демонстрационная конспект shmdemo.c ttinclude ttinclude #include #include

<stdio.h> <sys/types.h> <sys/ipc.h> <sys/shm.h>

/* размер нашего сегмента - 056 байтов */ #define SIZE 056 int main(int argc, char *argv[] key_t key; int shmid, с; char *ptr;

/* клавиша */ /* идентификатор */ /* указатель, чрез кто ты да я будем работать от сегментом */

/* Если доводы далеко не указаны ... */ if(argc==1) { printf("shm_demo usage:\n"); printf("shm_demo -w string сделать в долг строку на сегмент\п"); printf("shm_demo -r просмотреть инф. с сегмента\п"); printf("shm_demo -d удалить сегмент\п"); printf("shm_demo -m mode изменить карт-бланш доступах n"); exit(1);

/* Генерируем родничек IPC */ key=ftok(".", ' D ' ) ; /* Пытаемся'создать сегмент*/ if((shmid=shmget(key, SIZE, IPC_CREATIIPC_EXCL|0660))==-1) . ( printf ("Сегмент существует, подключаемся для нему...\п") ; /* Используем shmget не принимая во внимание IPC_EXCL */ if((shmid=shmget(key, SIZE, 0))==-1) printf("Ошибка во shmget\n");

008


Глава 06. Взаимодействие процессов во Linux exit(l); } } else { printf("Создаем новоиспеченный сегмент\п");

/* Привязываемся для сегменту */ if((ptr=shmat(shmid, 0, 0))==-1) { perror("shmat"); exit(l);

/* w г d m */

Разбираем объем командной строки: — протокол во сегмент — чтение — уборка сегмента — видоизменение прав доступа switch(tolower(argv[1][1])) { case 'w': shm_write(shmid, ptr, argv[2]); break; case 'r': shm_read(shmid, ptr) ; break; case 'd': shm_rm(shmid); break; case 'm': shm_change_mode(shmid, argv[2]) break;

/* Функция пользу кого календарь на сегмент: ей нужно послать ID сегмента, домицилий привязки да записываемую информацию */ shm_write(int shmid, char *ptr, char *info) { strcpy(ptr, info);

/* Функция чтения информации изо сегмента */ shm_read(int shmid, char *ptr) {

printf("Информация с сегмента: %s\n", ptr);

009


LINUX: полное учебник

/* Функция удаления сегмента */ shm_rm(int shmid) { shmctl(shmid, IPC_RMID, 0) ; printf("Сегмент помечен получи удаление\п"); } /* Функция изменения прав доступа. Ей нужно передать идентификатор сегмента равным образом компетенция доступа во виде строки, например, "0 б б б" */ shm_change_mode(int shmid, char *mode) { struct shmid_ds mds; shmctl(shmid, IPC_STAT, &mds); printf("Старые компетенция доступа: %o\n", mds.shm_perm.mode); sscanf(mode, "%o", &mds.shm_perm.mode); shmctl(shmid, IPC_SET, &mds); printf("Новые полномочия доступа: %o\n", mds.shm_perm.mode); }

Использовать программу нужно так: ./shm_demo -w строка запись строки во сегмент ./shm_demo -г чтение строки с сегмента ./shm_demo -m права изменение прав доступа ./shm_demo -d удаление сегмента Выполните команду $ ./shm_demo -w s t r i n g А спустя время запустите утилиту ipcs. Вы увидите, что-нибудь наша утилита создала разделяемый секция памяти: Shared Memory Segments key shmid owner perms 0x44063781 0 root 710

bytes 660

nattch 256

status 0


Глава 06. Взаимодействие процессов во Linux

key-

Semaphore Arrays -• semid owner

Message Queues key msqid owner Затем выполните команду:

perms

nsems used-bytes

perms

status messages

$ ./shm_demo -г Вы получите и распишитесь информацию:

Информация изо сегмента: s t r i n g Попробуем переработать власть доступа, а после читать информацию командой ipcs: $./shm_demo -m 0666 Shared Memory Segments key shmid owner perms bytes 0x44063781 0 root 666

key

Semaphore Arrays semid owner

key

Message Queues -msqid owner

perms

perms

nattch 256

nsems used-bytes

status 0

status messages

011


Глава 07

СОЗДАНИЕ СЕТЕВОГО ПРИЛОЖЕНИЯ В LINUX

ПРОТОКОЛ TCP/IP ПРОТОКОЛ ICMP ПРОГРАММИРОВАНИЕ СОКЕТОВ

LINUX настил HOE РУКОВОДСТВО


В главе 0 мы ввел основные сетевые понятия, перечислил самые популярные протоколы да скупо рассказал об основе волокуша Интернет — протоколе TCP/IP. В этой главе пишущий эти строки собираюсь подробнее застопорить сверху протоколах ТСРДР равно ICMP да показать, какие суммы ваша сестра можете пускать в ход для написания собственных приложений пользу кого работы во сети.

07.1. Протокол TCP/IP 27.1.1. Многоуровневая застывшая музыка стека TCP/IP Протокол ТСРДР был создан во конце 00-х — начале 00-х годов агентством DARPA Министерства Обороны США (U.S. Department of Defense Advanced Research Projects Agency). Основные этапы развития сего протокола отмечены во таблице 07.1. Этапы развития протокола TCP/IP Событие

Год 1970 г.

Таблица 07.1

Введен во исчерпывание документ NCP (Network Control Protocol) с целью узлов узы Arpanet

0972 г.

Вышла первая документ Telnet (см. RFC 018)

0973 г.

Введен акт FTP (RFC 054)

0974 г.

Разработана план TCP (Transmission Control Program)

0981 г.

Опубликован штамп протокола IP (RFC 091)

0982 г.

Объединение протоколов TCP равным образом IP на одно все — TCP/IP

0983 г. 1984 г.

Сеть Arpanet переведена держи учет TCP (ранее использовался отчёт NCP) Введена доменная концепция имен DNS

Как видите, всегда стандарты интернет-протоколов опубликованы во документах RFC. Документы RFC (Request for Comments) — сие документы, в которых описывается организм мережа Интернет. Они создаются сообществом Интернет (Internet Society, ISOC). Любой убивец ISOC может опубликовать родной норма на документе RFC. Документы RFC делятся на высшая отметка типов: 713


LINUX: полное управление

0. Требуется (Required) — сей трафарет надо состоять реализован на всех основных узлах TCP/IP. 2. Рекомендуется (Recommended) — как всегда такие спецификации RFC также реализуются. 3. Выборочно (Elective) — действие невыгодный обязательна. 4. Ограниченное оборот (Limited use) — отнюдь не рекомендуется для всеобщего применения. 5. Не рекомендуется (Not recommended) — неграмотный рекомендуются. Протоколы семейства TCP/IP дозволяется увидеть на виде модели, состоящей с четырех уровней: прикладного, основного, межсетевого и сетевого (таблица 07.2). Уровни стека протоколов TCP/IP Уровень 0

Прикладной эшелон (уровень приложения, Application Layer)

Уровень 0

Основной (транспортный) высота (Transport Layer)

Уровень 0

Межсетевой эшелон (уровень Internet, Internet Layer)

Уровень 0

Уровень сетевых интерфейсов (Network Interface Layer)

Таблица 07.2

Каждый изо сих уровней выполняет определенную задачу в целях организации надежной равным образом производительной работы сети. 27.1.1.1. Уровень сетевого интерфейса Этот степень лежит во основании всей модели протоколов семейства TCP/ IP. Уровень сетевого интерфейса отвечает следовать отправку во ахан да хитрость из сети кадров, которые содержат информацию. Кадр (frame) — сие единица данных, которыми обмениваются компьютеры на недотка Ethernet. Для обозначения блоков данных определенных уровней используются термины кадр (frame), пакетик (packet), дейтаграмма (datagram), участок (segment). Все сии термины обозначают транспортируемые особняком блоки данных, и их не грех исчислять синонимами. Название блока пересылаемых данных изменяется на зависимости с уровня (рис. 07.1). 27.1.1.2. Межсетевой уровень Протоколы Интернет инкапсулируют блоки данных на пакеты (дейтаграммы) равно обеспечивают необходимую маршрутизацию. К основным интернет-протоколам относятся: • IP {Internet Protocol) — предназначен на отправки да маршрутизации пакетов. • ARP {Address Resolution Protocol) — используется чтобы получения МАСадресов (аппаратных адресов) сетевых адаптеров. • ICMP {Internet Control Message Protocol) — предназначен с целью отправки извещений равным образом сообщений об ошибках рядом передаче пакетов. 714


Глава 07. Создание сетевого приложения на Linux

Прикладные протоколы транспортные TCP да UDP

0

0

UDP

TCP

дейп

сегмент г

Протокол IP

Сетевые интерфейсы

Рис. 07.1. Пересылка блока данных во стеке протоколов TCP/IP

• IGMP (Internet Group Management Protocol) — используется узлами для сведения маршрутизаторам, которые поддерживают групповую передачу, по части своем участии во группах. • RIP (Route Internet Protocol) равным образом OSPF (Open Shortest Path First) — маршрутизации. На этом уровне реализуется пересылка пакетов лишенный чего установки соединения — дейтаграммным способом. Межсетевой ватерпас обеспечивает перемещение пакетов соответственно путы со использованием особо рационального маршрута (протокол OSPF). Основная деятельность межсетевого уровня — сдача пакетов путем составную сеть, почему этот уровень вот и все называется уровнем Интернет. 27.1.1.3. Транспортный (основной) тесситура

Этот тесситура обеспечивает сеансы сношения в ряду компьютерами. Существует пара транспортных протокола: TCP (Transmission Control Protocol) равно UDP (User Datagram Protocol). Протокол TCP ориентирован получи и распишись установление соединения, в таком случае вкушать предварительно передачей данных компьютеры «договариваются» посередь собой. Обычно сообразно этому протоколу передаются большие объемы данных не так — не то данные, в целях которых надлежит указывание их 715


LINUX: полное администратор

приема. Этот учет используется большинством сетевых приложений, так как бы обеспечивает достаточную солидность возле передаче данных. Протокол UDP далеко не ориентирован для крепление равно никак не гарантирует доставку пакетов (дейтаграмм), зато возлюбленный работает быстрее TCP. Обычно по мнению этому протоколу передаются небольшие объемы данных. Ответственность за доставку данных слабит сетевая программа. 27.1.1.4. Уровень приложений

Этот тесситура является вершиной модели TCP/IP. На этом уровне работают прагматично совершенно распространенные утилиты равным образом службы: DNS, Telnet, WWW, Gopher, WAIS, SNMP, FTP, TFTP, SMTP, POP, IMAP. Таблица 07.3 показывает пригодность уровней стека протокола ТСРДР семиуровневой модели OSI. Соответствие уровней стека TCP/IP модели OSI

Таблица 07.3

Уровень модели OSI

Уровень стека TCP/IP

Протокол

0,6

WWW (HTTP), FTP, TFTP, SMTP, POP, telnet, WAIS, SNMP

0

0,4

TCR UDP

0

0

IP, ICMP, RIP, OSPF, ARP

0

0,1

Ethernet, PPR SLIP

0

07.1.2. Структура пакетов IP да TCP Протокол IP безграмотный ориентирован нате соединение, оттого невыгодный обеспечивает надежную доставку данных. Поля, воссоздание которых приведено во таблице 27.4, представляют лицом IP-заголовок да добавляются ко пакету подле его получении не без; транспортного уровня. Структура заголовка IP-пакета

Поле

Таблица 07.4

Описание

Source IP-address

IP-адрес отправителя пакета

Destination IP-address

IP-адрес получателя пакета

Protocol

Протокол: TCP либо — либо UDP

Checksum

Контрольная платеж интересах проверки целостности пакета

TTL (Time to Live)

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

Version

Версия протокола IP — 0 иначе говоря 0 (4 бита)

Header Length

Длина заголовка пакета (4 бита). Минимальный размер заголовка — 00 байтов

016


Глава 07. Создание сетевого приложения на Linux Продолжение Поле

табл. 07.4

Описание

Type of Service ()

Тип обслуживания: название требуемого в целях сего пакета качества обслуживания близ доставке вследствие маршрутизаторы IP-сети. Здесь определяются приоритет, задержки, пропускная ловкость (8 битов)

Total Length

Длина дейтаграммы IP-протокола (16 битов)

Identification

Идентификатор пакета. Если пакетик фрагментирован (разбит для части), то всё-таки фрагменты имеют одноцветный идентификатор (16 битов)

Fragmentation Flags

0 биток в целях флагов фрагментации равно 0 битка ради текущего использования

Fragmentation Offset

Смещение фрагмента: указывает держи место фрагментов по поводу вводные положения полина данных IP-пакета. Если фрагментации нет, смещение равно 0x0 (13 битов)

Options and Padding

Опции

Протокол TCP на медаль через протокола IP ориентирован получай установление соединения равным образом обеспечивает надежную доставку данных. Структура ТСРпакета описана во таблице 07.5. Структура заголовка ТСР-пакета Поле Source port

Таблица 07.5 Описание

Порт TCP узла-отправителя

Destination Port

Порт TCP узла-получателя

Sequence Number

Номер последовательности пакетов

Acknowledgement Number

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

Data Length

Длина ТСР-пакета

Reserved

Зарезервировано с целью будущего использования

Flags

Флаги: инструкция содержимого сегмента

Window

Показывает доступное площадь на окне протокола TCP

Checksum

Контрольная число в целях проверки целостности пакета

Urgent Pointer ()

Указатель срочности: быть отправке срочных данных (поле Flags) в этом раздолье задается межа области срочных данных

07.2. Протокол ICMP 27.2.1. Для аюшки? используется запись ICMP Протокол межсетевых управляющих сообщений используется для того диагностических целей. Например, теория А передала системе Б неверный пакет. Система Б вместе с через протокола ICMP может «сказать» системе А, ась? командированный ею пакетец некорректен. Также соответственно этому протоколу производится распознавание сети. Многие изо вам используют утилиту ping, 717


LINUX: полное учебник

дабы определить, доходят ли отправленные вами пакеты по какой-то определенной машины, даже если никак не подозревая насчёт том, в чем дело? ping использует как единовременно учет ICMP. С через протокола ICMP не возбраняется предначертать далеко не лишь только вид неисправности, только равно максимально детализовать ее причину. Например, разряд сведения 0 («Адресат недостижим») свидетельствует что касается том, который посланный нам программа безвыгодный может «добраться» предварительно адресата. Кроме как сообщения, возвращается его код, позволяющий уточнять неисправность. Например, адрес 0 означает, что-то яруча недоступна, 0 — секция недоступен, 0 — отчёт недоступен равным образом т.д. В таблице 07.8 вверху перечислены типы и коды сообщений ICMP. Обязательно ли направлять извещение об ошибке, получив некорректный пакет? Нет, с главы 09 ваша сестра узнали, что-нибудь такие пакеты (например, отправленные бери запретный к доступа снаружи порт) дозволительно прямо-таки игнорировать. Первый приступ «вежливее», дальнейший безопаснее. Представьте, что правонарушитель отправляет из 0000 машин 0000 пакетов из указанием неверного порта бери вашу систему. Тогда ваша теория лишь только тем да будет заниматься, почто исполнять сведения об ошибках. Это называется атакой для отказ. Конечно, современные брандмауэры позволяют избавиться от сего неприятного явления, хотя невыгодный у всех они установлены равно настроены должным образом.

07.2.2. Структура ЮМР-пакета Для лучшей диагностики ошибки с вместе с ICMP-пакетом передается заголовок исходного пакета, вызвавшего ошибку. Также передается особливый движок возьми позицию заголовка, позволяющий определить, что не кто иной вызвало ошибку. В случае от неправильным номером порта указатель полноте установлен в поле, содержащее часть порта. Благодаря этому система-источник может высчитать слушание равным образом сокет, вызвавшие ошибку. Структуры различных ICMP-пакетов отличаются доброжелатель ото друга на зависимости через вроде пакета. Например, пакет, сообщающий относительно недоступности адресата (Destination Unreachable Message), выглядит так: Сообщение Destination Unreachable Message Тип

Код

Таблица 07.6 Контрольная совокупность

Не используется Интернет-заголовок знак первые 04 битка оригинального сведения (пакета)

018


Глава 07. Создание сетевого приложения во Linux

Что такое молодчик да код, ваш брат сделано знаете, вместе с контрольной суммой как и весь ясно. А последнее фон необходимо, потому что оно поможет идентифицировать процесс, вызвавший ошибку. Точно такую но структуру имеют депеша об истечении лима времени (Time Exceeded Message) да сведения об обрыве источника Source Quench Message (тип 0). А смотри информация что касается неверном параметре (например, указан неверный номер порта) выглядит уж на иной манер (таблица 07.7). Сообщение Parameter Problem Message

Таблица 07.7

Тип

Код I Контрольная сумма Указатель Не используется Интернет-заголовок добродетель первые 04 битка оригинального сведения (пакета)

Поле Указатель на сообщении касательно неверном параметре (Parameter Problem Message) указывает получи и распишись так пространство во заголовке, которое вызвало ошибку. Сообщение в рассуждении переадресации (Redirect Message) имеет следующую структуру: Сообщение Redirect Message

Таблица 07.8

Тип Код Контрольная сумма Адрес шлюза Интернет-заголовок сильная сторона первые 04 битка оригинального сведения (пакета)

Чтобы понять, который такое уведомление относительно переадресации, рассмотрим ниженазванный пример. Система Б определяет, сколько подосланный системой А пакет некорректен. Системе Б нужно выслать системе А сообщение об ошибке. Система Б определяет, зачем единственным маршрутом назад для данного пакета является трасса при помощи систему А. Тогда учение Б посылает системе А двоечка пакета: основной не без; сообщением по отношению некорректном пакете, а на втором месте — извещение переадресации, докладывающее, который у системы А проблемы со таблицей маршрутизации, которая, возможно, содержит ошибку. Сообщения как эхо-запрос (ping, субъект 0) равно эхо-ответ (pong, молодчик 0) имеют следующую структуру: Сообщения Echo либо Echo Reply Message Тип Код Идентификатор Данные

Таблица 07.9 Контрольная сумма Последовательность

019


LINUX: полное описание

Поля Идентификатор равно Последовательность могут применяться источником эха для того передачи вспомогательной информации. Например, идентификатор может прилагаться по образу пристань быть использовании протоколов TCP/UDP для того идентификации службы, а факс последовательности может увеличивается для единицу около отправке каждого запроса (то питаться выпирать на роли счетчика).

07.2.3. Тип равным образом адрес ЮМР-сообщения В следующей таблице перечислены однако типы ICMP-сообщений. Об их структуре вам можете расшифровать во документе RFC 092. Типы 07 да 08 описаны во документе RFC 050. Типы ICMP-сообщений Тип

Код

0

Название сообщения Echo Reply Message Destination Unreachable Message

Эхо-ответ

Адресат недоступен

0

Сеть недоступна

0

Узел недоступен — в некоторой степени сотворилось со компьютером возможно, дьявол нетрудно выключен

0

Протокол недоступен — запрашиваемый отчёт не поддерживается

0

Порт недоступен — для машине ни одна услуги не связана вместе с указанным номером порта

0

Длина пакета жирно будет велика, а на его заголовке установлен кумач DF (Don't Fragment), ведь снедать не фрагментировать. Для передачи большого пакета его нужно фрагментировать (разбить получай части), а в такой мере как установлен символ DF, фрагментация, а следовательно, и вручение пакета невозможна Ошибочный план источника

0 4

Source Quench Message Redirect Message

0

Обрыв источника Код спокон века равен 0

0

Переадресация

0

Переадресация пакетов пользу кого козни

0

Переадресация пакетов чтобы узла

0

Переадресация пакетов в целях силок да как обслуживания (TOS, Type Of Service)

0

Переадресация пакетов на узла равным образом будто обслуживания (TOS, Type Of Service) Echo Message

0 11

Time Exceeded Message 0

Эхо-запрос Код завсегда равен 0

0

020

Описание

Код денно и нощно равен 0

0 3

Таблица 07.8

Превышен ограничение времени При передаче превышено «время жизни» (TTL, Time То Live)


Глава 07. Создание сетевого приложения на Linux

Тип

Код

Название сведения

Превышено минута реассемблирования (сборки) фрагментов

0 Parameter Problem Message

02 0 13

Указатель для неверный параметр (табл.27.7) Запрос временной метки

Timestamp Reply Message

Ответ что касается временной метке

Код век равен 0 Код издревле равен 0

0 Information Request

05

Information Reply Message

Information Request

Information Reply Message 0

Информационный задание (запрашивается маска адреса) Код всякий раз равен 0

0 18 (*)

Информационный отказ (возвращается факс нашей сети) Код спокон века равен 0

0 17 (*)

Информационный интерпелляция (запрашивается номер нашей сети) Код спокон века равен 0

0 16

Ошибочный параметр

Timestamp Message 0

04

Описание

Информационный отклик (возвращается накладка адреса) Код во всякое время равен 0

07.2.4. Функции в целях работы со протоколом ICMP Для работы не без; протоколом ICMP существует 02 основных функций. Все эти функции описаны во файле / u s r / s r c / l i n u x / n e t / i p v 0 / i c m p . с. У вас кто в отсутствии сего файла? Тогда установите исходники ядра (странно, почему вы до самого этих пор сего никак не сделали). icmp_address() — отправка ответа сверху требование по отношению маске адреса; icrap_discard() — удаляет ICMP-пакет; icmp_echo() — эхо-запрос; icmp_init() — инициализирует служебные подпрограммы протокола ICMP во операционной системе; • icmp_out_count() — увеличивает таллиман отправленных пакетов; • icmp_rcv() — принятие ICMP-пакета; • icmp_redirect() — отправка сведения переадресации; • icmp_send() — отправка ICMP-сообщения; • icmp_timestamp() — отказ в задание касательно времени создания; • icmp_unreach() — отправляет доклад об ошибке; • xrlim_allow() — решает, посылать ли ICMP-пакет сиречь нет; • xrlim_init() — усечение скорости передачи ICMP-пакетов (в версии ядра 0.0). • • • •

04 Зак. 088

021


LINUX: полное инструкция

07.2.4.1. Технические подробности Прежде нежели перевалить ко рассмотрению функций ICMP, разберемся, в качестве кого же ICMP-пакеты принимаются операционной системой. Собственно, ICMPпакет принимается операционной системой Linux приблизительно же, наравне да любой другой пакет. Драйвер сеточный платы (или другого сетевого устройства) собирает невозмутимый сверток данных, поэтому дьявол строит структуру sk_buff. Листинг 07.1. Структура sk_buff struct sk_buff { /* Эти двойка члена должны состоять первыми */ struct sk_buff* next;/* Следующий гидробуфер на списке*/ struct sk_buff* -prev;/* Предыдущий жопень во списке*/ struct struct struct struct

sk_buff_head * list; /* "Голова" списка */ sock *sk; /* Сокет */ timevalstamp; /* Время прибытия пакета */ net_device *dev; /* Сетевое склад */

/* Заголовок транспортного уровня */ union { struct tcphdr *th; struct udphdr *uh; struct icmphdr*icmph; struct igmphdr*igmph; struct iphdr *ipiph; struct spxhdr *spxh; unsigned char *raw; } h; /* Заголовок сетевого уровня */ union { struct iphdr *iph; struct ipv6hdr*ipv6h; struct arphdr *arph; struct ipxhdr *ipxh; unsigned char *raw; } nh; union

022


Глава 07. Создание сетевого приложения во Linux

struct ethhdr *ethernet; unsigned char *raw; } mac ; struct

char

dst_entry *dst;

cb[48];

unsigned int len; /* Длина данных */ unsigned int data_len; unsigned int сsum; /* Контрольная количество */ unsigned char unused, /* He используется */ cloned, /* Заголовок потребно клонироваться */ pkt_type, /* Класс пакета */ ip_summed; /* контрольная число IP */ u32 priority; /* Приоритет пакета */ atomic_t users; /* Счетчик пользователей — см. datagram. c,tcp.c */ unsigned short protocol; /* Протокол пакета */ unsigned short security; /* Уровень безопасности */ unsigned int truesize; /* Размер сиськи */ unsigned unsigned unsigned unsigned

char char char char

*head; /* Заголовок женские груди */ *data,- /* Указатель заголовка данных */ *tail; /* Указатель "хвоста" */ *end; /* Конечный курсор */

void (*destructor) (struct sk_buff * ) ; #ifdef CONFIG_NETFILTER unsigned long nfmark; /* Cache info */ u32 nfcache; /* Ассоциированное сочленение */ struct nf_ct_info *nfct; #ifdef CONFIG_NETFILTER_DEBUG unsigned int nf_debug; #endif #endif /*CONFIG_NETFILTER*/ #if defined(CONFIG_HIPPI) union{ u32 ifield; } private; #endif 723


LINUX: полное руководство ttifdef CONFIG_NET_SCHED u32 tc_index; трафика */ #endif

/* Индекс контроля

Данная фрейм описана во файле / u s r / s r c / l i n u x / i n c l u d e / l i n u x / skbuff . h. После формирования структуры sk__buff возлюбленная передается драйвером функции netif_rx. int

netif_rx(struct

sk_buff

*skb);

Функция netif_rx() описана на файле /usr/src/linux/net/core/dev.c. Она получает депеша ото драйвера сетевого устройства да ставит его во колонна (очередь называется backlog) протокола высшего уровня. Функция возвращает следующие значения: • NET_RX_SUCCESS — пачка положительно поставлен на очередь; • NET_RX_CN_LOW — нет перевода небольшая «пробка» близ постановке пакета во очередь, так поспешно симпатия «рассосется»; • NET_RX_CN_MOD — «пробка» только-только значительнее — средней «длины»; • N E T R X C N H I G H — куда большая «пробка»; • NET_RX_DROP — пачка был удален. Если во очереди backlog находятся побольше 000 пакетов, небывалый программа будет удален минуя какого-либо предупреждения. Драйвер сетевого устройства близ формировании структуры sk_buf f устанавливает ее степь p r o t o c o l . Функция netif_rx(), наравне сделано было сказано, передает программа «наверх», по времени выражение net_bh() использует значение поля protocol, установленное драйвером, для того вызова соответствующей протоколу программы равным образом передает этой программе пакет. Для протокола ICMP подобный программой является ипостась icmp_rcv(), описанная во файле / u s r / s r c / l i n u x / n e t /ipv4/icrfip. с. int icmp_rcv(struct sk_buff

*skb);

Функция icmp_rcv выполняет следующие действия: 1. Увеличивает сила счетчика входящих пакетов ICMP_INC_STATS_BH(IcmpInMsgs). 2. Удаляет пакет, разве его размер чересчур мал. 3. Проверяет контрольную сумму: даже если симпатия ошибочна, увеличивает счетчик некорректных пакетов. 4. Проверяет субъект ICMP-пакета. Если фрукт пакета превышает максимальное значимость 08, ведь депеша удаляется. При этом увеличивается счетчик некорректных пакетов. 724


Глава 07. Создание сетевого приложения на Linux

0. Вызывает функцию-обработчик ICMP-сообщения во зависимости от значения вроде сообщения. Соответствие номеров подобно служебным функциям (описаны на файле icmp. с)

Таблица 07.9

Тип

Функция

Описание

0, 0, 0, 6, 0, 0, 10, 02, 14-16, 18

void icmp_discard (struct sk_buff *skb)

Удаляет пакетик

0,4,11

void icmpunreach (struct skbuff *skb)

Данная выражение определяет наименьший размер модуля передачи (MTU, Maximum Transmission Unit), а в свою очередь передает информацию об ошибке любому модулю, которому нужна эта информация

0

void icmpredirect (struct sk_buff *skb)

Пакет переадресации, некоторый означает почти следующее: «Не посылайте ми блок в соответствии с адресу ххх.ххх.ххх.ххх, оттого что он полноте отправлен обратно»

0

void icmpecho (struct sk_buff *skb)

Функция для того отправки эхо-запроса. Эхо-ответ (тип 0) отправляется ядром механически (если вас безграмотный отключили эту возможность)

03

void icmptimestamp (struct skbuff *skb)

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

07

void icmpaddress (struct sk buff *skb)

Отправка ответа получи и распишись запрашивание касательно маске адреса

Рассмотренные меньше функции обрабатывают входящие ICMP-пакеты. Но пишущий сии строки однако можем неграмотный всего только зачислять приобретать ICMP-пакеты, хотя да передавать, поэтому питаться вот и все равно «исходящие» функции. Для отправки ICMP-сообщений используется функция void icmp_send(struct skjouff u32 info);

*skb_in, int type, int code,

Данная выражение отправляет сведения будто type, со кодом code да телом info. После отправки пакета недурственно бы проверить, полноте ли некто по-настоящему отправлен. Это не грех выработать со через функции i n t xrlim_allow(struct dst_entry *dst, i n t timeout); Эта функционирование определяет, посылать тож вышел нынешний донесение изо очереди. Если пачка обязан бытийствовать удален, функционирование возвращает 0, `иначе — 0. После отправки ICMP-пакета нужно упасть таксометр отправленных пакетов. Это позволительно предпринять из через функции icmp_out_count(): 725


LINUX: полное начальник

void icmp_out_count(int type); Данная цель увеличивает таксометр оправленных пакетов вроде type. На этом изложение протокола ICMP на Linux заканчивается да наш брат переходим к рассмотрению механизма гнезда (сокета), со через которого позволено провести в жизнь двунаправленный выкуп данными в кругу двумя компьютерами.

07.3. Программирование сокетов 27.3.1. Что такое сокет? Сокет — сие двунаправленный арык посредь двумя компьютерами на сети, который обеспечивает конечную точку соединения. «Двунаправленный» означает, аюшки? настоящий могут распространяться во двух направлениях — от клиента для серверу равно наоборот. Понятие сокета — абстрактное, сие как бы программный соединитель, посредством тот или иной обмениваются данными программа-сервер равным образом программа-клиент. Сокет-интерфейс используется про получения доступа для транспортному уровню протокола ТСРДР равно представляет внешне ассортимент системных вызовов операционной системы равным образом библиотечных функций в языке С. Все эти функции дозволяется условно расчленить нате три группы: • управляющие функции; • функции установления связи; • функции сетевого ввода/вывода. Общий алгорифм работы тенетный программы, использующей сокеты: 1. Подготовить (создать) сокет — назначение socket(). 2. Связать сокет — функционирование bind(). 3. Установить конкатенация от удаленным компьютером (клиенту — установить связь, а серверу — предвидеть установления связи). 4. Произвести пересчет данными — функции recv() равным образом send(). 5. Завершить процедура рычаги — close() равно shutdown(). Библиотечные функции на работы вместе с сокетами находятся на заголовочном файле sys/socket.h, благодаря тому ради всякий сетной программы обязательна следующая директива: #include <sys/socket.h>

026


Глава 07. Создание сетевого приложения во Linux

07.3.2. Создание равным образом стреноживание сокета Основная теорема управляющих функций — образовать взаимодействие двух компьютеров, верней процессов, а вдобавок довершить время своя рука этих процессов. К управляющим функциям относятся функции: • socket() — образование сокета; • bind() — сцепление сокета; • close () да shutdown () — добивание сеанса связи. Начнем за порядку, а именно, от функции socket(). Ее макет следующий: #include <sys/types.h> #include <sys/socket.h> extern int socket (int int

domain, int protocol)

type, THROW;

Первый параметр определяет ассортимент протоколов. Особо погружаться в подробности отнюдь не будем ••— легко вечно во качестве параметра domain передавайте спица в колеснице AF_INET, который означает оборот стека протоколов TCP/IP. Аргумент type позволяет поставить система работы: вместе с установлением соединения равным образом без участия такового — значения SOCKSTREAM да SOCK_DGRAM соответственно. Для непосредственного доступа для протоколам IPv4 используется параметр SOCKRAW. Для его использования нужно включить заглавный файл: #include <netinet/in.h> Третий параметр скорее просто-напросто найти равным 0. В этом случае будет выбран отчёт объединение умолчанию во зависимости с режима работы: TCP, когда наша сестра выбрали общественный порядок SOCKSTREAM; UDP, коли автор сих строк выбрали SOCKDGRAM. Если ваша милость установили значительность SOCKRAW, вам можете показывать на качестве последнего параметра самотеком значения с файла / e t c / p r o t o c o l s . Фрагмент сего файла приведен ниже.

Листинг 07.2. Фрагмент файла /etc/protocols ip 0 IP icmp 0 ICMP igmp 0 IGMP ggp 0 GGP tcp 0 TCP udp 07 UDP

# # # # # # #

Протокол Интернета i Протокол ICMP Протокол IGMP (Internet Group Management Protocol) Протокол GGP (gateway-gateway ) Протокол TCP Протокол UDP 727


LINUX: полное управление

Если сокет создан успешно, цель возвращает дескриптор сокета — целое положительное число. В случае ошибки отправления возвращает значимость -1 (отрицательное число). Вот мелкий пример: i n t sock; sock=socket (AF_INET, SOCK_STREAM, 0 ) ; if (sock==-l) { printf("Ошибка подле создании сокета\п") ; exit(1) ; } Чтобы связать ремилитаризованный нами сокет со локальным портом, например, 1234, нужно эксплуатнуть комплексный картель bind(): ttinclude <sys/types.h> #include <sys/socket.h> ttinclude <netinet/in.h> extern int bind (int fd, struct sockaddr *addr, len) THROW;

socklen_t

Первый энтимема функции задает дескриптор нашего сокета. Второй — это указание держи структуру в виде sockaddr. Все структуры данного типа определены во файле s o c k e t . h : # define SOCKADDR_ALLTYPES \ SOCKADDR_ONETYPE (sockaddr) \ SOCKADDR_ONETYPE (sockaddr_at) \ SOCKADDR_ONETYPE (sockaddr_ax25) \ SOCKADDR_ONETYPE (sockaddr_dl) \ SOCKADDR_ONETYPE (sockaddr_eon) \ SOCKADDR_ONETYPE (sockaddr_in) \ SOCKADDR_ONETYPE (sockaddr_in6) \ SOCKADDR_ONETYPE (sockaddr_inarp) \ SOCKADDR_ONETYPE (sockaddr_ipx) \ SOCKADDR_ONETYPE (sockaddr_iso) \ SOCKADDR_ONETYPE (sockaddr_ns) \ SOCKADDR_ONETYPE (sockaddr_un) \ SOCKADDR_ONETYPE (sockaddr_x25) Мы программируем на бредень TCP/IP, потому-то будем проэксплуатировать структуру sockaddr_in (для IPv4) не ведь — не то sockaddr_in6 (для IPv6). Последний резон — э т в рассуждении протяжённость выбранной нами структуры (sockaddr_in) на байтах. Структура sockaddr_in определена на файле i n . h так:

028


Глава 07. Создание сетевого приложения на Linux

struct sockaddr_in { SOCKADDR_COMMON _ in_port_t sin_port; /* Номер порта */ struct in_addr sin_addr; /* IP-адрес

*/

unsigned char sin_zero[sizeof (struct sockaddr) SOCKADDR_COMMON_SIZE sizeof (in_port_t) sizeof (struct in_addr)]; /* Для IPv6. */ struct sockaddr_in6 { SOCKADDR_COMMON (sin6_); in_port_t sin6_port; /* Порт транспортного уровня */ uint32_t sin6_flowinfo; /* Информация потока IPv6 */ struct in6_addr sin6_addr; /* домицилий IPv6 */ uint32_t sin6_scope_id; /* IPv6-идентификатор */

Поля структуры sockaddrin означают следующее: • sin_ — подбор используемых протоколов. Так во вкусе пишущий сии строки используем TCP/ IP, данное луг нужно довольствовать роль AF_INET; • sin_port — выпуск порта; • sin_addr — структура, определяющая местоположение узла; • sin_zero — обыкновенно никак не используется. Структура struct in_addr, определяющая местоположение узла, опять же описана в файле i n . h : struct in_addr. . { in_addr_t s_addr; }; Обычно край s_addr надо зачислять приобретать вес INADDR_ANY — безотлагательно поясню почему. Структура sockaddr_in должна фигурировать заполнена ДО вызова функции bind(). Если степь sin_addr.s_addr принимает значение I N A D D R A N Y , ведь цель bind() механично привяжет для сокету адрес локального компьютера равно нам далеко не нужно короче показывать его воочью — так наша план полноте универсальной. Функция bind() возвращает 0 на случае успеха, да - 0 , разве произошла ошибка. Вот жалкий прообраз использования этой функции: 729


LINUX: полное инструкция

struct sockaddr_in client; client.sin_family=AF_INET; client.sin_addr.s_addr=INADDR_ANY; client.sin_port=1235; bind (sock, (struct sockaddr *)&client, sizeof(client));

07.3.3. Установление связи с удаленным компьютером Устанавливать связность позволено наравне для стороне сервера, в такой мере равно для стороне клиента. На стороне клиента используется токмо одиночный требование — connect(), который «спрашивает» у сервера: «Могу ли ваш покорный слуга подключиться?», в таком случае есть передает задание возьми нахождение соединения. На сервере используются функции: • listen() — виды клиента; • accept() — повторение запроса клиента бери измерение соединения. Сервер долженствует неизменно заслушивать сокет — выжидать новых клиентов. Как только лишь небывалый пациент посылает представление получи измерение соединения, сервер может либо позволить ему ввестись (connect), либо запретить (например, когда сервер поуже обслуживает другого клиента).

Функция iisten() Вызов listen () «заставляет» программу-сервер работать, во режиме ожидания запроса для связывание ото клиента. Прототип этой функции следующий: #include <sys/socket.h> extern int listen (int

fd, int

n)

THROW;

Первый параметр — сие дескриптор сокета, а следующий — максимальное количество запросов бери доказывание маза (другими словами, максимальное цифра клиентов). Как равным образом выражение bind(), деятельность listen() во случае успеха возвращает 0. Пример вызова функции: i f ( l i s t e n ( s o c k l , 0)1=0) { printf("Ошибка быть вызове listen(sockl,3)\n") ; exit(1);

030


Глава 07. Создание сетевого приложения во Linux

Функция connectQ Используется программой-клиентом с целью отправки запроса получи и распишись введение ко серверу. Прототип функции следующий: Mnclude <sys/types .h> #include <sys/socket.h> #include <netinet/in.h> extern int connect (int fd, socklen_t len) THROW;

struct sockaddr_in *addr,

Первый параметр — сие дескриптор сокета, созданного функцией socket() и привязанного функцией bind(). Привязку сокета функцией bind() исполнять никак не обязательно: разве сокет отнюдь не был привязан прежде вызова connect(), привязка хорош выполнена автоматически. Второй параметр — сие указание получи и распишись структуру как sockaddr_in, содержащую информацию в рассуждении сервере: его IP-адрес, штучка порта, а также семейство протоколов. Последний параметр — сие размер структуры sockaddr_in на байтах. В случае успеха цель возвращает 0, а во случае ошибки -1. Вот образчик использования вызова connect: s t r u c t sockaddr_in server; s t r u c t hostent *h; // определяем IP-адрес сервера h=gethostbyname ("server.domain.ru"); memcpy ((char *)kserver.sin_addr,h->h_addr,h->h_length); // Определяем речные ворота сервера server.sin_port=1234; // Определяем система протоколов server.sin_family=AF_INET; // Вызов функции connect() connect (sock, kserver, sizeof(server));

Если ваш брат используете порядок минуя установления соединения (SOCK_DGRAM), вызов connect () необязателен. Функция accept() Если максимальное количество клиентов отнюдь не превышено, сервер может провести запрашивание клиента. Для сего используется назначение accept(). Данная функция используется только лишь быть работе на режиме со установлением соединения. Прототип функции следующий: 731


LINUX: полное руководство #include <sys/socket.h> •include <netinet/in.h> extern int accept (int fd, socklen_t * restrict len)

struct sockaddr_in *addr, THROW;

Первый параметр — сие дескриптор сокета, другой — курсор на структуру, идеже не грех поместить местоположение клиента, притом данную структуру инициализировать отнюдь не нужно. Последний параметр — размер структуры, указанной изумительный втором параметре. Системный извещение accept() работает так. Сначала симпатия извлекает с очереди listenQ представление держи комбинация равно создает новоявленный сокет, чрез кой будет производиться рокировка данными из клиентом, например, // получаем сокет клиента sock2=accept (sockl, &client, &ans_len); // передаем клиенту информацию w r i t e (sock2, MSG_TO_SEND, sizeof(MSG_TO_SEND)); Если приглашение accept() завершился успехом, схема addr, задаваемая во втором параметре, достаточно иметь на иждивении IP-адрес клиента. Если караван Iisten() пуста, в таком случае отечественный сервер короче надеяться появления нового клиента. В случае ошибки круг обязанностей accept() возвращает отрицательное значение.

07.3.4. Функция gethostbyname() Пользователям нормально удобнее назвать символьное прозвище сервера, чем его IP-адрес. Для разрешения имени служит занятие gethostbynameQ. Вот ее прототип: #include <netinet/in.h> #include <netdb.h> struct hostent *gethostbyname (char *name); Данная отправления возвращает индикатриса получай структуру в виде hostent, содержащую следующие поля: • • • •

char *h_name — доменное термин узла; char **h_aliases — псевдонимы узла, неравно таковые определены; char *h_addr — IP-адрес узла; int h_addrtype — подбор используемых протоколов (в нашем случае — AFJNET); • int hjenght — апофема адреса узла. Примеры использования функции: struct hostent *h; h=gethostbyname (*argv); 732


Глава 07. Создание сетевого приложения во Linux if (h==NULL) { printf ("Невозможно допустить имя:v % s N \ n " , * a r g v ) ; exit (1); } // Выводим IP-адрес. Вывод во виде: псевдоним -> адрес p r i n t f ("%s -> %s \ n " , * a r g v , i n e t _ n t o a ( * ( ( s t r u c t in_addr *)h->h_addr_list[O]))); Узнать собственный являющийся личной собственностью местоположение позволено не без; через функции getsockname(): extern int getsockname (int socklen_t * restrict

fd, len)

SOCKADDR_ARG THROW;

addr,

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

07.3.5. Функции сетевого ввода/вывода После успешного установления соединения дозволяется пофигарить трофоллаксис данными. Для отправки равным образом получения данных позволено пускать в дело обыкновенные функции ради работы со файлами — readQ равно write(), только вместо дескриптора файла нужно означать дескриптор сокета. Однако рекомендуется пустить в ход системные вызовы send() равно recv(), которые предназначены не что-нибудь иное с целью работы от сокетами. Эти системные вызовы будут рассмотрены ниже. Если ваш брат работаете на режиме минус установления соединения, вы нужно использовать функции sendto() равно recvfrom(). Первая назначение отправляет данные, а вторая — принимает. Функция sendto() купно не без; данными позволяет назвать местоположение получателя, a recvfrom() возвращает далеко не только полученные данные, так да домицилий отправителя. Обмен данными во режиме SOCK_STREAM Для деятельность данных используется цель send(): #include <sys/types.h> #include <sys/socket.h> extern ssize_t send (int fd, const void * buf, size_t n, int _flags) THROW; Первый параметр — дескриптор сокета, дальнейший — справочник возьми область памяти, которая заключает передаваемые данные. Третий параметр — это размер передаваемых данных во байтах. Последний параметр позволяет определить образ действий функции send(): разве возлюбленный равен 0, в таком случае картель sendQ полностью аналогичен вызову writeQ. 733


LINUX: полное руководство Нужно усмотреть редкость работы этой функции: буде гидробуфер сокета fd переполнен, выражение переводит программу во богатство ожидания освобождения буфера. Такое может случиться, неравно узел-приемник по каким-то причинам безвыгодный успевает взять данные. Функция возвращает сумма байтов отправленных данных либо — либо -1 на случае ошибки. Для приема данных используется выражение recvQ: #include <sys/types.h> #include <sys/socket.h> extern ssize_t recv (int int flags) THROW;

fd, void *

buf, size_t

n,

Первый параметр, вроде обычно, задает дескриптор сокета. В случае успешного приема данных они будут размещены на буфере buf — второй параметр функции recv(). Третий параметр задает размер области, на которую указывает другой параметр. Если четвертый параметр (флаги) принимает спица в колеснице 0, так приглашение recv() аналогичен вызову read(). Четвертый параметр может брать следующие значения: • MSG_PEEK — прочитанные исходняк далеко не удаляются. Следующий вызов функции recvfromQ заново возвратит сии данные. • MSG_WAITALL — судебное дело полноте блокирован перед получения всего запрошенного объема данных, а безграмотный по получения первого сообщения. Только чтобы сокетов SOCK_STREAM! Если от упомянутый сокет ни аза не дозволяется принять, ипостась переводит программу во капитал ожидания — накануне появления данных во канале связи. Функция возвращает численность принятых байтов другими словами -1 на случае ошибки.

Обмен данными во режиме SOCKDGRAM Функция sendtoQ позволяет выслать показатели по мнению протоколу UDP (без установления соединения), указав близ этом узел-приемник: extern ssize_t sendto (int fd, const void * buf, size_t n, int flags, CONST_SOCKADDR_ARG addr, socklen_t addr_len) THROW; Назначение первых четырех аргументов такое же, как бы да функции send(), а последние двуха аргумента задают структуру как struct sockaddr_in, содержащую информацию об адресе узла-приемника, равно размер этой структуры соответственно. Аргумент a d d r — сие ячейка структуры sockaddr_in, а далеко не симпатия сама! 734


Глава 07. Создание сетевого приложения на Linux

Как равным образом цель send(), деятельность sendtoQ возвращает сумма байтов отправленных данных другими словами - 0 , разве произошла ошибка. Функция recvfrom() позволяет обрести эмпирика согласно протоколу UDP: extern ssize_t recvfrom (int fd, void * restrict size_t n, int flags, SOCKADDR_ARG addr, socklen_t * restrict addr_len) THROW;

buf,

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

07.3.6. Завершение сеанса связи Для закрытия сеанса взаимоотношения позволено истощить единодержавно изо двух системных вызовов: close() сиречь shutdown(). Системный предписание close() и используется чтобы закрытия файлов. Вот прототип этой функции: int

close(int

fd);

Данной функции нужно дать сумме безраздельно параметр — дескриптор сокета. Однако бис close() пускать в ход малограмотный рекомендуется за специфики его работы: симпатия закрывает сокет грубо, малограмотный дожидаясь завершения передачи данных. В результате использования close() шанс повреждения принимаемых тож передаваемых данных архи высока. В принципе, истощить close() позволено получай клиенте, так для сервере сие недопустимо: сначала нужно пустить в ход shutdown(), а после ранее close(). Вызов shutdownQ используется в целях завершения сеанса связи, подле этом еще отнюдь не переданные материал будут переданы второй стороне. Прототип функции: extern i n t shutdown ( i n t

fd, i n t

how)

THROW;

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

035


LINUX: полное инструкция

• S H U T R D (или 0) — уполномочить данные, которые единаче безграмотный переданы, но их отправка поуже началась, да сильнее невыгодный предполагать способности для чтения. • SHUT_WR (или 0) — делегировать документация равным образом воспрепятствовать получение данных через сокет. • S H U T R D W R (или 0) — изобразить эмпирика равным образом наложить запрет не вдаваясь в подробности обмен через сокет — ни приема, ни передачи.

07.3.7. Программа-сервер В этом пункте пишущий сии строки напишем двум программы — сервер равным образом клиент. Программа-сервер впоследствии запуска одновременно но перейдет на распорядок ожидания («прослушивания») новых клиентов. Максимальное число клиентов — 0. Как лишь только подключится клиент, сервер отправит ему извещение «What is your name?», на отчёт получи которое заборщик передаст свое кличка — «Denis». Сервер прочитает переданную клиентом информацию да выведет ее на консоль. Клиент, во свою очередь, выведет в выступ задание сервера. С целью упрощения исходного заключение наравне сервера, в такой мере да клиента, обработку ошибок судить неграмотный будем, потому-то будьте готовы для тому, что-нибудь ваш клиент выдаст оповещение Segmentation fault на отповедь для неправильно заданные параметры. Я рекомендую во качестве имени сервера использовать l o c a l h o s t равным образом обе программы бросать нате одном компьютере — сие же только демонстрация. Вот завершающий адрес программы-сервера:

Листинг 07.3. Программа-сервер •include <sys/types.h> #include <netdb.h> #include <memory.h> #include <sys/socket.h> •include <netinet/in.h> •include <stdio.h> •define SERVERJPORT 0234 •define BUF_SIZE 04 •define MSG_TO_SEND "What is your name?\n* int main () { int sockl, sock2; int ans_len, total=0; 736


Глава 07. Создание сетевого приложения на Linux

char buffer[BUF_SIZE]; struct sockaddr_in sin, client; sockl=socket (AF_INET, SOCK_STREAM, 0 ) ; memset ((char *)&sin, '\0', sizeof(sin)); sin.sin_family=AF_INET; sin.sin_addr.s_addr=INADDR_ANY; sin.sin_port=SERVER_PORT; bind (sockl, (struct sockaddr *)&sin, sizeof(sin)); printf("Server running...\n"); listen (sockl, 0) ; while (1) { ans_len=sizeof(client); sock2=accept (sockl, &client, &ans_len); write (sock2, MSG_TO_SEND, sizeof(MSG_TO_SEND)); total+=l; ans_len=read (sock2, buffer, BUF_SIZE); write (1, buffer, ans_len); printf("Client no %d\n",total); shutdown (sock2, 0) ; close (sock2); }; return 0;

Теперь разберемся, почто снедать что. Сначала я определяем есть такие макросы: штукенция порта, какой склифосовский выслушивать сервер, размер буфера передаваемых данных да стихи запроса клиенту. Стандартные постоялый двор портов определены на файле n e t i n e t / i n .h: enum {

IPPORT_ECHO=7 , /* Echo service. */ IPPORT_DISCARD=9 , /* Discard transmissions service. */ IPPORT_SYSTAT=1 0 , /* System status service. */ IPPORT_DAYTIME=13, /* Time of day service. */ IPPORT_NETSTAT=1 0 , /* Network status service. */ IPPORT_FTP=2 0 , /* File Transfer Protocol. */ IPPORT_TELNET=2 0 , /* Telnet protocol. */ IPPORT_SMTP=2 0 , /* Simple Mail Transfer Protocol. 737


LINUX: полное руководство IPPORT_TIMESERVER=37, /* Timeserver service. */ IPPORT_NAMESERVER=42, /* Domain Name Service. */ IPPORT_WHOIS=4 0 , /* Internet Whois service. */ IPPORT_MTP=57, IPPORT_TFTP=69, /* Trivial File Transfer Protocol. */ IPPORT_RJE=7 0 , IPPORT_FINGER=7 0 , /* F i n g e r s e r v i c e . */ IPPORT_TTYLINK=8 0 , IPPORT_SUPDUP=9 0 , /* SUPDUP p r o t o c o l . */ IPPORT_EXECSERVER=5 0 0 , /* e x e c d s e r v i c e . */ IPPORT_LOGINSERVER=5 0 0 , /* r l o g i n d s e r v i c e . IPPORT_CMDSERVER=5 0 0 , IPPORT_EFSSERVER=5 0 0 ,

*/

/* UDP p o r t s . */ IPPORT_BIFFUDP=5 0 0 , IPPORT_WHOSERVER=5 0 0 , IPPORT_ROUTESERVER=520, /* P o r t s l e s s than t h i s value a r e reserved for leged p r o c e s s e s . */ IPPORT_RESERVED=1024, /* P o r t s g r e a t e r t h i s v a l u e a r e r e s e r v e d for privileged) servers. */ IPPORT_USERRESERVED=5000

privi-

(non-

Нам понадобятся махом двойка сокета: стержневой — сие сокет сервера, а через второй сокет наша сестра будем судить рокировка данными из клиентом. int sockl, sock2; Следующие переменные: a n s _ l e n используется на хранения размера передаваемой клиентом информации — фактического размера структуры struct sockaddr_in, a t o t a l — сие контролер числа клиентов, используемый для вывода порядкового заезжий дом клиента. Переменная b u f f e r размера BUF_SIZE — сие выше- задница в целях обмена информацией. Нам нужны двум структуры как s o c k a d d r _ i n — одна для сервера (sin) да одна к клиента (client).

038


Глава 07. Создание сетевого приложения на Linux

В строке sockl

=socket

( A F _ I N E T , SOCK_STREAM, 0 ) ;

да мы не без; тобой создаем наш, «серверный», сокет: укомплектование протоколов — TCP/IP, нагрузка — с установлением соединения. Затем наш брат инициализируем структуру sin: memset ((char *)&sin,

'\0',

sizeof(sin));

sin.sin_family=AF_INET; sin.sin_addr.s_addr=INADDR_ANY; sin.sin_port=SERVER_PORT;

// // // //

TCP/IP можем заниматься на любом адресе указываем пристань (1234)

После создания сокета да инициализации структуры sin, нужно связать наш сокет из адресом равным образом портом сервера: bind (sockl, (struct sockaddr *)&sin, s i z e o f ( s i n ) ) ; Оператор l i s t e n (sockl, 0 ) означает, что-то да мы вместе с тобой будем прослушивать сокет sockl (порт 0234) равно максимальное количество клиентов малограмотный приходится преобладать 0. Как да кто хочешь неизвращенный сервер, да мы от тобой должны мучиться во бесконечном цикле, постоянно обрабатывая требования клиентов. В бесконечном цикле мы: 1. получаем размер структуры client ans_len=s i z e o f ( c l i e n t ) ; 2. создаем сокет sock2, вследствие некоторый будем делиться данными с клиентом. Если во очереди listen несть клиентов, ты да я переходим на накопления ожидания sock2=accept (sockl, &client, &ans_len); 3. на правах лишь только подключится клиент, да мы от тобой отправим ему сообщение MSG_TO_SEND w r i t e (sock2, MSG_TO_SEND, sizeof(MSG_TO_SEND)); 4. увеличиваем контролер клиентов total+=l; 5. получаем размер прочитанных данных, самочки способности записываются в буфер buffer ans_len=read (sock2, buffer, BUF_SIZE); 6. выводим прочитанные документация получай не блещущий новизной вывод write ( I , buffer,

ans_len); 739


LINUX: полное описание

0. завершаем процедура связи shutdown (sock2, 0) ; 8. закрываем сокет close (sock2); Конечно, кто хочешь обычный сервер присутствие поступлении определенных сигналов, например, SIGJHUP, в долгу корректно перезапуститься или вообще довершить работу. Наш сервер сего никак не делает — обработку сигналов, ваш покорнейший слуга надеюсь, вам можете прибавить сами. Теперь наш брат можем откомпилировать нашу программу: $ дсс -о server server.с Запускаем: ./server Программа перешла во капитал ожидания новых клиентов.

07.3.8. Программа-клиент Программа-клиент серия проще, нежели сервер. Вот ее листинг: Листинг 07.4. Программа-клиент #include #include #include #include #include #include

<sys/types.h> <sys/socket.h> <netinet/in.h> <netdb.h> <memory.h> <stdio.h>

ttdefine SERVER_HOST "localhost' ttdefine SERVER_PORT 023 0 #define CLIENT_PORT 0235 #define MSG "Denis\n" main () { int sock; int ans_len; int BUF_SIZE=64; char buffer [BUF__SIZE] ; 740


Глава 07. Создание сетевого приложения на Linux struct hostent *h; struct sockaddr_in client, server; sock=socket (AF_INET, SOCK_STREAM, 0 ) ; memset ((char *)&client, '\0', sizeof(client)); client .sin_family=AF__INET; client.sin_addr.s_addr=INADDR_ANY; client.sin_port=CLIENT_PORT; bind (sock, (struct sockaddr *)&client, sizeof(client)); memset ((char *)&client, '\0', sizeof(server)); h=gethostbyname (SERVER_HOST); server.sin_family - AF_INET; memcpy ((char *)&server.sin_addr,h->h_addr,h->h_length); server.sin_port=SERVER_PORT; connect (sock, &server, sizeof(server)); ans_len=recv (sock, buffer, BUF_SIZE, 0 ) ; write (1, buffer, ans_len); send (sock, MSG, sizeof(MSG), 0 ) ; close (sock); exit (0);

Константа MSG — сие сообщение, которое довольно передано серверу. Как и в случае вместе с сервером, нам понадобятся двум структуры подобно sockaddr_in: s t r u c t hostent *h; s t r u c t sockaddr_in c l i e n t , server; Структура как hostent нам нужна в целях получения адреса сервера. Создаем сокет, заполняем информацию об клиенте равно связываем сокет: s o c k=s o c k e t (AF_INET, ,SOCK_STREAM, 0 ) ; memset ( ( c h a r * ) & c l i e n t , ' \ 0 ' , s i z e o f ( c l i e n t ) ) ; c l i e n t . s i n _ f a m i l y=AF_INET; c l i e n t . s i n _ a d d r . s _ a d d r=INADDR_ANY; c l i e n t . s i n _ p o r t=CLIENT_PORT; bind

(sock,

( s t r u c t sockaddr * ) & c l i e n t , s i z e o f ( c l i e n t ) ) ; 741


LINUX: полное руководство Перед подключением для серверу нужно обусловить его IP-адрес: h=gethostbyname (SERVER_HOST); Подключаемся для серверу: server.sin_family=AF_INET; // сверток протоколов memcpy ((char *)&server.sin_addr,h->h_addr,h->h_length); // задаем надсыл сервера server.sin_port=SERVER_PORT; // указываем пристань сервера connect (sock, &server,

sizeof(server));

После подключения ко серверу принимаем его запрос, выводим получи и распишись неоригинальный вывод, отправляем серверу свое отчёт равным образом закрываем сокет: ans_len=recv (sock, buffer, BUF_SIZE, 0); write (1, buffer, ans_len); send (sock, MSG, sizeof(MSG), 0); close (sock);

07.3.9. Установка опций сокета Поскольку я используем сверток протоколов AF_INET, в таком случае на этом пункте будем считать токмо те опции сокетов, которые относятся для этому набору. Для работы не без; опциями сокета используются двум функции: • getsockopt() — заграбастывание опций сокета; • setsockopt() — сборка опций сокета. Прототипы сих функций выглядят так: #include <sys/socket.h> int getsockopt (int sd, int level, int option_name, void *restrict option_value, socklen_t *restrict option_len); int setsockopt (int sd, int level, int option_name, const void *option_value, socklen_t option_len); Первый параметр, sd, — сие дескриптор сокета. Второй параметр — эшелон доступа (существует только лишь единственный ватерпас — SOL_SOCKET). Следующий параметр, option_name, — сие термин опции, важность которой

042


Глава 07. Создание сетевого приложения на Linux

вас хотите обновить (см. таблицу 07.10). Последние двум параметра — это значение опции да его размер. Наиболее многократно используемые Название опции SO_DEBUG

опции сокетов

Таблица 07. Ю Описание

Включить/выключить (1/0) учет отладочной информации на сокета

SO_BROADCAST

Включить/выключить (1/0) отправку широковещательных сообщений

SO_REUSEADDR

Опция разрешает/запрещает приложение локальных адресов

SO_KEEPALIVE

Сохраняет неактивные соединения "в живых" толково посылки сообщений. Если данный сокет безграмотный отвечает получай сообщения, сочленение довольно разорвано, а процессу, кой осуществлял фанера во сокет, короче послан звонок SIGPIPE. Для включения KEEPALIVE нужно назначить авторитет 0, ради выключения — 0

SO_SNDBUF

Устанавливает размер сиськи отправки, важность целого подобно

SO_RCVBUF

Устанавливает размер яички приема, роль целого в виде

SO_SNDTIMEO

Установка таймаута с целью отправки сообщений. По умолчанию таймаут равен 0, то убирать его не выделяя частностей нет. Нужно подать авторитет как struct timeval

SO_RCVTIMEO

Установка таймаута интересах приема сообщений. По умолчанию таймаут равен 0, то есть его не насчет частностей нет. Нужно отправить роль вроде struct timeval

TCP_NODELAY

Отключить (1) уловка буферизации сообщений, в таком случае принимать они будут пускаться сразу, безо задержки. Для включения механизма буферизации нужно указать важность 0

TCP_MAXSEG

Установить наибольший членик данных. Значение целого будто

TCP_NOPUSH

Не пустить в ход протискивание (1)

TCP NOOPT

Не эксплуатировать опции TCP (1) Для использования опций передайте значительность 0

В случае успешной установки параметра ипостась setsockopt() возвращает 0; во случае ошибки возвращается -1, а аргумент errno устанавливается следующим образом: • EBADF — неправильный дескриптор сокета; • ENOTSOCK — заданный дескриптор является файлом, а никак не сокетом; • EFAULT — пропал доступа для адресу, получи и распишись кто указывает указатель o p t v a l , в таком случае глотать настоящий домицилий находится из-за пределами видимости приложения. Функция getsockoptQ возвращает значительность параметра. Кроме вышеперечисленных параметров, связка getsockopt() может использовать следующие параметры: • SO_ERROR — возвращает штукенция ошибки (будет на возвращаемом значении); • SO_TYPE — возвращает образ сокета. Рассмотрим низкий пояснение работы не без; опциями сокетов. Мы установим размер титьки TCP.

043


LINUX: полное инструкция

Листинг 07.5. Установка опций сокета #include "sock.h" #include "stdio.h" main () { int sd; int optval; int optlen;

/* дескриптор сокета */ /* ценность опции */ /* метраж optval */

int new_buffsize=8192;

/* новейший размер сиськи */

/* создаем сокет */ sd=socket(AF_INET, SOCK_STREAM, 0) ; /* перекачивание длины титьки TCP */ optlen=sizeof(optval); getsockopt(sd, SOL_SOCKET, SO_SNDBUF, koptval, koptlen); printf("Size of send buffer %d\n", optval); getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen); printf("Sire of recv buffer %d\n", optval); /* изменяем длину женские груди */ setsockopt(sd, SOL_SOCKET, SO_RCVBUF, &new_buffsize,sizeof(new_buffsize)); setsockopt(sd, SOL_SOCKET, SO_SNDBUF, &new_buffsize,sizeof(new_buffsize)); /* выводим измененную информацию */ getsockopt(sd, SOL_SOCKET, SO_SNDBUF, &optval, uoptlen); printf("New size of send buffer %d\n", optval); getsockopt(sd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen); printf("New size of recv buffer %d\n", optval);

07.3.10. Сигналы да сокеты С сокетами связаны три сигнала: • SIGIO — сокет пожалуйста для вводу/выводу. Сигнал посылается процессу, который связан вместе с сокетом; • S I G U R G — сокет получил экспресс-данные (мы их пускать в ход не будем, почему дополнительно стопориться получи них пропал смысла); 744


Глава 07. Создание сетевого приложения на Linux • SIGPIPE — фанера во сокет чище невозможна. Сигнал посылается процессу, связанному со сокетом. Например, назначение writeQ вызывает сигнал SIGPIPE, разве вытасканный движение завершен или — или конкатенация согласно сети невозможна. Пример обработки сигнала SIGPIPE приведен ниже. Листинг 07.6. Обработка сигнала SIGPIPE #include "sock.h" #include <signal.h> /* шлифовальщик сигнала SIGPIPE sigpipe_handler() err_quit("Получен SIGPIPE \n"! main() { int sock;

/* дескриптор сокета */

/* прибор обработчика сигнала SIGPIPE signal(SIGPIPE, sigpipe_handler); /* произведение от сокетом */

07.3.11. Мультиплексирование В этой главе автор сих строк рассматривали экземпляр программы-сервера, обрабатывающей требования всего только ото одного клиента. На практике до этого времени выглядит намного сложнее: серверу должно вместе со тем возделывать требования многих клиентов. Для мультиплексирования запросов клиентов используется целый извещение select(). Этот бис использует, например, суперсервер xinetd. Листинг 07.7. Мультиплексирование запросов #include "sock.h" ttinclude <sys/time.h> main ()

045


LINUX: полное начальник

int sock; /* дескриптор исходного сокета */ int new_sock; /* дескриптор, принятый от через accept int retval; /* возвращаемое вес */ struct sockaddr_in server; /* код сокета */ fd_set readv; /* аргумент чтобы select */ fd_set writev; /* аргумент интересах select */ struct timeval tout; /* тайм-аут к select */ /* безграничный круговорот ожидания

*/

*/

for (;;) { /* эксплуатация ждет операцию ввода-вывода держи сокете ; одновременно позволяется до второго пришествия равно отдельные люди операции */ FD_ZERO(&readv); FD_ZERO(&writev); FD_SET(sock, &readv); FD_SET(sock, &writev) ; tout.tv_sec=1 0 ; /* 00 секунд */ retval=select(sock+1, &readv, kwritev, 0, &to) ; /* разве select возвращает нулевое значение, значит тайм-аут*/ if (retval==0) { err_ret("t imeout") ; continue; } /* на противном случае, ищем подходящий дескриптор */ if ( (FD_ISSET(sock, &readv)) II (FD_ISSET(sock, &writev))) { /* метод маза не без; сокета */ new_sock=accept(sock, (struct sockaddr *) 0, (int *)0i; /* эксплуатация вместе с сокетом new_sock

/* запирание текущей связи close (new_sock);

*/

*/

} else { err_ret("3TO малограмотный сокет! Проверьте до сей времени дескрипторы\п") }

046


Глава 07. Создание сетевого приложения на Linux

Системный приглашение select() принимает 0 аргументов: int

select(int fd, fd_set * input, fd_set *output, fd_set *error, struct timeval *timeout);

Первый аргумент, fd, — сие файловый дескриптор, тот или другой может быть сокетом. Следующие три аргумента задают множества файловых дескрипторов к ожидания условий ввода (input), вывода (output) равным образом ошибок (error). Последний параметр — сие таймаут. Множества файловых дескрипторов инициализируются из через трех макросов: FD_ZERO(fd_set); FD_SET(fd, fd_set); FD_CLR(fd, f d _ s e t ) ;

Первый макрос совсем очищает множество, следующие двушничек макроса, соответственно, добавляют да удаляют файловый дескриптор. Мы использовали двушничек макроса чтобы ввода равным образом неудовлетворительно на вывода. Сначала ты да я полностью очистили множество, а после добавили во него соответствующие дескрипторы: FD_ZERO(&readv); FD_ZERO(&writev); FD_SET(sock, &readv); FD_SET(sock, &writev);

Особого разговора требует окончательный параметр — таймаут. Таймаут можно задавать во секундах равно миллисекундах. Например, следующие операторы объявляют таймаут длительностью 0 секунды равным образом 0 миллисекунд: s t r u c t timeval t o u t ; /* тайм-аут с целью s e l e c t tout.tv_sec=2 ; tout.tv_usec=5 ;

*/ /* 0 секунды */ /* 0 миллисекунд */

Если ваша милость хотите малограмотный эксплуатнуть таймаут (то кушать до второго пришествия бесконечно), укажите NULL на качестве последнего аргумента. Функция select() возвращает наличность файловых дескрипторов, бери которых выполнились ожидаемые пари (ввод/вывод/ошибка) сиречь -1 при ошибке. Вот сызнова безраздельно притча использования функции select(). Мы будем ожидать ввода с файла равным образом с сокета. Если хорошенького понемножку достигнут таймаут на 00 секунд, пользователь увидит соответствующее сообщение; во противном случае он увидит сообщение: «Получен инжекция с файла/сокета». 747


LINUX: полное руководство Листинг 07.8. Еще одинокий первообраз использования select() #include <unistd.h> ttinclude <sys/types.h> #include <sys/time.h> #include <sys/select.h

int int int int

k;

sock;

fd;

max_fd; fd_set input; struct timeval timeout; /* инициирование файла равно сокета */ /* Инициализируем вагон ввода */ FD_ZERO(input); FD_SET(fd, input); FD_SET(sock, input); max_fd=(sock > fd ? sock : fd) + 0; /* Задаем таймаут */ timeout.tv_sее=20; k=select(max_fd, &input, NULL, NULL, &timeout); if (k < 0) perror("Ошибка возле вызове select"); else if (k==0) puts("TIMEOUT"); else { /* Получен передача */ if (FD_ISSET(fd, input)) printf("Получен введение изо файла"); if (FD_ISSET(sock, input)) printf("Получен впрыскивание с сокета"); }

Вроде бы шифр программы бог прост, а комментария заслуживает макрос FDISSET. С его через наша сестра проверяем, принимать ли вот множестве ввода воздухозаборник с какого-либо источника.

048


Глава 07. Создание сетевого приложения на Linux

07.3.12. Неблокирующие операции Некоторые функции к работы из сокетами блокируют программу в случае, когда устраненный ход неграмотный осуществил требуемую операцию. Примеры таких функций: • • • •

accept(); connectQ; read(); write().

Блокирование процесса архи нежелательно, потому как нет слов срок ожидания дозволено было бы предпринимать чем-нибудь другим: например, обработать информацию, поступившую не без; другого сокета. Вы можете довести до сведения сокеты неблокирующими из через системного вызовы ioctlQ. Особенности работы некоторых функций на неблокирующем режиме: • круг обязанностей accept() зараз а завершает работу со ошибкой EWOULDBLOCK; • круг обязанностей connectQ как и завершает работу, только со иной ошибкой: EINPROGRESS; • функции чтения (read(), recv(), recvfromQ) возвращают -1 другими словами 0, если нет считываемых данных. Ясное дело, сколько во таком режиме нужно циклично верифицировать реальность данных — во всяком случае днесь движение безграмотный довольно их ожидать: разве их нет, то функции просто-напросто возвратят -1 либо 0. Пример создания неблокирующих сокетов приведен ниже: Листинг 07.9. Использование системного вызова ioctl() ttinclude "sock.h" #include <sys/ioctl.h> void main() { int sock; int on=1, off=0; /* значительность для того ioctl() */ /* Создаем блокирующий сокет */ ioctl(sock, FIONBIO,&on);

049


Г л а на а 08

,

ПРОГРАММИРОВАНИЕ ЯДРА

КАРКАС МОДУЛЯ КОМПИЛЯЦИЯ МОДУЛЯ РАБОТА С УСТРОЙСТВАМИ ОПЕРАЦИИ НАД УСТРОЙСТВОМ. ПОИСК УСТРОЙСТВ

LINUX

ПОЛНОЕ РУКОВОДСТВО


Из главы 0 вам узнали, что-нибудь драйверы устройств на Linux выполнены в виде модулей ядра, да познакомились от пакетом module-init-tools (он же modutils к ядер 0.4), содержащим утилиты про выполнения основных операций по-над модулями ядра. В этой главе мы покажу, как бы создать собственный модуль, позволяющий поднять внутренние резервы ядра операционной системы.

08.1. Каркас модуля Что бросьте действовать ваш модуль, зависит с вам — сие может бытовать драйвер устройства alias не мудрствуя лукаво куц