Posterous theme by Cory Watilo

Filed under: tutorials

OpenVZ on Ubuntu 8.10

Только-что закончил эксперименты с OpenVZ на Ubuntu 8.10 (intrepid). Успешно. Итак, задача: создать виртуальную (для начала одну) машину с Ubuntu 8.10, которая будет доступна в локальной сети. Хост-система - Ubuntu 8.10, выступает в роли роутера для локальной сети, имеет на себе DHCP-сервер. Настройки сети виртуальная машинка должна получать по DHCP, роутиться другим роутером (два провайдера). Задача осложняется тем, что из intrepid убрали поддержку виртуализации посредством OpenVZ и сделали упор на KVM. Так как имеем машинку на базе AMD Duron (900MHz) то приходится выкручиваться. Опыт, как говорится, бесценен. Пару слов о состоянии виртуализации в Ubuntu:
  • KVM. В 8.10 сделали упор на KVM, который требует аппаратной поддержки виртуализации процессором. В данном случае процессор устаревший, так что KVM отпадает.
  • VServer. Выглядит неплохо, но у меня не удалось при помощи make-kpkg собрать ядро (2.6.27-15, наиболее близкое к имеющемуся в 8.10 - 2.6.27-11).
  • OpenVZ. Неплохое решение, но ядро с поддержкой виртуализации было в 8.04, в 8.10 от него отказались в пользу KVM.
  • Xen. Не горел желанием использовать решения полной виртуализации, так как вируализировать оборудование мне не требовалось - это дополнительные накладные расходы. Вроде бы поддержка есть... но, как оказалось, лишь в качестве гостевой ОС (DomU - гостевая, Dom0 - хост-система). А сервером (Dom0) - увы. В 8.04 было ядро умеющее быть сервером.
  • VMWare Server. Также полная виртуализация, тяжеловесное решение. Но хорошо тем, что не требует хаков с ядром.
Итогом чтения доки стала установка VMWare Server, и обошлось без косяков. Но снес его через несколько часов. Во-первых, одновременно с VMWare Server нельзя пользоваться комплектом netatalk. Во-вторых, теперь у VMWare Server появилась вебморда. И все бы ничего, если б не ее тормознутость. Посмотрев список процессов - sun-jre, apache-tomcat. Не знаю у кого как, но на столь небыстрой машинке вебморда тормозила и лагала безбожно. Некогда был Remote Console, но я так и не смог его найти. Таким образом я пришел к OpenVZ. Для начала я прописал в /etc/apt/sources.list репозиторий от 8.04: [cc lang="text"] deb http://de.archive.ubuntu.com/ubuntu/ hardy main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse [/cc] Далее - по учебнику: [cc lang="text"] apt-get install linux-openvz vzctl [/cc] Получил ядро linux-image-2.6.24-23-openvz и проверил, что пакет linux-restricted-modules-openvz потянул за собой linux-restricted-modules-common. Пользуясь aptitude установил версию 2.6.24.16-23.56. Так как сервер уже работал роутером, то изменений в /etc/sysctl.conf я не вносил - более-менее с рекомендациями мои значения совпали. Со странички шаблонов стянул ubuntu-8.10-x86.tar.gz: [cc lang="text"] cd /var/lib/vz/template/cache && wget http://download.openvz.org/template/precreated/ubuntu-8.10-x86.tar.gz [/cc] Затем создал виртуальный контейнер [cc lang="text"] vzctl create 101 --ostemplate ubuntu-8.10-x86 --config vps.basic [/cc] задал виртуальной машине hostname [cc lang="text"] vzctl set 101 --hostname gretchin --save [/cc] и добавил запуск этой VPS вместе с запуском OpenVZ (/etc/init.d/vz) [cc lang="text"] vzctl set 101 --onboot yes --save [/cc] Чудесно. На данный момент имеем виртуальную машину без сети. Для того чтоб она была видна в локальной сети нужно соорудить bridge. Для этого понадобится пакет bridge-utils: [cc lang="text"] apt-get install bridge-utils [/cc] Теперь подправил /etc/network/interfaces: [cc lang="text"] auto lo iface lo inet loopback #Inet iface auto eth0 iface eth0 inet dhcp #eth1 - LAN auto br0 iface br0 inet static address 192.168.1.1 netmask 255.255.255.0 bridge_ports eth1 [/cc] Заодно подправил интерфейс в /etc/default/dhcp3-server: [cc lang="bash"] INTERFACES="br0" [/cc] Затем применил настройки: [cc lang="text"] /etc/init.d/network restart [/cc] ...и лишился сети. Сам не понял что и как, но после ребута роутера и сидения перед его консолью все заработало самостоятельно. Хм. Добавил сетевой интерфейс в виртуальную машину: [cc lang="text"] vzctl set 101 --netif_add eth0 --save [/cc] В vzctl версии >3.0.22 можно указать еще и bridge, к которому присоединяться. Но в ubuntu 8.10 версия 3.0.22, и поэтому пришлось дописывать небольшой скрипт. А заодно исправить мелкий баг. Итак, в /etc/vz/conf/101.conf нужно дописать [cc lang="bash"] CONFIG_CUSTOMIZED="yes" VZHOSTBR="br0" [/cc] Теперь создадим скрипт /etc/vz/bin/vznetaddbr [cc lang="bash"] mkdir /etc/vz/bin touch /etc/vz/bin/vznetaddbr chmod 700 /etc/vz/bin/vznetaddbr [/cc] с таким содержимым [cc lang="bash"] #!/bin/bash # /etc/vz/bin/vznetaddbr # a script to add virtual network interfaces (veth-s) in a CT to a bridge on CT0 CONFIGFILE=/etc/vz/conf/$VEID.conf . $CONFIGFILE VZHOSTIF=`echo $NETIF |sed 's/^.*host_ifname=\(.*\),.*$/\1/g'` if [ ! -n "$VZHOSTIF" ]; then echo "According to $CONFIGFILE CT$VEID has no veth interface configured." exit 1 fi if [ ! -n "$VZHOSTBR" ]; then echo "According to $CONFIGFILE CT$VEID has no bridge interface configured." exit 1 fi echo "Adding interface $VZHOSTIF to bridge $VZHOSTBR on CT0 for CT$VEID" /sbin/ifconfig $VZHOSTIF 0 echo 1 > /proc/sys/net/ipv4/conf/$VZHOSTIF/proxy_arp echo 1 > /proc/sys/net/ipv4/conf/$VZHOSTIF/forwarding /usr/sbin/brctl addif $VZHOSTBR $VZHOSTIF exit 0 [/cc] и затем создадим /etc/vz/vznet.conf со следующим содержимым: [cc lang="bash"] #!/bin/bash EXTERNAL_SCRIPT="/etc/vz/bin/vznetaddbr" [/cc] Теперь про баг (устраненный в 3.0.23): в процессе старта при наличии vznet.conf вызывается скрипт /usr/sbin/vznetcfg. Так как в debian/ubuntu используется dash (/bin/sh), то там по чистой случайности нету команды source, а оттого ошибка появляется на строке 20: [cc lang="bash"] [ -f "$VZNETCFG" ] && source "$VZNETCFG" [/cc] Решение - заменить на [cc lang="bash"] [ -f "$VZNETCFG" ] && ."$VZNETCFG" [/cc] Заменить можно через sed (I'm loving it!): [cc lang="bash"] cp -p /usr/sbin/vznetcfg /usr/sbin/vznetcfg.orig sed -i 's/source "$VZNETCFG"/\. "$VZNETCFG"/' /usr/sbin/vznetcfg [/cc] Соответственно теперь выполним [cc lang="bash"] vzctl stop 101 vzctl start 101 brctl show [/cc] В конце мы должны увидеть нечто похожее на veth101.0: [cc lang="text"] bridge name bridge id STP enabled interfaces br0 8000.00024494a7ac no eth1 veth101.0 [/cc] Если все удалось - то можно смело идти в виртуальную машину [cc lang="bash"] vzctl enter 101 [/cc] и делать все чего хочется. По поводу роутинга через другого провайдера: подсмотрев в ifconfig -a внутри виртуальной машинки мак-адрес сетевого интерфейса достаточно в /etc/dhcp3/dhcpd.conf на хост-машине (я же говорил - она еще и роутер) прописать что-то вроде: [cc lang="text"] host gretchin { hardware ethernet 00:18:51:80:8A:D9; fixed-address 192.168.1.101; server-name "gretchin"; option routers 192.168.1.2; } [/cc] где 192.168.1.2 - второй роутер в той же сети. По материалам:
  1. help.ubuntu.com
  2. ubuntuforums.org
  3. Howtoforge
  4. forum.openvz.org
  5. Gentoo Wiki
  6. OpenVZ-Users-Guide.pdf
