- Proxmox — Включение xterm
- PROXMOX не корректно отрабатывает web-интерфейс
- Proxmox не работает консоль
- Одминский блог
- Ошибка 1006 noVNC соединения к виртуальной машине Proxmox VE
- Работа с кластером Proxmox: установка, настройка сети, ZFS, решение распространенных проблем
- Установка Proxmox
- Установка Nginx и Let’s Encrypt сертификата
- Установка и настройка ZFS
- Репликация инстансов на соседний гипервизор
- Особенности сетевых настроек на Hetzner
- В завершении
Proxmox — Включение xterm
Как в Proxmox включить поддержку консоли xterm.js для виртуальной машины (debian 9)?
Поиск вменяемых советов не дает. Установка пакета «apt install xterm» в гостевой системе не дает результата. Как я понял и не должно, т.к. это оболочка для X.
Из коробки после установки proxmox консоль xterm.js доступна для системы самого гипервизора (система на физической машине), но как включить поддержку для гостевой?
В kvm виртуалке оно работает через serial port
https://pve.proxmox.com/wiki/Serial_Terminal
в контейнерах работвет из коробки.
Ответ нашелся сразу же после публикации вопроса. С позволения админов, оставлю здесь ссылку на решение. Оригинал здесь: https://pve.proxmox.com/wiki/Serial_Terminal
По шагам: 1) в терминале гипервизора (физическая машина) выполнить команду
Появился связанный вопрос: есть возможность как-то запускать консоль xterm.js по умолчанию, как это сделано для гипервизора? Не критично, но это гораздо удобней.
Похоже без правки кода нет способа.
Видел на видео (https://www.youtube.com/watch?v=qKcmfVe77aA) альтернативный элемент в дереве навигации для открытия такой консоли. Интересно это руками прикручивали в коде или это было в старых версиях?
Я не против и в коде поковырять, но без подсказки где искать не осилю. Если кто знает куда копать — подскажите.
Источник
PROXMOX не корректно отрабатывает web-интерфейс
Доброго времени суток.
Не корректно отрабатывает web-интерфейс PROXMOX. Скриншот по ссылке. К сожалению, из-за показанной ошибки нельзя увидеть статус запуска виртуалки, подключиться к Консоли PROXMOX. Хотя виртуалки работают, к Линуксячим подключиться можно по SSH, к Виндузячным по RDP. Но такая ситуация не правильная.
Как исправить сложившуюся ошибку не перезагружая сервер и виртуальные машины.
Заранее спасибо всем ответившим.
Кластер или отдельный хост ?
/root/.ssh/known_hosts — попробуй переименовать
Попробовал, не помогло — теперь еще хуже (скриншот). Пишет: «Login failed. Please try again».
Все началось с того, что возникла необходимость перезагрузить одну из виртуалок. Виртуалка после этого не запустилась. При попытке посмотреть статус виртуалки через web-интерфейс столкнулся с проблемой что посмотреть ничего нельзя. Остальные виртуалки работают. Перезагружать весь хост бояздно — боюсь столкнуться с ситуацией неработающего сервера посередине рабочей недели.
Так же не помогло.
В режиме инкогнито попробуй открыть. Кэш браузера порой мешает нормально в проксе работать.
То же самое, и из других браузеров такая же картина.
бывает такая фигня. pct list не отрабатывает. надо покилять все, что связано с зависшим контейнером. иначе только ребут.
Без ребута всего хоста, перезагрузить только сервис нельзя?
можешь перезапустить все pve сервисы — не поможет. как-то удавалось покилять остатки зависшего контейнера и отпустило.
проблема даже проявляется иногда в последнем pve 5.4-11. Но ребята ушли пилить 6.0. Энтерпрайзненько чо
На моей практике такая проблема проявляется если ты перезапускаешь контейнер после обновления ядра без перезагрузки, дико бесит.
Починить интерфейс помогает ps aux | grep lxc и прибить lxc monitor для зависшего контейнера, но сам контейнер это не починит, только перезагрузка
Место на диске не закончилось?
А kworker случаем не грузит одно ядро на 100%. Если это так то, а оно очень похоже по симптомам, это достаточно неуловимый баг в proxmox 5.
Источник
Proxmox не работает консоль
ProxMox 3.0 При входе в консоль на любую машину белый экран https://yadi.sk/i/c66gJntk3HAGSW Яву обновил на свежую, ошибок не выдает. Через мозилу и хром одинаково, а через эксплорер не могу даже зайти на сам сервер. https://yadi.sk/i/hTVjfhaR3HAGe6 Виндовс 7, 64 бита — компьютер с которого пытаюсь выйти. Вот что пишется — no connection : Connection timed out TASK ERROR: command ‘/bin/nc -l -p 5900 -w 10 -c ‘/usr/bin/ssh -T -o BatchMode=yes 192.168.0.8 /usr/sbin/qm vncproxy 101 2>/dev/null» failed: exit code 1 Я так понимаю у меня проблемы с VNC сервером
а через эксплорер не могу даже зайти
При входе в консоль на любую машину белый экран
попробуйте поставить старенькую яву, 6.31, например.
Переустановил, не помогло.
Подключитесь по ssh и выложите логи pve и syslog на pastebin.
Это где вы такую древность нашли?
Если виртуалки на базе OpenVZ, то в них веб-консоль по умолчанию не работает из-за отсутствия tty-устройства. Можно либо ограничиться ssh/vzctl enter, либо посмотреть на вики/форуме, где-то там был рецепт включения: http://pve.proxmox.com/wiki/OpenVZ_Console
Лог оказался немногословным.
Попробуйте обратиться к гуглу
Источник
Одминский блог
Блог о технологиях, технократии и методиках борьбы с граблями
Ошибка 1006 noVNC соединения к виртуальной машине Proxmox VE
Неспешно знакомлюсь с системой виртуализации ProxMox VE, которая примечательна тем, что из коробки поддерживает одновременно KVM и OpenVZ. И, помимо этого, при крайне простом веб-интерфейсе, поддерживает все фичи виртуализации KVM в бесплатном режиме, хотя и выкидывает, при каждом заходе в админку, уведомление “у вас отсутствует подписка”. Что разительно отличает данную систему от VMware ESXi, которая в бесплатном режиме держит всего один камень, а также требует, как минимум, 2IP для создания виртуальной фермы серверов, ибо один забирает под сервер и не имеет собственной реализации NAT.
Всем удобная система, но напоролся на отвратительный баг, по которому в Mozilla Firefox с завидным постоянством отваливается браузерная noVNC консоль доступа к виртуальной машине через веб-консоль управления. Соединение просто прекращается, показывает форму логина и выдает ошибку Server disconnected (code: 1006). Причем наглухо, так что приходится скакать с бубном, пытаясь реанимировать noVNC соединение, ибо все новые начинают запускаться с этой же ошибкой.
Что только не ковырял, но лечится это только путем удаления куков для урла вебморды ProxMox и перечиткой сертификата, находящегося в разделе Дополнительно -> Сертификаты -> Просмотр сертификатов -> Серверы -> PVE Cluster Manager CA
Но поскольку noVNC консоль висла каждые пару минут, то стал искать пути как с этим жить и что делать, ибо в Vivaldi оказались те же проблемы. И случайно обнаружил очень занятный ценебаг-цефич: у меня установлена Mozilla Aurora, еще со времен протечки памяти Firefox. И вот при запуске Aurora стартует тот же самый Firefox 50.1.0, просто вторым окном. Но из него noVNC соединение работает вообще без нареканий, а из первого окна, где постоянно отваливалось – теперь максимум что, может зависнуть сессия noVNC, которую просто закрываешь и стартуешь новую консоль.
Очень странно конечно, но не менее странно, чем отвал сертификата ProxMox в процессе работы.
Еще одним вариантом быстрого доступа к консоли виртуальной машины с проблемами noVNC, является использование протокола SPICE (Simple Protocol for Independent Computing Environments) созданного как раз для доступа к десктопным VE машинам. В винде уже имеется встроенный виндовый клиент доступа RemoteViewer, но лучше установить свежий родной клиент. Тем более что там же можно взять драйвер редиректа USB.
Для использования SPICE соединения, следует погасить виртуальную машину, после чего в управлении виртуальной машиной PROXMOX, драйвер дисплея виртуальной машины надо переключить в SPICE режим, как показано на картинке. После старта виртуалки можно запускать соединение, либо с помощью виндового Remote Viewer, либо дополнительно установленного VirtViewer – последний работает как то по-стабильней.
З.Ы в процессе поиска решения, нашел самый угарный коммент о том, что чел обнаружил на своем сервере виртуализации установленный netcat6, который и выдавал эту ошибку. После того как он запустил команду “apt-get remove netcat6″ у него отлично заработало novnc. Если кто не понял, то повторять не надо.
Источник
Работа с кластером Proxmox: установка, настройка сети, ZFS, решение распространенных проблем
За последние несколько лет я очень тесно работаю с кластерами Proxmox: многим клиентам требуется своя собственная инфраструктура, где они могут развивать свой проект. Именно поэтому я могу рассказать про самые распространенные ошибки и проблемы, с которыми также можете столкнуться и вы. Помимо этого мы конечно же настроим кластер из трех нод с нуля.
Proxmox кластер может состоять из двух и более серверов. Максимальное количество нод в кластере равняется 32 штукам. Наш собственный кластер будет состоять из трех нод на мультикасте (в статье я также опишу, как поднять кластер на уникасте — это важно, если вы базируете свою кластерную инфраструктуру на Hetzner или OVH, например). Коротко говоря, мультикаст позволяет осуществлять передачу данных одновременно на несколько нод. При мультикасте мы можем не задумываться о количестве нод в кластере (ориентируясь на ограничения выше).
Сам кластер строится на внутренней сети (важно, чтобы IP адреса были в одной подсети), у тех же Hetzner и OVH есть возможность объединять в кластер ноды в разных датацентрах с помощью технологии Virtual Switch (Hetzner) и vRack (OVH) — о Virtual Switch мы также поговорим в статье. Если ваш хостинг-провайдер не имеет похожие технологии в работе, то вы можете использовать OVS (Open Virtual Switch), которая нативно поддерживается Proxmox, или использовать VPN. Однако, я рекомендую в данном случае использовать именно юникаст с небольшим количеством нод — часто возникают ситуации, где кластер просто “разваливается” на основе такой сетевой инфраструктуры и его приходится восстанавливать. Поэтому я стараюсь использовать именно OVH и Hetzner в работе — подобных инцидентов наблюдал в меньшем количестве, но в первую очередь изучайте хостинг-провайдера, у которого будете размещаться: есть ли у него альтернативная технология, какие решения он предлагает, поддерживает ли мультикаст и так далее.
Установка Proxmox
Proxmox может быть установлен двумя способами: ISO-инсталлятор и установка через shell. Мы выбираем второй способ, поэтому установите Debian на сервер.
Перейдем непосредственно к установке Proxmox на каждый сервер. Установка предельно простая и описана в официальной документации здесь.
Добавим репозиторий Proxmox и ключ этого репозитория:
Обновляем репозитории и саму систему:
После успешного обновления установим необходимые пакеты Proxmox:
Заметка: во время установки будет настраиваться Postfix и grub — одна из них может завершиться с ошибкой. Возможно, это будет вызвано тем, что хостнейм не резолвится по имени. Отредактируйте hosts записи и выполните apt-get update
С этого момента мы можем авторизоваться в веб-интерфейс Proxmox по адресу https:// :8006 (столкнетесь с недоверенным сертификатом во время подключения).
Изображение 1. Веб-интерфейс ноды Proxmox
Установка Nginx и Let’s Encrypt сертификата
Мне не очень нравится ситуация с сертификатом и IP адресом, поэтому я предлагаю установить Nginx и настроить Let’s Encrypt сертификат. Установку Nginx описывать не буду, оставлю лишь важные файлы для работы Let’s encrypt сертификата:
Команда для выпуска SSL сертификата:
Не забываем после установки SSL сертификата поставить его на автообновление через cron:
Отлично! Теперь мы можем обращаться к нашему домену по HTTPS.
Заметка: чтобы отключить информационное окно о подписке, выполните данную команду:
Перед подключением в кластер настроим сетевые интерфейсы на гипервизоре. Стоит отметить, что настройка остальных нод ничем не отличается, кроме IP адресов и названия серверов, поэтому дублировать их настройку я не буду.
Создадим сетевой мост для внутренней сети, чтобы наши виртуальные машины (в моем варианте будет LXC контейнер для удобства) во-первых, были подключены к внутренней сети гипервизора и могли взаимодействовать друг с другом. Во-вторых, чуть позже мы добавим мост для внешней сети, чтобы виртуальные машины имели свой внешний IP адрес. Соответственно, контейнеры будут на данный момент за NAT’ом у нас.
Работать с сетевой конфигурацией Proxmox можно двумя способами: через веб-интерфейс или через конфигурационный файл /etc/network/interfaces. В первом варианте вам потребуется перезагрузка сервера (или можно просто переименовать файл interfaces.new в interfaces и сделать перезапуск networking сервиса через systemd). Если вы только начинаете настройку и еще нет виртуальных машин или LXC контейнеров, то желательно перезапускать гипервизор после изменений.
Теперь создадим сетевой мост под названием vmbr1 во вкладке network в веб-панели Proxmox.
Изображение 2. Сетевые интерфейсы ноды proxmox1
Изображение 3. Создание сетевого моста
Изображение 4. Настройка сетевой конфигурации vmbr1
Настройка предельно простая — vmbr1 нам нужен для того, чтобы инстансы получали доступ в Интернет.
Теперь перезапускаем наш гипервизор и проверяем, создался ли интерфейс:
Изображение 5. Сетевой интерфейс vmbr1 в выводе команды ip a
Заметьте: у меня уже есть интерфейс ens19 — это интерфейс с внутренней сетью, на основе ее будет создан кластер.
Повторите данные этапы на остальных двух гипервизорах, после чего приступите к следующему шагу — подготовке кластера.
Также важный этап сейчас заключается во включении форвардинга пакетов — без нее инстансы не будут получать доступ к внешней сети. Открываем файл sysctl.conf и изменяем значение параметра net.ipv4.ip_forward на 1, после чего вводим следующую команду:
В выводе вы должны увидеть директиву net.ipv4.ip_forward (если не меняли ее до этого)
Настройка Proxmox кластера
Теперь перейдем непосредственно к кластеру. Каждая нода должна резолвить себя и другие ноды по внутренней сети, для этого требуется изменить значения в hosts записях следующих образом (на каждой ноде должна быть запись о других):
Также требуется добавить публичные ключи каждой ноды к остальным — это требуется для создания кластера.
Создадим кластер через веб-панель:
Изображение 6. Создание кластера через веб-интерфейс
После создания кластера нам необходимо получить информацию о нем. Переходим в ту же вкладку кластера и нажимаем кнопку “Join Information”:
Изображение 7. Информация о созданном кластере
Данная информация пригодится нам во время присоединения второй и третьей ноды в кластер. Подключаемся к второй ноде и во вкладке Cluster нажимаем кнопку “Join Cluster”:
Изображение 8. Подключение к кластеру ноды
Разберем подробнее параметры для подключения:
- Peer Address: IP адрес первого сервера (к тому, к которому мы подключаемся)
- Password: пароль первого сервера
- Fingerprint: данное значение мы получаем из информации о кластере
Изображение 9. Состояние кластера после подключения второй ноды
Вторая нода успешно подключена! Однако, такое бывает не всегда. Если вы неправильно выполните шаги или возникнут сетевые проблемы, то присоединение в кластер будет провалено, а сам кластер будет “развален”. Лучшее решение — это отсоединить ноду от кластера, удалить на ней всю информацию о самом кластере, после чего сделать перезапуск сервера и проверить предыдущие шаги. Как же безопасно отключить ноду из кластера? Для начала удалим ее из кластера на первом сервере:
После чего нода будет отсоединена от кластера. Теперь переходим на сломанную ноду и отключаем на ней следующие сервисы:
Proxmox кластер хранит информацию о себе в sqlite базе, ее также необходимо очистить:
Данные о коросинке успешно удалены. Удалим оставшиеся файлы, для этого необходимо запустить кластерную файловую систему в standalone режиме:
Перезапускаем сервер (это необязательно, но перестрахуемся: все сервисы по итогу должны быть запущены и работать корректно. Чтобы ничего не упустить делаем перезапуск). После включения мы получим пустую ноду без какой-либо информации о предыдущем кластере и можем начать подключение вновь.
Установка и настройка ZFS
ZFS — это файловая система, которая может использоваться совместно с Proxmox. С помощью нее можно позволить себе репликацию данных на другой гипервизор, миграцию виртуальной машины/LXC контейнера, доступ к LXC контейнеру с хост-системы и так далее. Установка ее достаточно простая, приступим к разбору. На моих серверах доступно три SSD диска, которые мы объединим в RAID массив.
Обновляем список пакетов:
Устанавливаем требуемые зависимости:
Устанавливаем сам ZFS:
Если вы в будущем получите ошибку fusermount: fuse device not found, try ‘modprobe fuse’ first, то выполните следующую команду:
Теперь приступим непосредственно к настройке. Для начала нам требуется отформатировать SSD и настроить их через parted:
Аналогичные действия необходимо произвести и для других дисков. После того, как все диски подготовлены, приступаем к следующему шагу:
zpool create -f -o ashift=12 rpool /dev/sda4 /dev/sdb4 /dev/sdc4
Мы выбираем ashift=12 из соображений производительности — это рекомендация самого zfsonlinux, подробнее про это можно почитать в их вики: github.com/zfsonlinux/zfs/wiki/faq#performance-considerations
Применим некоторые настройки для ZFS:
Теперь нам надо рассчитать некоторые переменные для вычисления zfs_arc_max, я это делаю следующим образом:
В данный момент пул успешно создан, также мы создали сабпул data. Проверить состояние вашего пула можно командой zpool status. Данное действие необходимо провести на всех гипервизорах, после чего приступить к следующему шагу.
Теперь добавим ZFS в Proxmox. Переходим в настройки датацентра (именно его, а не отдельной ноды) в раздел «Storage», кликаем на кнопку «Add» и выбираем опцию «ZFS», после чего мы увидим следующие параметры:
ID: Название стораджа. Я дал ему название local-zfs
ZFS Pool: Мы создали rpool/data, его и добавляем сюда.
Nodes: указываем все доступные ноды
Данная команда создает новый пул с выбранными нами дисками. На каждом гипервизоре должен появится новый storage под названием local-zfs, после чего вы сможете смигрировать свои виртуальные машины с локального storage на ZFS.
Репликация инстансов на соседний гипервизор
В кластере Proxmox есть возможность репликации данных с одного гипервизора на другой: данный вариант позволяет осуществлять переключение инстанса с одного сервера на другой. Данные будут актуальны на момент последней синхронизации — ее время можно выставить при создании репликации (стандартно ставится 15 минут). Существует два способа миграции инстанса на другую ноду Proxmox: ручной и автоматический. Давайте рассмотрим в первую очередь ручной вариант, а в конце я предоставлю вам Python скрипт, который позволит создавать виртуальную машину на доступном гипервизоре при недоступности одного из гипервизоров.
Для создания репликации необходимо перейти в веб-панель Proxmox и создать виртуальную машину или LXC контейнер. В предыдущих пунктах мы с вами настроили vmbr1 мост с NAT, что позволит нам выходить во внешнюю сеть. Я создам LXC контейнер с MySQL, Nginx и PHP-FPM с тестовым сайтом, чтобы проверить работу репликации. Ниже будет пошаговая инструкция.
Загружаем подходящий темплейт (переходим в storage —> Content —> Templates), пример на скриншоте:
Изображение 10. Local storage с шаблонами и образами ВМ
Нажимаем кнопку “Templates” и загружаем необходимый нам шаблон LXC контейнера:
Изображение 11. Выбор и загрузка шаблона
Теперь мы можем использовать его при создании новых LXC контейнеров. Выбираем первый гипервизор и нажимаем кнопку “Create CT” в правом верхнем углу: мы увидим панель создания нового инстанса. Этапы установки достаточно просты и я приведу лишь конфигурационный файл данного LXC контейнера:
Контейнер успешно создан. К LXC контейнерам можно подключаться через команду pct enter , я также перед установкой добавил SSH ключ гипервизора, чтобы подключаться напрямую через SSH (в PCT есть небольшие проблемы с отображением терминала). Я подготовил сервер и установил туда все необходимые серверные приложения, теперь можно перейти к созданию репликации.
Кликаем на LXC контейнер и переходим во вкладку “Replication”, где создаем параметр репликации с помощью кнопки “Add”:
Изображение 12. Создание репликации в интерфейсе Proxmox
Изображение 13. Окно создания Replication job
Я создал задачу реплицировать контейнер на вторую ноду, как видно на следующем скриншоте репликация прошла успешно — обращайте внимание на поле “Status”, она оповещает о статусе репликации, также стоит обращать внимание на поле “Duration”, чтобы знать, сколько длится репликация данных.
Изображение 14. Список синхронизаций ВМ
Теперь попробуем смигрировать машину на вторую ноду с помощью кнопки “Migrate”
Начнется миграция контейнера, лог можно просмотреть в списке задач — там будет наша миграция. После этого контейнер будет перемещен на вторую ноду.
Ошибка “Host Key Verification Failed”
Иногда при настройке кластера может возникать подобная проблема — она мешает мигрировать машины и создавать репликацию, что нивелирует преимущества кластерных решений. Для исправления этой ошибки удалите файл known_hosts и подключитесь по SSH к конфликтной ноде:
Примите Hostkey и попробуйте ввести эту команду, она должна подключить вас к серверу:
Особенности сетевых настроек на Hetzner
Переходим в панель Robot и нажимаем на кнопку “Virtual Switches”. На следующей странице вы увидите панель создания и управления интерфейсов Virtual Switch: для начала его необходимо создать, а после “подключить” выделенные сервера к нему. В поиске добавляем необходимые сервера для подключения — их не не нужно перезагружать, только придется подождать до 10-15 минут, когда подключение к Virtual Switch будет активно.
После добавления серверов в Virtual Switch через веб-панель подключаемся к серверам и открываем конфигурационные файлы сетевых интерфейсов, где создаем новый сетевой интерфейс:
Давайте разберем подробнее, что это такое. По своей сути — это VLAN, который подключается к единственному физическому интерфейсу под названием enp4s0 (он у вас может отличаться), с указанием номера VLAN — это номер Virtual Switch’a, который вы создавали в веб-панели Hetzner Robot. Адрес можете указать любой, главное, чтобы он был локальный.
Отмечу, что конфигурировать enp4s0 следует как обычно, по сути он должен содержать внешний IP адрес, который был выдан вашему физическому серверу. Повторите данные шаги на других гипервизорах, после чего перезагрузите на них networking сервис, сделайте пинг до соседней ноды по IP адресу Virtual Switch. Если пинг прошел успешно, то вы успешно установили соединение между серверами по Virtual Switch.
Я также приложу конфигурационный файл sysctl.conf, он понадобится, если у вас будут проблемы с форвардингом пакетом и прочими сетевыми параметрами:
Добавление IPv4 подсети в Hetzner
Перед началом работ вам необходимо заказать подсеть в Hetzner, сделать это можно через панель Robot.
Создадим сетевой мост с адресом, который будет из этой подсети. Пример конфигурации:
Теперь переходим в настройки виртуальной машины в Proxmox и создаем новый сетевой интерфейс, который будет прикреплен к мосту vmbr2. Я использую LXC контейнер, его конфигурацию можно изменять сразу же в Proxmox. Итоговая конфигурация для Debian:
Обратите внимание: я указал 26 маску, а не 29 — это требуется для того, чтобы сеть на виртуальной машине работала.
Добавление IPv4 адреса в Hetzner
Ситуация с одиночным IP адресом отличается — обычно Hetzner дает нам дополнительный адрес из подсети сервера. Это означает, что вместо vmbr2 нам требуется использоваться vmbr0, но на данный момент его у нас нет. Суть в том, что vmbr0 должен содержать IP адрес железного сервера (то есть использовать тот адрес, который использовал физический сетевой интерфейс enp2s0). Адрес необходимо переместить на vmbr0, для этого подойдет следующая конфигурация (советую заказать KVM, чтобы в случае чего возобновить работу сети):
Перезапустите сервер, если это возможно (если нет, перезапустите сервис networking), после чего проверьте сетевые интерфейсы через ip a:
Как здесь видно, enp2s0 подключен к vmbr0 и не имеет IP адрес, так как он был переназначен на vmbr0.
Теперь в настройках виртуальной машины добавляем сетевой интерфейс, который будет подключен к vmbr0. В качестве gateway укажите адрес, прикрепленный к vmbr0.
В завершении
Надеюсь, что данная статья пригодится вам, когда вы будете настраивать Proxmox кластер в Hetzner. Если позволит время, то я расширю статью и добавлю инструкцию для OVH — там тоже не все очевидно, как кажется на первый взгляд. Материал получился достаточно объемным, если найдете ошибки, то, пожалуйста, напишите в комментарии, я их исправлю. Всем спасибо за уделенное внимание.
Автор: Илья Андреев, под редакцией Алексея Жадан и команды «Лайв Линукс»
Источник