2015-01-29

Проект Mozilla экспериментирует с развёртыванием узлов Tor

В рамках инициативы Polaris, нацеленной на развитие средств для сохранения частной жизни пользователей, проект Mozilla ввёл в строй 12 собственных узлов анонимной сети Tor. Запущенные узлы являются первым шагом на пути к созданию высокопроизводительной фермы узлов Tor, поддерживаемых силами Mozilla и нацеленных на повышение пропускной способности сети Tor в свете будущего роста числа пользователей, ожидаемого в случае интеграции поддержи Tor в Firefox. Узлы запущены на отдельном оборудовании и не пересекаются с серверной инфраструктурой, обеспечивающей поддержание продуктов Mozilla. Для выхода Tor-узлов в глобальную сеть выделено два канала с пропускной способностью 10Gbps.

souece1
source2

2015-01-28

втопку debian

Я в принципе нормально относился к дебиану но когда надо было, что то  новомодное то привык использовать убунту. Но это меня поразило:
man manman: can't execute /usr/bin/less: Нет такого файла или каталога
man: команда завершилась с кодом 255: LESS=-ix8RmPm Manual page man(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for help or q to quit)$PM Manual page man(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for help or q to quit)$ MAN_PN=man(1) /usr/bin/less

Поождите как нету less ? этого не может быть!
whereis less
less:
Вот это да... А если попробовать установить?
apt-get install less
Чтение списков пакетов… Готово
Построение дерева зависимостей      
Чтение информации о состоянии… Готово
НОВЫЕ пакеты, которые будут установлены:
  less
обновлено 0, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 135 kБ архивов.
После данной операции, объём занятого дискового пространства возрастёт на 293 kB.
Получено:1 http://ftp.ru.debian.org/debian/ wheezy/main less amd64 444-4 [135 kB]
Получено 135 kБ за 0с (619 kБ/c)
Выбор ранее не выбранного пакета less.
(Чтение базы данных … на данный момент установлен 24521 файл и каталог.)
Распаковывается пакет less (из файла …/archives/less_444-4_amd64.deb) …
Обрабатываются триггеры для man-db …
Обрабатываются триггеры для mime-support …
Настраивается пакет less (444-4) …

А-фи-геть! В дебиане есть первобытный more и нету less, фтопку дебиан если мне каждый пакет надо ставить.
PS  Если мне надо минимализм я возьму OpenBSD или тот же Ubuntu minimal!

2015-01-26

Разработчики GNOME развивают систему контейнеров для запуска графических приложений

Маттиас Класен (Matthias Clasen), лидер Fedora Desktop Team и участник GNOME Release Team, рассказал о состоянии разработки механизма поставки программ для GNOME в форме изолированных контейнеров, включающих все необходимые для работы приложения зависимости и не привязанных к конкретному дистрибутиву Linux. Подобные контейнеры позволят упростить распространение сторонних программ, не входящих в штатные репозитории дистрибутивов, за счет подготовки одного универсального контейнера без формирования отдельных сборок для каждого дистрибутива. Конечному пользователю установка подобных контейнеров даст гарантию, что приложение будет надёжно отделено от основной системы, а также позволит не нагромождать систему дополнительными зависимостями и пакетами.

Сообщается, что проект достиг состояния, пригодного для проведения экспериментов энтузиастами. Для изоляции приложения используются традиционные для Linux технологии контейнерной виртуализации, основанные на использовании cgroups, пространств имён (namespaces) и SELinux. Для взаимодействия со внешней средой используется система обмена сообщениями kdbus. Вывод графики и организация ввода осуществляется при помощи протокола Wayland (X11 не поддерживается).

Окружение в котором работает приложение формируется из типового системного runtime-окружения и связанных с приложением дополнительных зависимостей (bundle). В сумме runtime и bundle образуют начинку контейнера. Для использования в одной системе может быть установлено несколько разных runtime (GNOME 3.14, KDE 5.6) или несколько версий одного runtime (GNOME 3.14, GNOME 3.16), в зависимости от требований используемых программ. При этом bundle c программой в качестве зависимости использует только привязку к определённому runtime, без учета отдельных пакетов, из которых состоит runtime. Все недостающие элементы упаковываются непосредственно вместе с приложением в bundle.

При формировании контейнера содержимое runtime монтируется как раздел /usr, а bundle монтируется в директорию /self. Для разработчиков приложений предлагается расширенный sdk runtime, который выступает в роли аналога SDK и включает помимо файлов, используемых для запуска программы, компоненты, требуемые для сборки приложения. Командой "xdg-app run" осуществляется формирование контейнера и запуск программы, а командой "xdg-app build" выполняется создание контейнера для сборки программы.

Распространение runtime и приложений, а также обновлений, производится с использованием технологии OSTree, при которой образ атомарно обновляется из Git-подобного хранилища, позволяющего применять методы версионного контроля к компонентам дистрибутива (например, можно быстро откатить систему к прошлому состоянию). RPM-пакеты транслируются в репозиторий OSTree при помощи специальной прослойки rpm-ostree. Отдельная установка и обновление пакетов внутри рабочего окружения не поддерживается, система обновляется не на уровне отдельных компонентов, а целиком, атомарно меняя своё состояние. Предоставляются средства для инкрементального применения обновлений, избавляющие от необходимости полной замены образа при каждом обновлении. В настоящее время уже запущен репозиторий с несколькими экспериментальными приложениями и подготовлен runtime на основе Yocto Linux и GNOME 3.15.

source1
source2

2015-01-23

mdadm — утилита для управления программными RAID массивами в Linux (Linux Software Raid), ранее известная, как mdctl. MD — сокращение от Multiple Devices

 В Linux можно использовать следующие разновидности RAID:
  • LINEAR (JBOD) — расширение размера логического диска за счет нескольких физических дисков;
  • RAID0 (striping) — распределение блоков на нескольких физических дисках для повышения скоростей записи и чтения, но без обеспечения отказоустойчивости;
  • RAID1 (mirroring) — зеркалирование, то есть запись одних и тех же данных одновременно на несколько дисков, что обеспечивает отказоустойчивость при выходе из строя любого количества дисков, пока остаётся хотя бы один работоспособный;
  • RAID4 — RAID 4 похож на RAID 3, но отличается от него тем, что данные разбиваются на блоки, а не на байты;
  • RAID5 — массив с обеспечением отказоустойчивости за счет минимальной избыточности (требуется минимум три диска);
  • RAID6 — похож на RAID 5, но имеет более высокую степень надежности — под контрольные суммы выделяется емкость 2-х дисков, рассчитываются 2 суммы по разным алгоритмам;
  • MULTIPATH — не RAID-массив, позволяющий создавать разные псевдо-дисковые устройства для одного физического диска;
  • FAULTY — псевдо RAID-массив.
Не все разновидности RAID-массивов доступны в ядре Linux в начальной конфигурации. Например, чтобы использовать RAID5 необходимо внести изменения в конфигурацию ядра и скомпилировать его заново. Для уже скомпилированных ядер из дистрибутивов, возможно потребуется явная загрузка соответствующего модуля. Пример: modprobe raid5.

