Блог ·
Чого резервна копія не містить
Та сама відсутня опція означає так на віртуальній машині й ні на контейнері. Ось як покриття Proxmox було виміряно замість того, щоб бути обіцяним.
Автор: Provibr
Якщо спитати панель керування, чи має машина резервну копію, відповідь зазвичай буде так. Цікаве питання вужче й значно важче: які частини лежать в архіві, а які ні. Контейнер із привʼязаним монтуванням до каталогу хоста має дані, яких жоден vzdump ніколи не торкнеться, а панель, що про таку конфігурацію каже «збережено», не оптимістична, вона дає обіцянку від імені чужого програмного забезпечення.
Тож ми перестали обіцяти й почали вимірювати. Кожна копія й кожна точка відновлення тепер несе спостереження про те, яким гість був тієї миті, а панель виводить покриття з того спостереження, а не з того, що копія вдалася.
Та сама відсутність, два протилежні значення
Причина, чому це вимірюють, а не обмірковують, полягає в одному правилі поведінки Proxmox, яке для двох типів гостя йде рівно в протилежні боки.
У контейнері точка монтування є в архіві лише тоді, коли поруч написано backup=1. Документація каже прямо: щоб включити точку монтування до копій, треба ввімкнути відповідну опцію. Відсутність означає ні.
У віртуальній машині диск є в архіві, якщо поруч не написано backup=0. Такими словами цього в підручнику немає; воно є у функції, що передає vzdump його перелік, де значення читається як позначка копіювання диска з одиницею типово. Відсутність означає так.
| Рядок конфігурації | В архіві? |
|---|---|
rootfs: local-lvm:vm-101-disk-0,size=8G | так, завжди; корінь навіть не знає поля копіювання |
mp0: local-lvm:vm-101-disk-1,mp=/data,backup=1 | так |
mp0: local-lvm:vm-101-disk-1,mp=/data | ні |
mp0: /srv/data,mp=/data (привʼязане монтування) | ні; вміст привʼязаних монтувань не копіюють |
mp0: /dev/sdb1,mp=/disk (монтування пристрою) | ні; те саме стосується монтувань пристроїв |
scsi0: local-lvm:vm-100-disk-0,size=32G | так |
scsi1: local-lvm:vm-100-disk-1,backup=0 | ні |
ide2: local:iso/debian.iso,media=cdrom | не застосовно |
efidisk0: … із bios: ovmf | так |
efidisk0: … без bios: ovmf | ні |
tpmstate0: … | так |
scsi2: /dev/sdb (пряме передавання) | так |
unused0: local-lvm:vm-100-disk-4 | ні |
virtiofs0: dataset-a | ні |
Два виділені рядки є тією самою відсутністю. Згорніть їх в одне речення, і один із двох екранів бреше, а жоден із них не повідомить про помилку.
Читати джерело, а не інтуїцію
Три з тих рядків вийшли інакшими, ніж припускав план цієї роботи, і всі три вирішено читанням Proxmox, а не суперечкою.
Про диск у прямому передаванні припускали, що це дані хоста, які лишаються позаду, за аналогією з монтуванням пристрою в контейнері. Це не так. Функція, що будує перелік копіювання, ніколи не дивиться на шлях, а крок підготовки перетворює ідентифікатор тому без сховища за ним на блоковий пристрій і включає його. Помилитися в бік, що видається обережним, означало б сказати клієнтам, що дані лежать поза їхнім архівом, тоді як вони в ньому, і це звучить безневинно, доки не помітиш, що це вимагає підтвердження при кожному відновленні й так навчає людей проклацувати підтвердження.
Відʼєднані диски й спільні каталоги хоста просто були відсутні в плані. unusedN є справжніми даними клієнта, що лежать у сховищі без підʼєднаної шини, і vzdump записує, що пропускає їх. virtiofsN є каталогом хоста й ніколи не томом, що робить його відповідником привʼязаного монтування для віртуальної машини. Обидва є справжніми прогалинами покриття, і обидва зарахувалися б як повні.
Префікси ключів дисків і їхні кількості походять із того самого місця: чотири місця IDE, шість SATA, тридцять одне SCSI, шістнадцять virtio, один диск EFI, один стан TPM, двісті пʼятдесят шість невикористаних місць, десять virtiofs. Ключ поза цими діапазонами для Proxmox не є диском, тож і тут він не має тихо ним ставати. А virtiofs перевіряють раніше за virtio, бо virtiofs0 починається з virtio: у зворотному порядку спільний каталог хоста читався б як диск і повідомлявся б як збережений.
Невідоме ніколи не називають повним
Слова на екрані для невиміряного гостя звучать як «не встановлено», а повністю: що містить копія, не встановлено. Ніколи «повне», ніколи «поза копією». Туди ведуть три шляхи, і всі три справжні: гість належить до типу, якого агент не вміє читати, агент старший за версію, що взагалі читає конфігурації, або агент спробував і не зміг дістатися.
Останній випадок і є причиною того, що спостереження несе явну позначку про те, що конфігурацію прочитано. Без неї порожній перелік точок монтування не відрізнити від контейнера без додаткових монтувань, окрім того, що другого не існує: корінь є завжди. Агент, який не зміг подивитися, інакше читався б як гість, у якого поза архівом немає нічого, а це саме та несправність, заради якої ця робота існує.
Два правила тиснуть у той самий бік. Конфігурація контейнера, яку прочитано, але яка не містить кореня, є невідомою, а не повною, бо очевидно прочитано щось, що не було конфігурацією контейнера. А конфігурація віртуальної машини, у якій ніщо не порушує питання покриття, ніщо або самі оптичні приводи, є невідомою з тієї самої причини: повне означає, що все всередині, а казати це про нуль речей є твердженням без вимірювання під ним. Ціна відома й прийнята: машина справді без дисків тепер читається як невстановлена й просить підтвердження під час відновлення. Це той бік, де помилка нічого не коштує.
Присуд теж упорядковано навмисно: доказово поза межами перемагає невиміряне. Контейнер із привʼязаним монтуванням і одним нечитним рядком є частковим, а не невідомим, бо частина, що важить, доведена. Нечитний рядок не зникає; він лишає собі власний рядок із власним словом.
Не застосовно не те саме, що виключено
Оптичний привід дістає власний стан покриття, і ця відмінність не є прискіпливістю, а дією, що з неї випливає.
Виключено означає, що дані клієнта лежать поза архівом і що в Proxmox є прапорець, який це змінює. Оптичний привід не несе даних цієї машини: це образ із бібліотеки або диск початкового налаштування, що постає наново при кожному запуску, і Proxmox пропускає його раніше, ніж оцінює будь-що інше. Якби оптичний привід звався виключеним, кожна машина з образом у приводі була б частковою, а кожне відновлення просило б підтвердження щодо приводу, у якому нічого немає. Люди навчилися б, що підтвердження нічого не означає, і тоді воно й не означало б нічого.
Рядок усе одно є в таблиці, зі своїм власним словом. Відсутній рядок породжує сумнів, чи ми взагалі дивилися, а це саме та двозначність, яку знімає позначка про читання.
Підтвердження хибить у безпечний бік
Відновлення архіву, покриття якого є чимось іншим, ніж виміряне «повне», вимагає позначки, що називає те, що лишилося поза межами. Зокрема й при невідомому, і це навмисна частина: стара точка відновлення або архів, створений кимось іншим, цілком може не мати даних хоста, і позначка є місцем, де клієнт навчається перевіряти це самотужки. Лише виміряне повне її пропускає, бо тоді підтверджувати справді нічого.
Те саме речення береже двоє дверей, точку входу й функцію позаду, бо екран не є межею. А кнопка підтвердження не вимикається, доки панель відкрита: вимкнений елемент не може втримати фокус, тож діалог, що вимикає того, хто його відкрив, не може повернути фокус при закритті, і той, хто працює з клавіатури, опиняється на тілі документа. Стан зайнятості й притемнення роблять ту саму роботу, не ламаючи цього.
Те, що лишилося поза архівом, до того ж записують як подію на відновленні, на рівні попередження, з точками монтування в її даних. Відновлення, що тихо вдалося, лишивши позаду три каталоги, має лишатися знайденним через місяць тим, кого при цьому не було.
Що ми занотували б
- Вимірювати покриття, а не виводити його. «Копія вдалася» і «ваші дані в копії» є двома твердженнями про різні речі.
- Перевіряти, чи типове значення однакове з обох боків абстракції. Тут відсутня опція означає так для одного типу гостя й ні для іншого, а спільне речення хибне рівно на одному екрані, і ніде немає помилки.
- Читати код, що справді будує перелік, а не лише підручник. Три наші правила були хибними, доки цього не зробили, і одне з них хибило в бік, що видається обережним.
- Давати невиміряному власне слово й ніколи не дозволяти йому зливатися з так чи ні.
- Давати власне слово й тому, що не порушує питання. Стан, що вимагає безглуздого підтвердження, навчає людей нехтувати підтвердженнями.
- Розділяти спостереження й присуд. Агент повідомляє, що бачив; одна функція вирішує, що це означає, з тестами поруч і без змоги для того, хто повідомляє, твердити про повноту.
Для ясності про те, чим це є: клієнтські копії стоять за перемикачем розгортання, вимкненим типово, нічого з цього сьогодні не купити, а правила перевірено за документацією та кодом Proxmox, а не за власним працюючим гіпервізором. Три речі лишаються недоведеними або свідомо поза обсягом. Покриття окремої точки відновлення успадковується від запуску, що її створив, замість читатися з архіву. Диски віртуальних машин із backup=0 видно в цій таблиці й більше ніде в продукті. А машина справді без дисків читається як невстановлена, і цю ціну обрано замість альтернативи.
Із роботи над резервними копіями у Provibr. Чому неперевірене відновлення не є копією, є в копія, яку жодного разу не відновлювали, а що насправді гарантують три режими vzdump, є в режими vzdump у Proxmox: що вони гарантують.