lleo (lleo) wrote,
lleo
lleo

Домашний сервер и помидоры


Рассказываю. Как вы наверно помните, у меня дома долгие годы живет домашний сервер (пост о концепции домашнего сервера 2010/04/27), который занимается всякими разными задачами от раздачи интернета до квартирной электроники и прочих экспериментов. Сервер впервые был поставлен господином Морозовским году так в 2001, с тех пор пережил много переездов с железа на железо (в основном с помощью господина Семеняки), но дальнейшее его обслуживание становилось все тяжелее и тяжелее. В последние годы это была большая пыхтящая машина с кучей воткнутых карт и сопутствующей периферией:


Концепция домашнего сервера вообще-то подразумевала, что сервер един, и я им полностью управляю. На самом деле это было не так. Отдельно от нее виcела коробочка WiFi Dlink, которая грелась и раз в несколько лет сжигала свой блок питания. И как она раздает свой WiFi — никаких тонких инструментов у меня не было. Сервером я не управлял тоже — хитроумно настроенная FreeBSD 6.2 со слетевшими портами была сильно выше моей квалификации и не поддавалась никакому управлению, а Семеняка был занят. Постепенно начала сыпаться и квартирная электроника — отказал сканер отпечатка пальца, из-за поплывших параметров электроники в LPT-порту заглючила система звонков. Я отказался от LPT-порта и (после обсуждений 2013/04/08 перешел на Ардуино. К сожалению, проклятая FreeBSD 6.2 категорически не желала отправлять Ардуине команды — могла только принимать. А обновить FreeBSD со всеми ее jail, dhcp-серверами и хитрейшей картой маршрутизации — это было вне моей квалификации. Одно время я даже думал нанять админа чтобы привести сервер в порядок, но было понятно, что всех моих проблем и хотелок такой метод не решит. Одновременно я стал задумываться о том, чтобы вообще выкинуть сервер к чертовой матери и поставить какой-нибудь умный маршрутизатор, но после обсуждений 2013/08/18 пришел к выводу, что это моих проблем не решит, хотя модель роутера ASUS RT-N16, что вы особенно советовали, я запомнил.

Помог случай. Мерзейший WiFi Dlink (второй по счету в квартире) в очередной раз сжег не только свой блок питания, но и себя самого. И я купил ASUS RT-N16 в надежде раздать по квартире автономный от сервера интернет, а сервер как-то починить. Но оказалось, что сервер не нужен — все (абсолютно все) мои потребности решает эта маленькая коробочка ASUS RT-N16 с установленной на ней DD-WRT «от Олега и единомышленников». Пока я не развесил эту технику красиво и не убрал в короба провода, это выглядит так:

Основной принцип: в этой системе я всё должен уметь сам. К счастью, она оказалась сильно проще полудохлой FSD 6.2, да и мануалов по ней предостаточно. Итак, что это? Сперва пару слов о маршрутизаторе — у него 1 вход интернет-провода, 4 выхода, плюс есть на борту 2 USB-слота. Первая задача — выкинуть штатную прошивку устройства и поставить прошивку нормальную, с которой уже можно работать. Для этого используется внешняя флешка — отныне все программное добро системы лежит там. Я использовал флешку 8Гб сперва, а после воткнул туда же и внешний USB-диск 2ТБ домашнего архива. Это внешний USB, разбитый под ext3 — именно там у меня сейчас домашний сайт и swap. В принципе, можно было с флешкой не морочиться, сразу диск подключать. Хватит ли 2ТБ для домашнего файл-сервера? Раньше я думал, что нет. Но, ей богу, хранить тонны кино дома — это сегодня абсурд. А для всего остального 2ТБ хватит за глаза. Внешнюю коробку для диска надо обязательно брать с вентилятором, я взял за 800 руб такую, хотя она шумновата. Особый гемор был переписать архивы со старого сервера — там диск был разбит в формате ufs, причем с каким-то таким нетрадиционным размером блоков, что ни один Линукс его прочесть не мог. А полуразрушенный сервер BSD не читал линуксовые диски ext2/ext3/ext4. Поэтому при помощи и с советами Гоши Курячего была проведена адова операция: в сервер был воткнут чистый диск, отформатирован под ufs уже со штатными размерами блоков, на него былро всё слито, затем загружен Линукс, который _этот_ ufs уже хотя бы в режиме чтения смог увидеть и слить обратно на исходный диск, предварительно отформатированный в ext3. Не храните, братцы, диски в ufs, дохлая система. Храните в ext3.

Оказалось, что маршрутизатор не любит, когда на одном разъеме висит много чего, и диск стал отваливаться при заливке больших объемов данных. Поэтому на одном USB у меня винт и флешка, на втором — периферия: звуковые карты и Ардуина:

Звуковые карты — традиционно одна звучит наружу на лестницу, другая внутрь квартиры. Это дверной звонок, оповещения, кукушка, разные прочие сигналы и сообщения, а еще можно музыку играть. USB-карта с бесплатной доставкой по России стоит от 1{s}lt;/a>. Реально. Подорожали они сейчас — я-то брал еще по 0.91$ :) Не помню точно, какие действия я производил, чтобы установить карту в систему — кажется, никаких. Но при старте Asus я гружу такие модули (а если были загружены, на всякий случай предварительно выгружаю):