Информацию о состоянии активных массивов можно просмотреть в псевдо-файле /proc/mdstatПросмотр состояния массивов

cat /proc/mdstat
Personalities : [raid0] [raid1]
md3 : active raid0 sdb4[1] sda4[0]
581006592 blocks 64k chunks

md1 : active raid1 sdb1[1] sda1[0]
88256 blocks [2/2] [UU]

Команды

С помощью mdadm можно выполнять 7 групп операций:
  • Create — создание RAID-массива из нескольких дисков (с суперблоком на каждом устройстве).
  • Assemble — сборка (ранее созданного) массива и его активация. Диски из которых собирается массив могут указываться явно или будет выполнен их автоматический поиск. mdadm проверяет, образуют ли компоненты корректный массив.
  • Build  — объединение дисков в массив (без суперблоков). Для таких массивов mdadm не различает создание и последующую сборку. Также невозможно проверить, были ли указаны необходимые устройства в верном порядке. Не используйте этот режим, если вы не знаете зачем это нужно.
  • Manage — Управление массивом: добавление новых свободных дисков (spares) и удаление неработоспособных (faulty devices).
  • Follow/Monitor — Следить за одним или несколькими md-устройствами и реагировать на изменение их состояния. Это имеет смысл только для массивов уровней 1, 4, 5, 6 или multipath-массивов, так так только они могут иметь различные состояния. raid0 или linear не могут иметь недостающих, запасных или сбойных дисков, поэтому там не за чем следить.
  • Grow — расширение или уменьшение размера (shrink) массива, либо иное его реформирование (reshape). На данный момент поддерживается изменение активного размера компонентов в RAID-массивах уровней 1/4/5/6, а также изменение количества активных устройств в RAID1.
  • Misc  — прочие операции с независимыми дисками. Например: просмотр и модификация суперблоков массива и остановка активных массивов.

Получение информации о RAID-диске и его разделах

Для определения того, является ли устройство массивом или его частью, можно использовать утилиту mdadm с ключом -Q (--query). Указанные в этом разделе операции относятся к группе прочих, но указывать ключ (--misc) не обязательно. Ключ -Q также можно не указывать — если в параметрах mdadm указано только дисковое устройства, то этот ключ подразумеается по умолчанию. В примере ниже проверяются три устройства:
  • обычный раздел (не часть массива):
mdadm -Q /dev/sde3
mdadm: /dev/sde3 does not appear to be an md device
  • раздел, являющийся частью массива:
mdadm -Q /dev/sdb1
/dev/sdb1: device 0 in 3 device active raid5 /dev/md0.  Use mdadm --examine for more detail.
  • раздел диска, снятого с другого компьютера, где он был частью массива:
mdadm -Q /dev/sde2
/dev/sde2: is not an md array
/dev/sde2: device 6 in 8 device undetected raid5 /dev/md2.  Use mdadm --examine for more detail.
  • массив целиком
mdadm -Q /dev/md0
/dev/md0: 467.51GiB raid5 3 devices, 0 spares. Use mdadm --detail for more detail.
Более подробную информацию о массиве в целом или его части можно получить используя соответственно ключи -D (--detail) и -E (--examine). В обоих случаях выводится почти одинаковая информация, но с ключом -D нужно указывать имя массива, а с ключом -E указывается имя одного из разделов RAID-диска. Причем, массив должен быть запущен, а для раздела это не важно — главное, чтобы он был частью хоть какого-либо массива.
mdadm -D /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Tue Jan 22 20:41:09 2008
     Raid Level : raid5
     Array Size : 490223232 (467.51 GiB 501.99 GB)
  Used Dev Size : 245111616 (233.76 GiB 250.99 GB)
   Raid Devices : 3
  Total Devices : 3
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Tue Mar 25 10:52:30 2008
          State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 64K

           UUID : 3d40658b:58e8e3bb:f2dc72f0:8ce9d084
         Events : 0.12

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1

Создание массива

Перед созданием массива следует создать для него устройство-идентификатор (если оно отсутствует): mknod /dev/md1 b 9 1; в данном случае создаётся идентификтор для массива с номером 1, что указывается в имени устройства и его коде (9 — это код устройства всех RAID-массивов, 1 — идентификатор).
Желательно, чтобы разделы, из которых создаётся массив, имели одинаковый размер (хотя они могут располагаться на физических дисках разного размера и даже разного типа). При создании этих разделов следует присвоить им тип fd («Linux raid autodetect»). Не следует создавать массив из разделов, размещающихся на одном физическом диске — хотя это и возможно, это совершенно бессмысленно и приведет к существенному снижению быстродействия дисковой подсистемы. Интересной идеей является создание массива из USB-флеш дисков с целью повышения скорости, но из-за низкой надёжности USB портов система будет менее надёжна, чем массив из жёстких дисков.
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/hda3 /dev/hdc3
Этот пример создаёт массив RAID 1 из двух разделов: один из hda и второй из hdc. Несколько дисков можно указывать с помощью шаблона, например /dev/sd[ac]2 или /dev/sd[a-f]1.
  • --create (или сокращённо ): команда создания
  • /dev/md0: имя устройства создаваемого виртуального раздела
  • --level=1 (или сокращённо -l 1): уровень RAID. См. справочник по использованию mdadm (используйте «man mdadm» в командной строке)
  • --raid-devices=2 (или сокращённо -n 2): количество устройств
  • /dev/hda3: первый диск в массиве
  • /dev/hdc3: второй диск
Если на момент создания массива диска нет (например, при переходе на RAID) вместо имени диска просто напишите missing. Команда завершается сразу, обычно выдавая сообщение mdadm: array /dev/mdХ started. При этом уже сразу можно использовать массив. Фактически массив строится в фоновом режиме, прогресс можно посмотреть в файле /proc/mdstat; там же указывается предположительное время завершения построения массива.
После создания RAID-раздела можно создать на нем файловую систему как на обычном разделе диска. Созданный и отформатированный RAID-раздел можно использовать как корень файловой системы (но для этого поддержка RAID должна быть встроена в ядро, а не как загружаемый модуль). Не следует создавать RAID-массив для своп-раздела — система сама обнаружит своп-разделы на разных дисках и будет использовать их по принципу RAID-массива. Не забудьтедобавить соответствующую строку в файл конфигурации /etc/fstab, чтобы RAID-раздел монтировался автоматически при загрузке системы.
Примечание: При создании raid-массива первого уровня (зеркала) с целью повышения отказоустойчивости системы рекомендуется разделы swap также объединять в массив. При использовании swap-разделов вне raid при отказе одного диска может случиться крах системы (если на поломавшийся диск была выгружена часть страниц памяти). При объединении в raid-массив разделов swap такого не произойдет, т.к. выгружаемая страница будет присутствовать на обоих дисках. Часто используемое разбиение

Расширение массива (добавление и замена дисков)

