Skip to content

Imtjl/4th-year-guide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 

Repository files navigation

4th-year-guide

Оглавление:

  • Технологии виртуализации
  • Технологии виртуализации (проблемы)
  • РВ
  • АСиС
  • ЭПИ

Технологии виртуализации

Требования к ПК: Современные процессоры Intel c Windows. Если не хотите сильно мучиться, то вместо Windows комп с Ubuntu (не внутри виртуалки, а нативно), ну или установленный в dual boot. Где-то 500 гигов свободного места суммарно (80 минимум). Макососам не повезло, скорее всего выполнить первую лабу вы не сможете, но дальше гипотетически возможно.

[ЛР1] Запуск виртуальной машины и установка Additional guest virtualbox

  1. Скачиваем VirtualBox и VM VirtualBox Extension Pack
  2. Скачиваем готовые образы ОС:
  3. С помощью готового образа создаём новую виртуальную машину (2 Гига оперы, 50 жёсткого)
  4. Для Ubuntu напишите в консоль sudo apt install build-essential linux-headers-$(uname -r) (возможно понадобится изменить сетевой интерфейс на NAT). Это требуется для установки «Дополнения гостевой ОС»
  5. Не забудьте установить сетевое подключение – внутренняя сеть (как требовалось в задании в пункте 4.1.5)
  6. В меню нажимаем подключение «Дополнения гостевой ОС»
  7. Настройте буфер на двунаправленный и проверьте что он работает
  8. Запустите установку
  9. В Windows отключите брандмауэр для работы ping
  10. Действуйте по заданию

[ЛР2] Установка и запуск 3-х виртуалок внутри виртуалки (Адская лаба)

  1. Вместо 30 гигов выделяйте минимум 70
  2. Галочка nested vt-x/amd-v в virtualbox может быть не доступна. Её необходимо активировать через CMD:
  • cd "C:\Program Files\Oracle\VirtualBox"
  • VBoxManage modifyvm <YourVirtualMachineName> --nested-hw-virt on
  1. Проверьте доступность вложенной виртуализации в Ubuntu - grep -E '(svm|vmx)' /proc/cpuinfo. Команда не должна отрабатывать с пустым выводом. Вывод должен содержать выделенные 3 буквы (svm или vmx).
  2. Если вывод пустой - выполните действия, указанные в "Технологии виртуализации (проблемы) - [ЛР2] No KVM"
  3. Действуйте по заданию
  4. rdp можете выполнить к windows, запущенном в другой виртуальной машине с интерфейсом - сетевой мост (для ip)
  5. Действуйте по заданию

[ЛР3] Docker, LXD

  1. Действуйте по заданию

[ЛР4] proxmox

  1. Действуйте по заданию

Технологии виртуализации (проблемы)

[ЛР1] Виндовс не пингуется (Windows no ping), бесконечно зависает

Отключите брандмауэр которую пытаетесь пингануть!

[ЛР1, ЛР2, ?ЛР3?] При установке Additional guest virtualbox вылетает ошибка связанная с ядром (Ubuntu)

sudo apt install build-essential linux-headers-$(uname -r)

[ЛР1, ЛР2, ?ЛР3?] Терминал не открывается на версиях Ubuntu ниже 24

Поменяйте язык на любой другой (в настройках гостевой ос после установки)

[ЛР2] No KVM

Короче, трабла в том, что только одна программа может использовать так называемый "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
Loading

Выключаем 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 во вложенных виртуалках

[ЛР3] Не подключается MySQL

Попробуйте написать внешний ip: 10.0.2.15, ну или тот который ip a выводит

[ЛР3] Проблемы с конфигами (config.php-example)

похожая проблема на следующую, возможно в config.php требуется прописать что-то типо https://github.com/amancevice/nextcloud-server/blob/master/config/config.sample.php.

[ЛР3] Проблемы с волиумами

Если вы решили просто спиздить чужой 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 гигов достаточно)
  • Переустановить ОС

[ЛР4] Зависает proxmox на этапе установки после выбора графического инсталлера?

При установке proxmox необходимо выбрать ОС: linux+debian

[ЛР4] Нет интернета в гостевых ос в proxmox или по заданию нужно NAT?

Ох... Бля....
Пишем 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

РВ

Не работает usleep

#define _DEFAULT_SOURCE в САМЫЙ вверх main скрипта

Промпт-подсказка для 3 лабы

Историю балансов можно редактировать в прошлом, например:

ФУНКЦИЯ 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 часы инкрементирует один раз, независимо от количества процессов

Промпт-подсказка для 4 лабы

Для каждого процесса необходимо создать очередь, сортируемому по времени и номеру процесса. Убедитесь что 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 (не забудьте выключить интернет, чтобы обновления виндовс не ставились)

Ошибка 40 eNSP (Failed to start device AR1. Error code: 40. Detail: Failed to start!)

Ошибка запуска 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, все права (в том числе женщин, детей и людей) защищены

About

[In Progress]

Resources

Code of conduct

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors