LINUX.ORG.RU
решено ФорумAdmin

kpartx + loop + lvm = не удаляются разделы loopXpY после отключения образа

 ,


2

1

Привет всем!!

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

Монтирую образ блочного устройства через kpartx -a <ИМЯ>.img, далее забиваю нулями этот образ через dd предварительно. Создаю два раздела, и в итоге имею в /dev вот такие устройства: /dev/loop0 /dev/loop0p1 /dev/loop0p2. На втором разделе (loop0p2) создаю LVM-том и 2 LVM-раздела на нем, форматирую их и сразу же демонтирую. После, чтобы отключить LVM-том даю команду vgchange -an <VG> и сразу же отключаю образ kpartx -d <ИМЯ>.img. При этом команда losetup дает мне понять что мое loop0-устройство успешно отключена, не выводя его в своем списке.

А самое интересное, что после отключения образа файлы /dev/loop0[pX] остаются в каталоге, а вместе с ними и LVM-том на них. Команда dmsetup ls никаких устройств связанных этим lVM не видит. Команда blkid продолжает упорно писать, что в /dev/loop0p2 располежен все тот же LVM-том VG.

Как я представляю, вместе с отключением образа должны пропасть и loop-устройства, но что-то происходит не так.

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

Монтирую образ блочного устройства через kpartx
далее забиваю нулями через dd предварительно
Создаю ... форматирую ... сразу же демонтирую ... и сразу же отключаю образ kpartx -d <ИМЯ>.img

kpartx ни чего не монтирует. «Далее ... предварительно» — так далее или предварительно!?

Приведи просто список выполняемых команд.

arson ★★★★★ ()
Ответ на: комментарий от arson
dd if=/dev/zero of=/var/dist/<NAME>.img bs=1M count=4096 && kpartx -a /var/dist/<NAME>.img

Получаю /dev/loop0

#> losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /var/dist/<NAME>.img

Создаю файловые системы через fdisk

pvcreate /dev/loop0p2 && \
vgcreate <NAME> /dev/loop0p2 && \
lvcreate -n root -L 2048M <NAME> && \
lvcreate -n swap -l 100%FREE <NAME> && \
vgchange -ay <NAME> && vgscan --mknodes && \
mkfs.ext4 -L <NAME>-boot /dev/loop0p1 && \
mkfs.ext4 -L <NAME>-root /dev/mapper/<NAME>-root && \
mkswap -L <NAME>-swap /dev/mapper/<NAME>-swap && \
mkdir -p ${ROOTDIR}-rootfs && mount /dev/mapper/<NAME>-root ${ROOTDIR}-rootfs && \
mkdir -p ${ROOTDIR}-rootfs/boot && mount /dev/loop0p1 ${ROOTDIR}-rootfs/boot

Делаю запись чего-нибудь внутрь ФС

umount /dev/loop0p1 && \
umount /dev/mapper/<NAME>-root && \
rm -Rf ${ROOTDIR}-rootfs && \
vgchange -an <NAME> && kpartx -u -d /var/dist/<NAME>.img

Последние 2 команды опишу подробнее и далее проблему:

[root@server bin]# vgchange -an <NAME>
File descriptor 7 (pipe:[15282]) leaked on vgchange invocation. Parent PID 1310: bash
  0 logical volume(s) in volume group "<NAME>" now active
[root@server bin]# losetup | grep loop0
/dev/loop0         0      0         1  0 /var/dist/<NAME>.img
[root@server bin]# kpartx -d /var/dist/<NAME>.img
[root@server bin]# losetup | grep loop0

А воз и ныне там!!!

[root@server bin]# vgdisplay <NAME>
File descriptor 7 (pipe:[15282]) leaked on vgdisplay invocation. Parent PID 1310: bash
  --- Volume group ---
  VG Name               <NAME>
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               3,81 GiB
  PE Size               4,00 MiB
  Total PE              976
  Alloc PE / Size       976 / 3,81 GiB
  Free  PE / Size       0 / 0   
  VG UUID               tqqdnD-phZZ-RVEC-nAgd-o3Oz-q369-CNKzP3
[root@server bin]# ls /dev/loop0*
/dev/loop0  /dev/loop0p1  /dev/loop0p2
[root@server bin]# vgscan
File descriptor 7 (pipe:[15282]) leaked on vgscan invocation. Parent PID 1310: bash
  Reading all physical volumes.  This may take a while...
  Found volume group "<NAME>" using metadata type lvm2
dmnord ()
Ответ на: комментарий от dmnord

dd if=/dev/zero of=/var/dist/<NAME>.img bs=1M count=4096 && kpartx -a /var/dist/<NAME>.img

Как kpartx смог создать /dev/loop0p2 когда на диске еще нет разделов!?

arson ★★★★★ ()
Ответ на: комментарий от arson

На этом этапе он их не создавал! Создал я их после того как примапил образ файла Чуть ниже я написал

Создаю файловые системы через fdisk

На самом деле я просто хочу понять, что не дает мне отключить полностью устройства loop0*, ведь пока они будут в системе LVM-том будет сканироваться командой vgscan

dmnord ()
Ответ на: комментарий от arson

kpartx эмулирует блочное устройство, какой бы файл ему не указать. В моем случае файл образа был забит нулями и не содержал никакой разметки. Командой parted и fdisk я создал mbr загрузчик и 2 раздела, на которых я создал 2 раздела loop0p1 и loop0p2.

