Size: a a a

KVM (PVE/oVirt etc)

2019 September 06

₭Ѧℜ爪ศ in KVM (PVE/oVirt etc)
Тогда буду заниматься.
Спасибо большое за помощь.
источник

VS

Vladislav Starkov in KVM (PVE/oVirt etc)
Написал длинный ответ в другом канале по теме QEMU-KVM. Поправьте, где я не прав.


-----

Как я это понимаю:

1) KVM (Kernel-based Virtual Machine) – гипервизор (VMM – Virtual Machine Manager), работающий в виде модуля на ОС Linux. Гипервизор нужен для того, чтобы запускать некий софт в несуществующей (виртуальной) среде и при этом, скрывать от этого софта реальное физическое железо, на котором этот софт работает. Гипервизор работает в роли "прокладки" между физическим железом (хостом) и виртуальной ОС (гостем).

Поскольку KVM является стандартным модулем ядра Linux, он получает от ядра все положенные ништяки (работа с памятью, планировщик и пр.). А соответственно, в конечном итоге, все эти преимущества достаются и гостям (т.к. гости работают на гипервизоре, которые работает на/в ядре ОС Linux).

KVM очень быстрый, но его самого по себе недостаточно для запуска виртуальной ОС, т.к. для этого нужна эмуляция I/O. Для I/O (процессор, диски, сеть, видео, PCI, USB, серийные порты и т.д.) KVM использует QEMU.


2) QEMU (Quick Emulator) – эмулятор различных устройств, который позволяет запускать операционные системы, предназначенные под одну архитектуру, на другой (например ARM –> x86). Кроме процессора, QEMU эмулирует различные переферийные устройства: сетевые карты, HDD, видео карты, PCI, USB и пр.

Работает это так:
Инструкции/бинарный код (например ARM) конвертируются в промежуточный платформонезависимый код при помощи конвертера TCG (Tiny Code Generator) и затем этот платформонезависимый бинарный код конвертируется уже в целевые инструкции/код (например x86).

ARM –> промежуточный_код –> x86

По сути, Вы можете запускать виртуальные машины на QEMU на любом хосте, даже со старыми моделями процессоров, не поддерживающими Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Однако в таком случае, это будет работать весьма медленно, в связи с тем, что исполняемый бинарный код нужно перекомпилировать на лету два раза, при помощи TCG (TCG – это Just-in-Time compiler).

Т.е. сам по себе QEMU мега крутой, но работает очень медленно.


3) Бинарный программный код на процессорах работает не просто так, а раполагается на разных уровнях (кольцах / CPU rings) с разными уровнями доступа к данным, от самого привилегированного (Ring 0), до самого ограниченного, зарегулированного и "с закрученными гайками" (Ring 3).

Операционная система (ядро ОС) работает на Ring 0 (kernel mode) и может делать с любыми данными и устройствами все, что угодно. Пользовательские приложения работают на уровне Ring 3 (user mode) и не в праве делать все, что захотят, а вместо этого каждый раз должны запрашивать доступ на проведение той или иной операции (таким образом, пользовательские приложения имеют доступ только к собственным данным и не могут "влезть" в "чужую песочницу"). Ring 1 и 2 предназначены для использования драйверами.

До изобретения Intel VT-x / AMD SVM, гипервизоры работали на Ring 0, а гости работали на Ring 1. Поскольку у Ring 1 недостаточно прав для нормального функционирования ОС, то при каждом привилегированном вызове от гостевой системе, гипервизору приходилось налету модифицировать этот вызов и выполнять его на Ring 0 (примерно так, как это делает QEMU). Т.е. гостевой бинарный код _НЕ_ выполнялся напрямую на процессоре, а каждый раз налету проходил несколько промежуточных модификаций.

Накладные расходы были существенными и это было большой проблемой и тогда производители процессоров, независимо друг от друга, выпустили расширенный набор инструкций (Intel VT-x / AMD SVM), позволяющих выполнять код гостевых ОС _НАПРЯМУЮ_ на процессоре хоста (минуя всякие затратные промежуточные этапы, как это было раньше).