Это самодельная коробка с электроникой и реле на базе Ардуино. Например, она открывает дверной замок (замок квартиры электрический). Обычно на этот месте паникеры начинают мне задавать вопросы. Мол, а если заглючит, если электричество отрубят? Отвечаю: этот замок стоит около 8 лет. Проблем с ним не было (а вот прежние механические раз в три года ломались и их выпиливали болгаркой). Замок так просто не ломается (там еще сигнализация самодельная). И у него, как у любого нормального электронного замка есть личинка со штатным ключом. Ключ есть у наиболее консервативных членов семьи. Поэтому если вырубят энергию более чем на полчаса (иначе UPS выдержит), просто откроем ключом. Но вообще он открывается электронно, и это дико удобно. Например, я могу открыть дверь приехавшим гостям, находясь не дома — с мобильника через интернет. И для срабатывания замка я использую 12 вольт от блока питания Asus, чтоб не ставить отдельный блок.
Нормально, никаких проблем. Кстати, Ардуино с Asus согласуется прекрасно. При запуске системы я делаю такую инициализацию:

Новый оптический сканер отпечатков пальцев лежит в коробочке и ждет своего часа, мне все лень с ним разобраться. Но я пока нашел другую игрушку, может даже более удобную — RFID-RC522. Это бесконтактный сканер NFC-ключей, он стоит с доставкой от 135 руб. Штуковина довольно просто подключается к Ардуине шестью проводками и позволяет организовать открытие замка при поднесении к двери ключа. Которым может быть все, что угодно — два ключа в комплекте, московская социальная карта, и даже просто старые карточки метро, это все протокол Mifare 13.56MHz. Для экспериментов я просто спустился в метро и набрал карт из корзинки для отработанных карт. У каждой карты свой уникальный номер, программируешь Ардуину пускать в дом по списку.

Из любопытного: у двух карт метро номер оказался одинаковым. Вряд ли это поможет злоумышленнику прийти с колодой карт и подобрать код, но все равно интересно. Еще любопытное: моя карта УЭК, по которой я хожу в метро, пару раз выдала читалке свой номер, и с тех пор говорить с ней отказывается глухо. В метро по ней я ходить продолжаю спокойно. Поскольку протокол Mifare — он и в Африке Mifare, я полагаю, что у УЭК внутре стоит какая-то паникерская блокировка от несанкционированных читалок. Для моих задач это неудобно, но конструкторскую задумку разработчиков УЭК и заботу о безопасности я вынужден оценить высоко.

Вдобавок надо сказать, что под DD-WRT вообще легко программируется. Я туда поставил Midnight Commander (не могу без него, там и редактор дивный), gcc, и вот пример программки. Это демон, который вешается в память и ждет строчку сообщения от Ардуины, а когда она придет, передает ее как параметр, запуская процедуру обработки сигнала zvonkido.php Смысл в том, что если строчку от Ардины будет ждать сам zvonkido.php (в моих задачах ожидание события длится часами и даже сутками), то он со своим консольным интерпретатором php будет жрать в памяти 16%. А бинарник жрет 1% памяти.

