<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Всякие интересные штучки для WEB-разработчика</title>
	<atom:link href="http://iphp.com.ua/feed" rel="self" type="application/rss+xml" />
	<link>http://iphp.com.ua</link>
	<description>блог о технологиях web-разработки // all your base are belong to us</description>
	<lastBuildDate>Thu, 17 Nov 2011 08:49:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Оторвитесь от компьютера, сделайте гимнастику для глаз</title>
		<link>http://iphp.com.ua/archives/612</link>
		<comments>http://iphp.com.ua/archives/612#comments</comments>
		<pubDate>Thu, 17 Nov 2011 08:48:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=612</guid>
		<description><![CDATA[Резко поднимите глаза вверх, опустите вниз, посмотрите направо и налево. Повторите 7–10 раз. Закройте глаза, положите на веки подушечки указательного, среднего и безымянного пальцев, слегка надавите. Очень осторожно и мягко круговыми движениями массируйте глазные яблоки сначала по часовой стрелке, а затем – в другую сторону. Расположите пальцы так же, как и в предыдущем упражнении. Делайте [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Резко поднимите глаза вверх, опустите вниз, посмотрите направо и налево. Повторите 7–10 раз.</li>
<li>Закройте глаза, положите на веки подушечки указательного, среднего и безымянного пальцев, слегка надавите. Очень осторожно и мягко круговыми движениями массируйте глазные яблоки сначала по часовой стрелке, а затем – в другую сторону.</li>
<li>Расположите пальцы так же, как и в предыдущем упражнении. Делайте круговые движения глазами, преодолевая сопротивление рук. Сделайте 9 кругов в одну сторону и 9 — в другую.</li>
<li>Представьте себе очень большой обруч. Обведите его глазами справа налево. То же самое сделайте в другом направлении. Выполняя упражнение, не двигайте головой, вращайте только глазами. Повторите 5–7 раз.</li>
<li>Встаньте, смотрите только вперед на какой-либо предмет. Поверните голову направо, затем налево не отводя взгляда.. Повторите 8–10 раз в каждую сторону.</li>
<li>Встаньте, смотрите только вперед на какой-либо предмет. Поднимите, затем опустите голову, не отводя взгляда. Повторите 10 раз.</li>
</ol>
<p><span id="more-612"></span><br />
Люди, которые долгое время сидят за компьютером, ноутбуком, чтением книг, много времени проводять за рулём автомобиля или любым другим способом напрягают свои глаза, не задумываются о том, что их зрение постепенно ухудшается, хотят они этого или нет.</p>
<p>Компьютер в последние годы стал неотъемлемой частью нашей жизни на работе и дома. Но есть и обратная сторона. И касается она здоровья глаз. У 60% людей уже через 2–3 часа работы на компьютере наблюдается снижение остроты зрения, отмечается чувство жжения в глазах и ощущение «песка» под веками, боли в области глазниц и лба, покраснение глаз, даже головная боль. К сожалению, эти симптомы, которые специалисты объединили общим термином «астенопия», в той или иной степени наблюдаются у всех пользователей компьютера. Результатом, к сожалению, неизбежно становится потеря остроты зрения, ухудшение зрения в сумерках, развитие таких серьёзных заболеваний как катаракта, глаукома, дегенерация жёлтого пятна, дистрофия сетчатки.<br />
 Массовый характер проблем с глазами у людей, проводящих большую часть времени за экраном монитора, позволили врачам говорить о новой форме глазной патологии, получившей название «компьютерный зрительный синдром».</p>
<p>Одно из последних медицинских исследований в США показало, что у служащих, работающих за компьютером более 5–6 часов в день воспаление глаз и явления астенопии на 72% выше, чем у тех, кто проводит за компьютером 1–2 часа. Именно поэтому вводятся временные стандарты безопасного пользования мониторами. Например, в Австрали называется 5 часов в день как безопасный максимум работы за компьютером.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/612/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Мониторинг системы под FreeBSD</title>
		<link>http://iphp.com.ua/archives/609</link>
		<comments>http://iphp.com.ua/archives/609#comments</comments>
		<pubDate>Sat, 05 Nov 2011 17:59:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FreeBSD/Linux]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=609</guid>
		<description><![CDATA[Системные команды, которыми можно проверить ресурсы системы: top -mio – показать I/O по процессам top -S – показать системные процессы в топе (по дефолту они не показываются) gstat – нагрузка на диски iostat -d -w1 -c7 – нагрузка на диски systat -io start 1 diskinfo -t da0 – тест на дисковую производительность tunefs -p /var/ [...]]]></description>
			<content:encoded><![CDATA[<p>Системные команды, которыми можно проверить ресурсы системы:</p>
<p><strong>top -mio</strong> – показать I/O по процессам<br />
<strong>top -S</strong> – показать системные процессы в топе (по дефолту они не показываются)<br />
<strong>gstat</strong> – нагрузка на диски<br />
<strong>iostat -d -w1 -c7</strong> – нагрузка на диски<br />
<strong>systat -io start 1</strong><br />
<strong>diskinfo -t da0</strong> – тест на дисковую производительность<br />
<strong>tunefs -p /var/</strong> – информация о настройках файловой системы<br />
<strong>vmstat -z</strong> чего не хватает<br />
<strong>vmstat -i</strong> прерывания по устройствам<br />
<strong>netstat -i</strong> ошибки на интерфейсах<br />
<strong>systat -ifstat</strong> – интенсивность передачи трафика<br />
<strong>netstat -inb</strong> – передано через интерфейс в байтах<br />
<strong>netstat -w1</strong> – количество пакетов/ошибок/байт на интерфейсе<br />
<strong>sysctl kern.ipc.numopensockets</strong> – количество открытых сокетов<br />
<strong>df -H</strong> – количество свободного места<br />
<strong>df -i</strong> – количество свободных инодов<br />
<strong>freecolor </strong> – очень симпатичная утилита для мониторинга использования памяти (ставится из портов)</p>
<p>Для детальной информации по расходу памяти:<br />
<strong><br />
fetch -o /usr/local/bin/free http://people.freebsd.org/~rse/dist/freebsd-memory<br />
chmod +x /usr/local/bin/free<br />
free<br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/609/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Тюнинг FreeBSD 7-8 (sysctl, loader.conf)</title>
		<link>http://iphp.com.ua/archives/606</link>
		<comments>http://iphp.com.ua/archives/606#comments</comments>
		<pubDate>Thu, 08 Sep 2011 09:27:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FreeBSD/Linux]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=606</guid>
		<description><![CDATA[Некоторые опции по тюнингу FreeBSD и описание к ним. Предупреждение: Бездумное копирование опций не всегда приводит к приросту производительности!!! /etc/sysctl.conf ###### Формат записей " параметр=значение # значение по умолчанию " NETWORK Запрет ответа при обращении на закрытые порты.  По стандарту, если на закрытый порт сервера приходит SYN-пакет, машина должна ответить RST-пакетом. Это упрощает сканирование портов, [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторые опции по тюнингу FreeBSD и описание к ним.</p>
<p>Предупреждение: Бездумное копирование опций не всегда приводит к приросту производительности!!!<br />
<a name="more"></a><br />
<strong><span style="text-decoration: underline;">/etc/sysctl.conf</span></strong></p>
<pre><code> ###### Формат записей " параметр=значение # значение по умолчанию " </code></pre>
<p><strong><span style="text-decoration: underline;">NETWORK</span></strong><br />
<strong>Запрет ответа при обращении на закрытые порты. </strong><br />
По стандарту, если на закрытый порт сервера приходит SYN-пакет, машина должна ответить RST-пакетом.<br />
Это упрощает сканирование портов, а также дает достаточное количество информации (в виде ответов от сканируемого сервера) для определения версии ОС.<br />
&#171;Черные дыры&#187; заставляют FreeBSD быть предельно лаконичной, не отсылая ничего в ответ на запросы к закрытым портам.</p>
<pre><code> net.inet.tcp.blackhole=2 # 0 net.inet.udp.blackhole=1 # 0 </code></pre>
<p><strong>Увеличение размера очереди.</strong><br />
Защита очереди от SYN атак</p>
<pre><code> kern.ipc.somaxconn=4096 # 128 </code></pre>
<p>Чтобы сервер не стал жертвой DoS-атаки, можно включить <strong>механизм syncookies</strong>, который служит <strong>для защиты сервера от SYN-флуда. </strong><br />
Когда новое соединение не помещается в переполненный syncache, FreeBSD переходит в режим &#171;syncookies&#187; (<a rel="nofollow" href="http://iphp.com.ua/goto/http://www.protocols.ru/modules.php?name=News&amp;file=article&amp;sid=70"  rel="nofollow">TCP SYN cookies</a>).</p>
<p>При серьезной атаке может не менее серьезно выручить.</p>
<pre><code> net.inet.tcp.syncookies=1 # 1 <span id="more-606"></span> </code></pre>
<p><strong>Запрет ответа на широковещательный ECHO </strong><br />
Современная система не должна отвечать на широковещательные пинги, но и по сей день существуют сети, которые могут стать источником DoS-атаки.<br />
Чтобы не попасть в их список, выставляем:</p>
<pre><code> net.inet.icmp.bmcastecho=0 # 0 </code></pre>
<p><strong>Дропать все пакеты с флагами SYN+FIN.</strong><br />
Если не нужна поддержка смешного протокола T/TCP (TCP for Transactions), то пакеты с флагами SYN+FIN можно смело отбрасывать как неликвидные <img src='http://iphp.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
Протокол редко где используется, а потому это имеет смысл</p>
<pre><code> net.inet.tcp.drop_synfin=1 </code></pre>
<p><strong>Запрет ридеректов</strong></p>
<pre><code> net.inet.icmp.drop_redirect=1 # 1 net.inet.icmp.log_redirect=1 # 1 net.inet.ip.redirect=0 # 1 #net.inet6.ip6.redirect=0 #ipv6 disable in kernel </code></pre>
<p><strong>Очистка таблицы ARP </strong>через &#8230;. секунд</p>
<pre><code> net.link.ether.inet.max_age=1200 # 1200 </code></pre>
<p><strong>Запрет на &#171;прощупывание&#187; внутренней сети</strong></p>
<pre><code> net.inet.ip.sourceroute=0 # 0 net.inet.ip.accept_sourceroute=0 # 0 </code></pre>
<p><strong>Запрет запроса маски адреса, </strong><br />
<strong>запрет широковещательного запроса временного штампа (timestamp)</strong></p>
<pre><code> net.inet.icmp.maskrepl=0 # 0 </code></pre>
<p><strong>Максимальное количество пакетов ICMP</strong> &lt;&lt;Недостижимо&gt;&gt; <strong>(icmp type 3)</strong>, а также количество отсылок TCP RST пакетов в секунду.</p>
<pre><code> net.inet.icmp.icmplim=100 # 200 </code></pre>
<p><strong>Увеличение размера TCP-буферов</strong>, для оптимизации при большом потоке данных HTTP FTP.<br />
Но стоит помнить, что слишком объемные буферы быстро приведут к исчерпанию памяти при большом количестве подключений. Для веб-сервера, который принимает много коротких запросов и отправляет большие объемы данных, размер выходного буфера рекомендуется увеличить в ущерб входного.</p>
<pre><code> net.inet.tcp.sendspace=32768 # 32768 net.inet.tcp.recvspace=65536 # 65536</code></pre>
<p>Выставляет <strong>maximum segment lifetime</strong>.<br />
Определяет максимальное время жизни сегмента (Maximum Segment Life &#8212; MSL)<br />
После того как соединение закрывается сокет переходит в состояние TIME_WAIT<br />
Это максимальное количество времени ожидания ACK в ответ на SYN-ACK или FIN-ACK в миллисекундах<br />
В этом состоянии он может находится по умолчанию в течение 60 секунд.<br />
Время можно изменить через sysctl (в миллисекундах деленных на 2, 2 x 30000 MSL = 60 секунд)</p>
<pre><code> net.inet.tcp.msl=7500 # 30000 </code></pre>
<p>Во FreeBSD 6.2 <strong>TIME_WAIT сокеты</strong> обрабатываются отдельно (нужна лишь<br />
часть информации 48 байт из 1 Кб. Ограничение вне лимита kern.ipc.maxsockets)</p>
<pre><code> net.inet.tcp.maxtcptw=40960 # 40960 </code></pre>
<p>По умолчанию<strong> исходящие соединения </strong>инициируются<strong> с диапазона портов </strong>49152-65535 (16 тыс.). Во FreeBSD 8.1 &#8212; порты 10000 - 65535<br />
Их неплохо увеличить (1024-65535):</p>
<pre><code> net.inet.ip.portrange.first=1024 # 10000 net.inet.ip.portrange.last=65535 </code></pre>
<p><strong>Не менять ttl при транзите пакетов</strong></p>
<pre><code> net.inet.ip.stealth=0 # 0 </code></pre>
<p><strong>Включение пуллинга</strong></p>
<pre><code>kern.polling.enable=0 # 0 </code></pre>
<p><strong>Pooling</strong></p>
<pre><code> kern.polling.each_burst=5 # 5 kern.polling.burst_max=1000 # 150 </code></pre>
<p><strong>Установка значения ttl </strong>под Windows</p>
<pre><code> net.inet.ip.ttl=128 # 64 </code></pre>
<p><strong>Максимальаня длина приёмной очереди</strong>, при переполнении которой стек дропает входящие пакеты</p>
<pre><code> net.inet.ip.intr_queue_maxlen=4096 # 50 </code></pre>
<p>Увеличить <strong>максимальное число открытых сокетов</strong></p>
<pre><code> sysctl kern.ipc.maxsockets=204800 # 25600 </code></pre>
<p>Если машина обрабатывает несколько десятков тысяч соединений, то <strong>tcb hash</strong> позволяет быстро<br />
определять принадлежность пришедшего пакета к определенному соединению.</p>
<pre><code> net.inet.tcp.tcbhashsize=4096 # 4096</code></pre>
<p>Для <strong>использования портов по порядку</strong>, вместо случайной выборки (для исключения ошибки повторного коннекта с одного порта до отработки TIME_WAIT):</p>
<pre><code> net.inet.ip.portrange.randomized=0 # 1 </code></pre>
<p>Во FreeBSD 6.2 появилась возможность <strong>не создавать состояние TIME_WAIT для соединений в рамках localhost:</strong></p>
<pre><code> net.inet.tcp.nolocaltimewait=1 # 0 </code></pre>
<p><strong>DummyNET &#8212; шейпинг на IPFW</strong><br />
<strong>net.inet.ip.dummynet.io_fast</strong> &#8212; если трафик помещается в заданную полосу, не пропускать его через очередь и отдельный поток. Если нет необходимости эмулировать задержки и потери в канале &#8212; очень сильно сохраняет ресурсы. При использовании этой опции практически отпадает необходимость в распараллеливании dummynet</p>
<pre><code>net.inet.ip.dummynet.io_fast=1  </code></pre>
<p><strong> </strong><br />
<strong>net.inet.ip.intr_queue_maxlen, net.route.netisr_maxqlen</strong> &#8212; фактически &#8212; размеры входящей и исходящей очередей. При большой нагрузке в режиме маршрутизации есть смысл увеличивать эти значения. Непоместившийся пакет выбрасывается. Это условно спасет при кратковременных перегрузках (часть пакетов пролетит с большой задержкой), но совершенно не спасет при хроничеких.</p>
<p><strong>net.isr.direct</strong> &#8212; обрабатывать исходящие пакеты непосредственно при попытке отправки (в т.ч. прохождение ipfw на выходе). Т.е. не откладывать в очередь, которую в отдельном потоке разгребает netisr. Есть смысл включать, если количество ядер меньше или равно количеству сетевых карточек. Влияет на скорость ОТПРАВКИ пакетов. Для серверов это хорошо, для роутеров &#8212; не очень. Если нагрузка на сетевые карты неравномерная, или когда есть хотя бы одно хронически недогруженое ядро &#8212; выключать. При включеном net.inet.ip.fastforwarding будет еще 1 спецэффект.</p>
<p><strong>net.isr.direct_arp</strong> &#8212; обрабатывать исходящие ARP пакеты непосредственно при попытке отправки. Есть смысл держать включенным в большинстве случаев (разумного варианта, когда стоит отправлять такие запросы в очередь я придумать не могу). Добавлено для того, чтобы обработкой ARP система могла заниматься с бОльшим приоритетом даже при net.isr.direct=0</p>
<p><strong>net.isr.maxthreads</strong> &#8212; собственно, количество потоков, разгребающих очередь пакетов. Есть смысл ставить меньшим количества ядер в системе. Нужно прикинуть, сколько ресурсов съедается на обработке прерываний от сетевух и не только, сколько в пике потребляет прочий софт (БД, httpd, прочие демоны) и на оставшееся распределить роутинг. Если, к примеру, сетевухи потребляют по 80% с 2х ядер и софт еще до 100% одного ядра, а всего ядер 4, то остается 140% гарантированного времени. Т.е. полтора ядра <img src='http://iphp.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Тут можно смело ставить роутинг в 2 потока. Если нагрузки по софту кратковременные, а на роутинг с трудом хватает &#8212; можно даже попробовать 3.</p>
<p><strong>net.inet.ip.fastforwarding</strong> &#8212; обрабатывать входящие пакеты непосредственно в момент приема (в т.ч. прохождение ipfw на входе, до попадания в очередь netisr). Есть смысл включать, если количество ядер меньше или равно количеству сетевых карточек, так же как и net.isr.direct. Влияет на скорость ПРИЕМА пакетов. Обработка пакета происходит прямо в обработчике прерывания. Следует учесть, что не все сетевухи и не все драйвера нормально умеют складировать новые пакеты в очередь, пока обрабатывается текущий. При включеном net.inet.ip.fastforwarding будет еще 1 спецэффект &#8212; маршрутизация пакета и прохождение ipfw (оба раза) будут происходить в том же обработчике прерывания. Фактически, на время обработки входящего пакета сетевая карта будет заблокирована. Это неплохо смотрится при преобладающем входящем трафике и на однопроцессорных машинах.<strong> </strong></p>
<p><strong><span style="text-decoration: underline;">Файловая система</span></strong><br />
Запрет возможности монтирования файловых систем непривилегированными пользователями.</p>
<pre><code> vfs.usermount=0 # 0</code></pre>
<p><strong><span style="text-decoration: underline;"><br />
</span></strong><br />
<strong><span style="text-decoration: underline;">Ресурсы системы  </span></strong><br />
<strong>Увеличение числа mbuf кластеров</strong><br />
Можно увеличить до 262144<br />
(в loader.conf &#8212; vm.kmem_size=1G, в ядре options KVA_PAGES=512)</p>
<pre><code> kern.ipc.nmbclusters=65536 # 25600 </code></pre>
<p>Приложения работают не с сокетами, а с файлами. По этому для каждого<br />
сокета нужна структура, которая описывает файл.<br />
<strong>kern.maxfiles &#8212; всего файлов в системе</strong><br />
<strong>kern.maxfilesperproc &#8212; максимальное число файлов на один процесс.</strong></p>
<pre><code> kern.maxfiles=204800 kern.maxfilesperproc=200000 </code></pre>
<p>Можно динамически изменить параметры <strong>shared memory</strong></p>
<pre><code> sysctl -a | grep shm </code></pre>
<p>Вычисляется следующим образом:</p>
<pre><code> SHMMAX = SHMALL * PAGE_SIZE + 1 Где PAGE_SIZE равно 4096 Б для i386 SHMALL = k * RAM * 1024 / PAGE_SIZE Где RAM – физическая оперативная память в МБ; k – коэффициент, равный 0.5; PAGE_SIZE – размер одной страницы в КБ, PAGE_SIZE = 4 КБ для i386. </code></pre>
<p>Например, для машины с памятью 512 МБ,</p>
<pre><code> SHMALL = 0.5 * 512 * 1024 / 4 = 65536. </code></pre>
<p>В случае, если предполагается, что приложение будет работать на специально выделенном для этого сервере, и кроме него никаких других серьезных сервисов запущено не будет, то коэффициент k, можно увеличивать до 0.75, это 3/4 от физической оперативной памяти. Рекомендую также посмотреть утилиту  <strong>ipcs</strong>.<br />
Например для сервера <a rel="nofollow" href="http://iphp.com.ua/goto/http://postgresqlrussia.org/pgsqldocrus/doc/src/sgml/kernel-resources.html" >PostgreSQL</a> можно выставить следующие значения:</p>
<pre><code> kern.ipc.shmall=65536 <code>kern.ipc.shmmax=536870912 kern.ipc.semmap=256</code> </code></pre>
<p><strong><span style="text-decoration: underline;">/boot/loader.conf</span></strong> Увеличить лимита физической памяти, которую может использовать ядро (по умолчанию 320Мб). Увеличим до 1Гб:</p>
<pre><code> vm.kmem_size=1G </code></pre>
<p>для amd64 оказалось недостаточно указать vm.kmem_size_max=1G в /boot/loader.conf, (параметр был просто игнорирован) по-этому это надо сделать в файле конфигурации ядра:</p>
<pre><code> options VM_KMEM_SIZE=1073741824 options VM_KMEM_SIZE_MAX=1073741824 </code></pre>
<p>В /boot/loader.conf для обеих платформ нужно добавить vm.kmem_size_max=1G Увеличение syncache и syncookies( на этапе загрузки).</p>
<pre><code> net.inet.tcp.syncache.hashsize=1024 net.inet.tcp.syncache.bucketlimit=100 </code></pre>
<p>Задаем какой буфер использовать для сетевых карточек (должен быть реально)</p>
<pre><code>## Для карточек Intel с драйвером em hw.em.rxd=4096 hw.em.txd=4096 ## Для новых карточек Intel с драйвером igb hw.igb.rxd=4096 hw.igb.txd=4096 </code></pre>
<p><strong>Увеличение количества семафоров</strong></p>
<pre><code> kern.ipc.semmnu=256 kern.ipc.semmns=32000 kern.ipc.shmmni=4096 </code></pre>
<p><strong><span style="text-decoration: underline;">Опции ядра</span></strong> <strong>Увеличение адресного пространства ядра</strong>, которое на i386 платформе &#8212; 1Гб. Для увеличения до 2Гб. На платформе amd64 KVA всегда 2G.</p>
<pre><code> options KVA_PAGES=512 </code></pre>
<p>Данная опция в FreeBSD 8.x предназначена для ускорения маршрутизации. При больших потоках трафика проц вгоняется в полку, поэтому настоятельно рекомендую вырубать ее нафиг, чтоб не наблюдать , как ваш роутер уходит в нирвану&#8230;</p>
<pre><code> #options FLOWTABLE # per-cpu routing cache </code></pre>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/606/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Некоторые опции sysctl</title>
		<link>http://iphp.com.ua/archives/603</link>
		<comments>http://iphp.com.ua/archives/603#comments</comments>
		<pubDate>Fri, 05 Aug 2011 04:09:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FreeBSD/Linux]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=603</guid>
		<description><![CDATA[Озадачился собрать и попробовать всякие sysctl опции ядра, повышающие безопасность машины, и облегчающие её работу при попытках всяких атак и сканировании портов. А может, даже, просто те пункты, которые показались интересными и нужными &#8212; причём даже только начав, заметил одну вещщь &#8212; почти всё касается работы стека TCP/IP, что и неудивительно, ибо основное применение FreeBSD [...]]]></description>
			<content:encoded><![CDATA[<p>Озадачился собрать и попробовать всякие sysctl опции ядра, повышающие безопасность машины, и облегчающие её работу при попытках всяких атак и сканировании портов. А может, даже, просто те пункты, которые показались интересными и нужными &#8212; причём даже только начав, заметил одну вещщь &#8212; почти всё касается работы стека TCP/IP, что и неудивительно, ибо основное применение FreeBSD &#8212; это серверы. Порывшись в инете понял &#8212; 90% данных это скопированный друг у друга перевод какой-то буржуйской статьи. Собстно поэтому и начал ковыряться &#8212; остальные 10% &#8212; это далеко немало&#8230; Причина крайне проста &#8212; это самая недокументированная часть FreeBSD&#8230;</p>
<p>Следующие два пункта касаются поведения ОС при попытке подключиться на порты, которые не слушаются приложениями. При штатных настройках, в таком случае, система посылает пакет с флагом RST, и закрывет подключение. Удалённый хост получает примерно следующее (если пробовать telnet`ом подключиться): <em>Connection reset by peer</em>.<br />
<strong>net.inet.tcp.blackhole=2</strong> &#8212; данный пункт указывает, что происходит при получении TCP-пакета на закрытый порт (не слушаемый никакими приложениями)Если стоит &#171;1&#8243;, то SYN пакеты (пакет, устанавливающий соединение) на закрытый порт будут отклоняться без отсылки отправителю RST пакета (перезагрузка (соединения, не машины <img src='http://iphp.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )). При установке в &#171;2&#8243;, вообще все (а не только SYN) пакеты на закрытый порт отбрасываются без каких-либо действий. Данный пункт позволяет разгрузить ЦП, т.к. обработка пакетов не производится, и интернет-канал сервера &#8212; т.к. не надо слать ответных пакетов.</p>
<p><strong>net.inet.udp.blackhole=1</strong> &#8212; очень похож на предыдущий пункт, по результату, но для протокола UDP. Ввиду того, что протокол UDP работает без установки соединения, есть только два, а не три варианта установки, когда эта переменная установлена в 1, то отбрасываются все UDP пакеты, адресованые закрытым портам.</p>
<p><strong>kern.ipc.somaxconn=1024</strong> &#8212; увеличивает размер очереди для сокетов, чем помогает предотвратить SYN-атаку, когда очередь сокета переполняется некорректными попытками соединений. Конечно от мощной атаки это не спасёт, но от слабой и средней &#8212; должно помочь. Значение по дефолту &#8212; 128.</p>
<p>Следующие 4 пункта необходимы для невозможности удалённого изменения таблицы маршрутизации на Вашем хосте. Надо заметить, что установив эти пункты как указано, я столкнулся с проблемами в собственной сети &#8212; как оказалось между некоторыми подсетями маршрутизация была криво настроена (причём сам же знал, что криво, сам же криво и делал &#8212; быстрей, быстрей! &#8212; а потом всё недосуг было заняться) &#8212; соответственно клиентские компы начали терять некоторые сети. Пришлось сделать всё по-уму <img src='http://iphp.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>net.inet.icmp.drop_redirect=1</strong> &#8212; уничтожать icmp-датаграммы переадресации</p>
<p><strong>net.inet.icmp.log_redirect=1</strong> &#8212; записывать в журнал событий icmp-датаграммы с указанием переадресации</p>
<p><strong>net.inet.ip.redirect=0</strong> &#8212; может ли эта машина посылать дейтаграммы переадресации другим (вот из-за изменения этого пункта у меня сеть и плющщило, но менять его надо, просто надо сразу сетку корректно настраивать)</p>
<p><strong>net.inet6.ip6.redirect=0</strong> &#8212; предыдущий пункт, но для IPv6</p>
<p><span id="more-603"></span>Пара пунктов отвечающих за работу TCP. Общий смысл такой: ОСь не отвечет на каждый пакет, что он получен или неполучен сразу, а ждёт, пока придёт (или подготовится к отправке) некоторое количество инфы, а потом разом всё это отправляет. Тем самым удаётся разгрузить сеть, т.к. уменьшается общее число пересланных байт (меньше накладных расходов). Очень полезно при интенсивной нагрузке на сеть в одну сторону (HTTP, FTP, &amp; etc). Эти два параметра позволяют установить размер окна приёма и передачи соостветственно. Ограничение по RFC (RFC1323, RFC2018) составляет 64k, но реально можно поставить и больше &#8212; тока надо быть уверенным, что и с клиентской стороны подддерживается такое большое окно. Если поставить больше то могут возикнуть проблемы: клиент данные шлёт, а подтверждения не получает, по достижении 64k он думает, что, по неизветстным причинам пропали все пакеты и начинает слать их заново&#8230; А Ваш всё ждёт&#8230; <img src='http://iphp.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )) Дефолтовые значения современных FreeBSD &#8212; sendspace=32768 и recvspace=57344. (Насколько я понимаю, у старых было меньше 32k). Пробовал увеличить до 65536 &#8212; вроде косяков не заметил&#8230;</p>
<p><strong>net.inet.tcp.sendspace=65536</strong> &#8212; размер `окна` отправки</p>
<p><strong>net.inet.tcp.recvspace=65536</strong> &#8212; размер `окна` приёма</p>
<p><strong>net.link.ether.inet.max_age=1200</strong> &#8212; время устаревания записей ARP, в секундах. По истечении этого времени запись удаляется. Тоже помогает против соответствующего типа атаки &#8212; когда в таблице ARP создаётся много неверных записей. По дефолту оно 1200 и есть, но возможно, имеет смысл, уменьшить это значение.</p>
<p><strong>net.inet.ip.sourceroute=0</strong> и <strong>net.inet.ip.accept_sourceroute=0</strong> &#8212; При помощи маршрутизации отправителя (это когда в пакете, ещё и маршрут нарисован, по которому его надо дальше передавать) возможно прощупать вашу внутреннюю сеть снаружи (даже если это частная сеть!). Значения по-умолчанию (0) запрещают такое делать. Так что менять не надо.</p>
<p><strong>net.inet.icmp.bmcastecho=0</strong> &#8212; Установка в этого пункта в `0` (а по-умолчанию он так и стоит) зарубает ICMP-сообщения типов 0 и 8 (эхо-запрос и эхо-ответ) на широковещательном адресе.</p>
<p><strong>net.inet.icmp.maskrepl=0</strong> &#8212; Также, с помощью icmp можно запросить маску Вашей сети, и узнать её размер (не то, чтобы прям такая ценная инфа, но облегчать работу противника не надо ни в чём.).<br />
По умолчанию этот параметр в `0` &#8212; что запрещает такие запросы. Не надо его ставить в `1` <img src='http://iphp.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
# net.inet.tcp.msl=15000 &#8212; Есть такая феня, как максимальное время жизни сегмента (Maximum Segment Life &#8212; MSL) &#8212; максимальное время ожидания ASK в ответ на SYN-ACK или FIN-ACK (миллисекунд). По RFC 753 оно 120 секунд. Но это писалось в 1979 году и многое поменялось. В современных FreeBSD оно равно 30 секунд. Имеет смысл поставить его меньше.</p>
<p><strong>net.inet.icmp.icmplim=100</strong> &#8212; Для уменьшения урона от атак, при который генерится много ответных пакетов, можно поставить ограничение на количество ICMP тип 3 (адресат недостижим) и TCP RST (перезагрузка соединения). По дефолту оно стоит 200. Можно поставить меньше.</p>
<p><strong>security.bsd.see_other_uids=0</strong> и <strong>security.bsd.see_other_gids=0</strong> &#8212; Для увеличения безопасности машин, на которые есть шелл у других пользователей, можно сделать так, чтобы каждому пользователю показывались только его процессы, а чужие он невидел. На 4.11 такого пункта нет, в 6.0 есть. Пятую ветку надо проверять. По дефолту значение `1` &#8212; все всё видят. Если поставить `0` &#8212; то только свои процессы.</p>
<p><strong>security.bsd.conservative_signals=0</strong> &#8212; Запрет посылать сигналы, от непривелигированных процессов, процессам которые сменили свой uid/gid.</p>
<p><strong>security.bsd.unprivileged_proc_debug=0</strong> &#8212; Непривелигированные процесы могут использовать средства отладки процессов.</p>
<p><strong>security.bsd.unprivileged_read_msgbuf=0</strong> &#8212; непривелигированные процессы могут читать буфер сообщений ядра (dmesg).</p>
<p><strong>security.bsd.hardlink_check_uid=0</strong> &#8212; непривелигированные процессы не могут делать жёсткие ссылки на файлы других пользователей.</p>
<p><strong>security.bsd.hardlink_check_gid=0</strong> &#8212; непривелигированные процессы не могут делать жёсткие ссылки на файлы других групп.<br />
<strong>vfs.usermount=0</strong> &#8212; возможность непривелигированным пользователям монтировать и отмонтировать устройства (при условии соответсвующих прав на устройство и точку монтирования).</p>
<p><strong>net.inet.tcp.log_in_vain=0</strong> и <strong>net.inet.udp.log_in_vain=0</strong> &#8212; Логгирование всех попыток подключения к портам которые никто не слушает (в M$-сетях, чревато большим потоком логов&#8230; Да и в инете тоже..)</p>
<p><strong>net.inet.tcp.sack.enable=0</strong> &#8212; тюнинг сетевой подсистемы &#8212; при большой нагрузке на запрсы отвечатеся селективно.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/603/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Конвертируем все php-файлы проекта в UTF-8</title>
		<link>http://iphp.com.ua/archives/600</link>
		<comments>http://iphp.com.ua/archives/600#comments</comments>
		<pubDate>Fri, 29 Jul 2011 03:04:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Soft/Tools]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=600</guid>
		<description><![CDATA[Проблема с кодировками является достаточно распространенной. Часто при создании проекта требуется использовать всем одну кодировку например UTF-8, но порой просто не уследишь за всеми добавленными в проект файлами. Конечно можно потратить много времени и сил перекодируя все текстовым редакторе, но если точно знаем из какой кодировки в какую надо конвертить то просто выполняем в консоли [...]]]></description>
			<content:encoded><![CDATA[<p>Проблема с кодировками является достаточно распространенной. Часто при создании проекта требуется использовать всем одну кодировку например UTF-8, но порой просто не уследишь за всеми добавленными в проект файлами. Конечно можно потратить много времени и сил перекодируя все текстовым редакторе, но если точно знаем из какой кодировки в какую надо конвертить то просто выполняем в консоли команду </p>
<pre class="brush: bash; title: ; notranslate">
find . -name '*.php' | while read i; do iconv -f WINDOWS-1251 -t UTF-8 &quot;$i&quot; &gt;tmp; mv tmp &quot;$i&quot;; done
</pre>
<p>и все файлы *.php в этой папке перекодируются в UTF-8.<br />
Список доступных кодировок можно вывести командой <strong>iconv -l</strong> </p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/600/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Перенос FreeBSD на другой диск</title>
		<link>http://iphp.com.ua/archives/597</link>
		<comments>http://iphp.com.ua/archives/597#comments</comments>
		<pubDate>Fri, 15 Jul 2011 22:05:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FreeBSD/Linux]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=597</guid>
		<description><![CDATA[Если диск начал грязно ругаться в dmesg на ошибки чтения-записи, значит пора переезжать. Допустим у нас FreeBSD версии 7.0&#8230; Выключаемся, вставляем новый диск (у меня он ad2). Он у меня немного поменьше, потому внимательно смотрим - и думаем, какую файловую систему насколько можно ужать. Подумали &#8212; можно приступать. идем в меню Configure->Fdisk, в нем удаляем [...]]]></description>
			<content:encoded><![CDATA[<p>Если диск начал грязно ругаться в dmesg на ошибки чтения-записи, значит пора переезжать. Допустим у нас FreeBSD версии 7.0&#8230;</p>
<p>Выключаемся, вставляем новый диск (у меня он ad2). Он у меня немного поменьше, потому внимательно смотрим</p>
<pre class="brush: bash; title: ; notranslate">
$ df -m
</pre>
<p>- и думаем, какую файловую систему насколько можно ужать.<br />
Подумали &#8212; можно приступать.</p>
<pre class="brush: bash; title: ; notranslate">
# sysinstall
</pre>
<p>идем в меню <strong>Configure->Fdisk</strong>, в нем удаляем существующие партиции и создаем одну новую на весь диск. Сложностей никаких. Есть тонкость &#8212; выходить нужно по Q, не нажимая W. (Если в задумчивости нажали, катастрофы нет &#8212; но перед следующей операцией придется перегружаться).</p>
<p>На вопрос про Boot Manager отвечаем Standard.</p>
<p>Переходим в пункт меню Label.</p>
<p>Здесь нас поджидает еще одна тонкость. Будущий корневой раздел должен быть создан с меткой ad2s1a, но sysinstall не позволяет задавать метку вручную, а при указании точки монтирования отличной от / автоматически присваеват имя ad2s1d. У меня сработала такая последовательность: сперва создал раздел с точкой монтирования / &#8212; и он получил правильную метку, а потом нажал M &#8212; и изменил точку монтирования на /tmp/root.</p>
<p>Далее без каких-либо сложностей создаются раздел подкачки ad2s1b и файловые системы с точками монтирования /tmp/usr и /tmp/var (соотношение меток и точек монтирования сверяйте с вашим /etc/fstab &#8212; если, конечно, у вас нет охоты переделать все по-новому).<br />
Выход из Label нажатием W (появляется большое ругательное окно, с вопросом, понимаете ли вы, что творите. Нужно ответить Yes) и потом Q.</p>
<p>Выходим из sysinstall и смотрим на новые файловые системы:</p>
<pre class="brush: bash; title: ; notranslate">
$ mount
</pre>
<p>Теперь переносим на них содержимое старого диска:</p>
<pre class="brush: bash; title: ; notranslate">
# cd /
# find . -xdev -print | cpio -p -m /tmp/root
# cd /usr
# find . -xdev -print | cpio -p -m /tmp/usr
# cd /var
# find . -xdev -print | cpio -p -m /tmp/var
</pre>
<p>Чтобы веселее было ждать конца копирования, у cpio можно добавить опцию &#8212;verbose<br />
(команда копирования может быть и такой: </p>
<pre class="brush: bash; title: ; notranslate">
pax -rw -X -pe . /tmp/root
</pre>
<p> &#8212; так короче, но вариант find+cpio просто привычнее &#8212; и переносимее &#8212; кто-нибудь видел pax напр. под Linux? &#8212; про другие unix-like системы уже молчу).<br />
Вот и весь процесс. Выключаемся, ставим новый диск на место старого &#8212; и грузим систему.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/597/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Удобный конфиг для tcsh</title>
		<link>http://iphp.com.ua/archives/592</link>
		<comments>http://iphp.com.ua/archives/592#comments</comments>
		<pubDate>Tue, 12 Jul 2011 23:59:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FreeBSD/Linux]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=592</guid>
		<description><![CDATA[кладем в .tcshrc и радуемся Для того, что бы история сохранялась более надёжно (не только по команде exit) нужно добавить в файл .logout строчку]]></description>
			<content:encoded><![CDATA[<p>кладем в .tcshrc и радуемся</p>
<pre class="brush: bash; title: ; notranslate">
#
# File   : tcsh config for Frenzy 1.0
# Author : Sergei Mozhaisky (technix@frenzy.org.ua)
# 

setenv	EDITOR		vi
setenv	PAGER		more
setenv	BLOCKSIZE	K

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin)

# if this is not interactive shell - exit
if ($?USER == 0 || $?prompt == 0) exit

set autocomplete
set autoexpand
set autolist
set filec
set ellipsis
#set nobeep
set listjobs
set rmstar
set prompt = &quot;%{&#92;&#48;33[31m%}%n@%m:%{&#92;&#48;33[34m%}%c02%{&#92;&#48;33[0m%}%# &quot;
set prompt2 = &quot;%R?&quot;
set history = 10000
set savehist = (10000 merge)
set inputmode = insert
set symlinks = chase
limit coredumpsize 0
unset autologout
        set mail = (/var/mail/$USER)
        if ( $?tcsh ) then
                bindkey &quot;^W&quot; backward-delete-word
                bindkey -k up history-search-backward
                bindkey -k down history-search-forward
        endif

## Alias section
alias today     &quot;date '+%Y%m%d'&quot;
alias mess      'clear ; tail -f /var/log/messages'
alias ff        'find . -name $*'
alias h		'history 25'
alias j 	'jobs -l'
alias la	'ls -a'
alias lf	'ls -FA'
alias ll	'ls -lA'

# enter command name and press F1 to see man on this prog
alias helpcommand man

## Bindkey section

# F1 : help on command currently typed(if 'ls passwd', help on 'ls').
bindkey ^[[M run-help
bindkey [OP  run-help

if ($term == &quot;xterm&quot; || $term == &quot;vt100&quot; || $term == &quot;vt102&quot; || $term !~ &quot;con*&quot;) then
# bind keypad keys for console, vt100, vt102, xterm
bindkey &quot;\e[1~&quot; beginning-of-line  # Home
bindkey &quot;\e[7~&quot; beginning-of-line  # Home rxvt
bindkey &quot;\e[2~&quot; overwrite-mode     # Ins
bindkey &quot;\e[3~&quot; delete-char        # Delete
bindkey &quot;\e[4~&quot; end-of-line        # End
bindkey &quot;\e[8~&quot; end-of-line        # End rxvt
else
# INSERT : toggles overwrite or insert mode.
bindkey ^[[L  overwrite-mode
bindkey ^[[2~ overwrite-mode        # for x
# DELETE : delete char at cursor position.
bindkey ^?    delete-char
bindkey ^[[3~ delete-char           # for x
# HOME : go to the beginning of the line.
bindkey ^[[H beginning-of-line
# END : go to the end of the line.
bindkey ^[[F end-of-line
endif
</pre>
<p>Для того, что бы история сохранялась более надёжно (не только по команде exit) нужно добавить в файл .logout строчку</p>
<pre class="brush: bash; title: ; notranslate">
history -S
</pre>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/592/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Лишние символы перед тегом html, странные цифры в начале и в конце страницы в выдаче веб-сервера</title>
		<link>http://iphp.com.ua/archives/585</link>
		<comments>http://iphp.com.ua/archives/585#comments</comments>
		<pubDate>Thu, 27 Jan 2011 08:21:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=585</guid>
		<description><![CDATA[Если выводится странные цифры перед тегом &#60;html&#62; после тега &#60;/html&#62; а также внутри самой страницы и вас это пугает, то вот вам решение: Проблема связана с тем, что некоторые прокси не могут адекватно обрабатывать http 1.1 headerы, которые шлются из php. Решение &#8212; добавить в файл .htaccess строчку: Объяснение значения отсюда: http://httpd.apache.org/docs/2.2/env.html force-no-vary This causes [...]]]></description>
			<content:encoded><![CDATA[<p>Если выводится странные цифры перед тегом &lt;html&gt; после тега &lt;/html&gt; а также внутри самой страницы и вас это пугает, то вот вам решение:</p>
<p>Проблема связана с тем, что некоторые прокси не могут адекватно обрабатывать http 1.1 headerы, которые шлются из php.</p>
<p>Решение &#8212; добавить в файл .htaccess строчку:</p>
<pre class="brush: bash; title: ; notranslate">SetEnv force-no-vary</pre>
<p>Объяснение значения отсюда: http://httpd.apache.org/docs/2.2/env.html</p>
<p><strong>force-no-vary</strong></p>
<p>This causes any Vary fields to be removed from the response header before it is sent back to the client. Some clients don&#8217;t interpret this field correctly; setting this variable can work around this problem. Setting this variable also implies force-response-1.0.</p>
<p>Можно поробовать еще:</p>
<p><strong>downgrade-1.0</strong></p>
<p>This forces the request to be treated as a HTTP/1.0 request even if it was in a later dialect.</p>
<p>force-response-1.0</p>
<p>This forces an HTTP/1.0 response to clients making an HTTP/1.0 request. It was originally implemented as a result of a problem with AOL&#8217;s proxies. Some HTTP/1.0 clients may not behave correctly when given an HTTP/1.1 response, and this can be used to interoperate with them.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/585/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Управление портами в FreeBSD</title>
		<link>http://iphp.com.ua/archives/583</link>
		<comments>http://iphp.com.ua/archives/583#comments</comments>
		<pubDate>Thu, 20 Jan 2011 01:57:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FreeBSD/Linux]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=583</guid>
		<description><![CDATA[В системах FreeBSD, OpenBSD и NetBSD существует два подхода к установке дополнительного программного обеспечения, так называемых портов и пакетов, в данном руководстве я буду опираться лишь на подход в OS FreeBSD: ports, packages. Packages или пакеты, это уже собранные(binaries &#8212; исполняемый код) пакеты для того или иного FreeBSD RELEASE из портов для этих RELEASE. Порты [...]]]></description>
			<content:encoded><![CDATA[<p>В системах FreeBSD, OpenBSD и NetBSD существует два подхода к установке<br />
дополнительного программного обеспечения, так называемых портов и пакетов,<br />
в данном руководстве я буду опираться лишь на подход в OS FreeBSD:</p>
<p>ports, packages.</p>
<p>Packages или пакеты, это уже собранные(binaries &#8212; исполняемый код) пакеты<br />
для того или иного FreeBSD RELEASE из портов для этих RELEASE.</p>
<p>Порты постоянно обновляются, поэтому готовые пакеты собираются и проверяются<br />
только для выпускаемого RELEASE. Термин port &#8212; сокращение от portability,<br />
портабельность, существует много программного обеспечения Freeware или под<br />
лицензиями GPL (http://www.gnu.org/licenses/licenses.html) и &#171;AS IS&#187; BSD-лицензия (http://www.bsdnewsletter.com/bsd/license.html), команда разработчиков<br />
FreeBSD занимается адоптацией или портированием такого программного обеспечения<br />
для OS FreeBSD.<span id="more-583"></span></p>
<p>Это касательно портов, пакеты &#8212; это собранные порты за конкретную дату,<br />
те(то есть) порты для выпущенного FreeBSD RELEASE. Обычно собранные для RELEASE<br />
пакеты идут на 3 и 4&#8242;ом ISO-Images и доступны:</p>
<p>ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/X.Y[.Z]/</p>
<p>где X.Y[.Z] цифры соответствующие тому или иному релизу</p>
<p>или</p>
<p>ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-X.Y[.Z]-release/</p>
<p>в то время как полное дерево портов для каждого релиза можно взять:</p>
<p>ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/X.Y[.Z]-RELEASE/ports/ports.tgz</p>
<p>или используя cvsup:</p>
<p>- установить cvsupit из портов (/usr/ports/net/cvsupit/), а лучше взять<br />
готовый пакет: <a rel="nofollow" href="http://iphp.com.ua/goto/http://ftp.webmonster.de/jdp/s1g/" >cvsup16.1e</a><br />
советую брать без GUI, гораздо удобнее использовать командную строку и<br />
скрипты, например: <a rel="nofollow" href="http://iphp.com.ua/goto/http://unix1.jinr.ru/%7elavr/cvsup/" >скрипты cvsup</a></p>
<p><strong>Совет:</strong> всегда сохраняйте сперва предыдущую копию портов, на всякий случай</p>
<p>отдельные порты можно выкачивать, например bash2:</p>
<p>сохраняем на всякий случай старый порт<br />
# cd /usr/ports/shells<br />
# mv bash2 bash2.old</p>
<p>выкачиваем свежий порт<br />
# wget -Y off -t 0 -c -r -nH &#8212;cut-dirs=6 ftp://ftp.ru.freebsd.org/pub/FreeBSD/branches/-current/ports/shells/bash2/</p>
<p>когда выкачиваете отдельные порты, имейте ввиду что они могут требовать<br />
других свежих портов, ищите в Makefile&#8217;е интересующего вас порта<br />
ключевые слова DEPENDS, кроме этого могут изменяться *.mk файлы для утилиты<br />
make: /usr/ports/Mk/, из-за чего возникают ошибки при сборке портов на этапе<br />
разбора самого Makefile&#8217;а.</p>
<p>прим: чтобы не загружать основные сервера ftp.freebsd.org или cvsup.freebsd.org<br />
используйте ближайшие к вам географические зеркала:</p>
<p>http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/mirrors-ftp.html</p>
<p>man ports &#8212; всегда поможет и ответит на многие вопросы</p>
<p>дерево портов: /usr/ports/категория</p>
<p>конкретный порт: /usr/ports/категория/название_порта</p>
<p>содержимое директории порта:</p>
<p>/usr/ports/категория/название_порта/Makefile &#8212; файл сборки проекта<br />
/usr/ports/категория/название_порта/distinfo &#8212; md5 контрольные суммы дистрибутивов которые будут собраны<br />
/usr/ports/категория/название_порта/files &#8212; директория в которой содержатся freebsd-related патчи для данного программного продукта<br />
/usr/ports/категория/название_порта/scripts &#8212; директория со скриптами создания дополнительной конфигурации или зависимого Makefile.inc</p>
<p>файлы:</p>
<p>pkg-comment &#8212; краткое описание данного продукта<br />
pkg-desc &#8212; чуть более расширенное описание данного продукта<br />
pkg-plist &#8212; список всего что будет установлено в систему посредством make install<br />
pkg-message &#8212; важное сообщение которое будет выдано после make install<br />
pkg-install &#8212; обычно скрипт дополнительняющий набор необходимых действий при &#171;make install&#187;</p>
<p>терминология структуры портов:</p>
<p>/usr/ports &#8212; все дерево портов<br />
/usr/ports/INDEX &#8212; список всех портов<br />
/usr/ports/INDEX.db &#8212; база портов<br />
/usr/ports/README &#8212; прочти меня<br />
/usr/ports/distfiles &#8212; место куда будет затягиваться дистрибутив необходимый для сборки порта<br />
/usr/ports/Mk &#8212; необходимые make includes файлы для сборки портов в дополнение к /usr/share/mk</p>
<p>обычный или mini-port &#8212; обычный порт<br />
мета, meta-port &#8212; порт большого программного продукта, в реалии пустышка из нескольких mini-port&#8217;ов необходимых для сборки ПОЛНОГО meta-port&#8217;а.</p>
<p><strong>прим.:</strong> когда то вместо meta портов, были мега порты, которые удобней<br />
было собирать в отличие от мета портов, имейте ввиду что для сборки XFree86,<br />
mozilla, openoffice вам понадобится очень много free-space и возможно<br />
потребуется переопределить рабочую директорию через переменную WRKDIR.</p>
<p>Например:</p>
<p>/usr/ports/x11/XFree86-4 &#8212; это мета-порт объединяющий установку нескольких<br />
мини-портов необходимых для установки всего XFree86-4, список мини-портов<br />
указан в /usr/ports/x11/XFree86-4/Makefile</p>
<p><strong>прим.:</strong> если у вас уже установлен предыдущий порт XFree86-4, и вы скачали<br />
новый и хотите его установить, лучше удалить предыдущий XFree86 и все его<br />
depends, в этом случае проблем не будет.</p>
<p>Сборка:</p>
<p>1) cd /usr/ports/категория/название_порта</p>
<p>2) make</p>
<p>по команде make, будет просматриваться содержимое /usr/ports/distfiles<br />
на предмет наличия в нем дистрибутива[ов] cat distinfo, если таковые<br />
отсутствуют там, будет производиться скачивание данного дистрибутива<br />
с основного сайта: ftp.freebsd.org.</p>
<p>Управлять этим процессом можно определив ряд необходимых переменных<br />
в файле /etc/make.conf (который создается на основе /etc/defaults/make.conf)</p>
<p>MASTER_SITE_BACKUP?=   \<br />
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/</p>
<p>закоментарим две верхние строчки и зададим ближайший к нам сайт с зеркалом<br />
distfiles, например:</p>
<p>#MASTER_SITE_BACKUP?=   \<br />
#       ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/<br />
#&#8212;lavr</p>
<p>MASTER_SITE_BACKUP?=    \<br />
ftp://ftp.ru.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/</p>
<p>MASTER_SITE_OVERRIDE?=  ${MASTER_SITE_BACKUP}</p>
<p>MASTER_SORT_REGEX?=     ^file: ^ftp://ftp\.FreeBSD\.org/pub/FreeBSD/ports/local-distfiles/ ://[^/]*\.ru/ ://[^/]*\.ru\.</p>
<p>если у нас выход в Internet через PROXY, определяем следующие переменные<br />
в том же файле, если PROXY с авторизацией, man 3 fetch:</p>
<p>FETCH_ENV=     FTP_PROXY=ftp://10.0.0.1:21<br />
FETCH_ENV=     HTTP_PROXY=http://10.0.0.1:80</p>
<p>При сборке портов можно использовать много полезных переменных среды,<br />
полезно в тех или иных случаях:</p>
<p># less /usr/share/mk/bsd.README<br />
# less /usr/ports/Mk/bsd.port.mk</p>
<p># man ports</p>
<p>некоторые наиболее полезные переменные:</p>
<p>- PORTSDIR<br />
- WRKDIR<br />
- DISTDIR<br />
- PREFIX<br />
- BATCH</p>
<p>с их помощью можно изменять директории структуры портов, местонахождения<br />
sources, рабочую директории для сборки, путь установки и тд и тп.<br />
При сборке порта, как уже было сказано, ищется дистрибутив, проверяется<br />
его контрольная сумма по md5:</p>
<p>имя дистрибутива обычно указыватся в файле distinfo, например, рассмотрим<br />
mpg123 из портов:</p>
<p>[alone]~ &gt; ls -la /usr/ports/audio/mpg123<br />
total 24<br />
drwxr-xr-x    3 root  wheel   512 Feb 11 12:21 .<br />
drwxr-xr-x  336 root  wheel  6656 Feb 12 12:04 ..<br />
-rw-r&#8212;r&#8212;    1 root  wheel  2662 Feb 11 12:21 Makefile<br />
-rw-r&#8212;r&#8212;    1 root  wheel   268 Apr 10  2001 distinfo<br />
drwxr-xr-x    2 root  wheel   512 Feb 11 12:21 files<br />
-rw-r&#8212;r&#8212;    1 root  wheel    52 Jul 10  1997 pkg-comment<br />
-rw-r&#8212;r&#8212;    1 root  wheel   242 Aug  5  1999 pkg-descr<br />
-rw-r&#8212;r&#8212;    1 root  wheel    11 Aug 17  1998 pkg-plist<br />
[alone]~ &gt;</p>
<p>Makefile &#8212; проект сборки<br />
distinfo &#8212; файл содержаший md5 контрольные суммы дистрибутива, той или иной<br />
версии, патчи и другие необходимые sources:</p>
<p>[alone]~ &gt; cat /usr/ports/audio/mpg123/distinfo<br />
MD5 (mpg123-0.59r-pl1.tar.gz) = 2648708fac9203ef58292adf5e54e4ba<br />
MD5 (mpg123-059r-v6-20000713b.diff.gz) = b830cefc8805c8ad827f73985c03d27f<br />
MD5 (l3.diff.gz) = b8749f4709ed1a9df8a00d51c4a02dd5<br />
MD5 (mpg123-059r-recode-20010410.diff.gz) = 8f9e18cf27f9e048c5369cf3b78b6b11<br />
[alone]~ &gt;</p>
<p>files &#8212; если в порту есть такая директория, она обычно содержит патчи и<br />
дополнительные файлы конфигурации данного порта</p>
<p>pkg-comment и pkg-descr &#8212; файлы описания данного порта-продукта, короткое<br />
описание и более полное</p>
<p>pkg-plist &#8212; это список всех файлов которые будут установлены в систему<br />
относительно пути в PREFIX и некоторые дополнительные действия которые<br />
будут произведены при `make install`</p>
<p>3) make install</p>
<p>после успешной сборки п.2, произвести установку собранного продукта в<br />
систему, обычно: PREFIX=/usr/local, где /usr/local &#8212; альтернативная<br />
структура базовой системы: &#171;/&#187;, &#171;/etc&#187;, &#171;/bin&#187;, &#171;/sbin&#187;, &#171;/usr/lib&#187; и тд</p>
<p>4) make clean</p>
<p>удалить все что осталось после сборки, обычно директорию work в данном<br />
продукте и всех зависимостях которые были собраны и автоматически установлены при сборке данного продукта</p>
<p>Удалить установленные порты или пакеты можно:</p>
<p># make de-install или man pkg_delete</p>
<p>при сборке порта, в пункте 2)</p>
<p>make &#8212; производит несколько операций, скачивание, накладывание патчей,<br />
конфигурирование проекта перед сборкой и саму сборку, при необходимости,<br />
мы можем выполнять по шагам вместо make:</p>
<p>make fetch<br />
make checksum<br />
make depends<br />
make extract<br />
make patch<br />
make configure<br />
make build</p>
<p>все вышеуказанные действия могут быть выполнены самостоятельно и по шагам,<br />
допустим мы хотим поправить некий порт под себя, шаги:</p>
<p>- скачиваем порт:<br />
# make fetch<br />
- проверка контрольной суммы дистрибутива:<br />
# make checksum<br />
- разврачиваем дистрибутив в рабочую директорию, у большинства портов это<br />
директория /usr/ports/category/portname/work<br />
# make extract<br />
- если используется многоплатформенный гнушный конфигуратор configure<br />
# make configure</p>
<p>теперь мы можем наложить свои патчи, затем при помощи команды diff создать<br />
нужные нам правки: файлы patch-xy, где xy &#8212; это буквы aa/ab/ac/&#8230; и тд и тп<br />
и положить их в директорию files &#8212; все порт с нашими правками готов, теперь<br />
можно его очистить:<br />
# make clean<br />
и собрать по шагам, чтобы убедиться что нет ошибок или затратить меньше<br />
времени на их исправления, все &#8212; наш порт, порт с нашими правками готов.</p>
<p>чтобы в реалии не выполнять make, а лишь посмотреть что будет сделано:</p>
<p># make -n [install|или другие опции]</p>
<p>иногда удобно в командной строке задать все необходимые команды (см. используемый вами SHELL):</p>
<p># cd /usr/ports/категория/название_порта<br />
# make &amp;&amp; make install &amp;&amp; make clean</p>
<p>однако некоторые порты требуют интерактивного вмешательства, чтобы<br />
этого не произошло, необходимо посмотреть Makefile, записать все<br />
необходимые опции с которыми мы будем собирать данный порт и выполнить:</p>
<p>make WITH_ИМЯОПЦИИ=yes WITHOUT_ИМЯОПЦИИ=yes BATCH=yes install &amp;&amp; make clean</p>
<p>BATCH=yes обеспечивает пакетную сборку порта.</p>
<p>Материал для изучения:</p>
<p>http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/index.html</p>
<p>http://www.FreeBSD.org.ua/porters-handbook/ &#8212; на русском</p>
<p>прим.: конечно можно и нужно удалять то что осталось после сборки портов,<br />
глобально:</p>
<p># cd /usr/ports<br />
# make clean</p>
<p>можно для каждой категории:</p>
<p># cd /usr/ports/category<br />
# make clean</p>
<p>зависимости тоже будут удалены, но все это очень долгая история, лично мне<br />
удобнее прежде посмотреть, что не было очищено после установки того или иного<br />
порта:</p>
<p># find /usr/ports/ -name &#171;work&#187; -print<br />
или<br />
# find /usr/ports/ -name &#171;.instal*&#187; -print</p>
<p>после чего без всякий `make clean` &#8212; это ну очень долго, использовать:</p>
<p># find /usr/ports/ -name &#171;work&#187; -exec rm -rf {} \;</p>
<p>все что нужно удалено, быстро и удобно.</p>
<p>После установки портов и пакетов, в директории /var/db ведется база<br />
установленных пакетов и портов (для последних можно использовать переменную</p>
<p>FORCE_PKG_REGISTER=    YES</p>
<p>в файле /etc/make.conf, это очень удобно.</p>
<p>в директории /var/db/pkg &#8212; можно найти весь список портов, это директории<br />
с именами: /var/db/pkg/PortName-Version, внутри которых есть несколько<br />
информативных файлов, например:</p>
<p>[alone]~ &gt; ls -la /var/db/pkg/mpg123-esound-0.59r_8/<br />
total 28<br />
-rw-r&#8212;r&#8212;    1 root  wheel    52 Feb 11 12:05 +COMMENT<br />
-rw-r&#8212;r&#8212;    1 root  wheel   660 Feb 11 12:05 +CONTENTS<br />
-rw-r&#8212;r&#8212;    1 root  wheel   242 Feb 11 12:05 +DESC<br />
-r&#8212;r&#8212;r&#8212;    1 root  wheel  7457 Feb 11 12:05 +MTREE_DIRS<br />
-rw-r&#8212;r&#8212;    1 root  wheel    14 Feb 16 21:28 +REQUIRED_BY<br />
drwxr-xr-x    2 root  wheel   512 Feb 16 21:28 .<br />
drwxr-xr-x  371 root  wheel  9728 May 22 15:47 ..<br />
[alone]~ &gt;</p>
<p>если вспомнить описанную ранее структуру порта:</p>
<p>+COMMENT &#8212; комментарий (pkg-comment)<br />
+CONTENTS &#8212; то что было установлено в систему (pkg-plist)<br />
+DESC &#8212; описание (pkg-descr)<br />
+MTREE_DIRS &#8212; дерево с указанием владельца и режимов файлов и директорий<br />
+REQUIRED_BY &#8212; если есть, то для какого порта или пакета, данный програмный<br />
продукт был зависимостью</p>
<p>Packages &#8212; пакеты.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/583/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Converting SSL-certificates from CRT format to PEM</title>
		<link>http://iphp.com.ua/archives/580</link>
		<comments>http://iphp.com.ua/archives/580#comments</comments>
		<pubDate>Tue, 28 Dec 2010 08:28:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Soft/Tools]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=580</guid>
		<description><![CDATA[Dovecot, for example, seems to expect pem-files, while RapidSSL only issues crt-files. The solution? Use OpenSSL to convert (via the DER-format) to pem: openssl x509 -in input.crt -out input.der -outform DER then openssl x509 -in input.der -inform DER -out output.pem -outform PEM]]></description>
			<content:encoded><![CDATA[<p>Dovecot, for example, seems to expect pem-files, while RapidSSL only issues crt-files. The solution? Use OpenSSL to convert (via the DER-format) to pem:</p>
<p><strong>openssl x509 -in input.crt -out input.der -outform DER</strong></p>
<p>then</p>
<p><strong>openssl x509 -in input.der -inform DER -out output.pem -outform PEM</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/580/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