С появлением Intel VT-x / AMD SVM, был создан специальный новый уровень Ring -1 (минус один). И теперь на нем работает гипервизор, а гости работают на Ring 0 и получают привилегированный доступ к CPU.

Т.е. в итоге:
– хост работает на Ring 0
– гости работают на Ring 0
– гипервизор работает на Ring -1
источник

VS

Vladislav Starkov in KVM (PVE/oVirt etc)
4) KVM предоставляет доступ гостям к Ring 0 и использует QEMU для эмуляции I/O (процессор, диски, сеть, видео, PCI, USB, серийные порты и т.д., которые "видят" и с которыми работают гости).

Отсюда KVM-QEMU (или QEMU-KVM) 🙂
источник

i

ivdok in KVM (PVE/oVirt etc)
Vladislav Starkov
Написал длинный ответ в другом канале по теме QEMU-KVM. Поправьте, где я не прав.


-----

Как я это понимаю:

1) KVM (Kernel-based Virtual Machine) – гипервизор (VMM – Virtual Machine Manager), работающий в виде модуля на ОС Linux. Гипервизор нужен для того, чтобы запускать некий софт в несуществующей (виртуальной) среде и при этом, скрывать от этого софта реальное физическое железо, на котором этот софт работает. Гипервизор работает в роли "прокладки" между физическим железом (хостом) и виртуальной ОС (гостем).

Поскольку KVM является стандартным модулем ядра Linux, он получает от ядра все положенные ништяки (работа с памятью, планировщик и пр.). А соответственно, в конечном итоге, все эти преимущества достаются и гостям (т.к. гости работают на гипервизоре, которые работает на/в ядре ОС Linux).

KVM очень быстрый, но его самого по себе недостаточно для запуска виртуальной ОС, т.к. для этого нужна эмуляция I/O. Для I/O (процессор, диски, сеть, видео, PCI, USB, серийные порты и т.д.) KVM использует QEMU.


2) QEMU (Quick Emulator) – эмулятор различных устройств, который позволяет запускать операционные системы, предназначенные под одну архитектуру, на другой (например ARM –> x86). Кроме процессора, QEMU эмулирует различные переферийные устройства: сетевые карты, HDD, видео карты, PCI, USB и пр.

Работает это так:
Инструкции/бинарный код (например ARM) конвертируются в промежуточный платформонезависимый код при помощи конвертера TCG (Tiny Code Generator) и затем этот платформонезависимый бинарный код конвертируется уже в целевые инструкции/код (например x86).

ARM –> промежуточный_код –> x86

По сути, Вы можете запускать виртуальные машины на QEMU на любом хосте, даже со старыми моделями процессоров, не поддерживающими Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Однако в таком случае, это будет работать весьма медленно, в связи с тем, что исполняемый бинарный код нужно перекомпилировать на лету два раза, при помощи TCG (TCG – это Just-in-Time compiler).

Т.е. сам по себе QEMU мега крутой, но работает очень медленно.


3) Бинарный программный код на процессорах работает не просто так, а раполагается на разных уровнях (кольцах / CPU rings) с разными уровнями доступа к данным, от самого привилегированного (Ring 0), до самого ограниченного, зарегулированного и "с закрученными гайками" (Ring 3).

Операционная система (ядро ОС) работает на Ring 0 (kernel mode) и может делать с любыми данными и устройствами все, что угодно. Пользовательские приложения работают на уровне Ring 3 (user mode) и не в праве делать все, что захотят, а вместо этого каждый раз должны запрашивать доступ на проведение той или иной операции (таким образом, пользовательские приложения имеют доступ только к собственным данным и не могут "влезть" в "чужую песочницу"). Ring 1 и 2 предназначены для использования драйверами.

