Оглавление:
- Технологии виртуализации
- Технологии виртуализации (проблемы)
- РВ
- АСиС
- ЭПИ
Требования к ПК: Современные процессоры Intel c Windows. Если не хотите сильно мучиться, то вместо Windows комп с Ubuntu (не внутри виртуалки, а нативно), ну или установленный в dual boot. Где-то 500 гигов свободного места суммарно (80 минимум). Макососам не повезло, скорее всего выполнить первую лабу вы не сможете, но дальше гипотетически возможно.
- Скачиваем VirtualBox и VM VirtualBox Extension Pack
- Скачиваем готовые образы ОС:
- С помощью готового образа создаём новую виртуальную машину (2 Гига оперы, 50 жёсткого)
- Для Ubuntu напишите в консоль
sudo apt install build-essential linux-headers-$(uname -r)(возможно понадобится изменить сетевой интерфейс на NAT). Это требуется для установки «Дополнения гостевой ОС» - Не забудьте установить сетевое подключение – внутренняя сеть (как требовалось в задании в пункте 4.1.5)
- В меню нажимаем подключение «Дополнения гостевой ОС»
- Настройте буфер на двунаправленный и проверьте что он работает
- Запустите установку
- В Windows отключите брандмауэр для работы ping
- Действуйте по заданию
- Вместо 30 гигов выделяйте минимум 70
- Галочка nested vt-x/amd-v в virtualbox может быть не доступна. Её необходимо активировать через CMD:
cd "C:\Program Files\Oracle\VirtualBox"VBoxManage modifyvm <YourVirtualMachineName> --nested-hw-virt on
- Проверьте доступность вложенной виртуализации в Ubuntu -
grep -E '(svm|vmx)' /proc/cpuinfo. Команда не должна отрабатывать с пустым выводом. Вывод должен содержать выделенные 3 буквы (svm или vmx). - Если вывод пустой - выполните действия, указанные в "Технологии виртуализации (проблемы) - [ЛР2] No KVM"
- Действуйте по заданию
- rdp можете выполнить к windows, запущенном в другой виртуальной машине с интерфейсом - сетевой мост (для ip)
- Действуйте по заданию
- Действуйте по заданию
- Действуйте по заданию
Отключите брандмауэр которую пытаетесь пингануть!
[ЛР1, ЛР2, ?ЛР3?] При установке Additional guest virtualbox вылетает ошибка связанная с ядром (Ubuntu)
sudo apt install build-essential linux-headers-$(uname -r)
Поменяйте язык на любой другой (в настройках гостевой ос после установки)
Короче, трабла в том, что только одна программа может использовать так называемый "Nested VT-x/AMD-V". У многих такой программой является Docker (он же WSL, он же Hyper-V), которая забирает на себя такую эксклюзивную возможность. Короче надо вырубить этот Hyper-V и забыть про докер до момента сдачи лабы.
flowchart TD
subgraph HostOS [Windows 11/10]
direction TB
subgraph WSL
direction LR
WSL_Prob["Подсистема Windows для Linux (WSL 2)"]
Docker_Prob["Докер (Docker Desktop)"]
HyperV_Prob[Гипервизор Hyper-V<br>Требуется для WSL/Docker]
HyperV_Prob --> WSL_Prob
WSL_Prob --> Docker_Prob
end
subgraph VirtualBox
direction TB
subgraph VM_VBox [Ubuntu]
direction LR
VM_CPU[CPU: vmx/svm недоступен]
VM_KVM[KVM]
subgraph NVM_VBox [Ubuntu in Ubuntu]
direction TB
NVM_CPU[Невозможно запустить! No KVM for Run!]
end
VM_CPU --> VM_KVM
VM_KVM --> NVM_VBox
end
end
subgraph CPU
direction TB
CPU_Host[Физический CPU Intel VT-x/AMD-V]
end
end
%% Связи для проблемной конфигурации
CPU_Host -->|"ЭКСКЛЮЗИВНЫЙ ДОСТУП Nested VT (Две вложенности)"|HyperV_Prob
CPU_Host -->|"Обычный доступ к виртуализации (Одна вложенность)"|VM_VBox
style WSL fill:#335533
style VirtualBox fill:#553333
style VM_KVM color:#555555
style NVM_VBox color:#555555
style NVM_CPU color:#555555
Выключаем Hyper-V:
DISM /Online /Disable-Feature:Microsoft-Hyper-V
(игнорируем призыв перезагрузится)
PowerShell Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor -All
(игнорируем призыв перезагрузится)
bcdedit /set hypervisorlaunchtype off
(перезагружаемся)
Проверка:
systeminfo | find "Hyper-V"
Должно быть написано: Hyper-V Requirements: A hypervisor has not been detected
Изоляция Ядра:
- Core isolation details (Изоляция ядра) -> Off (Откл.)
Включаем "Enable Nested VT-x/AMD-V" у виртуалки (если ещё не сделали):
cd "C:\Program Files\Oracle\VirtualBox"
VBoxManage modifyvm <YourVirtualMachineName> --nested-hw-virt on
Проверяем что всё хорошо внутри виртуалки:
grep svm /proc/cpuinfo
grep vmx /proc/cpuinfo
Хотя бы одна из этих команд должна вывести строчку и выделить искомую строку. Если вы увидели заветные 3 буквы на экране, значит вы смогли прокинуть виртуализацию и получить KVM в виртуалке!
Caution
Процессоры AMD работают не стабильно с вложенной виртуализацией и даже откат виртуалки на предыдущие снапшёты не спасут вас! Я получал случайные Kernel Panic во вложенных виртуалках
Попробуйте написать внешний ip: 10.0.2.15, ну или тот который ip a выводит
похожая проблема на следующую, возможно в config.php требуется прописать что-то типо https://github.com/amancevice/nextcloud-server/blob/master/config/config.sample.php.
Если вы решили просто спиздить чужой Docker файл (Или docker compose) и ничего не правили: Фатальная ошибка
Если прокинуть через -v путь до конфигурации, но этого файла не создали, то вместо файла вы увидите директорию с название "config.php", что не есть хорошо. Так что удалите его и вместо него создайте файл.
[ЛР4] Зависает установка ОС в proxmox на фразе "Booting from Hard Disk"? (Любая ошибка с вложенной ОС, такая как например "No support for hardware-accelerated KVM virtualization detected. Check BIOS settings for Intel VT/AMD-V/SVM.")
- Переключить bios на uefi
- Аппаратная виртуализация KVM: Нет (можно оставить включённую если KVM в 2 лабе работал, и Вы знаете, что делаете)
- Возможно памяти на диске не хватает? (16 гигов достаточно)
- Переустановить ОС
При установке proxmox необходимо выбрать ОС: linux+debian
Ох... Бля....
Пишем ip a и чекаем что нет надписи DOWN.
Конфиг для NAT для внутренних ОС (в зависимости от настроек возможно надо поменять enp0s3 на nic0). Скорее всего ошибку сделаете при переписывании так что лучше скачать через wget https://205826.github.io/T2P/ip.txt или curl ...:
Файл: /etc/network/interfaces
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet manual
auto vmbr0
iface vmbr0 inet static
address 192.168.100.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
# Включение IP forwarding и NAT
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.100.0/24' -o enp0s3 -j MASQUERADE
post-up iptables -A FORWARD -i vmbr0 -o enp0s3 -j ACCEPT
post-up iptables -A FORWARD -i enp0s3 -o vmbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
post-down iptables -t nat -D POSTROUTING -s '192.168.100.0/24' -o enp0s3 -j MASQUERADE
post-down iptables -D FORWARD -i vmbr0 -o enp0s3 -j ACCEPT
post-down iptables -D FORWARD -i enp0s3 -o vmbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
source /etc/network/interfaces.d/*
Перезагрузка: systemctl restart networking
Гостевой виртуальной машине надо присвоить статичный IP из диапазона 192.168.100.0/24 например: IP 192.168.100.201, маска 255.255.255.0, шлюз 192.168.100.1
#define _DEFAULT_SOURCE в САМЫЙ вверх main скрипта
Историю балансов можно редактировать в прошлом, например:
ФУНКЦИЯ update_balance_history(контекст, время, новый_баланс, новый_ожидающий_баланс):
история = контекст.история_балансов
последнее_время = история.длина_истории - 1
ЕСЛИ время > последнее_время:
последний_баланс = история.записи[последнее_время].баланс
последний_ожидающий = история.записи[последнее_время].ожидающий_баланс
ДЛЯ каждого момента t ОТ (последнее_время + 1) ДО (время - 1):
история.записи[t].время = t
история.записи[t].баланс = последний_баланс
история.записи[t].ожидающий_баланс = последний_ожидающий
история.записи[время].время = время
история.записи[время].баланс = новый_баланс
история.записи[время].ожидающий_баланс = новый_ожидающий_баланс
ЕСЛИ время >= история.длина_истории:
история.длина_истории = время + 1
контекст.текущий_баланс = новый_баланс
контекст.ожидающий_входящий = новый_ожидающий_баланс
КОНЕЦ ФУНКЦИИ
ФУНКЦИЯ update_balance_history_pending(контекст, время_отправки,
время_получения, сумма, новый_баланс):
история = контекст.история_балансов
// Обновляем историю балансов на момент получения
update_balance_history(контекст, время_получения, новый_баланс, контекст.ожидающий_входящий)
// Если получение произошло позже отправки, увеличиваем ожидающий баланс в промежуточные моменты
ЕСЛИ время_получения > время_отправки:
ДЛЯ каждого момента t ОТ время_отправки-1 ДО время_получения-1:
ЕСЛИ t < история.длина_истории:
история.записи[t].ожидающий_баланс += сумма
// На момент получения уменьшаем ожидающий баланс
ЕСЛИ время_получения < история.длина_истории:
ЕСЛИ контекст.ожидающий_входящий >= сумма:
история.записи[время_получения].ожидающий_баланс = контекст.ожидающий_входящий - сумма
ИНАЧЕ:
история.записи[время_получения].ожидающий_баланс = 0
КОНЕЦ ФУНКЦИИ
Не забудь финализировать историю балансов до общего максимального времени. Время необходимо увеличивать перед отправкой сообщения и после получения сообщения. Но при этом при send_multicast часы инкрементирует один раз, независимо от количества процессов
Для каждого процесса необходимо создать очередь, сортируемому по времени и номеру процесса. Убедитесь что send_multicast инкрементируют часы только один раз, независимо от количества процессов. Не рассылай сообщения в цикле для нескольких процессов, так как тогда часы будут увеличиваться и у каждого процесса будет разная очередь (в худшем случае попробуй удалить увеличение времени в send). В главном потоке после рассылки всем потокам сообщения о том, что текущий поток завершился не переставай обрабатывать CS_REQUEST и DONE. Как только от всех процессов получишь DONE, можешь просто завершить поток через exit(0);
Псевдокод:
request_cs(self):
ctx = self
increment_lamport_time()
// Формируем запрос
msg = CS_REQUEST со своим временем
// Добавляем свой запрос в упорядоченную очередь
add_to_queue(ctx, ctx.id, текущее_время)
// Рассылаем запрос всем другим процессам
send_multicast(ctx, msg)
// Ждём, пока все ответят и мы станем первыми в очереди
while (reply_count < N-1 ИЛИ !is_first_in_queue(ctx)):
received_msg = receive_any(ctx)
update_lamport_time(received_msg.time)
case received_msg.type:
CS_REQUEST:
add_to_queue(ctx, отправитель, received_msg.time)
send_reply(отправитель)
CS_REPLY:
reply_count++
CS_RELEASE:
remove_from_queue(отправитель)
DONE:
done_count++
return 0
release_cs(self):
ctx = self
// Убираем свой запрос из очереди
remove_from_queue(ctx, ctx.id)
// Рассылаем сообщение об освобождении
msg = CS_RELEASE со своим временем
send_multicast(ctx, msg)
return 0
Псевдокод для дочерних потоков:
child_process(ctx):
// Инициализация
init_lamport_time()
close_unused_pipes(ctx)
// Отправляем STARTED всем
msg = STARTED с лэмпорт-временем
send_multicast(ctx, msg)
// Ждём STARTED от всех процессов
for i in 1..N, i ≠ ctx.id:
receive(ctx, i, msg)
update_lamport_time(msg.time)
// Основной цикл работы
for iteration in 1..(ctx.id * 5):
if mutex_enabled:
request_cs(ctx) // ← Алгоритм из предыдущего псевдокода
// Полезная работа
print(message) // Принципиально важно использовать именно функцию print, так как она печатает посимвольно с задержкой, чтобы заметить разницу с и без мьютекса
if mutex_enabled:
release_cs(ctx) // ← Алгоритм из предыдущего псевдокода
// Завершение
msg = DONE с лэмпорт-временем
send_multicast(ctx, msg)
// Ждём DONE от других, обрабатывая попутные запросы CS
while done_count < N-1:
msg, sender = receive_any(ctx)
update_lamport_time(msg.time)
case msg.type:
DONE:
done_count++
CS_REQUEST:
// Отвечаем на запросы, даже завершаясь
send_reply(sender)
exit(0)
Вложенная виртуализация не требуется, так что можно выполнять лабы в виртуалке: https://disk.yandex.ru/d/s-3Sz8Rmn7O--A (не забудьте выключить интернет, чтобы обновления виндовс не ставились)
Ошибка запуска VM. Попробуйте запустить любую из созданных eNSP VM в виртуалбоксе и узнать ошибку. Используйте версию 5.2, так как в ней более полезные ошибки отображаются
Raw-mode is unavailable courtesy of Hyper-V (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT).-> Попробуйте "Панель управления" -> "Программы" -> "Включение или отключение компонентов Windows" -> "Платформа виртуальной машины"/"Hyper-V"Nonexistent host networking interface, name 'VirtualBox Host-Only Ethernet Adapter'-> ПомоглоVBoxManage hostonlyif create
TsenekovEvilIncorporated так же написал программу (youtrack_uploader.js в этом репозитории) для импорта CSV в задачи YouTrack. Из минусов, из-за того что все задачи завершаться в течении одного дня Burndown-диаграмма выглядит очень плохо (не работает). Удачи!
- <T> совместно с TsenekovEvilIncorporated
(с) 2025, все права (в том числе женщин, детей и людей) защищены