среда, 27 ноября 2013 г.

Установка OpenVSwitch 1.9 на CentOS 6

Зависимости:
yum install -y rpm-build
yum groupinstall -y "Development Tools"
yum install -y openssl-devel

Стягиваем код и собираем окружение:
cd /usr/src
wget http://openvswitch.org/releases/openvswitch-1.9.0.tar.gz

mkdir -p /root/rpmbuild/SOURCES
cp openvswitch-1.9.0.tar.gz /root/rpmbuild/SOURCES
cd /root/rpmbuild/SOURCES
tar -xvf openvswitch-1.9.0.tar.gz
Далее нужно удалить одну зависимость на строке Requires удаляем openvswitch-kmod:

vim ./openvswitch-1.9.0/rhel/openvswitch.spec
Собираем:
cd openvswitch-1.9.0
rpmbuild -bb -D `uname -r` rhel/openvswitch.spec
Устанавливаем:
yum localinstall /root/rpmbuild/RPMS/x86_64/openvswitch-1.9.0-1.x86_64.rpm
Запускаем (в автозагрузку он добавился уже сам):
/etc/init.d/openvswitch start
/etc/openvswitch/conf.db does not exist ... (warning).
Creating empty database /etc/openvswitch/conf.db           [  OK  ]
Starting ovsdb-server                                      [  OK  ]
Configuring Open vSwitch system IDs                        [  OK  ]
Starting ovs-vswitchd                                      [  OK  ]
Enabling gre with iptables                                 [  OK  ]
Источник: http://fvtool.wordpress.com/2013/04/24/install-kvm-on-centos-6-3-installing-open-vswitch/

Открытая вакцина против ВИЧ - Immunity Project

Настоящая попытка изменить мир http://www.immunityproject.org/ !!! Чудесный проект, чудесная идея и потрясающие люди! 

пятница, 22 ноября 2013 г.

Latency Based Routing - новости из мира Load Balancing :)

Как выглядит блок Anycast в RIPE?

Вот примерно так:
whois 31.131.255.10|tail -n 10
route:          31.131.255.0/24
descr:          Selectel Anycast
origin:         AS49505
mnt-by:         MNT-SELECTEL
source:         RIPE # Filtered
Честно говоря, не понятно одно - везде поднимать свою AS и нельзя использовать AS апстримов/провайдеров? Как тогда завернуть один блок IP в несколько разных ASN, причем, одновременно.

How to build rpm package for RHEL5 on RHEL6 system?

# emulate: "/usr/bin/rpmbuild-md5" from fedora-packager
rpmbuild --define "_source_filedigest_algorithm 1" --define "_binary_filedigest_algorithm 1" --define "_binary_payload w9.gzdio"  --define "_source_payload w9.gzdio" --define "_default_patch_fuzz 2"-bb e2fsprogs.spec


четверг, 21 ноября 2013 г.

How I can mount one file (not an folder) to another?

Create file with content:
echo "my important data" > /tmp/shadow

Check it content:
cat  /tmp/shadow
my important data

Create blank file, it will be mount point, it content can be any (we need only inode, right):
rm -f /tmp/shadowcopy
touch /tmp/shadowcopy

This file instantly blank:
cat /tmp/shadowcopy|wc -l
0

Mount file /tmp/shadow to /tmp/shadowcopy:
mount --bind /tmp/shadow /tmp/shadowcopy 

Welcome, all forks fine:
cat /tmp/shadow
my important data

cat /tmp/shadowcopy
my important data

You can add line into source file:
echo "new line" >> /tmp/shadow

And this line can be found in both files (source and mounted):
cat /tmp/shadow
my important data
new line

cat /tmp/shadowcopy
my important data
new line
 If you add any content to destination file, it will show in source. This mechanic looks like hard links. 

At finish you MUST unmount destination file:
umount /tmp/shadowcopy






среда, 20 ноября 2013 г.

Installing actual Gentoo from stage3 on OpenVZ withou any strange templates, only from stage3

0. Set our container number for preventing hardcoding in my commands:

export CTID=19484