пример программы
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>

int main(int argc, char* argv[]) {
int fd, ack=1, l=0,i;
char buff[100]="",longbuff[1000]="";
fd=open("/dev/ttyUSB0", O_RDONLY | O_NOCTTY);

while(1) { l=read(fd, buff, 1000);
if(l>=100) { printf(«error length\n»); return 1; }
buff[l]=0;
for(i=0;i<l;i++) {
if(buff[i]==0) { l=i; break; }
if(buff[i]==0x0D || buff[i]==0x0A) { l=i; buff[l]=0; break; }
if(buff[i]<32 || buff[i]==34 || buff[i]==39) { printf("hack error ['\"]!\n"); l=0; break; }
}

if(l) {
strcpy(longbuff,"/opt/lleo/zvonkido.php '"); strcat(longbuff,buff); strcat(longbuff,"'");
system(longbuff);
}
}
close(fd);
return 0;
}

Итак, что сейчас делает сервер-маршрутизатор?
— раздача интернета, WiFi
— файловый архив Samba (т.н. «диск R:")
— обслуживание нескольких звуковых карт
— работа с Ардуино
— домашний вебсайт http://home.lleo.me (там пока я поставил mysql + легкий lighttpd, apache ставить не стал, думаю, как под него заточить свой движок, чтоб без mod_rewrite работал)
Я пока не знаю, какую еще придумать задачу, с которой бы он не справился. Учитывая, что USB-устройств туда можно натолкать массу (скоро я, например,восстановлю свой GSM-гейт для приема/отправки SMS).

PS1: К сожалению, закончилась неудачей попытка сделать в Asus искусственный интеллект, чтобы коробка тихо висела в углу, но отвечала на вопросы: проклятая утилитка rec не захотела писать звук со звуковой карты. Хотя другие утилиты звук пишут, но мне нужна именно эта — она умеет ждать сообщения. Скомпилировал бы кто-нибудь sox толково, и был бы разговаривающий и отвечающий на вопросы интеллект :)

PS2: Роутер Asus RT-N16 прекрасен во всех отношениях. Хотя есть еще мощнее: Asus RT-AC56U Он правда стоит в два раза дороже, но если бы я знал, что оно так хорошо полетит на этой загадочной DD-WRT, я бы купил самый мощный — мало ли какие задачи мне потребуются в будущем? В общем, если вы соберетесь покупать RT-N16, купите у меня (2681 руб, куплен 2 месяца назад, коробка, гарантия, стоит правильная прошивка, в подарок дам звуковую карту :), а я себе тогда 56U куплю.

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

Два месяца назад я писал, что обустроил на балконе делянку с помидорами, и месяц назад они активно росли. Сейчас кусты выросли и цветут. Правый ящик на фотке выше, слева направо: «Томат F1 Ласка» вымахал выше всех (не уверен, что это хорошо) и опередил на голову «Томат F1 Сластена» (пара кустов в центре), а слева приютились пышные ростки «Физалиса десертного» который лично я тоже отношу к помидорам. Лично мне больше нравится крайний левый ящик:

Эти крепкие коренастые кусты — «Жемичужина желтая». Они не вымахали так высоко вверх, зато красивы, и уже покрылись цветами. Они прекрасны:

Два маленьких ящичка в центре балкона я добавил позже, недельки через три:

Это «Томат Оранжевая шапочка» и «Томат F1 Карамель». Первая — из породы темно-зеленых и коренастых, вторая — светлая, лезет вверх. Говорят, их надо как-то «прищипывать», но я начинающий огородник и пока не умею. Я только по вашим советам провожу пасынкование — ну, то есть брею подмышки выщипываю листики, которые начинают расти в стыке между ветвями и стволом. Да, Ардуину пока не приделал — поливаю сам.



это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2014/07/07.html
Tags: программирование, сделай сам, электроника
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments