Устраняем проблему со снэпшотами диска в OpenNebula
Исправляем проблему после обновления OpenNebula с наследованием снэпшотов диска используя Ceph хранилище.
До версии ONe 5.4.х снэпшоты диска выполнялись с наследованием к родительскому снэпшоту, что несколько рушило логику и работу с ними.
В директиве TM_MAD_CONF конфигурационного файла oned.conf приходилось добавлять ALLOW_ORPHANS = YES для создания независимых друг от друга снэпшотов.
В версии 5.4 данный функционал был исправлен и соответственно включен по умолчанию, но при обновлении с 5.2 на 5.4 все же наблюдаются проблемы, поэтому все приходится доделывать руками.
Итак, проверяем, что для каждого хранилища в TM_MAD присутствует строка ALLOW_ORPHANS = YES. Это включит опцию для новых виртуальных серверов, которые будут созданы.
Для существующих виртуальных серверов снимаем XML-дамп командой onevm show $VMID --xml и проверяем значение /VM/SNAPSHOTS/ALLOW_ORPHANS, оно должно быть в значении YES.
Если это не так, то изменим данный параметр. (ВНИМАНИЕ! Сделайте бэкап базы данных прежде чем выполнять действия с виртуальными серверами!)
# For example to change ALLOW_ORPHANS=YES on DISK_ID=0 of VM_ID=23 # you should repeat for each disk in the VM metadata onedb change-body vm --id 23 '/VM/SNAPSHOTS[DISK_ID=0]/ALLOW_ORPHANS' -- "YES"
Если на виртуальном сервере уже существовали снэпшоты, то необходимо выполнить flatten для каждого из них:
# change PARENT=-1 for snapshot 0 and 1 of disk 0 on VM 23 # you should repeat the step for all disk snapshots onedb change-body vm --id 23 '/VM/SNAPSHOTS[DISK_ID=0]/SNAPSHOT[ID=0]/PARENT' -- "-1" onedb change-body vm --id 23 '/VM/SNAPSHOTS[DISK_ID=0]/SNAPSHOT[ID=1]/PARENT' -- "-1"
Альтернативный вариант с установкой патча
Создаем файл allow_ophans.rb
# -------------------------------------------------------------------------- # # Copyright 2002-2017, OpenNebula Project, OpenNebula Systems # # # # Licensed under the Apache License, Version 2.0 (the "License"); you may # # not use this file except in compliance with the License. You may obtain # # a copy of the License at # # # # http://www.apache.org/licenses/LICENSE-2.0 # # # # Unless required by applicable law or agreed to in writing, software # # distributed under the License is distributed on an "AS IS" BASIS, # # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # # See the License for the specific language governing permissions and # # limitations under the License. # #--------------------------------------------------------------------------- #
if !ONE_LOCATION LOG_LOCATION = "/var/log/one" else LOG_LOCATION = ONE_LOCATION + "/var" end
if (version < Gem::Version.new(VERSION_MIN)) || (version >= Gem::Version.new(VERSION_MAX)) then raise <<-EOT Version mismatch: patch file is for version Shared: #{VERSION_MIN} to #{VERSION_MAX} (excluding) Current database is version Shared: #{db_version[:version]} EOT end end
defadd_element(elem, name) return elem.add_child(elem.document.create_element(name)) end
defadd_cdata(elem, name, text) # The cleaner doc.create_cdata(txt) is not supported in # old versions of nokogiri return add_element(elem, name).add_child( Nokogiri::XML::CDATA.new(elem.document(), text)) end
defadd_allow_orphans(ele, val, type) did = ele.xpath("DISK_ID").text if (did) then ele.search("ALLOW_ORPHANS").remove add_cdata(ele, "ALLOW_ORPHANS", val) elem = ele.search("ALLOW_ORPHANS") puts " #{type} DISK_ID:#{did} :: #{elem}" end end
defpatch(ops)
init_log_time()
puts "This tool will convert the tree of disk snapshots to orphans."
@db.transaction do @db.fetch("SELECT * FROM vm_pool") do|row| doc = Nokogiri::XML(row[:body],nil,NOKOGIRI_ENCODING){|c| c.default_xml.noblanks}
body = doc.root.to_s @db[:vm_pool].where(oid: row[:oid]).update(body: body) end
log_time() end returntrue end end
Обязательно делаем бэкап базы данных и ставим патч.
$ onedb patch -u oneadmin -d opennebula allow_orphans.rb MySQL Password: MySQL dump stored in /var/lib/one/mysql_localhost_opennebula_2017-11-8_18:8:10.sql Use 'onedb restore' or restore the DB using the mysql command: mysql -u user -h server -P port db_name < backup_file