Получить список соответствия LV = dm-N

При мониторинге производительности дисковой подсистемы возникает необходимость воспользоваться командой iostat. Она выводит результат по утилизации дисков с использованием символических имёт из ядра вида vd[a-z]N sd[a-z]N и dm-N. Когда речь касается физических дисков например /dev/sdaN тут всё понятно. А вот когда используется LVM то чтобы узнать какоe имя dm-N соответствует какому логическому тому нужно посмотреть какие lv_kernel_major и lv_kernel_minor соответствуют данному dm устройству в ядре. Следующая команда делает это автоматически.

lvs -o lv_name,lv_kernel_major,lv_kernel_minor | while read LVNAME LVKMAJOR LVKMINOR ; do grep '^[ \t]*'${LVKMAJOR}'[ \t]\+'${LVKMINOR}'[ \t]\+' /proc/partitions | awk -v name="${LVNAME}" '{print $4" "name}'; done
dm-7 lv_log
dm-0 lv_root
dm-1 lv_swap
dm-5 empty
dm-6 lv_server_fm-disk0
dm-8 lv_server_fm-disk1
dm-2 lv_vm1_disk0
dm-3 lv_vm2_disk0
dm-4 lv_vm3_disk0

Если нужно получить полные имена то нужно использовать опцию lv_path

# lvs -o lv_path,lv_kernel_major,lv_kernel_minor | while read LVNAME LVKMAJOR LVKMINOR ; do grep '^[ \t]*'${LVKMAJOR}'[ \t]\+'${LVKMINOR}'[ \t]\+' /proc/partitions | awk -v name="${LVNAME}" '{print $4" "name}'; done
dm-7 /dev/vg_v03t/lv_log
dm-0 /dev/vg_v03t/lv_root
dm-1 /dev/vg_v03t/lv_swap
dm-5 /dev/vg_vm/empty
dm-6 /dev/vg_vm/lv_server_fm-disk0
dm-8 /dev/vg_vm/lv_server_fm-disk1
dm-2 /dev/vg_vm/lv_vm1_disk0
dm-3 /dev/vg_vm/lv_vm2_disk0
dm-4 /dev/vg_vm/lv_vm3_disk0

А если полные имена через /dev/mapper то опцию lv_dm_path

# lvs -o lv_dm_path,lv_kernel_major,lv_kernel_minor | while read LVNAME LVKMAJOR LVKMINOR ; do grep '^[ \t]*'${LVKMAJOR}'[ \t]\+'${LVKMINOR}'[ \t]\+' /proc/partitions | awk -v name="${LVNAME}" '{print $4" "name}'; done
dm-7 /dev/mapper/vg_v03t-lv_log
dm-0 /dev/mapper/vg_v03t-lv_root
dm-1 /dev/mapper/vg_v03t-lv_swap
dm-5 /dev/mapper/vg_vm-empty
dm-6 /dev/mapper/vg_vm-lv_server_fm--disk0
dm-8 /dev/mapper/vg_vm-lv_server_fm--disk1
dm-2 /dev/mapper/vg_vm-lv_vm1_disk0
dm-3 /dev/mapper/vg_vm-lv_vm2_disk0
dm-4 /dev/mapper/vg_vm-lv_vm3_disk0

bash script для запуска vncviewer на выбранную из списка виртуалку

Этот баш-скрипт я написал так как был недоволен утилитой Virtual Machine Manager которая имеет ошибку и не поддерживает у меня соединения через ssh туннель и её нужно патчить после каждого обновления. Но главное, что меня раздражает это тормоза работы Virtual Machine Manager так как он получает много зачастую ненужной информации от всех виртуальных машин. Данный скрипт работает сравнительно быстро потому, что запрашивает на сервере только самое необходимое, а именно список запущенных машин и смещение vnc порта для каждой.

#!/bin/bash

  # bash script to connect to virtual machine vnc port (over ssh tunnel)
  # баш скрипт выводит список виртуальных машин и предлагает выбрать с какой соединиться по VNC

function GETVNCPORTS {
  NODE=$1
  echo -e "Reading info from \"${NODE}\"" >&2
  awk -v node="${NODE}" '{print node" "$0}' < <(ssh -T "root@${NODE}" <<'END'
while read -r DOMAIN ; do PORT=`virsh vncdisplay "${DOMAIN}" | sed -e '/^[ \t]*$/d' | awk -F: '{printf "59%02d\n",$2}'`; [ -n "${PORT}" ] && echo "${PORT} ${DOMAIN}"; done < <(virsh list | sed -n '/^-\+$/,/^$/p' | sed -e '/^ *-\+ *$/d' | awk '{print $2}' | sed -e '/^[ \t]*$/d')
END
)
}

# file descriptions IPADDRES<spaces>group1<spaces>group2<spaces>groupN
# файл описывающий все хосты и группы в которые они входят
CONFIG=$(cat <<EOF
10.55.24.156     v03-a v_cluster all
10.55.24.157     v03-b v_cluster all
10.55.24.158     v03-c v_cluster all
10.55.24.159     v03-t           all sergey
10.55.24.253     h01             all
10.55.24.249     s01-0 s_cluster all
10.55.24.251     s01-1 s_cluster all
EOF
)

  HOSTGROUPS=`echo "${CONFIG}" | awk '{for (i=2;i<=NF;i++) {printf("%s\n", $i);}}' | sort -u`

  while [ true ] ; do
    PS3="Type a group number or 'q' to quit: "
    select HOSTGROUP in ${HOSTGROUPS} ; do
      if [ -n "${HOSTGROUP}" ] ; then
        break
      else
        if [[ ${REPLY} =~ [Qq] ]] ; then
          echo -e "Quit."
          exit 0
        fi
      fi
    done

    LOOPLEVEL="1"

    while [ "${LOOPLEVEL}" -eq "1" ] ; do

      FULLLIST=""
      # получить список хостов
      while read HOST1 GROUPNAME ; do
        echo -e "${GROUPNAME}"
        FMT="ssh -L localhost:%d:localhost:%d -N root@%s& pid=\$!;sleep 2;vncviewer localhost:%d;kill \$pid;sleep 1;echo \" \" # %s(%s)\n"
        ITEM=`GETVNCPORTS "${HOST1}"  | awk -v fmt="${FMT}" -v hst="${GROUPNAME}" '{printf(fmt, $2, $2, $1, $2, $3, hst)}'`
        FULLLIST=`echo -e "${FULLLIST}\n${ITEM}"`
      done < <(echo -e "${CONFIG}" | awk -v group="${HOSTGROUP}" '{if ($0 ~ group) {print $1" "$2}}')
      # убрать пустые строки
      FULLLIST=`echo -e "${FULLLIST}" | sed -e '/^$/d'`

      VMLIST=`echo -e "${FULLLIST}" | sed -e 's/^[^#]*# \([^ ]*\)$/\1/g' | sort`

      if [ -z "${VMLIST}" ] ; then
        echo -e "No VM is running on host group \"${HOSTGROUP}\""
        LOOPLEVEL="0"
        break
      fi

      PS3="Type a number or 'q' to return to previous menu, 'r' to reread list: "
      select VMNAME in ${VMLIST} ; do
        if [ -n "${VMNAME}" ] ; then
          break
        else
          if [[ ${REPLY} =~ [Qq] ]] ; then
            echo -e "Quit."
            LOOPLEVEL="0"
            break
          elif [[ ${REPLY} =~ [Rr] ]] ; then
            # next loop with reread
            break
          fi
        fi
      done
      if [ -n "${VMNAME}" ] ; then
        COMMANDSTR=`echo -e "${FULLLIST}" | sed -n 's/^\([^#]*\)# '${VMNAME}'$/\1/p'`
        echo -e "${COMMANDSTR}"
        eval "${COMMANDSTR}"
        echo -e "All done."
      fi
    done
  done
Рекоментация!Для соединения ssh будет требоваться аутентификация на удалённом сервере. Сделать это удобнее используя сертификаты. Чтобы каждый раз не открывать сертификат паролем стоит добавить их один раз в ssh-agent при помощи ssh-add /home/user001/.ssh/id_rsa

Скрипт копирования нескольких LV

Однострочный скрипт копирования логических томов LV. Например для копирования дисков виртуальных машин.

Тестовый вариант отображает команду на экран:

# for VOL in "lv_vm3_disk0" "lv_server_fm-disk0" "lv_vm1_disk0" ; do echo -e "dd if=/dev/vg_vm/${VOL} of=/mnt/tmp1/${VOL} bs=2M iflag=direct oflag=direct" ; done
dd if=/dev/vg_vm/lv_vm3_disk0 of=/mnt/tmp1/lv_vm3_disk0 bs=2M iflag=direct oflag=direct
dd if=/dev/vg_vm/lv_server_fm-disk0 of=/mnt/tmp1/lv_server_fm-disk0 bs=2M iflag=direct oflag=direct
dd if=/dev/vg_vm/lv_vm1_disk0 of=/mnt/tmp1/lv_vm1_disk0 bs=2M iflag=direct oflag=direct

А это рабочий вариант:

# for VOL in "lv_vm3_disk0" "lv_server_fm-disk0" "lv_vm1_disk0" ; do dd if=/dev/vg_vm/${VOL} of=/mnt/tmp1/${VOL} bs=2M iflag=direct oflag=direct ; done
81920+0 records in
81920+0 records out
171798691840 bytes (172 GB) copied, 2433.05 s, 70.6 MB/s
75002+0 records in
75002+0 records out
157290594304 bytes (157 GB) copied, 2525.82 s, 62.3 MB/s
128000+0 records in
128000+0 records out
268435456000 bytes (268 GB) copied, 3628.6 s, 74.0 MB/s
Рекоментация!Так как копирование логических томов это длительная операция то такие команды лучше запускать в screen.

Как изменить разделитель полей команды ps

Команда ps имеет множество ключей один из которых позволяет определить свой разделитель полей, если требуется распарсить поля содержащие пробелы (например аргументы командной строки процессов)

ps -eo "%p\t%a"

Для того чтобы вставить табуляцию в качестве разделителя нужно либо воспользоваться sed для замены \t на табуляцию или воспользоваться echo -e но удобнее немного изменить строку исползуя хак:

ps -eo "%p"$'\011'"%a"

В использовании команды есть одна непонятная особенность: чтобы аргумент %a вывел полные параметры, а не обрезал их по ширине, он должен быть использован в самом конце форматной строки. Если после него встретится хотя бы один символ включая пробел то ширина поля args будет ограничена. Поле будет обрезано. Мне не удалось заставить вывести полный аргумент никакими перенаправлениями в pipe или переменными COLUMNS как это описано в документации.

ОБЫЧНЫЕ AIX коды описаны ниже.

       CODE   NORMAL   HEADER
       %C     pcpu     %CPU
       %G     group    GROUP
       %P     ppid     PPID
       %U     user     USER
       %a     args     COMMAND
       %c     comm     COMMAND
       %g     rgroup   RGROUP
       %n     nice     NI
       %p     pid      PID
       %r     pgid     PGID
       %t     etime    ELAPSED
       %u     ruser    RUSER
       %x     time     TIME
       %y     tty      TTY
       %z     vsz      VSZ

Дата и время старта сервера

Команда uptime показывает время прошедшее с момента старта сервера. Когда мне для разбора логов потребовалось узнать время старта сервера я не нашёл способа получить время старта сервера например в формате YYYY-MM-DD HH:MM.

Вот результат работы uptime

$ uptime
 18:01:18 up 473 days,  6:56,  1 user,  load average: 0.08, 0.03, 0.00

Распарсим его и сформируем строку для команды date

$ uptime | sed -e 's/,//g' | awk '{split($5,time,":"); printf("-%s days -%s hours -%s minutes\n", $3, time[1], time[2])}'
-473 days -7 hours -02 minutes

И получим следующий однострочный скрипт

$ DAYSAGO=`uptime | sed -e 's/,//g' | awk '{split($5,time,":"); printf("-%s days -%s hours -%s minutes\n", $3, time[1], time[2])}'`; date --date="${DAYSAGO}" +"%Y-%m-%d %H:%M"
2014-01-10 11:05
Примечание От запуска к запуску скрипта время будет плавать на ± одну минуту. Это связано с тем, что uptime возвращает время без секунд.

Установка формата даты в Thunderbird