1. Download stage3 into OpenVZ template folder (you can get actual link from here http://distfiles.gentoo.org/releases/amd64/autobuilds/latest-stage3-amd64.txt). Be careful - you must set downloaded file name to gento-bla-bla-bla:
cd /vz/template/cache
wget http://distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3/stage3-amd64-20131031.tar.bz2 -Ogentoo-stage3-amd64-20131031.tar.bz2

2. Create container using stage3 template.

vzctl create $CTID --hostname gentoo-forever.com --ipadd 78.47.xx.xx --ostemplate gentoo-stage3-amd64-20131031 --layout ploop --disk 10G

3. Start container for removing udev (udev and openvz are natural enemies): 

vzctl start $CTID
vzctl exec $CTID 'rm -f /etc/init.d/udev'
vzctl exec  $CTID 'rm -f /etc/init.d/udev-mount'

4. Start container for production:
vzctl start 19484;
vzctl enter 19484
5. Enable ssh:
/etc/init.d/sshd start

6. First steps in Gentoo - getting portage tree!
 emerge --sync


вторник, 19 ноября 2013 г.

How to mount multiple disks to OpenVZ ploop container?

Hello, OpenVZ admin! :)

In many cases you can want ability to mount an additional ploop devices in OpenVZ container (be care! This guide works only with ploop), i.e. add separate as /data or /mnt. It's not so obviously but I can help you. My test container number (CTID) is 19484, be careful because this number is another in your case!  

At first, you must select path where you plans save additional disk images. In my case, it's /storage folder on hardware node.

1. We must create subfolder for saving additional disk data (image + description file). I recommend to name it with CTID.

mkdir /storage
mkdir /storage/19484

2. Create ploop device with defined size in this folder.
ploop init -s 10G -f ploop1 -v 2 /storage/19484/additional_disk_image -t ext4

3. Please stop container (it's needed because we manipulate with container root filesystem and it's so dangerous):



vzctl stop 19484

4.  We must add hook scripts for mount and umount this disk to container root mount point.

Please create file /etc/vz/conf/19484.mount with following content:
#!/bin/bash 
ploop mount -m /vz/root/$VEID/mnt  /storage/$VEID/DiskDescriptor.xml
And file  /etc/vz/conf/19484.umount with following content (we must add exit 0 because at first start vzctl will tries to umount disk and we got an error):


#!/bin/bash 
ploop umount /storage/$VEID/DiskDescriptor.xml
exit 0
Add execution flag to both files:
chmod +x /etc/vz/conf/19484.mount /etc/vz/conf/19484.umount
5. Start container:
vzctl start 19484
At first startups you must got error message because vzctl can't unmount additional disk at startup (so strange feature, really! What reason to umount disks at startup?) . It's ok, you can sefely ignore. At next start/restart you did not got any errors.   
Error in ploop_umount_image (ploop.c:1579): Image /storage/19484/additional_disk_image is not mounted
At second and next start's you can see no error:
vzctl start 19484
Starting container...
Opening delta /vz/private/19484/root.hdd/root.hdd
Adding delta dev=/dev/ploop18662 img=/vz/private/19484/root.hdd/root.hdd (rw)
/dev/ploop18662p1: clean, 36570/144288 files, 228564/576251 blocks
Mounting /dev/ploop18662p1 at /vz/root/19484 fstype=ext4 data='balloon_ino=12,'
Opening delta /storage/19484/additional_disk_image
Adding delta dev=/dev/ploop50284 img=/storage/19484/additional_disk_image (rw)
Mounting /dev/ploop50284p1 at /vz/root/19484/mnt fstype=ext4 data='balloon_ino=12,'
Container is mounted
Adding IP address(es): 78.47.76.28
Setting CPU units: 1000
Container start in progress...
Check new disk in container:
vzctl exec 19484 'df -h'
Filesystem         Size  Used Avail Use% Mounted on
/dev/ploop18662p1  2.2G  858M  1.3G  41% /
/dev/ploop50284p1  9.9G  164M  9.2G   2% /mnt
none               136M  4.0K  136M   1% /dev
none                28M 1020K   27M   4% /run
none               5.0M     0  5.0M   0% /run/lock
none                52M     0   52M   0% /run/shm
none               100M     0  100M   0% /run/user
It's important, you don't need any quota setup because ploop is complete filesystem and it's limited by standard linux mechanic like native hard drive.

Mounting additional disk as read only

If you want you can mount additional disk as read only. You must add -r flag to ploop mount command.

In read only case you will see something like this while containers starts:
vzctl start 19484
Starting container...
Opening delta /vz/private/19484/root.hdd/root.hdd
Adding delta dev=/dev/ploop18662 img=/vz/private/19484/root.hdd/root.hdd (rw)
/dev/ploop18662p1: clean, 36570/144288 files, 228582/576251 blocks (check in 4 mounts)
Mounting /dev/ploop18662p1 at /vz/root/19484 fstype=ext4 data='balloon_ino=12,'
Opening delta /storage/19484/additional_disk_image
Adding delta dev=/dev/ploop50284 img=/storage/19484/additional_disk_image (ro)
Mounting /dev/ploop50284p1 at /vz/root/19484/mnt fstype=ext4 data='balloon_ino=12,' ro
Container is mounted
Adding IP address(es): 78.47.76.28
Setting CPU units: 1000
Container start in progress...

