LINUX.ORG.RU

LXC - перенос (или копирование) контейнера с одного storage pool на другой

 , ,


0

1

Всем привет!

Имеется хост с работающим LXC (Alpine linux).
Есть задача перенести или скопировать контейнер с одного Storage pool на другой.

# lxc info peertube
Name: peertube
Status: RUNNING
Type: container
Architecture: x86_64
PID: 9032
Created: 2024/11/10 22:33 MSK
Last Used: 2024/11/19 21:04 MSK

Resources:
  Processes: 43
  Disk usage:
    root: 704.68GiB

# lxc storage list
+------------+--------+-----------+-------------+---------+---------+
|    NAME    | DRIVER |  SOURCE   | DESCRIPTION | USED BY |  STATE  |
+------------+--------+-----------+-------------+---------+---------+
| raid1_pool | lvm    | vg_md1    |             | 1       | CREATED |
+------------+--------+-----------+-------------+---------+---------+
| tmp_pool   | lvm    | tmp_pool  |             | 3       | CREATED |
+------------+--------+-----------+-------------+---------+---------+

# lxc storage show raid1_pool
config:
  lvm.use_thinpool: "false"
  lvm.vg_name: vg_md1
  source: vg_md1
  volatile.initial_source: vg_md1
description: ""
name: raid1_pool
driver: lvm
used_by:
- /1.0/instances/gitea1
status: Created
locations:
- none

# lxc storage show tmp_pool
config:
  lvm.thinpool_name: LXDThinPool
  lvm.vg_name: tmp_pool
  source: tmp_pool
  volatile.initial_source: /dev/sdg
description: ""
name: tmp_pool
driver: lvm
used_by:
- /1.0/instances/peertube
- /1.0/instances/peertube/snapshots/repo_snap
- /1.0/profiles/tmp_profile
status: Created
locations:
- none

# lsblk
NAME                                 MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS

sdc                                    8:32   0   2.7T  0 disk  
└─sdc1                                 8:33   0   2.7T  0 part  
  └─md1                                9:1    0   2.7T  0 raid1 
sdd                                    8:48   0   2.7T  0 disk  
└─sdd1                                 8:49   0   2.7T  0 part  
  └─md1                                9:1    0   2.7T  0 raid1

sdf                                    8:80   0 931.5G  0 disk  
├─tmp_pool-LXDThinPool_tmeta         253:0    0   120M  0 lvm   
│ └─tmp_pool-LXDThinPool-tpool       253:2    0 931.3G  0 lvm   
│   ├─tmp_pool-LXDThinPool           253:3    0 931.3G  1 lvm   
│   └─tmp_pool-containers_peertube   253:17   0 838.2G  0 lvm   /var/lib/lxd/storage-pools/tmp_pool/containers/peertube
└─tmp_pool-LXDThinPool_tdata         253:1    0 931.3G  0 lvm   
  └─tmp_pool-LXDThinPool-tpool       253:2    0 931.3G  0 lvm   
    ├─tmp_pool-LXDThinPool           253:3    0 931.3G  1 lvm   
    └─tmp_pool-containers_peertube   253:17   0 838.2G  0 lvm   /var/lib/lxd/storage-pools/tmp_pool/containers/peertube 

Копирование инстанса осуществляю следующим образом:

lxc cp peertube peertube1 -s raid1_pool  --no-profiles --instance-only

При этом способе возникает проблема которая заключается в том, что в новом сторадже под клон создаётся volume размером 10Gb:

sdc                                    8:32   0   2.7T  0 disk  
└─sdc1                                 8:33   0   2.7T  0 part  
  └─md1                                9:1    0   2.7T  0 raid1 
    └─vg_md1-containers_peertube1    253:20   0    10G  0 lvm   /var/lib/lxd/storage-pools/raid1_pool/containers/peertube1
sdd                                    8:48   0   2.7T  0 disk  
└─sdd1                                 8:49   0   2.7T  0 part  
  └─md1                                9:1    0   2.7T  0 raid1 
    └─vg_md1-containers_peertube1    253:20   0    10G  0 lvm   /var/lib/lxd/storage-pools/raid1_pool/containers/peertube1

Соответственно, копирование инстанса заканчивается ошибкой:

# lxc cp peertube peertube1 -s raid1_pool  --no-profiles --instance-only
Error: Create instance from copy: Create instance volume from copy failed: Rsync receive failed: /var/lib/lxd/storage-pools/raid1_pool/containers/peertube1/: [exit status 11 write |1: broken pipe] (rsync: [receiver] write failed on "/var/lib/lxd/storage-pools/raid1_pool/containers/peertube1/rootfs/home/santic/PS2/ISO/Final_Fantasy_XII_PAL_ENG_Platinum.iso": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(380) [receiver=3.3.0]
)

Как скопировать инстанс так, чтобы создавался volume с нужным размером?

Единственный вариант, который смог провернуть - это через создание профиля с необходимым размером rootfs. Но мне этот вариант строго нежелателен.


Почему тут 704 Gib

# lxc info peertube

Resources:
  Disk usage:
    root: 704.68GiB

А тут 10 Gib?

sdc                                    8:32   0   2.7T  0 disk  
└─sdc1                                 8:33   0   2.7T  0 part  
  └─md1                                9:1    0   2.7T  0 raid1 
    └─vg_md1-containers_peertube1    253:20   0    10G  0 lvm   /var/lib/lxd/storage-pools/raid1_pool/containers/peertube1

У тебя peertube и peertube1 это разве не разные сущности? Может быть тебе подойдет не lxc cp а lxc export? Вот есть небольшой материал на тему переноса, бекапа: https://www.cyberciti.biz/faq/how-to-backup-and-restore-lxd-containers/

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

У тебя peertube и peertube1 это разве не разные сущности?

В этом и заключается суть lxc cp - ты копируешь исходный инстанс (peertube) в новый (peertube1). Новый инстанс создаётся автоматически; Но у меня этот процесс не завершается, потому что новый инстанс имеет размер rootfs не как у исходного инстанса; Почему так происходит - есть только догадки связанные с default профилем, либо с дефолтными настройками самого lxc.

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

santic
() автор топика
Последнее исправление: santic (всего исправлений: 1)
Ответ на: комментарий от santic
# lxc storage show vg_fast
config:
  lvm.thinpool_name: LXDThinPool
  lvm.vg.force_reuse: "true"
  lvm.vg_name: vg_fast
  source: vg_fast
  volatile.initial_source: vg_fast
  volume.block.filesystem: xfs
  volume.size: 2500MB
description: ""
name: vg_fast
driver: lvm
used_by:

Обратите внимание на параметр volume.size: 2500MB. У вас он не отображается, наверное берется значение по умолчанию, те самые 10Gib. Попробуйте его задать и посмотреть, какого размера том создастся.

Тут такая же ситуация как у вас.

bloody_enterprise
()

В общем, для меня работает только способ с созданием временного профиля, который имеет нужные параметры для переноса/копирования контейнера.

Общий ответ тут: https://lxc-users.linuxcontainers.narkive.com/3Z1vU1Yi/how-to-set-default-volume-size-using-the-volume-size-property-on-the-pool

Инструкция для миграции:

  1. Создаём временный профиль:
lxc profile create migrate_profile
  1. Создаём для профиля диск, который будет создаваться по-умолчанию для инстанса:
lxc profile device add migrate_profile root disk path=/ pool=raid1_pool

Стоит обратить внимание на то, что при создании инстанса из профиля будет использоваться целевой storage pool.

  1. Задаём размер диска (не самое красивое решение, да):
lxc profile edit migrate_profile

Добавляем параметр size:

config: {}
description: ""
devices:
  root:
    path: /
    pool: raid1_pool
    size: 900GiB
    type: disk
name: migrate_profile

  1. Собственно, копируем/перемещаем инстанс:
lxc cp peertube peertube1 -p migrate_profile --instance-only 
  1. Снимаем с инстанса профиль и удаляем последний:
lxc profile remove peertube1 migrate_profile
lxc profile delete migrate_profile
santic
() автор топика
Ответ на: комментарий от bloody_enterprise

Опа, что-то не подумал это в конфиге указать и попробовать :) Что ж, попробую чуть позже на другом инстансе, который буду мигрировать тоже. Спасибо!

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

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

santic
() автор топика