Доступ к данным на диске гостевой виртуальной машины

Предположим ситуацию когда имеется сервер под управлением Linux на котором установлен KVM и запущены виртуальные машины с Linux. С точки зрения производительности и удобства диски виртуальных машин нужно размещать в разделах LVM. Один LV = один диск для виртуальной машины. Однако когда потребуется достать данные с такого диска, а там установлен Linux с использованием LVM то окажется что LVM сервера не видит LVM расположенный внутри диска.

Для этого потребуется утилита kpartx которая подключит диск виртуальной машины после чего он станет виден ядру, lvm и fdisk.
Continue reading Доступ к данным на диске гостевой виртуальной машины

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

Скрипт копирования нескольких 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.

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

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

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

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

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

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

Backup LV тома через snapshot

Лёгкий скрипт бэкапа тома на удалённый сервер.
Хочу подчеркнуть, что создание снимка (snapshot) на работающем read/write разделе не гарантирует целосность данных в создаваемом снимке. Кеш файловой системы оставшийся в памяти не отразится на snapshot и не попадёт в бэкап. Поэтому такой бэкап является упрощённой и быстрой возможностью сохранить максимум данных.

В скрипте три важных операции:

  • Создать снимок (snapshot) достаточного размера но не больше размера тома
  • Скопировать раздел в файл через сеть на другую машину на ходу немного сжимая
  • Удалить снимок

Continue reading Backup LV тома через snapshot

Удаление vg и lv после физического отключения диска

Случилось так, что я глянул в mount и не увидел примонтированных LV со внешнего диска и спокойно выдернул usb коннектор того самого диска. И только через пару дней обнаружил, что команды lvs и vgs проходят с ошибками. Это были активные vg о которых я забыл перед физическим отключением диска. Так как тома́ с данными были предварительно размонтированы то сами данные на отключённом диске были в порядке. Меня раздражало несколько этих сообщений об ошибке. Нужно было их убрать. И конечно без перезагрузки сервера.

[root@csa01 etc]# vgs
  /dev/VG_RAID_COPY/lv_1: read failed after 0 of 4096 at 2000393535488: Input/output error
  /dev/VG_RAID_COPY/lv_1: read failed after 0 of 4096 at 2000393592832: Input/output error
  /dev/VG_RAID_COPY/lv_1: read failed after 0 of 4096 at 0: Input/output error
  /dev/VG_RAID_COPY/lv_1: read failed after 0 of 4096 at 4096: Input/output error
  VG          #PV #LV #SN Attr   VSize   VFree  
  VG_CSA01_DATA   1   3   0 wz--n-   7.28t   4.79t
  VG_CSA01x       1   5   0 wz--n- 465.54g 421.68g

Continue reading Удаление vg и lv после физического отключения диска

Монтирование LVM тома зашифрованного crypto Luks

Подключить физически диск. У меня это диск подключённый к eSATA разъёму ноутбука.
Посмотреть что он появился
# fdisk -l
....
Disk /dev/sdc: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x48b7122c

Device Boot Start End Blocks Id System
/dev/sdc1 * 1 25 200781 83 Linux
/dev/sdc2 26 30401 243995220 8e Linux LVM

Continue reading Монтирование LVM тома зашифрованного crypto Luks

LVM – два тома с одинаковыми именами

Пришлось намедни переустановить систему и перенести настройки с одного винта на другой. Проблема появилась когда CentOS остановился при попытке разобраться со внешним USB винтом. Оставалось одно подключить его после загрузки и смонитровать. Но тут ждал другой сюрприз, имя LVM тома совпадало с именем уже смонтированонго тома. Поиск в интернете ответа на простой вопрос: “Как переименовать группу томов на внешнем диске чтобы их можно было примонтировать к LVM” затянулся, что и послужило поводом написания этого micro-how-to.

Боевым – активным диском с которого загружена система является диск Hitach Travel Star 80. Пациентом, которого следует примонтировать – Samsung 160Gb. Он у меня внешний, подключаемый через адаптер-переходник.

Итак, подключаем внешний диск к компьютеру через USB:

# lsusb
Bus 001 Device 002: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge

Continue reading LVM – два тома с одинаковыми именами