# LinuxLabs::Настройка виртуальной машины ## Информация Иногда случается так, что опасение испортить инструмент препятствует его овладеванию. Разумеется, осторожность и аккуратность в обращении с любым инструментарием - хорошая привычка, в данном конкретном случае "опасение испортить" - страх сломать рабочую, хорошо настроенную систему, или, что ещё хуже, потерять из-за этого данные. Это тем сильнее ограничивает в стремлении проверить, как работает то или иное действие, и к чему оно приведёт, чем меньше понятно, что происходит. Чтобы исключить этот фактор, предполагается использование виртуальных машин. ## Теоретический Минимум (ТеорМин) Рабочую машину (как правило, аппаратную - ноутбук/ПК), которую вы будете использовать для прохождения НЛР, принято называть хостовой машиной, или хостом (**host machine**, **host**). Основная операционная система, установленная на этой машине, или, как минимум, та, на которой вы будете проходить НЛР, называется хостовой ОС (**host OS**). В свою очередь машина и система, в которых вы непосредственно будете выполнять все задания, и которые не будут привязаны к реальному железу, принято называть гостевыми (**guest machine/OS**). На Linux-системах есть два пути использовать гостевые машины: **эмуляция** и **виртуализация**. На данный момент ключевое различие - тип работы с пользовательскими запросами и действиями. В случае виртуализации хостовая машина *программно имитирует работу железа*, на котором запускается с собственным ядром своя, гостевая, ОС. В случае же эмуляции ядро гостевой ОС особым образом запускается как процесс в хостовой ОС и все запросы гостевой ОС *выполняет ядро хостовой машины* - т.е. гостевая ОС не запускается в классическом понимании. Собственно, поэтому эмуляция более ограниченна - на хостовой ОС можно эмулировать только родственные ядра гостевых ОС (на Linux-машине можно эмулировать только ОС, работающие на ядре Linux). Подробности и разница в этих двух понятиях ещё будут уточняться в следующих ЛР, а пока что, в первых ЛР, мы будем использовать именно виртуальную, а не эмулированную машину. В Linux уществует несколько способов организации работы с виртуальными машинами: 0. QEMU в ручном режиме 1. Virtual Manager - QEMU-полуавтомат 2. VirtualBox - самый известный, наверное, менеджер виртуальных машин от Oracle Для начала будем использовать вариант 2, т.к. с ним вы, возможно, уже сталкивались, да и встречается он чаще остальных в различных курсах и пособиях, что обеспечивает ему хорошую инормационную базу на StackOverflow и иных форумах. ## Цель работы Рабочая "эталонная" виртуальная машина с установленной операционной системой. ## Ход работ ### A. Установка виртуального менеджера Определите пакетный менеджер вашего дистрибутива (BTW I use Arch). Используя его, обнаружьте и установите пакет: `sudo pacman -S virtualbox` ### B. Выбор системы Я предлагаю использовать Ubuntu Server. Несмотря на мою личную предвзятость к Ubuntu как к Desktop OS, в качестве начальной серверной системы я предлагаю использовать именно её. Она достаточно стабильна, своевременно обновляется и при этом не требует повышенного внимания. Бонусом идёт более широкая поддержка именно как серверной системы - найти инструкции и обсуждения популярных проблем касательно серверной части легче именно для Ubuntu. Берём достаточно свежий [образ](https://ubuntu.com/download/server) (на момент написания это 22.04.4 LTS) и приступаем к установке ### C. Создание ВМ #### C.1 Новая ВМ ![New VM button](./new_vm.png) #### C.2 Метаданные ![VM confiuration](./vm_config.png) `ubuntu_ro` - означает `ubuntu_r`[ead]`o`[nly]. Это не накладывает никаких ограничений с точки зрения VirtualBox, это семантическое обозначения для нас. При работе с виртуальными машинами вам иногда будет необходимо создавать "с нуля" несколько "чистых" машин. Гораздо удобнее вместо создания с нуля каждой машины клонировать некоторую эталонную. Также это поможет быстро получить новую машину в случае поломки. Об этом будет сказано подробнее в следующей лабораторной работе. Значение "Folder" можно оставить по умолчанию. Оно обозначает место, где будут храниться файлы данной ВМ. "ISO Image" - образ, который был получен в предыдущих шагах. Флажок "Skip Unattended Installation". Некоторые образы виртуальных машин в VirtualBox позволяют устаналивать их в практически полностью автоматическом режиме. Но один из девизов данного НЛР - "Мы не ищем лёгких путей". К тому же, в процессе изучения все новые элементы, с которыми вы сталкиваетесь, должны привязываться к чему-то, с чем вы уже встречались, чтобы картина происходящего выглядела цельно, а не представляла собой раздробленный архипелаг островов обрывочных знаний, мало связанных между собой. По этим причинам при первой встрече с новыми действиями и темами, данные ЛР будут концентрироваться на минимальном количестве автоматизации в них. #### C.3 Настройки железа ![VM hardware](./vm_hw.png) Мы используем систему виртуализации, поэтому нужно определить параметры аппаратной части (железа), на котором будет запущена наша гостевая ОС. Будем использовать минимальные параметры, которые удовлетворяют системным требованиям выбранного образа - 1 ядро и 1 Гб ОЗУ. > При возможности, лучше выделить 3+Гб ОЗУ и 2+ядра на каждую машину. Имейте в > виду, что для некоторых лабораторных работ вам может потребоваться запустить > 2-4 виртуальные машины одновременно. Флажок "Enable EFI" в данной серии лабораторных работ нам не потребуется. #### C.4 Настройки ханилища ![VM disk](./vm_hd.png) Для ОС нужно место на жёстком (в нашем случае - виртуальном) диске (ПЗУ). 1 из 3 вариантов, которые предлагает VirtualBox - создание нового диска прямо в ходе процесса настройки. Минимальные требования для выбранного образа 2.5Гб. Поскольку в ходе следующих ЛР будет требоваться установка различного ПО, увеличим объём. > 8Гб - оптимальное, на мой взгляд, значение, которое позволит не беспокоиться >о свободном месте для установки пакетов и в том же время достаточно невелико, >чтобы не создавать трудностей для современных накопителей. При ограниченности >доступного свободного пространства размер можно сократить до 6Гб и 4Гб. >Использовать размер менее 4Гб не рекомендуется. Флажок "Pre-allocate Full Size" отвечает за тип выделения места. Если сделать его активным в процессе установки, виртуальный диск будет занимать сразу столько места на реальном накопителе, сколько вы указали при создании. Это позволит избежать ошибок в работе ВМ в случае, если свободное место на реальном накопителе будет заканчиваться. На практике в таких случаях ВМ "приостанавливается". Если же флажок неактивен, изначальным объём диска будет равен фактически занятому месту и будет постепенно расти по мере увеличения количества файлов и данных в гостевой ОС, пока не достигнет максимального размера. #### C.5 Virtuality! Если всё было сделано правильно, VirtualBox покажет окно с выдержкой из конфигурации VM. После нажимаем на "Finish" - и готово. ### D. Запуск ![VM start](./vm_start.png) ### E[rror]. Веселье начинается Вероятно, вам повезло, и вы не столкнулись с трудностями при запуске, однако я, как и большинство тех, кто шли таким же путём, столкнулся со следующей проблемой: ![VM error](./vm_start_err.png) В моём случае помогла установка пакета "headers" для моего ядра и dkms для VirtualBox: `sudo pacman -S virtualbox-host-dkms linux-lts-headers` Все термины будут пояснены позже, на данный же момент должно быть достаточно следующих пояснений: для пакета ядра Linux, которое вы используете на своей системе, как правило, существует отельный пакет, предоставляющий заголовочные файлы. В некоторых дистрибутивах эти два пакета не разделяются. Я использую ArchLinux на ядре [`linux-lts`](https://archlinux.org/packages/core/x86_64/linux-lts/), поэтому устанавливал [`linux-lts-headers`](https://archlinux.org/packages/core/x86_64/linux-lts-headers/). После окончания установки пакетов - `reboot` - готово, проблема решена. > Данная проблема, на самом деле, не так однозначна. Если вы используете другой >дистрибутив и/или вам пришлось предпринять другие шаги для решения проблемы, >пожалуйста, сообщите мне и я включу ваш способ в данную ЛР. ### F. Загрузка После решения первой проблемы (поздравляю!) запуск ВМ вызовет новое окно, в котором спустя некоторое время появится окно загрузчика: ![VM loader](./vm_in_setup.png) ### G. Установка #### G.1 Локали Когда система загрузится, Ubuntu сразу начнёт процесс преднастройки. Для удобства и привыкания к реальным условиям выбираем язык Egnlish: ![VM setup: language](./vm_in_setup_lang.png) Язык, как и клавиатура, формат даты и времени и др., относится к т.н. локалям (англ. locale, locales). Они определяют поведения пользовательского ввода и даже могут влиять на работу и производительность определённого ПО. Кстати, вот и клавиатура: ![VM setup: kbd](./vm_in_setup_kbd.png) #### G.2 Тип установки Читаем комментарии и выбираем первый варинт установки. Флажок оставляем неотмеченным - он отвечает за использование некоторых проприетарных драйверов. Они не требуется в подавляющем большинстве случаев. ![VM setup: type](./vm_in_setup_type.png) #### G.3 Сеть В сети пока что предоставляем установщику выбор по умолчанию и нажимаем далее. ![VM setup: net](./vm_in_setup_net.png) Если вы знаете, что вам нужен прокси, укажите его на этом этапе. Во всех остальных случаях, идём дальше. ![VM setup: net: proxy](./vm_in_setup_net_proxy.png) #### G.4 Зеркала После этого установщик попытается самостоятельно проверить доступность **зеркал** и их состояние. Если всё пошло по плану, появится надпись `This mirror location passed tests`. ![VM setup: mirrors](./vm_in_setup_mirrors.png) > Для получения обновлений Linux-системы используют **репозитории**, в которых >содержатся пакеты (программы, библиотеки и т.д.) и вся необходимая сопутствующая >информация. На популярные репозитории приходится очень большая нагрузка. Чтобы >избежать отказа оборудования или организации слишком сложной системы, >применяется практика зеркалирования: для основного репозитория создаётся полная >копия основного репозитория (поэтому и "зеркало", англ. **mirror**), на которую >по определённому принципу (чаще всего, географическому, перенаправляется часть >запросов. #### G.5 ВМ-Диски При разметке в данной серии ЛР доверимся установщику. Флажок "Set up this disk as an LVM group" отвечает за ещё один уровень абстракции дискового пространства (эта тема будет разбираться в следующих ЛР). ![VM setup: disk](./vm_in_setup_disk.png) Внимательно смотрим, подтверждаем. ![VM setup: disk: confirm](./vm_in_setup_disk_confirm.png) Натыкаемся на справедливое негодование системы. Внимательно читаем. ![VM setup: disk: confirm: continue](./vm_in_setup_disk_confirm_continue.png) Преодолеваем его и продолжаем процесс. #### G.6 Данные для входа ![VM setup: credentials](./vm_in_setup_creds.png) "Your name" - отображаемое в GUI и т.д. имя пользователя. _Зачем это нужно?.._ "Your servers name" - **hostname**, **имя хоста** сервера. Это имя отображается в ряде программ и утилит, например, анализирующих сеть или подключенные устройства. Иными словами, как и написано мелким текстом под полем, это - имя вашего компьютера, которое могут использовать другие машины при общении с ним. "Pick a username" - фактическое имя пользователя, которое будет использоваться при логине и в некоторых файлах конфигурации. Пароль не нужно делать большим и трудным - он относится к виртуальной машине, в данной серии ЛР ВМ практически не будут общаться с внешним миром, за исключением установки пакетов и нечастых сетевых подключений. #### G.7 Пропускаем навязчивую рекламу ![VM setup: skip ad](./vm_in_setup_skipad.png) #### G.8 Автоустановка Снимаем флажок установки OpenSSH-сервера, так как это тема следующей лабораторной работы. ![VM setup: SSH](./vm_in_setup_ssh.png) Снимаем флажки установки сервисов, так как некоторые из них - темы заключительных ЛР этой серии. ![VM setup: services](./vm_in_setup_services.png) #### G.9 Завершение установки Если вы ещё успеваете, можете отменить установку обновления - мы сделаем это вручную чуть позже. ![VM setup: cancel update](./vm_in_setup_noupd.png) Если не успели - ничего страшного. Дожидаемся автоматической перезагрузки. > В зависимости от выделенных ресурсов, возможно, придётся некоторое время > подождать. ### H. Извлечение установочного диска Система-установщик, которой мы только что пользовались, была подключена к нашей системе как внешний диск и всё ещё подключена. А из-за того, что по умолчанию внешние диски имеют бОльший приоритет, система продолжает загружаться с внешнего диска. ![Loader again](./vm_in_loader_again.png) Отключаем внешний диск: ![Remove disk: menu](./vm_in_rm_disk_menu.png) ![Remove disk](./vm_in_rm_disk.png) Нажимаеем ПКМ на пиктограмме диска: ![Remove disk: dropdown](./vm_in_rm_disk_rmd.png) Снимаем флажок. Перезагружаем машину с помощью `Machine->Reset` в левой верхней части окна. ### I. Загрузка гостевой ОС В Ubuntu server по умолчанию логин никак не отделён от системного вывода, поэтому вполне возможно, что ввод будет засыпан сообщениями о загрузке, например, так: ![Login message flood](./vm_in_msg_flood.png) Вопрос решается нажатием "Enter"/"Ввод" несколько раз: ![Login message flood resolved](./vm_in_msg_flood_enter.png) ### J. Вход Вводим данные указанные на этапе [G.6](#g.6-данные-для-входа). Готово! ![Logged in](./vm_in_logged_in.png) ### K. Перед завершением лабораорной работы обновим пакеты. Для обращения к зеркалам и реопзиториям с приложениями в Ubuntu используется пакетный менеджен APT. Так как установка пакетов - ответственное действие, которое лучше не доверять всем пользователям. В связи с этим по умолчанию устанавливать пакеты может только **суперпользователь** (англ. **superuser**). Те же пользователи, которые таки должны иметь возможность выполнять администраторские функции, используют команду `sudo` - **S**uper**U**ser**DO**. Для современного системного администрирования стандартной практикой стал отказ от использования пользователя `root` при логине. Для логина в машину используется пользователь с обычной учётной записью и правами на использование `sudo`, все команды, требующие администраторских привилегий, выполняются с приставкой `sudo`. > Мир прав и политик безопасности Linux гораздо обширнее. В частности, есть > механизмы, позволяющие повысить защищённость системы при использовании `sudo` > или облегчить администратору использование `root`-прав. Они будут рассмотрены > позднее. Сначала нужно обновить информацию о пакетах, которая содержится в удалённом репозитории. Это делается с помощью команды: `sudo apt update` ![_sudo apt update_](./vm_in_upd.png) Если на данном этапе возникли ошибки, связанные с cdrom, игнорируйте их, они будут решены чуть позднее. После выполнения этой команды наши локальные базы данных синхронизированы с удалёнными репозиториями. Теперь можно обновить непосредственно пакеты: `sudo apt upgrade` Пакетный менеджер любезно уточнит, хотите ли вы продолжить: ![_sudo apt upgrade_](./vm_in_continue) Здесь можно явно ввести `y` или `Y`, однако, как правило, если одна из букв выбора - заглавная, при нажатии "Enter"/"Ввод" автоматически будет выбрана она. Также, эту проверку можно отключить, используя флаг `-y`: `sudo apt upgrade -y` Если в процессе обновления пакетов появляются новые диалоговые окна, нажимайте "Ok". ### L. Выключение Чтобы выключить машину наиболее правильно, воспользуйтесь одной из команд: `shutdown now` или `systemctl poweroff`

LinuxLabs by Mikhail Kobuk is licensed under CC BY-NC-SA 4.0