Mozilla-thunderbird-logo
Если в Linux установлена переменная LANG=”en_US.UTF-8″ то не смотря на региональные настройки системы Thunderbird отображает дату в американском формате MM.DD.YYYY. Сделать отображение даты корректным можно установкой переменной непосредственно перед запуском Thunderbird.

Для отображения даты в формате DD.MM.YYYY нужно установить переменную LC_TIME=”en_GB.utf8″

LC_TIME="en_GB.utf8" /usr/bin/thunderbird

А для формата YYYY-MM-DD установить LC_TIME=”en_DK.utf8″

LC_TIME="en_DK.utf8" /usr/bin/thunderbird

Для получения списка локалей можно воспользоваться командой locale с фильтрацией grep

$ locale -a | grep -i 'en_..\.utf8'

Если вы хотите изменить ярлык в KDE то воспользуйтесь командой kmenuedit которая имеет графический интерфейс.
Там необходимо найти ярлык который отвечает за почтовый клиент Thunderbird и задать команду LC_TIME=”en_GB.utf8″ /usr/bin/thunderbird %u

Источник

Скрипт для создания частотного словаря

John Stejnbeck Travels with Charley in search of america

Некоторые вещи приводят в замешательство если посмотреть на них в ретоспективе. Пять лет в школе я учил английский язык. Затем ещё 5 лет в институте. Итого 10 лет изучения английского языка не дали никаких видимых результатов. Можно это списать на полное отсутствие заинтересованности, так как большинство из нас живших за железным занавесом не видели перспективы применить свои знания английского на практике. Однако занавес упал и вместе с этим появилась возможность ездить в другие страны и потребность продолжить изучать английский язык. В 90-х годах моя американская знакомая Тереза, подарила мне аудио книжку издательства PENGUIN BOOKS. По-английски я читал в основном техническую литературу по микроэлектронике и программированию, но слабо понимал беглую речь и совершенно не мог связать двух слов в устной беседе. Мне понравилась возможность иметь текст перед глазами и слышать, как произносятся слова.

Continue reading Скрипт для создания частотного словаря

Delphi 5 и Delphi 7 Access Violation

Пришлось намедни оживить старый проект написанный на Delphi 5. Взял виртуалку с 2003 виндой, которую по нынешним действительно можно назвать микро-софтом, потому что в загруженном состоянии съедает меньше 100 мегабайт оперативки. “Откопал” старые дистрибутивчики, наборы VCL, всё поставил, настроил, открыл проект и всё нормально скомпилировал. И тут мне понадобилось зайти в опции проекта, чтобы добавить пути к новым библиотекам которые нужно было добавить в проект. И тут я получил

“Access violation at address 013FA3B. Write of address 013FA3B.”
Continue reading Delphi 5 и Delphi 7 Access Violation

HTTPS в каждый web! Быстро и бесплатно.

letsencrypt-01

В ноябре 2014 года Mozilla, Akamai, Cisco, EFF (Electronic Frontier Foundation), Identrust и исследователи из Мичиганского университета начали совместную работу над созданием центра сертификации (Certificate Authority) который призван снять оставшиеся ограничения на пути полного перехода сайтов на протокол HTTPS.

С запуском запланированого на лето 2015 года, Let’s Encrypt CA будет автоматически выдавать и управлять бесплатными сертификатами для любого веб-сайта, который в них нуждается. Переключение вебсервера с HTTP на HTTPS с этим CA будет таким же простым, как запуск одной команды или нажатие одной кнопки.

Continue reading HTTPS в каждый web! Быстро и бесплатно.

Отключение парковки ноутбучных дисков

Частая парковка головок ноутбучных шпиндельных накопителей на жёстких дисках приводит к износу механизма и преждевременной смерти диска. Чем больше значение SMART параметра Load_Cycle_Count тем ближе время вероятной кончины диска.

smartctl -A /dev/sda | grep 'Load_Cycle_Count'
193 Load_Cycle_Count        0x0012   098   098   000    Old_age   Always       -       21418

В старых версиях Fedora я это решал строчкой в init скрипте.
В новых использовал модуль. И итолько недавно мне подсказали решение для нормальной поддержки Hybernate и Suspend.
Continue reading Отключение парковки ноутбучных дисков