Установка и использование подсистемы Linux (WSL)
Для начала мы поговорим о первой версии WSL, которая появилась в версии Windows 10 Build 14251. Эта версия была первой полноценной системой Linux в «десятке».
Однако она не была лишена проблем. Во-первых, таким образом можно было запустить только консольные приложения, хотя в их числе были ssh, MySQL, Apache — все это устанавливалось через собственный менеджер пакетов. Во-вторых, она позволяла использовать лишь ограниченный набор дистрибутивов. В-третьих, первая WSL могла предложить не слишком высокое быстродействие из-за того, что выполнялась фактически в эмуляторе.
При этом система уже могла запускать почти все консольные программы, обновлять их, работать с bash-скриптами и так далее.
Но давайте перейдем к сути и поговорим о том, как можно установить первую WSL в Windows 10.
Шаг 1
Перед установкой любых дистрибутивов Linux в Windows необходимо сначала включить дополнительную функцию «Подсистема Windows для Linux».
Для этого открываем PowerShell от имени администратора (меню Пуск> PowerShell>, правой кнопкой по пункту и «Запуск от имени администратора»). Затем вводим эту команду:
Можно перегрузить компьютер для гарантии.
Шаг 2
Установите желаемый дистрибутив Linux из магазина Microsoft:
microsoft.com
В списке есть такие варианты дистрибутивов:
- Ubuntu 18.04 LTS
- Ubuntu 20.04 LTS
- openSUSE Leap 15.1
- SUSE Linux Enterprise Server 12 SP5
- SUSE Linux Enterprise Server 15 SP1
- Kali Linux
- Debian GNU/Linux
- Fedora Remix for WSL
- Pengwin
- Pengwin Enterprise
- Alpine WSL
- Raft(Free Trial)
Шаг 3
Скачиваем нужный дистрибутив, нажав кнопку «Получить» или Get.
microsoft.com
Помимо этого, можно загрузить нужный дистрибутив через Poweshell. Для этого вводим в Powershell команду:
Вместо «» подставляем нужную ссылку из списка дистрибутивов выше и ждем скачивания.
После этого, устанавливаем с помощью команды:
Где — это название пакета с дистрибутивом в формате .appx.
Также можно скачать дистрибутив с помощью утилиты cURL. Это делается через обычную командную строку. Команда тогда выглядит так:
После скачивания и установки нужно создать имя пользователя и пароль для нового дистрибутива.
microsoft.com
При этом важно, что в первой версии WSL нельзя использовать «графические» приложения — только консольные. Приложения с полноценным графическим окружением есть в WSL 2, к нему мы и переходим
Как проверить, используете ли вы уже systemd-resolved?
В некоторых дистрибутивах Linux по умолчанию уже используется systemd-resolved, например Ubuntu 19.04.
Если вы уже запустили systemd-resolved, вам не нужно включать его или настраивать систему для его использования. Однако вам может потребоваться убедиться, что инструменты управления сетью, такие как NetworkManager, настроены правильно, поскольку они могут игнорировать конфигурацию сети системы.
Прежде чем перейти к следующему разделу, выполните следующую команду, чтобы проверить, запущен ли уже systemd-resolved:
Если вы получили сообщение:
Вы не используете systemd-resolved и должны перейти к следующему разделу. Если вместо этого вы видите вывод, который начинается примерно так:
Тогда вы уже используете systemd-resolved и вам не нужно его включать.
Управление службами Linux
Теперь, когда вы уже знаете все основы, команды и параметры можно переходить к делу. Со всеми остальными тонкостями разберемся по пути. Сначала давайте посмотрим запущенные службы linux. Нас будут интересовать только программы, а не все эти дополнительные компоненты, поэтому воспользуемся опцией type:
Команда отобразила все службы, которые известны systemd, они сейчас запущены или были запущены. Программа не пересматривает все файлы, поэтому будут показаны только те службы, к которым уже обращались. Состояние loaded — означает, что конфигурационный файл был успешно загружен, следующая колонка active — служба была запущена, а running или exited значит выполняется ли сейчас служба или она успешно завершила свою работу. Листать список можно кнопками вверх/вниз.
Следующая команда позволяет получить список служб linux, в который входят все службы, даже не запущенные, те, которые не запускались, но известны systemd, но это еще не все службы в системе:
Дальше больше. Вы можете отсортировать список служб systemctl по состоянию. Например, только выполняющиеся:
Или те, которые завершились с ошибкой:
Для фильтрации можно брать любой показатель состояния из любой колонки. Другой командой мы можем посмотреть все файлы конфигурации служб на диске. Тут не будем фильтровать по типу, пусть программа покажет все:
Теперь отфильтруем только службы linux:
Здесь вы тоже можете использовать фильтры по состоянию. Теперь вы знаете как посмотреть запущенные службы linux, идем дальше.
Чтобы запустить службу используется команда start, например:
Причем расширение service можно опустить, оно и так подставляется по умолчанию. Если запуск прошел хорошо, программа ничего не выведет.
Остановить службу linux можно командой:
Посмотреть состояние службы позволяет команда status:
Здесь вы можете видеть, состояние running, exited, dead, failed и т д. А также несколько последних строчек вывода программы, которые очень помогут решить проблему с запуском если она возникнет.
Обнаружение systemd
Чтобы проверить, что systemd как управляющий системный администратор «официально», проверяет наличие . Это каталог в , который сама система создает при загрузке и что другие системные администраторы вряд ли смогут создать.
Но это просто маловероятно . Эта проверка уже сломана , потому что uselessd также создает этот каталог.
Другие, неофициальные, проверки не будут работать:
-
systemd публикует полный API RPC через D-Bus, который даже содержит имя и номер версии; но:
- Это не покрывается печально известной «гарантией стабильности интерфейса» и может меняться завтра или по прихоти.
- Так же выглядит похожий сервер D-Bus в systemd-shim .
- Так тоже бесполезно.
- Существование аналогично не гарантируется и аналогичным образом дублируется бесполезным.
Настройка локального DNS-сервера BIND9 на Ubuntu 20.04 LTS
Для настройки пакеты BIND9 перейдем в его каталог:
В нем нас будут интересовать следующие файлы:
- named.conf.options
- named.conf.local
Давайте сперва откроем файл :
И внесем в него следующие изменения:
Сохраните и закройте файл. Затем проверьте синтаксис файла конфигурации.
Если ничего не выдал, то все в порядке. Можно перезапустить службу:
Также если у вас закрыты порты то их необходимо открыть.
Для UFW
Для iptables
Это откроет TCP и UDP порт 53 для локальной сети 10.5.5.0 / 24. Затем с другого компьютера в той же локальной сети мы можем выполнить следующую команду для запроса записи A google.com.
где, 10.5.5.1 — IP адрес нашего сервера в локальной сети
Теперь проверьте журнал запросов с помощью следующей командой:
или
Из вывода видно что запросы поступают на наш DNS сервер, а он в свою очередь на них успешно отвечает.
В файле настраиваются зона прямого и обратного просмотра. В данном уже описано как это сделать
Опции Service-файла в Systemd
Service-файла в systemd обычно состоит из трех секций.
Общие элементы конфигурации сервиса настраиваются в секциях и
Параметры конфигурации конкретного сервиса настраиваются в секции .
Важные Опции Секции
Опция | Описание |
---|---|
Description | Краткое описание юнита. |
Documentation | Список ссылок на документацию. |
Before, After | Порядок запуска юнитов. |
Requires | Если этот сервис активируется, перечисленные здесь юниты тоже будут активированы. Если один из перечисленных юнитов останавливается или падает, этот сервис тоже будет остановлен. |
Wants | Устанавливает более слабые зависимости, чем Requires. Если один из перечисленных юнитов не может успешно запуститься, это не повлияет на запуск данного сервиса. Это рекомендуемый способ установления зависимостей. |
Conflicts | Если установлено что данный сервис конфликтует с другим юнитом, то запуск последнего остановит этот сервис и наоборот. |
Список всех опций секции :
$ man systemd.unit
1 | $man systemd.unit |
Важные Опции Секции
Опция | Описание |
---|---|
Alias | Дополнительные имена сервиса разделенные пробелами. Большинство команд в systemctl, за исключением systemctl enable, могут использовать альтернативные имена сервисов. |
RequiredBy, WantedBy | Данный сервис будет запущен при запуске перечисленных сервисов. Для более подробной информации смотрите описание опций Wants и Requires в секции . |
Also | Определяет список юнитов, которые также будут активированы или дезактивированы вместе с данным сервисом при выполнении команд systemctl enable или systemctl disable. |
Список всех опций секции :
$ man systemd.unit
1 | $man systemd.unit |
Важные Опции Секции
Опция | Описание |
---|---|
Type | Настраивает тип запуска процесса. Один из:simple (по умолчанию) — запускает сервис мгновенно. Предполагается, что основной процесс сервиса задан в ExecStart.forking — считает сервис запущенным после того, как родительский процесс создает процесс-потомка, а сам завершится.oneshot — аналогичен типу simple, но предполагается, что процесс должен завершиться до того, как systemd начнет отслеживать состояния юнитов (удобно для скриптов, которые выполняют разовую работу и завершаются). Возможно вы также захотите использовать RemainAfterExit=yes, чтобы systemd продолжал считать сервис активным и после завершения процесса.dbus — аналогичен типу simple, но считает сервис запущенным после того, как основной процесс получает имя на шине D-Bus.notify — аналогичен типу simple, но считает сервис запущенным после того, как он отправляет systemd специальный сигнал.idle — аналогичен типу simple, но фактический запуск исполняемого файла сервиса откладывается, пока не будут выполнены все задачи. |
ExecStart | Команды вместе с аргументами, которые будут выполнены при старте сервиса. Опция Type=oneshot позволяет указывать несколько команд, которые будут выполняться последовательно. Опции ExecStartPre и ExecStartPost могут задавать дополнительные команды, которые будут выполнены до или после ExecStart. |
ExecStop | Команды, которые будут выполнены для остановки сервиса запущенного с помощью ExecStart. |
ExecReload | Команды, которые будут выполнены чтобы сообщить сервису о необходимости перечитать конфигурационные файлы. |
Restart | Если эта опция активирована, сервис будет перезапущен если процесс прекращен или достигнут timeout, за исключением случая нормальной остановки сервиса с помощью команды systemctl stop |
RemainAfterExit | Если установлена в значение True, сервис будет считаться запущенным даже если сам процесс завершен. Полезен с Type=oneshot. Значение по умолчанию False. |
Список всех опций секции :
$ man systemd.service
1 | $man systemd.service |
Создание Сервиса в Systemd
Создайте service-файл /etc/systemd/system/foo-daemon.service (замените foo-daemon на имя вашего сервиса):
$ sudo touch /etc/systemd/system/foo-daemon.service
$ sudo chmod 664 /etc/systemd/system/foo-daemon.service
1 |
$sudo touchetcsystemdsystemfoo-daemon.service $sudo chmod664etcsystemdsystemfoo-daemon.service |
Откройте файл foo-daemon.service и пропишите минимальные настройки, которые позволят управлять сервисом с помощью systemctl:
Description=Foo
ExecStart=/usr/sbin/foo-daemon
WantedBy=multi-user.target
1 |
Unit Description=Foo Service ExecStart=usrsbinfoo-daemon Install WantedBy=multi-user.target |
Путь К Демону: Если вы не знаете путь к демону, попробуйте which foo-daemon.
После создания нового service-файла необходимо перезапустить systemd:
$ sudo systemctl daemon-reload
1 | $sudo systemctl daemon-reload |
Теперь вы можете делать start, stop, restart и проверять status сервиса:
$ sudo systemctl start foo-daemon
$ sudo systemctl stop foo-daemon
$ sudo systemctl restart foo-daemon
$ systemctl status foo-daemon
1 |
$sudo systemctl start foo-daemon $sudo systemctl stop foo-daemon $sudo systemctl restart foo-daemon $systemctl status foo-daemon |
Чтобы добавить сервис в автозагрузку, необходимо активировать его:
$ sudo systemctl enable foo-daemon
1 | $sudo systemctl enable foo-daemon |
Чтобы проверить логи сервиса, выполните:
$ journalctl -u foo-daemon
1 | $journalctl-ufoo-daemon |
Примеры systemd Unit файлов
Рассмотрим следующий пример, — это написания systemd скрипта для запуска tomcat-а. Для этого, открываем файл:
# vim /etc/systemd/system/tomcat9.service
И записываем в него следующий код:
Description=Tomcat9 After=syslog.target network.target Type=forking User=tomcat Group=tomcat Environment=CATALINA_PID=/usr/local/tomcat9/tomcat9.pid Environment=TOMCAT_JAVA_HOME=/usr/bin/java Environment=CATALINA_HOME=/usr/local/tomcat9 Environment=CATALINA_BASE=/usr/local/tomcat9 Environment=CATALINA_OPTS= #Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC' Environment="JAVA_OPTS=-Dfile.encoding=UTF-8 -Dnet.sf.ehcache.skipUpdateCheck=true -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+UseParNewGC -XX:MaxPermSize=128m -Xms512m -Xmx512m" ExecStart=/usr/local/tomcat9/bin/startup.sh ExecStop=/bin/kill -15 $MAINPID WantedBy=multi-user.target
Перезагрузим службу:
# systemctl daemon-reload
Добавим томкат в автозагрузку ОС:
# systemctl enable tomcat9
Перезапускаем томкат:
# systemctl restart tomcat9
Чтобы проверить статус, выполняем:
# systemctl status tomcat9 ● tomcat9.service - Tomcat9 Loaded: loaded (/etc/systemd/system/tomcat9.service; enabled) Active: active (running) since Tue 2017-05-09 22:04:58 EEST; 6s ago Process: 28528 ExecStop=/bin/kill -15 $MAINPID (code=exited, status=0/SUCCESS) Process: 28531 ExecStart=/usr/local/tomcat9/bin/startup.sh (code=exited, status=0/SUCCESS) Main PID: 28541 (java) CGroup: /system.slice/tomcat9.service └─28541 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9/conf/logging.properties -Djava.ut... May 09 22:04:58 debian systemd: Starting Tomcat9... May 09 22:04:58 debian startup.sh: Tomcat started. May 09 22:04:58 debian systemd: Started Tomcat9.
Как видим, все четко работает. На этом, у меня все! Больше примеров будет дальше. Я буду добавлять их по мере необходимости. Но в основном, я использую шаблон что выше ( только немного его видоизменяю).
Статья «Пишем systemd Unit файл» завершена.
Прочее
Это бонус для развлечения. Шутка от разработчиков Linux, не несущая пользы.
cowsay — заставляет цифровую корову повторить текст, который вы ей передали. Как echo, только от лица коровы.
fortune | cowsay — награждает корову философским интеллектом и дает ей возможность делиться с вами умными цитатами.
cowsay -l — демонстрирует всех животных, которые могут с вами пообщаться в том случае, если вам почему-то не приглянулась корова.
sudo название менеджера пакетов install fortunes fortune-mod fortunes-min fortunes-ru — учит животных говорить на русском.
Здесь, пожалуй, и остановимся. Ключевые SSH-команды сервера мы рассмотрели. Их хватит для навигации и выполнения базовых операций. Остальное уже на ваших плечах и полностью зависит от проекта, над которым вы работаете.
Использование безопасных DNS-запросов
systemd-resolved — это один из немногих доступных в настоящее время DNS-серверов, которые поддерживают DNSSEC и DNSoverTLS. Оба из них помогают гарантировать, что вы получаете подлинную информацию DNS (DNSSEC) и что никто не может отслеживать ваш трафик DNS, когда он проходит через Интернет. (DOT).
Эти параметры легко включить, открыв основной файл конфигурации systemd-resolved в текстовом редакторе:
И редактируем файл так, чтобы были установлены следующие две строки:
Сохраните и выйдите из редактора, затем перезагрузите systemd-resolved:
Пока на DNS-сервере вы установили поддержку DNSSEC и DoT, ваши DNS-запросы будут защищены. Оба публичных DNS-сервера Google и Cloudflare поддерживают эти протоколы.
Управление пользователями
Так как Linux заточена под использование большим количеством людей одновременно, разработчики придумали для нее продвинутую иерархию пользователей. У каждого свой набор прав и свои возможности. И есть целый набор команд для работы с ними. Рассмотрим главные.
useradd — создает на сервере новую учетную запись. По сути, нового пользователя. Синтаксис: useradd имя будущей учетной записи. Имя можно указать любое на свой вкус. Потом останется лишь добавить для нового аккаунта пароль.
passwd — задает пароль для учетной записи. Работает вкупе с предыдущей командой. То есть сразу после создания аккаунта, пишем: passwd имя новой учетной записи. После этого система попросит придумать и указать пароль для новой учетной записи.
Система безопасности в Linux не показывает во время ввода пароля даже звездочки, но это не значит, что он не вводится. Продолжайте набирать вслепую, а как закончите, нажмите Enter, и все сработает. И не бойтесь запутаться, вас попросят повторить придуманный пароль.
userdel — удаляет выбранную учетную запись. Синтаксис: userdel имя учетной записи, которую нужно стереть
usermod — вносит изменения в характеристики существующих учетных записей, лишает их контроля или вовсе приостанавливает работу. Делает все, что не связано с созданием и удалением аккаунтов. Используется только вместе с дополнительными опциями:
- -с — добавляет комментарий к аккаунту (можно вписать любой текст по желанию, чтобы запомнить для чего нужен выбранный пользователь).
- -d — меняет расположение домашней директории выбранной учетной записи.
- -e — указывает время, которое будет существовать аккаунт (после этого сработает автоматический userdel).
- -g — меняет группу, к которой принадлежит аккаунт.
- -G — привязывает аккаунт к выбранной группе.
- -L — блокирует пользователя.
- -m — перемещает контент из домашней папки пользователя в другую папку.
- -p — устанавливает незашифрованный пароль (лучше так не делать).
- -s — задает конкретную оболочку для нового аккаунта на усмотрение администратора компьютера.
- -U — снимает блокировку с выбранной учетной записи.
The repository does not have a Release file.
При попытке выполнить
sudo apt update
password for andrei:
Ign:1 cdrom://[Debian GNU/Linux 10.4.0 _Buster_ — Official amd64 DVD Binary-1 20200509-10:26] buster InRelease
Err:2 cdrom://[Debian GNU/Linux 10.4.0 _Buster_ — Official amd64 DVD Binary-1 20200509-10:26] buster Release
Please use apt-cdrom to make this CD-ROM recognized by APT. apt-get update cannot be used to add new CD-ROMs
Err:3 http://deb.debian.org/debian buster InRelease
Cannot initiate the connection to prod.debian.map.fastly.net:80 (2a04:4e42:14::204). — connect (101: Network is unreachable)
Could not connect to prod.debian.map.fastly.net:80 (151.101.84.204), connection timed out
Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:14::645). — connect (101: Network is unreachable)
Could not connect to deb.debian.org:80 (151.101.86.133), connection timed out
Err:4 http://deb.debian.org/debian buster-updates InRelease
Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:14::645). — connect (101: Network is unreachable)
Err:5 http://security.debian.org/debian-security buster/updates InRelease
Cannot initiate the connection to prod.debian.map.fastly.net:80 (2a04:4e42:14::204). — connect (101: Network is unreachable)
Could not connect to prod.debian.map.fastly.net:80 (151.101.84.204), connection timed out
Cannot initiate the connection to security.debian.org:80 (2a04:4e42:c00::204). — connect (101: Network is unreachable)
Cannot initiate the connection to security.debian.org:80 (2a04:4e42:200::204). — connect (101: Network is unreachable)
Cannot initiate the connection to security.debian.org:80 (2a04:4e42:400::204). — connect (101: Network is unreachable)
Cannot initiate the connection to security.debian.org:80 (2a04:4e42:a00::204). — connect (101: Network is unreachable)
Cannot initiate the connection to security.debian.org:80 (2a04:4e42::204). — connect (101: Network is unreachable)
Cannot initiate the connection to security.debian.org:80 (2a04:4e42:800::204). — connect (101: Network is unreachable)
Cannot initiate the connection to security.debian.org:80 (2a04:4e42:600::204). — connect (101: Network is unreachable)
Cannot initiate the connection to security.debian.org:80 (2a04:4e42:e00::204). — connect (101: Network is unreachable)
Could not connect to security.debian.org:80 (151.101.0.204), connection timed out
Could not connect to security.debian.org:80 (151.101.128.204), connection timed out
Could not connect to security.debian.org:80 (151.101.192.204), connection timed out
Could not connect to security.debian.org:80 (151.101.64.204), connection timed out
Reading package lists… Done
E: The repository ‘cdrom://[Debian GNU/Linux 10.4.0 _Buster_ — Official amd64 DVD Binary-1 20200509-10:26] buster Release’ does not have a Release file.
N: Updating from such a repository can’t be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
Проверяю
souces.list
sudo vi /etc/apt/sources.list
#
deb cdrom:[Debian GNU/Linux 10.4.0 _Buster_ — Official amd64 DVD Binary-1 20200509-10:26]/ buster contrib main
deb cdrom:[Debian GNU/Linux 10.4.0 _Buster_ — Official amd64 DVD Binary-1 20200509-10:26]/ buster contrib main
deb http://deb.debian.org/linux/debian/ buster main
deb-src http://deb.debian.org/linux/debian/ buster main
deb http://security.debian.org/debian-security buster/updates main contrib
deb-src http://security.debian.org/debian-security buster/updates main contrib
# buster-updates, previously known as ‘volatile’
deb http://deb.debian.org/linux/debian/ buster-updates main contrib
deb-src http://deb.debian.org/linux/debian/ buster-updates main contrib
Получение данных о состоянии системы
Мы можем получить от сервера с systemd огромное количество информации, чтобы узнать о состоянии системы.
Например, чтобы получить список юнитов, которые systemd считает активными, нужно выполнить следующую команду (можно даже не использовать опцию list-units, потому что она подразумевается по умолчанию):
sudo systemctl list-units
Для вывода списка юнитов, которые systemd загружал или пытался загрузить в память, в том числе не активные в данный момент, нужно указать опцию —all:
sudo systemctl list-units —all
Чтобы вывести все установленные в системе юниты, в том числе те, которые systemd не пытался загрузить в память, выполните команду:
sudo systemctl list-unit-files
Представленные выше команды показывали общее состояние системы, но можно также получить информацию о состоянии отдельных юнитов.
Для просмотра обзора текущего состояния самого юнита можно воспользоваться опцией status команды systemctl. Вы увидите, активен ли юнит, получите информацию о процессе и последние записи журнала:
systemctl status nginx.service
Подключение к серверу через SSH
Мы уже выяснили, что представляет собой SSH и команды для него. Теперь установим соединение с сервером.
Естественно, перед началом надо арендовать виртуальный хостинг или VDS у одного из доступных провайдеров. У Timeweb, к примеру.
Если у вас macOS или Linux
- Запускаем программу Terminal.
- Вводим в консоль команду со следующим синтаксисом ssh имя пользователя@адрес сервера. В моем случае это ssh root@89.223.127.80.
- Указываем пароль суперпользователя (его отправляет хостинг-провайдер сразу после регистрации).
- Жмем Enter.
Все. Соединение установлено, можно переходить к работе непосредственно с сервером.
Если у вас Windows
- Скачиваем и устанавливаем программу PuTTY.
- В строку IP-адрес вводим адрес своего VDS или виртуального хостинга.
- Жмем на кнопку Open.
- Вводим пароль администратора, чтобы получить доступ к управлению.
Управление протоколом SSH
У команды для подключения к удаленному PC по SSH есть две важных опции:
- ssh -p номер порта имя пользователя@адрес сервера — заменяет стандартный 22-й порт на иной, что положительно сказывается на безопасности и устойчивости к автоматическим хакерским атакам от ботов.
- ssh-copy-id -i путь до файла с ключом имя пользователя@адрес сервера— копирует ключ на сервер, чтобы вход осуществлялся без логина и пароля, а именно через ключ.