mdadm /dev/md0 --add /dev/hdd3
Эта команда добавляет новый «диск» (а вернее раздел) в массив md0. Добавленный диск считается пустым и резервным. Его можно использовать для расширения размера массива или он будет автоматически использован (в массивах, обеспечивающих отказоустойчивость) в качестве замены для вышедшего из строя диска.
Для расширения размера массива (если конечно тип массива допускает расширение) указывается ключ -G (--grow) и новое число дисков массива с помощью ключа -nX (--raid-devices=X).
mdadm -G /dev/md0 -n4 
Процесс реструктурирования массива выполняется в фоновом режиме и обычно занимает много часов. Наблюдать за ходом процесса можно просматривая файл /proc/mdstat. В принципе можно расширять и смонтированные массивы — это не опасно, но это увеличивает время реструктуризации. По умолчанию, скорость реструктуризации ограничена, но ее можно изменить
cat /proc/sys/dev/raid/speed_limit_m*
200000
1000
echo 10000 >/proc/sys/dev/raid/speed_limit_min
Расширение массива не увеличивает автоматически размер файловой системы на ней находящийся. Поэтому затем нужно расширить файловую систему явно. Для того чтобы удостовериться, что расширение произошло без ошибок можно проверить целостность файловой системы.

Удаление массива

Останавливаем массив.
mdadm -S /dev/md0
Очищаем суперблоки RAID на разделах, из которых собран массив.
mdadm --zero-superblock /dev/sd[a-e]1

Файл конфигурации mdadm.conf

Иногда требуется вручную добавлять информацию в файл mdadm.conf. Взять ее можно, выполнив команду
mdadm --detail --scan
В результате нам будет выведена информация вида:
ARRAY /dev/md/0 metadata=1.2 name=server:0 UUID=74c51786:16bbb1af:469a4f42:76ec9654
ARRAY /dev/md/1 metadata=1.2 name=server:1 UUID=6c65a539:36d0f116:b1194783:fc35d949
ARRAY /dev/md/2 metadata=1.2 name=server:2 UUID=55c01664:2cc1aa5b:5257948b:a7ea760c
ARRAY /dev/md/3 metadata=1.2 name=server:3 UUID=cf13c857:59adbacc:165c987e:d7c7f8a1
Её и добавляем в файл mdadm.conf

Известные проблемы

1. Частая ошибка при создании RAID устройств заключается в том, что mdraid-driver берет управление над всеми устройствами, которые должны были использоваться в новом RAID устройстве. Будет выдано сообщение об ошибке такого вида:
mdadm: Cannot open /dev/sdb1: Device or resource busy
Чтобы решить эту проблему, вы должны собрать новый образ initrd(initramfs) без dmraid-driver. Пример для ядра «2.6.18-8.1.6.el5»-kernel:
mkinitrd --without-dmraid /boot/NO_DMRAID_initrd-2.6.18-8.1.6.el5.img 2.6.18-8.1.6.el5
После этого, система должна быть перезагружена с новым initrd(initramfs). Отредактируйте ваш /boot/grub/grub.conf чтобы указать новый initrd(initramfs).
2. Если один из компонентов массива переходит в статус «Failed», то обычно помогает его ручное удаление из массива, а затем – добавление заново. Например:
mdadm --manage /dev/md1 --remove /dev/sdd1
mdadm --manage /dev/md1 --add /dev/sdd1
При повторении этой ситуации следует проверить дисковый накопитель на исправность.

2015-01-22

UPS Windows 2008

Ужа давно т.к. это перенос блога :D
"Недавно" подключал UPS к серверу с windows 2008 r2 и обнаружил интересный факт.
При подключении упса выяснилось, что никакого дополнительного софта не надо., а виндавоз его определил как аккумулятор у ноутбука ;)

Как изменить язык по умолчанию при загрузке ОС

Для смены дефолтного языка при входе нам надо проделать следующее:
«Пуск» → «Панель управления» → «Часы, язык и регион»

Выбрать вкладку «Дополнительно»
Затем тыцнуть в кнопку «Копировать параметры»

В открывшемся окне выбрать «экран приветствия и системные учётные записи»
После чего тыцнуть кнопку «Ok»
Готово! ;-)
также доступно здесь: wiki.dtulyakov.ru

Al Capone

Отмечал свой день рождения в кафе Al Capone Пр. Победы 72
не удержался, что бы не клацнуть главную достопримечательность этого кафе ;






QR-код чтение и создание

QR-код (Quick Response - быстрый отклик) - матричный код (двухмерный штрих код), разработанный и представленный японской компанией «Denso-Wave» в 1994 году.
Рассмотрим варианты для Ubuntu
zbar-tools консольная утилита для считывания
$zbarimg для файлов или url ссылок
$zbarcam для устройства видеозахвата (камеры)
qrencode консольная утилита для считывания и создания
$ qrencode -o [filename.png] '[text/url/information to encode]'
$ qrencode -o google.png 'http://www.google.com'
$ qrencode -o ~/Desktop/google.png -s 6 'http://www.google.com'
qreator ГУИ утилита для создания
Варианты:
  • URL - Генерация кода с ссылкой
  • Text - Генерация кода с любым текстом
  • Geolocation - Ваше местонахождение в QR-коде (только у меня почему-то не загрузилась карта)
  • WiFi Network - Генерация кода с данными о Wi-Fi
sudo add-apt-repository ppa:dpm/ppa
sudo apt-get update
sudo apt-get install qreator

TCP tuning

Рекомендованные настройки для /etc/sysctl.conf (часть из них – по умолчанию, но приводится для тех, кто по каким-либо причинам внес изменения вручную):
# set to at least 16MB
kern.ipc.maxsockbuf=16777216
# set autotuning maximum to at least 16MB too
net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.recvbuf_max=16777216
# enable send/recv autotuning
net.inet.tcp.sendbuf_auto=1
net.inet.tcp.recvbuf_auto=1
# increase autotuning step size
net.inet.tcp.sendbuf_inc=16384
net.inet.tcp.recvbuf_inc=524288
# turn off inflight limitting
net.inet.tcp.inflight.enable=0
# set this on test/measurement hosts
net.inet.tcp.hostcache.expire=1
Начиная с FreeBSD 8.2 можем включить H-TCP:
net.inet.tcp.cc.default.algo=htcp
По умолчанию параметр inflight limiting включен, что хорошо для модемной связи, но может приводит к ухудшению связи в ряде случаев при высокоскоростном соединении. Поэтому выключаем. По умолчанию FreeBSD кэширует соединения в течение одного часа, что хорошо для web-сервера, но в других случаях приводит к снижению производительности канала. Поэтому, если у нас не web-сервер, приводим hostcache.expire к значению 1, что назначает время кэширования в 5 минут. Более подробно здесь.

Unicode

Таблица наиболее востребованных символов Unicode

Как будет выглядеть Код Unicode
€
▲
►
▼
◄
■
□
▣
▤
▥
▦
▧
▨
▩
▪
▫
◊
○
●
☺
☻
☼
♀
♂
♠
♤
♣
♧
♥
♡
♦
★
☆
⌂
№
☎
☏
♨
☜
☞
♩
♪
♫
♬
♭
†
‡
←
↑
→
↓
↔
↕
↖
↗
↘
↙
§ §
« «
» »
© ©
® ®
™

кнопки в социальных сетях

Ограничить доступ ко всему сайту

С помощью .htaccess можно управлять доступом ко всему сайту. К примеру, если сайт еще в разработке, но его нужно показывать заказчику, да и самому иметь возможность тестировать его на реальном сервере.
<Limit GET POST PUT>
Order deny,allow
Deny from all
Allow from 192.168.1.1
Allow from 172.16.1.1
</Limit>

Ограничение доступа

С помощью файла .htaccess можно управлять доступом к ресурсам сервера.
Для этого ограничения используются директивы Order, Allowи Deny

Директива Order

Устатавливает порядок работы директив Denyи Allow
Order порядок
Где порядок может принимать значения Deny,Allowили Allow,Deny. По умолчанию:
Order Deny, Allow

Директива Deny

Запрещает доступ определенных клиентов к ресурсам.
Deny from all|host
Где hostможет принимать значения IP адреса или имени хоста.

Директива Allow

В отличие от Denyразрешает доступ определенных клиентов к ресурсам.
Allow from all|host
hostможет принимать значения IP адреса или имени хоста.

Примеры использовани директив Order, Allow, Deny

Запретить доступ для всех:
Order deny,allow Deny from all
Разрешить доступ для определенных адресов:
Order deny,allow
Deny from all
Allow from 192.168.1.1
Allow from 172.16.1.1
Запретить доступ с определенных адресов:
Order allow, deny
Allow from all
Deny from 192.168.1.1
Deny from 172.16.1.1

Защита файлов от скачивания

С помощью .htaccess можно управлять доступом к файлам сервера.
Например, так можно полностью запретить доступ к файлу .htaccess:
# Закрываем доступ к .htaccess
<Files .htaccess>
Order deny, allow
Deny from all
</Files>
Также можно разрешать или запрещать доступ к файлам с определенных IP-адресов. Например:
# Открыть доступ для определенного IP
<Files config.inc>
Order deny, allow
Deny from all
Allow from 192.168.1.1 </Files>
# Закрываем доступ с определенного IP
<Files config.inc>
Order allow, deny
Allof from all
Deny from 192.168.1.1 </Files>

Тюнинг FreeBSD 7-8 (sysctl, loader.conf)

Предупреждение: Бездумное копирование опций не всегда приводит к приросту производительности!!!
/etc/sysctl.conf
###### Формат записей " параметр=значение # значение по умолчанию "
NETWORK
Запрет ответа при обращении на закрытые порты.
По стандарту, если на закрытый порт сервера приходит SYN-пакет, машина должна ответить RST-пакетом. Это упрощает сканирование портов, а также дает достаточное количество информации (в виде ответов от сканируемого сервера) для определения версии ОС. "Черные дыры" заставляют FreeBSD быть предельно лаконичной, не отсылая ничего в ответ на запросы к закрытым портам.
net.inet.tcp.blackhole=2 # 0
net.inet.udp.blackhole=1 # 0
Увеличение размера очереди.
Защита очереди от SYN атак
kern.ipc.somaxconn=4096 # 128
Чтобы сервер не стал жертвой DoS-атаки, можно включить механизм syncookies, который служит для защиты сервера от SYN-флуда. Когда новое соединение не помещается в переполненный syncache, FreeBSD переходит в режим "syncookies" (TCP SYN cookies).
При серьезной атаке может не менее серьезно выручить.

net.inet.tcp.syncookies=1 # 1
Запрет ответа на широковещательный ECHO
Современная система не должна отвечать на широковещательные пинги, но и по сей день существуют сети, которые могут стать источником DoS-атаки. Чтобы не попасть в их список, выставляем:
net.inet.icmp.bmcastecho=0 # 0
Дропать все пакеты с флагами SYN+FIN.
Если не нужна поддержка смешного протокола T/TCP (TCP for Transactions), то пакеты с флагами SYN+FIN можно смело отбрасывать как неликвидные :).
Протокол редко где используется, а потому это имеет смысл

net.inet.tcp.drop_synfin=1
Запрет ридеректов

net.inet.icmp.drop_redirect=1 # 1
net.inet.icmp.log_redirect=1 # 1
net.inet.ip.redirect=0 # 1
#net.inet6.ip6.redirect=0 #ipv6 disable in kernel
Очистка таблицы ARP через .... секунд

net.link.ether.inet.max_age=1200 # 1200
Запрет на "прощупывание" внутренней сети

net.inet.ip.sourceroute=0 # 0
net.inet.ip.accept_sourceroute=0 # 0
Запрет запроса маски адреса, запрет широковещательного запроса временного штампа (timestamp)

net.inet.icmp.maskrepl=0 # 0
Максимальное количество пакетов ICMP <<Недостижимо>> (icmp type 3), а также количество отсылок TCP RST пакетов в секунду.

net.inet.icmp.icmplim=100 # 200
Увеличение размера TCP-буферов, для оптимизации при большом потоке данных HTTP FTP.
Но стоит помнить, что слишком объемные буферы быстро приведут к исчерпанию памяти при большом количестве подключений. Для веб-сервера, который принимает много коротких запросов и отправляет большие объемы данных, размер выходного буфера рекомендуется увеличить в ущерб входного.
net.inet.tcp.sendspace=32768 # 32768
net.inet.tcp.recvspace=65536 # 65536
Выставляет maximum segment lifetime.
Определяет максимальное время жизни сегмента (Maximum Segment Life - MSL)
После того как соединение закрывается сокет переходит в состояние TIME_WAIT Это максимальное количество времени ожидания ACK в ответ на SYN-ACK или FIN-ACK в миллисекундах В этом состоянии он может находится по умолчанию в течение 60 секунд. Время можно изменить через sysctl (в миллисекундах деленных на 2, 2 x 30000 MSL = 60 секунд)
net.inet.tcp.msl=7500 # 30000
Во FreeBSD 6.2 TIME_WAIT сокеты обрабатываются отдельно (нужна лишь часть информации 48 байт из 1 Кб. Ограничение вне лимита kern.ipc.maxsockets)

net.inet.tcp.maxtcptw=40960 # 40960
По умолчанию исходящие соединения инициируются с диапазона портов 49152-65535 (16 тыс.). Во FreeBSD 8.1 - порты 10000 - 65535 Их неплохо увеличить (1024-65535):

net.inet.ip.portrange.first=1024 # 10000
net.inet.ip.portrange.last=65535
Не менять ttl при транзите пакетов

net.inet.ip.stealth=0 # 0
Включение пуллинга
kern.polling.enable=0 # 0
Pooling

kern.polling.each_burst=5 # 5
kern.polling.burst_max=1000 # 150
Установка значения ttl под Windows

net.inet.ip.ttl=128 # 64
Максимальаня длина приёмной очереди, при переполнении которой стек дропает входящие пакеты

net.inet.ip.intr_queue_maxlen=4096 # 50
Увеличить максимальное число открытых сокетов

sysctl kern.ipc.maxsockets=204800 # 25600
Если машина обрабатывает несколько десятков тысяч соединений, то tcb hash позволяет быстро определять принадлежность пришедшего пакета к определенному соединению.

net.inet.tcp.tcbhashsize=4096 # 4096
Для использования портов по порядку, вместо случайной выборки (для исключения ошибки повторного коннекта с одного порта до отработки TIME_WAIT):

net.inet.ip.portrange.randomized=0 # 1
Во FreeBSD 6.2 появилась возможность не создавать состояние TIME_WAIT для соединений в рамках localhost:

net.inet.tcp.nolocaltimewait=1 # 0
DummyNET - шейпинг на IPFW
net.inet.ip.dummynet.io_fast - если трафик помещается в заданную полосу, не пропускать его через очередь и отдельный поток. Если нет необходимости эмулировать задержки и потери в канале - очень сильно сохраняет ресурсы. При использовании этой опции практически отпадает необходимость в распараллеливании dummynet
net.inet.ip.dummynet.io_fast=1

net.inet.ip.intr_queue_maxlen, net.route.netisr_maxqlen - фактически - размеры входящей и исходящей очередей. При большой нагрузке в режиме маршрутизации есть смысл увеличивать эти значения. Непоместившийся пакет выбрасывается. Это условно спасет при кратковременных перегрузках (часть пакетов пролетит с большой задержкой), но совершенно не спасет при хроничеких.
net.isr.direct - обрабатывать исходящие пакеты непосредственно при попытке отправки (в т.ч. прохождение ipfw на выходе). Т.е. не откладывать в очередь, которую в отдельном потоке разгребает netisr. Есть смысл включать, если количество ядер меньше или равно количеству сетевых карточек. Влияет на скорость ОТПРАВКИ пакетов. Для серверов это хорошо, для роутеров - не очень. Если нагрузка на сетевые карты неравномерная, или когда есть хотя бы одно хронически недогруженое ядро - выключать. При включеном net.inet.ip.fastforwarding будет еще 1 спецэффект.
net.isr.direct_arp - обрабатывать исходящие ARP пакеты непосредственно при попытке отправки. Есть смысл держать включенным в большинстве случаев (разумного варианта, когда стоит отправлять такие запросы в очередь я придумать не могу). Добавлено для того, чтобы обработкой ARP система могла заниматься с бОльшим приоритетом даже при net.isr.direct=0
net.isr.maxthreads - собственно, количество потоков, разгребающих очередь пакетов. Есть смысл ставить меньшим количества ядер в системе. Нужно прикинуть, сколько ресурсов съедается на обработке прерываний от сетевух и не только, сколько в пике потребляет прочий софт (БД, httpd, прочие демоны) и на оставшееся распределить роутинг. Если, к примеру, сетевухи потребляют по 80% с 2х ядер и софт еще до 100% одного ядра, а всего ядер 4, то остается 140% гарантированного времени. Т.е. полтора ядра ;) Тут можно смело ставить роутинг в 2 потока. Если нагрузки по софту кратковременные, а на роутинг с трудом хватает - можно даже попробовать 3.
net.inet.ip.fastforwarding - обрабатывать входящие пакеты непосредственно в момент приема (в т.ч. прохождение ipfw на входе, до попадания в очередь netisr). Есть смысл включать, если количество ядер меньше или равно количеству сетевых карточек, так же как и net.isr.direct. Влияет на скорость ПРИЕМА пакетов. Обработка пакета происходит прямо в обработчике прерывания. Следует учесть, что не все сетевухи и не все драйвера нормально умеют складировать новые пакеты в очередь, пока обрабатывается текущий. При включеном net.inet.ip.fastforwarding будет еще 1 спецэффект - маршрутизация пакета и прохождение ipfw (оба раза) будут происходить в том же обработчике прерывания. Фактически, на время обработки входящего пакета сетевая карта будет заблокирована. Это неплохо смотрится при преобладающем входящем трафике и на однопроцессорных машинах.
Файловая система
Запрет возможности монтирования файловых систем непривилегированными пользователями. vfs.usermount=0 # 0
Ресурсы системы
Увеличение числа mbuf кластеров
Можно увеличить до 262144
(в loader.conf - vm.kmem_size=1G, в ядре options KVA_PAGES=512)
kern.ipc.nmbclusters=65536 # 25600
Приложения работают не с сокетами, а с файлами. По этому для каждого сокета нужна структура, которая описывает файл.
kern.maxfiles - всего файлов в системе
kern.maxfilesperproc - максимальное число файлов на один процесс.

kern.maxfiles=204800
kern.maxfilesperproc=200000

Можно динамически изменить параметры shared memory
sysctl -a | grep shm
Вычисляется следующим образом:

SHMMAX = SHMALL * PAGE_SIZE + 1
Где PAGE_SIZE равно 4096 Б для i386

SHMALL = k * RAM * 1024 / PAGE_SIZE
Где RAM – физическая оперативная память в МБ; k – коэффициент, равный 0.5; PAGE_SIZE – размер одной страницы в КБ, PAGE_SIZE = 4 КБ для i386. Например, для машины с памятью 512 МБ,

SHMALL = 0.5 * 512 * 1024 / 4 = 65536.
В случае, если предполагается, что приложение будет работать на специально выделенном для этого сервере, и кроме него никаких других серьезных сервисов запущено не будет, то коэффициент k, можно увеличивать до 0.75, это 3/4 от физической оперативной памяти. Рекомендую также посмотреть утилиту ipcs.
Например для сервера PostgreSQL можно выставить следующие значения:

kern.ipc.shmall=65536
kern.ipc.shmmax=536870912
kern.ipc.semmap=256
/boot/loader.conf
Увеличить лимита физической памяти, которую может использовать ядро (по умолчанию 320Мб). Увеличим до 1Гб:
vm.kmem_size=1G
для amd64 оказалось недостаточно указать vm.kmem_size_max=1G в /boot/loader.conf, (параметр был просто игнорирован) по-этому это надо сделать в файле конфигурации ядра:
options VM_KMEM_SIZE=1073741824
options VM_KMEM_SIZE_MAX=1073741824
В /boot/loader.conf для обеих платформ нужно добавить vm.kmem_size_max=1G Увеличение syncache и syncookies( на этапе загрузки).

net.inet.tcp.syncache.hashsize=1024
net.inet.tcp.syncache.bucketlimit=100
Задаем какой буфер использовать для сетевых карточек (должен быть реально)

## Для карточек Intel с драйвером em
hw.em.rxd=4096
hw.em.txd=4096
## Для новых карточек Intel с драйвером igb
hw.igb.rxd=4096
hw.igb.txd=4096
Увеличение количества семафоров

kern.ipc.semmnu=256
kern.ipc.semmns=32000
kern.ipc.shmmni=4096
Опции ядра Увеличение адресного пространства ядра, которое на i386 платформе - 1Гб. Для увеличения до 2Гб. На платформе amd64 KVA всегда 2G.

options KVA_PAGES=512
Данная опция в FreeBSD 8.x предназначена для ускорения маршрутизации. При больших потоках трафика проц вгоняется в полку, поэтому настоятельно рекомендую вырубать ее нафиг, чтоб не наблюдать , как ваш роутер уходит в нирвану...

#options FLOWTABLE # per-cpu routing cache
Источник

Мое совещание

Петров пришел во вторник на совещание. Ему там вынули мозг, разложили по блюдечкам и стали есть, причмокивая и вообще выражая всяческое одобрение. Начальник Петрова, Недозайцев, предусмотрительно раздал присутствующим десертные ложечки. И началось.
— Коллеги, — говорит Морковьева, — перед нашей организацией встала масштабная задача. Нам поступил на реализацию проект, в рамках которого нам требуется изобразить несколько красных линий. Вы готовы взвалить на себя эту задачу?
— Конечно, — говорит Недозайцев. Он директор, и всегда готов взвалить на себя проблему, которую придется нести кому-то из коллектива. Впрочем, он тут же уточняет: — Мы же это можем?
Начальник отдела рисования Сидоряхин торопливо кивает:
— Да, разумеется. Вот у нас как раз сидит Петров, он наш лучший специалист в области рисования красных линий. Мы его специально пригласили на совещание, чтобы он высказал свое компетентное мнение.
— Очень приятно, — говорит Морковьева. — Ну, меня вы все знаете. А это — Леночка, она специалист по дизайну в нашей организации.
Леночка покрывается краской и смущенно улыбается. Она недавно закончила экономический, и к дизайну имеет такое же отношение, как утконос к проектированию дирижаблей.
— Так вот, — говорит Морковьева. — Нам нужно нарисовать семь красных линий. Все они должны быть строго перпендикулярны, и кроме того, некоторые нужно нарисовать зеленым цветом, а еще некоторые — прозрачным. Как вы считаете, это реально?
— Нет, — говорит Петров.
— Давайте не будем торопиться с ответом, Петров, — говорит Сидоряхин. — Задача поставлена, и ее нужно решить. Вы же профессионал, Петров. Не давайте нам повода считать, что вы не профессионал.
— Видите ли, — объясняет Петров, — термин «красная линия» подразумевает, что цвет линии — красный. Нарисовать красную линию зеленым цветом не то, чтобы невозможно, но очень близко к невозможному…
— Петров, ну что значит «невозможно»? — спрашивает Сидоряхин.
— Я просто обрисовываю ситуацию. Возможно, есть люди, страдающие дальтонизмом, для которых действительно не будет иметь значения цвет линии, но я не уверен, что целевая аудитория вашего проекта состоит исключительно из таких людей.
— То есть, в принципе, это возможно, мы правильно вас понимаем, Петров? — спрашивает Морковьева.
Петров осознает, что переборщил с образностью.
— Скажем проще, — говорит он. — Линию, как таковую, можно нарисовать совершенно любым цветом. Но чтобы получилась красная линия, следует использовать только красный цвет.
— Петров, вы нас не путайте, пожалуйста. Только что вы говорили, что это возможно.
Петров молча проклинает свою болтливость.
— Нет, вы неправильно меня поняли. Я хотел лишь сказать, что в некоторых, крайне редких ситуациях, цвет линии не будет иметь значения, но даже и тогда — линия все равно не будет красной. Понимаете, она красной не будет! Она будет зеленой. А вам нужна красная.
Наступает непродолжительное молчание, в котором отчетливо слышится тихое напряженное гудение синапсов.
— А что если, — осененный идеей, произносит Недозайцев, — нарисовать их синим цветом?
— Все равно не получится, — качает головой Петров. — Если нарисовать синим — получатся синие линии.
Опять молчание. На этот раз его прерывает сам Петров.
— И я еще не понял… Что вы имели в виду, когда говорили о линиях прозрачного цвета?
Морковьева смотрит на него снисходительно, как добрая учительница на отстающего ученика.
— Ну, как вам объяснить?.. Петров, вы разве не знаете, что такое «прозрачный»?
— Знаю.
— И что такое «красная линия», надеюсь, вам тоже не надо объяснять?
— Нет, не надо.
— Ну вот. Вы нарисуйте нам красные линии прозрачным цветом.
Петров на секунду замирает, обдумывая ситуацию.
— И как должен выглядеть результат, будьте добры, опишите пожалуйста? Как вы себе это представляете?
— Ну-у-у, Петро-о-ов! — говорит Сидоряхин. — Ну давайте не будем… У нас что, детский сад? Кто здесь специалист по красным линиям, Морковьева или вы?
— Я просто пытаюсь прояснить для себя детали задания…
— Ну, а что тут непонятного-то?.. — встревает в разговор Недозайцев. — Вы же знаете, что такое красная линия?
— Да, но…
— И что такое «прозрачный», вам тоже ясно?
— Разумеется, но…
— Так что вам объяснять-то? Петров, ну давайте не будем опускаться до непродуктивных споров. Задача поставлена, задача ясная и четкая. Если у вас есть конкретные вопросы, так задавайте.
— Вы же профессионал, — добавляет Сидоряхин.
— Ладно, — сдается Петров. — Бог с ним, с цветом. Но у вас там еще что-то с перпендикулярностью?..
— Да, — с готовностью подтверждает Морковьева. — Семь линий, все строго перпендикулярны.
— Перпендикулярны чему? — уточняет Петров.
Морковьева начинает просматривать свои бумаги.
— Э-э-э, — говорит она наконец. — Ну, как бы… Всему. Между собой. Ну, или как там… Я не знаю. Я думала, это вы знаете, какие бывают перпендикулярные линии, — наконец находится она.
— Да конечно знает, — взмахивает руками Сидоряхин. — Профессионалы мы тут, или не профессионалы?..
— Перпендикулярны могут быть две линии, — терпеливо объясняет Петров. — Все семь одновременно не могут быть перпендикулярными по отношению друг к другу. Это геометрия, 6 класс.
Морковьева встряхивает головой, отгоняя замаячивший призрак давно забытого школьного образования. Недозайцев хлопает ладонью по столу:
— Петров, давайте без вот этого: «6 класс, 6 класс». Давайте будем взаимно вежливы. Не будем делать намеков и скатываться до оскорблений. Давайте поддерживать конструктивный диалог. Здесь же не идиоты собрались.
— Я тоже так считаю, — говорит Сидоряхин.
Петров придвигает к себе листок бумаги.
— Хорошо, — говорит он. — Давайте, я вам нарисую. Вот линия. Так?
Морковьева утвердительно кивает головой.
— Рисуем другую… — говорит Петров. — Она перпендикулярна первой?
— Ну-у…
— Да, она перпендикулярна.
— Ну вот видите! — радостно восклицает Морковьева.
— Подождите, это еще не все. Теперь рисуем третью… Она перпендикулярна первой линии?..
Вдумчивое молчание. Не дождавшись ответа, Петров отвечает сам:
— Да, первой линии она перпендикулярна. Но со второй линией она не пересекается. Со второй линией они параллельны.
Наступает тишина. Потом Морковьева встает со своего места и, обогнув стол, заходит Петрову с тыла, заглядывая ему через плечо.
— Ну… — неуверенно произносит она. — Наверное, да.
— Вот в этом и дело, — говорит Петров, стремясь закрепить достигнутый успех. — Пока линий две, они могут быть перпендикулярны. Как только их становится больше…
— А можно мне ручку? — просит Морковьева.
Петров отдает ручку. Морковьева осторожно проводит несколько неуверенных линий.
— А если так?..
Петров вздыхает.
— Это называется треугольник. Нет, это не перпендикулярные линии. К тому же их три, а не семь.
Морковьева поджимает губы.
— А почему они синие? — вдруг спрашивает Недозайцев.
— Да, кстати, — поддерживает Сидоряхин. — Сам хотел спросить.
Петров несколько раз моргает, разглядывая рисунок.
— У меня ручка синяя, — наконец говорит он. — Я же просто чтобы продемонстрировать…
— Ну, так может, в этом и дело? — нетерпеливо перебивает его Недозайцев тоном человека, который только что разобрался в сложной концепции и спешит поделиться ею с окружающими, пока мысль не потеряна. — У вас линии синие. Вы нарисуйте красные, и давайте посмотрим, что получится.
— Получится то же самое, — уверенно говорит Петров.
— Ну, как то же самое? — говорит Недозайцев. — Как вы можете быть уверены, если вы даже не попробовали? Вы нарисуйте красные, и посмотрим.
— У меня нет красной ручки с собой, — признается Петров. — Но я могу совершенно…
— А что же вы не подготовились, — укоризненно говорит Сидоряхин. — Знали же, что будет собрание…
— Я абсолютно точно могу вам сказать, — в отчаянии говорит Петров, — что красным цветом получится точно то же самое.
— Вы же сами нам в прошлый раз говорили, — парирует Сидоряхин, — что рисовать красные линии нужно красным цветом. Вот, я записал себе даже. А сами рисуете их синей ручкой. Это что, красные линии по-вашему?
— Кстати, да, — замечает Недозайцев. — Я же еще спрашивал вас про синий цвет. Что вы мне ответили?
Петрова внезапно спасает Леночка, с интересом изучающая его рисунок со своего места.
— Мне кажется, я понимаю, — говорит она. — Вы же сейчас не о цвете говорите, да? Это у вас про вот эту, как вы ее называете? Перпер-чего-то-там?
— Перпендикулярность линий, да, — благодарно отзывается Петров. — Она с цветом линий никак не связана.
— Все, вы меня запутали окончательно, — говорит Недозайцев, переводя взгляд с одного участника собрания на другого. — Так у нас с чем проблемы? С цветом или с перпендикулярностью?
Морковьева издает растерянные звуки и качает головой. Она тоже запуталась.
— И с тем, и с другим, — тихо говорит Петров.
— Я ничего не могу понять, — говорит Недозайцев, разглядывая свои сцепленные в замок пальцы. — Вот есть задача. Нужно всего-то семь красных линий. Я понимаю, их было бы двадцать!.. Но тут-то всего семь. Задача простая. Наши заказчики хотят семь перпендикулярных линий. Верно?
Морковьева кивает.
— И Сидоряхин вот тоже не видит проблемы, — говорит Недозайцев. — Я прав, Сидоряхин?.. Ну вот. Так что нам мешает выполнить задачу?
— Геометрия, — со вздохом говорит Петров.
— Ну, вы просто не обращайте на нее внимания, вот и все! — произносит Морковьева.
Петров молчит, собираясь с мыслями. В его мозгу рождаются одна за другой красочные метафоры, которые позволили бы донести до окружающих сюрреализм происходящего, но как назло, все они, облекаясь в слова, начинаются неизменно словом «Блять!», совершенно неуместным в рамках деловой беседы.
Устав ждать ответа, Недозайцев произносит:
— Петров, вы ответьте просто — вы можете сделать или вы не можете? Я понимаю, что вы узкий специалист и не видите общей картины. Но это же несложно — нарисовать какие-то семь линий? Обсуждаем уже два часа какую-то ерунду, никак не можем прийти к решению.
— Да, — говорит Сидоряхин. — Вы вот только критикуете и говорите: «Невозможно! Невозможно!» Вы предложите нам свое решение проблемы! А то критиковать и дурак может, простите за выражение. Вы же профессионал!
Петров устало изрекает:
— Хорошо. Давайте я нарисую вам две гарантированно перпендикулярные красные линии, а остальные — прозрачным цветом. Они будут прозрачны, и их не будет видно, но я их нарисую. Вас это устроит?
— Нас это устроит? — оборачивается Морковьева к Леночке. — Да, нас устроит.
— Только еще хотя бы пару — зеленым цветом, — добавляет Леночка. — И еще у меня такой вопрос, можно?
— Да, — мертвым голосом разрешает Петров.
— Можно одну линию изобразить в виде котенка?
Петров молчит несколько секунд, а потом переспрашивает:
— Что?
— Ну, в виде котенка. Котеночка. Нашим пользователям нравятся зверюшки. Было бы очень здорово…
— Нет, — говорит Петров.
— А почему?
— Нет, я конечно могу нарисовать вам кота. Я не художник, но могу попытаться. Только это будет уже не линия. Это будет кот. Линия и кот — разные вещи.
— Котенок, — уточняет Морковьева. — Не кот, а котенок, такой маленький, симпатичный. Коты, они…
— Да все равно, — качает головой Петров.
— Совсем никак, да?.. — разочарованно спрашивает Леночка.
— Петров, вы хоть дослушали бы до конца, — раздраженно говорит Недозайцев. — Не дослушали, а уже говорите «Нет».
— Я понял мысль, — не поднимая взгляда от стола, говорит Петров. — Нарисовать линию в виде котенка невозможно.
— Ну и не надо тогда, — разрешает Леночка. — А птичку тоже не получится?
Петров молча поднимает на нее взгляд и Леночка все понимает.
— Ну и не надо тогда, — снова повторяет она.
Недозайцев хлопает ладонью по столу.
— Так на чем мы остановились? Что мы делаем?
— Семь красных линий, — говорит Морковьева. — Две красным цветом, и две зеленым, и остальные прозрачным. Да? Я же правильно поняла?
— Да, — подтверждает Сидоряхин прежде, чем Петров успевает открыть рот.
Недозайцев удовлетворенно кивает.
— Вот и отлично… Ну, тогда все, коллеги?.. Расходимся?.. Еще вопросы есть?..
— Ой, — вспоминает Леночка. — У нас еще есть красный воздушный шарик! Скажите, вы можете его надуть?
— Да, кстати, — говорит Морковьева. — Давайте это тоже сразу обсудим, чтобы два раза не собираться.
— Петров, — поворачивается Недозайцев к Петрову. — Мы это можем?
— А какое отношение ко мне имеет шарик? — удивленно спрашивает Петров.
— Он красный, — поясняет Леночка.
Петров тупо молчит, подрагивая кончиками пальцев.
— Петров, — нервно переспрашивает Недозайцев. — Так вы это можете или не можете? Простой же вопрос.
— Ну, — осторожно говорит Петров, — в принципе, я конечно могу, но…
— Хорошо, — кивает Недозайцев. — Съездите к ним, надуйте. Командировочные, если потребуется, выпишем.
— Завтра можно? — спрашивает Морковьева.
— Конечно, — отвечает Недозайцев. — Я думаю, проблем не будет… Ну, теперь у нас все?.. Отлично. Продуктивно поработали… Всем спасибо и до свидания!
Петров несколько раз моргает, чтобы вернуться в объективную реальность, потом встает и медленно бредет к выходу. У самого выхода Леночка догоняет его.
— А можно еще вас попросить? — краснея, говорит Леночка. — Вы когда шарик будете надувать… Вы можете надуть его в форме котенка?..
Петров вздыхает.
— Я все могу, — говорит он. — Я могу абсолютно все. Я профессионал.

Подсветка синтаксиса в nano и mc

Порой просто не хочется запускать Emacs для того чтобы просто посмотреть исходник на LISP. И раз уж я ССЗБ то пользовался для просмотра midnight-commander или nano. Никакой подсветки LISP там и в помине нет. Ну вот однажды и надоело мне сидеть у камина с бокалом кьянти и мечтать как бы кто сделал для меня это благо. Я закатал рукава и сделал так:
Для mc
1. В первую очередь нудно включить встроенный в mc редактор. Он уже имеет подсветку синтаксиса, но знает лишь пару десятков команд.
2. Заменим в файле /usr/share/mac/syntax/lisp.syntax на такое содержимое:
wholechars abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-*0123456789

context default
    keyword whole apply yellow
    keyword whole and yellow
    keyword whole car yellow
    keyword whole caar yellow
    keyword whole cadr yellow
    keyword whole cdar yellow
    keyword whole cddr yellow
    keyword whole cdr yellow

    keyword whole close yellow
    keyword whole cond yellow
    keyword whole cons yellow
    keyword whole count yellow
    keyword whole defvar brightcyan
    keyword whole defstruct brightcyan
    keyword whole defun yellow
    keyword whole do yellow
    keyword whole eq yellow
    keyword whole eql yellow
    keyword whole equal yellow
    keyword whole eval yellow
    keyword whole format yellow
    keyword whole if yellow
    keyword whole let* yellow
    keyword whole let yellow
    keyword whole list yellow
    keyword whole load yellow
    keyword whole make-package yellow
    keyword whole mapcar yellow
    keyword whole not yellow
    keyword whole null yellow
    keyword whole numberp yellow
    keyword whole open yellow
    keyword whole or yellow
    keyword whole pprint yellow
    keyword whole prin1 yellow
    keyword whole princ yellow
    keyword whole print yellow
    keyword whole provide yellow
    keyword whole read yellow
    keyword whole require yellow
    keyword whole set yellow
    keyword whole setf yellow
    keyword whole setq yellow
    keyword whole slot-value yellow
    keyword whole sort yellow
    keyword whole stringp yellow
    keyword whole terpri yellow
    keyword whole write yellow
    keyword whole defmacro brightcyan
    keyword whole case yellow
    keyword whole progn yellow
    keyword whole when yellow 
    keyword whole loop yellow
    keyword whole unless yellow
    keyword whole with-output-to-string yellow
    keyword whole labels yellow
    keyword whole return-from yellow
    keyword whole handler-case yellow
    keyword whole defmethod yellow
    keyword whole eval-when yellow
    keyword whole declare yellow
    keyword whole with-open-file yellow
    keyword whole multiple-value-bind yellow
    keyword whole defclass brightcyan
    keyword whole with-standard-io-syntax yellow
    keyword whole getf yellow
    keyword whole mapcar yellow
    keyword whole remove-if-not yellow
    keyword whole dolist yellow
    keyword whole defparameter brightcyan
    keyword whole defgeneric yellow
    keyword whole consp yellow
    
    keyword whole lambda red
    keyword whole for red
    keyword whole nil brightred
    keyword whole t brightred
    keyword whole in-package brightred
    keyword whole defpackage brightred
    keyword whole error brightred

    keyword #' brightmagenta
    keyword ' brightmagenta
    keyword , brightmagenta

    keyword ( brightcyan
    keyword ) brightcyan

# Keyword declarations and keywords

    keyword :\[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-*0123456789\] white
    keyword &\[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-*0123456789\] brightgreen

# Comments

context ; \n brown

# Strings

#context \* \* brightmagenta
context " " brightgreen
keyword \\" green
keyword \\\\ green

3. В итоге получим такую картинку

В mc редактор достаточно туповат, но умеет подсвечивать парные скобки. 

Но если вы как и я используете nano, то для вас путь особый! По умолчанию он вообще не знает о существовании Common-Lisp, по этому:

1. Создаем в /usr/share/nano/ файл описания подсветки синтаксиса
#touch /usr/share/nano/lisp.nanorc
2. В него вписываем такое содержимое:
## Here is an example for Common-Lisp.
## Adapted from http://cl-cad.blogspot.com
## (litetabs@gmail.com)
syntax "lisp" "\.lisp$"  "asd" "\.asd$"
color green "\<(defun|with-open-stream|format|setf|apply|and|car|caar|cadr|cdar|cddr|cdr|close|cond|cons|count|do|eql|equal|eval|if|let*|let|list|load|make-package|mapcar|not|null|numberp|open|or|pprint|prin1|princ|print|provide|read|require|setq|slot-value|sort|stringp|terpri|write|case|progn|when|loop|unless|with-output-to-string|labels|return-from|handler-case|eval-when|declare|with-open-file|multiple-value-bind|with-standard-io-syntax|getf|remove-if-not|dolist|consp)\>"
color red "\<(error|else|for|in-package|defpackage|defsystem|lambda)\>"
color cyan "\<(defclass|defstruct|defvar|defconstant|defmethod|defgeneric|defparameter)\>"
color brightred "\<(t|nil)\>"
icolor yellow "\:\{?[0-9A-Z_!@#$*?-]+\}?"
color brightgreen ""(\\.|[^"])*""
icolor blue "\*\{?[0-9A-Z_!@#$*?-]+\}?"
color cyan "(^|[[:space:]]);.*$"
3. Для того чтобы nano узнал о новом синтаксисе, открываем файл /etc/nanorc
#: nano /etc/nanorc
4. В самый конец вписывает строку:

## Common-Lisp files
include "/usr/share/nano/lisp.nanorc"

Теперь можно любоваться результатом


Плюс nano в том что без лишней крови подсвечивает и asd файлы и в нормальной навигации по файлу клавишами. Из минусов - нет подсветки парных скобок.

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