вторник, 27 декабря 2011 г.

липкий смит

Часто спрашивают есть ли какой-то список fastpath'ов для SMIT'а. Приходится пожимать плечами и отсылать к гуглу.
Вот загуглил сам в кои то веки.

Список, ясное дело, неполный. Но у вас всегда остается кнопка F8 как средство узнать fastpath диалога, в котором вы находитесь.

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

Огромное количество людей пользуется интерпретатором bash. Чуть меньше людей знают про существование bash_completion (спасибо, Дмитрий). Собственно вот и задача: заставить bash дополнять команду smit необходимым fastpath'ом. Например так:

bash#: smit ls[TAB]

lsattr    lsfs      lslv      lsmntdsk  lsrole    lsvg      lsvg2
lsbackvg  lsgroup   lsmksysb  lspv      lsuser    lsvg1     
bash#: smit ls

или

bash#:  smit ins[TAB]
bash#:  smit install[TAB][TAB]
install            install_bundle     install_update     
install_all        install_latest     installed_license 

Итак, нам понадобится bash (я беру его здесь) и bash_completion (дают тут).

Предположим, мы скачали bash-4.2-5.aix5.1.ppc.rpm и положили в /tmp нашего AIX.
Поставим его:

ksh#:  rpm -ihv /tmp/bash-4*
bash                        ##################################################
ksh#:

Здесь же, в /tmp, у нас лежит bash-completion-1.3.tar.bz2.
Из всего архива нам понадобится только скрипт bash_completion

ksh#: cd /tmp
ksh#: bunzip2 bash-completion-1.3.tar.bz2
ksh#: tar -xvf bash-completion-1.3.tar
ksh#: cp /tmp/bash-completion-1.3/bash_completion /etc

Вот и вся установка. Или почти вся - еще надо заставить скрипт bash_completion запускаться при старте bash. README в нашем /tmp/bash-completion-1.3 говорит:


INSTALLATION

------------

The easiest way to install this software is to use a package; it is available

in many operating system distributions.  The package's name is usually

bash-completion.  Depending on the package, you may still need to source it

from either /etc/bashrc or ~/.bashrc (or any other file sourcing those). You

can do this by simply using:

# Use bash-completion, if available
if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

Звучит логично - ведь при старте bash выполняется .bashrc. То есть наша задача положить строки 

if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

в файл .bashrc в домашнем каталоге нужного пользователя (у нас это как обычно root =).
Обратите внимание на пробел между "." и "/etc/bash_completion" - он есть!

Вы можете проверить исполнение скрипта при старте bash просто запустив команду set до и после старта bash. Во втором случае set будет выдавать много функций типа:

quote_readline () 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

Если bash при старте не выдал ошибок и set показывает новые переменные и функции, то bash_completion успешно проинициализировался. Ура!  Если нет - не ура - пишите, разберемся.

Официальный мануал по bash в разделе

8.6 Programmable Completion


рассказывает что при запуске bash_completion выполняется все что лежит в каталоге /etc/bash_completion.d/

Это так называемые COMPSPEC'и - или функции, создающие completion-списки для разных программ. Ксати, когда мы расTARили bash-completion-1.3.tar в /tmp/bash-completion-1.3 появился каталог completions с COMPSPEC'ами для разных утилит - нужные вам можно задействовать скопировав их в /etc/bash_completion.d/



Нам же нужно написать свой COMPSPEC для smit. Но перед этим выполним некоторые подготовительные шаги:



bash#: mkdir /etc/bash_completion.d

bash#: mkdir /etc/bash_completion.d/smit

