Получить список соответствия 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

Как изменить разделитель полей команды 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

Как из каталога web сервера загрузить все файлы

Если отбросить все декорации в виде index.html* файлов и ограничить скорость стягивания на уровне 1 мегабайта в секунду, использовать аутентификацию то это может выглядеть так:

wget -r --no-parent --no-directories --reject "index.html*" --limit-rate=1m --user=vasily --password=terkin http://youngblogger.hoster-ok.com/usersdata/vaslily/

Изменение размера шифрованного LUKS раздела на LVM

Предупреждение!Перед проведением такой операции всегда необходимо сделать резервную копию данных.
Для проверки работоспособности механизма я создал зашифрованный раздел на машине скопировал туда два больших файла, которые заняли всесь свободный объём раздела, вычислил их контрольную сумму растянул раздел и сверил контрольную сумму.

Схема такова:

  • отмонтировать зашифрованный раздел;
  • закрыть шифрующее LUKS устройство;
  • растянуть раздел;
  • открыть шифрующее LUKS устройство;
  • растянуть шифрующее LUKS устройство;
  • проверить файловую систему
  • примонтировать зашифрованный раздел обратно

Я провожу увеличение раздела. При уменьшении раздела меняется порядок, что уменьшать в первую и во вторую очередь. Так при увеличении сначала нужно растянуть слой логического тома, затем слой устройства шифрования и только потом слой файловой системы. А при уменьшении, прежде всего необходимо уменьшить размер слоя файловой системы, затем слой шифрования, и только в конце слой логического тома.

Continue reading Изменение размера шифрованного LUKS раздела на LVM

Установка RAR в Fedora

В репозиториях Fedora и Centos нет архиватора RAR. Если вам нужно только рапаковывать RAR архивы то для этого достаточно установить пакет unrar из репозитория RPM Fusion YUM. Если же вам нужно создавать RAR архивы то нужно загрузить и установить полный пакет RAR из DAG.
Continue reading Установка RAR в Fedora

Получение списка соответствия портов рейд контроллера дискам в системе

Имеем RAID контроллер который экспортирует свои диски в систему как набор дисков (JBOD).
Нужно получить какой физический порт какому устройству в системе соответствует.

Пример был сделан для контроллера 3ware и CentOS release 6.5 (Final). Но с небольшими поправками подойдёт и для других контроллеров.

Unit  UnitType  Status         %RCmpl  %V/I/M  Stripe  Size(GB)  Cache  AVrfy
------------------------------------------------------------------------------
u0    JBOD      OK             -       -       -       931.513   Ri     OFF
u1    JBOD      OK             -       -       -       1863.02   Ri     OFF
u2    JBOD      OK             -       -       -       1863.02   Ri     OFF
u3    JBOD      OK             -       -       -       1863.02   Ri     OFF

VPort Status         Unit Size      Type  Phy Encl-Slot    Model
------------------------------------------------------------------------------
p0    OK             u0   931.51 GB SATA  0   -            WL1000GSA64RA100B
p1    OK             u1   1.82 TB   SATA  1   -            WDC WD2002FYPS-02W3
p2    OK             u2   1.82 TB   SATA  2   -            WDC WD2002FYPS-02W3
p3    OK             u3   1.82 TB   SATA  3   -            WDC WD2002FYPS-02W3

Continue reading Получение списка соответствия портов рейд контроллера дискам в системе

Используем fetchmail для автоматизации разбора почты.

Потребовалось мне принимать емейлы фильтровать их по определённым критериям и обрабатывать скриптами (отделять вложения, выполнять действия над вложениями). С такой задачей мог бы справиться плагин FiltaQuilla для Thunderbird. Однако плагин некорректно работает с моим Thunderbird версии 30 для Linux. Если он выполняется автоматически то сохраняет пустое вложение, хотя при ручном выполнении всё делает корректно. Автор упорно молчит, а править чужой плагин у меня небыло времени.