До изобретения Intel VT-x / AMD SVM, гипервизоры работали на Ring 0, а гости работали на Ring 1. Поскольку у Ring 1 недостаточно прав для нормального функционирования ОС, то при каждом привилегированном вызове от гостевой системе, гипервизору приходилось налету модифицировать этот вызов и выполнять его на Ring 0 (примерно так, как это делает QEMU). Т.е. гостевой бинарный код _НЕ_ выполнялся напрямую на процессоре, а каждый раз налету проходил несколько промежуточных модификаций.

Накладные расходы были существенными и это было большой проблемой и тогда производители процессоров, независимо друг от друга, выпустили расширенный набор инструкций (Intel VT-x / AMD SVM), позволяющих выполнять код гостевых ОС _НАПРЯМУЮ_ на процессоре хоста (минуя всякие затратные промежуточные этапы, как это было раньше).

С появлением Intel VT-x / AMD SVM, был создан специальный новый уровень Ring -1 (минус один). И теперь на нем работает гипервизор, а гости работают на Ring 0 и получают привилегированный доступ к CPU.

Т.е. в итоге:
– хост работает на Ring 0
– гости работают на Ring 0
– гипервизор работает на Ring -1
Не относящаяся к делу мелочь - есть ещё другие ринги, выше -1. Например всякая малварь от Intel/AMD (Intel ME/AMD PSP) сидит на уровне -3, имеет полный доступ к железу, и не рулится даже в реальном режиме процессора.
источник

i

ivdok in KVM (PVE/oVirt etc)
Есть только API-обрубки, которые позволяют детектить например версию и обновлять прошивку.
источник

i

ivdok in KVM (PVE/oVirt etc)
Кошмар Столлмана, короче
источник

VS

Vladislav Starkov in KVM (PVE/oVirt etc)
Да, это оч. интересно. Пока не дошел так глубоко.
источник

i

ivdok in KVM (PVE/oVirt etc)
Это мелочь. Только косвенно к виртуализации относится.
источник

AU

Anton Ustiuzhanin in KVM (PVE/oVirt etc)
Александр 🐎
load average: 116.55, 118.66, 124.05 - это нормально или не нормально?
это не цпу просто. а суммарная нагрузка на систему. может быть и io любой.
источник

i

ivdok in KVM (PVE/oVirt etc)
Anton Ustiuzhanin
это не цпу просто. а суммарная нагрузка на систему. может быть и io любой.
А по какой формуле считается? Просто все показатели вроде iowait и steal складываются?
источник

AU

Anton Ustiuzhanin in KVM (PVE/oVirt etc)
ivdok
А по какой формуле считается? Просто все показатели вроде iowait и steal складываются?
источник

DN

Dmitry Nagovitsin in KVM (PVE/oVirt etc)
Anton Ustiuzhanin
это не цпу просто. а суммарная нагрузка на систему. может быть и io любой.
Нагрузка чего
источник

DN

Dmitry Nagovitsin in KVM (PVE/oVirt etc)
В названии load average два раза спиздели
источник

DN

Dmitry Nagovitsin in KVM (PVE/oVirt etc)
Один раз про лоад
источник

DN

Dmitry Nagovitsin in KVM (PVE/oVirt etc)
Другой раз про аверейдж
источник

DN

Dmitry Nagovitsin in KVM (PVE/oVirt etc)
Про LA есть мой любимый комментарий в коде линуха
источник

DN

Dmitry Nagovitsin in KVM (PVE/oVirt etc)
источник

AU

Anton Ustiuzhanin in KVM (PVE/oVirt etc)
ну написано ведь что это глобал)
источник

DN

Dmitry Nagovitsin in KVM (PVE/oVirt etc)
Anton Ustiuzhanin
ну написано ведь что это глобал)
Там и расчет имеет мало отношения к avg
источник

AU

Anton Ustiuzhanin in KVM (PVE/oVirt etc)
ну это среднее от функции которая измеряется с некой периодичностью
источник