Качаем файл smit_fastpaths (в нем список fastpath'ов в одну строку, разделенных пробелами), и помещаем его в /etc/bash_completion.d/smit. Напомню, что все в каталоге /etc/bash_completion.d будет исполняться, и, поместив файл с fastpath'ами в подкаталог,  мы защитили его от этого. Вы можете дополнять этот файл своими fastpath'ами.

Далее пишем собственно COMPSPEC и кладем его в /etc/bash_completion.d:
(название любое, право на исполнение не требуется)

bash#: cat /etc/bash_completion.d/smit.sh
_smit()
{
        local args
        args=$(cat /etc/bash_completion.d/smit/smit_fastpaths)
        COMPREPLY=( $(compgen -W "${args}" "${COMP_WORDS[COMP_CWORD]}") )
}
complete -F _smit smit 
bash#:

Думаю нужны некоторые пояснения.
Согласно Bash-Variables:

COMPREPLY
An array variable from which Bash reads the possible completions generated by a shell function invoked by the programmable completion facility
То есть сюда генерируется список дополнений. Массив.

COMP_WORDS
An array variable consisting of the individual words in the current command line. The line is split into words as Readline would split it, using COMP_WORDBREAKS as described above. This variable is available only in shell functions invoked by the programmable completion facilities
А тут уже введенная пользователем строка из массива слов.



COMP_CWORD
An index into ${COMP_WORDS} of the word containing the current cursor position. This variable is available only in shell functions invoked by the programmable completion facilities
Номер слова в COMP_WORDS, на котором стоит курсор в командной строке.


complete

          complete [-abcdefgjksuv] [-o comp-option] [-DE] [-A action] [-G globpat] [-W wordlist]
          [-F function] [-C command] [-X filterpat]
          [-P prefix] [-S suffix] name [name ...]
          complete -pr [-DE] [name ...]

Specify how arguments to each name should be completed. Собственно дополняет введенную команду одним из способов. У нас name - это smit, а способ дополнения - функция _smit().



compgen

          compgen [option] [word]
Generate possible completion matches for word according to the options, which may be any option accepted by the complete builtin with the exception of -p and -r, and write the matches to the standard output. Генерирует список дополнений. Ключи те же. Мы используем -W с указанием всего списка вариантов дополнения из файла smit_fastpaths.

Кажется все! Осталось перезапустить shell.


Примерно таким же макаром вы теперь можете дополнять любые команды.
Искушенный читатель может сказать, что нам вовсе не нужен скрипт bash_completion из TAR архива. И будет прав! По сути, все, что приносит нам этот скрипт - это функции для более качественного разбора командной строки, ну и еще несколько мелочей (не поленитесь, загляните в него). Кроме того, это уже написанные COMPSPEC'и для целой кучи команд. То есть мы с вами рассмотрели как добавить функционал дополнения smit в общем случае (кстати, файл smit_fastpaths читатся каждый раз при нажатии [TAB], а значит его можно менять не перезапуская bash).
Если вы решили не пользоваться благами цивилизации в виде bash_completion, то можете просто написать в $HOME/.bashrc что-то вроде:


list=$(cat /home/smit_fastpaths)
complete -W "$list" smit


Это, безусловно, очень статичный метод, но вполне рабочий (не проверял =)


P.S. Напрашиваются дополнения к командам в VIOS'е. Если вам интересно - пишите, попробуем реализовать.


Читать дальше......

суббота, 17 декабря 2011 г.

AMD - теперь и на Power7.

Давайте построим логическую цепочку:

AMS - Active Memory Sharing
AME - Active Memory Expansion
AMD - Active Memory Deduplication   тадаааам!

Оказывается уже с октября AMD существует, а мы (во всяком случае я) ни сном ни духом.

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

Иными словами, было так:

...а стало так!


Как видно из картинок, AMD работает как часть AMS, чего и следовало ожидать. Жаль, что нельзя применить эту фичу на всю память, а не только на пул AMS.

Как это работает?

Гипервизор собирает со всех страниц так называемые сигнатуры(signatures) или отпечатки пальцев (fingerprints) в специальную таблицу, анализирует ее и призывает к ответу всех, у кого отпечатки совпадают.


Дедуплицированная страница становится read-only, а когда какому-то из LPAR'ов захочется ее изменить, произойдет расслоение.

Слава богам, что в этот раз привлекать VIOS не стали, хватает одного гипервизора. Правда есть намек на небольшой overhead по CPU в LPAR'ах - якобы именно они предоставляют гипервизору fingerprint'ы.

Администратору также дают управлять размером таблицы AMD от 1/8192 до 1/256 размера пула AMS.

По всей видимости все Power7 машины получат эту функцию с новыми прошивками. Пока же она доступна только в машинах с буквой "C" в тип-модели (например 8202-E4C или 9179-MHC). Для всех остальных еще не вышел firmware level 740.

Требования:


  • PowerVM Enterprise edition  
  • System firmware level 740
  • AIX Version 6: AIX 6.1 TL7, or later 
  • AIX Version 7: AIX 7.1 TL1 SP1, or later  I
  • BM i: 7.14 or 7.2, or later  
  • SLES 11 SP2, or later  
  • RHEL 6.2, or later


P.S. Вот, кстати, официальный анонс.

  • Shared Storage Pools now allows up to four systems to share a common pool of pre-allocated storage. Shared Storage Pools are able to provide quick provisioning and efficient storage utilization for virtualized IBM Power Systems™ workloads. Shared Storage Pools technology can simplify server and storage administration, reduce SAN infrastructure, and provide a framework that allows for easier movement of live workloads across Power® frames.
  • Live Partition Mobility provides a 2X improvement in Live Partition Mobility concurrency.
  • Network Load Balancing balances network traffic across redundant Shared Ethernet Adapters.
  • Active Memory™ Deduplication detects and removes duplicate memory pages to optimize memory usage in Active Memory Sharing configurations.
  • NPIV support for storage provisioning to virtual Fibre Channel HBAs prior to LPAR activation is improved. Virtual Fibre Channel HBAs are more visible to the SAN administrator, which simplifies SAN provisioning and management of virtual machines using NPIV.
Очень печально. Шутка. У меня уже набросан пост про балансировку нагрузки сети в Dual VIOS конфигурации с помощью NIB, а они ее в SEA Failover встроили. Буквы писал, картинки рисовал - все зря...



Читать дальше......

Dual VIOs и сеть.

Думаю, используя виртуальный ввод-вывод в продуктивных lpar'ах, никто даже не задумывается, что VIOs может быть один. Плюсы двух VIO серверов очевидны. Если обойтись без лишних деталей, то их два:

  • Возрастающая надежность виртуальных девайсов
  • Воможность делать maintenance и апдейт одного VIOs не выключая второй - то есть возрастающая доступность LPAR'ов

Хочу рассмотреть здесь лишь один момент в этой связке - сеть.
Для начала попробуем изобразить, что нам нужно:
У нас есть 2 VIOS'а, много LPAR'ов и желание сделать красиво.
Итак, задача выпустить LPAR'ы наружу и понадежнее. Для этих целей можно использовать 2 метода:

1. SEA failover - родной IBM'овский способ научить VIOS'ы решать кто из них сейчас главный. При этом оба SEA бриджа находятся в одном VLAN'е виртуального коммутатора ETHERNET0. Чтобы избежать ARP-шторма, который обязательно случится, если оба SEA будут в активном состоянии, нужно подружить VIOS'ы. Для этого у каждого SEA появляется новый виртуальный адаптер в отдельном VLAN'е - ctl_chan. Дальше в подробности углубляться не будем, лишь посмотрим на картинку.
Безусловно, это смахивает на  HighAvailability кластер (VIOS'ы - узлы, а ctl_chan - hartbeat). Вобщем, так оно и есть, только высокодоступный ресурс здесь один - выход наружу  коммутатора ETHERNET0. А значит мы имеем сказочно-автоматический переезд линка между VIOS'ами при невозможности работы одного из них. В этом подходе сплошные плюсы:
  • Полная автоматика с возможностью ручного управления (за подробностями в комменты)
  • Поддержка тегированного трафика в обе стороны
  • Прозрачность для LPAR'ов
  • Относительно простое конфигурирование
  • Возможность динамического изменения параметров схемы
  • и т.д.
Из незначительных минусов можно назвать отсутствие настроек возврата линка при восстановлении приоритетного канала - возврат всегда будет. И еще один незначительный минус, который не дает мне покоя. Прямо обидно как-то, купил два (четыре) крутых 10Gb адаптера, чтоб толщины канала на все LPAR'ы хватило, а использую только один (два)! Дело в том, что весь коммутатор ETHERNET0 будет ходить в мир только через активный VIOS. Недавно заметил, что я не один сокрушаюсь по этому поводу.





....

Намекал на схему приведенную ниже - Network Interface Backup. Такая картинка позволяет впускать часть хостов через один VIOS и вторую часть через другой.
При таком подходе есть одна но очень большая проблема: при смерти VIOS1 сетка в LPAR1 может не переключиться с ent0 на ent1 сама! И вот почему:
NIB перебрасывает трафик с активного интерфейса на пассивный только в случае, если первый говорит LINK DOWN. А в нашем случае проблема не с ent0 в LPAR1, а с ent0 в VIOS1, то есть в SEA. Надо пинговать ...

to be continued...







Читать дальше......

среда, 7 декабря 2011 г.

Coming soon

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

Например: Здравствуйте, пишет вам %username из %far_far_away_siberia_little_town. Очень волнует меня вопрос, как развернуть Network Installation Manager от начала до конца, прям жизни нет. Хочу AIX лихо по сети устанавливать, как у вас в первом посте и резервно его копировать. Книжка NIM from A to Z уж слишком иностранная.
Читать дальше......

четверг, 1 декабря 2011 г.

lpar_netboot или как не влипнуть в меню SMS


Для начала о насущном.
Загружать lpar'ы по сети при помощи NIM задача грустная. Для меня она превращается в скучнейшую рутину при количестве lpar'ов больше одного. Конечно не сложно включить их как-то так:

hmc: # chsysstate -m <server_name> -r lpar -o on -n <lpar_name> -f <profile_name> -b sms

При условии что названия lpar'ов и их профилей можно перечислить в цикле, становится веселее. Но ведь все еще нужно пойти n раз в SMS и настроить сетевые параметры, а потом запустить процесс загрузки. Грустно и липко

Но! На помощь приходит команда lpar_netboot. 
Правда есть один нюанс: когда вы хотите загрузить lpar по сети, вам нужен вот этот ее вариант:

Usage: Install partition  
lpar_netboot [-v] [-x] [-f] [-i] [-g args] [-E environment [-E ...]] [-T {on|off}] [-A -D | [-D] -l phys_loc | [-D] -m macaddress]  -t ent -s speed -d duplex -S server -G gateway -C client [-K subnetmask] [[-a -B tftp_image_filename]|-B bootp_image_filename]  partition_name profile managed_system

Как видно вам нужен либо ключ -l, которому нужно передать Physical location code сетевого адаптера, либо ключ -m и mac этого адаптера. Напомню, мы говорим о массовой разливке, а значит мы используем виртуальные адаптеры или HEA. Итак, какие есть варианты:

  • Вот тут доказывают, что начиная с релиза HMC 7.2 mac адрес на виртуальную карту (в том числе HEA) можно выставить самому. Поздравляю обладателей HMC 7.7.2 (смайл). Сам об этом не догадывался, но в man по mksyscfg это тоже подтверждают. В графике HMC такой возможности, как всегда, нет. 
  • HMC генерирует маки вполне презскауемо и вполне подряд (Кажется я что-то знал про эти правила, но не помню ничего. Подскажите, кто помнит)
  • Ну уж Physloc для виртуальной сетевухи точно вы сами выбираете. Например: 

          U8233.E8B.10000AP-V102-C2-T1, где
          U8233.E8B.10000AP - тип/модель и серийник машины - у всех одинаково
          102 - lpar ID
          2 - номер виртуального слота адаптера
          1 - номер порта - будет всегда 1 для виртуальной карты(или я не прав?)
  • Кроме того, можно спросить и то и другое у карты вот так:
 Usage: Return macaddress 
lpar_netboot -M -n [-v] [-x] [-f] [-i] [-E environment [-E ...]] [-A] -t ent [-T {on|off}] [-D -s speed          -d duplex -S server -G gateway -C client [-K subnetmask]] partition_name profile managed_system

Например:

hscroot@hmc:~> lpar_netboot -M -A -n -T off -t ent lpar7  normal BENDER
# Connecting to lpar7
# Connected
# Checking for power off.
# Power off the node
# Wait for power off.
# Power off complete.
# Power on lpar7 to Open Firmware.
# Power on complete.
# Getting adapter location codes.
# Type Location Code MAC Address Full Path Name Ping Result Device Type
ent U8203.E4A.654A102-V8-C18-T1 1a19b52f7512 /vdevice/l-lan@30000012 n/a virtual

Здесь нам дают и physloc и mac.

Кажется теперь ничто не мешает нам попробовать создать с десяток lpar'ов и (предполагая, что на NIM'e все готово) поставить туда AIX. Особый шик - тихая установка, но об этом не здесь.

Создадим 10 lpar'ов:

hscroot@hmc:~>  for i in 1 2 3 4 5 6 7 8 9 10; do 
mksyscfg -r lpar -m BENDER -i "name=lpar$i,lpar_id=$(($i + 10)),profile_name=normal,lpar_env=aixlinux,min_mem=512,desired_mem=2048,max_mem=3072,proc_mode=shared,min_proc_units=0.1,desired_proc_units=0.3,max_proc_units=1.0,min_procs=1,desired_procs=1,max_procs=6,sharing_mode=uncap,uncap_weight=128,auto_start=0,boot_mode=norm,max_virtual_slots=120,"virtual_scsi_adapters=${i}1/client//vios1/${i}1/1",\"virtual_eth_adapters=18/0/1///1"; done

Думаю, основные проблемы с пониманием могут быть тут "virtual_scsi_adapters=${i}1/client//vios1/${i}1/1",\"virtual_eth_adapters=18/0/1///1"
За подробностями в man mksyscfg. В примере создается один vscsi и один virtual ethernet. Этого достаточно, чтобы у нас был хотя бы один диск и сеть. Очевидно, и VIOs и NIM уже кем-то настроены (смайл).

Ну и загрузим их:

например так:


hscroot@hmc:~> for i in 1 2 3 4 5 6 7 8 9 10;do
lpar_netboot -l U8203.E4A.654A102-V$(($i + 10))-C18-T1 -T off -t ent -s auto -d auto -S 192.168.1.222 -G 192.168.1.100 -C 192.168.1.$((20 + $i)) lpar$i normal BENDER; done


или так:


hscroot@hmc:~> for i in 1 2 3 4 5 6 7 8 9 10;do
mac=`lpar_netboot -M -A -n -T off -t ent lpar$i normal BENDER | grep ent | head -1 | cut -d' ' -f3`;
lpar_netboot -m $mac -T off -t ent -s auto -d auto -S 192.168.1.222 -G 192.168.1.100 -C 192.168.1.$((20 + $i)) lpar$i normal BENDER; done


Теперь, избавившись от липкой необходимости идти в SMS, мы должны походить по меню установки AIX. Тихая установка победит и это, но в другой раз.

Читать дальше......