понедельник, 18 ноября 2013 г.

OpenVZ DiskDescriptor.xml - что есть что?

<?xml version="1.0"?>
<Parallels_disk_image>
  <Disk_Parameters>
    <Disk_size>8388608</Disk_size>
    <Cylinders>8322</Cylinders>
    <Heads>16</Heads>
    <Sectors>63</Sectors>
    <Padding>0</Padding>
  </Disk_Parameters>
  <StorageData>
    <Storage>
      <Start>0</Start>
      <End>8388608</End>
      <Blocksize>2048</Blocksize>
      <Image>
        <GUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</GUID>
        <Type>Compressed</Type>
        <File>root.hdd</File>
      </Image>
    </Storage>
  </StorageData>
  <Snapshots>
    <TopGUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</TopGUID>
    <Shot>
      <GUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</GUID>
      <ParentGUID>{00000000-0000-0000-0000-000000000000}</ParentGUID>
    </Shot>
  </Snapshots>
</Parallels_disk_image>

Что же есть из себя 5fbaabe3-6958-40ff-92a7-860e329aab41? Не понятно! Это не GUID таблицы GPT,  которую использует ploop потому что:

 cat /vz/private/19484/root.hdd/DiskDescriptor.xml|grep UID -i
        <GUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</GUID>
    <TopGUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</TopGUID>
      <GUID>{5fbaabe3-6958-40ff-92a7-860e329aab41}</GUID>

Обойдем все диски и получим из GPT GUID: 
for i in `find /dev/ploop*|egrep -v 'p1$'`;do sgdisk -p $i |grep GUID;done
Disk identifier (GUID): A821C1C0-DB6E-4F32-ABC5-D05B7CF9A1DE
Disk identifier (GUID): BC1A5685-36FE-47E4-96E8-240307329FAF
Disk identifier (GUID): AA41E391-374A-44E3-A46C-FF32435131F9
Disk identifier (GUID): 113F3E0A-AE6A-4DB7-B68A-FC3FA05230B6
Disk identifier (GUID): 747F78F7-2A98-49D0-8D7E-98910EB282D3
Disk identifier (GUID): 50D6C777-0FEA-401E-86D2-15F4AA853605
Disk identifier (GUID): 099821D1-9ABF-4183-879F-107602ADA5D7
Disk identifier (GUID): B1C96257-86A2-4A82-8391-8F7A30EA7BAE
Disk identifier (GUID): 61D8174B-0FF2-4E23-94E2-4CD8C887FEF9
Problem reading disk in BasicMBRData::ReadMBRData()!
Warning! Read error 22; strange behavior now likely!
Warning! Read error 22; strange behavior now likely!
Disk identifier (GUID): 47F93EC9-EAFD-4349-B82D-040B1C15517B
Disk identifier (GUID): C33B4D83-7D0E-45E1-B2EB-68EDE2BEBB7A
Disk identifier (GUID): 82B84F3A-0538-4ADB-9467-699E17E87DB9
А также при этом это не UUID раздела созданного на GPT диске ploop:
for i in `find /dev/ploop*|egrep -v 'p1$'`;do blkid ${i}p1;done
/dev/ploop10267p1: UUID="bc34c9db-04f8-4c43-b180-210560e0bf50" TYPE="ext4"
/dev/ploop14204p1: UUID="c3b4888a-22a5-4025-b37f-d61904b16567" TYPE="ext4"
/dev/ploop18546p1: UUID="b2aa615b-8375-4a1f-8bf9-1756696d6718" TYPE="ext4"
/dev/ploop18662p1: UUID="b8ccbf07-85fe-44d3-bbc4-6593a3a0c872" TYPE="ext4"
/dev/ploop22367p1: UUID="88829ca9-e1b5-4499-94fe-46d987055368" TYPE="ext4"
/dev/ploop35145p1: UUID="b9370d59-fbad-4e15-b559-2c4af5f4a254" TYPE="ext4"
/dev/ploop38462p1: UUID="189bbe9e-20a2-4b09-8e61-1bf30a4a89f2" TYPE="ext4"
/dev/ploop41650p1: UUID="cb56f5a8-5e47-4ea4-b9bf-bd8e5b8578ff" TYPE="ext4"
/dev/ploop41997p1: UUID="4f53649c-683e-4a31-baea-87a446834f02" TYPE="ext4"
/dev/ploop57837p1: UUID="23028f1d-60de-4d7d-adf9-8466dbb1ff45" TYPE="ext4"
/dev/ploop57849p1: UUID="4f8bf47b-2259-4e60-9f69-bf4828740ee4" TYPE="ext4" 

Не связывайтесь с фондом DST и товарищами серии Мильнера! Никогда!

Вот Вам отличная статья на тему "почему": http://habrahabr.ru/company/roem/blog/193488/

Так кто же такие DevOps?

Вот лучшее объяснение на мой взгляд: http://puppetlabs.com/blog/what-is-a-devops-engineer

P.S. в Wiki бредятина написана, никакого отношения к реально жизни вообще:)

Отличный материал для изучения языка Go по примерам

пятница, 15 ноября 2013 г.

Проблемы с unordered_map в C++/11 на Debian Wheezy

Вот решил оптимизировать свой код, а он мне в ответ сегфолтами:
(gdb) core core
[New LWP 13007]
[New LWP 13002]
[New LWP 13006]
warning: Can't read pathname for load map: Input/output error.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./fastnetmon'.
Program terminated with signal 11, Segmentation fault.
#0  0x000000000040e80a in std::__detail::_Hash_code_base<unsigned int, std::pair<unsigned int const, map_element>, std::_Select1st<std::pair<unsigned int const, map_element> >, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node<std::pair<unsigned int const, map_element>, false> const*, unsigned long) const ()
То есть, ошибка где-то во внутренностях реализации хширования unordered_map.

А вот такой бэктрейс:
#0  0x000000000040e80a in std::__detail::_Hash_code_base<unsigned int, std::pair<unsigned int const, map_element>, std::_Select1st<std::pair<unsigned int const, map_element> >, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node<std::pair<unsigned int const, map_element>, false> const*, unsigned long) const ()
(gdb) bt
#0  0x000000000040e80a in std::__detail::_Hash_code_base<unsigned int, std::pair<unsigned int const, map_element>, std::_Select1st<std::pair<unsigned int const, map_element> >, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node<std::pair<unsigned int const, map_element>, false> const*, unsigned long) const ()
#1  0x000000000040b485 in std::_Hashtable<unsigned int, std::pair<unsigned int const, map_element>, std::allocator<std::pair<unsigned int const, map_element> >, std::_Select1st<std::pair<unsigned int const, map_element> >, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>::_M_bucket_index(std::__detail::_Hash_node<std::pair<unsigned int const, map_element>, false>*) const ()
#2  0x00000000004093f8 in std::_Hashtable<unsigned int, std::pair<unsigned int const, map_element>, std::allocator<std::pair<unsigned int const, map_element> >, std::_Select1st<std::pair<unsigned int const, map_element> >, std::equal_to<unsigned int>, std::hash<unsigned int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>::count(unsigned int const&) const ()
#3  0x0000000000405c45 in parse_packet(unsigned char*, pcap_pkthdr*, unsigned char const*) ()
#4  0x0000000000406a8f in ulog_main_loop() ()
#5  0x0000000000417a63 in _ZNSt12_Bind_simpleIFPFvvEvEE9_M_invokeIJEEEvSt12_Index_tupleIJXspT_EEE ()
#6  0x00000000004179b3 in std::_Bind_simple<void (*())()>::operator()() ()
#7  0x0000000000417908 in std::thread::_Impl<std::_Bind_simple<void (*())()> >::_M_run() ()
#8  0x00007ff89362c400 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ff893a8eb50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#10 0x00007ff892e2ea7d in clone () from /lib/x86_64-linux-gnu/libc.so.6
#11 0x0000000000000000 in ?? ()

Включение крэш дампов процессов для PHP-FPM на Debian Wheezy

Открываем настройки пула (обычно: /etc/php5/fpm/pool.d/www.conf ) и задаем там параметр:
rlimit_core = unlimited

Профайлинг кода на С/С++ на Linux

Довольно прост как и все на Linux :)

Для начала нужно для g++/gcc добавить флаги для сборки: -g -pg

После этого запустить программу, погонять приличное время и обнаружить в папке программы файлик gmon.out. Который в свою очередь можно прочесть программой:  gprof ./имя_отлаживаемой_программы.


Еще одна причина использовать clang++ вместо g++