PS: не забывайте про GNU Screen. Это избавляет от многих проблем, особенно при конфигурации сети.

LVM Rocks

Давно заметил что в Ubuntu (server edition) во время инсталляции начали предлагать использовать LVM. Но я все не решался поставить production на него. Затем пообщался со теми кто его использовал, почитал доку - и последний год стал его использовать, так как постиг скрытую в нем мощь :) Допустим, у нас есть простенький бюджетный сервер. Мы развернули новое приложение, и его база стала расти весьма стремительно. Итого - база, веб-файлы и система живут на одном физическом диске. Был куплен диск WD Razor, и на него перенесли базу. Нагрузка диска (iostat -x -m 1) составила 1-2%. Решено перенести туда же и веб-файлы, однако решение это пришло лишь через пару дней. Так что получилось наглядно продемонстрировать возможности LVM.

Part1. Creating...

Когда поставили разор на нем создали один раздел - LVM: [cc lang="bash"] # fdisk -l Disk /dev/sdb: 74.3 GB, 74355769344 bytes 255 heads, 63 sectors/track, 9039 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdb1 1 9039 72605736 8e Linux LVM [/cc] Пару слов об организации LVM. Уровень 1: volume group (vg). Это наивысший уровень абстракции, объединяющий в себе logical volumes и physical volumes. Уровень 2: physical volume (pv). Это некое блочное устройство, способное хранить данные (HDD, RAID, ...) Уровень 3: logical volume (lv). Это эквивалент раздела на жестком диске. Таким образом в группу добавляются физические тома (pv), и потом во всем этом пространстве свободного места создаются разделы (lv), на которых уже создается файловая система. Итак, сначала создавался pv: [cc lang="bash"] pvcreate /dev/sdb1 [/cc] Затем vg: [cc lang="bash"] vgcreate sys_vg /dev/sdb1 [/cc] И затем на все свободное место указанного pv (/dev/sdb1) создали lv с именем var_lib_mysql: [cc lang="bash"] lvcreate -L 100%PVS -nvar_lib_mysql sys_vg /dev/sdb1 [/cc] Дело за малым: [cc lang="bash"] mkreiserfs /dev/mapper/sys_vg-var_lib_mysql mount /dev/mapper/sys_vg-var_lib_mysql /mnt /etc/init.d/mysql stop mv /var/lib/mysql/* /mnt/ mv /var/lib/mysql/.* /mnt/ umount /mnt mount /dev/mapper/sys_vg-var_lib_mysql /var/lib/mysql chown -R mysql:mysql /var/lib/mysql /etc/init.d/mysql start [/cc] Вот собственно и почти все. Последний штрих - прописать монтирование раздела в fstab, дабы это происходило при загрузке автоматом. Можно скучно сделать это через blkid, увидеть там нужный UUID (например, f6946e54-c7d6-4688-8fac-05dcb1bf9973), скопировать его, открыть /etc/fstab и вставить туда строку вида: [cc lang="bash"] UUID=f6946e54-c7d6-4688-8fac-05dcb1bf9973 /var/lib/mysql reiserfs defaults 0 2 [/cc] а можно сделать так: [cc lang="bash"] printf "\nUUID=`blkid | grep sys_vg-var_lib_mysql | sed -r 's/.*UUID="([^"]*).*/\1/i'`\t/var/lib/mysql reiserfs defaults 0 2\n" >> /etc/fstab [/cc] Да, если сделать umount /var/lib/mysql && mount /var/lib/mysql до ребута - то /dev/disk/by-uuid/f6946e54-c7d6-4688-8fac-05dcb1bf9973 (или какой там получится) там еще не будет. Для того чтоб появился до ребута надо перезапустить udev: [cc lang="bash"] /etc/init.d/udev restart [/cc]