Итак мне было нужно:

  • периодически проверять наличие писем в специальном почтовом ящике;
  • стягивать их в раздельные файлы;
  • сохранять все вложения из каждого письма;
  • анализировать заголовки и тексты писем;
  • запускать скрипты по манипуляции с текстами писем и вложениями.

Continue reading Используем fetchmail для автоматизации разбора почты.

Fast HDD Eraser – Быстрое стирание дисков

Мне часто приходится затирать жёсткие диски пачками, например при модернизации стораджей, и мне был очень необходим скоростной источник потока данных которыми затирается целевой диск. Чтобы более менее надёжно затереть данные на диске неразрушив сам диск, недостаточно затереть его нулями из /dev/zero. В тоже время поток данных из /dev/urandom слишком медленный чтобы быстро затирать современные жёсткие диски.
Поскольку необходимый мне уровень стирания не претендовал на уровень военной разведки то я решил выкрутиться через большой массив случайных (псевдослучайных) чисел. А чтобы массив этот быстро работал я решил закинуть его в память. И /dev/shm – идеальное место.
Для стирания я использовал raid контроллер чтобы затирать сразу множество дисков. А для автоматизации процесса написал bash-скрипт. Скрипт имеет свой счётчик продвижения и его можно прервать Ctrl+C и затем продожить с той позиции где он был прерван.
Continue reading Fast HDD Eraser – Быстрое стирание дисков

qemu-img очень медленно конвертирует

Запустил конвертацию 4G диска из lv в qcow2.

qemu-img convert -O qcow2 /dev/VM_POOL/v01.sitea.com_disk0 v01.sitea.com_disk0.qcow2

Почему-то всё шло очень медленно. Посмотрел top – процессор свободен. Посмотрел iostat – также всё свободно и никакой большой активности нет. Оказывается, что после каждой записи qemu-img зачем-то вызывает fsync.

К сожалению qemu-img не поддерживает работу через stdin.

Значительно ускорить процесс получилось простым копирование lv в файл и далее конвертацией файла в qcow2.

dd if=/dev/VM_POOL/v01.sitea.com_disk0 of=v01.sitea.com_disk0.raw bs=2M
(4.5 GB) copied, 103.564 s, 43.5 MB/s

И за пару минут прошла ковертация

qemu-img convert -O qcow2 v01.sitea.com_disk0.raw v01.sitea.com_disk0.qcow2

Обнаружено на:
qemu-img-0.12.5-1.fc13.x86_64
Linux v01-b 2.6.34.8-68.fc13.x86_64 #1 SMP Thu Feb 17 15:03:58 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

Похоже это был этот баг.

Копирование lv в ramdisk и подключение к iscsi

Для поддержки клиентов в виртуальных машинах мне периодически требуется быстрый диск для реиндексации файловых баз данных. Если проводить такую реиндексацию на обычном LVM диске то на файловых базах в миллион файлов это занимает до десяти часов. Самая большая база данных у моих клиентов занимает 18 гигабайт дискового пространства, что для современных серверов не так много. И чтобы ускорить эту операцию можно выделить диск в оперативной памяти и там провести реиндексацию. Но если использовать такой диск в памяти самой виртуальной машины то потребуется два часа на то чтобы скопировать этот миллион файлов на RAM disk и обратно (по часу на каждую операцию). Значительно ускорить процесс копирования можно если сделать полный дамп диска в память. Это значительно быстрее и проходит у меня со скоростью 110-150Мб/с против 3-4Мб/с в режиме пофайлового копирования (файлы маленькие и сервисные операции отнимают долю ресурсов). Я поступаю так, что на одной ноде в кластере выделяю 20-ти гигабайтный фрагмент памяти в /dev/shm. Затем копирую туда диск виртуальной машины при помощи dd и nc через сеть. Далее на этой ноде запускаю iscsi-target и монтирую этот диск к windows iscsi-initiator и диск появляется в целевой виртуалке. Важным является то, что объявленный iscsi-target должен иметь физический размер сектора 512 байт! Иначе windows не распознает диск и предложит его отформатировать.

Уou need to format the disk in drive E: before you can use it.
Continue reading Копирование lv в ramdisk и подключение к iscsi