Сравните выдачу g++ при малюсенькой ошибке в шаблонах:
ip_lookup.cpp: In function ‘void insert_prefix_bitwise_tree(tree_leaf*, std::string, int)’:
ip_lookup.cpp:116:45: error: no match for ‘operator&’ in ‘std::cout.std::basic_ostream<_CharT, _Traits>::operator<< <char, std::char_traits<char> >(netmask_as_int) & (1 << i)’
ip_lookup.cpp:116:45: note: candidates are:
In file included from /usr/include/c++/4.7/ios:43:0,
                 from /usr/include/c++/4.7/ostream:40,
                 from /usr/include/c++/4.7/iostream:40,
                 from ip_lookup.cpp:1:
/usr/include/c++/4.7/bits/ios_base.h:77:3: note: std::_Ios_Fmtflags std::operator&(std::_Ios_Fmtflags, std::_Ios_Fmtflags)
/usr/include/c++/4.7/bits/ios_base.h:77:3: note:   no known conversion for argument 1 from ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ to ‘std::_Ios_Fmtflags’
/usr/include/c++/4.7/bits/ios_base.h:117:3: note: std::_Ios_Openmode std::operator&(std::_Ios_Openmode, std::_Ios_Openmode)
/usr/include/c++/4.7/bits/ios_base.h:117:3: note:   no known conversion for argument 1 from ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ to ‘std::_Ios_Openmode’
/usr/include/c++/4.7/bits/ios_base.h:155:3: note: std::_Ios_Iostate std::operator&(std::_Ios_Iostate, std::_Ios_Iostate)
/usr/include/c++/4.7/bits/ios_base.h:155:3: note:   no known conversion for argument 1 from ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ to ‘std::_Ios_Iostate’
In file included from ip_lookup.cpp:96:0:
/usr/include/c++/4.7/bitset:1418:5: note: template<long unsigned int _Nb> std::bitset<_Nb> std::operator&(const std::bitset<_Nb>&, const std::bitset<_Nb>&)
/usr/include/c++/4.7/bitset:1418:5: note:   template argument deduction/substitution failed:
ip_lookup.cpp:116:45: note:   ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ is not derived from ‘const std::bitset<_Nb>’



И выдачу clang (он ее еще посдсветил!!!):
clang ip_lookup.cpp -g -pg
ip_lookup.cpp:116:36: error: invalid operands to binary expression ('__ostream_type'
      (aka 'basic_ostream<char, std::char_traits<char> >') and 'int')
        std::cout<< netmask_as_int & (1 << i);
        ~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~
/usr/include/c++/4.6/bits/ios_base.h:76:3: note: candidate function not viable: no known conversion from '__ostream_type' (aka
      'basic_ostream<char, std::char_traits<char> >') to 'std::_Ios_Fmtflags' for 1st argument;
  operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
  ^
/usr/include/c++/4.6/bits/ios_base.h:116:3: note: candidate function not viable: no known conversion from '__ostream_type' (aka
      'basic_ostream<char, std::char_traits<char> >') to 'std::_Ios_Openmode' for 1st argument;
  operator&(_Ios_Openmode __a, _Ios_Openmode __b)
  ^
/usr/include/c++/4.6/bits/ios_base.h:154:3: note: candidate function not viable: no known conversion from '__ostream_type' (aka
      'basic_ostream<char, std::char_traits<char> >') to 'std::_Ios_Iostate' for 1st argument;
  operator&(_Ios_Iostate __a, _Ios_Iostate __b)
  ^
/usr/include/c++/4.6/bitset:1408:5: note: candidate template ignored: failed template argument deduction
    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y)

Версии (Debian Wheezy):
clang -v
Debian clang version 3.0-6.2 (tags/RELEASE_30/final) (based on LLVM 3.0) 
gcc  --version
gcc (Debian 4.7.2-5) 4.7.2

понедельник, 11 ноября 2013 г.

Использование go на CentOS 5 и 6

На удивление фича статической компиляции используемая в языке Go дала огромные преимущества - будучи скомпилировал на CentOS 6 он отлично и без каких-либо проблем вообще запустился на CentOS 5!!! :)

[[email protected] ~]# cat /etc/issue
CentOS release 5.10 (Final)
Kernel \r on an \m
[[email protected] ~]# uname -a
Linux ovz.fastvps.ru 2.6.32-042stab079.6 #1 SMP Mon Aug 26 19:47:50 MSK 2013 x86_64 x86_64 x86_64 GNU/Linux
[[email protected] ~]# file -s ./hello
./hello: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), statically linked, not stripped
[[email protected] ~]# ./hello
hello, world 

воскресенье, 10 ноября 2013 г.

connect() to unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream

Поймали вот такое чудо на высоконагруженном сайт:
2013/11/09 20:53:39 [error] 21526#0: *10769438 connect() to unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: xx.yy.zz.kk, server: xxx.ru, request: "GET /...  HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "xxx.ru", referrer: "http://xxxx.ru/"

Google сразу подкинул много фиксов: http://stackoverflow.com/questions/10470109/error-502-in-nginx-php5-fpm  https://www.ruby-forum.com/topic/4406778 и прочие.


Итог их сводится к тому - что при очень высокой нагрузке Nginx начинает вести себя с бэкэндом крайне непредсказуемо. Поэтому предпочтительно использование tcp сокетов, несмотря на то, что они чуть-чуть медленнее. 

пятница, 8 ноября 2013 г.

Установка samba сервера на Debian 7 Squeeze

В статье будет рассмотрено использование SAMBA как хранилища файлов в режиме "только чтение".

Стягиваем репозитории:
apt-get update -y

Ставим samba сервер:
apt-get install -y samba samba-common-bin

Также для тестов ставим клиент:
apt-get install -y smbclient

Соглашаемся с именем рабочей группы "WORKGROUP", далее оказываемся от "Modify smb.conf to use WINS settings from DHCP?".

Убеждаемся, что samba запустилась и слушает 139 и 445 порты:
netstat -lnpt | grep smb
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 11104/smbd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 11104/smbd

Теперь самбу нужно сконфигурировать:
vi /etc/samba/smb.conf

Там в самом низу находим заголовки "[printers]" и "[print$]" и полностью комментируем как заголовки, так и содержимое блока диезом (#). Тоже самое делаем с блоком [homes] (отключаем шары для юзеров системы).

А теперь в самый низ добавляем нашу шару:
[fileserver]
comment = Some files
read only = yes
locking = no
path = /var/smbshare
guest ok = yes
Или если требуется запись: read only = no. guest ok дает доступ любому юзеру. Если хотите разрешите заданному юзеру: valid users = имя_системного_юзера. А потом задать ему повторно пароль: smbpasswd -a megaplan (пароль будет отличаться от системного, так используются иные механизмы)

Создаем папку для хранения файлов:
mkdir /var/smbshare

Кладем тестовый файл в папку:
touch /var/smbshare/testfile

Перезапускаем самбу:
/etc/init.d/samba restart

Теперь попробуем запросить листинг ресурсов, доступных на нашем сервере посредством smbclient:
smbclient -L xx.xx.xx.xx -N
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.2.5]

Sharename Type Comment
--------- ---- -------
fileserver Disk Some files
IPC$ IPC IPC Service (test server)
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.2.5]

Server Comment
--------- -------
test test server

Workgroup Master
--------- -------
WORKGROUP


Теперь подключаемся к ресурсу fileserver и пробуем скачать файл:
smbclient \\\\xx.xx.xx.xx\\fileserver -N
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.2.5]
smb: \> dir
. D 0 Tue Nov 9 02:40:35 2010
.. D 0 Tue Nov 9 02:39:13 2010
testfile 0 Tue Nov 9 02:40:35 2010

34286 blocks of size 16777216. 31219 blocks available
smb: \> get testfile
getting file \testfile of size 0 as testfile (0.0 kb/s) (average 0.0 kb/s)
smb: \>


Ну вот и все :)

По материалам: http://linux.byexamples.com/archives/99/access-windows-through-samba-using-smbclient/

среда, 6 ноября 2013 г.

Установка Adobe Crossdomain Policy силами nginx

Свитч D-Link DXS-3600-32S опыт тестирования

Друзья!

Кому лень читать - НЕ ВЗДУМАЙТЕ КУПИТЬ ЭТОТ УЖАС!!!! 

Сразу оговорюсь - речь про 32х портовый SFP+ (10 гигабит) оптический свитч производства D-Link.

Мы почти месяц тестировали данное устройство (хочется сказать что-то обидное про этот чудесный 10 гигабитный свич). Такого феерического фейерверка багов за 10 тысяч евро мы не видели ни разу.

У нас была ревизия А, так вот - оно чуть менее непотребно чем полностью. Все жалобы на откровенную неработоспособность тривиальнейших фич - "обратитесь в сервис для замены устройства".

Это пол беды - даже заменив устройство на более-менее удачную версию железа B Вы все равно огребете кучу фич в стиле "ой, а эта фича заявлена, но будет только в прошивке через полгода". Вот, зацените: http://forum.dlink.ru/viewtopic.php?f=2&t=162528

Да и вообще поиск по модели свича несет немыслимое число лулзов.

Друзья! НИКОГДА, НИКОГДА не смотрите в сторону этого дивайса. Такого откровенного плевка в потребителей на моей практике (не сильно короткой, к слову) не допускала ни единая компания, даже производящая роутеры за 500 рублей.

Чем заменить? Смотрите на продукцию Extreme серии x670 (почти месяц очень серьезных тестов и пара мелких неудобств), самое смешное, что стоит она дешевле, а уровень надежности и число фич - просто поражают (кто хочет реальный подробный фидбэк - в комментарии, попробуем свой опыт формализовать). 

вторник, 5 ноября 2013 г.

Roadmap RHEL 7, куча всяких ништяков!

http://rhsummit.files.wordpress.com/2012/03/burke_rhel_roadmap.pdf

Кратко:

  1. Будет возможность апгрейда с RHEL 6 без переустановки! 
  2. KVM Exceptional features – Same OS for the host/guest
  3. Production ready LXC!
  4. Поддержка libteam! Новая, суперская реализация bonding! 
  5. Systemd - и сокращение времени загрузки вдвое!
  6. Большая работа по поддержке ARM в  Fedora!
  7. Поддержка создания RAID 4,5,6 силами LVM
  8. Новая реализация LVM снапшотов
  9. libStorageMgmt - API управления внешними системам хранения
  10. Полная поддержка BTRFS
  11. Официальная поддержка ext4 размером до 16 Тб
  12. Официальная поддержка XFS до 500 Тб
  13. Официальная поддержка GFS2 до 250 ТБ
  14. Переход на grub2 (наконец-то таки!!!)
  15. Centralized management of SSH Keys – Capability to deliver user's ssh public key to servers. Ну прямо праздник какой-то!
  16. Поддержка С++11 компиляторами!
  17. IPset искаропки
  18. Firewalld - крутая настройка над iptables! Велкам: https://fedoraproject.org/wiki/FirewallD?rd=FirewallD/ но возможно ее в RHEL7 не будет, только в Fedora 18.
  19. Еще много чего :)

понедельник, 4 ноября 2013 г.

Фича системы управления конфигурациями Chef

upload The upload argument is used to upload one or more cookbooks (and any files that are associated with those cookbooks) from a local repository to the server. Only files that do not already exist on the server will be uploaded.

Это же волшебно! Хотеть в puppet!

суббота, 2 ноября 2013 г.

Хорошая книга по сетям TCP/IP - как она выглядит?

Уже довольно долгое время я пытаюсь найти книгу, с помощью которой смогу собрать воедино все свои урывочные знания по сетям.

Одной из первых книг в моей библиотеке по сетям была книга Олифер/Олифер, которая на долгие годы отбила малейшее желание изучать сети - ужасающе количество совершенно устаревших протоколов, не нужных подробностей и одностраничное описание TCP/UDP и прочих реально важных и нужных в ежедневной практике протоколов.

Одной из следующих попыток компенсировать свои не особо четкие познания о сетях были многократные попытки купить книги Таненбаума. Но при малейшем осмотре становится ясно - это тот же самый Олифер/Олифер, только от более именитого автора. Опять слишком много информации о GSM/ISDN/ATM и прочих уже канувших в лету вещах и как всегда мало информации о сетях сегодняшнего или хотя бы вчерашнего дня.

Где-то через 3 года мне на глаза попалась книга TCP Illustrated, более подробно Вы можете прочесть про нее на вики: http://en.wikipedia.org/wiki/TCP/IP_Illustrated

В этом трехтомнике, на мой взгляд, наиболее интересна первая книга, потому что там дается очень хороший набор информации по базовым протоколам (ее содержание Вы можете найти на Amazon). Вторая книга зовется "реализации" и там на примере стека BSD4 с максимумом подробностей рассказывается, как все протоколы работают на практике. Эту книгу можно рекомендовать всем желающим познать "в идеале", большинству же подробности реализации вряд ли будут интересны. В третьей книге рассматриваются совершенно уж футуристические вещи, например Transactional TCP, о котором вряд ли кто из читателей слышал в наши дни, поэтому интересна она лишь с исторической точки зрения :)

Отдельно стоит упомянуть автора, на мой взгляд, Ричард Стивенс - один из лучших авторов книг по программированию под Linux/UNIX и его книги все без исключения заслуживают Вашего внимания.