Part2. Resizing...

Как я говорил раньше, с опозданием пришла мысль о том, что неплохо бы вынести и статические файлы на этот же винт. И сделать это совсем просто! Для этого от того lv что был создан раньше (и именуется var_lib_mysql) откусим немного места. Сначала остановим все службы (говорят, reiserfs увеличивается/уменьшается без проблем налету, но я этого пока не пробовал на себе): [cc lang="bash"] /etc/init.d/mysql stop umount /var/lib/mysql [/cc] Затем уменьшим файловую систему, а затем и lv на 20ГБ: [cc lang="bash"] resize_reiserfs -s-20G /dev/mapper/sys_vg-var_lib_mysql lvreduce -L-20G /dev/mapper/sys_vg-var_lib_mysql [/cc] На всякий случай я предпочел проверить фс на ошибки (а вдруг!): [cc lang="bash"] reiserfsck /dev/mapper/sys_vg-var_lib_mysql [/cc] Ну и возвращаем обратно MySQL: [cc lang="bash"] mount /var/lib/mysql /etc/init.d/mysql start [/cc] Теперь создадим lv для веб-файлов, и так как их намного меньше 20ГБ, я решил оставить 5ГБ про запас, никому их не присвоив. Потом можно будет налету добавить туда где закончится место. [cc lang="bash"] lvcreate -L 15G -nvar_www sys_vg mkreiserfs /dev/mapper/sys_vg-var_www [/cc] Далее - перенос файлов: [cc lang="bash"] /etc/init.d/nginx stop /etc/init.d/apache2 stop mount /dev/mapper/sys_vg-var_www /mnt mv /var/www/* /mnt/ mv /var/www/.* /mnt/ umount /mnt mount /dev/mapper/sys_vg-var_www /var/www /etc/init.d/apache2 start /etc/init.d/nginx start [/cc] И опять не забываем про fstab: [cc lang="bash"] printf "\nUUID=`blkid | grep sys_vg-var_www | sed -r 's/.*UUID="([^"]*).*/\1/i'`\t/var/lib/mysql reiserfs defaults 0 2\n" >> /etc/fstab [/cc] По материалам:
  1. http://wiki.linuxquestions.org/wiki/LVM#example
  2. http://www.tldp.org/HOWTO/LVM-HOWTO/reducelv.html
PS: после изменения размера мог измениться UUID для lv var_lib_mysql, хотя я и не уверен в этом. Но проверить не помешает. PS2: если работаете удаленно - не забывайте про screen. PS3: писалось по памяти, так что могут быть некоторые неточности. Тупой копипаст без вовлечения мыслительного процесса чреват боком. Я предупредил ;)

git, gitosis, tailor, and bzr

git

До общения с Oleganza я не видел у git каких-либо ярких преимуществ перед bzr. И, наверное, не увидел бы, если бы не Олег. Первое что было самым необычным - git полностью децентрализованый. И привычный svn-like workflow тут не работает. Надо было привыкать к branch-style. Второе - это то, что команды с теми же названиями что и у svn имеют другой смысл. Жутко понравилось что ветки git держит в себе, то есть не надо плодить по 3-4 папки для разных фичей.

gitosis

Также я задумался о совместной работе. github - это, конечно, хорошо, но у меня уже есть багтракер понимающий git. Отчего бы не попробовать git на своем сервере? Был заведен юзерь git без пароля [cc lang="bash"] sudo adduser --shell /bin/sh --gecos 'git version control' --disabled-password --home /home/git git [/cc] поставлен gitosis [cc lang="bash"] sudo apt-get install gitosis [/cc] сделаны небольшие правки его сорсов (дело в том, что по умолчанию gitosis создает репо с маской 0750, мне же надо было с 0755 - чтоб www-data мог его читать): правим [cc lang="bash"] /var/lib/python-support/python2.5/gitosis-0.2-py2.5.egg/gitosis/repository.py [/cc] и заменяем 0750 на 0755. Подробнее описано в блоге разработчика gitosis.

tailor and bzr

Когда все взлетело с git, решил попробовать отконвертировать при помощи утилиты tailor старые репо из bzr в git. Конфиг получился примерно такой (замечания приветствуются): [cc lang="ini"] [DEFAULT] verbose = True [project] target = git:target start-revision = INITIAL root-directory = /home/dm/tmp/bzr2git state-file = tailor.state source = bzr:source subdir = bzr2git.tmp [bzr:source] repository = /home/dm/bzr/BZR_PROJECT_HERE [git:target] repository = /home/dm/tmp/bzr2git/tmp/.git [/cc] и после запуска [cc lang="bash"] tailor bzr2git.conf [/cc] в /home/dm/tmp/bzr2git/bzr2git.tmp появляется вполне живой git-репозитарий. Его я уже стягивал к себе и вливал в gitosis от себя.

Примечание

git не отслеживает пустые папки, и в процессе конвертации теряются "log", "tmp", etc... Чтоб отслеживал достаточно [cc lang="bash"] mkdir log touch log/.empty [/cc]

Migration to PowerDNS

Наверняка многие видели сообщение об уязвимости в DNS. Во многих дистрибах линукса весьма скоро появились секьюрити-патчи, которые эту уязвимость исправляли. Уязвимость, может, и не слишком уж страшная, но она напомнила мне о PowerDNS, который я с интересом рассматривал в начале 2008го года. Расматривал я его в основном из-за родной интеграции с MySQL. Мне весьма понравилось как она реализована. Однако у меня были уже рабочие конфиги BIND9, и я просто ленился испытать PowerDNS на собственной шкуре. А зря боялся, как оказалось. Упомянутая уязвимость не задела PowerDNS, и этим мое внимание было вновь привлечено к нему. И переход таки состоялся.

Что дал переход

Во-первых, я получил возможность использовать найденый вчера poweradmin. Штука оказалась немного неуклюжая, но порадовала меня тем, что не надо более ковыряться в конфигах. Во-вторых, при изменении/добавлении/удалении записей в зоне маркер (Serial) в SOA меняется сам. Мелочь, но приятно. В-третьих, теперь можно давать доступ к редактированию зон другим людям. Вот то, что бросилось мне в глаза. А теперь более подробно о самом переходе.

Процесс перехода

PowerDNS состоит из двух компонентов - основной сервер имен и преобразователь имен. Основной сервер имен выдает информацию только о тех записях, которые в нем есть. Преобразователь имен же помогает резолвить то, чего нету непосредственно у данного сервера. Итак, понадобится выполнить следующие действия: [cc lang="text"] apt-get install pdns-server pdns-recursor pdns-backend-mysql [/cc] Желательно во время установки стопнуть bind, потому как dpkg будет ругаться из-за неудачного запуска демона. После установки можно тушить pdns и стартовать bind до окончания миграции. В конфиге /etc/powerdns/pdns.conf надо сделать следующие изменения: [cc lang="text"] ... #allow-recursion=127.0.0.1 ... launch=gmysql ... local-address=_real_external_ip_here_ ... recursor=127.0.0.1 ... [/cc] Этим мы будем передавать все неизвестные запросы от основного сервера к recursor'у. У рекурсора в конфиге стоит local-address=127.0.0.1 по умолчанию, если мне не изменяет память. В /etc/powerdns/pdns.d/pdns.local вписываем [cc lang="text"] gmysql-host=localhost gmysql-port=3306 gmysql-dbname=_username_here_ gmysql-user=_dbname_here_ gmysql-password=_dbpass_here_ gmysql-socket=/var/run/mysqld/mysqld.sock [/cc] Проверяем, есть ли нужная БД и пользователь, и может ли он подключиться к базе. Пример начальной базы есть в /usr/share/doc/pdns-backend-mysql. Советую туда сразу добавить в конец [cc lang="sql"] ALTER TABLE records ADD CONSTRAINT `records_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE; [/cc] При его тестировании было замечено что работает он бытрее с таблицами InnoDB. Наверное, из-за большого кеша у этого типа таблиц. Я не стал менять таблицы на MyISAM, однако добавил при создании таблиц default collate utf8_general_ci - для надежности. Потом надо втянуть записи имеющиеся у BIND. Для этого в комплекте есть утилита zone2sql. Рекомендую использовать ее с ключиком --gmysql - так она правильнее работает, создавая записи и в domains и в records. [cc lang="text"] zone2sql --named-conf=/etc/bind/named.conf --gmysql > import.sql [/cc] и вначале выкосил все до основных зон. Потом скормил это mysql'ю. Также можно во всех записях SOA поставить Serial в 0 - так PowerDNS будет вычислять его автоматически. Пробуем стопнуть bind9 и запустить pdns и pdns-recursor. Если все правильно - все взлетит, и в сислоге будут сообщения о состоянии полета. Проверить можно набрав [cc lang="text"] nslookup - dns.yourserver.com [/cc] и попробовать ввести что-то существующее на сервере и что-то несуществующее. У меня основной сервер без recursor'а не хотел отдавать записи типа CNAME при просмотре nslookup'ом. Пришлось установит recursor и настроить их общение. Ну а установка poweradmin для управления сервером не должна вызвать трудностей вообще.

Two ISP and LAN using iproute2

Для меня давно уже возникала необходимость подружить сервер с двумя провайдерами и локальной сетью. И вот вчера проблема стала весьма актуальной. Итак, имеем: eth0 - 192.168.0.0/24 - LAN eth1 - 13.13.13.13/24 - ISP#1 eth2 - 6.6.6.6/24 - ISP#2 ISP#2 отдает IP через DHCP ISP#1 - статика (на самом деле DHCP но удалось договориться на статику) LAN - его надо NAT'ить в мир через ISP#1 (кое-что можно отправлять и через ISP#2, это будет показано). Так как при использовании dhclient сетевые настройки не заменялись получеными мы это запретим в файле /etc/dhcp3/dhclient.conf: [cc lang="text"] request subnet-mask, broadcast-address, time-offset, routers; [/cc] Отлично. Теперь мы получим лишь IP и шлюз. Теперь в файле /etc/iproute2/rt_tables добавим таблицу маршрутизации ISP2: [cc lang="text"] 2 ISP2 [/cc] Теперь надо заносить получаемые значения шлюза в эту таблицу, и определить маршрут, по которому пакеты будут попадать в эту таблицу. Для этого напишем два скрипта: /etc/dhcp3/dhclient-enter-hooks.d/duallink [cc lang="bash"] if [ x$reason == 'xBOUND' ]; then /sbin/ip route flush table ISP2 /sbin/iptables -F PREROUTING -t mangle /sbin/ip route flush cache ip rule show | grep ISP2 | while read -r line ; do ip rule del `echo $line | cut -d ':' -f2` done prefix=`echo $new_ip_address | cut -d . -f 1-2` if [ x$prefix == 'x192.168' ]; then exit fi #ISP1 /sbin/ip route add 13.13.13.13/24 dev eth1 table ISP2 /sbin/ip route add 172.16.0.0/16 dev eth1 table ISP2 #LAN /sbin/ip route add 192.168.0.0/24 dev eth0 table ISP2 #ISP2 /sbin/ip rule add from $new_ip_address table ISP2 /sbin/ip rule add fwmark 0x2 table ISP2 #А тут можно пометить пакеты, которые уйдут через ISP2 /sbin/iptables -I PREROUTING -t mangle -i eth0 -p tcp --dport 443 -j MARK --set-mark 2 /sbin/iptables -I PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 2 fi isp2_gateway=$new_routers new_routers="" [/cc] /etc/dhcp3/dhclient-exit-hooks.d/duallink [cc lang="bash"] if [ x$reason == 'xBOUND' ]; then my_new_network=`ipcalc -n $new_ip_address/$new_subnet_mask | grep Network | cut -b 12-32` /sbin/ip route add $my_new_network dev $interface table ISP2 /sbin/ip route add default via $isp2_gateway table ISP2 fi [/cc] Да, не забудьте установить ipcalc! Собственно, все. Теперь осталось воткнуть ISP#2 и посмотреть на получившуюся картину командами [cc lang="text"] ip rule show ip route show ip route show table ISP2 [/cc] статья собрана по материалам Configuring several Internet connections on the same Computer Rules - routing policy database Appendix D. IP Route Management и других перелистаных в процессе отладки. На убунтовской вики упоминается /usr/local/sbin/flush_rules.pl, но что внутри этого скрипта - автор умолчал. Все замечания приветствуются!

Linux pxe boot

Когда-то давным-давно я работал админом-помощником в университете. И были у нас компы без cdrom, со всем встроеным. И надо было туда поставить форточки и весь софт для учебных классов. Столкнулся с проблемой =) USB-CDROM тогда взять было негде, и было две мысли - USB boot и PXE boot. Последнее - это сетевая загрузка, многие интегрированые сетевые чипы могут ее осилить, остальным же (это платки за 5$) нужен чип с биосом. С первым с горем пополам что-то получалось, а со вторым - нет. А загрузившись в линух можно было уже развернуть образ на винт... Так вот подобная задача встала передо мной снова - массовая установка FreeBSD с одинаковым конфигом. Ну, лишь с небольшими поправками.

Read the rest of this post »

Linux tips v.1

Серия относится к категории "newbies". Используемый дистрибутив - Ubuntu. В этой части:
  • как сменить разрешение экрана вручную
  • как сменить видеодрайвер
  • как восстановить загрузчик (grub) после установки Windoze
  • запись в NTFS

Read the rest of this post »

Service monitoring

Наверняка всем приходимлось спешно (особенно после звонкавозмущенного клиента) подымать упавший mysql, apache или свой сервис? К примеру, на моей практике раз в три дня регулярно падает одна из сборок siteMeta на старенькой FreeBSD. И это хотелось бы отслеживать и в случае падения пытаться автоматически поднять. Для этого существует несколько программных решений. Самым простым мне показался Monit. Настраивается минут за 5, причем конфиги имеют довольно читаемый вид, хорошо прокомментированы, да и на сайте есть две пачки примеров, которых мне хватило чтоб настроить все что было нужно (ну, кое-что я оттуда вырезал). Интерфейс у Monit'а есть вэбовский, а можно его и не включать. Также он умеет запрашивать авторизацию и разрешать только отдельные IP для доступа. Вэб-интерфейс, кстати, довольно приятен: скриншоты. Вот, в общем-то, то, чем хотел поделиться. PS: уже месяц как работает на всех моих серверах - нареканий нет.