Стефан Грабер (Stéphane Graber) опубликовал последний пост в рамках цикла из 12 статей про LXD. Как найти проблему, если она возникла? Как правильно оформить отчёт об ошибке и куда его отослать?
Наконец-то, финал! Серия из 12 статей, начавшаяся год назад, заканчивается. Если вы следили за серией с самого начала, то получили базовые знания про LXD, чтобы знать про его возможности и как использовать в своей практике.
Но что если что-то пойдёт не так? Как самому найти ошибку? И если сами не сможете исправить, какую информацию нужно собрать для апстрима, чтобы они смогли понять в чём суть проблемы и исправить её? А что, если вы хотите помочь и исправить проблему сами или добавить классную фичу? Как собрать, оттестировать и передать свою наработку в кодовую базу LXD?
/var/log/lxd/lxd.log
Главный журнал LXD. Чтобы быстро не переполнить ваш диск, только сообщения INFO, WARNING и ERROR пишутся в данный журнал по умолчанию. Изменить поведение и повысить уровень отладки можно, передав -debug демону LXD.
/var/log/lxd/CONTAINER/lxc.conf
Всякий раз, когда стартует контейнер, данный файл обновляется данными конфигурации, пришедшей от LXC. Данный файл наглядно показывает итоговые настройки, в том числе все его устройства, bind-mount и так далее.
/var/log/lxd/CONTAINER/forkexec.log
Данный файл содержит ошибки, поступающие с уровня LXC, когда он не смог выполнить команду. Это должно быть очень редко, так как LXD обрабатывает ошибки гораздо раньше.
/var/log/lxd/CONTAINER/forkstart.log
Данный файл содержит ошибки, поступающие с уровня LXC, когда он не смог запустить контейнер. Это должно быть очень редко, так как LXD обрабатывает ошибки гораздо раньше.
При использовании технологий живой миграции и мгновенных снимков дополнительно создаются журналы всякий раз когда CRIU создаёт или восстанавливает дамп. Ещё можно глянуть журналы в /var/log/lxd/CONTAINER/, которые датируются, чтобы легко можно было найти проблему из ваших последних попыток. В данных журналах более подробно пишется о ходе работы CRIU и с помощью данных журналов быстрее можно понять суть проблемы в работе миграции или создания снимков.
Как было сказано выше, вы можете передать опцию -debug демону LXD. Альтернативно можно подключится, даже удалённо, к интерфейсу событий, чтобы увидеть нужные записи.
Для примера lxc init ubuntu:16.04 xen
lxd.log будет
INFO[02-24|18:14:09] Starting container action=start created=2017-02-24T23:11:45+0000 ephemeral=false name=xen stateful=false used=1970-01-01T00:00:00+0000 INFO[02-24|18:14:10] Started container action=start created=2017-02-24T23:11:45+0000 ephemeral=false name=xen stateful=false used=1970-01-01T00:00:00+0000
lxc monitor -type=logging будет
metadata: context: {} level: dbug message: 'New events listener: 9b725741-ffe7-4bfc-8d3e-fe620fc6e00a' timestamp: 2017-02-24T18:14:01.025989062-05:00 type: logging metadata: context: ip: '@' method: GET url: /1.0 level: dbug message: handling timestamp: 2017-02-24T18:14:09.341283344-05:00 type: logging metadata: context: driver: storage/zfs level: dbug message: StorageCoreInit timestamp: 2017-02-24T18:14:09.341536477-05:00 type: logging metadata: context: ip: '@' method: GET url: /1.0/containers/xen level: dbug message: handling timestamp: 2017-02-24T18:14:09.347709394-05:00 type: logging metadata: context: ip: '@' method: PUT url: /1.0/containers/xen/state level: dbug message: handling timestamp: 2017-02-24T18:14:09.357046302-05:00 type: logging metadata: context: {} level: dbug message: 'New task operation: 2e2cf904-c4c4-4693-881f-57897d602ad3' timestamp: 2017-02-24T18:14:09.358387853-05:00 type: logging metadata: context: {} level: dbug message: 'Started task operation: 2e2cf904-c4c4-4693-881f-57897d602ad3' timestamp: 2017-02-24T18:14:09.358578599-05:00 type: logging metadata: context: ip: '@' method: GET url: /1.0/operations/2e2cf904-c4c4-4693-881f-57897d602ad3/wait level: dbug message: handling timestamp: 2017-02-24T18:14:09.366213106-05:00 type: logging metadata: context: driver: storage/zfs level: dbug message: StoragePoolInit timestamp: 2017-02-24T18:14:09.369636451-05:00 type: logging metadata: context: driver: storage/zfs level: dbug message: StoragePoolCheck timestamp: 2017-02-24T18:14:09.369771164-05:00 type: logging metadata: context: container: xen driver: storage/zfs level: dbug message: ContainerMount timestamp: 2017-02-24T18:14:09.424696767-05:00 type: logging metadata: context: driver: storage/zfs name: xen level: dbug message: ContainerUmount timestamp: 2017-02-24T18:14:09.432723719-05:00 type: logging metadata: context: container: xen driver: storage/zfs level: dbug message: ContainerMount timestamp: 2017-02-24T18:14:09.721067917-05:00 type: logging metadata: context: action: start created: 2017-02-24 23:11:45 +0000 UTC ephemeral: "false" name: xen stateful: "false" used: 1970-01-01 00:00:00 +0000 UTC level: info message: Starting container timestamp: 2017-02-24T18:14:09.749808518-05:00 type: logging metadata: context: ip: '@' method: GET url: /1.0 level: dbug message: handling timestamp: 2017-02-24T18:14:09.792551375-05:00 type: logging metadata: context: driver: storage/zfs level: dbug message: StorageCoreInit timestamp: 2017-02-24T18:14:09.792961032-05:00 type: logging metadata: context: ip: '@' method: GET url: /internal/containers/23/onstart level: dbug message: handling timestamp: 2017-02-24T18:14:09.800803501-05:00 type: logging metadata: context: driver: storage/zfs level: dbug message: StoragePoolInit timestamp: 2017-02-24T18:14:09.803190248-05:00 type: logging metadata: context: driver: storage/zfs level: dbug message: StoragePoolCheck timestamp: 2017-02-24T18:14:09.803251188-05:00 type: logging metadata: context: container: xen driver: storage/zfs level: dbug message: ContainerMount timestamp: 2017-02-24T18:14:09.803306055-05:00 type: logging metadata: context: {} level: dbug message: 'Scheduler: container xen started: re-balancing' timestamp: 2017-02-24T18:14:09.965080432-05:00 type: logging metadata: context: action: start created: 2017-02-24 23:11:45 +0000 UTC ephemeral: "false" name: xen stateful: "false" used: 1970-01-01 00:00:00 +0000 UTC level: info message: Started container timestamp: 2017-02-24T18:14:10.162965059-05:00 type: logging metadata: context: {} level: dbug message: 'Success for task operation: 2e2cf904-c4c4-4693-881f-57897d602ad3' timestamp: 2017-02-24T18:14:10.163072893-05:00 type: logging
Как видно в примере, формат lxc monitor является многострочным в отличии от файла журнала. Но что более важно, вы видите все записи level: dbug
Лучшее место для отправки отчётов про LXD это lxd issues апстрима. Убедитесь в том, что вы заполнили всё в шаблоне ошибки, что сэкономить всем время для воспроизведения вашего окружения.
Если обнаружена ошибка в самом пакете для Ubuntu, проблема в установке/обновлении/удалении или проблема в инициализационных скриптах LXD, то лучше запулить отчёт на Launchpad. Команда ubuntu-bug lxd
автоматически соберёт нужные журналы и информацию о проблемном пакете и отправит, создав отчёт о баге.
Ошибки, связанные с технологией CRIU, отправляйте так же на Launchpad - ubuntu-bug criu
Обратите внимание, что использование CRIU через LXD пока считается beta функцией и, если вы не готовы платить Canonical за поддержку, то может пройти достаточно времени, когда вашим отчётом займутся.
LXD написан на Go и хостится на Github. Приветствуется любой посильный вклад. Нет Contributor licence agreement (CLA) или подобного юридического соглашения. Используется обычное Developer Certificate of Ownership (Signed-off-by: line). Есть ряд запрашиваемых фичей, перечисленных в выше описываемом issue tracker. Это хорошее место для старта новичка, но лучше заранее подать заявку, перед работой над кодом, чтобы остальные были в курсе, что начата работа и они могли бы дать ценные советы.
Самые актуальные инструкции от апстрима можно найти в building-from-source
Рекомендуется делать rebase как можно чаще, так как изменения объединяют довольно регулярно.
LXD поставляется с 2 наборами тестов: юнит и интеграционные. Всё запустить можно командой sudo -E make check
Запустить только unit тесты - sudo -E go test ./...
Интеграционные - cd test && sudo -E ./main.sh
Есть переменные окружения для изменения поведения тестов:
Если чего-то будет не хватать для тестов, то до запуска вам будет об этом сообщено. Тесты на мощном железе могут быть сделаны менее чем за 10 минут.
До того как сделать запрос на включение сделанных вами изменений (pull request), ответьте согласием что:
Если вышеописанное сделано, то делайте запрос. Система непрерывной интеграции Jenkins проверит коммиты, создаст тестовые сборки для MacOS и Windows и если всё хорошо, то апстримом будет инициирован полный тест с помощью Jenkins вашей ветки и всех бэкендов хранилищ, 32 и 64 бита и всех версий Go. Обычно это занимает около 1 часа. Если все тесты будут пройдены, ваша ветка будет объединена с master, и ваш код попадёт в будущий LXD релиз. Если ваши изменения подходят к стабильной ветке LXD stable-2.0, то апстрим их бэкпортирует в неё.
Серия закончилась и надеюсь вам стало чуточку понятнее, что такое LXD и что он умеет. Серия статей часто подразумевала стабильную LTS версию LXD (2.0.x), но есть так же ежемесячные релизы для тех, кто ждёт последних новинок.
Некоторые статьи, не в рамках данного цикла, вы можете найти в оглавлении LXD 2.0.
LXC используется как низкоуровневый слой - цикл статей про LXC.
LXD, который умеет гораздо больше и упрощает работу с контейнерами, использует LXC под капотом - цикл статей про LXD.
Предыдущая статья LXD 2.0: LXD и OpenStack [11/12].
Стефан Грабер (Stéphane Graber) о LXD.
OpenStack Foundation использует LXD для контейнеризации linux систем.