Ну и да - все книги серии можно найти на Amazon.com :)

пятница, 1 ноября 2013 г.

Сборка resize2fs из комплекта e2fsprogs

Зачем? Для работы ploop на OpenVZ/CentOS 5. Для CentOS 6 в репозитории OpenVZ поставляется спец пакетик с обновленной (относительно системы) версией resize2fs:
rpm -ql e2fsprogs-resize2fs-static-1.42.3-3.el6.1.ovz.x86_64
/usr/libexec/resize2fs
Слинкован он при этом статически, без внешних зависимостей:
ldd /usr/libexec/resize2fs
linux-vdso.so.1 =>  (0x00007fff29eec000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f9fb7bee000)
libc.so.6 => /lib/libc.so.6 (0x00007f9fb785b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9fb7e15000)

Попробуем сделать тоже самое, но для OpenVZ на CentOS 5:
yum install -y gcc make
cd /usr/src
wget -Oe2fsprogs-1.42.3.tar.gz 'http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.42.3/e2fsprogs-1.42.3.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fe2fsprogs%2Ffiles%2Fe2fsprogs%2Fv1.42.3%2F&ts=1383316431&use_mirror=citylan'
tar -xf e2fsprogs-1.42.3.tar.gz
cd e2fsprogs-1.42.3/
./configure --prefix=/opt/e2fsprogs  --disable-debugfs --disable-defrag --disable-imager
make install

В итоге в папочке /opt/e2fsprogs мы обнаружим статически слинкованный resize2fs:
ldd /opt/e2fsprogs/sbin/resize2fs
linux-vdso.so.1 =>  (0x00007fff7ad85000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003201800000)
libc.so.6 => /lib64/libc.so.6 (0x0000003201000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003200c00000)
Который можно закинуть на CentOS 5 ноду, чтобы добиться корректной работы ploop на CentOS 5.

Ради теста перекинул на другую машину и все заработало на ура:
./resize2fs
resize2fs 1.42.3 (14-May-2012)
Usage: ./resize2fs [-d debug_flags] [-f] [-F] [-M] [-P] [-p] device [new_size]

Но итог всей затеи - ploop на CentOS 5 не особо удачный:
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.  Use tune4fs -c or -i to override.
tune2fs 1.39 (29-May-2006)
tune2fs: Filesystem has unsupported feature(s) while trying to open /dev/ploop26472p1
Couldn't find valid filesystem superblock.
Error in run_prg_rc (util.c:289): Command tune2fs -ouser_xattr,acl /dev/ploop26472p1  exited with code 1
Unmounting device /dev/ploop26472
Failed to create image: Error in run_prg_rc (util.c:289): Command tune2fs -ouser_xattr,acl /dev/ploop26472p1  exited with code 1 [24]
Destroying container private area: /vz/private/7777
Creation of container private area failed
Надо менять в ploop вызовы tune2fs на tune4fs, так как в CentOS 5 пакеты и тулзы для экст2/3 и экст4 - отдельные.

Миграция Debian 7 Wheezy на systemd

Зачем? Попробовать systemd!

Итак, все очень просто:
apt-get update -y
apt-get install -y systemd

После этого нужно явно указать инит через параметры grub:
$EDITOR /etc/default/grub 
И приводим строку к виду GRUB_CMDLINE_LINUX_DEFAULT:
GRUB_CMDLINE_LINUX_DEFAULT="тут_у_вас_ранее_были_параметры_сохраните_их_тут init=/lib/systemd/systemd"

После этого обновляем конфигурацию grub:
update-grub
Зачем такие сложности с grub? Дело в том, что в Debian есть проблемы с пакетом systemd-sysv, он конфликтует с пакетом существующего загрузчика init, который в свою очередь невозможно (возможно, конечно, в теории, но вряд ли после этого Вы сможете нормально пользоваться сервером) удалить/заменить через пакетный менеджер.

И перезагружаемся:
shutdown -r now 

Если все загрузилось корректно, убеждаемся в этом:
ps aux|grep systemd
root         1  0.7  0.0  40984  3924 ?        Ss   11:45   0:01 /lib/systemd/systemd
root       312  0.0  0.0  34772  1504 ?        Ss   11:45   0:00 /lib/systemd/systemd-journald
105        853  0.0  0.0  29800  1456 ?        Ss   11:46   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root       958  0.0  0.0  34392  1588 ?        Ss   11:46   0:00 /lib/systemd/systemd-logind
root      1119  0.0  0.0   9232   880 pts/0    S+   11:48   0:00 grep systemd