Я вижу некоторые несоответствия между тем, что я настраиваю с помощью zfs
, тем, что lxd
может делать во время процесса lxd init
, и тем, что я ожидал увидеть.
Я использую LXD около месяца, просмотрел документацию и сделал несколько поисков, но, похоже, они не касаются этой темы.
Пожалуйста, посмотрите раздел ниже, чтобы получить более подробную информацию о моих вопросах:
tank/lxd
вне VDEV пула ZFS из места монтирования в /mnt/tank/lxd/...
в /var/lib/lxd/...
, или что-то еще делается? а) Как я могу подтвердить / подтвердить любой случай? (б) Еще лучше, как я могу заставить LXD хранить / помещать все в набор данных, который я настраиваю с помощью zfs
?/var/lib/lxd/
, было сохранено в tank/lxd
, который я указал во время lxd init
: Как я могу это сделать? (Хороший способ ZFS / LXD предпочтительнее; я могmv /var/lib/lxd
в баке и ln -s
в каталог, чтобы указать на /mnt/tank/...
, но это похоже на плохой взлом, и я хочу его избежать. Должен быть лучший способ.)Заранее спасибо.
Я использую LXD 3.0.0 в Ubuntu 18.04, настраивая его на использование уже существующего пула ZFS и набора данных. Вот так выглядит перед с lxd init
:
$ sudo zpool create -m /mnt/tank tank raidz3 <6 storage SSDs omitted>
$ sudo zfs set compression=on tank
$ sudo zfs create tank/lxd
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 216K 1.31T 43.7K /mnt/tank
tank/lxd 41.7K 1.31T 41.7K /mnt/tank/lxd
Выглядит так, как я ожидал. Затем я запускаю lxd init
и выполняю следующие действия:
$ lxd init
[...]
Create a new ZFS pool? (yes/no) [default=yes]: no
Name of the existing ZFS pool or dataset: tank/lxd
[...]
Это то, что zfs list
показывает после, завершая вышеуказанное:
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 589K 1.31T 41.7K /mnt/tank
tank/lxd 250K 1.31T 41.7K none
tank/lxd/containers 41.7K 1.31T 41.7K none
tank/lxd/custom 41.7K 1.31T 41.7K none
tank/lxd/deleted 41.7K 1.31T 41.7K none
tank/lxd/images 41.7K 1.31T 41.7K none
tank/lxd/snapshots 41.7K 1.31T 41.7K none
LXD создал несколько наборов данных, но mountpoint
уже не те, что были раньше (т.е. tank/lxd
ушел), и не то, что я ожидал (в разделе lxd/...
ничего не указано). Короче говоря, исходная точка монтирования исчезла, а другие наборы данных не отображаются, как я ожидал.
Я, вероятно, ошибаюсь здесь, но выглядит как будто LXD переместил данные, которые должны находиться в /mnt/tank/lxd/...
из пула ZFS vdevs, в каталог /var/lib/lxd/
на LVM, где была установлена ОС. Я не уверен, что я пропустил.
Я могу использовать команды zfs set
, чтобы "исправить" это:
$ sudo zfs set mountpoint=/mnt/tank/lxd tank/lxd
$ sudo zfs set mountpoint=/mnt/tank/lxd/containers tank/lxd/containers
$ sudo zfs set mountpoint=/mnt/tank/lxd/custom tank/lxd/custom
$ sudo zfs set mountpoint=/mnt/tank/lxd/deleted tank/lxd/deleted
$ sudo zfs set mountpoint=/mnt/tank/lxd/images tank/lxd/images
$ sudo zfs set mountpoint=/mnt/tank/lxd/snapshots tank/lxd/snapshots
И убедитесь, что они снова появляются, как ожидалось:
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 641K 1.31T 43.7K /mnt/tank
tank/lxd 252K 1.31T 43.7K /mnt/tank/lxd
tank/lxd/containers 41.7K 1.31T 41.7K /mnt/tank/lxd/containers
tank/lxd/custom 41.7K 1.31T 41.7K /mnt/tank/lxd/custom
tank/lxd/deleted 41.7K 1.31T 41.7K /mnt/tank/lxd/deleted
tank/lxd/images 41.7K 1.31T 41.7K /mnt/tank/lxd/images
tank/lxd/snapshots 41.7K 1.31T 41.7K /mnt/tank/lxd/snapshots
Но это похоже на решение частичный, поскольку все остальные файлы (например, lxd.db
, ключи и т. д.) Остаются под /var/lib/lxd
. Так что я не уверен, «чиню» ли я что-нибудь или есть ли что-то исправить вообще.
Кроме того, я не совсем понимаю, действительно ли я чего-то добился с помощью команд zfs set
. Например, touch /var/lib/lxd/containers/hi.txt
показывает нет файл под /mnt/tank/lxd/containers/
, что, как я ожидал, если они оба смотрят в одном месте.
Заранее спасибо за вашу помощь.
Было предложено, чтобы я попробовал записать некоторые файлы в качестве теста, чтобы увидеть, где фактически используется используемое пространство, на основе информации о системе. Шаги теста были следующими:
zfs set mountpoint
, чтобы позволить LXD делать свои собственные вещи и посмотреть, что произойдет. (Шаги опущены ниже для краткости.)Результат был неубедительный, и его можно увидеть ниже.
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.18G 1.31T 41.7K /mnt/tank
tank/lxd 1.18G 1.31T 41.7K none
tank/lxd/containers 270M 1.31T 41.7K none
tank/lxd/containers/base-server 251M 1.31T 588M /var/lib/lxd/storage-pools/lxd-pool/containers/base-server
tank/lxd/containers/dev-server 9.18M 1.31T 588M /var/lib/lxd/storage-pools/lxd-pool/containers/dev-server
tank/lxd/containers/qa-server 9.14M 1.31T 588M /var/lib/lxd/storage-pools/lxd-pool/containers/qa-server
tank/lxd/custom 125K 1.31T 41.7K none
tank/lxd/custom/dev-volume 41.7K 512G 41.7K /var/lib/lxd/storage-pools/lxd-pool/custom/dev-volume
tank/lxd/custom/qa-volume 41.7K 512G 41.7K /var/lib/lxd/storage-pools/lxd-pool/custom/qa-volume
tank/lxd/deleted 41.7K 1.31T 41.7K none
tank/lxd/images 937M 1.31T 41.7K none
tank/lxd/images/ab23ac2bda8cfb48c176a2d1e790181d5a1ed3522732a0cf8ff189dea848d3f1 588M 1.31T 588M none
tank/lxd/images/b36ec647e374da4816104a98807633a2cc387488083d3776557081c4d0333618 349M 1.31T 349M none
tank/lxd/snapshots 41.7K 1.31T 41.7K none
root@dev-server:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tank/lxd/containers/dev-server 1.4T 589M 1.4T 1% /
none 492K 0 492K 0% /dev
udev 32G 0 32G 0% /dev/tty
tmpfs 100K 0 100K 0% /dev/lxd
tank/lxd/custom/dev-volume 512G 128K 512G 1% /mnt/tank
tmpfs 100K 0 100K 0% /dev/.lxd-mounts
tmpfs 32G 0 32G 0% /dev/shm
tmpfs 32G 160K 32G 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 32G 0 32G 0% /sys/fs/cgroup
root@dev-server:~$ dd if=/dev/zero of=/root/test.img bs=8MB
^C3929+0 records in
3929+0 records out
31432000000 bytes (31 GB, 29 GiB) copied, 17.7005 s, 1.8 GB/s
root@dev-server:~$ ls -lh
total 512
-rw-r--r-- 1 root root 30G May 7 20:21 test.img
root@dev-server:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tank/lxd/containers/dev-server 1.4T 589M 1.4T 1% /
none 492K 0 492K 0% /dev
udev 32G 0 32G 0% /dev/tty
tmpfs 100K 0 100K 0% /dev/lxd
tank/lxd/custom/dev-volume 512G 128K 512G 1% /mnt/tank
tmpfs 100K 0 100K 0% /dev/.lxd-mounts
tmpfs 32G 0 32G 0% /dev/shm
tmpfs 32G 160K 32G 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 32G 0 32G 0% /sys/fs/cgroup
$ sudo zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 1.18G 1.31T 41.7K /mnt/tank
tank/lxd 1.18G 1.31T 41.7K none
tank/lxd/containers 270M 1.31T 41.7K none
tank/lxd/containers/base-server 251M 1.31T 588M /var/lib/lxd/storage-pools/lxd-pool/containers/base-server
tank/lxd/containers/dev-server 9.18M 1.31T 588M /var/lib/lxd/storage-pools/lxd-pool/containers/dev-server
tank/lxd/containers/qa-server 9.14M 1.31T 588M /var/lib/lxd/storage-pools/lxd-pool/containers/qa-server
tank/lxd/custom 125K 1.31T 41.7K none
tank/lxd/custom/dev-volume 41.7K 512G 41.7K /var/lib/lxd/storage-pools/lxd-pool/custom/dev-volume
tank/lxd/custom/qa-volume 41.7K 512G 41.7K /var/lib/lxd/storage-pools/lxd-pool/custom/qa-volume
tank/lxd/deleted 41.7K 1.31T 41.7K none
tank/lxd/images 937M 1.31T 41.7K none
tank/lxd/images/ab23ac2bda8cfb48c176a2d1e790181d5a1ed3522732a0cf8ff189dea848d3f1 588M 1.31T 588M none
tank/lxd/images/b36ec647e374da4816104a98807633a2cc387488083d3776557081c4d0333618 349M 1.31T 349M none
tank/lxd/snapshots 41.7K 1.31T 41.7K none
Выполнение команды df -h
на хосте до и после создания / уничтожения тестового файла также не показало никаких изменений. Я повторил это с тестовым файлом большего размера (100 ГБ), но не заметил разницы.
Когда mountpoint
- это none
, это может означать одно из двух:
zfs unmount
.mount
, чтобы указать, где должна быть смонтирована эта файловая система, вместо использования команды zfs mount
.Я предполагаю, что LXD делает последнее, а ZFS просто не знает, где он был смонтирован. Если это так, LXD, вероятно, также записывает записи в /etc/fstab
, чтобы воссоздать эти крепления в /var/lib/lxd/...
при перезагрузке. (Черт возьми, может быть, авторы LXD даже считают, что любопытные энтузиасты ZFS с меньшей вероятностью попытаются сохранить или изменить что-либо в своих каталогах данных виртуальных машин, если точку монтирования менее удобно вводить.)
Итак, краткий ответ: я думаю, что исправить было нечего. Однако я не думаю, что изменение, которое вы сделали с zfs set
, тоже не повредит.
Вы упомянули, что touch ...
в каталогах LXD ничего не создает в каталогах /mnt/tank/...
. Файловая система может быть смонтирована только в одном месте за раз, поэтому я думаю, что соответствующие каталоги в /mnt
- это просто каталоги, которые ZFS оставила на месте при изменении точки монтирования. Если вы попытаетесь переключить точку монтирования обратно на /mnt/...
сейчас, это должно заставить вас удалить файл, которого вы там коснулись, прежде чем это позволит выполнить монтирование («наложение» повторяющихся каталогов из двух разных файловых систем запрещено). Если вы по какой-то причине хотите, чтобы они были связаны, вы можете использовать для этого символическую ссылку.
В будущем вы сможете выяснить, в какой файловой системе записан файл, используя df -P /path/to/file
, чтобы помочь отладить подобные проблемы.
LXD размонтирует файловую систему, но не казаться для использования cmd zfs
; в противном случае я бы ожидал, что zfs mount
будет использоваться позже, а zfs list
покажет точку монтирования, но это не так. При создании тома с lxc storage volume create ...
zfs list
показывает, что mountpoint
находится под /var/lib/lxd/storage-pools/...
. В /etc/fstab
записи не добавляются. Проверка w / df -P /var/lib/lxd/...
показывает файлы, смонтированные в корневом каталоге /
, а не /mnt/...
, предлагая теперь данные за пределами пула ZFS, но это всего лишь точка монтирования, поэтому мне все еще непонятно. Вы можете это прояснить?
Правильно, я предположил, что lxd монтирует файловую систему каким-то образом, что не очень хорошо работает со встроенной системой учета ZFS; Я предполагаю, что иногда он мог делать «правильные» / интуитивно понятные вещи, возможно, потому, что создание файловой системы установит встроенный учет, а также смонтирует файловую систему. Последняя (странная) возможность, о которой я подумал, заключается в том, что lxd может создавать пустую родительскую файловую систему для настройки некоторых общих свойств, а затем оставлять ее отключенной, поскольку она будет создавать дочерние файловые системы для создаваемых вами томов (и монтировать только их) .
Из-за такого поведения я сейчас нахожу время, чтобы явно подключить каждый набор данных к точке монтирования пула, чтобы убедиться, что ZFS хотя бы правильно перечисляет их. Тем не менее, я не смог на самом деле что-либо окончательно подтвердить или опровергнуть. Я бы не хотел гадать / предполагать, что что-то (скорее всего) так, только для того, чтобы позже узнать, что это не так, и в конечном итоге для меня неприятный сюрприз. Есть ли у вас какие-либо предложения по тестированию / подтверждению того, какое из них действительно имеет место?
Думаю, я бы попробовал написать что-нибудь в одном из томов и посмотреть, показывает ли zfs list дополнительное использование места.
Я попробую, когда вернусь в офис на следующей неделе, и посмотрю, как все пойдет. Я поделюсь всем, что найду, чтобы ответ мог объяснить это и любые другие попытки и / или выводы, чтобы быть более полными.
Я пробовал кое-что, но результаты были странными. Пожалуйста, посмотрите мою правку в основном сообщении.
Кстати, тест проводился после уничтожения и воссоздания всего как на уровне пула ZFS, так и на уровне LXD. Я избегал команд zfs set mountpoint
, чтобы понаблюдать за тем, что мог делать LXD.
Попробуйте скопировать из / dev / urandom вместо / dev / zero внутри контейнеров - блоки нулей будут сжаты почти до нуля, поэтому могут не отображаться в разрешении, на которое вы смотрите.
Хорошо, конечно ... действительно, получение его от /dev/urandom
было способом пройти тест, чтобы показать убедительные результаты. По какой-то причине я ускользнул от того факта, что на прошлой неделе я включил сжатие в пуле ZFS и что это приведет к сжатию всех /dev/zero
до ничтожно малой величины. Данные является хранятся в пуле, как и ожидалось, но теперь я смог подтвердить это напрямую. Вам следует подумать об обновлении своего ответа. Большое спасибо за помощь.
Следует ли перенести этот вопрос на дочерний сайт суперпользователь?