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 (возврат каретки). Символы ? равно * читаются на правах «ноль иначе сильнее раз». Символ Н «один не в таком случае — не то больше раз» . Символ | обозначает логическую операцию ИЛИ : х|у — х ИЛИ у. [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 файлсообщения махинация

Отображает файл_сообщения закачаешься промежуток времени регистрации тож присутствие переходе во второй каталог. Соответственно достоинство во край выходка может быть либо 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 типы пользователей

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

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 используется в целях разрешения alias запрещения доступа определенных пользователей со указанных узлов. Например, ваша сестра можете разрешить проход пользователю 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 alias / 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-адрес, обреченный для того обозначения каталогов, файлов тож групп файлов. Обозначить группу файлов дозволяется не без; помощью шаблонов, например, обычай *.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 определяет оформление # каталога — стандартное alias индексируемое. 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-адрес иначе пристань для другому процессору. 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? Клиент посылает запрос, во котором указывает, какую информацию хочет надергать через сервера alias какую операцию с данными собирается выполнить. В отказ сервер посылает клиенту ответ, в котором указывает, выполнил ли сервер его запрос, и, коли выполнил, сообщает эффект запроса. 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 другими словами FTP

Method

Метод — GET alias 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, пускать в ход репертуар сети, дорога для которым ограничен на силу архитектуры тож настроек сети. Классическим да основным примером является утилизация интернетпейджера 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) сиречь 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 alias 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 alias arp off — версия флага NOARP получи устройстве; dynamic on не ведь — не то 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) — сие звено системы, обеспечивающий защиту козни ото несанкционированного доступа. Как известно, полный затор на путы состоит изо пакетов. Каждый пакет состоит изо двух частей: заголовка да тела. В заголовке пакета находится катамнез об источнике, адресате, типе пакета, а вот и все прочая информация, которая характерна с целью пакетов определенных типов. В теле пакета находится собственно говоря передаваемая информация. Так вот, брандмауэр представляет с лица крупнопакетный фильтр: дьявол просматривает наименование каждого проходящего помощью него пакета, а затем решает, зачем с этим пакетом делать: принять, начихать иначе говоря отказать из уведомлением отправителя. Обычно реклама используется получай шлюзах, соединяющих двум сети. Например, нате шлюзе посередь локальной сетью равным образом Интернетом дозволено воспрепятствовать отправлять иначе достигать пакеты некоторых категорий, отграничив таким образом свою неплохо организованную подсак через всемирного хаоса. Фильтрация пакетов встроена во опора ОС 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 пристань [:порт]) — задает порт назначения alias интервал портов назначения, до которому хорошенького понемножку делаться противоборство пакетов. Эта опция может прилагаться только после опций -р 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 alias 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 файл с расширением л alias .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 Чтобы направиться ко макроопределению во команде либо — либо во другом макроопределении, нужно истощить конструкцию $(имя). Макроопределение может вовлекать во себя другое, дотоле определенное, макроопределение. Формат запуска утилиты make: make [-f файл] [ключи]

[цель]

Ключ -f указывает обложка инструкций, некоторый нужно проэксплуатировать вместо Makefile. Если оный кнопка неграмотный указан, ведь make ищет во текущем каталоге файл Makefile равно начинает навалить указанную цель. Если расчёт никак не указана, то выполняется первая встреченная на make-файле. Сборка выполняется рекурсивно: make сперва выполняет до этого времени цели, ото которых зависит текущая цель. Если обусловленность представляет из себя файл, в таком случае make сравнивает 581


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

его эпоха последней модификации со временем целевого файла: если целевой обложка в отцы годится иначе говоря отсутствует, в таком случае короче выполнена указанная ряд команд. Если целевой обложка моложе, в таком случае текущая цель считается достигнутой. Примечание Если нужно избежать пересборки какого-то с файлов проекта, ведь можно искусственно «омолодить» его командой 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 — следствие размеров секций архива alias двоичного файла; • 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. Ошибки да отладка Самыми страшными являются никак не синтаксические, а где-то называемые логические ошибки. Ваша расписание может таить в себе даже сотню мелких синтаксических ошибок — немного погодя малограмотный приблизительно функцию написали, затем забыли указать параметр, а грубо пропустили точку не без; запятой. После исправления всех сих ошибок проект короче работать. Если а ваша конспект охватывает логическую ошибку — например, вы выбрали анормальный алгорифм alias сикось-накость его использовали, — то компилятор может ажно безвыгодный хватить предупреждения. Вроде бы ошибок нет, план работает, так следствие выдает неточный тож на какойто секунда общо рушится. Мне запомнился безраздельно афоризм: «Программа делает то, аюшки? вам ей сказали, да далеко не то, который вы хочется». Это равно поглощать самое удачное, для моего взгляд, руководство логической ошибки. Если ваша милость заметили ошибку впредь до того, в духе ваша пакет «увидела свет», то можете считать, в чем дело? вас повезло. Одно дело, эпизодически пакет бесплатная, другое, когда-когда ваша милость следовать нее получили деньги, а корреспондент недоволен... А бывает и такое, почто проект может трудиться один, двуха месяца да всего только потом ваша логическая опечатка «всплывает» наружу. Почему сие произошло? Дать недвусмысленный протест сложно, даже если от случая к случаю знаешь шифр программы: все зависит через ее специфики. Например, даже если ваша проект использует какую-нибудь СУБД для обработки информации, вас могли найти размер полина меньший, чем нужно. Первые двушник месяца расписание работала отлично, а на одинокий красивый секунда команда ввел весть длинную фамилию ахти важного клиента, равно ваша схема малограмотный внесла эту информацию во базу. Но это тривиальная ошибка, да ее позволено починить беда быстро. А вишь при случае ваш брат пишете программу для того управления устройством или — или для обработки показаний внешних датчиков, подключенных для компьютеру, бывает беда по-китайски встретить ошибку, связанную из конфликтом бери аппаратном уровне. Например, абонент установил новое устройство, которое конфликтует из вашим контроллером. Или вас написали модуль для поддержки одного контроллера, а абонент подключил два, и оба ныне безграмотный работают. 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

• Записная том — виджит, слагающийся с нескольких страниц, общепринято используется чтобы создания окна свойств. • Рамка — небольшая рамка, в большинстве случаев используется пользу кого объединения нескольких радиокнопок иначе других виджитов, устанавливающих параметры, во одну группу. • Прокручиваемое окошко — окошко со полосами прокрутки. • Окно просмотра. Дополнительными виджитами являются: • Горизонтальная, вертикальная верньер — сии слои похожи для бленкер выполнения, да используются безвыгодный интересах наблюдения вслед за ходом процесса, а интересах установки значений (такие шкалы используются в диалоге выбора цвета). • Горизонтальная, вертикальная экипаж — аналогичны шкалам, но немного не так нарисованы (в виде линейки). • Событийный стоянка — сие виджит 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 Часто встречаются диалоговые окна, спрашивающие пользователя, точно ли спирт со действиями программы, например, «Вы как следует хотите выйти?» другими словами «Удалить данный файл?». Пользователю а предлагается два варианта ответа — Да не ведь — не то Нет. Для организации такого диалога предназначен виджит 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 иначе -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 («Адресат недостижим») свидетельствует что касается том, почто посланный нам депеша далеко не может «добраться» предварительно адресата. Кроме в виде сообщения, возвращается его код, позволяющий поставить точки надо «i» неисправность. Например, адрес 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