dmnord ()
Ответ на: комментарий от dmnord

kpartx эмулирует блочное устройство, какой бы файл ему не указать.

man kpartx:This tool, derived from util-linux' partx, reads partition tables on specified device and create device maps over partitions segments detected.

Ты выполнил команду kpartx до создания разделов, кто создал loop0p1 и loop0p2?

arson ★★★★★ ()
Ответ на: комментарий от arson

Ты выполнил команду kpartx до создания разделов, кто создал loop0p1 и loop0p2?

При при выполнении команды kpartx -a резервируется loop-устройство (в моем случае loop0). Это можно увидеть командой losetup либо kpartx -l. loop0p1 и loop0p2 созданы мной командой fdisk после того как я примапил файл.

dmnord ()
Ответ на: комментарий от dhameoelin

Вы сами пробовали это делать?

[root@server ~]# dd if=/dev/zero of=test.img bs=1M count=500
500+0 записей получено
500+0 записей отправлено
 скопировано 524288000 байт (524 MB), 2,76353 c, 190 MB/c
[root@server ~]# losetup test.img 
losetup: test.img: failed to use device:
Выполнено
[root@server ~]# losetup -P test.img
losetup: test.img: failed to use device:
Выполнено
[root@server ~]# losetup 
[root@server ~]#

dmnord ()
Ответ на: комментарий от dmnord

Все команды правильные, проблема в этом:

File descriptor 7 (pipe:[15282]) leaked on vgchange invocation.

Какая система? Версия ядра? Версия lvm2 (user space)?

sdio ★★★★★ ()
Ответ на: комментарий от sdio

Какая система? Версия ядра?

Fedora 20 (RFR)

Linux server.example.com 3.15.8-200.fc20.x86_64 #1 SMP Fri Aug 1 00:38:50 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Версия lvm2 (user space)?

скорее всего ДА, установлен лишь пакет lvm2

dmnord ()
Ответ на: комментарий от dmnord

Я интереса ради выполнил все твои команды и у меня никаких проблем не возникло, все исчезло после kpartx -d /path/to/file.img

Почему у тебя остались loop0p* устройства — загадка. Посмотри под рутом lsof | grep loop0 — может кто-то их держит.

sdio ★★★★★ ()
Ответ на: комментарий от dmnord

Вы сами пробовали это делать?

Естественно. Я бы предупредил, если не пробовал.

dhameoelin ★★★★★ ()
Ответ на: комментарий от sdio

как только даю kpartx -d команда lsof | grep loop0 перестает мне показывать процесс который его держит, но устройства loop0 остаются. только что проверил.

dmnord ()
Ответ на: комментарий от sdio

Для эксперимента снес федору и поставил центос 7!

Ситуация сходная:

11  dd if=/dev/zero of=./test.img bs=1M count=4096
12  kpartx -a /root/test.img 
13  losetup 
14  fdisk /dev/loop
15  kpartx -l /root/test.img 
17  ls /dev/mapper/loop0p1 
21  kpartx -d /root/test.img 
22  losetup

После мапинга образа файла создались файлы /dev/loop0 и /dev/mapper/loop0p*, вместо ожидаемых /dev/loop0[p*]. А после удаления мапинга устройства из папки /dev/mapper были удалены, а /dev/loop0 остался :)

Интересно что я делаю не так....

dmnord ()
Ответ на: комментарий от sdio

да нет же, должен удалится, ядро же не 2.4-2.6 где для работы системы создавалось куча устройств в прок. тем более losetup констатирует отсутствие в системе loop*-устройств.

dmnord ()
Ответ на: комментарий от dmnord

[root@server ~]# losetup test.img

losetup /dev/loop0 test.img, хоть бы man глянул

CentOS7:

># dd if=/dev/zero of=disk.img bs=1024 count=10240
># kpartx -a disk.img
># fdisk /dev/loop0 #создаю раздел
># ls /dev/mapper/loop*
control
>#
Не создает fdisk ничего, и kpartx не создал, т.к. раньше времени запущен! Это какой-то сервис старается (lvm2-monitor может, незнаю, не пользуюсь)

А после удаления мапинга устройства из папки /dev/mapper были удалены, а /dev/loop0 остался

И что, мешают? Их сразу два появляется (loop0, loop1)

># losetup -d /dev/loop0
># fdisk /dev/loop0
fdisk: невозможно открыть /dev/loop0: Неприменимый к данному устройству ioctl
>#

arson ★★★★★ ()

Решено! Как оказалось проблема ни в операционной системе, ни версии ядра, ни в версии kpartx.

Проблемная ситуация возникает при разбивке примапленного из файла блочного устройства. И не важно при этом мапится ли оно через kpartx или losetup.

При разбивке блочного устройства через parted устройства дочерних партиций появляются сразу же в каталоге в виде /dev/loopXpY и при этом ими сразу же можно пользваться. Именно в этом случае устройства /dev/loopXpY при отключении мапинга не пропадают, а продолжают использоваться системой, ссылаясь с ошибкой на вроде как живую партицию. Это мешает повторно использоваться loop-устройство в целом.

При разбивке блочного устройства через fdisk дочерние партиции не создаются. Они появятся позже при повторном мапинге образа файла и при этом будут созданы в каталоге /dev/mapper. В этом случае проблем, как при использовании perted, не наблюдается. Устройство спокойно отключается, пропадая из папки /dev/mapper.

dmnord ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.