# 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`

<div style="margin-top: 100px;">
 <p xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/"><span property="dct:title">LinuxLabs</span> by <span property="cc:attributionName">Mikhail Kobuk</span> is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/?ref=chooser-v1" target="_blank" rel="license noopener noreferrer" style="display:inline-block;">CC BY-NC-SA 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/nc.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/sa.svg?ref=chooser-v1" alt=""></a></p> 
</div>