<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="ru"><title>androidstreet.ru</title><link href="http://execbit.ru/" rel="alternate" /><id>http://execbit.ru/</id><updated>2012-05-24T17:48:18+00:00</updated><subtitle>Последние новости сайта execbit.ru</subtitle><rights>execbit.ru</rights><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/execbit/last" /><feedburner:info uri="execbit/last" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>execbit/last</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry><title>10 рекомендаций по написанию эффективных Bash-скриптов
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/JuIKRJFmFuw/" rel="alternate" /><updated>2012-05-24T17:48:18+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2012/05/24/10-tips-for-bash-coding/</id><link length="100000" href="http://execbit.ru/uploads/zinnia/bash.jpg" type="image/jpeg" rel="enclosure" /><category term="shell" /><content type="html">&lt;p&gt;&lt;em&gt;Командный интерпретатор и по совместительству язык создания сценариев Bash по умолчанию используется почти во всех дистрибутивах Linux. Многие пользователи и администраторы используют его для создания подручных скриптов, однако далеко не у всех это получается действительно хорошо. В этой статье я расскажу о 10 способах сделать ваши скрипты более эффективными и простыми.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;1. Используейте встроенные в Bash команды&lt;/h3&gt;

&lt;p&gt;
В Bash есть много встроенных команд, которые работают быстрее чем аналогичные команды в каталогах &lt;em&gt;/bin&lt;/em&gt; и &lt;em&gt;/usr/bin&lt;/em&gt;. Для их использования достаточно просто написать команду не указывая полный путь до нее. Например, если в вашем скрипте есть такая строка:

&lt;pre&gt;/bin/echo "hello"&lt;/pre&gt;

Замените ее на такую:

&lt;pre&gt;echo "hello"&lt;/pre&gt;

В этом случае Bash будет использовать встроенную команду. Полный список встроенных команд вы можете узнать прочитав "man bash".
&lt;/p&gt;

&lt;h3&gt;2. Не используйте внешние команды для простых вычислений&lt;/h3&gt;

&lt;p&gt;
Кроме встроенных команд Bash имеет в своем арсенале средства для простых вычислений. В большинстве случаев их будет достаточно, а если вам понадобится сделать расчеты с плавающей точкой вы всегда сможете воспользоваться командой &lt;em&gt;/usr/bin/bc&lt;/em&gt;. Примеры:

&lt;pre&gt;
four=$(( 2 + 2 ))
four=$[ 2 + 2 ]
let four="2 + 2"
&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;3. Избегайте использования cat&lt;/h3&gt;

&lt;p&gt;
Команды вроде grep, awk и sed принимают в качестве имена файлов. Это значит, что их можно использовать и без перенаправления содержимого файла с помощью cat. Например, если в вашем скрипте есть следующий код:

&lt;pre&gt;cat /etc/hosts | grep localhost&lt;/pre&gt;

Вы можете заменить его на такой и повысить скорость работы скрипта:

&lt;pre&gt;grep localhost /etc/hosts&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;4. Избегайте перенаправления вывода grep в awk&lt;/h3&gt;

&lt;p&gt;
Если вы используете awk вам не нужен grep. Например, следующая строка:

&lt;pre&gt;grep error /var/log/messages | awk '{ print $4 }'&lt;/pre&gt;

Может быть безболезненно заменена на более эффективную:

&lt;pre&gt;awk '/error/ { print $4 }' /var/log/messages&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;5. Избегайте перенаправления вывода sed в sed&lt;/h3&gt;

&lt;p&gt;
Редактор sed может выполнять несколько команд за раз, поэтому все строки вида:

&lt;pre&gt;sed 's/hello/goodbye/g' filename | sed 's/monday/friday/g'&lt;/pre&gt;

лучше заменить на:

&lt;pre&gt;sed -e 's/hello/goodbye/g; s/monday/friday/g' filename&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;6. Используйте двойные ковычки для сравнения с регулярным выражением&lt;/h3&gt;

&lt;p&gt;
Оператор [[ можно использовать для составных команд и сравнения с регулярным выражением:

&lt;pre&gt;
if [[ expression1 || expression2 ]]; then do_something; fi
if [[ string =~ regex ]]; then do_something; fi
&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;7. Выносите повторяющуюся фрагменты скрипта в функции&lt;/h3&gt;

&lt;p&gt;
Если скрипт становится сложным и внем есть повторяющиеся фрагменты, вынесите их в функции:

&lt;pre&gt;
function_name() {
    do_something
    return $?
}
&lt;/pre&gt;

Функции, которые могут быть полезны в других скриптах, можно вынести в отдельный файл и подключать с директивы оператора "точка":

&lt;pre&gt;
#!/bin/bash
. /path/to/shared_functions
&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;8. Используйте массивы вместо нескольких переменных&lt;/h3&gt;

&lt;p&gt;
Bash имеет поддержку массивов, которые удобно использовать для хранения сходных по смыслу данных. Например, следующий код:

&lt;pre&gt;
color1='Blue'
color2='Red'
echo $color1
echo $color2
&lt;/pre&gt;

можно заменить на такой:

&lt;pre&gt;
colors=('Blue' 'Red')
echo ${colors[0]}
echo ${colors[1]}
&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;9. Используйте /bin/mktemp для создания временных файлов&lt;/h3&gt;

&lt;p&gt;
Если вам нужен временный файл используйте команду mktemp:

&lt;pre&gt;
tempfile=$(/bin/mktemp)
tempdir=$(/bin/mktemp -d)
&lt;/pre&gt;
&lt;/p&gt;

&lt;h3&gt;10. Используйте /bin/egrep или /bin/sed для сравнения с регулярным выражением&lt;/h3&gt;

&lt;p&gt;
&lt;pre&gt;
egrep 'localhost|127\.0\.0\.1' /etc/hosts
sed -n 's/localhost.*/&amp;/p' /etc/hosts
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Сервис-центр "Гранд-Сервис" выполнит &lt;a href="http://www.remobil.net/reso/sony/"&gt;ремонт сотовых телефонов sony ericsson&lt;/a&gt; практически всех марок. Все виды услуг, включая дистику, русификацию, разблокировку, замена дисплеев, аудио-элементов, ремонт и замена клавиатуры, микросхем, установка ПО.&lt;/em&gt;&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=JuIKRJFmFuw:GoZduIS0g5w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=JuIKRJFmFuw:GoZduIS0g5w:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=JuIKRJFmFuw:GoZduIS0g5w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/JuIKRJFmFuw" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2012/05/24/10-tips-for-bash-coding/</feedburner:origLink></entry><entry><title>Аргументы ядра Linux, о которых должен знать каждый администратор
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/0Wemx7_JgM0/" rel="alternate" /><updated>2012-05-20T13:42:26+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2012/05/20/kernel-boot-parameters/</id><link length="100000" href="http://execbit.ru/uploads/zinnia/linux-kernel.png" type="image/jpeg" rel="enclosure" /><category term="админство" /><content type="html">&lt;p&gt;&lt;em&gt;Ядро Linux принимает множество аргументов загрузки, которые используются для информирования ядра о различных функциях и опциях оборудования. С помощью этих аргументов можно разрешить ситуации, когда ядро не может загрузить систему, изменить способ конфигурирования железа, повысить производительность и выполнить различные операции восстановления. В этой статье приведены наиболее важных аргументы Linux-ядра, о которых должен знать любой администратор.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;init&lt;/h3&gt;
&lt;p&gt;Аргумент init используется для указания ядру какому приложению оно должно передать управление после окончания загрузки. По умолчанию этот параметр содержит значение /sbin/init, приложение, которое порождает все остальные процессы системы, включая демоны, сервер X Window и приглашение к входу. Этот аргумент удобно использовать для восстановления системы забыли пароль. Укажите при загрузке ядра:&lt;/p&gt;

&lt;pre&gt;init=/bin/bash&lt;/pre&gt;

&lt;p&gt;И сразу после загрузки вы получите доступ к командной строке с правами root.&lt;/p&gt;

&lt;h3&gt;single&lt;/h3&gt;
&lt;p&gt;Аргумент single принуждает процесс init загружать систему в однопользовательском режиме без запуска каких-либо демонов. Он может быть полезен в том случае, если ОС не может выполнить полноценную загрузку из-за проблем с запуском демонов.&lt;/p&gt;

&lt;h3&gt;root&lt;/h3&gt;
&lt;p&gt;С помощью аргумента root можно указать ядру какое устройство содержит корневую файловую систему. Это можно использовать, например, для загрузки дстрибутива, установленного на жесткий с ядром с LiveCD, либо для исправления проблем после переноса системы на другой диск. Пример использования:&lt;/p&gt;

&lt;pre&gt;root=/dev/sda1&lt;/pre&gt;

&lt;h3&gt;ro&lt;/h3&gt;
&lt;p&gt;Аргумент ro принуждает ядро монтировать корневую ФС в режиме "только для чтения", что можно использовать для последующего исправления файловой системы с помощью fsck.&lt;/p&gt;

&lt;h3&gt;rw&lt;/h3&gt;
&lt;p&gt;Этот аргумент принуждает ядро монтировать корневую ФС в режиме записи.&lt;/p&gt;

&lt;h3&gt;panic&lt;/h3&gt;
&lt;p&gt;Определяет поведение ядра при возникновении непоправимой ошибки (паника ядра). По умолчанию в случае паники ядро не перезагружается, однако с помощью аргумента panic мы можем сделать так, чтобы происходила автоматическая перезагрузка. Пример:

&lt;pre&gt;panic=10&lt;/pre&gt;

Перезагрузка через 10 секунд после возникновения паники ядра.&lt;/p&gt;

&lt;h3&gt;maxcpus&lt;/h3&gt;
&lt;p&gt;Аргумент maxcpus определяет количество процессоров (ядер), которое будет "видеть" ядро. При отладке и тестировании приложений полезно проверить работоспособность кода на в разных конфигурациях, для чего можно использовать этот параметр. Пример:

&lt;pre&gt;maxcpus=2&lt;/pre&gt;

&lt;h3&gt;debug&lt;/h3&gt;
&lt;p&gt;Включение механизма отладки ядра. Полезно для разработчиков ядра и приложений.&lt;/p&gt;

&lt;h3&gt;selinux&lt;/h3&gt;
&lt;p&gt;Отключение или включение SELinux: "selinux 0" или "selinux 1".&lt;/p&gt;

&lt;h3&gt;raid&lt;/h3&gt;
&lt;p&gt;Указывает ядру как должны быть собраны RAID-массивы при загрузке. Пример: "raid=/dev/md1".&lt;/p&gt;

&lt;h3&gt;mem&lt;/h3&gt;
&lt;p&gt;Параметр mem указывает ядру сколько оперативной памяти оно должно "видеть" в системе. Полезно при возникновении проблем с загрузкой системы на машинах с большим количеством ОЗУ, которое ядро не может использовать или для отладки приложений. Пример:&lt;/p&gt;

&lt;pre&gt;mem=1024M&lt;/pre&gt;

&lt;h3&gt;hdX=noprobe&lt;/h3&gt;
&lt;p&gt;Отключает инициализацию указанного диска:&lt;/p&gt;

&lt;pre&gt;hdb=noprobe&lt;/pre&gt;

&lt;p&gt;Полезно когда ядро уходит в панику из-за проблем с диском.&lt;/p&gt;

&lt;h3&gt;Где указывать эти аругменты&lt;/h3&gt;
&lt;p&gt;Все перечисленные аргументы следует указывать с помощью загрузчика, например, если вы используете Grub, выберите нужный пункт меню, нажмите клавишу &lt;strong&gt;e&lt;/strong&gt;, затем допишите нужные аргумент в конец приведенной строки и нажмите &lt;strong&gt;b&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Источник: &lt;a href="http://www.cyberciti.biz/tips/10-boot-time-parameters-you-should-know-about-the-linux-kernel.html"&gt;www.cyberciti.biz&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Хотите &lt;a href="http://www.westcomp.ru"&gt;купить сервер в Москве&lt;/a&gt;? Нет ничего проще! Компания WESTCOMP (www.westcomp.ru) предлагает большое количество б/у севреров от ведущих мировых производителей, включая такие бренды как HP, IBM, Dell и Cisco. Отличное качество, низкие цены, доставка, гарантия.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=0Wemx7_JgM0:T5cVMMB6TOI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=0Wemx7_JgM0:T5cVMMB6TOI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=0Wemx7_JgM0:T5cVMMB6TOI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/0Wemx7_JgM0" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2012/05/20/kernel-boot-parameters/</feedburner:origLink></entry><entry><title>Файлы со странными именами
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/z2TUEeEJuCM/" rel="alternate" /><updated>2012-05-14T19:42:11+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2012/05/14/abracadabra/</id><link length="100000" href="http://execbit.ru/uploads/zinnia/abra.gif" type="image/jpeg" rel="enclosure" /><category term="shell" /><content type="html">&lt;p&gt;&lt;em&gt;Порой в файловой системе можно найти файлы со странными именами и неудобными для обработки в терминале названиями. Это могут быть файлы с пробелами между словами, неалфавитными или непечатаемыми символами в названии. Они могут появится благодаря неправильно работающим приложениям, в результате скачивания из интернета или просто по недосмотру других пользователей системы. В любом случае работать с такими файлами неудобно, вы не сможете просто выполнить команду "rm файл" или "mv файл". Что можно сделать?&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;Случай #1. Файлы с пробелами в названии&lt;/h3&gt;

&lt;p&gt;Допустим вы имеете следующее:&lt;/p&gt;

&lt;pre&gt;
$ ls -l
file2.txt
test file.txt
&lt;/pre&gt;

&lt;p&gt;
Чтобы удалить/переместить файл "test file.txt" просто используйте функцию автодополнения. Наберите "mv test", нажмите Tab и командный интерпретатор закончит имя файла, расставив перед пробелами знаки экранирования: "test\ file.txt". Все. Если в каталоге есть второй файл, имя которого начинается на "test" просто повторно нажмите "Tab".
&lt;/p&gt;

&lt;h3&gt;Случай #2. Файлы, имена которых начинаются на знак -&lt;/h3&gt;

&lt;p&gt;Теперь у вас есть такой каталог:&lt;/p&gt;

&lt;pre&gt;
$ ls -1
file2.txt
test file.txt
test2.txt
-file
&lt;/pre&gt;

&lt;p&gt;Если вы просто попытаетесь выполнить команду в отношении этого файла, то получите примерно следующий результат:&lt;/p&gt;

&lt;pre&gt;
$ rm -file
rm: invalid option -- 'l'
&lt;/pre&gt;

&lt;p&gt;
Это происходит потому что почти все UNIX-команды интерпретируют знак минус как флаг, изменяющий ту или иную опцию. Одно из решений проблемы заключается в том, чтобы следовать рекомендации интерпретатора Ubuntu:
&lt;/p&gt;

&lt;pre&gt;
$ rm -file
rm: invalid option -- 'l'
Try `rm ./-file' to remove the file `-file'.
&lt;/pre&gt;

&lt;p&gt;Второй способ состоит в том, чтобы добавить перед именем файла последовательность из двух минусов, которая сообщит команде, что все флаги на этом месте заканчиваются и все последующие аргументы следует принимать непосредственно, то есть как имена файлов в случае с такими командами как rm/mv/cp и другими:&lt;/p&gt;

&lt;pre&gt;
$ rm -- -file
&lt;/pre&gt;

&lt;h3&gt;Тяжелый случай&lt;/h3&gt;

&lt;p&gt;К сожалению бывают и более сложные случаи, когда эти методы не помогут, например, представьте, что каталог содержит следующий набор файлов:&lt;p&gt;

&lt;pre&gt;
$ ls -1
-file
--file
file2.txt
test2.txt
test file.txt
\+Xy \+\8
&lt;/pre&gt;

&lt;p&gt;В этом случае можно использовать универсальный подход, который сработает в 100% случаев. Заключается он в том, чтобы заставить команду "ls" показать нам не только имена файлов, но и их номера inode, которые всегда имеют числовую форму:&lt;/p&gt;

&lt;pre&gt;
$ ls -i1
285134 -file
285136 --file
3901 file2.txt
285132 test2.txt
2302 test file.txt
285461 \+Xy \+\8
&lt;/pre&gt;

&lt;p&gt;Команда "ls" сообщает нам, что последний файл имеет inode 285461. Теперь мы можем использовать эту информацию чтобы удалить файл. С помощью rm это сделать не получится, однако команда find легко найдет файл по его inode:&lt;/p&gt;

&lt;pre&gt;
$ find . -inum 285461 | xargs rm
&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Ищете &lt;a href="http://uk-nedvizhimost.ru/bryansk-prodazha.php"&gt;помещение под офис в Брянске&lt;/a&gt;? Нет проблем. "Управляющая компания" поможет вам найти выгодное предложение от собственников. Продажа коммерческой недвижимости, офисов, нежелых помещений.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=z2TUEeEJuCM:sgEgXTeGvBA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=z2TUEeEJuCM:sgEgXTeGvBA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=z2TUEeEJuCM:sgEgXTeGvBA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/z2TUEeEJuCM" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2012/05/14/abracadabra/</feedburner:origLink></entry><entry><title>Вирусы в UNIX
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/aSdW_OqC23Q/" rel="alternate" /><updated>2012-03-26T14:47:51+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2012/03/26/unix-viruses/</id><link length="100000" href="http://execbit.ru/uploads/zinnia/virus.jpg" type="image/jpeg" rel="enclosure" /><category term="безопасность" /><content type="html">&lt;p&gt;&lt;em&gt;Еще один интересный (с исторической точки зрения) пост, опубликованный в блоге Раса Кокса: "Вирусы в UNIX" (&lt;a href="http://research.swtch.com/2008/02/unix-viruses.html"&gt;Unix Viruses&lt;/a&gt;) с рассказом о беспочвенности веры в то, что вирусов в UNIX нет.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
Дисковые компьютерные вирусы берут свое начало в эпоху MS-DOS, сетевые вирусы пришли из эпохи Windows.
&lt;/p&gt;&lt;p&gt;
Многие пользователи Linux и OS X имеют в корне неверное убеждение, что им не страшны вирусы, потому что они используют Unix. Это очевидная ошибка: первый интернет-червь поражал UNIX-машины. Простые механизмы защиты, применяемые в UNIX-подобных операционных системах, несколько затрудняют процесс написания вирусов, но их малое распространение связано вовсе не с тем, что UNIX неуязвима для вирусов, а с тем, что UNIX просто не имеет той доли рынка, ради которой стоило бы тратить усилия на написание вредоносного ПО.
&lt;/p&gt;&lt;p&gt;
Для отрезвления неверующих в эту точку зрения я рекомендовал бы почитать доклад Тома Дафа (Tom Duff) 1987 года под названием "Вирусные атаки против систем безопасности UNIX" (Viral Attacks on UNIX System Security), в которой описан простой, но качественный дисковый вирус, поражающий исполняемые файлы UNIX. Несмотря на ограничения прав доступа к файлам, за несколько месяцев вирусу Дафа удалось инфицировать 466 файлов на 46 машинах, включая экспериментальную "безопасную" версию UNIX (справедливости ради стоит сказать что в результате система все-таки обнаружила вирус). В докладе Даф также описал процесс написания простого вируса на языке сценариев sh. Он предупреждает:
&lt;blockquote&gt;
Как бы вам не хотелось не запускайте этот код. Я случайно сделал это на своей машине во время отладки и за час этот вирус инфицировал 140 файлов, которые также начали попытки инфицировать другие файлы, создавая нагрузку на машину в районе 0.05-1.25 с пиковыми значениями в 17. Мне пришлось остановить работу машины посреди рабочего дня и потратить 3 часа на очистку дисков, выслушивая упреки сослуживцев (&lt;em&gt;скорее всего Даф запустил вирус на центральном сервере, к которому его сослуживцы имели терминальный доступ - прим.пер.&lt;/em&gt;). Мне невероятно повезло, что вирус не успел инфицировать другие машины нашей сети.
&lt;/blockquote&gt;
&lt;/p&gt;&lt;p&gt;
В документе "Вирусология 101 (Virology 101), опубликованном в 1989 году, Дуг Макилрой (Doug McIlroy) резюмирует:
&lt;blockquote&gt;
Нет ничего мистического в компьютерных вирусах. Работоспособный, но легко обнаруживаемый вирус может быть написан за пять минут и состоять всего из нескольких строк. Несмотря на то, что некоторые вирусные угрозы можно предотвратить, не существует универсального метода борьбы с ними; вирусы - это естественное следствие метода вычислений, основанного на хранимых в памяти программах. Как и в случае с многими опасностями технологического развития, урон, наносимый вирусами, может быть уменьшен только путем соблюдения правил безопасности и применения ответных санкций.
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Как бы там ни было и какой бы опасности вы не подвергали себя, пользуюсь UNIX, во время долгих путешествий вам не обойтись без &lt;a href="http://www.sotmarket.ru/category/sumki_dlya_noutbukov/rukzaki.html"&gt;рюкзаков для ноутбука&lt;/a&gt;. Рюкзаки для любых ноутбуков вы легко найдете в интернет-магазине SotMarket. Диагонали от 9 до 20 дюймов, большой выбор производителей и расцветок. Приятные цены.&lt;/em&gt;&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=aSdW_OqC23Q:pqN-6C20eKI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=aSdW_OqC23Q:pqN-6C20eKI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=aSdW_OqC23Q:pqN-6C20eKI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/aSdW_OqC23Q" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2012/03/26/unix-viruses/</feedburner:origLink></entry><entry><title>Абсолютный дизайн файловой системы
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/SAhAmF0Cgb8/" rel="alternate" /><updated>2012-03-26T07:17:36+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2012/03/26/absolute-fs/</id><link length="100000" href="http://execbit.ru/uploads/zinnia/disk.jpg" type="image/jpeg" rel="enclosure" /><category term="интересности" /><content type="html">&lt;p&gt;
&lt;em&gt;Сегодня я хочу предложить вашему вниманию перевод довольно интересной &lt;a href="http://research.swtch.com/abs-fs"&gt;записи&lt;/a&gt;, опубликованной в блоге Раса Кокса (Russ Cox), одного из активных разработчиков post-unix операционной системы Plan 9 и порта ее компонентов в UNIX plan9port. В оригинале название поста звучит как Absolute File System Design и описывает файловую систему компьютера Alto, созданного более 30 лет назад.&lt;/em&gt;
&lt;/p&gt;&lt;p&gt;
В 1979 году Батлер Лэмпсон (Butler Lampson) и Роберт Спроул (Robert Sproull) опубликовали документ "Операционная система для однопользовательского компьютера" (An Open Operating System for a Single-User Machine), в котором описали операционную систему компьютера Alto, персональной сетевой рабочей станции, основанной на Xerox PARC. Многие особенности Alto позднее стали неотъемлемыми атрибутами любого настольного ПК, однако его инновационная устойчивая к сбоям файловая система осталось забытой.
&lt;/p&gt;&lt;p&gt;
Файловая система Alto была спроектирована с учетом возможных ошибок в работе дисковой подсистемы и ошибок программистов. Если набор блоков файловой системы оказывался утерянным или поврежденным терялась только информация этих блоков и ничего больше. Если, например, один из блоков, содержащих данные файла оказывался утерянным, вся остальная информация оставалась на месте, включая оставшиеся блоки данных. Если утерянным оказывался блок каталоговой записи, все что вы теряли, это имя файла, но не сам файл.
&lt;/p&gt;&lt;p&gt;
Технология, позволяющая добиться такого эффекта, была описана в третьем разделе документа. Базовая техника защиты состояла в том, что каждый блок данных имел небольшой заголовок, содержащий идентификационный номер и версию файла, к которому он привязан, а также логическое смещение этого блока в файле и количество данных файла в блоке (последний блок файла мог содержать меньше данных, чем размер самого блока). Лэпсон и Спроул ссылались на эту информацию как на истину в первой инстанции. Специальная утилита (наподобие fsck в UNIX) могла просканировать всю файловую систему, читая заголовки блоков и восстановить (хотя бы частичное) содержимое любого файла при любых нарушениях файловой системы.
&lt;/p&gt;&lt;p&gt;
Заголовок блока также содержал указатели на предыдущий и следующий блоки файла, так что чтение файла производилось путем следования по цепочке блоков. Если во время чтения файла указатель оказывался неверным (то есть следующий блок был поврежден) файловая система могла немедленно сообщить об ошибке и запустить процесс сканирования и исправления файловой системы.
&lt;/p&gt;&lt;p&gt;
Сравните эту схему с файловыми дескрипторами (inode) в современных файловых системах UNIX (BSD FFS или Linux Ext2/3). Если вы потеряете блок данных, содержащий inode файла, вы потеряете весь файл. Никакие проверки в этом случае не помогут, потому как список блоков файла содержится только в inode, а сами блоки не имеют идентификаторов принадлежности. Это намного менее стойкая схема чем та, что использовалась в файловой системе Alto. Конечно, бывают и намного более худшие сценарии, например потеря суперблока, которая приведет к потере всей файловой системы. Но так как суперблок настолько важен, файловые системы обычно дублируют его по всему диску. Однако, не менее важные файловые дескрипторы имеют только одну копию.
&lt;/p&gt;&lt;p&gt;
Почему же современные файловые системы не используют заголовки, подобные тем, что были в Alto?
&lt;/p&gt;&lt;p&gt;
Геометрия дисков играет свою роль: трудно "подружить" (скажем) 32-байтный заголовок с (например) 4 Кб блоком данных. Если поместить заголовок в сам блок данных, мы обрежем блок данных до 4064 байт и получим ухудшение производительности из-за неверного выравнивания данных. Если мы поместим заголовок в сектор перед блоком данных, то потеряем дисковое пространство, используя 512 байт для 32-байтного заголовка. Мы могли бы использовать один сектор для хранения 16 заголовков для следующих 16 блоков. Это наиболее оптимальный вариант, но и он имеет свои недостатки (но зато мы не потеряем данные!).
&lt;/p&gt;&lt;p&gt;
Другая причина историческая: оригинальная файловая система UNIX не имела подобных механизмов, а FFS и Ext2/3 не так уж и сильно отличаются от нее.
&lt;/p&gt;&lt;p&gt;
Причина может быть и философской: вы защищаетесь от сбоев жестких дисков с помощью бэкапов, а ни каких-то трюков файловой системы. Это наименее правдоподобный аргумент: почему бы не использовать возможности ФС чтобы не обращаться к бэкапам так часто?
&lt;/p&gt;&lt;p&gt;
Еще причина может носить прагматичный характер: может быть диски "сыплются" как-то по другому, чем в 1979 году. Здесь трудно сказать что-то определенное, так как мы не имеем достаточной информации о том, как "сыпались" диски в 1979-ом.
&lt;/p&gt;&lt;p&gt;
Каким бы ни был аргумент против заголовков, нельзя отрицать того факта, что они позволяют создать очень устойчивую файловую систему. Почему бы не сделать такую систему сегодня. И почему современные файловые системы не такие устойчивые?

&lt;p&gt;&lt;em&gt;Сломался компьютер, а за ремонт сдирают бешенные деньги? Не беда, на Купонаторе много купонов на &lt;a href="http://kuponator.ru/skidki/obsluzhivanie-i-remont-kompyuterov.html" title="обслуживание и ремонт компьютеров со скидкой от 50%"&gt;Обслуживание и ремонт компьютеров со скидкой от 50%&lt;/a&gt;. Приходите - берите.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=SAhAmF0Cgb8:zGiytMwqSLs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=SAhAmF0Cgb8:zGiytMwqSLs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=SAhAmF0Cgb8:zGiytMwqSLs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/SAhAmF0Cgb8" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2012/03/26/absolute-fs/</feedburner:origLink></entry><entry><title>11 полезных команд для администраторов
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/_1ej5Oobovw/" rel="alternate" /><updated>2012-02-27T10:39:25+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2012/02/27/11commands/</id><link length="100000" href="http://execbit.ru/uploads/shell-splash.png" type="image/jpeg" rel="enclosure" /><category term="админство" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Командная строка позволяет сделать гораздо больше GUI-приложений. Используя ее возможности вы можете приказать машине сделать именно то, чего вы дейстивтельно хотите и не ждать пока нужная вам функция будет реализована приложении. Сегодня я хочу показать 11 по-настоящему полезных команд, которые пригодятся любому администратору UNIX-систем.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_1_сохранение_man_страниц_в_формате_pdf"&gt;1 Сохранение man-страниц в формате PDF&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ man -t awk | ps2pdf - awk.pdf&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_2_дублирование_установленных_пакетов_на_другую_машину"&gt;2 Дублирование установленных пакетов на другую машину&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ssh root@remote.host "rpm -qa" | xargs yum -y install&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_3_размещение_подписи_в_верхней_части_pdf_страниц"&gt;3 Размещение подписи в верхней части PDF-страниц&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ echo "ТЕКСТ" | enscript -B -f Courier-Bold16 -o- | \
    ps2pdf - | pdftk input.pdf stamp - output output.pdf&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_4_просмотр_списка_активных_подключений_к_базе_данных_mysql"&gt;4 Просмотр списка активных подключений к базе данных MySQL&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ mysql -u root -p -BNe \
    "select host,count(host) from processlist group by host;" \
    information_schema&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_5_получение_каталога_с_удаленной_машины_в_виде_тарболла"&gt;5 Получение каталога с удаленной машины в виде тарболла&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ssh user@host "tar -zcf - /path/to/dir" &amp;gt; dir.tar.gz&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_6_просмотр_логов_удаленной_машины"&gt;6 Просмотр логов удаленной машины&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ssh -t remotebox "tail -f /var/log/remote.log"&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_7_просмотр_списка_пользователей_и_групп_в_виде_наглядной_диаграммы"&gt;7 Просмотр списка пользователей и групп в виде наглядной диаграммы&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ awk 'BEGIN{FS=":"; print "digraph{"}{split($4, a, ","); \
    for (i in a) printf "\"%s\" [shape=box]\n\"%s\" \
    -&amp;gt; \"%s\"\n", $1, a[i], $1}END{print "}"}' /etc/group|display&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_8_просмотр_зависимостей_загруженных_модулей_в_виде_графа"&gt;8 Просмотр зависимостей загруженных модулей в виде графа&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;lsmod | perl -e 'print "digraph \"lsmod\" \
    {";&amp;lt;&amp;gt;;while(&amp;lt;&amp;gt;){@_=split/\s+/; \
    print "\"$_[0]\" -&amp;gt; \"$_\"\n" for split/,/,$_[3]}print "}"' |\
    dot -Tpng | display -&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_9_создание_стойкого_но_легкого_для_запоминания_пароля"&gt;9 Создание стойкого, но легкого для запоминания пароля&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ read -s pass; echo $pass | md5sum | base64 | cut -c -16&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_10_поиск_всех_файлов_длиннее_500_мб_но_короче_1_гб"&gt;10 Поиск всех файлов, длиннее 500 Мб, но короче 1 Гб&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ find / -type f -size +500M -size -1G&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_11_ограничение_приложения_в_процессорных_ресурсах"&gt;11 Ограничение приложения в процессорных ресурсах&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ sudo cpulimit -p pid -l 50&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Источник&lt;/em&gt;: &lt;a href="http://www.unixmen.com/11-useful-commands-for-linuxunix-administrators/"&gt;http://www.unixmen.com/11-useful-commands-for-linuxunix-administrators/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=_1ej5Oobovw:9-wmRratHM8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=_1ej5Oobovw:9-wmRratHM8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=_1ej5Oobovw:9-wmRratHM8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/_1ej5Oobovw" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2012/02/27/11commands/</feedburner:origLink></entry><entry><title>Команда /bin/ip для новичков
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/8NjqMB9HeE4/" rel="alternate" /><updated>2012-01-10T16:26:52+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2012/01/10/ifconfig-vs-ip/</id><link length="100000" href="http://execbit.ru/uploads/ip.png" type="image/jpeg" rel="enclosure" /><category term="админство" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Команда /bin/ip появилась в Linux-дистрибутивах уже давно, однако пользователи продолжают по привычке использовать старый добрый /sbin/ifconfig. Давайте посмотрим правде в глаза: ifconfig конечно никуда не денется, зато ip обладает намного более внушительным набором возможностей.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;По началу man-страница ip может выглядеть пугающей, однако после того как вы поймете синтаксис команды все быстро встанет на свои места. В этой статье мы не будем говорить новых возможностях ip, вместо этого мы просто рассмотрим список самых популярных команд ifconfig и сравним его с аналогичными командами ip. Так вы быстро освоитесь с новой утилитой.&lt;/p&gt;&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_список_сетевых_кард_и_их_конфигураций"&gt;Список сетевых карт и их конфигураций&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ifconfig&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip addr show
$ ip link show&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_включение_сетевого_интерфейса"&gt;Включение сетевого интерфейса&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ifconfig eth0 up&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip link set eth0 up&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Выключение происходит по такой же схеме:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ifconfig eth0 down&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip link set eth0 down&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_назначение_ip_адреса"&gt;Назначение IP-адреса&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ifconfig eth0 192.168.0.77&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip address add 192.168.0.77 dev eth0&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Это простой вариант команды. Обычно необходимо указать также маску подсети и широковещательный адрес:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ifconfig eth0 192.168.0.77 netmask 255.255.255.0 broadcast 192.168.0.255&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip addr add 192.168.0.77/24 broadcast 192.168.1.255 dev eth0&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_удаление_ip_адреса"&gt;Удаление IP-адреса&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;С помощью ip вы также можете удалить IP-адрес:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip addr del 192.168.0.77/24 dev eth0&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_псевдонимы_alias"&gt;Псевдонимы (alias)&lt;/h3&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ifconfig eth0:1 10.0.0.1/8&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip addr add 10.0.0.1/8 dev eth0 label eth0:1&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_протокол_arp"&gt;Протокол ARP&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Новая запись в ARP-таблице:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ arp -i eth0 -s 192.168.0.1 00:11:22:33:44:55&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip neigh add 192.168.0.1 lladdr 00:11:22:33:44:55 nud permanent dev eth0&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Отключение протокола ARP на интерфейсе:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ifconfig ~arp eth0&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ip link set dev eth0 arp off&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;&lt;a href="http://www.tty1.net/blog/2010-04-21-ifconfig-ip-comparison_en.html" rel="nofollow"&gt;Оригинал на английском.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Ищете площадку для размещения серверного и коммутационного оборудования? &lt;a href="http://www.di-net.ru/collocation/"&gt;Дата центр&lt;/a&gt; MSM.ru к вашим услугам. Аренда юнитов, стоек и выделенных серверов.&lt;/em&gt;&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=8NjqMB9HeE4:_UCrkf2myDc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=8NjqMB9HeE4:_UCrkf2myDc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=8NjqMB9HeE4:_UCrkf2myDc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/8NjqMB9HeE4" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2012/01/10/ifconfig-vs-ip/</feedburner:origLink></entry><entry><title>Шифруем файлы с помощью OpenSSL
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/g2msmo2XsYE/" rel="alternate" /><updated>2011-12-01T16:16:23+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2011/12/01/openssl-encryption/</id><link length="100000" href="http://execbit.ru/uploads/logo_openssl.gif" type="image/jpeg" rel="enclosure" /><category term="безопасность" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;В наши дни шифрование стало обязательной процедурой не только в организациях, но и на домашних машинах. Со всех сторон враги, того и гляди какой-нибудь хацкер влезет в компьютер и украдет твою ценную рукопись. Приходится заниматься самообороной и искать инструменты для надежного шифрования файлов. Но зачем ходить далеко, когда все есть под рукой, в команде под названием openssl.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В качестве универсального средства шифрования каталогов и дисков OpenSSL, конечно, подходит плохо, но для криптования отдельно взятых файлов лучше инструмента не найти. В качестве примера попробуем зашифровать файл secret.txt:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ openssl enc aes-256-cbc -salt -in secret.txt -out secret.aes
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Здесь мы используем алгоритм шифрования AES (один из лучших на сегодня) с длиной ключа 256 байт и режимом шифрования CBC (который хоть и скомпрометировал себя, но для домашних нужд вполне сгодится). Также с помощью опции &lt;em&gt;-salt&lt;/em&gt; добавим соли чтобы результат получился совсем мудреный. В ответ на запрос пароля вводим пароль (дважды).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;После выполнения этой процедуры файл secret.aes можно спокойно хранить хоть в домашнем каталоге или таскать с собой на флешке до того момента пока не понадобится извлечь его содержимое. А сделать это просто:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ openssl aes-256-cbc -d -in secret.aes -out secret.txt&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Вводим пароль - получаем оригинал. Если требуется зашифровать простую строку текста, то от входного файла можно избавиться:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ echo секретный текст | openssl aes-256-cbc -salt -out secret.aes&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Объединив этот способ со всемогущим netcat получаем сетевой &lt;em&gt;cp&lt;/em&gt;:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;приемник...$ nc -l -p 666 | openssl aes-256-cbc -d
передатчик.$ echo секретный текст | openssl aes-256-cbc -salt | nc 192.168.0.1 666&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Чтобы зашифровать сразу несколько файлов можно написать небольшой скрипт:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ for f in * ; do [ -f $f ] &amp;amp;&amp;amp;\
    openssl enc -aes-256-cbc -salt -in $f -out $f.enc\
    -pass file:/tmp/passwd ; done&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Оцпия &lt;em&gt;-pass file:/tmp/passwd&lt;/em&gt; здесь используется чтобы не вводить пароль для каждого файла. Достаточно просто поместить его в указанный файл и дело в шляпе (можно также использовать опцию &lt;em&gt;-pass pass:пароль&lt;/em&gt; для прямого указания пароля, но это небезопасно, он осядет в истории bash).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;С другой стороны, для шифрования каталога лучше использовать такой прием с начальной упаковкой файлов:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ tar c каталог | openssl enc -aes-256-cbc -e &amp;gt; secret.tar.enc&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Также OpenSSL удобно использовать для генерирования стойких паролей:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ openssl rand 8 -base64
O0Hqtv9l0sY=&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;И хэшей для записи в /etc/passwd:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# openssl passwd -1 my-secret-pass
$1$WA7AVhQL$y9VaGwseiKRLSGoJg21TP0&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;И даже фиктивных MAC-адресов:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'
f2:9e:56:fd:5a:93&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Идеальное предложение для тех, кто хочет отдохнуть в Египте. &lt;a href="http://www.tourskidki.ru/countrys/1015/593.html"&gt;Горячие туры в Египет&lt;/a&gt; здесь и сейчас. Заходите и берите.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=g2msmo2XsYE:m24OiLOUBcg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=g2msmo2XsYE:m24OiLOUBcg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=g2msmo2XsYE:m24OiLOUBcg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/g2msmo2XsYE" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2011/12/01/openssl-encryption/</feedburner:origLink></entry><entry><title>Используем графический процессор в личных целях. Часть 2
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/xHBnHLhkY7Q/" rel="alternate" /><updated>2011-11-05T17:36:39+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2011/11/05/gpgpu2/</id><link length="100000" href="http://execbit.ru/uploads/gpgpu2.jpg" type="image/jpeg" rel="enclosure" /><category term="интересности" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;В прошлой статье мы разобрались зачем нужна технология &lt;strong&gt;GPGPU&lt;/strong&gt;, какие преимущества она может дать линуксойду и нужна ли она нам вообще. Сегодня мы попытаемся настроить все это дело и сделать так, чтобы видеокарта начала делать работу, для выполнения которой она не предназначена.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;a href="http://execbit.ru/2011/11/04/gpgpu/"&gt;Первая часть&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_что_нам_нужно"&gt;Что нам нужно?&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Во-первых, понадобится видео-карта, поддерживающая технологию &lt;strong&gt;CUDA&lt;/strong&gt; или &lt;strong&gt;Stream&lt;/strong&gt;. Не обязательно, чтобы это была топовая модель, достаточно любой карты с годом выпуска не раньше 2009. Полный список поддерживаемых видео-карт можно посмотреть в википедии на страницах CUDA и AMD_Stream_Processor. Также о поддержке той или иной технологии можно узнать прочитав документацию, хотя в большинстве случаев будет достаточным взглянуть на коробку из под видео-карты или ноутбука. Обычно на нее наклеены различные рекламные стикеры.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Во-вторых, в систему должны быть установлены последние проприетарные драйвера для видео-карты, они обеспечат поддержку как родных для карточки технологий GPGPU, так и открытого OpenCL.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;И в-третьих, так как пока дистрибутивостроители еще не начали распространять пакеты приложений с поддержкой GPGPU, нам придется собирать приложения самостоятельно, а для этого нужны официальные SDK от производителей: &lt;a href="http://developer.nvidia.com/object/cuda_download.html"&gt;CUDA Toolkit&lt;/a&gt; или &lt;a href="http://developer.amd.com/gpu/ATIStreamSDK/Pages/default.aspx"&gt;ATI Stream SDK&lt;/a&gt;. Они содержат в себе необходимые для сборки приложений заголовочные файлы и библиотеки.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_ставим_cuda_toolkit"&gt;Ставим CUDA Toolkit&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Идем по вышеприведенной ссылке и скачиваем CUDA Toolkit для Linux (выбрать можно из нескольких версий, для дистрибутивов Fedora, RHEL, Ubuntu и SUSE, есть версии как для архитектуры x86, так и для x86_64). Кроме того, там же надо скачать комплектов драйверов для разработчиков (Developer Drivers for Linux, они идут первыми в списке).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Запускаем инсталлятор SDK:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ sudo sh cudatoolkit_4.0.17_linux_64_ubuntu10.10.run&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Когда установка будет завершена приступаем к установке драйверов. Для этого завершаем X-сервер:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sudo /etc/init.d/gdm stop&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Открываем консоль &amp;lt;Ctrl+Alt+F5&amp;gt; и запускаем инсталлятор драйверов:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ sudo sh devdriver_4.0_linux_64_270.41.19.run&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;После окончания установки стартуем иксы:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ startx&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Чтобы приложения смогли работать с CUDA/OpenCL, прописываем путь до каталога с CUDA-библиотеками в переменную LD_LIBRARY_PATH:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Или, если вы установили 32-битную версию:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ export LD_LIBRARY_PATH=/usr/local/cuda/lib32&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Также необходимо прописать путь до заголовочных файлов CUDA, чтобы компилятор их нашел на этапе сборки приложения:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ export C_INCLUDE_PATH=/usr/local/cuda/include&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Все, теперь можно, приступить к сборке CUDA/OpenCL-софта.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_ставим_ati_stream_sdk"&gt;Ставим ATI Stream SDK&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Stream SDK не требует установки, поэтому скачанный с сайта AMD архив можно просто распаковать в любой каталог (лучшим выбором будет /opt) и прописать путь до него во все ту же перменную LD_LIBRARY_PATH:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ cd
$ wget http://download2-developer.amd.com/amd/APPSDK/AMD-APP-SDK-v2.4-lnx64.tgz
$ cd /opt
$ sudo tar -xzf ~/AMD-APP-SDK-v2.4-lnx64.tgz
$ export LD_LIBRARY_PATH=/opt/AMD-APP-SDK-v2.4-lnx64/lib/x86_64/
$ export C_INCLUDE_PATH=/opt/AMD-APP-SDK-v2.4-lnx64/include/&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Как и в случае с CUDA Toolkit, x86_64 необходимо заменить на x86 в 32-битных системах. Теперь переходим в корневой каталог и распаковываем архив icd-registration.tgz (это своего рода бесплатный лицензионный ключ):&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ cd /
$ sudo tar -xzf /opt/AMD-APP-SDK-v2.4-lnx64/icd-registration.tgz&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Проверяем правильность установки/работы пакета с помощью инструмента clinfo:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ /opt/AMD-APP-SDK-v2.4-lnx64/bin/x86_64/clinfo&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_imagemagick_и_opencl"&gt;ImageMagick и OpenCL&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Поддержка OpenCL появилась в ImageMagick уже достаточно давно, однако по умолчанию она не активирована ни в одном дистрибутиве. Поэтому нам придется собрать IM самостоятельно из исходников.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Ничего сложного в этом нет, все необходимое уже есть в SDK, поэтому сборка не потребует установки каких-то дополнительных библиотек от nVidia или AMD. Итак, скачиваем/распаковываем архив с исходниками:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ wget ftp://mirror.aarnet.edu.au/pub/imagemagick/ImageMagick-6.7.0-0.tar.bz2
$ tar -xjf ImageMagick-6.7.0-0.tar.bz2
$ cd ImageMagick-6.7.0-0&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Далее устанавливаем инстурменты сборки:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ sudo apt-get install build-essential&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Запускаем конфигуратор и грепаем его вывод на предмет поддержки OpenCL:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ LDFLAGS=-L$LD_LIBRARY_PATH ./configure | grep -e cl.h -e OpenCL&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;checking CL/cl.h usability... yes
checking CL/cl.h presence... yes
checking for CL/cl.h... yes
checking OpenCL/cl.h usability... no
checking OpenCL/cl.h presence... no
checking for OpenCL/cl.h... no
checking for OpenCL library... -lOpenCL&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Словом “yes” должны быть отмечены либо первые три строки, либо вторые (или обе сразу). Если это не так, значит скорее всего была неправильно инициализирована переменная C_INCLUDE_PATH. Если же словом “no” отмечена последняя строка, значит дело в переменной LD_LIBRARY_PATH.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Если все ок запускаем процесс сборки/установки:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ sudo make install clean&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Проверяем, что ImageMagick действительно был скомпилирован с поддержкой OpenCL:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ /usr/local/bin/convert -version | grep Features
Features: OpenMP OpenCL&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Теперь измерим полученный выигрыш в скорости. Разработчики ImageMagick рекомендуют использовать для этого фильтр convolve:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ time /usr/bin/convert image.jpg -convolve '-1, -1, -1, -1, 9, -1, -1, -1, -1' image2.jpg
$ time /usr/local/bin/convert image.jpg -convolve '-1, -1, -1, -1, 9, -1, -1, -1, -1' image2.jpg&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Некоторые другие операции, такие как ресайз, теперь тоже должны работать значительно быстрее, однако надеяться на то, что ImageMagick начнет обрабатывать графику с бешенной скоростью не стоит. Пока еще очень малая часть пакета оптимизирована с помощью OpenCL.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_flaccl_flacuda"&gt;FlacCL (Flacuda)&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;a href="http://www.cuetools.net/doku.php/flacuda"&gt;FlacCL&lt;/a&gt; - это кодировщик звуковых файлов в формат FLAC, задействующий в своей работе возможности OpenCL. Он входит в состав пакета &lt;a href="http://www.cuetools.net/doku.php"&gt;CUETools&lt;/a&gt; для Windows, но благодаря mono может быть использован и в Linux.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Для получения архива с кодировщиком выполняем следующую команду:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ mkdir flaccl &amp;amp;&amp;amp; cd flaccl
$ wget http://www.cuetools.net/install/flaccl03.rar&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Далее устанавливаем unrar, mono и распаковываем архив:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ sudo apt-get install unrar mono
$ unrar x flaccl03.rar&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Чтобы программа смогла найти библиотеку OpenCL делаем символическую ссылку:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ln -s $LD_LIBRARY_PATH/libOpenCL.so libopencl.so&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Теперь запускаем кодировщик:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ mono CUETools.FLACCL.cmd.exe music.wav&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Если на экран будет выведено ссобщение об ощибке следующего вида:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;Error: Requested compile size is bigger than the required workgroup size of 32&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Значит у нас в системе слишком слабенькая видео-карта и количество задействованных ядер следует сократить до указанного числа с помощью флага ‘--group-size XX’, где XX - нужное количество ядер.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Сразу скажу, что из-за долгого времени инициализации OpenCL, заметный выигрыш можно получить только на достаточно длинных дорожках. Короткие звуковые файлы FlacCL обрабатывает почти с той же скоростью, что и его традиционная версия.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_oclhashcat_или_брутфорс_по_быстрому"&gt;oclHashcat или брутфорс по быстрому&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Как я уже говорил в прошлой статье, одними из первых поддержку GPGPU в свои продукты добавили разработчики различных крэкеров и систем брутфорса паролей. Для них новая технология стала настоящим святым граалем, который позволил с легкостью перенести от природы легко распараллеливаемый код на плечи быстрых GPU-процессоров. Поэтому сейчас существуют десятки самых разных реализаций подобных программ. Но в этой статье я расскажу только об одной из них - oclHashcat.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;a href="http://hashcat.net/oclhashcat/"&gt;oclHashcat&lt;/a&gt; - это ломалка, которая умеет подбирать пароли по их хэшу с экстремально высокой скоростью, задействуя при этом мощности GPU с помощью OpenCL. Если верить замерам, опубликованным на сайте проекта, скорость подбора MD5-паролей на nVidia GTX580 составляет до 15800 млн комбинаций в секунду, благодаря чему oclHashcat способен найти средний по сложности восьмисимвольный пароль за какие-то 9 минут.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Программа поддерживает OpenCL и CUDA, алгоритмы MD5, md5($pass.$salt), md5(md5($pass)), vBulletin &amp;lt; v3.8.5, SHA1, sha1($pass.$salt), хэши MySQL, MD4, NTLM, Domain Cached Credentials, SHA256, поддерживает распределенный подбора паролей с задействованием мощностей нескольких машин.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Автор не раскрывает исходники (что, в общем-то, логично), но у программы есть нормально работающая Linux-версия, которую можно получить с официальной странички: &lt;a href="http://hashcat.net/files/oclHashcat-0.25.7z"&gt;http://hashcat.net/files/oclHashcat-0.25.7z&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Далее следует распаковать архив:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ 7z x oclHashcat-0.25.7z
$ cd oclHashcat-0.25&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;И запустить программу (воспользуемся пробным списком хэшей и пробным словарем):&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ./oclHashcat64.bin example.hash ?l?l?l?l example.dict&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;oclHashcat откроет текст пользовательского соглашения, с которым следует согласиться набрав “YES”. После этого начнется процесс перебора, прогресс которого можно узнать нажав &amp;lt;s&amp;gt;, также приостановить процесс с помощью клавиши &amp;lt;p&amp;gt; и возобновить нажав &amp;lt;r&amp;gt;.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Также можно использовать прямой перебор (например, от aaaaaaaa до zzzzzzzz):&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ ./oclHashcat64.bin hash.txt ?l?l?l?l ?l?l?l?l&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;И различные модификации словаря и метода прямого перебора, а также их комбинации (об этом можно прочитать в файле docs/examples.txt). В моем случае скорость перебора всего словаря составила 11 минут, тогда как прямой перебор (от aaaaaaaa до zzzzzzzz) длился около 40 минут. В среднем скорость работы GPU (чип RV710) составила 88.3M/s.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_выводы"&gt;Выводы&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Несмотря на множество самых разных ограничений и сложность разработки софта, GPGPU - это будущее выскпроизводительных настольных машин. Но самое главное - использовать возможности этой технологии можно прямо сейчас, и это касается не только Windows-машин, но и Linux&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_kgpu_или_ядро_linux_ускоренное_gpu"&gt;KGPU или ядро Linux, ускоренное GPU&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Исследователи из университета Юты разработали систему &lt;a href="http://code.google.com/p/kgpu/"&gt;KGPU&lt;/a&gt;, позволяющую выполнять некоторые функции ядра Linux на графическом процессоре с помощью фреймворка CUDA. Для выполнения этой задачи используется модифицированное ядро Linux и специальный демон, который работает в пространстве пользователя, слушает запросы ядра и передает их драйверу видео-карты с помощью библиотеки CUDA. Интересно, что несмотря на существенный оверхед, который создает такая архитектура, авторам KGPU удалось создать реализацию алгоритма AES, который поднимает скорость шифрования файловой системы eCryptfs в 6 раз.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_ссылки"&gt;Ссылки&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Облачный сервис, позволяющий загружать и запускать софт с поддержкой CUDA и OpenCL: &lt;a href="http://www.hoopoe-cloud.com"&gt;http://www.hoopoe-cloud.com&lt;/a&gt;.
&lt;br/&gt;
FASTRA II - суперкомпьютер, построенный с использованием 13 видео-карт, мощностью 12TFLOPS: &lt;a href="http://fastra2.ua.ac.be"&gt;http://fastra2.ua.ac.be&lt;/a&gt;.
&lt;br/&gt;
Реализация архиватора bzip2 с использованием CUDA: &lt;a href="http://bzip2-cuda.github.com"&gt;http://bzip2-cuda.github.com&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Статья написана для журнала Хакер.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;У вас собственных помещений для размещения серверов? &lt;a href="http://www.di-net.ru/collocation/" title="дата центр"&gt;Дата центр&lt;/a&gt; msm.ru к вашим услугам. Размещения серверного и коммутационного оборудования, аренда серверов, приемлемые цены.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=xHBnHLhkY7Q:_6jqhs9TOsQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=xHBnHLhkY7Q:_6jqhs9TOsQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=xHBnHLhkY7Q:_6jqhs9TOsQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/xHBnHLhkY7Q" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2011/11/05/gpgpu2/</feedburner:origLink></entry><entry><title>Используем графический процессор в личных целях (GPGPU). Часть 1
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/fpcNGBIzxgs/" rel="alternate" /><updated>2011-11-04T15:15:55+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2011/11/04/gpgpu/</id><link length="100000" href="http://execbit.ru/uploads/gpgpu.jpg" type="image/jpeg" rel="enclosure" /><category term="интересности" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Сегодня новости об использовании графических процессоров для общих вычислений можно услышать на каждом углу. Такие слова как &lt;strong&gt;CUDA&lt;/strong&gt;, &lt;strong&gt;Stream&lt;/strong&gt; и &lt;strong&gt;OpenCL&lt;/strong&gt; за каких то два года стали чуть ли не самыми цитируемыми в айтишном интернете и на страницах журналов и книг. Однако, что значат эти слова и что несут стоящие за ними технологии, известно далеко не каждому, а для линуксойдов, привыкших “быть в пролете”, так и вообще все это видится темным лесом.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В этой статье мы попытаемся разобраться зачем нужна технология &lt;strong&gt;GPGPU&lt;/strong&gt; (General-purpose graphics processing units - Графический процессор общего назначения) и все связанные с ней реализации от конкретных производителей. Узнаем почему эта технология имеет очень узкую сферу применения, в которую подавляющее большинство софта не попадает в принципе, и конечно же, попытаемся извлечь из всего этого выгоду в виде существенных приростов производительности в таких задачах как шифрование, подбор паролей, работа с мультимедиа и архивирование.&lt;/p&gt;&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_о_чем_это_я"&gt;О чем это я?&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Мы все привыкли думать, что единственным компонентом ПК, способным выполнять любой код, который ему прикажут, является центральный процессор. Долгое (нет, очень долгое) время почти все массовые ПК оснащались единственным процессором, который занимался всеми мыслимыми расчетами, включая код операционной системы, всего нашего софта и вирусов.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Позже появились многоядерные процессоры и многопроцессорные системы, в которых таких компонентов было несколько. Это позволило машинам выполнять несколько задач одновременно, а общая (теоретическая) производительность системы поднялась ровно во столько раз, сколько ядер было установлено в машине. Однако, оказалось, что производить и конструировать многоядерные процессоры слишком сложно и дорого. В каждом ядре приходилось размещать полноценный процессор сложной и запутанной x86-архитектуры, со своим (довольно объемным) кэшем, конвейером инструкций, блоками SSE, множеством блоков, выполняющих оптимизации и т.д и т.п. Поэтому процесс наращивания количества ядер существенно затормозился и белые университетские халаты, которым 2 или 4 ядра было явно мало, нашли способ задействовать для своих научных расчетов другие вычислительные мощности, которых было в достатке на видео-карте (в результате даже появился инструмент &lt;strong&gt;BrookGPU&lt;/strong&gt;, эмулирующий дополнительный процессор с помощью вызовов функций DirectX и OpenGL).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Графические процессоры, лишенные многих недостатков центрального процессора, оказались отличной и очень быстрой счетной машинкой и совсем скоро к наработкам ученых умов начали присматриваться сами производители GPU (а nVidia так и вообще наняла большинство исследователей на работу). В результате появилась технология &lt;strong&gt;nVidia CUDA&lt;/strong&gt;, определяющая интерфейс, с помощью которого стало возможным перенести вычисление сложных алгоритмов на плечи GPU без каких-либо костылей. Позже за ней последовала ATi (AMD) с собственным вариантом технологии под названием Close to Metal (ныне &lt;strong&gt;Stream&lt;/strong&gt;), а совсем скоро появилась ставшая стандартом версия от Apple под названием &lt;strong&gt;OpenCL&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_gpu_наше_все"&gt;GPU наше все?&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Несмотря на все преимущества техника GPGPU имеет несколько проблем. Первая из них заключается в очень узкой сфере применения. GPU шагнули далеко вперед центрального процессора в плане наращивания вычислительной мощности и общего количества ядер (видеокарты несут на себе вычилительный блок, состоящий из более чем сотни ядер), однако такая высокая плотность достигается за счет максимального упрощения дизайна самого чипа.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В сущности основная задача GPU сводится к математическим к расчетам с помощью простых алгоритмов, получающих на вход не очень большие объемы предсказуемых данных. Ядра GPU имеют очень простой дизайн, мизерные объемы кэша и скромный набор инструкций, что в конечном счете и выливается в дешевизну их производства и возможность очень плотного размещения на чипе. GPU похожи на китайскую фабрику с тысячами рабочих. Какие-то простые вещи они делают достаточно хорошо, а главное быстро и дешево, но если доверить им сборку самолета, то в результате получится максимум дельтаплан (да, зря я так про китайцев, они уже и самолеты и ракеты делают). Поэтому первое ограничение GPU - это ориентированность на быстрые математические расчеты, что ограничивает сферу применения графических процессоров помощью в работе мультимедийных приложений, а также любых программ, занимающихся сложной обработкой данных (например, архиваторов или систем шифрования, а также софтин, занимающихся флуоресцентной микроскопией, молекулярная динамикой, электростатикой и другими, мало интересными линуксойдам вещами).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Вторая проблема GPGPU в том, что адаптировать для выполнения на GPU можно далеко не каждый алгоритм. Отдельно взятые ядра графического процессора довольно медлительны и их мощь проявляется только при работе сообща. А это значит, что алгоритм будет настолько эффективным, насколько эффективно его сможет распараллелить программист. В большинстве случаев с такой работой может справиться только хороший математик, которых среди разработчиков софта далеко не большинство.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;И третье: графические процессоры работают с памятью, установленной на самой видео-карте, так что при каждом задействовании GPU будет происходить две дополнительных операции копирования: входные данные из оперативной памяти самого приложения и выходные данные из GRAM обратно в память приложения. Не трудно догадаться, что это может свести на нет весь выигрыш во времени работы приложения (как и происходит в случае с инструментом FlacCL, который мы рассмотрим позже).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Но и это еще не все. Несмотря на существование общепризнанного стандарта в лице OpenCL, многие программисты до сих пор предпочитают использовать привязанные к производителю реализации техники GPGPU. Особенно популярной оказалась CUDA, которая хоть и дает более гибкий интерфейс программирования (кстати, OpenCL в драйверах nVidia реализован поверх CUDA), но намертво привязывает приложение к видео-картам одного производителя.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_что_есть_сейчас"&gt;Что есть сейчас?&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В силу своей молодости, а также благодаря описанным выше проблемам, GPGPU так и не стала по-настоящему распространенной технологией, однако полезный софт, использующий ее возможности существует (хоть и в мизерном количестве).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Одними из первых появились крэкеры различных хэшей, алгоритмы работы которых очень легко распараллелить. Также родились мультимедийные приложения, такие кодировщик &lt;strong&gt;FlacCL&lt;/strong&gt;, позволяющий перекодировать звуковую дорожку в формат FLAC. Поддержкой GPGPU обзавелись и некоторые уже существовавшие ранее приложения, самым заметным из которых стал &lt;strong&gt;ImageMagick&lt;/strong&gt;, который теперь умеет перекладывать часть своей работы на графический процессор с помощью OpenCL. Также есть проекты по переводу на CUDA/OpenCL (не любят юниксойды ATi) архиваторов данных и других систем сжатия информации. Наиболее интересные из этих проектов мы рассмотрим в &lt;a href="http://execbit.ru/2011/11/05/gpgpu2/"&gt;следующей статье&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Статья написана для журнала Хакер.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Хотите &lt;a href="http://www.cli.ru/"&gt;купить кондиционер&lt;/a&gt;? Тогда интернет-магазин климатической техники cli.ru к вашим услугам.Бесплатная доставка, выезд специалиста, срочный монтаж, комплексный подход к оказанию услуг. &lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=fpcNGBIzxgs:VT7ehU7PchY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=fpcNGBIzxgs:VT7ehU7PchY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=fpcNGBIzxgs:VT7ehU7PchY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/fpcNGBIzxgs" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2011/11/04/gpgpu/</feedburner:origLink></entry><entry><title>Альманах по борьбе с DDoS
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/6MJ6PaEH5AE/" rel="alternate" /><updated>2011-10-27T18:51:31+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2011/10/27/ddos/</id><link length="100000" href="http://execbit.ru/uploads/ddos.jpg" type="image/jpeg" rel="enclosure" /><category term="админство" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Твое утро начинается с чтения багрепортов и анализа логов. Ты ежедневно обновляешь ПО и ежечасно дорабатываешь правила брандмауэра. Snort твой лучший друг, а Zabbix – невидимый помощник. Ты построил настоящий бастион, к которому не подобраться ни с одной стороны. Но! Ты совершенно беззащитен против самой коварной и подлой атаки на свете – DDoS.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_анатомия_dos_атак"&gt;Анатомия DoS-атак&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Трудно сказать, когда впервые появился термин DoS-атака. Специалисты говорят о 1996-м, попутно намекая, что до широких масс этот тип атак «дошел» только в 1999 году, когда один за другим попадали web-сайты Amazon, Yahoo, CNN и eBay. Еще раньше DoS-эффект использовали для тестирования устойчивости систем и каналов связи. А если копнуть глубже и воспользоваться термином DoS для обозначения явления, то становится ясно, что он существовал всегда, со времен первых мейнфреймов, вот только задумываться о нем как о средстве устрашения начали гораздо позже.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Говоря простым языком, DoS-атаки – это некоторый вид злонамеренной деятельности, ставящей своей целью довести компьютерную систему до такого состояния, когда она не сможет обслуживать правомерных пользователей или правильно выполнять возложенные на нее функции. К состоянию «отказ в обслуживании» обычно приводят ошибки в ПО или чрезмерная нагрузка на сетевой канал или систему в целом, в результате чего ПО, либо вся операционная система машины «падает» или же оказывается в «зацикленном» состоянии. А это грозит простоями, потерей посетителей/клиентов и убытками.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;DoS-атаки подразделяются на локальные и удаленные. К локальным DoS-атакам относятся различные эксплойты, форк-бомбы и программы, открывающие по миллиону файлов или запускающие некий циклический алгоритм, который сжирает память и процессорные ресурсы. На всем этом мы останавливаться не будем. А вот удаленные DoS-атаки рассмотрим подробнее. Они делятся на два вида:&lt;/p&gt;&lt;/div&gt;
&lt;div class="olist arabic"&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;
Удаленная эксплуатация ошибок в ПО для того, чтобы привести его в нерабочее состояние.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Flood – посылка на адрес жертвы огромного количества бессмысленных (реже осмысленных) пакетов. Целью флуда может быть канал связи или ресурсы машины. В первом случае поток пакетов занимает весь пропускной канал и не дает атакуемой машине возможность обрабатывать легальные запросы. Во втором – ресурсы машины захватываются с помощью многократного и очень частого обращения к какому-либо сервису, выполняющему сложную, ресурсоемкую операцию. Это может быть, например, длительное обращение к одному из активных компонентов (скрипту) web-сервера. В результате сервер тратит все ресурсы машины на обработку запросов атакующего, а пользователям приходится ждать.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В своем традиционном исполнении (один атакующий – одна жертва) на данный момент остается эффективным только первый вид атак. Классический флуд бесполезен просто потому, что при сегодняшней ширине канала серверов, уровне вычислительных мощностей и повсеместном использовании различных анти-DoS приемов в ПО (например, задержки при многократном выполнении одних и тех же действий одним клиентом), атакующий превращается в надоедливого комара, не способного нанести какой бы то ни было ущерб. Но если этих комаров наберутся сотни, тысячи или даже сотни тысяч, они легко положат сервер на лопатки. Толпа – страшная сила не только в жизни, но и в компьютерном мире. Распределенная атака типа «отказ в обслуживании» (DDoS), обычно осуществляемая с помощью множества зомбифицированных хостов, может отрезать от внешнего мира даже самый стойкий сервер, и единственная эффективная защита от нее – организация распределенной системы серверов (но это по карману далеко не всем, привет Google).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_методы_борьбы"&gt;Методы борьбы&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Опасность большинства DDoS-атак в их абсолютной прозрачности и «нормальности». Ведь если ошибка в ПО всегда может быть исправлена, то полное сжирание ресурсов – явление почти обыденное, с которым сталкиваются многие администраторы, когда ресурсов машины (ширины канала) становится недостаточно, или их web-сайт подвергается слэшдот-эффекту (twitter.com стал недоступен уже через несколько минут после первого известия о смерти Майкла Джексона). И если резать трафик и ресурсы для всех подряд, то спасешься от DDoS, но потеряешь добрую половину клиентов.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Выхода из этой ситуации фактически нет, однако последствия DDoS-атак и их эффективность можно существенно снизить за счет правильной настройки маршрутизатора, брандмауэра и постоянного анализа аномалий в сетевом трафике. В следующей части статьи мы последовательно рассмотрим: способы распознавания начинающейся DDoS-атаки, методы борьбы с конкретными типами DDoS-атак, универсальные советы, которые помогут подготовиться к DoS-атаке и снизить ее эффективность, в самом конце будет дан ответ на вопрос: что делать, когда началась DDoS-атака.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_борьба_с_flood_атаками"&gt;Борьба с flood-атаками&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Итак, существует два типа DoS/DDoS-атак, и наиболее распространенная из них основана на идее флуда, то есть заваливания жертвы огромным количеством пакетов. Но флуд бывает разным: ICMP-флуд, SYN-флуд, UDP-флуд и HTTP-флуд. Современные DoS-боты могут использовать все эти виды атак одновременно, поэтому следует заранее позаботиться об адекватной защите от каждой из них.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;strong&gt;ICMP-флуд&lt;/strong&gt;. Очень примитивный метод забивания полосы пропускания и создания нагрузок на сетевой стек через монотонную посылку запросов ICMP ECHO (пинг). Легко обнаруживается с помощью анализа потоков трафика в обе стороны: во время атаки типа ICMP-флуд они практически идентичны. Почти безболезненный способ абсолютной защиты основан на отключении ответов на запросы ICMP ECHO:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sysctl net.ipv4.icmp_echo_ignore_all=1&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Или с помощью брандмауэра:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# iptables -A INPUT -p icmp -j DROP --icmp-type 8&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;strong&gt;SYN-флуд&lt;/strong&gt;. Один из распространенных способов не только забить канал связи, но и ввести сетевой стек операционной системы в такое состояние, когда он уже не сможет принимать новые запросы на подключение. Основан на попытке инициализации большого числа одновременных TCP-соединений через посылку SYN-пакета с несуществующим обратным адресом. После нескольких попыток отослать ответный ACK-пакет на недоступный адрес большинство операционок ставят неустановленное соединение в очередь и только после n-ой попытки закрывают соединение. Так как поток ACK-пакетов очень велик, вскоре очередь оказывается заполненной, и ядро дает отказ на попытки открыть новое соединение. Наиболее умные DoS-боты еще и анализируют систему перед началом атаки, чтобы слать запросы только на открытые жизненно важные порты. Идентифицировать такую атаку просто: достаточно попробовать подключиться к одному из сервисов. Оборонительные мероприятия обычно включают в себя:&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Увеличение очереди «полуоткрытых» TCP-соединений:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sysctl -w net.ipv4.tcp_max_syn_backlog=1024&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Уменьшение времени удержания «полуоткрытых» соединений:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sysctl -w net.ipv4.tcp_synack_retries=1&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Включение механизма TCP syncookies:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sysctl -w net.ipv4.tcp_syncookies=1&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Ограничение максимального числа «полуоткрытых» соединений с одного IP к конкретному порту:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# iptables -I INPUT -p tcp --syn --dport 80 -m iplimit \
    --iplimit-above 10 -j DROP&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;strong&gt;UDP-флуд&lt;/strong&gt;. Типичный метод захламления полосы пропускания, основанный на бесконечной посылке UDP-пакетов на порты различных UDP-сервисов. Легко устраняется за счет отрезания таких сервисов от внешнего мира и установку лимита на количество соединений в единицу времени к DNS-серверу на стороне шлюза:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# iptables -I INPUT -p udp --dport 53 -j DROP -m iplimit \
    --iplimit-above 1&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;strong&gt;HTTP-флуд&lt;/strong&gt;. Один из самых распространенных на сегодняшний день способов флуда. Основан на бесконечной посылке HTTP-сообщений GET на 80-ый порт с целью загрузить web-сервер настолько, чтобы он оказался не в состоянии обрабатывать все остальные запросы. Часто целью флуда становится не корень web-сервера, а один из скриптов, выполняющих ресурсоемкие задачи или работающий с базой данных. В любом случае, индикатором начавшейся атаки будет служить аномально быстрый рост логов web-сервера.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Методы борьбы с HTTP-флудом включают в себя тюнинг web-сервера и базы данных с целью снизить эффект от атаки и отсеивание DoS-ботов с помощью различных приемов. Во-первых, следует увеличить максимальное число коннектов к базе данных одновременно. Во-вторых – установить перед web-сервером Apache легкий и производительный nginx, который будет кэшировать запросы и отдавать статику. Это решение из списка «must have», которое не только снизит эффект DoS-атак, но и позволит серверу выдержать огромные нагрузки. Небольшой пример:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# Увеличиваем максимальное количество используемых файлов
worker_rlimit_nofile 80000;
events {
    # Увеличиваем максимальное количество соединений
    worker_connections 65536;
    # Использовать эффективный метод epoll для обработки соединений
    use epoll;
}
http {
    gzip off;
    # Отключаем таймаут на закрытие keep-alive соединений
    keepalive_timeout 0;
    # Не отдавать версию nginx в заголовке ответа
    server_tokens off;
    # Сбрасывать соединение по таймауту
    reset_timedout_connection on;
}
# Стандартные настройки для работы в качестве прокси
server {
    listen 111.111.111.111 default deferred;
    server_name host.com www.host.com;
    log_format IP $remote_addr;
    location / {
        proxy_pass http://127.0.0.1/;
    }
    location ~* \.(jpeg|jpg|gif|png|css|js|pdf|txt|tar)$ {
        root /home/www/host.com/httpdocs;
    }
}&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В случае необходимости можно задействовать nginx-модуль ngx_http_limit_req_module, ограничивающий количество одновременных подключений с одного адреса. Ресурсоемкие скрипты можно защитить от ботов с помощью задержек, кнопок «Нажми меня», выставления кукисов и других приемов, направленных на проверку «человечности».&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_универсальные_советы"&gt;Универсальные советы&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Чтобы не попасть в безвыходное положение во время обрушения DDoS-шторма на системы, необходимо тщательным образом подготовить их к такой ситуации:&lt;/p&gt;&lt;/div&gt;
&lt;div class="olist arabic"&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;
Все сервера, имеющие прямой доступ во внешнюю сеть, должны быть подготовлены к простому и быстрому удаленному ребуту (sshd спасет отца русской демократии). Большим плюсом будет наличие второго, административного, сетевого интерфейса, через который можно получить доступ к серверу в случае забитости основного канала.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
ПО, используемое на сервере, всегда должно находиться в актуальном состоянии. Все дырки – пропатчены, все обновления установлены (простой как сапог совет, которому многие не следуют). Это автоматически оградит тебя от DoS-атак, эксплуатирующих баги в сервисах.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Все слушающие сетевые сервисы, предназначенные для административного использования, должны быть спрятаны брандмауэром ото всех, кто не должен иметь к ним доступ. Тогда атакующий не сможет использовать их для проведения DoS-атаки или брутфорса.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
На подходах к серверу (ближайшем маршрутизаторе) должна быть установлена система анализа трафика (NetFlow в помощь), которая позволит своевременно узнать о начинающейся атаке и вовремя принять меры по ее предотвращению.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Добавь в /etc/sysctl.conf следующие строки:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# Защита от спуфинга
net.ipv4.conf.default.rp_filter = 1
# Проверять TCP-соединение каждую минуту. Если на другой стороне -
# легальная машина, она сразу ответит. Дефолтовое значение - 2 часа.
net.ipv4.tcp_keepalive_time = 60
# Повторить пробу через десять секунд
net.ipv4.tcp_keepalive_intvl = 10
# Количество проверок перед закрытием соединения
net.ipv4.tcp_keepalive_probes = 5&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Следует отметить, что все приемы, приведенные в прошлом и этом разделах, направлены на снижение эффективности DDoS-атак, ставящих своей целью израсходовать ресурсы машины. От флуда, забивающего канал мусором, защититься практически невозможно, и единственно правильный, но не всегда осуществимый способ борьбы с таким видом атак заключается в том, чтобы «лишить атаку смысла». Если ты заимеешь в свое распоряжение действительно широкий канал, который легко пропустит трафик небольшого ботнета, считай, что от 90% атак твой сервер защищен. Еще более изощренный способ защиты основан на организации распределенной вычислительной сети, включающей в себя множество дублирующих серверов, подключенных к разным магистральным каналам. Когда вычислительные мощности или пропускная способность канала заканчиваются, все новые клиенты перенаправляются на другой сервер (или же постепенно «размазываются» по всем серверам по принципу round-robin). Это невероятно дорогая, но очень стойкая структура, завалить которую практически нереально.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Другое более-менее эффективное решение заключается в покупке дорогостоящих хардварных систем Cisco Traffic Anomaly Detector и Cisco Guard. Работая в связке, они могут подавить начинающуюся атаку, но как и большинство других решений, основанных на обучении и анализе состояний, дают сбои. Поэтому следует хорошенько подумать перед тем, как выбивать из начальства десятки тысячи долларов на такую защиту.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_кажется_началось_что_делать"&gt;Кажется, началось. Что делать?&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Перед непосредственным началом атаки боты «разогреваются», постепенно наращивая поток пакетов на атакуемую машину. Важно поймать этот момент и начать активные действия. Поможет в этом постоянное наблюдение за маршрутизатором, подключенным к внешней сети (анализ графиков NetFlow). На сервере-жертве определить начало атаки можно подручными средствами.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Наличие SYN-флуда устанавливается легко – через подсчет числа «полуоткрытых» TCP-соединений:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# netstat -na | grep ":80\ " | grep SYN_RCVD&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В обычной ситуации их не должно быть совсем (или очень небольшое количество: максимум 1-3). Если это не так – ты атакован, срочно переходи к дропанью атакующих.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;С HTTP-флудом все несколько сложнее. Для начала нужно подсчитать количество процессов Apache и количество коннектов на 80-ый порт (HTTP-флуд):&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# ps aux | grep httpd | wc -l
# netstat -na | grep ":80\ " | wc -l&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Значения, в несколько раз превышающие среднестатистические, дают все основания задуматься. Далее следует просмотреть список IP-адресов, с которых идут запросы на подключение:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# netstat -na | grep ":80\ " | sort | uniq -c | \
    sort -nr | less&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Однозначно идентифицировать DoS-атаку нельзя, можно лишь подтвердить свои догадки о ее наличии, если один адрес повторяется в списке слишком много раз (да и то, это может говорить о посетителях, сидящих за NAT’ом). Дополнительным подтверждением будет анализ пакетов с помощью tcpdump:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# tcpdump -n -i eth0 -s 0 -w output.txt dst port 80 \
    and host IP-сервера&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Показателем служит большой поток однообразных (и не содержащих полезной информации) пакетов от разных IP, направленных на один порт/сервис (например, корень web-сервера или определенный cgi-скрипт).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Окончательно определившись, начинаем дропать неугодных по IP-адресам (будет гораздо больше эффекта, если ты сделаешь это на маршрутизаторе):&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp \
    --destination-port http -j DROP&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Или сразу по подсетям:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# iptables -A INPUT -s xxx.xxx.0.0/16 -p tcp \
    --destination-port http -j DROP&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Это даст тебе некоторую фору (совсем маленькую; зачастую IP-адрес источника спуфится), которую ты должен использовать для того, чтобы обратиться к провайдеру/хостеру (с приложенными к сообщению логами web-сервера, ядра, брандмауэра и списком выявленных тобой IP-адресов). Большинство из них, конечно, проигнорируют это сообщение (а хостинги с оплатой трафика еще и порадуются – DoS-атака принесет им прибыль) или просто отключат твой сервер. Но в любом случае это следует сделать обязательно, эффективная защита от DDoS возможна только на магистральных каналах, в одиночку ты справишься с мелкими нападками, направленными на истощение ресурсов сервера, но окажешься беззащитным перед более-менее серьезным DDoS’ом.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_борьба_с_ddos_во_freebsd"&gt;Борьба с DDoS во FreeBSD&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Уменьшаем время ожидания ответного пакета на запрос SYN-ACK (защита от SYN-флуда):&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sysctl net.inet.tcp.msl=7500&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Превращаем сервер в черную дыру, так ядро не будет слать ответные пакеты при попытке подключиться к незанятым портам (снижает нагрузку на машину во время DDoS’а на случайные порты):&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sysctl net.inet.tcp.blackhole=2
# sysctl net.inet.udp.blackhole=1&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Ограничиваем число ответов на ICMP-сообщения 50-тью в секунду (защита от ICMP-флуда):&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sysctl net.inet.icmp.icmplim=50&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Увеличиваем максимальное количество подключений к серверу (защита от всех видов DDoS):&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# sysctl kern.ipc.somaxconn=32768&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Включаем DEVICE_POLLING – самостоятельный опрос сетевого драйвера ядром на высоких нагрузках (существенно снижает нагрузку на систему во время DDoS’а):&lt;/p&gt;&lt;/div&gt;
&lt;div class="ulist"&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
Пересобираем ядро с опцией «options DEVICE_POLLING»
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Активируем механизм поллинга: «sysctl kern.polling.enable=1»
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Добавляем запись «kern.polling.enable=1» в /etc/sysctl.conf
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_пример_ограничения_подключений_к_web_серверу_с_помощью_pf_файл_pf_conf"&gt;Пример ограничения подключений к web-серверу с помощью pf (файл pf.conf)&lt;/h3&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;ext_if="fxp0"

pass in on $ext_if inet proto tcp to $ext_if \
    port www keep state (max 100, source-track rule, \
    max-src-nodes 50, max-src-states 10)&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Пример ограничения подключений средствами индейца (файл httpd.conf)&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;Timeout 300
KeepAlive On
MaxKeepAliveRequests 32
KeepAliveTimeout 15

MinSpareServers 1
MaxSpareServers 4
StartServers 1
MaxClients 32&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_крупнейшие_ботнеты"&gt;Крупнейшие ботнеты&lt;/h3&gt;
&lt;div class="ulist"&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
Kraken – 400 тысяч компьютеров.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Srizbi – 315 тысяч компьютеров.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Bobax – 185 тысяч компьютеров.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Rustock – 150 тысяч компьютеров.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Storm – 100 тысяч компьютеров.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Psybot – 100 тысяч ADSL-маршрутизаторов, основанных на Linux.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Ботнет BBC – 22 тысячи компьютеров. Экспериментальный ботнет, созданный компанией BBC.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_cлед_в_истории"&gt;Cлед в истории&lt;/h3&gt;
&lt;div class="olist arabic"&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;
&lt;p&gt;
1997 год – DDoS-атака на web-сайт Microsoft. Один день молчания.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
1999 год – «вне зоны действия» оказались web-сайты Yahoo, CNN, eBay и другие.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
Октябрь 2002 – атака на корневые DNS-серверы интернета. На некоторое время были выведены из строя 7 из 13 серверов.
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
21 февраля 2003 года – DDoS-нападение на LiveJournal.com. Два дня сервис находился в парализованном состоянии, лишь иногда подавая признаки жизни.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_интеллектуальные_системы"&gt;Интеллектуальные системы&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Интересную альтернативу решениям Cisco выпускает компания Reactive Networks. Их продукт под названием FloodGuard представляет собой аппаратный комплекс, состоящий из детекторов и исполнительных модулей. Детекторы, установленные на брандмауэрах, маршрутизаторах и свитчах, постоянно мониторят трафик и создают его профиль на основе таких параметров, как объем пакетов, источник, направление, тип и т.д. В случае возникновения аномалий детектор посылает все подробности о произошедшем исполнительным модулям, располагающимся на маршрутизаторах в разных сегментах сети. Получив сообщение от детектора, исполнительные модули начинают действовать: они отыскивают паразитный трафик в проходящих пакетах и, в случае удачи, оповещают об этом предыдущие по ходу трафика модули и посылают им инструкции по активации фильтров на маршрутизаторах. В результате перед потоком флуд-трафика должен образоваться заслон, который будет быстро перемещаться в сторону его источника.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Статья написана для журнала Хакер.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Не можете выбрать &lt;a href="http://cominftech.ru/articles/kompyuter-dlya-doma"&gt;компьютер для дома&lt;/a&gt;? Тогда сайт cominftech.ru для вас. Все об информационных технологиях, обеспечение безопасности компьютера, помощь, советы, адреса магазинов.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=6MJ6PaEH5AE:GlOAWZt8L70:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=6MJ6PaEH5AE:GlOAWZt8L70:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=6MJ6PaEH5AE:GlOAWZt8L70:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/6MJ6PaEH5AE" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2011/10/27/ddos/</feedburner:origLink></entry><entry><title>Просто о сложном или разбираемся с SELinux
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/KMSWDj4VCX0/" rel="alternate" /><updated>2011-10-25T17:46:15+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2011/10/25/selinux/</id><link length="100000" href="http://execbit.ru/uploads/selinux.png" type="image/jpeg" rel="enclosure" /><category term="админство" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;SELinux снискала славу сложной в понимании и настройке системы безопасности, которая хоть и делает Linux намного более устойчивой к взлому операционной системой, но создает больше проблем, чем приносит решений. Такая точка зрения в корне не верна и в этой статье я покажу, что SELinux намного проще и удобнее в использовании, чем это кажется на первый взгляд.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Система SELinux (Security-Enhanced Linux - Linux с улучшенной безопасностью) была разработана министерством обороны США и всего за несколько лет стала стандартом в области систем контроля прав доступа. Она была включена в ядро Linux версии 2.6.0 и впервые появилась как полностью работающая из коробки система в дистрибутиве Red Hat Enterprise Linux 4. Впоследствии поддержка SELinux была интегрирована в такие дистрибутивы как Debian, OpenSUSE и Ubuntu, а дополнительные пакеты, активирующие систему, были добавлены во многие другие более или менее популярные дистрибутивы. Именно благодаря SELinux дистрибутиву RHEL5, работающему на серверах IBM, удалось получить сертификат безопасности EAL4 Augmented with ALC_FLR.3, который в то время имела лишь одна операционная система - Trusted Solaris.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;SELinux существенно расширяет ядро Linux, делая операционные системы, построенные на его основе, пригодными к использования в сферах, где доступ к информации должен быть строго разграничен, а приложения, запускаемые пользователями, иметь определенный набор прав, который не выходит за рамки минимально необходимого. Это делает систему привлекательной для госучреждений и военных, однако кажется не совсем понятным зачем она нужна администраторам рядовых серверов, а уж тем более обычным пользователям (в Fedora SELinux по умолчанию включен). Сейчас я попытаюсь объяснить этот момент.&lt;/p&gt;&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_зачем_это_нужно"&gt;Зачем это нужно?&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Создатели UNIX наделили свою ОС простым, но весьма гибким и красивом механизмом безопасности. В его основе лежат всем нам известные права доступа на файлы, которые определяют круг лиц (пользователей, процессов), способных выполнять какие-либо действия над файлами и каталогами. Например, мы можем создать исполняемый файл и выставить на него права доступа “-rwxr-xr-x”, что будет означать, что мы (то есть владелец файла), можем делать с ним все, что захотим, пользователи, входящие в нашу группу могут его читать и исполнять, а все остальные только исполнять.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Учитывая тот факт, что все устройства в UNIX представлены файлами, такой механизм позволяет не только четко разграничивать доступ пользователей (их приложений) к информации, но и к устройствам и даже некоторым функциями операционной системы (procfs и sysfs). Однако, у механизма прав доступа есть два серьезных недостатка:&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Во-первых, их реализация слишком топорна. Она хорошо подходит для отделения процессов от конфиденциальной информации пользователей, но абсолютно не подходит для гибкого управления их возможностями. Например, чтобы дать какой-либо дисковой утилите (cfdisk, например) возможность модификации хранящейся на диске информации, мы можем либо разрешить полный доступ к диску группе, к которой принадлежит ее владелец, либо запустить ее с правами пользователя root. Как в первом, так и во втором случае мы создадим потенциальную брешь в безопасности: все остальные пользователи/приложения группы получат права доступа к диску или сама утилита получит наивысшие и безграничные права в системе. А что если нужно дать доступ не к модификации диска, а только к вызову определенных его функций (ioctl)? Здесь права доступа вообще не помогут.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Во-вторых, файлами в Linux представлены далеко не все ресурсы операционной системы. Огромное количество функций ядра скрыто в более чем трех сотнях системных вызовов, большая часть которых доступна для использования абсолютно всем процессам, а если процесс имеет права root, то его возможности вообще никак не ограничиваются. Если, к примеру, мы захотим запустить FTP-сервер на стандартном для него 21 порту, который доступен только процессам с правами root, нам придется всецело довериться его разработчику, так как работая от root, FTP-сервер будет способен делать абсолютно все и ошибка, найденная в его коде, даст взломщику полный контроль над системой. И это из-за простой потребности слушать привилегированный порт.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;SELinux решает эти проблемы позволяя чрезвычайно гибко контролировать отношения процесса и операционной системы. С его помощью можно ограничить процесс в возможности обращения к тем или иным системным вызовам или файлам, контролировать то, как происходит системный вызов и какие при этом используются аргументы, запрещать или разрешать привзяку процесса к определенным портам, короче говоря, управлять возможностями процессов на самом низком уровне.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_как_это_работает"&gt;Как это работает?&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Здесь я должен начать рассуждать о таких вещах как дискреционный и мандатный контроль доступа, RBAC, MCS и других околонаучных вещах. Однако, мое объяснение будет другим.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Понять принцип работы SELinux и заложенные в него идеи проще всего разобравшись с тем, что происходит во время его активации. Что делает SELinux для того, чтобы контролировать обращения процессов к ресурсам ОС? Концептуально можно выделить четыре шага:&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;1 Все субъекты (процессы) и объекты (файлы, системные вызовы и т.д.) взаимодействия помечаются с помощью специальных меток, называемых контекстом безопасности (процессы во время запуска, файлы - во время создания или установки ОС ( их метки хранятся в расширенных атрибутах ФС), системные вызовы - при компиляции модуля SELinux).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;2 Когда субъект пытается произвести какое-либо действие в отношении объекта, информация об этом действии поступает к обработчику SELinux.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;3 Обработчик смотрит на контексты безопасности субъекта и объекта и, сверяясь с написанными ранее правилами (так называемая политика), принимает решение о дозволенности действия.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;4 Если действие оказывается правомочным (политика его разрешает), объект (программа) продолжает работать в обычном режиме, в противном случае он либо принудительно завершается, либо получает вежливый отказ.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В реальной ситуации все это выглядит примерно так: один из скриптов инициализации дистрибутива, имеющий метку initrc_t (на самом деле эту метку имеют порождаемые им процессы, но сейчас это не важно), запускает веб-сервер Apache с помощью файла /usr/sbin/httpd, который имеет метку httpd_exec_t. Как и все остальные действия, запрос на эту операцию поступает в SELinux, в правилах (политике) которого указано, что initrc_t не только имеет право запускать файл с меткой httpd_exec_t, но и то, что при запуске этого файла процесс и его потомки должны получить метку httpd_t. Теперь в системе появляется один или несколько процессов Apache, помеченных как httpd_t. Каждый из них будет подчинятся правилам SELinux, относящимся к этой метке, поэтому, если в политике указано, что httpd_t может получать доступ только к файлам, помеченным как httpd_sys_content_t и 80 порту, Apache не сможет нарушить эти правила (перевесив его на другой порт мы попросту получим ошибку запуска).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Откуда берутся правила? Их пишут люди, а точнее мантейнеры дистрибутивов, что тем не менее, не мешает системному администратору исправить их так, чтобы подогнать к своим потребностям. Обычно правила загружаются на первом этапе инициализации ОС, но с помощью особых приемов их можно подсунуть и в уже работающую систему (не перезагружать же сервер с аптаймом 1.5 года только для того, чтобы разрешить FTP-серверу ходить по симлинкам). Типичный объем файла политик SELinux для основных приложений и сервисов дистрибутива может содержать до нескольких сотен тысяч строк, поэтому, чтобы не обременять админов рутинной работой были созданы инструменты для их автоматической генерации с помощью обучения (например, утилита audit2allow позволяет составлять правила SELinux на основе лог-файлов подсистемы audit). В следующих разделах мы подробнее остановимся на этом вопросе, однако для начала нам следует разобраться с “политикой управления доступом на основе ролей”.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_управление_доступом_на_основе_ролей_или_rbac"&gt;Управление доступом на основе ролей или RBAC&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Само собой разумеется, что SELinux не смог бы так радовать военных, если бы в его основе лежали только метки, определяющие контекст безопасности, и механизм разделения доступа на их основе (кстати, это называется “мандатным управлением доступом” и многие ошибочно приписывают его SELinux). Из-за своей низкоуровневости такая система безопасности была бы слишком сложной в управлении и не гибкой, поэтому создатели SELinux снабдили ее еще одним уровнем доступа, именуемым “ролями”.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Когда мы говорили о метках SELinux, я намеренно упустил из виду одну важную деталь. На самом деле контекст безопасности (метка) состоит не из одного, а из трех компонентов (есть еще и четвертый компонент, но об этом пока не стоит задумываться): имени пользователя, роли и типа субъекта (тот самый компонент, который оканчивается на “_t”). Каждый пользователь SELinux (который может быть связан с учетной записью пользователя Linux, но обычно все Linux-пользователи отображаются в SELinux-пользователя unconfined_u) может выполнять несколько ролей, в рамках каждой из которых ему доступны несколько типов субъектов, а каждый субъект в свою очередь может иметь доступ к некоторому количеству объектов.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Как и группы пользователей в классической модели управления доступом UNIX, роли используются для наделения процессов пользователя разными видами полномочий. Однако, фактически они нужны только для того, чтобы тонко регулировать доступ пользователей к данным, то есть при сопровождении компьютерной инфраструктуры больших предприятий, сотрудники которых могут иметь разные уровни доступа к секретной информации (то есть те самые военные и госучреждения). При использовании SELinux на обычных серверах, роли не играют большой роли (парадокс, да и только).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Любой Linux-дистрибутив, из коробки оснащенный SELinux, по умолчанию использует так называемую “целевую политику”, которая предполагает наличие всего нескольких общих SELinux-пользователей и ролей. Например, целевая политика Fedora и RHEL определяет только двух дефолтовых пользователей (на самом деле есть еще несколько специальных пользователей, но обычно они не используются) и две роли: пользователь system_u, роль system_r и пользователь unconfined_u, роль unconfined_r. Первые используются для запуска системных процессов во время инициализации системы, и в политике четко указано, что запускаемые пользователем system_u, который имеет роль system_r, приложения должны получать конкретный тип субъекта (например, httpd_t), определяемый типом объекта (файла), из которого они запускаются (например, httpd_exec_t). В их отношении действуют строгие правила ограничения, о которых мы говорили в предыдущем разделе.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Пользователь unconfined_u и роль unconfined_r предназначены для обычных Linux-пользователей. На последнем этапе инициализации системы запускается менеджер входа в систему (он работает в домене system_u:system_r:login_t), который принимает имя пользователя и его пароль и запускает шелл/графическую оболочку. Однако, вместо того, чтобы сохранить текущий контекст безопасности, либо изменить его на system_u:system_r:shell_t в соответствии с правилами политики SELinux (если бы такие были), он обращается к PAM-модулю pam_selinux, который сообщает SELinux, что запущенный менеджером входа процесс (шелл или оболочка) должен получить контекст unconfined_u:unconfined_r:unconfined_t. Смысл этого перехода в том, что целевая политика SELinux имеет правила, которые разрешают приложениям, работающим в этом контексте делать что угодно, в том числе запускать другие приложения. Однако, если пользователь запустит приложение, в контексте безопасности которого указан SELinux-пользователь system_u и тип, для которого в политике есть правила, процессы этого приложения будут ограничены в правах точно также, как если бы они были запущены во время инициализации.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Если говорить о контексте безопасности файлов, то здесь роли не используются в принципе и второе поле &lt;strong&gt;всегда&lt;/strong&gt; равно object_r, а первое будет либо system_u, либо unconfined_u, если это файл, созданный пользователем.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Таким образом можно сказать, что при использовании целевой политики значимым полем контекста безопасности остается только тип субъекта/объекта, тогда как поля пользователь и роль просто определяют отношение SELinux к процессу (либо он находится под контролем правил, либо - нет).&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_работаем_с_системой"&gt;Работаем с системой&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Главное достоинство SELinux в том, что он абсолютно незаметен для многих администраторов и обычных пользователей. Приложения, для которых есть правила в политике, будут автоматически ограничены в правах, остальные программы смогут функционировать как ни в чем не бывало. Однако, время от времени сисадмины натыкаются на некоторые проблемы в работе системы, которые вынуждают их отключить SELinux. В этом разделе мы разберемся как решать эти проблемы в рамках возможностей SELinux, но сначала я дам несколько важных советов.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;1 SELinux должен быть включен. Глупо отключать SELinux только потому, что так рекомендуют делать многие сисадмины и пользователи. Работу штатных сервисов он нарушить не может, а если тебе нужно расширить возможности какого-либо приложения, это всегда можно сделать с помощью изменения мета-настроек или отключения проверок для определенного типа субъекта (позже я скажу как это сделать).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;2 ‘-Z’ твой друг. Да, вся эта возня с контекстами безопасности и всем остальным может вывести из себя. Но есть множество инструментов, которые позволяют выяснить текущий контекст безопасности процессов и файлов:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ id -Z
$ ps auxZ
$ ls -Z&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;найти файлы с нужным контекстом:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ find /etc -context '*net_conf_t'&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;восстановить правильный контекст файла:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# restorecon -v /usr/sbin/httpd&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;и даже узнать каким должен быть контекст файла и сравнить его с текущим:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# matchpathcon -V /var/www/html/*&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;3 Скажи mv нет. Во время установки дистрибутива все файлы получают определенный контекст безопасности, а все файлы, созданные в процессе работы - контекст безопасности, определяемый правилами на основе родительского каталога (например, если создать файл внтури каталога /etc, его тип автоматически станет etc_t, а для файлов каталога /var/www/html - httpd_sys_content_t). Однако это работает только в отношении вновь созданных файлов. Во время перемещения файла с помощью mv его контекст сохраняется, что может привести к отказу в доступе (например, Apache не сможет получить доступ к файлу, если его тип не httpd_sys_content_t).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;4 Маны наше все. В дистрибутивах Fedora и RHEL есть большое количество man-страниц, которые разъясняют все ограничения SELinux в отношении сервисов и демонов. Например, на странице httpd_selinux(8) описано в каком контексте безопасности работает Apache, какие у него есть полномочия и какие контексты должны иметь доступные ему файлы.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Теперь разберемся с тем, что нужно делать, когда SELinux начинает мешать. Обычно это происходит вследствие того, что админ пытается включить определенную функцию сервиса или как-то перенастроить его, а SELinux начинает сыпать на экран предупреждающие сообщения. Первое, что нужно сделать в этой ситуации, это проверить лог-файлы.
Главный журнальный файл SELinux носит имя /var/log/audit/audit.log. Туда поступают “необработанные” сообщения, которые могут быть полезны другим приложениям, но трудны в чтении человеком. Поэтому существует второе место, куда поступают те же сообщения, но в гораздо более понятном формате. Это файл /var/log/messages, в нем сообщения могут выглядеть так:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# grep "SELinux is preventing" /var/log/messages&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;May  7 18:55:56 localhost setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/index.html (home_dir_t). For complete SELinux messages. run sealert -l de7e30d6-5488-466d-a606-92c9f40d316d&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Здесь все должно быть понятно: SELinux запретил субъекту httpd_t (веб-сервер Apache) доступ к файлу /var/www/html/index.html на том основании, что тот имеет неправильный тип объекта (home_dir_t присваивается файлам, созданным в домашнем каталоге пользователя). Для получения более детальной информации SELinux рекомендует выполнить команду sealert -l бла-бла-бла. Эта команда выведет очень информативное сообщение, где будут описаны все обстоятельства произошедшего, причины, по котором они могли возникнуть, а также пути решения проблемы.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;В нашем случае причина проста: админ переместил файл index.html из своего домашнего каталога с помощью mv, выставил на него нужного владельца и права, но забыл изменить контекст. Выхода из ситуации два. Либо присвоить файлу правильный контекст с помощью команды chcon:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# chcon -t httpd_sys_content_t /var/www/html/index.html&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Либо заставить систему “сбросить” контекст всех файлов каталога:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# restorecon -v /var/www/html&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;После перезапуска Apache все должно быть Ok. Однако этот метод не сработает если мы захотим переместить корневой каталог Apache в другое место (например, в /www). Дело в том, chcon изменяет контекст только до следующего переиндексации с помощью restorecon, которая сбросит контекст файлов каталога /www до default_t (по правилам политики все каталоги, не имеющие родительского каталога, и их файлы получают такой тип). Поэтому мы должны изменить саму политику:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# semanage fcontext -a -t httpd_sys_content_t /www
# restorecon -v /www&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Первая команда изменит политику так, чтобы дефлтовым типом для каталога /www и его содержимого был httpd_sys_content_t, а вторая сбросит контекст его файлов, так что они получат тот же тип (правила SELinux допускают, чтобы дефолтовые метки каталогов и их содержимого отличались, но для удобства semanage делает их одинаковыми).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Также semanage может быть использована для просмотра списка мета-правил:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# semanage boolean -l&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;С помощью мета-правил можно контролировать такие аспекты работы приложений как, например, возможность веб-сервера подключаться к удаленной базе данных (httpd_can_network_connect_db) или разрешение ftp-сервера читать файлы домашнего каталога пользователей (ftp_home_dir) и т.д. Такие правила группируют в себе большое количество низкоуровневых правил, что существенно упрощает жизнь сисадмина.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Чтобы включить/отключить то или иное правило можно использовать команду setsebool:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# setsebool httpd_can_network_connect_db on
# setsebool httpd_can_network_connect_db off&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Указав флаг ‘-P’ можно сделать эти правила постоянными между перезагрузками. В самом крайнем случае semanage можно использовать для полного отключения проверок SELinux в отношении определенного субъекта:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# semanage permissive -a httpd_t&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Включение производится с помощью похожей команды:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# semanage permissive -d httpd_t&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_выводы"&gt;Выводы&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;SELinux далеко не так страшен, как о нем говорят. Система хоть и сложна в понимании, но невероятно логична и удобна в сопровождении, а имеющиеся средства управления позволяют очень точно диагностировать проблемы и легко их устранять.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_ограниченные_пользователи"&gt;Ограниченные пользователи&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Кроме SELinux-пользователя unconfined_u, который по дефолту присваивается всем юзерам системы, в целевой политике также описано несколько непривилегированных пользователей, которых можно использовать для создания гостевых учетных записей, процессы которых будут очень ограничены в правах (возможности и различия этих пользователей смотри в таблице “Дефолтовые пользователи SELinux”).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Чтобы создать такого пользователя достаточно выполнить следующую команду:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# useradd -Z xguest_u имя_юзера&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Кроме этого можно сделать его дефолтовым, так что ограниченными будут все вновь созданные Linux-юзеры:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# semanage login -m -S targeted -s "xguest_u" -r s0 __default__&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Посмотреть список текущих SELinux-юзеров можно так:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# /usr/sbin/semanage login -l&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt; Еще один способ отключить SELinux для приложения:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# chcon -t unconfined_exec_t /usr/sbin/httpd&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Статья написана для журнала Хакер.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Хотите купить &lt;a href="http://prophotos.ru/devices/canon-eos-600d"&gt;canon eos 600d&lt;/a&gt;? Интернет-магазин prophotos.ru к вашим услугам. Здесь вы сможете найти нужный вам фотоаппарат, подобрать объектив и аксессуары, ознакомиться с отзывами и результатами тестов. Все в одном месте.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=KMSWDj4VCX0:F8ODuzP4KSs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=KMSWDj4VCX0:F8ODuzP4KSs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=KMSWDj4VCX0:F8ODuzP4KSs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/KMSWDj4VCX0" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2011/10/25/selinux/</feedburner:origLink></entry><entry><title>RIP Dennis
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/_08FfwNfnvM/" rel="alternate" /><updated>2011-10-13T15:56:10+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2011/10/13/rip_dennis/</id><link length="100000" href="http://execbit.ru/uploads/dennis_ritchie.jpg" type="image/jpeg" rel="enclosure" /><content type="html">&lt;p&gt;Дэнис Ритчи, стоявший у истоков UNIX и языка Си умер в минувшие выходные. Об этом &lt;a href="https://plus.google.com/101960720994009339267/posts/ENuEDDYfvKP?hl=en"&gt;сообщил&lt;/a&gt; Роб Пайк на своей странице в Google+.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=_08FfwNfnvM:wHKySDdEgLk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=_08FfwNfnvM:wHKySDdEgLk:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=_08FfwNfnvM:wHKySDdEgLk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/_08FfwNfnvM" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2011/10/13/rip_dennis/</feedburner:origLink></entry><entry><title>Эмуляция Linux во FreeBSD
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/CSzIlVDORfU/" rel="alternate" /><updated>2011-10-11T17:03:59+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2011/10/11/bsd-linux-emu/</id><link length="100000" href="http://execbit.ru/uploads/bsd-linux.jpg" type="image/jpeg" rel="enclosure" /><category term="десктоп" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Несмотря на популярность и применимость в самых различных сферах, FreeBSD все же уступает Linux в одном немаловажном отношении - доступности программного обеспечения. Разработчики коммерческого ПО неохотно портируют свои продукты для FreeBSD, останавливаясь на ее гораздо более популярном конкуренте. К счастью, выход есть - эмуляция Linux ABI.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Настройку двоичной совместимости с Linux условно можно разделить на два этапа. Первый - это конфигурирование ядра таким образом, чтобы научить его правильно обрабатывать исполняемые файлы, собранные для Linux. А второй - установка Linux-окружения, в котором эти файлы смогут корректно исполняться.&lt;/p&gt;&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_пространство_ядра"&gt;Пространство ядра&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Для того чтобы научить ядро FreeBSD понимать исполняемые файлы Linux, достаточно подгрузить модуль linux.ko (kldload linux), содержащий все необходимые обработчики и альтернативную таблицу системных вызовов. После этого операционная система будет готова к принятию "чужого" кода. Для закрепления результата следует добавить строку linux_load="YES" в /boot/loader.conf (загрузка одновременно с ядром), либо linux_enable="YES" в /etc/rc.conf (загрузка во время инициализации системы).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Поклонники монолитной модели ядра могут избежать необходимости ручной загрузки модуля, просто включив код совместимости в ядро. Конфигурационный файл ядра должен содержать следующие строки:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;option COMPAT_LINUX
option PSEUDOFS
option LINPROCFS
option LINSYSFS&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Если сборка будет происходить для архитектуры amd64, то вместо COMPAT_LINUX следует указать строку COMPAT_LINUX32. Последние две строки указывают на то, что код Linux-реализаций файловых систем proc и sys также должен быть включен в ядро. Делать это не обязательно, каждая из них может быть собрана модулем.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;На этом настройка ядра заканчивается, и мы переходим к конфигурированию Linux-окружения.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sect2"&gt;
&lt;h3 id="_пространство_пользователя"&gt;Пространство пользователя&lt;/h3&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Исполнение бинарных файлов Linux происходит в изолированном окружении, которое располагается в каталоге /compat/linux. Чтобы программы могли работать в таком окружении, им требуется доступ ко всем необходимым библиотекам, конфигурационным файлам и специальным файлам, вроде тех, что находятся в каталоге /proc. Есть несколько способов обеспечить наличие этих файлов, но самый простой - установка из портов.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Существует несколько портов, разворачивающих окружение времени исполнения различных дистрибутивов Linux. В современных версиях FreeBSD средой исполнения по умолчанию является набор пакетов из дистрибутива Fedora Core 10 (emulators/linux_base-f10), также доступны коллекции пакетов из дистрибутива Gentoo (linux_base-gentoo-stage3). По большому счету неважно, какой из них использовать. Необходимость в переключении на окружение другого дистрибутива может возникнуть только в случае, если программа откажется работать в среде, установленной в данный момент.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Установить Linux-окружение также просто как и любую программу:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# cd /usr/ports/emulators/linux_base-fc4
# make install clean&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;После этого каталог /compat/linux превратится в локальную версию дистрибутива Linux. Далее необходимо обеспечить доступ к виртуальным файловым системам, иначе некоторые Linux-софтины откажутся работать. Открываем файл /etc/fstab и добавляем в него следующие строки:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;none /compat/linux/proc linprocfs rw 0 0
none /compat/linux/sys linsysfs rw 0 0
none /compat/linux/dev devfs rw 0 0&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Обратите внимание, что последняя строка монтирует родную devfs FreeBSD в Linux-окружение. Нужно это для работы звука через OSS, интерфейс которого одинаков во FreeBSD и Linux.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;После того как операция по модификации файла /etc/fstab будет закончена, набираем «mount –a», чтобы изменения вступили в силу. Это все, теперь внутри FreeBSD есть самый настоящий Linux. В него даже можно войти, набрав от имени суперпользователя следующую команду:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;# chroot /compat/linux /bin/bash&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Linux-софт теперь должен запускаться и корректно работать. Это относится не только к простым программам, вроде xcalc, но и к гораздо более комплексным приложениям: Quake4, UT2004, Adobe Flash Plugin. Среда гарантирует, что программа будет работать с такой скоростью, как если бы она была запущена в настоящем Linux.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;На закуску: список Linux-специфичных портов:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;emulators/linux-ePSXe
sysutils/linux-nero
emulators/linux-vmware-toolbox6
games/linux-americasarmy
games/linux-darwinia-demo
games/linux-doom3
games/linux-enemyterritory
games/linux-gorky17-demo
games/linux-majesty-demo
games/linux-quake3
games/linux-quake4
games/linux-savage
games/linux-steam
games/linux-unrealgold
games/linux-ut
games/linux-ut2003-demo
games/linux-ut2004-demo
games/linux-worldofgoo-demo
multimedia/linux-realplayer
www/linux-f10-flashplugin10&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Кстати, окружение Linux можно не устанавливать, а просто примонтировать файловую систему установленного на соседнем резделе Linux-дистрибутива.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Статья написана для журнала Хакер.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=CSzIlVDORfU:Fqu1yw25ag4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=CSzIlVDORfU:Fqu1yw25ag4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=CSzIlVDORfU:Fqu1yw25ag4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/CSzIlVDORfU" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2011/10/11/bsd-linux-emu/</feedburner:origLink></entry><entry><title>CDE или портабельные приложения 2
</title><link href="http://feedproxy.google.com/~r/execbit/last/~3/t0W36tIoFpY/" rel="alternate" /><updated>2011-09-27T13:03:04+00:00</updated><author><name>zobnin</name><email>zobnin@gmail.com</email><uri>http://execbit.ru/authors/zobnin/</uri></author><id>http://execbit.ru/2011/09/27/cde/</id><link length="100000" href="http://execbit.ru/uploads/cde.png" type="image/jpeg" rel="enclosure" /><category term="полезности" /><content type="html">&lt;div class="paragraph"&gt;&lt;p&gt;&lt;em&gt;Некоторое время назад я писал об &lt;a href="http://execbit.ru/2011/04/06/portableapps/"&gt;AppImage&lt;/a&gt;, системе упаковки Linux-приложений в самодостаточные исполняемые пакеты, которые могут работать в любом Linux-дистрибутиве, независимо от его версии и набора установленных в систему пакетов. К сожалению AppImage оказалась не столь хороша, как о ней говорили создатели, поэтому я пометил проект как мертворожденный и благополучно забыл. Сегодня я хочу вернуться к обсуждению идеи портабельных приложений, но вооружившись по-настоящему хорошим инструментом под названием &lt;strong&gt;CDE&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;&lt;a href="http://stanford.edu/~pgbovine/cde.html"&gt;&lt;strong&gt;CDE&lt;/strong&gt;&lt;/a&gt; (Code, Data, and Environment) отличается от AppImage в первую очередь тем, что использует совершенно иной подход к сборке этих самых портабельных приложений. Если инструментарий, предназначенный для создания AppImage был простым (и плохо написанным) скриптом, который просто перегонял Deb-пакеты в запускаемые ISO-образы (да, именно так), которые включали в себя все файлы программы, а также файлы всех его зависимостей, перечисленных в манифесте пакета, то инструмент сборки CDE-пакетов - это программа, которая анализирует приложение прямо во время его исполнения и помещает в пакет любые файлы, к которым оно обращалось (сделано это с помощью банального ptrace).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Преимущество такого подхода в том, что он делает &lt;strong&gt;CDE&lt;/strong&gt; по-настоящему полезным инструментом, а не безделушкой из разряда "proof of concept", которым по сути и был AppImage. Например, я хочу держать на флешке набор своих любимых приложений, да так чтобы они работали абсолютно также как на моем десктопе и имели те же настройки. Применив AppImage мне бы потребовалось еще долго пилить получившееся пакеты, чтобы добавить в них все мои настройки и файлы. Вручную это сделать было бы гораздо труднее. Но если я воспользуюсь CDE, все что мне понадобиться сделать, это просто запустить каждую программу под управлением этого инструмента и положить получившийся каталог на флешку:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ cde chromium&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Откроется окно Chromium, которое можно со спокойной душой тут же закрыть. Во время запуска приложения &lt;strong&gt;CDE&lt;/strong&gt; проанализирует зависимости программы, соберет их в одном месте в каталоге cde-package и создаст скрипт, подготавливающий максимально приближенное к оригиналу окружение (включая все переменные окружения).&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Теперь я просто копирую каталог &lt;strong&gt;cde-package&lt;/strong&gt; на флешку:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ cp -R cde-package /media/флешка&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Беру ее с собой, вставляю в другой компьютер и спокойно запускаю:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ /media/флешка/cde-package/chromium.cde&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Кстати, сам &lt;strong&gt;CDE&lt;/strong&gt; тоже самодостаточная программа, установить которую очень просто:&lt;/p&gt;&lt;/div&gt;
&lt;div class="listingblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ wget https://github.com/downloads/pgbovine/CDE/cde_2011-08-15_32bit -O cde
$ chmod +x cde&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Для установки 64-битной сборки достаточно заменить &lt;strong&gt;32bit&lt;/strong&gt; на &lt;strong&gt;64bit&lt;/strong&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;div class="paragraph"&gt;&lt;p&gt;Все подготовленные с помощью этого инструмента приложения можно запустить в любом более или менее свежем линуксе, а после небольшого трюка с переменной окружения LD_ASSUME_KERNEL программа заработает даже в очень древнем дистрибутиве:&lt;/p&gt;&lt;/div&gt;
&lt;div class="literalblock"&gt;
&lt;div class="content"&gt;
&lt;pre&gt;&lt;tt&gt;$ export LD_ASSUME_KERNEL=2.4.1
$ cde-package/приложение.cde&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Ищете выгодный способ обмена  &lt;a href="http://www.bestchange.ru/wmz-to-paxum.html"&gt;WebMoney - Paxum&lt;/a&gt;? Тогда сервис мониторинга обменников BestChange.ru то, что вам нужно.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=t0W36tIoFpY:BywTyVjCGkw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=t0W36tIoFpY:BywTyVjCGkw:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/execbit/last?a=t0W36tIoFpY:BywTyVjCGkw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/execbit/last?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/execbit/last/~4/t0W36tIoFpY" height="1" width="1"/&gt;</content><feedburner:origLink>http://execbit.ru/2011/09/27/cde/</feedburner:origLink></entry></feed>

