<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@xbrekz</title><author><name>@xbrekz</name></author><id>https://teletype.in/atom/xbrekz</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/xbrekz?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/xbrekz?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-11T14:48:29.526Z</updated><entry><id>xbrekz:H8-hKBU17xR</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/H8-hKBU17xR?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Kaniko</title><published>2023-06-29T10:42:56.141Z</published><updated>2023-06-29T10:42:56.141Z</updated><summary type="html">https://github.com/GoogleContainerTools/kaniko</summary><content type="html">
  &lt;p id=&quot;vrxO&quot;&gt;https://github.com/GoogleContainerTools/kaniko&lt;/p&gt;
  &lt;p id=&quot;E4eq&quot;&gt;https://www.youtube.com/watch?v=EgwVQN6GNJg&lt;/p&gt;

</content></entry><entry><id>xbrekz:c5XRCebFlaL</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/c5XRCebFlaL?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Kaniko</title><published>2023-06-29T09:43:17.091Z</published><updated>2023-06-29T09:43:17.091Z</updated><summary type="html">https://github.com/GoogleContainerTools/kaniko</summary><content type="html">
  &lt;p id=&quot;vrxO&quot;&gt;https://github.com/GoogleContainerTools/kaniko&lt;/p&gt;

</content></entry><entry><id>xbrekz:TUr8QNU36ZS</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/TUr8QNU36ZS?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Шпаргалка по kubectl</title><published>2023-06-29T09:19:44.064Z</published><updated>2023-06-29T09:19:44.064Z</updated><summary type="html">Манифесты Kubernetes могут быть определены в YAML или JSON. Можно использовать расширение файла .yaml, .yml и .json</summary><content type="html">
  &lt;h2 id=&quot;контекст-и-конфигурация-kubectl&quot;&gt;Контекст и конфигурация kubectl&lt;/h2&gt;
  &lt;pre id=&quot;ccEC&quot;&gt;kubectl config view # показать объединённые настройки kubeconfig

# использовать несколько файлов kubeconfig одновременно и посмотреть объединённую конфигурацию из этих файлов
KUBECONFIG=~/.kube/config:~/.kube/kubconfig2

kubectl config view

# получить пароль для пользователя e2e
kubectl config view -o jsonpath=&amp;#x27;{.users[?(@.name == &amp;quot;e2e&amp;quot;)].user.password}&amp;#x27;

kubectl config view -o jsonpath=&amp;#x27;{.users[].name}&amp;#x27;    # показать первого пользователя
kubectl config view -o jsonpath=&amp;#x27;{.users[*].name}&amp;#x27;   # получить список пользователей
kubectl config get-contexts                          # показать список контекстов
kubectl config current-context                       # показать текущий контекст (current-context)
kubectl config use-context my-cluster-name           # установить my-cluster-name как контекст по умолчанию

# добавить новую конфигурацию для кластера в kubeconf с базовой аутентификацией
kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword

# сохранить пространство имен для всех последующих команд kubectl в этом контексте.
kubectl config set-context --current --namespace=ggckad-s2

# установить контекст, используя имя пользователя и пространство имен.
kubectl config set-context gce --user=cluster-admin --namespace=foo \
  &amp;amp;&amp;amp; kubectl config use-context gce

kubectl config unset users.foo                       # удалить пользователя foo&lt;/pre&gt;
  &lt;h2 id=&quot;создание-объектов&quot;&gt;Создание объектов&lt;/h2&gt;
  &lt;p id=&quot;kPLq&quot;&gt;Манифесты Kubernetes могут быть определены в YAML или JSON. Можно использовать расширение файла &lt;code&gt;.yaml&lt;/code&gt;, &lt;code&gt;.yml&lt;/code&gt; и &lt;code&gt;.json&lt;/code&gt;&lt;/p&gt;
  &lt;pre id=&quot;kPLq&quot;&gt;kubectl apply -f ./my-manifest.yaml            # создать ресурсы
kubectl apply -f ./my1.yaml -f ./my2.yaml      # создать ресурсы из нескольких файлов
kubectl apply -f ./dir                         # создать ресурсы из всех файлов манифеста в директории
kubectl apply -f https://git.io/vPieo          # создать ресурсы из URL-адреса
kubectl create deployment nginx --image=nginx  # запустить один экземпляр nginx
kubectl explain pods                           # посмотреть документацию по манифестам подов

# Создать несколько YAML-объектов из stdin
cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - &amp;quot;1000000&amp;quot;
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - &amp;quot;1000&amp;quot;
EOF

# Создать секрет с несколькими ключами
cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: $(echo -n &amp;quot;s33msi4&amp;quot; | base64 -w0)
  username: $(echo -n &amp;quot;jane&amp;quot; | base64 -w0)
EOF&lt;/pre&gt;
  &lt;h2 id=&quot;просмотр-и-поиск-ресурсов&quot;&gt;Просмотр и поиск ресурсов&lt;/h2&gt;
  &lt;p id=&quot;RJ5p&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;Vj7P&quot;&gt;# Get-команды с основном выводом
kubectl get services                          # Вывести все сервисы в пространстве имён
kubectl get pods --all-namespaces             # Вывести все поды во всех пространств имён
kubectl get pods -o wide                      # Вывести все поды в текущем пространстве имён с подробностями
kubectl get deployment my-dep                 # Вывести определённое развёртывание
kubectl get pods                              # Вывести все поды в пространстве имён
kubectl get pod my-pod -o yaml                # Получить информацию по поду в формате YAML

# Посмотреть дополнительные сведения команды с многословным выводом
kubectl describe nodes my-node
kubectl describe pods my-pod

# Вывести сервисы, отсортированные по имени
kubectl get services --sort-by=.metadata.name

# Вывести поды, отсортированные по количеству перезагрузок
kubectl get pods --sort-by=&amp;#x27;.status.containerStatuses[0].restartCount&amp;#x27;

# Вывести постоянные тома (PersistentVolumes), отсортированные по емкости
kubectl get pv --sort-by=.spec.capacity.storage

# Получить метку версии всех подов с меткой app=cassandra
kubectl get pods --selector=app=cassandra -o \
  jsonpath=&amp;#x27;{.items[*].metadata.labels.version}&amp;#x27;

# Получить все рабочие узлы (с помощью селектора исключаем узлы с меткой &amp;#x27;node-role.kubernetes.io/master&amp;#x27;)
kubectl get node --selector=&amp;#x27;!node-role.kubernetes.io/master&amp;#x27;

# Получить все запущенные поды в пространстве имён
kubectl get pods --field-selector=status.phase=Running

# Получить внешние IP-адреса (ExternalIP) всех узлов
kubectl get nodes -o jsonpath=&amp;#x27;{.items[*].status.addresses[?(@.type==&amp;quot;ExternalIP&amp;quot;)].address}&amp;#x27;

# Вывести имена подов, принадлежащие к определённому RC
# Использование команды &amp;quot;jq&amp;quot; помогает упросить поиск в jsonpath, подробнее смотрите на сайте https://stedolan.github.io/jq/
sel=${$(kubectl get rc my-rc --output=json | jq -j &amp;#x27;.spec.selector | to_entries | .[] | &amp;quot;\(.key)=\(.value),&amp;quot;&amp;#x27;)%?}
echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})

# Показать метки всех подов (или любого другого объекта Kubernetes, которым можно прикреплять метки)
kubectl get pods --show-labels

# Получить готовые узлы
JSONPATH=&amp;#x27;{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}&amp;#x27; \
 &amp;amp;&amp;amp; kubectl get nodes -o jsonpath=&amp;quot;$JSONPATH&amp;quot; | grep &amp;quot;Ready=True&amp;quot;

# Вывод декодированных секретов без внешних инструментов
kubectl get secret my-secret -o go-template=&amp;#x27;{{range $k,$v := .data}}{{&amp;quot;### &amp;quot;}}{{$k}}{{&amp;quot;\n&amp;quot;}}{{$v|base64decode}}{{&amp;quot;\n\n&amp;quot;}}{{end}}&amp;#x27;

# Вывести все секреты, используемые сейчас в поде.
kubectl get pods -o json | jq &amp;#x27;.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name&amp;#x27; | grep -v null | sort | uniq

# Вывести все идентификаторы (containerID) контейнеров инициализации (initContainers) во всех подах.
# Это полезно при очистке остановленных контейнеров, не удаляя при этом контейнеры инициализации.
kubectl get pods --all-namespaces -o jsonpath=&amp;#x27;{range .items[*].status.initContainerStatuses[*]}{.containerID}{&amp;quot;\n&amp;quot;}{end}&amp;#x27; | cut -d/ -f3

# Вывести события, отсортированные по временной метке
kubectl get events --sort-by=.metadata.creationTimestamp

# Сравнить текущее состояние кластера с состоянием, в котором находился бы кластер в случае применения манифеста.
kubectl diff -f ./my-manifest.yaml&lt;/pre&gt;
  &lt;h2 id=&quot;p0G4&quot;&gt;&lt;br /&gt;Обновление ресурсов&lt;/h2&gt;
  &lt;p id=&quot;4c0b&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;0ZdV&quot;&gt;kubectl set image deployment/frontend www=image:v2               # Плавающее обновление контейнеров &amp;quot;www&amp;quot; развёртывания &amp;quot;frontend&amp;quot;, обновление образа
kubectl rollout history deployment/frontend                      # Проверить историю развёртывания, включая ревизии.
kubectl rollout undo deployment/frontend                         # Откатиться к предыдущему развёртыванию
kubectl rollout undo deployment/frontend --to-revision=2         # Откатиться к определённой ревизии
kubectl rollout status -w deployment/frontend                    # Отслеживать статус плавающего развёртывания &amp;quot;frontend&amp;quot; до его завершения
kubectl rollout restart deployment/frontend                      # Перезапуск плавающего развёртывания &amp;quot;frontend&amp;quot;


# Объявлено устаревшим, начиная с версии 1.11
kubectl rolling-update frontend-v1 -f frontend-v2.json           # (устарело) Плавающее обновление подов frontend-v1
kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2  # (устарело) Изменить имя ресурса и обновить образ
kubectl rolling-update frontend --image=image:v2                 # (устарело) Обновить образ подов frontend
kubectl rolling-update frontend-v1 frontend-v2 --rollback        # (устарело) Отменить выполняющееся обновление

cat pod.json | kubectl replace -f -                              # Заменить под из определения в JSON-файле, переданного в поток stdin

# Принудительно заменить, удалить, а затем пересоздать ресурс. Это приведет к простою приложения
kubectl replace --force -f ./pod.json

# Создать сервис с реплицированным nginx на порту 80, который подключается к контейнерам на порту 8000.
kubectl expose rc nginx --port=80 --target-port=8000

# Обновить версию (метку) образа пода из одного контейнера single до v4
kubectl get pod mypod -o yaml | sed &amp;#x27;s/\(image: myimage\):.*$/\1:v4/&amp;#x27; | kubectl replace -f -

kubectl label pods my-pod new-label=awesome                      # Добавить метку
kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq       # Добавить аннотацию
kubectl autoscale deployment foo --min=2 --max=10                # Автоматически масштабировать развёртывание &amp;quot;foo&amp;quot; в диапазоне от 2 до 10 подов
&lt;/pre&gt;
  &lt;h2 id=&quot;обновление-ресурсов-1&quot;&gt;Обновление ресурсов&lt;/h2&gt;
  &lt;p id=&quot;loEa&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;cQFi&quot;&gt;# Обновить часть узла
kubectl patch node k8s-node-1 -p &amp;#x27;{&amp;quot;spec&amp;quot;:{&amp;quot;unschedulable&amp;quot;:true}}&amp;#x27;

# Обновить образ контейнера; необходимо указать spec.containers[*].name, чтобы произвести слияние
kubectl patch pod valid-pod -p &amp;#x27;{&amp;quot;spec&amp;quot;:{&amp;quot;containers&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;kubernetes-serve-hostname&amp;quot;,&amp;quot;image&amp;quot;:&amp;quot;new image&amp;quot;}]}}&amp;#x27;

# Обновить образ контейнера через json-патч с позиционными массивами
kubectl patch pod valid-pod --type=&amp;#x27;json&amp;#x27; -p=&amp;#x27;[{&amp;quot;op&amp;quot;: &amp;quot;replace&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/containers/0/image&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;new image&amp;quot;}]&amp;#x27;

# Удалить развертывание livenessProbe через json-патч с позиционными массивами
kubectl patch deployment valid-deployment  --type json   -p=&amp;#x27;[{&amp;quot;op&amp;quot;: &amp;quot;remove&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/spec/template/spec/containers/0/livenessProbe&amp;quot;}]&amp;#x27;

# Добавить нового элемента в позиционный массив
kubectl patch sa default --type=&amp;#x27;json&amp;#x27; -p=&amp;#x27;[{&amp;quot;op&amp;quot;: &amp;quot;add&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/secrets/1&amp;quot;, &amp;quot;value&amp;quot;: {&amp;quot;name&amp;quot;: &amp;quot;whatever&amp;quot; } }]&amp;#x27;&lt;/pre&gt;
  &lt;p id=&quot;LIP6&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;редактирование-ресурсов&quot;&gt;Редактирование ресурсов&lt;/h2&gt;
  &lt;p id=&quot;fd62&quot;&gt;Вы можете отредактировать API-ресурс в любом редакторе.&lt;/p&gt;
  &lt;pre id=&quot;KC6F&quot;&gt;kubectl edit svc/docker-registry                      # Отредактировать сервис docker-registry
KUBE_EDITOR=&amp;quot;nano&amp;quot; kubectl edit svc/docker-registry   # Использовать другой редактор
&lt;/pre&gt;
  &lt;p id=&quot;GCaY&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;масштабирование-ресурсов&quot;&gt;Масштабирование ресурсов&lt;/h2&gt;
  &lt;pre id=&quot;grja&quot;&gt;kubectl scale --replicas=3 rs/foo                                 # Масштабирование набора реплик (replicaset) &amp;#x27;foo&amp;#x27; до 3
kubectl scale --replicas=3 -f foo.yaml                            # Масштабирование ресурса в &amp;quot;foo.yaml&amp;quot; до 3
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # Если количество реплик в развёртывании mysql равен 2, масштабировать его до 3
kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # Масштабирование нескольких контроллеров репликации до 5
&lt;/pre&gt;
  &lt;p id=&quot;Cv3i&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;удаление-ресурсов&quot;&gt;Удаление ресурсов&lt;/h2&gt;
  &lt;pre id=&quot;4znj&quot;&gt;kubectl delete -f ./pod.json                                              # Удалить под по типу и имени в pod.json
kubectl delete pod,service baz foo                                        # Удалить поды и сервисы с одноимёнными именам &amp;quot;baz&amp;quot; и &amp;quot;foo&amp;quot;
kubectl delete pods,services -l name=myLabel                              # Удалить поды и сервисы с именем метки myLabel
kubectl -n my-ns delete pod,svc --all                                     # Удалить все поды и сервисы в пространстве имен my-ns
# Удалить все поды, соответствующие pattern1 или pattern2 в awk
kubectl get pods  -n mynamespace --no-headers=true | awk &amp;#x27;/pattern1|pattern2/{print $1}&amp;#x27; | xargs  kubectl delete -n mynamespace pod
&lt;/pre&gt;
  &lt;h2 id=&quot;работа-с-запущенными-подами&quot;&gt;Работа с запущенными подами&lt;/h2&gt;
  &lt;pre id=&quot;wSl6&quot;&gt;kubectl logs my-pod                                 # вывести логи пода (в stdout)
kubectl logs -l name=myLabel                        # вывести логи пода с меткой myLabel (в stdout)
kubectl logs my-pod --previous                      # вывести логи пода (в stdout) по предыдущему экземпляру контейнера
kubectl logs my-pod -c my-container                 # вывести логи контейнера пода (в stdout, при работе с несколькими контейнерами)
kubectl logs -l name=myLabel -c my-container        # вывести логи пода с меткой myLabel (в stdout)
kubectl logs my-pod -c my-container --previous      # вывести логи контейнера пода (в stdout, при работе с несколькими контейнерами) по предыдущему экземпляру контейнера
kubectl logs -f my-pod                              # вывести логи пода в режиме реального времени (в stdout)
kubectl logs -f my-pod -c my-container              # вывести логи контейнера пода в режиме реального времени (в stdout, при работе с несколькими контейнерами)
kubectl logs -f -l name=myLabel --all-containers    # вывести логи всех подов с меткой myLabel (в stdout)
kubectl run -i --tty busybox --image=busybox -- sh  # запустить под как интерактивную оболочку
kubectl run nginx --image=nginx --restart=Never -n
mynamespace                                         # Запустить под nginx в заданном пространстве имён
kubectl run nginx --image=nginx --restart=Never     # Запустить под nginx и записать его спецификацию в файл pod.yaml
--dry-run -o yaml &amp;gt; pod.yaml

kubectl attach my-pod -i                            # Прикрепить к запущенному контейнеру
kubectl port-forward my-pod 5000:6000               # Переадресовать порт 5000 в локальной машине на порт 6000 в поде my-pod
kubectl exec my-pod -- ls /                         # Выполнить команду в существующем поде (в случае одного контейнера).
kubectl exec my-pod -c my-container -- ls /         # Выполнить команду в существующем поде (в случае нескольких контейнеров)
kubectl top pod POD_NAME --containers               # Показать метрики по заданному поду вместе с его контейнерами&lt;/pre&gt;
  &lt;p id=&quot;9Rum&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;q1q2&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;работа-с-узлами-и-кластером&quot;&gt;Работа с узлами и кластером&lt;/h2&gt;
  &lt;pre id=&quot;lFH7&quot;&gt;
kubectl cordon my-node                                                # Отметить узел my-node как неназначаемый
kubectl drain my-node                                                 # Вытеснить узел my-node, чтобы подготовиться к эксплуатации
kubectl uncordon my-node                                              # Отметить узел my-node как назначаемый
kubectl top node my-node                                              # Показать метрики по заданному узлу
kubectl cluster-info                                                  # Показать адреса главного узла и сервисов
kubectl cluster-info dump                                             # Вывести состояние текущего кластера в stdout
kubectl cluster-info dump --output-directory=/path/to/cluster-state   # Вывести состояние текущего кластера в /path/to/cluster-state

# Если ограничение с заданным ключом и проявлением уже существует, его значение будет заменено указанным
kubectl taint nodes foo dedicated=special-user:NoSchedule
&lt;/pre&gt;
  &lt;p id=&quot;FXf8&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;типы-ресурсов&quot;&gt;Типы ресурсов&lt;/h3&gt;
  &lt;p id=&quot;OQwv&quot;&gt;Вывести все поддерживаемые типы ресурсов, включая &lt;a href=&quot;https://kubernetes.io/docs/concepts/overview/kubernetes-api/#api-groups&quot; target=&quot;_blank&quot;&gt;API-группу&lt;/a&gt;, флаг &lt;a href=&quot;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces&quot; target=&quot;_blank&quot;&gt;namespaced&lt;/a&gt; (организован ли ресурс в пространство имён или нет) и &lt;a href=&quot;https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects&quot; target=&quot;_blank&quot;&gt;Kind&lt;/a&gt;:&lt;/p&gt;
  &lt;pre id=&quot;x8IU&quot;&gt;kubectl api-resources
&lt;/pre&gt;
  &lt;p id=&quot;UdRV&quot;&gt;Другие варианты команды для анализа API-ресурсов:&lt;/p&gt;
  &lt;pre id=&quot;Y0qm&quot;&gt;kubectl api-resources --namespaced=true      # Все ресурсы с пространством имён
kubectl api-resources --namespaced=false     # Все ресурсы без пространства имён
kubectl api-resources -o name                # Все ресурсы с простым выводом  (только имя ресурса)
kubectl api-resources -o wide                # Все ресурсы с расширенным (с неограниченной длинной) выводом
kubectl api-resources --verbs=list,get       # Все ресурсы, которые поддерживают глаголы запроса &amp;quot;list&amp;quot; и &amp;quot;get&amp;quot;
kubectl api-resources --api-group=extensions # Все ресурсы в API-группе &amp;quot;extensions&amp;quot;
&lt;/pre&gt;
  &lt;h3 id=&quot;форматирование-вывода&quot;&gt;Форматирование вывода&lt;/h3&gt;
  &lt;p id=&quot;WMNY&quot;&gt;Для вывода подробной информации в окно терминала в определенном формате, добавьте флаг &lt;code&gt;-o&lt;/code&gt; (или &lt;code&gt;--output&lt;/code&gt;) в команду &lt;code&gt;kubectl&lt;/code&gt;, которая поддерживает форматирование.&lt;/p&gt;
  &lt;p id=&quot;4OSv&quot;&gt;Формат вывода&lt;/p&gt;
  &lt;p id=&quot;cb47&quot;&gt;Описание&lt;/p&gt;
  &lt;p id=&quot;dPzY&quot;&gt;&lt;code&gt;-o=custom-columns=&amp;lt;spec&amp;gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;arKy&quot;&gt;Вывод таблицы из списка пользовательских столбцов через запятую&lt;/p&gt;
  &lt;p id=&quot;1x4a&quot;&gt;&lt;code&gt;-o=custom-columns-file=&amp;lt;filename&amp;gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rXCB&quot;&gt;Вывод таблицы из списка пользовательских столбцов, определённых в файле &lt;code&gt;&amp;lt;filename&amp;gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JVxL&quot;&gt;&lt;code&gt;-o=json&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;D8I8&quot;&gt;Вывод API-объекта в формате JSON&lt;/p&gt;
  &lt;p id=&quot;1jRQ&quot;&gt;&lt;code&gt;-o=jsonpath=&amp;lt;template&amp;gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;F8mO&quot;&gt;Вывод полей, определённых в выражении &lt;a href=&quot;https://kubernetes.io/docs/reference/kubectl/jsonpath&quot; target=&quot;_blank&quot;&gt;jsonpath&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Qll3&quot;&gt;&lt;code&gt;-o=jsonpath-file=&amp;lt;filename&amp;gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;wye0&quot;&gt;Вывод полей, определённых в выражении &lt;a href=&quot;https://kubernetes.io/docs/reference/kubectl/jsonpath&quot; target=&quot;_blank&quot;&gt;jsonpath&lt;/a&gt; из файла &lt;code&gt;&amp;lt;filename&amp;gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dqKl&quot;&gt;&lt;code&gt;-o=name&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;DpZV&quot;&gt;Вывод только имена ресурсов&lt;/p&gt;
  &lt;p id=&quot;RpFn&quot;&gt;&lt;code&gt;-o=wide&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;F805&quot;&gt;Вывод дополнительную информации в обычном текстовом формате, в случае подов отображается имя узла&lt;/p&gt;
  &lt;p id=&quot;cH0o&quot;&gt;&lt;code&gt;-o=yaml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;qCYe&quot;&gt;Вывод API-объекта в формате YAML&lt;/p&gt;
  &lt;h3 id=&quot;уровни-детальности-вывода-и-отладки-в-kubectl&quot;&gt;Уровни детальности вывода и отладки в Kubectl&lt;/h3&gt;
  &lt;p id=&quot;BCxI&quot;&gt;Уровни детальности вывода Kubectl регулируются с помощью флагов &lt;code&gt;-v&lt;/code&gt; или &lt;code&gt;--v&lt;/code&gt;, за которыми следует целое число, представляющее уровни логирования. Общие соглашения по логированию Kubernetes и связанные с ними уровни описаны &lt;a href=&quot;https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;g3lP&quot;&gt;Уровень детальности&lt;/p&gt;
  &lt;p id=&quot;DUiE&quot;&gt;Описание&lt;/p&gt;
  &lt;p id=&quot;d5Rh&quot;&gt;&lt;code&gt;--v=0&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6ENL&quot;&gt;Как правило, используется чтобы &lt;em&gt;всегда&lt;/em&gt; видеть, что происходит&lt;/p&gt;
  &lt;p id=&quot;r3gD&quot;&gt;&lt;code&gt;--v=1&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UFDK&quot;&gt;Достаточный уровень логирования по умолчанию, если вам не нужна большая детальность.&lt;/p&gt;
  &lt;p id=&quot;FgUq&quot;&gt;&lt;code&gt;--v=2&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;emkg&quot;&gt;Полезная информация про стабильное состояние сервиса и важные сообщения логов, которые могут связаны со значительными изменениями в системе. Это рекомендуемый уровень логирования по умолчанию для большинства систем.&lt;/p&gt;
  &lt;p id=&quot;a5Q6&quot;&gt;&lt;code&gt;--v=3&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;DqVR&quot;&gt;Расширенная информация об изменениях.&lt;/p&gt;
  &lt;p id=&quot;1e9i&quot;&gt;&lt;code&gt;--v=4&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JCpI&quot;&gt;Уровень детальности для отладки.&lt;/p&gt;
  &lt;p id=&quot;BUpY&quot;&gt;&lt;code&gt;--v=6&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4r6n&quot;&gt;Показать запрашиваемые ресурсы.&lt;/p&gt;
  &lt;p id=&quot;LYd9&quot;&gt;&lt;code&gt;--v=7&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3vVT&quot;&gt;Показать заголовки HTTP-запросов.&lt;/p&gt;
  &lt;p id=&quot;eSdC&quot;&gt;&lt;code&gt;--v=8&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XGIr&quot;&gt;Показать содержимое HTTP-запросов.&lt;/p&gt;
  &lt;p id=&quot;5O1y&quot;&gt;&lt;code&gt;--v=9&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zdus&quot;&gt;Показать содержимого HTTP-запроса в полном виде.&lt;/p&gt;

</content></entry><entry><id>xbrekz:op3fnZThD9c</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/op3fnZThD9c?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Различия между Docker, containerd, CRI-O и runc</title><published>2023-06-25T15:01:49.458Z</published><updated>2023-06-25T15:01:49.458Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/a1/99/a1992203-5880-4a66-898c-7d0173bab5f4.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/050/4ed/d43/0504edd4341e33f85eef45a3acc1bb58.png&quot;&gt;Появление Docker привело к взрывному росту популярности контейнеров, но с тех пор появились и другие инструменты. К сожалению, разобраться в них может быть совсем непросто. Но мы попробуем! И если вы считаете себя единственным, кто всего этого пока не понимает, не волнуйтесь... Это не так!</summary><content type="html">
  &lt;p id=&quot;EFJg&quot;&gt;Появление Docker привело к взрывному росту популярности контейнеров, но с тех пор появились и другие инструменты. К сожалению, разобраться в них может быть совсем непросто. Но мы попробуем! И если вы считаете себя единственным, кто всего этого пока не понимает, не волнуйтесь... Это не так!&lt;/p&gt;
  &lt;h3 id=&quot;ijbH&quot;&gt;Что такое Docker?&lt;/h3&gt;
  &lt;p id=&quot;dyLx&quot;&gt;Существует разница между компанией Docker, контейнерами Docker, образами Docker и инструментами Docker, к которым мы все привыкли. Важно понимать, что Docker — лишь один из инструментов для работы с контейнерами; существуют и другие инструменты, причем некоторые из них поддерживает сама компания Docker.&lt;/p&gt;
  &lt;figure id=&quot;ISVW&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/050/4ed/d43/0504edd4341e33f85eef45a3acc1bb58.png&quot; width=&quot;1118&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yyxX&quot;&gt;Как видите, вы не единственный, кто сбит с толку. Давайте разберёмся, чем отличаются Docker, containerd и CRI-O. Это особенно важно, если вы работаете с Kubernetes.&lt;/p&gt;
  &lt;h3 id=&quot;mVmy&quot;&gt;Обзор экосистемы контейнеров&lt;/h3&gt;
  &lt;p id=&quot;Tvjs&quot;&gt;Экосистема контейнеров состоит из множества технологий, специальной терминологии и компаний, конкурирующих друг с другом. К счастью, компании иногда заключают хрупкое перемирие, чтобы согласовать некоторые стандарты. Эти стандарты помогают добиться совместимости между различными инструментами и избежать зависимости от одной компании или проекта. Основные стандарты, о которых необходимо знать:&lt;/p&gt;
  &lt;ul id=&quot;sY24&quot;&gt;
    &lt;li id=&quot;1Qoc&quot;&gt;&lt;strong&gt;Container Runtime Interface (CRI)&lt;/strong&gt; определяет API между Kubernetes и Container Runtime (средой выполнения контейнеров).&lt;/li&gt;
    &lt;li id=&quot;fk13&quot;&gt;&lt;strong&gt;Open Container Initiative (OCI) &lt;/strong&gt;определяет стандарт образов и контейнеров.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;PLpE&quot;&gt;На этой иллюстрации показано, как Docker, Kubernetes, OCI, CRI, containerd и runc вписываются в эту экосистему:&lt;/p&gt;
  &lt;figure id=&quot;VbFX&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/6cf/371/505/6cf371505338de90648154673a301af2.png&quot; width=&quot;881&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;Taay&quot;&gt;Docker&lt;/h3&gt;
  &lt;p id=&quot;zkb4&quot;&gt;Мы начнем с Docker, потому что это самый популярный инструмент для работы с контейнерами в настоящий момент. Для многих само название &amp;quot;Docker&amp;quot; является синонимом слова «контейнер».&lt;/p&gt;
  &lt;p id=&quot;tHGv&quot;&gt;Компания Docker создала очень удобный инструмент для работы с контейнерами. Docker можно установить на ноутбук (Docker Desktop) ​​или сервер (Docker Engine). Он содержит набор инструментов, упрощающих труд разработчиков и DevOps—инженеров. С помощью Docker CLI можно создавать образы контейнеров, работать с репозиториями, создавать, запускать и управлять контейнерами.&lt;/p&gt;
  &lt;figure id=&quot;XlRV&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/5be/265/09e/5be26509e8e0d0fd502704b55c816520.png&quot; width=&quot;1353&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;m8Bw&quot;&gt;Docker состоит из трех проектов:&lt;/p&gt;
  &lt;ul id=&quot;0lyg&quot;&gt;
    &lt;li id=&quot;nYR4&quot;&gt;&lt;a href=&quot;https://github.com/docker/cli&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;docker-cli:&lt;/strong&gt;&lt;/a&gt; утилита командной строки, с которой вы взаимодействуете с помощью команды &lt;code&gt;docker&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;Ul1K&quot;&gt;&lt;a href=&quot;https://containerd.io/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;containerd:&lt;/strong&gt;&lt;/a&gt; Linux Daemon, который управляет контейнерами и запускает их. Он загружает образы из репозитория, управляет хранилищем и сетью, а также контролирует работу контейнеров.&lt;/li&gt;
    &lt;li id=&quot;of2O&quot;&gt;&lt;a href=&quot;https://github.com/opencontainers/runc&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;runc:&lt;/strong&gt;&lt;/a&gt; низкоуровневая среда выполнения контейнеров, которая создает и запускает контейнеры.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;HsBf&quot;&gt;На самом деле, когда вы запускаете контейнер с помощью &lt;code&gt;docker&lt;/code&gt;, вы фактически запускаете его через Docker Daemon, containerd, а затем runc.&lt;/p&gt;
  &lt;h3 id=&quot;aU4h&quot;&gt;Dockershim: Docker в Kubernetes&lt;/h3&gt;
  &lt;p id=&quot;GkrW&quot;&gt;Важно помнить, что Kubernetes поддерживает только Container Runtime, которые работают с Container Runtime Interface (CRI), но Docker не поддерживает этот стандарт напрямую, поэтому Kubernetes включает компонент под названием dockershim, который необходим для работы с Docker.&lt;/p&gt;
  &lt;p id=&quot;IotW&quot;&gt;Что такое shim?&lt;/p&gt;
  &lt;p id=&quot;toWH&quot;&gt;Компонент, который функционирует как мост между различными API, обеспечивая совместимость.&lt;/p&gt;
  &lt;p id=&quot;pEha&quot;&gt;В дальнейшем Kubernetes откажется от поддержки dockershim и, соответственно, Docker и будет работать только с Container Runtime, поддерживающими Container Runtime Interface (CRI) — containerd или CRI-O.&lt;/p&gt;
  &lt;p id=&quot;K3eh&quot;&gt;Но это не означает, что Kubernetes не сможет запускать контейнеры из Docker—образов. И containerd, и CRI-O могут запускать образы в формате Docker (фактически в формате OCI), они просто делают это без использования команды &lt;code&gt;docker&lt;/code&gt; и Docker Daemon.&lt;/p&gt;
  &lt;h3 id=&quot;Vt3S&quot;&gt;Docker—образы&lt;/h3&gt;
  &lt;p id=&quot;EeXR&quot;&gt;То, что многие люди называют Docker—образами, на самом деле является образами в формате Open Container Initiative (OCI). Поэтому, если вы загружаете образ из Docker Hub или другого репозитория, вы сможете использовать его с помощью команды &lt;code&gt;docker&lt;/code&gt;, или в кластере Kubernetes, или с помощью утилиты podman, или любого другого инструмента, поддерживающего спецификацию формата образа OCI.&lt;/p&gt;
  &lt;h3 id=&quot;9g1m&quot;&gt;Container Runtime Interface (CRI)&lt;/h3&gt;
  &lt;p id=&quot;RaHo&quot;&gt;CRI — это API, который Kubernetes использует для управления различными Container Runtime, создающими и управляющими контейнерами. CRI упрощает для Kubernetes использование различных Container Runtime. Вместо того, чтобы включать в Kubernetes поддержку каждой из них, используется стандарт CRI. При этом задача управления контейнерами полностью ложится на Container Runtime.&lt;/p&gt;
  &lt;figure id=&quot;3nMJ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/a1b/e5f/1d4/a1be5f1d43e86626243bed7fc034f940.png&quot; width=&quot;1352&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;GuUQ&quot;&gt;Поэтому, если вы можете использовать containerd для запуска контейнеров, вы также можете использовать CRI-O, потому что они поддерживают стандарт CRI. При этом, если вы конечный пользователь, то вам не важно, какая Container Runtime используется.&lt;/p&gt;
  &lt;p id=&quot;TodY&quot;&gt;Помните, что Red Hat (проект OpenShift) использует CRI-O и отвечает за его поддержку (безопасность, исправления ошибок и т. д.). В то время как Docker поддерживает containerd.&lt;/p&gt;
  &lt;p id=&quot;HwVe&quot;&gt;&lt;em&gt;&lt;u&gt;Какая Container Runtime используется в Kubernetes&lt;/u&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;oh1X&quot;&gt;&lt;strong&gt;В архитектуре Kubernetes Kubelet (агент, работающий на каждом узле) отвечает за взаимодействие с Container Runtime. Вы можете проверить, какую Container Runtime вы используете, просмотрев параметры Kubelet на каждом узле. В манифесте есть опции &lt;code&gt;--container-runtime&lt;/code&gt; и &lt;code&gt;--container-runtime-endpoint&lt;/code&gt;, которые используются для настройки Container Runtime.&lt;/strong&gt;&lt;/p&gt;
  &lt;h3 id=&quot;NQlK&quot;&gt;containerd&lt;/h3&gt;
  &lt;p id=&quot;mJ2X&quot;&gt;сontainerd — это Container Runtime, которая раньше была частью Docker. Реализует спецификацию CRI. Умеет скачивать образы из репозитория и управляет ими, а затем передает их Container Runtime нижнего уровня (о ней речь пойдет дальше), которая фактически создает и запускает процессы контейнера.&lt;/p&gt;
  &lt;p id=&quot;4FzI&quot;&gt;сontainerd был выделен из проекта Docker, чтобы сделать Docker модульным. Таким образом, Docker сам использует containerd. Когда вы устанавливаете Docker, он также устанавливает containerd. Кроме того, сontainerd использует собственный плагин для поддержки CRI в Kubernetes.&lt;/p&gt;
  &lt;h3 id=&quot;6Yrh&quot;&gt;CRI-O&lt;/h3&gt;
  &lt;p id=&quot;Bsn9&quot;&gt;CRI-O — это еще одна Container Runtime, реализующая Container Runtime Interface (CRI). Она была специально создана с нуля при поддержке Red Hat, IBM, Intel и SUSE как Container Runtime для Kubernetes. Это альтернатива containerd, которая также позволяет загружать образы контейнеров из репозиториев, управлять ими и запускать Container Runtime нижнего уровня для запуска процессов контейнера.&lt;/p&gt;
  &lt;h3 id=&quot;j6uW&quot;&gt;Open Container Initiative (OCI)&lt;/h3&gt;
  &lt;p id=&quot;eFUE&quot;&gt;OCI — это группа компаний, которые поддерживают спецификацию формата образа контейнера и метода запуска контейнеров. Идея OCI заключается в том, что вы можете выбирать между различными Container Runtime, которые соответствуют этой спецификации. При этом каждая из них может иметь разные реализации нижнего уровня. Например, у вас, может быть, одна OCI-совместимая Container Runtime для ваших хостов Linux и одна для ваших хостов Windows. В этом заключается преимущество стандартизации.&lt;/p&gt;
  &lt;h3 id=&quot;O41G&quot;&gt;runc&lt;/h3&gt;
  &lt;p id=&quot;Ohxl&quot;&gt;runc — это еще одна среда выполнения контейнера, совместимая с OCI, которая запускает процессы контейнеров. runc называют эталонной реализацией OCI.&lt;/p&gt;
  &lt;p id=&quot;ea7V&quot;&gt;&lt;em&gt;&lt;u&gt;Что такое эталонная реализация?&lt;/u&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;JWMM&quot;&gt;&lt;strong&gt;Эталонная реализация — это программное обеспечение, в котором реализованы все требования спецификации или стандарта. В случае с OCI runc предоставляет все функции, ожидаемые от OCI-совместимой среды выполнения.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;NL4W&quot;&gt;Вот несколько альтернатив runc:&lt;/p&gt;
  &lt;ul id=&quot;jVhI&quot;&gt;
    &lt;li id=&quot;sW5d&quot;&gt;&lt;a href=&quot;https://github.com/containers/crun&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;crun&lt;/strong&gt;&lt;/a&gt;: среда выполнения контейнеров, написанная на C (в отличие от runc, которая написана на Go).&lt;/li&gt;
    &lt;li id=&quot;3rhM&quot;&gt;&lt;a href=&quot;https://github.com/kata-containers/runtime&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;kata-runtime&lt;/strong&gt;&lt;/a&gt;: из проекта Katacontainers, который реализует спецификацию OCI как отдельные небольшие виртуальные машины (аппаратная виртуализация).&lt;/li&gt;
    &lt;li id=&quot;OeAN&quot;&gt;&lt;a href=&quot;https://gvisor.dev/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;gVisor&lt;/strong&gt;&lt;/a&gt;: разработана в Google, создает контейнеры с собственным ядром. Реализует OCI в своей среде выполнения, называемой &lt;code&gt;runsc&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;cabi&quot;&gt;Подведем итоги&lt;/h3&gt;
  &lt;p id=&quot;rZAq&quot;&gt;Docker — это лишь часть всей экосистемы контейнеров. Существуют открытые стандарты: CRI и OCI, и несколько Container Runtime с поддержкой CRI: containerd, runc, CRI-O и, конечно, сам Docker. Возможно, скоро мы увидим множество новых реализаций Container Runtime с поддержкой стандартов CRI и OCI.&lt;/p&gt;

</content></entry><entry><id>xbrekz:LyXKJXrZV7W</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/LyXKJXrZV7W?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Ansible VAULT</title><published>2023-06-22T14:33:59.127Z</published><updated>2023-06-22T14:33:59.127Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/51/aa/51aa8027-c70d-4910-b0e1-5eef8bca121d.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/8e1/54a/496/8e154a496f39b26df4a0fcfbc65e23bc.png&quot;&gt;Задачи автоматизации развертывания какого-либо ПО или изменения настроек системы практически всегда связаны с использованием учетных записей, обладающих необходимым набором прав для выполнения данных действий. И одна из самых важных проблем при использовании различных скриптов автоматизации состоит в том, что в этом сценарии приходится указывать учетные данные в открытом виде. Соответственно возникает проблема обеспечения безопасности этих данных, ведь к исходному коду скрипта может получить доступ любой пользователь, обладающий соответствующими правами. Кроме того, репозитории, в которых хранится исходный код сценариев тоже нуждаются в защите, так как здесь тоже любой имеющий доступ на чтение может узнать пароли. Конечно, можно...</summary><content type="html">
  &lt;figure id=&quot;9zmT&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/8e1/54a/496/8e154a496f39b26df4a0fcfbc65e23bc.png&quot; width=&quot;780&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4OQz&quot;&gt;Задачи автоматизации развертывания какого-либо ПО или изменения настроек системы практически всегда связаны с использованием учетных записей, обладающих необходимым набором прав для выполнения данных действий. И одна из самых важных проблем при использовании различных скриптов автоматизации состоит в том, что в этом сценарии приходится указывать учетные данные в открытом виде. Соответственно возникает проблема обеспечения безопасности этих данных, ведь к исходному коду скрипта может получить доступ любой пользователь, обладающий соответствующими правами. Кроме того, репозитории, в которых хранится исходный код сценариев тоже нуждаются в защите, так как здесь тоже любой имеющий доступ на чтение может узнать пароли. Конечно, можно попробовать хранить секретную информацию в отдельных файлах и считывать при выполнении сценария, но это не всегда возможно и часто требует дополнительного ручного труда, что несколько снижает преимущества автоматизации.&lt;/p&gt;
  &lt;h2 id=&quot;frEr&quot;&gt;Склеп для секретов&lt;/h2&gt;
  &lt;p id=&quot;Thi4&quot;&gt;И здесь на помощь нам приходит Ansible Vault – утилита для шифрования любых файлов в которых вы хотите хранить секретные переменные (пароли, ключи и т.д.). В качестве алгоритма шифрования Ansible Vault использует алгоритм симметричного шифрования AES256.&lt;/p&gt;
  &lt;p id=&quot;pteM&quot;&gt;В этой статье мы рассмотрим использование Ansible Vault для работы с секретной информацией. Сразу замечу, что многие предпочитают использовать Hashicorp Vault для работы с Ansible, однако этого мощного средства в данной статье касаться не будем и поговорим только о встроенных в Ansible средствах.&lt;/p&gt;
  &lt;p id=&quot;blbA&quot;&gt;Итак, основное предназначение Vault это хранение конфиденциальной информации, такой как учетные данные и секретные ключи. Как происходит обработки зашифрованных данных: в процессе выполнения плейбука данные автоматически расшифровываются и наша задача при выполнении плейбука правильно указать ключи, необходимые для расшифровки. Для шифрования используется парольная фраза и, соответственно, чем сложнее фраза, тем сложнее злоумышленнику расшифровать данные.&lt;/p&gt;
  &lt;p id=&quot;g9B6&quot;&gt;Важное уточнение. Ansible Vault защищает данные только когда они находятся в состоянии покоя, после того, как они расшифрованы Vault уже никаким образом не может их защитить и об их безопасности необходимо заботиться уж другими средствами.&lt;/p&gt;
  &lt;h2 id=&quot;Cp8K&quot;&gt;Приступая к работе&lt;/h2&gt;
  &lt;p id=&quot;o70p&quot;&gt;Для работы с Vault нам прежде всего потребуется сам Ansible. В предыдущих статьях мы уже рассматривали его установку, поэтому будем считать, что все что нужно у вас уже есть.&lt;/p&gt;
  &lt;p id=&quot;veVl&quot;&gt;Для работы с файлами мы можем вводить парольную фразу с клавиатуры при каждом обращении к Vault или же использовать файл, в котором хранится парольная фраза. В первом случае в строку вызова добавляется ключ &lt;code&gt;—ask-vault-pass&lt;/code&gt;, во втором добавляется параметр &lt;code&gt;—vault-password-file=&amp;lt;путь к файлу&amp;gt;.&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;RRv8&quot;&gt;Но прежде, чем начать работу с утилитой официальное руководство по Ansible предлагает нам определиться со стратегией управления паролями вашего хранилища. А именно, для начала нам нужно определиться с тем, будем ли мы шифровать весь контент одним паролем или же мы будем применять разные парольные фразы для разных случаев. Также, очень важный вопрос это где вы собираетесь хранить свои пароли.&lt;/p&gt;
  &lt;p id=&quot;wP58&quot;&gt;В случае, если у вас небольшая команда или немного данных, вы можете использовать один пароль для всего, что вы шифруете с помощью Ansible Vault. Здесь важно помнить, что не стоит пытаться шифровать все данные, шифруйте только то, что является действительно секретной информацией, что критично для бизнеса и инфраструктуры.&lt;/p&gt;
  &lt;p id=&quot;icUX&quot;&gt;Несколько паролей удобны если у вас большая команда или большой объем конфиденциальных данных. Например, вы можете использовать разные пароли для разных пользователей или для разграничения разных уровней доступа. В зависимости от решаемых задач вам может потребоваться другой пароль для каждого зашифрованного файла или каталога. Например, у вас может быть playbook, который включает в себя два файла vars, один для среды разработки и один для рабочей среды, зашифрованные двумя разными паролями. При запуске плейбука вам потребуется выбрать правильный пароль хранилища для среды, на которую вы ориентируетесь, используя идентификатор хранилища.&lt;/p&gt;
  &lt;p id=&quot;lXmv&quot;&gt;Начнем с простого примера. Создадим зашифрованный файл с консольным вводом пароля. Пока никакой автоматизации.&lt;/p&gt;
  &lt;p id=&quot;2mGL&quot;&gt;&lt;code&gt;ansible-vault create --vault-id @prompt secret.yml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;JRfv&quot;&gt;&lt;code&gt;New vault password (default):&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TQ9T&quot;&gt;&lt;code&gt;Confirm new vault password (default):&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;NKXv&quot;&gt;Содержимое файла плейбука может быть например следующим:&lt;/p&gt;
  &lt;p id=&quot;GXyE&quot;&gt;&lt;code&gt;---&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;iIyC&quot;&gt;&lt;code&gt;- name: This is a secret file&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;juos&quot;&gt;&lt;code&gt; hosts: s1.otus.local&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;apS1&quot;&gt;&lt;code&gt; tasks:&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KXz4&quot;&gt;&lt;code&gt; - name: Execute command &amp;#x27;ls&amp;#x27;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;48MB&quot;&gt;&lt;code&gt; command: ls&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6mHS&quot;&gt;После сохранения yml файла убедимся что он зашифрован.&lt;/p&gt;
  &lt;figure id=&quot;IQfw&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/bbf/06b/c33/bbf06bc3335c8a55173219c3d29694f1.png&quot; width=&quot;974&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hJI8&quot;&gt;Как видно, все кроме заголовка превратилось в бессмысленный набор цифр. Однако, зашифровать данные недостаточно, важно еще и расшифровать их и для этого мы воспользуемся следующей командой.&lt;/p&gt;
  &lt;p id=&quot;wwvH&quot;&gt;&lt;code&gt;ansible-vault view --vault-id @prompt secret.yml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;i1fS&quot;&gt;Как видно все достаточно просто. Если нам необходимо внести изменения в зашифрованный файл то можно воспользоваться следующей командой:&lt;/p&gt;
  &lt;p id=&quot;AhkI&quot;&gt;&lt;code&gt;ansible-vault edit secret.yml&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;o8WW&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/27e/eb8/36e/27eeb836e0696cd81a0aa8453935c68b.png&quot; width=&quot;788&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Egsr&quot;&gt;Но я думаю, что большинство системных администраторов согласится с тем, что это не самый лучший подход к автоматизации работы. Интерактивный ввод пароля требует участия человека который знает это пароль. То есть делегировать кому-либо запуск зашифрованного плейбука нам будет проблематично. Ну а с точки зрения безопасности хотелось бы напомнить, что существует такой класс вредоносов как кейлоггеры, то есть приложения, которые сохраняют все нажатые клавиши и интерактивный ввод парольной фразы позволит таким клавиатурным шпионам перехватить нажатые клавиши.&lt;/p&gt;
  &lt;p id=&quot;Wtlm&quot;&gt;Поэтому в качестве альтернативы предлагается использовать файл с паролями. Здесь тоже надо помнить про безопасность и обеспечить ограничение доступа посторонних к каталогу, в котором хранятся такие файлы.&lt;/p&gt;
  &lt;p id=&quot;fszh&quot;&gt;Для начала создадим файл с “очень сложным” паролем:&lt;/p&gt;
  &lt;p id=&quot;ruoH&quot;&gt;&lt;code&gt;echo “P@ssw0rd” &amp;gt; password_file&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Wyi9&quot;&gt;И теперь применим этот файл для редактирования нашего yml файла. В случае, если для шифрования файла в предыдущем примере у вас использовался другой пароль, то для корректной расшифровки secret.yml необходимо указать его.&lt;/p&gt;
  &lt;p id=&quot;MiLd&quot;&gt;&lt;code&gt;ansible-vault edit --vault-password-file password_file secret.yml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Mm9V&quot;&gt;Если же у нас уже имеется готовый плейбук и мы хотим его зашифровать, то пригодится команда encrypt:&lt;/p&gt;
  &lt;p id=&quot;Lr2x&quot;&gt;&lt;code&gt;ansible-vault encrypt --vault-id @prompt secret_conditional.yml&lt;/code&gt;&lt;/p&gt;
  &lt;h2 id=&quot;XK8V&quot;&gt;Практическое применение&lt;/h2&gt;
  &lt;p id=&quot;DQDm&quot;&gt;Приведенные выше примеры демонстрировали возможности ansible-vault как отдельного средства шифрования/дешифрования файлов. Однако, на практике шифрование используется в плейбуках и нам нужно иметь возможность сообщить плейбуку как получить доступ к любым зашифрованным данным, с которыми он может столкнуться. Здесь важно понимать что плейбук не знает, что по умолчанию он имеет дело с зашифрованными данными, поэтому при запуске команды ansible-playbook ему необходимо передать соответствующую информацию. Так, для запуска нашего зашифрованного плейбука с интерактивным запросом пароля нам необходимо выполнить следующую команду:&lt;/p&gt;
  &lt;p id=&quot;tj7S&quot;&gt;&lt;code&gt;ansible-playbook --vault-id @prompt secret.yml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Pcbv&quot;&gt;Ну а если мы хотим использовать файл с паролями, то команда будет иметь следующий вид:&lt;/p&gt;
  &lt;p id=&quot;Mr52&quot;&gt;&lt;code&gt;ansible-playbook secret.yml --vault-password-file=password_file&lt;/code&gt;&lt;/p&gt;
  &lt;h2 id=&quot;quxc&quot;&gt;Когда не нужно все&lt;/h2&gt;
  &lt;p id=&quot;N1EM&quot;&gt;Далеко не всегда необходимо шифровать файл плейбука целиком. Иногда удобнее зашифровать значение только определенной переменной, например пароль, а все остальное оставить в открытом виде для того, чтобы другие специалисты также могли вносить свои правки при необходимости.&lt;/p&gt;
  &lt;p id=&quot;rwRY&quot;&gt;Для этого мы можем воспользоваться параметром encrypt_string. В примере ниже у нас имеется переменная my_secret значение которой неплохо бы скрыть от посторонних.&lt;/p&gt;
  &lt;p id=&quot;asM5&quot;&gt;&lt;code&gt;---&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;TBBd&quot;&gt;&lt;code&gt;- name: inline secret variable demonstration&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Rlt5&quot;&gt;&lt;code&gt; hosts: s1.otus.local&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ZzBr&quot;&gt;&lt;code&gt; gather_facts: false&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QdHX&quot;&gt;&lt;code&gt; vars:&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QHaT&quot;&gt;&lt;code&gt; my_secret: my_very_long_password&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;7Z6J&quot;&gt;&lt;code&gt; tasks:&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;BnvX&quot;&gt;&lt;code&gt; - name: print the secure variable&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;aOTI&quot;&gt;&lt;code&gt; debug:&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;hgsJ&quot;&gt;&lt;code&gt; var: my_secret&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;XyI7&quot;&gt;Для этого используем следующую команду:&lt;/p&gt;
  &lt;p id=&quot;5UFU&quot;&gt;&lt;code&gt;ansible-vault encrypt_string --vault-id @prompt my_very_long_password&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;PJaU&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/00c/b72/7b4/00cb727b43d2a3e7c262a57f12335819.png&quot; width=&quot;974&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Rw3l&quot;&gt;Теперь мы можем заменить значение переменной на этот набор цифр и получить в итогк следующее:&lt;/p&gt;
  &lt;figure id=&quot;TZT0&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/db4/1ca/196/db41ca1962f4c0bf352a8384d3fd1286.png&quot; width=&quot;974&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;U0NZ&quot;&gt;Для запуска этого плейбука воспользуемся командой&lt;/p&gt;
  &lt;p id=&quot;etD7&quot;&gt;&lt;code&gt;ansible-playbook --vault-id @prompt secret1.yml&lt;/code&gt;&lt;/p&gt;
  &lt;h2 id=&quot;aVPa&quot;&gt;Управление паролями&lt;/h2&gt;
  &lt;p id=&quot;cM9X&quot;&gt;В завершении статьи немного поговорим об управлении паролями, используемыми для шифрования. Общеизвестно, что пароли необходимо на регулярной основе менять, в противном случае со времени они перестанут быть секретом.&lt;/p&gt;
  &lt;p id=&quot;J1zi&quot;&gt;Для замены пароля необходимо указать старый пароль и затем два раза ввести новый:&lt;/p&gt;
  &lt;p id=&quot;Fy6A&quot;&gt;&lt;code&gt;ansible-vault rekey --ask-vault-pass secret.yml&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;aOwH&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/r/w1560/getpro/habr/upload_files/b95/36c/d09/b9536cd092a998d8cf67c389b5c9d542.png&quot; width=&quot;772&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;d4O4&quot;&gt;Как видно все достаточно просто.&lt;/p&gt;
  &lt;h2 id=&quot;YgS6&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;ci5a&quot;&gt;Сегодня мы рассмотрели работу с шифрованием данных в Ansible с помощью Ansible Vault. Данная утилита предоставляет базовый функционал для шифрования, а для более решения более сложных задач управления шифрованием рекомендуется использовать Hashicorp Vault.&lt;/p&gt;
  &lt;p id=&quot;zMri&quot;&gt;Также я хочу порекомендовать вам &lt;a href=&quot;https://otus.pw/jBOs/&quot; target=&quot;_blank&quot;&gt;бесплатный урок&lt;/a&gt; от OTUS в рамках которого мы рассмотрим различные типы анализа исходного кода (SAST/SCA/DAST/IAST/RASP) и поговорим об инструментах, позволяющих внедрить их в ваш CI/CD пайплайн&lt;/p&gt;

</content></entry><entry><id>xbrekz:5JPwbiWxzC4</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/5JPwbiWxzC4?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Компоненты SystemD</title><published>2023-05-31T16:33:50.083Z</published><updated>2023-05-31T16:33:50.083Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/83/35/8335b696-e67c-4c46-ab23-80bb82c7b6f9.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/66/d6/66d61f26-f2f0-423a-a7a1-91e624d9235f.png&quot;&gt;</summary><content type="html">
  &lt;figure id=&quot;YPym&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/66/d6/66d61f26-f2f0-423a-a7a1-91e624d9235f.png&quot; width=&quot;2141&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>xbrekz:MR81n6sTxef</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/MR81n6sTxef?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>systemd</title><published>2023-05-22T18:07:14.983Z</published><updated>2023-05-22T18:07:14.983Z</updated><summary type="html">&lt;img src=&quot;https://wiki.archlinux.org/images/3/38/Tango-view-fullscreen.png&quot;&gt;systemd — набор базовых компонентов Linux-системы. Представляет собой менеджер системы и служб, который выполняется как процесс с PID 1 и запускает остальную часть системы. systemd обеспечивает возможности агрессивной параллелизации, сокетную и D-Bus активацию для запуска служб, запуск демонов по запросу, отслеживание процессов с помощью контрольных групп Linux, обслуживание точек (авто)монтирования, а также предлагает развитую транзакционную логику управления службами на основе зависимостей. systemd поддерживает сценарии инициализации SysV и LSB и работает как замена sysvinit. Среди прочих элементов и функций — демон журнала, утилиты управления базовой конфигурацией системы (имя хоста, дата, языковой стандарт), ведение списков вошедших...</summary><content type="html">
  &lt;p id=&quot;6Lo7&quot;&gt;&lt;em&gt;systemd&lt;/em&gt; — набор базовых компонентов Linux-системы. Представляет собой менеджер системы и служб, который выполняется как процесс с PID 1 и запускает остальную часть системы. systemd обеспечивает возможности агрессивной параллелизации, сокетную и &lt;a href=&quot;https://wiki.archlinux.org/title/D-Bus_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;D-Bus&lt;/a&gt; активацию для запуска служб, запуск демонов по запросу, отслеживание процессов с помощью &lt;a href=&quot;https://wiki.archlinux.org/title/Cgroups&quot; target=&quot;_blank&quot;&gt;контрольных групп&lt;/a&gt; Linux, обслуживание точек (авто)монтирования, а также предлагает развитую транзакционную логику управления службами на основе зависимостей. &lt;em&gt;systemd&lt;/em&gt; поддерживает сценарии инициализации SysV и LSB и работает как замена sysvinit. Среди прочих элементов и функций — демон журнала, утилиты управления базовой конфигурацией системы (имя хоста, дата, языковой стандарт), ведение списков вошедших в систему пользователей, запущенных контейнеров, виртуальных машин, системных учётных записей, каталогов и настроек времени выполнения, а также демоны для управления несложными сетевыми конфигурациями, синхронизации времени по сети, пересылки журналов и разрешения имён.&lt;/p&gt;
  &lt;p id=&quot;fVP3&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;h2 id=&quot;YKbd&quot;&gt;Основы использования systemctl&lt;/h2&gt;
  &lt;p id=&quot;fE9u&quot;&gt;Главная команда для работы с systemd — &lt;em&gt;systemctl&lt;/em&gt;. Она позволяет (среди прочего) отлеживать состояние системы и управлять системой и службами. Подробнее см. &lt;a href=&quot;https://man.archlinux.org/man/systemctl.1&quot; target=&quot;_blank&quot;&gt;systemctl(1)&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;T8v9&quot;&gt;&lt;strong&gt;Совет:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;8MKL&quot;&gt;
    &lt;li id=&quot;j7dD&quot;&gt;Для управления systemd на удалённой машине команды необходимо выполнять с ключом &lt;code&gt;-H &lt;em&gt;пользователь&lt;/em&gt;@&lt;em&gt;хост&lt;/em&gt;&lt;/code&gt;. Соединение с удалённым процессом systemd будет установлено через &lt;a href=&quot;https://wiki.archlinux.org/title/OpenSSH_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;SSH&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;2SJH&quot;&gt;В &lt;a href=&quot;https://wiki.archlinux.org/title/KDE_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#Plasma&quot; target=&quot;_blank&quot;&gt;Plasma&lt;/a&gt; для systemctl разработан графический интерфейс &lt;a href=&quot;https://aur.archlinux.org/packages/systemd-kcm/&quot; target=&quot;_blank&quot;&gt;systemd-kcm&lt;/a&gt;AUR. После установки соответствующий модуль появится в разделе &lt;em&gt;System administration&lt;/em&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;qERN&quot;&gt;Использование юнитов&lt;/h3&gt;
  &lt;p id=&quot;vQhw&quot;&gt;Юнитами могут быть, например, службы (&lt;em&gt;.service&lt;/em&gt;), точки монтирования (&lt;em&gt;.mount&lt;/em&gt;), устройства (&lt;em&gt;.device&lt;/em&gt;) или сокеты (&lt;em&gt;.socket&lt;/em&gt;).&lt;/p&gt;
  &lt;p id=&quot;KAgV&quot;&gt;При работе с systemctl обычно необходимо указывать полное имя юнита с суффиксом, например, &lt;code&gt;sshd.socket&lt;/code&gt;. Существует несколько возможных сокращений:&lt;/p&gt;
  &lt;ul id=&quot;sgL7&quot;&gt;
    &lt;li id=&quot;hViX&quot;&gt;Если суффикс не указан, systemctl предполагает, что это &lt;em&gt;.service&lt;/em&gt;. Например, &lt;code&gt;netctl&lt;/code&gt; равнозначно &lt;code&gt;netctl.service&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;6neH&quot;&gt;Точки монтирования автоматически преобразуются в юнит &lt;em&gt;.mount&lt;/em&gt;. Например, &lt;code&gt;/home&lt;/code&gt; равнозначно &lt;code&gt;home.mount&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;8zn8&quot;&gt;Аналогично точкам монтрования, имена устройств автоматически преобразуются в юнит &lt;em&gt;.device&lt;/em&gt;. Например, &lt;code&gt;/dev/sda2&lt;/code&gt; равнозначно &lt;code&gt;dev-sda2.device&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Squl&quot;&gt;Подробнее см. &lt;a href=&quot;https://man.archlinux.org/man/systemd.unit.5&quot; target=&quot;_blank&quot;&gt;systemd.unit(5)&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;Y9mT&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt; Некоторые юниты содержат в названии символ &lt;code&gt;@&lt;/code&gt; (вида &lt;code&gt;название@&lt;em&gt;строка&lt;/em&gt;.service&lt;/code&gt;). Это т.н. &lt;a href=&quot;http://0pointer.de/blog/projects/instances.html&quot; target=&quot;_blank&quot;&gt;экземпляры&lt;/a&gt; юнита-шаблона, настоящее имя которого не содержит части &lt;code&gt;&lt;em&gt;строка&lt;/em&gt;&lt;/code&gt; (т.е. имеет вид &lt;code&gt;название@.service&lt;/code&gt;). &lt;code&gt;&lt;em&gt;строка&lt;/em&gt;&lt;/code&gt; называется идентификатором экземпляра и передаётся юниту-шаблону в качестве аргумента при вызове systemctl: в файле юнита идентификатор заменит спецификатор &lt;code&gt;%i&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;wj2P&quot;&gt;Если говорить точнее, systemd сначала попытается найти юнит, название которого полностью совпадёт с &lt;code&gt;название@&lt;em&gt;строка&lt;/em&gt;.суффикс&lt;/code&gt;, и лишь в случае неудачи создаст экземпляр шаблона &lt;code&gt;название@.суффикс&lt;/code&gt;. Тем не менее, такие &amp;quot;конфликты&amp;quot; довольно редки, так как по соглашению символ &lt;code&gt;@&lt;/code&gt; должен использоваться только в названиях юнитов-шаблонов. Также помните, что вызвать юнит-шаблон без идентификатора экземпляра не получится, поскольку в этом случае нечего будет подставить вместо спецификатора &lt;code&gt;%i&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;Guqx&quot;&gt;&lt;strong&gt;Совет:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;O11p&quot;&gt;
    &lt;li id=&quot;YkPe&quot;&gt;Большинство команд ниже также будут работать, если указать несколько юнитов; подробнее см. &lt;a href=&quot;https://man.archlinux.org/man/systemctl.1&quot; target=&quot;_blank&quot;&gt;systemctl(1)&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;3Obi&quot;&gt;Опция &lt;code&gt;--now&lt;/code&gt; в командах &lt;code&gt;enable&lt;/code&gt;, &lt;code&gt;disable&lt;/code&gt; и &lt;code&gt;mask&lt;/code&gt; соответственно запускает, останавливает или маскировует указанный юнит сразу при выполнении команды, а не после перезагрузки.&lt;/li&gt;
    &lt;li id=&quot;eDA9&quot;&gt;Пакеты могут содержать собственные юниты для различных целей. Если вы только что установили пакет, выполните &lt;code&gt;pacman -Qql &lt;em&gt;название_пакета&lt;/em&gt; | grep -Fe .service -e .socket&lt;/code&gt;, чтобы их найти.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;lnft&quot;&gt;Действие&lt;/p&gt;
  &lt;p id=&quot;mMcR&quot;&gt;Команда&lt;/p&gt;
  &lt;p id=&quot;MXGk&quot;&gt;Примечание&lt;/p&gt;
  &lt;p id=&quot;1ghF&quot;&gt;Анализ состояния системы&lt;/p&gt;
  &lt;p id=&quot;93Ci&quot;&gt;Состояние системы&lt;/p&gt;
  &lt;p id=&quot;1z8I&quot;&gt;&lt;code&gt;$ systemctl status&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;u6Rf&quot;&gt;Список запущенных юнитов&lt;/p&gt;
  &lt;p id=&quot;fGYG&quot;&gt;&lt;code&gt;$ systemctl&lt;/code&gt; или&lt;br /&gt;&lt;code&gt;$ systemctl list-units&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;q37H&quot;&gt;Список юнитов, запустить которые не удалось&lt;/p&gt;
  &lt;p id=&quot;5fX5&quot;&gt;&lt;code&gt;$ systemctl --failed&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;UKDj&quot;&gt;Список установленных файлов юнитов1&lt;/p&gt;
  &lt;p id=&quot;tsK0&quot;&gt;&lt;code&gt;$ systemctl list-unit-files&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;lpjx&quot;&gt;Информация о процессе по его PID&lt;/p&gt;
  &lt;p id=&quot;YEZw&quot;&gt;&lt;code&gt;$ systemctl status &lt;em&gt;pid&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;1h3s&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Cgroups&quot; target=&quot;_blank&quot;&gt;cgroup slice&lt;/a&gt;, занимаемая память и родительский процесс&lt;/p&gt;
  &lt;p id=&quot;SRhd&quot;&gt;Состояние юнита&lt;/p&gt;
  &lt;p id=&quot;Azzd&quot;&gt;Страница руководства юнита&lt;/p&gt;
  &lt;p id=&quot;iF8o&quot;&gt;&lt;code&gt;$ systemctl help &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;vFfa&quot;&gt;если юнит её предоставляет&lt;/p&gt;
  &lt;p id=&quot;nny2&quot;&gt;Состояние юнита&lt;/p&gt;
  &lt;p id=&quot;uOXX&quot;&gt;&lt;code&gt;$ systemctl status &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;dc1x&quot;&gt;в т. ч. работает ли он в данный момент&lt;/p&gt;
  &lt;p id=&quot;GrNc&quot;&gt;Проверить, добавлен ли юнит в автозапуск&lt;/p&gt;
  &lt;p id=&quot;1Bx7&quot;&gt;&lt;code&gt;$ systemctl is-enabled &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;16ST&quot;&gt;Запуск, перезапуск, перезагрузка юнита&lt;/p&gt;
  &lt;p id=&quot;ZMQ6&quot;&gt;Незамедлительно &lt;strong&gt;запустить&lt;/strong&gt; юнит&lt;/p&gt;
  &lt;p id=&quot;YELI&quot;&gt;&lt;code&gt;# systemctl start &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;jq0U&quot;&gt;Незамедлительно &lt;strong&gt;остановить&lt;/strong&gt; юнит&lt;/p&gt;
  &lt;p id=&quot;y2dx&quot;&gt;&lt;code&gt;# systemctl stop &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nT0A&quot;&gt;&lt;strong&gt;Перезапустить&lt;/strong&gt; юнит&lt;/p&gt;
  &lt;p id=&quot;Pglp&quot;&gt;&lt;code&gt;# systemctl restart &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ePYc&quot;&gt;&lt;strong&gt;Перезагрузить&lt;/strong&gt; юнит с новыми настройками&lt;/p&gt;
  &lt;p id=&quot;ak0G&quot;&gt;&lt;code&gt;# systemctl reload &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;GBIg&quot;&gt;&lt;strong&gt;Перезагрузить настройки systemd&lt;/strong&gt;2&lt;/p&gt;
  &lt;p id=&quot;K01W&quot;&gt;&lt;code&gt;# systemctl daemon-reload&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Ce4b&quot;&gt;сканировать систему на наличие новых или изменённых юнитов&lt;/p&gt;
  &lt;p id=&quot;8aGp&quot;&gt;Включение юнита (автозапуск)&lt;/p&gt;
  &lt;p id=&quot;pFA0&quot;&gt;&lt;strong&gt;Включить&lt;/strong&gt; юнит, добавив его в автозапуск&lt;/p&gt;
  &lt;p id=&quot;9IvI&quot;&gt;&lt;code&gt;# systemctl enable &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0GPc&quot;&gt;&lt;strong&gt;Включить&lt;/strong&gt; юнит и сразу &lt;strong&gt;запустить&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;JLMw&quot;&gt;&lt;code&gt;# systemctl enable --now &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;ZKuO&quot;&gt;&lt;strong&gt;Отключить&lt;/strong&gt; запуск юнита при загрузке&lt;/p&gt;
  &lt;p id=&quot;vCxp&quot;&gt;&lt;code&gt;# systemctl disable &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;138w&quot;&gt;&lt;strong&gt;Включить&lt;/strong&gt; юнит &lt;strong&gt;заново&lt;/strong&gt;3&lt;/p&gt;
  &lt;p id=&quot;EuLr&quot;&gt;&lt;code&gt;# systemctl reenable &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;AQ3W&quot;&gt;т.е. отключить и снова включить&lt;/p&gt;
  &lt;p id=&quot;QCi8&quot;&gt;Маскировка юнита&lt;/p&gt;
  &lt;p id=&quot;kkX4&quot;&gt;&lt;strong&gt;Замаскировать&lt;/strong&gt; юнит, сделав невозможным его запуск4&lt;/p&gt;
  &lt;p id=&quot;nt3e&quot;&gt;&lt;code&gt;# systemctl mask &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3t5T&quot;&gt;&lt;strong&gt;Снять маскировку&lt;/strong&gt; юнита&lt;/p&gt;
  &lt;p id=&quot;2Ynx&quot;&gt;&lt;code&gt;# systemctl unmask &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;
  &lt;ol id=&quot;bFw7&quot;&gt;
    &lt;li id=&quot;gs75&quot;&gt;В руководстве &lt;a href=&quot;https://man.archlinux.org/man/systemd.unit.5#UNIT_FILE_LOAD_PATH&quot; target=&quot;_blank&quot;&gt;systemd.unit(5) § UNIT FILE LOAD PATH&lt;/a&gt; приведён перечень каталогов, в которых могут храниться файлы юнитов.&lt;/li&gt;
    &lt;li id=&quot;e2vn&quot;&gt;Перезагружаются только настройки systemd, но не юнитов. Для юнитов необходимо использовать команду &lt;em&gt;reload&lt;/em&gt;.&lt;/li&gt;
    &lt;li id=&quot;Bgyy&quot;&gt;Например, если раздел &lt;code&gt;[Install]&lt;/code&gt; изменился с момента последнего включения.&lt;/li&gt;
    &lt;li id=&quot;oC80&quot;&gt;Как вручную, так и по зависимости, что делает маскировку несколько опасной.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;Rfrw&quot;&gt;Управление питанием&lt;/h3&gt;
  &lt;p id=&quot;7c4Q&quot;&gt;Для управления питанием от имени непривилегированного пользователя необходим &lt;a href=&quot;https://wiki.archlinux.org/title/Polkit_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;polkit&lt;/a&gt;. Если вы находитесь в локальном пользовательском сеансе &lt;em&gt;systemd-logind&lt;/em&gt; и нет других активных сеансов, приведенные ниже команды сработают, даже если будут выполнены не от root. В противном случае (например, другой пользователь вошел в систему через tty) systemd автоматически запросит у вас пароль суперпользователя.&lt;/p&gt;
  &lt;p id=&quot;WEPy&quot;&gt;Действие&lt;/p&gt;
  &lt;p id=&quot;xM1s&quot;&gt;Команда&lt;/p&gt;
  &lt;p id=&quot;MBgz&quot;&gt;Завершить работу и перезагрузить систему&lt;/p&gt;
  &lt;p id=&quot;KlQR&quot;&gt;&lt;code&gt;$ systemctl reboot&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zcwX&quot;&gt;Завершить работу и выключить компьютер&lt;/p&gt;
  &lt;p id=&quot;YNy5&quot;&gt;&lt;code&gt;$ systemctl poweroff&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;sB7Z&quot;&gt;Перевести систему в ждущий режим&lt;/p&gt;
  &lt;p id=&quot;Q8YF&quot;&gt;&lt;code&gt;$ systemctl suspend&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0drv&quot;&gt;Перевести систему в спящий режим&lt;/p&gt;
  &lt;p id=&quot;DtYv&quot;&gt;&lt;code&gt;$ systemctl hibernate&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rB1k&quot;&gt;Перевести систему в режим гибридного сна (suspend-to-both)&lt;/p&gt;
  &lt;p id=&quot;de89&quot;&gt;&lt;code&gt;$ systemctl hybrid-sleep&lt;/code&gt;&lt;/p&gt;
  &lt;h2 id=&quot;77jP&quot;&gt;Написание файлов юнитов&lt;/h2&gt;
  &lt;p id=&quot;SgvW&quot;&gt;Синтаксис файлов юнитов systemd (см. &lt;a href=&quot;https://man.archlinux.org/man/systemd.unit.5&quot; target=&quot;_blank&quot;&gt;systemd.unit(5)&lt;/a&gt;) вдохновлён &lt;a href=&quot;https://wiki.archlinux.org/title/Desktop_entries_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;desktop-файлами&lt;/a&gt; XDG Desktop Entry Specification, а они, в свою очередь, основаны на синтаксисе &lt;a href=&quot;https://en.wikipedia.org/wiki/ru:.ini&quot; target=&quot;_blank&quot;&gt;файлов .ini&lt;/a&gt; Microsoft Windows. Файлы юнитов загружаются из целого ряда мест (команда &lt;code&gt;systemctl show --property=UnitPath&lt;/code&gt; выведет полный список), ключевыми из которых являются следующие (в порядке увеличения приоритета):&lt;/p&gt;
  &lt;ul id=&quot;hxUX&quot;&gt;
    &lt;li id=&quot;dpXz&quot;&gt;&lt;code&gt;/usr/lib/systemd/system/&lt;/code&gt;: юниты, добавленные пакетами при установке;&lt;/li&gt;
    &lt;li id=&quot;i8ug&quot;&gt;&lt;code&gt;/etc/systemd/system/&lt;/code&gt;: юниты, созданные системным администратором.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;TTDX&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;8np6&quot;&gt;
    &lt;li id=&quot;hD05&quot;&gt;При запуске systemd в &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd/%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C#%D0%9A%D0%B0%D0%BA_%D1%8D%D1%82%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82&quot; target=&quot;_blank&quot;&gt;пользовательском режиме&lt;/a&gt; пути загрузки будут отличаться.&lt;/li&gt;
    &lt;li id=&quot;oUcT&quot;&gt;Названия юнитов могут содержать только буквы и цифры ASCII-набора, подчёркивания и точки. Другие символы должны быть экранированы в C-стиле (&amp;quot;\x2d&amp;quot;) или использоваться исключительно в рамках определённой семантики (&amp;#x27;@&amp;#x27;, &amp;#x27;-&amp;#x27;). Подробнее см. &lt;a href=&quot;https://man.archlinux.org/man/systemd.unit.5&quot; target=&quot;_blank&quot;&gt;systemd.unit(5)&lt;/a&gt; и &lt;a href=&quot;https://man.archlinux.org/man/systemd-escape.1&quot; target=&quot;_blank&quot;&gt;systemd-escape(1)&lt;/a&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;JgA9&quot;&gt;При создании собственных юнитов за образец можно взять юниты установленных пакетов или примеры из &lt;a href=&quot;https://man.archlinux.org/man/systemd.service.5#EXAMPLES&quot; target=&quot;_blank&quot;&gt;systemd.service(5) § EXAMPLES&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;ey6q&quot;&gt;&lt;strong&gt;Совет:&lt;/strong&gt; Комментарии в файлах юнитов должны начинаться с символа &lt;code&gt;#&lt;/code&gt; и размещаться на отдельной строке. Не используйте комментарии в конце строки, после параметров &lt;em&gt;systemd&lt;/em&gt;, иначе юнит не будет работать.&lt;/p&gt;
  &lt;h3 id=&quot;dSZT&quot;&gt;Обработка зависимостей&lt;/h3&gt;
  &lt;p id=&quot;Q6Zz&quot;&gt;В &lt;em&gt;systemd&lt;/em&gt; зависимости определяются правильным построением файлов юнитов. Простой пример — юниту &lt;em&gt;A&lt;/em&gt; требуется, чтобы юнит &lt;em&gt;B&lt;/em&gt; был запущен перед запуском самого юнита &lt;em&gt;A&lt;/em&gt;. Для этого добавьте строки &lt;code&gt;Requires=&lt;em&gt;B&lt;/em&gt;&lt;/code&gt; и &lt;code&gt;After=&lt;em&gt;B&lt;/em&gt;&lt;/code&gt; в раздел &lt;code&gt;[Unit]&lt;/code&gt; юнит-файла &lt;em&gt;A&lt;/em&gt;. Если зависимость является необязательной, укажите &lt;code&gt;Wants=&lt;em&gt;B&lt;/em&gt;&lt;/code&gt; и &lt;code&gt;After=&lt;em&gt;B&lt;/em&gt;&lt;/code&gt; соответственно. Обратите внимание, что &lt;code&gt;Wants=&lt;/code&gt; и &lt;code&gt;Requires=&lt;/code&gt; не подразумевают &lt;code&gt;After=&lt;/code&gt;. Если &lt;code&gt;After=&lt;/code&gt; не указать, то юниты будут запущены параллельно.&lt;/p&gt;
  &lt;p id=&quot;5SGu&quot;&gt;Зависимости обычно указываются для служб, но не для &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%A6%D0%B5%D0%BB%D0%B8&quot; target=&quot;_blank&quot;&gt;целей&lt;/a&gt;. Так, цель &lt;code&gt;network.target&lt;/code&gt; будет &amp;quot;подтянута&amp;quot; ещё на этапе настройки сетевых интерфейсов одной из соответствующих служб, и можно спокойно указывать эту цель как зависимость в пользовательской службе, поскольку &lt;code&gt;network.target&lt;/code&gt; будет запущена в любом случае.&lt;/p&gt;
  &lt;h3 id=&quot;Wfyq&quot;&gt;Типы служб&lt;/h3&gt;
  &lt;p id=&quot;rvm8&quot;&gt;Службы различаются по типу запуска, и это следует учитывать при написании юнитов. Тип определяется параметром &lt;code&gt;Type=&lt;/code&gt; в разделе &lt;code&gt;[Service]&lt;/code&gt;:&lt;/p&gt;
  &lt;ul id=&quot;zZrw&quot;&gt;
    &lt;li id=&quot;PZVX&quot;&gt;&lt;code&gt;Type=simple&lt;/code&gt; (по умолчанию): &lt;em&gt;systemd&lt;/em&gt; запустит эту службу незамедлительно. Процесс при этом не должен разветвляться (fork). Если после данной службы должны запускаться другие, то этот тип использовать не стоит (исключение — служба использует сокетную активацию).&lt;/li&gt;
    &lt;li id=&quot;Ft9k&quot;&gt;&lt;code&gt;Type=forking&lt;/code&gt;: &lt;em&gt;systemd&lt;/em&gt; считает службу запущенной после того, как процесс разветвляется с завершением родительского процесса. Используется для запуска классических демонов за исключением тех случаев, когда в таком поведении процесса нет необходимости. Укажите параметр &lt;code&gt;PIDFile=&lt;/code&gt;, чтобы &lt;em&gt;systemd&lt;/em&gt; мог отслеживать основной процесс.&lt;/li&gt;
    &lt;li id=&quot;enFC&quot;&gt;&lt;code&gt;Type=oneshot&lt;/code&gt;: удобен для сценариев, которые выполняют одно задание и завершаются. Если задать параметр &lt;code&gt;RemainAfterExit=yes&lt;/code&gt;, то &lt;em&gt;systemd&lt;/em&gt; будет считать процесс активным даже после его завершения.&lt;/li&gt;
    &lt;li id=&quot;T3nH&quot;&gt;&lt;code&gt;Type=notify&lt;/code&gt;: идентичен параметру &lt;code&gt;Type=simple&lt;/code&gt;, но с уточнением, что демон пошлет &lt;em&gt;systemd&lt;/em&gt; сигнал готовности. Реализация уведомления находится в библиотеке &lt;em&gt;libsystemd-daemon.so&lt;/em&gt;.&lt;/li&gt;
    &lt;li id=&quot;pZj1&quot;&gt;&lt;code&gt;Type=dbus&lt;/code&gt;: служба считается находящейся в состоянии готовности после появления указанного &lt;code&gt;BusName&lt;/code&gt; в системной шине DBus.&lt;/li&gt;
    &lt;li id=&quot;zbgP&quot;&gt;&lt;code&gt;Type=idle&lt;/code&gt;: &lt;em&gt;systemd&lt;/em&gt; отложит выполнение двоичного файла службы до окончания запуска остальных (&amp;quot;более срочных&amp;quot;) задач. В остальном поведение аналогично &lt;code&gt;Type=simple&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;rl6q&quot;&gt;Подробнее о параметре &lt;code&gt;Type&lt;/code&gt; см. &lt;a href=&quot;https://man.archlinux.org/man/systemd.service.5#OPTIONS&quot; target=&quot;_blank&quot;&gt;systemd.service(5) § OPTIONS&lt;/a&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;oAvV&quot;&gt;Редактирование файлов юнитов&lt;/h3&gt;
  &lt;p id=&quot;gdQJ&quot;&gt;Не стоит редактировать юнит-файлы пакетов напрямую, так как это приведёт к конфликтам с pacman. Есть два безопасных способа редактирования: создать новый файл, который полностью &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%97%D0%B0%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0_%D1%8E%D0%BD%D0%B8%D1%82%D0%B0&quot; target=&quot;_blank&quot;&gt;заменит&lt;/a&gt; оригинальный, или создать &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#Drop-in_%D1%84%D0%B0%D0%B9%D0%BB%D1%8B&quot; target=&quot;_blank&quot;&gt;drop-in файл&lt;/a&gt;, который будет применяться поверх оригинального юнита. В обоих случаях после редактирования необходимо перезагрузить юнит, чтобы изменения вступили в силу. Это выполняется либо путем редактирования блока с помощью команды &lt;code&gt;systemctl edit&lt;/code&gt;, которая автоматически перезагружает юнит, либо перезагрузкой всех юнитов командой:&lt;/p&gt;
  &lt;pre id=&quot;QZED&quot;&gt;# systemctl daemon-reload
&lt;/pre&gt;
  &lt;p id=&quot;WUqZ&quot;&gt;&lt;strong&gt;Совет:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;eqjy&quot;&gt;
    &lt;li id=&quot;8X5X&quot;&gt;С помощью &lt;em&gt;systemd-delta&lt;/em&gt; можно узнать, какие файлы юнитов были переопределены и что конкретно было изменено.&lt;/li&gt;
    &lt;li id=&quot;mNaT&quot;&gt;Команда &lt;code&gt;systemctl cat &lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt; позволит просмотреть содержимое файла юнита и связанных с ним drop-in сниппетов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;HsCO&quot;&gt;Замещение файла юнита&lt;/h4&gt;
  &lt;p id=&quot;ZR0C&quot;&gt;Чтобы полностью заместить файл юнита &lt;code&gt;/usr/lib/systemd/system/&lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;, создайте файл с таким же именем &lt;code&gt;/etc/systemd/system/&lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt; и &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8E%D0%BD%D0%B8%D1%82%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;включите заново&lt;/a&gt; юнит для обновления символических ссылок.&lt;/p&gt;
  &lt;p id=&quot;8rnj&quot;&gt;Альтернативный способ:&lt;/p&gt;
  &lt;pre id=&quot;4SRI&quot;&gt;# systemctl edit --full юнит
&lt;/pre&gt;
  &lt;p id=&quot;nCLo&quot;&gt;Эта команда откроет файл &lt;code&gt;/etc/systemd/system/&lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt; в текстовом редакторе (если файл ещё не существует, будет скопирован оригинал) и автоматически перезагрузит юнит после завершения редактирования.&lt;/p&gt;
  &lt;p id=&quot;G3k5&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt; Новые изменённые юниты продолжат работать даже после того, как pacman обновит оригинальные юниты в будущем. Это может усложнить обслуживание системы, поэтому предпочтительнее использовать подход, описанный в следующем разделе.&lt;/p&gt;
  &lt;h4 id=&quot;nGwp&quot;&gt;Drop-in файлы&lt;/h4&gt;
  &lt;p id=&quot;8XRd&quot;&gt;Чтобы создать drop-in файл для &lt;code&gt;/usr/lib/systemd/system/&lt;em&gt;юнит&lt;/em&gt;&lt;/code&gt;, создайте каталог &lt;code&gt;/etc/systemd/system/&lt;em&gt;юнит&lt;/em&gt;.d/&lt;/code&gt; и поместите в него файлы &lt;em&gt;.conf&lt;/em&gt; с добавленными или изменёнными опциями. systemd будет анализировать эти файлы и применять их поверх оригинального юнита.&lt;/p&gt;
  &lt;p id=&quot;E3Pv&quot;&gt;Самый простой способ — использовать команду:&lt;/p&gt;
  &lt;pre id=&quot;SXnW&quot;&gt;# systemctl edit юнит
&lt;/pre&gt;
  &lt;p id=&quot;N87Z&quot;&gt;Команда откроет &lt;code&gt;/etc/systemd/system/&lt;em&gt;юнит&lt;/em&gt;.d/override.conf&lt;/code&gt; в текстовом редакторе (файл будет создан, если его ещё нет) и автоматически перезапустит юнит после завершения редактирования.&lt;/p&gt;
  &lt;p id=&quot;QqYe&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt; Не все опции могут быть заменены в drop-in файле. Например, для изменения опции &lt;code&gt;Conflicts=&lt;/code&gt; &lt;a href=&quot;https://lists.freedesktop.org/archives/systemd-devel/2017-June/038976.html&quot; target=&quot;_blank&quot;&gt;придётся создать&lt;/a&gt; полную замену файла юнита (см. предыдущий раздел).&lt;/p&gt;
  &lt;h4 id=&quot;Lumm&quot;&gt;Откат изменений&lt;/h4&gt;
  &lt;p id=&quot;8gF6&quot;&gt;Отменить все изменения, сделанные с помощью &lt;code&gt;systemctl edit&lt;/code&gt;, можно командой:&lt;/p&gt;
  &lt;pre id=&quot;dDjO&quot;&gt;# systemctl revert юнит
&lt;/pre&gt;
  &lt;h4 id=&quot;D62X&quot;&gt;Примеры&lt;/h4&gt;
  &lt;p id=&quot;f0tL&quot;&gt;Например, если вы просто хотите добавить дополнительную зависимость к юниту, можно создать следующий файл:&lt;/p&gt;
  &lt;pre id=&quot;CuwY&quot;&gt;/etc/systemd/system/юнит.d/customdependency.conf&lt;/pre&gt;
  &lt;pre id=&quot;L8Bo&quot;&gt;[Unit]
Requires=новая зависимость
After=новая зависимость&lt;/pre&gt;
  &lt;p id=&quot;xtHq&quot;&gt;Другой пример: для замены &lt;code&gt;ExecStart&lt;/code&gt; в юните (кроме типа &lt;code&gt;oneshot&lt;/code&gt;) создайте следующий файл:&lt;/p&gt;
  &lt;pre id=&quot;qRfm&quot;&gt;/etc/systemd/system/юнит.d/customexec.conf&lt;/pre&gt;
  &lt;pre id=&quot;zPtj&quot;&gt;[Service]
ExecStart=
ExecStart=новая команда&lt;/pre&gt;
  &lt;p id=&quot;5E8A&quot;&gt;Обратите внимание, что &lt;code&gt;ExecStart&lt;/code&gt; необходимо очистить перед присвоением нового значения &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=756787#c9&quot; target=&quot;_blank&quot;&gt;[1]&lt;/a&gt;. Это относится ко всем параметрам, которые позволяют прописать несколько значений, вроде &lt;code&gt;OnCalendar&lt;/code&gt; в таймерах.&lt;/p&gt;
  &lt;p id=&quot;keg2&quot;&gt;Пример настройки автоматического перезапуска службы:&lt;/p&gt;
  &lt;pre id=&quot;gEAu&quot;&gt;/etc/systemd/system/юнит.d/restart.conf&lt;/pre&gt;
  &lt;pre id=&quot;SBAz&quot;&gt;[Service]
Restart=always
RestartSec=30&lt;/pre&gt;
  &lt;h2 id=&quot;igqR&quot;&gt;Цели&lt;/h2&gt;
  &lt;p id=&quot;7fdK&quot;&gt;Systemd использует юнит типа &lt;em&gt;цель&lt;/em&gt; (target) для группировки юнитов по зависимостям и в качестве стандартизированных точек синхронизации. Они выполняют ту же задачу, что и &lt;a href=&quot;https://en.wikipedia.org/wiki/ru:%D0%A3%D1%80%D0%BE%D0%B2%D0%B5%D0%BD%D1%8C_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F&quot; target=&quot;_blank&quot;&gt;уровни запуска&lt;/a&gt;, но действуют немного по-другому. Каждая цель имеет имя, а не номер, и предназначена для конкретных задач; несколько целей могут быть активны одновременно. Некоторые цели реализованы путём наследования служб из других целей с добавлением собственных. В systemd также имеются цели, имитирующие общие уровни запуска SystemVinit, поэтому вы можете переключаться между целями, используя привычную команду &lt;code&gt;telinit RUNLEVEL&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;27fR&quot;&gt;Получение информации о текущих целях&lt;/h3&gt;
  &lt;p id=&quot;72hc&quot;&gt;В systemd для этого предназначена следующая команда (заменяющая &lt;code&gt;runlevel&lt;/code&gt;):&lt;/p&gt;
  &lt;pre id=&quot;tTeD&quot;&gt;$ systemctl list-units --type=target
&lt;/pre&gt;
  &lt;h3 id=&quot;dK3V&quot;&gt;Создание пользовательской цели&lt;/h3&gt;
  &lt;p id=&quot;s80x&quot;&gt;Уровни запуска, имеющие определённое значение в sysvinit (0, 1, 3, 5 и 6), один в один соответствуют конкретным целям systemd. К сожалению, не существует хорошего способа сделать то же самое для пользовательских уровней 2 и 4. Их использование предполагает, что вы создаёте новый юнит-цель с названием &lt;code&gt;/etc/systemd/system/&lt;em&gt;цель&lt;/em&gt;&lt;/code&gt;, который берет за основу один из существующих уровней запуска (взгляните, например, на &lt;code&gt;/usr/lib/systemd/system/graphical.target&lt;/code&gt;), создаёте каталог &lt;code&gt;/etc/systemd/system/&lt;em&gt;цель&lt;/em&gt;.wants&lt;/code&gt;, а после этого — символические ссылки на те службы из каталога &lt;code&gt;/usr/lib/systemd/system/&lt;/code&gt;, которые вы хотите включить при загрузке.&lt;/p&gt;
  &lt;h3 id=&quot;GlLs&quot;&gt;Соответствие уровней SysV целям systemd&lt;/h3&gt;
  &lt;p id=&quot;n15o&quot;&gt;Уровнень запуска SysV&lt;/p&gt;
  &lt;p id=&quot;XMV3&quot;&gt;Цель systemd&lt;/p&gt;
  &lt;p id=&quot;GXnv&quot;&gt;Примечания&lt;/p&gt;
  &lt;p id=&quot;5nh4&quot;&gt;0&lt;/p&gt;
  &lt;p id=&quot;0y6C&quot;&gt;runlevel0.target, poweroff.target&lt;/p&gt;
  &lt;p id=&quot;o8xX&quot;&gt;Выключение системы&lt;/p&gt;
  &lt;p id=&quot;CtwB&quot;&gt;1, s, single&lt;/p&gt;
  &lt;p id=&quot;3JXF&quot;&gt;runlevel1.target, rescue.target&lt;/p&gt;
  &lt;p id=&quot;nE5s&quot;&gt;Однопользовательский уровень запуска&lt;/p&gt;
  &lt;p id=&quot;htID&quot;&gt;2, 4&lt;/p&gt;
  &lt;p id=&quot;xQ8k&quot;&gt;runlevel2.target, runlevel4.target, multi-user.target&lt;/p&gt;
  &lt;p id=&quot;3R3W&quot;&gt;Уровни запуска, определенные пользователем/специфичные для узла. По умолчанию соответствует уровню запуска 3&lt;/p&gt;
  &lt;p id=&quot;sl0X&quot;&gt;3&lt;/p&gt;
  &lt;p id=&quot;eK7P&quot;&gt;runlevel3.target, multi-user.target&lt;/p&gt;
  &lt;p id=&quot;3uwV&quot;&gt;Многопользовательский режим без графики. Пользователи, как правило, входят в систему при помощи множества консолей или через сеть&lt;/p&gt;
  &lt;p id=&quot;sLvZ&quot;&gt;5&lt;/p&gt;
  &lt;p id=&quot;lLFH&quot;&gt;runlevel5.target, graphical.target&lt;/p&gt;
  &lt;p id=&quot;O0em&quot;&gt;Многопользовательский режим с графикой. Обычно эквивалентен запуску всех служб на уровне 3 и графического менеджера входа в систему&lt;/p&gt;
  &lt;p id=&quot;u16V&quot;&gt;6&lt;/p&gt;
  &lt;p id=&quot;f9sV&quot;&gt;runlevel6.target, reboot.target&lt;/p&gt;
  &lt;p id=&quot;5ZRz&quot;&gt;Перезагрузка&lt;/p&gt;
  &lt;p id=&quot;pIOO&quot;&gt;emergency&lt;/p&gt;
  &lt;p id=&quot;FCVL&quot;&gt;emergency.target&lt;/p&gt;
  &lt;p id=&quot;lLHB&quot;&gt;Аварийная оболочка&lt;/p&gt;
  &lt;h3 id=&quot;ZXDg&quot;&gt;Изменение текущей цели&lt;/h3&gt;
  &lt;p id=&quot;0Zhc&quot;&gt;В systemd цели доступны посредством &lt;em&gt;целевых юнитов&lt;/em&gt;. Вы можете переключать их такой командой:&lt;/p&gt;
  &lt;pre id=&quot;9HUE&quot;&gt;# systemctl isolate graphical.target
&lt;/pre&gt;
  &lt;p id=&quot;3dA6&quot;&gt;Данная команда только изменит текущую цель и не повлияет на следующую загрузку системы. Она соответствует командам Sysvinit вида &lt;code&gt;telinit 3&lt;/code&gt; и &lt;code&gt;telinit 5&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;1Uju&quot;&gt;Изменение цели загрузки по умолчанию&lt;/h3&gt;
  &lt;p id=&quot;Vv8j&quot;&gt;Стандартная цель — &lt;code&gt;default.target&lt;/code&gt;, которая по умолчанию ссылается на &lt;code&gt;graphical.target&lt;/code&gt; (примерно соответствующего прежнему уровню запуска 5).&lt;/p&gt;
  &lt;p id=&quot;U1Sj&quot;&gt;Узнать текущую цель можно так:&lt;/p&gt;
  &lt;pre id=&quot;ISPe&quot;&gt;$ systemctl get-default
&lt;/pre&gt;
  &lt;p id=&quot;PGBK&quot;&gt;Для установки новой цели загрузки по умолчанию измените ссылку &lt;code&gt;default.target&lt;/code&gt;. С помощью команды &lt;em&gt;systemctl&lt;/em&gt; это делается так:&lt;/p&gt;
  &lt;pre id=&quot;ji6g&quot;&gt;# systemctl set-default multi-user.target&lt;/pre&gt;
  &lt;pre id=&quot;AVcH&quot;&gt;Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target -&amp;gt; /usr/lib/systemd/system/multi-user.target.&lt;/pre&gt;
  &lt;p id=&quot;R0TZ&quot;&gt;Альтернативный способ — добавить один из следующих &lt;a href=&quot;https://wiki.archlinux.org/title/Kernel_parameters_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;параметров ядра&lt;/a&gt; в загрузчик:&lt;/p&gt;
  &lt;ul id=&quot;Eo9j&quot;&gt;
    &lt;li id=&quot;xBdq&quot;&gt;&lt;code&gt;systemd.unit=multi-user.target&lt;/code&gt; (что примерно соответствует прежнему уровню запуска 3).&lt;/li&gt;
    &lt;li id=&quot;foFA&quot;&gt;&lt;code&gt;systemd.unit=rescue.target&lt;/code&gt; (что примерно соответствует прежнему уровню запуска 1).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;y47x&quot;&gt;Порядок выбора цели по умолчанию&lt;/h3&gt;
  &lt;p id=&quot;jdFK&quot;&gt;&lt;em&gt;systemd&lt;/em&gt; выбирает &lt;code&gt;default.target&lt;/code&gt; в следующем порядке :&lt;/p&gt;
  &lt;ol id=&quot;evrh&quot;&gt;
    &lt;li id=&quot;C7Kx&quot;&gt;Параметр ядра, описанный выше.&lt;/li&gt;
    &lt;li id=&quot;aCZ3&quot;&gt;Символическая ссылка &lt;code&gt;/etc/systemd/system/default.target&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;t5qo&quot;&gt;Символическая ссылка &lt;code&gt;/usr/lib/systemd/system/default.target&lt;/code&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;ckln&quot;&gt;Компоненты systemd&lt;/h2&gt;
  &lt;p id=&quot;2Q26&quot;&gt;Некоторые (не все) составные части systemd:&lt;/p&gt;
  &lt;ul id=&quot;byww&quot;&gt;
    &lt;li id=&quot;weAl&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-boot_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;systemd-boot&lt;/a&gt; — простой &lt;a href=&quot;https://wiki.archlinux.org/title/Arch_boot_process_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA&quot; target=&quot;_blank&quot;&gt;менеджер загрузки&lt;/a&gt; для UEFI;&lt;/li&gt;
    &lt;li id=&quot;6FvZ&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-firstboot&quot; target=&quot;_blank&quot;&gt;systemd-firstboot&lt;/a&gt; — инициализация системных настроек при первой загрузке;&lt;/li&gt;
    &lt;li id=&quot;XAIb&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-homed&quot; target=&quot;_blank&quot;&gt;systemd-homed&lt;/a&gt; — переносимые &lt;a href=&quot;https://wiki.archlinux.org/title/%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B8_%D0%B8_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B&quot; target=&quot;_blank&quot;&gt;аккаунты пользователей&lt;/a&gt;;&lt;/li&gt;
    &lt;li id=&quot;TQfo&quot;&gt;&lt;a href=&quot;https://dvdhrm.wordpress.com/2013/08/24/session-management-on-linux/&quot; target=&quot;_blank&quot;&gt;systemd-logind&lt;/a&gt; — управление сеансами;&lt;/li&gt;
    &lt;li id=&quot;mkW2&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-networkd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;systemd-networkd&lt;/a&gt; — управление &lt;a href=&quot;https://wiki.archlinux.org/title/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D1%81%D0%B5%D1%82%D0%B8&quot; target=&quot;_blank&quot;&gt;сетевыми настройками&lt;/a&gt;;&lt;/li&gt;
    &lt;li id=&quot;a3h9&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-nspawn&quot; target=&quot;_blank&quot;&gt;systemd-nspawn&lt;/a&gt; — приложение для контейнеризации процессов;&lt;/li&gt;
    &lt;li id=&quot;mjN1&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-resolved_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;systemd-resolved&lt;/a&gt; — &lt;a href=&quot;https://wiki.archlinux.org/title/Domain_name_resolution_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;разрешение&lt;/a&gt; сетевых имён;&lt;/li&gt;
    &lt;li id=&quot;HKBQ&quot;&gt;&lt;a href=&quot;https://man.archlinux.org/man/systemd-sysusers.8&quot; target=&quot;_blank&quot;&gt;systemd-sysusers(8)&lt;/a&gt; — создание системных пользователей/групп и добавление пользователей в группы при установке пакетов и загрузке системы;&lt;/li&gt;
    &lt;li id=&quot;2GZ6&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-timesyncd&quot; target=&quot;_blank&quot;&gt;systemd-timesyncd&lt;/a&gt; — синхронизация &lt;a href=&quot;https://wiki.archlinux.org/title/System_time&quot; target=&quot;_blank&quot;&gt;системных часов&lt;/a&gt; по сети;&lt;/li&gt;
    &lt;li id=&quot;t6fM&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd/%D0%96%D1%83%D1%80%D0%BD%D0%B0%D0%BB&quot; target=&quot;_blank&quot;&gt;systemd/Журнал&lt;/a&gt; — системные логи;&lt;/li&gt;
    &lt;li id=&quot;D597&quot;&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Systemd/%D0%A2%D0%B0%D0%B9%D0%BC%D0%B5%D1%80%D1%8B&quot; target=&quot;_blank&quot;&gt;systemd/Таймеры&lt;/a&gt; — таймеры для управления событиями и службами, альтернатива &lt;a href=&quot;https://wiki.archlinux.org/title/Cron&quot; target=&quot;_blank&quot;&gt;cron&lt;/a&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;G1lh&quot;&gt;systemd.mount — монтирование&lt;/h3&gt;
  &lt;p id=&quot;6yyh&quot;&gt;&lt;em&gt;systemd&lt;/em&gt; полностью отвечает за монтирование разделов и файловых систем, описанных в файле &lt;code&gt;/etc/fstab&lt;/code&gt;. &lt;a href=&quot;https://man.archlinux.org/man/systemd-fstab-generator.8&quot; target=&quot;_blank&quot;&gt;systemd-fstab-generator(8)&lt;/a&gt; преобразует записи из &lt;code&gt;/etc/fstab&lt;/code&gt; в юниты systemd; это выполняется при каждой загрузке системы, а также при перезагрузке конфигурации системного менеджера.&lt;/p&gt;
  &lt;p id=&quot;COvz&quot;&gt;&lt;em&gt;systemd&lt;/em&gt; расширяет возможности &lt;a href=&quot;https://wiki.archlinux.org/title/Fstab_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;fstab&lt;/a&gt; и предлагает дополнительные опции монтирования. Они могут влиять на зависимости юнита монтирования: например, могут гарантировать, что монтирование выполняется только после подключения к сети или после монтирования другого раздела. Полный список опций монтирования systemd (обычно они имеют префикс &lt;code&gt;x-systemd&lt;/code&gt;) описан в &lt;a href=&quot;https://man.archlinux.org/man/systemd.mount.5#FSTAB&quot; target=&quot;_blank&quot;&gt;systemd.mount(5) § FSTAB&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;MGiQ&quot;&gt;Примером этих опций может быть т.н. &lt;em&gt;автомонтирование&lt;/em&gt; (здесь имеется в виду не автоматическое монтирование во время загрузки, а монтирование при появлении запроса от устройства). Подробнее смотрите &lt;a href=&quot;https://wiki.archlinux.org/title/Fstab_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BC%D0%BE%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81_systemd&quot; target=&quot;_blank&quot;&gt;fstab#Автоматическое монтирование с systemd&lt;/a&gt;.&lt;/p&gt;
  &lt;h4 id=&quot;QFFe&quot;&gt;Автомонтирование GPT-раздела&lt;/h4&gt;
  &lt;p id=&quot;efmm&quot;&gt;На UEFI-системах &lt;a href=&quot;https://man.archlinux.org/man/systemd-gpt-auto-generator.8&quot; target=&quot;_blank&quot;&gt;systemd-gpt-auto-generator(8)&lt;/a&gt; автоматически монтирует &lt;a href=&quot;https://wiki.archlinux.org/title/GPT_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;GPT&lt;/a&gt;-разделы в соответствии с &lt;a href=&quot;https://uapi-group.org/specifications/specs/discoverable_partitions_specification/&quot; target=&quot;_blank&quot;&gt;Discoverable Partitions Specification&lt;/a&gt;, поэтому их можно не указывать в файле &lt;a href=&quot;https://wiki.archlinux.org/title/Fstab_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;fstab&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;3M4M&quot;&gt;Требования:&lt;/p&gt;
  &lt;ul id=&quot;gddZ&quot;&gt;
    &lt;li id=&quot;mJOW&quot;&gt;Загрузчик должен установить EFI-переменную &lt;a href=&quot;https://systemd.io/BOOT_LOADER_INTERFACE/&quot; target=&quot;_blank&quot;&gt;LoaderDevicePartUUID&lt;/a&gt;, по которой можно будет определить системный раздел EFI. Эта возможность поддерживается в &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-boot_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;systemd-boot&lt;/a&gt;, а также в &lt;a href=&quot;https://wiki.archlinux.org/title/REFInd#LoaderDevicePartUUID&quot; target=&quot;_blank&quot;&gt;rEFInd&lt;/a&gt; (по умолчанию отключена). Это проверяется наличием строки &lt;code&gt;Boot loader sets ESP partition information&lt;/code&gt; в выводе команды &lt;code&gt;bootctl&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;x40w&quot;&gt;Корневой раздел должен быть на одном физическом диске с системным разделом EFI. Автомонтируемые разделы должны быть на одном физическом диске с корневым разделом. Очевидно, монтируемые разделы должны оказаться на одном диске и с ESP.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cHtt&quot;&gt;&lt;strong&gt;Совет:&lt;/strong&gt; Автомонтирование разделов отключается изменением его &lt;a href=&quot;https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs&quot; target=&quot;_blank&quot;&gt;GUID-типа&lt;/a&gt; или установкой атрибута раздела &amp;quot;do not mount&amp;quot; (бит 63), см. &lt;a href=&quot;https://wiki.archlinux.org/title/Gdisk#Prevent_GPT_partition_automounting&quot; target=&quot;_blank&quot;&gt;gdisk#Prevent GPT partition automounting&lt;/a&gt;.&lt;/p&gt;
  &lt;h5 id=&quot;Q31z&quot;&gt;/var&lt;/h5&gt;
  &lt;p id=&quot;t2LX&quot;&gt;Для автомонтирования раздела &lt;code&gt;/var&lt;/code&gt; его PARTUUID должен совпадать с хэш-суммой SHA256 HMAC, вычисленной на основании UUID типа раздела. В качестве ключа хэша используется machine ID. Необходимый PARTUUID можно получить командой:&lt;/p&gt;
  &lt;pre id=&quot;Ps0i&quot;&gt;$ systemd-id128 -u --app-specific=4d21b016-b534-45c2-a9fb-5c16e091fd2d machine-id
&lt;/pre&gt;
  &lt;p id=&quot;bu8Y&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt; Утилита &lt;a href=&quot;https://man.archlinux.org/man/systemd-id128.1&quot; target=&quot;_blank&quot;&gt;systemd-id128(1)&lt;/a&gt; считывает machine ID из файла &lt;code&gt;/etc/machine-id&lt;/code&gt;, поэтому вычислить PARTUUID до установки системы невозможно.&lt;/p&gt;
  &lt;h3 id=&quot;zPWF&quot;&gt;systemd-sysvcompat&lt;/h3&gt;
  &lt;p id=&quot;PM1C&quot;&gt;Пакет &lt;a href=&quot;https://archlinux.org/packages/?name=systemd-sysvcompat&quot; target=&quot;_blank&quot;&gt;systemd-sysvcompat&lt;/a&gt; (зависимость пакета &lt;a href=&quot;https://archlinux.org/packages/?name=base&quot; target=&quot;_blank&quot;&gt;base&lt;/a&gt;) содержит традиционный бинарный файл &lt;a href=&quot;https://wiki.archlinux.org/title/Init&quot; target=&quot;_blank&quot;&gt;init&lt;/a&gt;. В системах под управлением systemd &lt;code&gt;init&lt;/code&gt; — символическая ссылка на исполняемый файл &lt;code&gt;systemd&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;JFAW&quot;&gt;Кроме того, в этом пакете находятся 4 команды &lt;a href=&quot;https://wiki.archlinux.org/title/SysVinit&quot; target=&quot;_blank&quot;&gt;SysVinit&lt;/a&gt; — &lt;a href=&quot;https://man.archlinux.org/man/halt.8&quot; target=&quot;_blank&quot;&gt;halt(8)&lt;/a&gt;, &lt;a href=&quot;https://man.archlinux.org/man/poweroff.8&quot; target=&quot;_blank&quot;&gt;poweroff(8)&lt;/a&gt;, &lt;a href=&quot;https://man.archlinux.org/man/reboot.8&quot; target=&quot;_blank&quot;&gt;reboot(8)&lt;/a&gt; и &lt;a href=&quot;https://man.archlinux.org/man/shutdown.8&quot; target=&quot;_blank&quot;&gt;shutdown(8)&lt;/a&gt;. Это символические ссылки на &lt;code&gt;systemctl&lt;/code&gt;, и их работа обусловлена логикой systemd. Подробнее см. &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC&quot; target=&quot;_blank&quot;&gt;#Управление питанием&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;03hc&quot;&gt;В systemd-системах отказаться от совместимости с System V можно либо задав &lt;a href=&quot;https://wiki.archlinux.org/title/Kernel_parameters_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;параметр загрузки&lt;/a&gt; &lt;code&gt;init=&lt;/code&gt; (см. &lt;a href=&quot;https://bbs.archlinux.org/viewtopic.php?id=233387&quot; target=&quot;_blank&quot;&gt;BBS#233387&lt;/a&gt;), либо с помощью собственных аргументов команды &lt;code&gt;systemctl&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;uPSg&quot;&gt;systemd-tmpfiles — временные файлы&lt;/h3&gt;
  &lt;p id=&quot;99w5&quot;&gt;Утилита &lt;em&gt;systemd-tmpfiles&lt;/em&gt; создает, удаляет и очищает непостоянные и временные файлы и каталоги. Она читает конфигурационные файлы из &lt;code&gt;/etc/tmpfiles.d/&lt;/code&gt; и &lt;code&gt;/usr/lib/tmpfiles.d/&lt;/code&gt;, чтобы понять, что необходимо делать. Конфигурационные файлы в первом каталоге имеют приоритет над теми, что расположены во втором.&lt;/p&gt;
  &lt;p id=&quot;tz9x&quot;&gt;Конфигурационные файлы обычно предоставляются вместе с файлами служб и имеют названия вида &lt;code&gt;/usr/lib/tmpfiles.d/&lt;em&gt;программа&lt;/em&gt;.conf&lt;/code&gt;. Например, демон &lt;a href=&quot;https://wiki.archlinux.org/title/Samba_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;Samba&lt;/a&gt; предполагает, что существует каталог &lt;code&gt;/run/samba&lt;/code&gt; с корректными правами доступа. Поэтому пакет &lt;a href=&quot;https://archlinux.org/packages/?name=samba&quot; target=&quot;_blank&quot;&gt;samba&lt;/a&gt; поставляется в следующей конфигурации:&lt;/p&gt;
  &lt;pre id=&quot;3hvS&quot;&gt;/usr/lib/tmpfiles.d/samba.conf&lt;/pre&gt;
  &lt;pre id=&quot;wv8p&quot;&gt;D /run/samba 0755 root root
&lt;/pre&gt;
  &lt;p id=&quot;TWF7&quot;&gt;Конфигурационные файлы также могут использоваться для записи значений при старте системы. Например, если вы используете &lt;code&gt;/etc/rc.local&lt;/code&gt; для отключения пробуждения от устройств USB при помощи &lt;code&gt;echo USBE &amp;gt; /proc/acpi/wakeup&lt;/code&gt;, вместо этого вы можете использовать следующий tmpfile:&lt;/p&gt;
  &lt;pre id=&quot;HHvn&quot;&gt;/etc/tmpfiles.d/disable-usb-wake.conf&lt;/pre&gt;
  &lt;pre id=&quot;AAxl&quot;&gt;#    Path                  Mode UID  GID  Age Argument
w    /proc/acpi/wakeup     -    -    -    -   USBE
&lt;/pre&gt;
  &lt;p id=&quot;YK9h&quot;&gt;Подробнее смотрите &lt;a href=&quot;https://man.archlinux.org/man/systemd-tmpfiles.8&quot; target=&quot;_blank&quot;&gt;systemd-tmpfiles(8)&lt;/a&gt; и &lt;a href=&quot;https://man.archlinux.org/man/tmpfiles.d.5&quot; target=&quot;_blank&quot;&gt;tmpfiles.d(5)&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;xhHw&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt; Этот способ может не сработать для установки опций в &lt;code&gt;/sys&lt;/code&gt;, поскольку служба &lt;em&gt;systemd-tmpfiles-setup&lt;/em&gt; может запуститься до того, как будут загружены соответствующие модули устройств. В этом случае при помощи команды &lt;code&gt;modinfo &lt;em&gt;модуль&lt;/em&gt;&lt;/code&gt; вы можете проверить, имеет ли модуль параметр для установки необходимой опции, и установить эту опцию в &lt;a href=&quot;https://wiki.archlinux.org/title/Kernel_modules_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F&quot; target=&quot;_blank&quot;&gt;файле настроек&lt;/a&gt; в каталоге &lt;code&gt;/etc/modprobe.d&lt;/code&gt;. В противном случае для установки верных атрибутов сразу при появлении устройства придется написать &lt;a href=&quot;https://wiki.archlinux.org/title/Udev_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%9E_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0%D1%85_udev&quot; target=&quot;_blank&quot;&gt;правило udev&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;bJHK&quot;&gt;Советы и рекомендации&lt;/h2&gt;
  &lt;h3 id=&quot;KDbY&quot;&gt;Программы настройки с графическим интерфейсом&lt;/h3&gt;
  &lt;ul id=&quot;oOqe&quot;&gt;
    &lt;li id=&quot;kUPI&quot;&gt;&lt;strong&gt;systemadm&lt;/strong&gt; — Графический поисковик юнитов systemd. Выводит список юнитов, возможна фильтрация по типу.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;PQxI&quot;&gt;&lt;a href=&quot;https://cgit.freedesktop.org/systemd/systemd-ui/&quot; target=&quot;_blank&quot;&gt;https://cgit.freedesktop.org/systemd/systemd-ui/&lt;/a&gt; || &lt;a href=&quot;https://archlinux.org/packages/?name=systemd-ui&quot; target=&quot;_blank&quot;&gt;systemd-ui&lt;/a&gt;&lt;/p&gt;
  &lt;ul id=&quot;LqUn&quot;&gt;
    &lt;li id=&quot;VVcm&quot;&gt;&lt;strong&gt;SystemdGenie&lt;/strong&gt; — Утилита управления systemd на основе инструментов KDE.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;3ueD&quot;&gt;&lt;a href=&quot;https://invent.kde.org/system/systemdgenie&quot; target=&quot;_blank&quot;&gt;https://invent.kde.org/system/systemdgenie&lt;/a&gt; || &lt;a href=&quot;https://archlinux.org/packages/?name=systemdgenie&quot; target=&quot;_blank&quot;&gt;systemdgenie&lt;/a&gt;&lt;/p&gt;
  &lt;h3 id=&quot;m9PE&quot;&gt;Запуск сервисов после подключения к сети&lt;/h3&gt;
  &lt;p id=&quot;IG3F&quot;&gt;Чтобы запустить сервис только после подключения к сети, добавьте такие зависимости в &lt;em&gt;.service&lt;/em&gt; файле:&lt;/p&gt;
  &lt;pre id=&quot;JBUP&quot;&gt;/etc/systemd/system/foo.service&lt;/pre&gt;
  &lt;pre id=&quot;g3y1&quot;&gt;[Unit]
...
Wants=network-online.target
After=network-online.target
...&lt;/pre&gt;
  &lt;p id=&quot;nsi1&quot;&gt;Также должна быть включена служба ожидания сети того приложения, которое управляет сетью; только тогда &lt;code&gt;network-online.target&lt;/code&gt; будет соответствовать состоянию сети.&lt;/p&gt;
  &lt;ul id=&quot;5nsm&quot;&gt;
    &lt;li id=&quot;lpi0&quot;&gt;В &lt;a href=&quot;https://wiki.archlinux.org/title/NetworkManager&quot; target=&quot;_blank&quot;&gt;NetworkManager&lt;/a&gt; служба &lt;code&gt;NetworkManager-wait-online.service&lt;/code&gt; включается вместе с &lt;code&gt;NetworkManager.service&lt;/code&gt;. Проверить состояние службы можно командой &lt;code&gt;systemctl is-enabled NetworkManager-wait-online.service&lt;/code&gt;. Если служба не включена, то &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8E%D0%BD%D0%B8%D1%82%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;включите заново&lt;/a&gt; &lt;code&gt;NetworkManager.service&lt;/code&gt; ещё раз.&lt;/li&gt;
    &lt;li id=&quot;JaZB&quot;&gt;В случае &lt;a href=&quot;https://wiki.archlinux.org/title/Netctl_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;netctl&lt;/a&gt; &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8E%D0%BD%D0%B8%D1%82%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;включите&lt;/a&gt; службу &lt;code&gt;netctl-wait-online.service&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;IN7Z&quot;&gt;Для пользователей &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd-networkd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;systemd-networkd&lt;/a&gt; юнит &lt;code&gt;systemd-networkd-wait-online.service&lt;/code&gt; включается вместе со службой &lt;code&gt;systemd-networkd.service&lt;/code&gt;; проверьте это командой &lt;code&gt;systemctl is-enabled systemd-networkd-wait-online.service&lt;/code&gt;. Если нет, то &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8E%D0%BD%D0%B8%D1%82%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;включите заново&lt;/a&gt; &lt;code&gt;systemd-networkd.service&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fv8h&quot;&gt;Подробнее можно почитать: &lt;a href=&quot;https://systemd.io/NETWORK_ONLINE/#discussion&quot; target=&quot;_blank&quot;&gt;Network configuration synchronization points&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;dXFy&quot;&gt;Если служба отправляет DNS-запросы, она должна запускаться также после &lt;code&gt;nss-lookup.target&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;NIjU&quot;&gt;/etc/systemd/system/foo.service&lt;/pre&gt;
  &lt;pre id=&quot;oqaq&quot;&gt;[Unit]
...
Wants=network-online.target
After=network-online.target nss-lookup.target
...&lt;/pre&gt;
  &lt;p id=&quot;jNw4&quot;&gt;Подробнее см. &lt;a href=&quot;https://man.archlinux.org/man/systemd.special.7&quot; target=&quot;_blank&quot;&gt;systemd.special(7)&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;j6zO&quot;&gt;Чтобы цель &lt;code&gt;nss-lookup.target&lt;/code&gt; работала как положено, должна быть служба, которая запускает её параметром &lt;code&gt;Wants=nss-lookup.target&lt;/code&gt; и размещает себя &lt;em&gt;перед&lt;/em&gt; ней (&lt;code&gt;Before=nss-lookup.target&lt;/code&gt;). Обычно это выполняет локальный &lt;a href=&quot;https://wiki.archlinux.org/title/Domain_name_resolution_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#DNS-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D1%8B&quot; target=&quot;_blank&quot;&gt;DNS-распознаватель&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;SgGe&quot;&gt;Чтобы узнать, какие службы зависят от &lt;code&gt;nss-lookup.target&lt;/code&gt;, выполните:&lt;/p&gt;
  &lt;pre id=&quot;JaeL&quot;&gt;$ systemctl list-dependencies --reverse nss-lookup.target
&lt;/pre&gt;
  &lt;h3 id=&quot;CsNx&quot;&gt;Включение установленных юнитов по умолчанию&lt;/h3&gt;
  &lt;figure id=&quot;Ujki&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://wiki.archlinux.org/images/3/38/Tango-view-fullscreen.png&quot; width=&quot;48&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;O9PG&quot;&gt;&lt;strong&gt;This article or section needs expansion.&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;92jG&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://wiki.archlinux.org/images/3/38/Tango-view-fullscreen.png&quot; width=&quot;48&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Zc6h&quot;&gt;&lt;strong&gt;Reason:&lt;/strong&gt; Как это работает для юнитов-экземпляров? (Discuss in &lt;a href=&quot;https://wiki.archlinux.org/title/Talk:Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;Talk:Systemd (Русский)&lt;/a&gt;)&lt;/p&gt;
  &lt;p id=&quot;Lts1&quot;&gt;Arch Linux поставляется с файлом &lt;code&gt;/usr/lib/systemd/system-preset/99-default.preset&lt;/code&gt;, в котором указан параметр &lt;code&gt;disable *&lt;/code&gt;. Это означает, что &lt;em&gt;systemctl preset&lt;/em&gt; отключает по умолчанию юниты и пользователь должен сам их включать после установки пакетов.&lt;/p&gt;
  &lt;p id=&quot;R0AY&quot;&gt;Если такое поведение не устраивает, создайте символическую ссылку &lt;code&gt;/etc/systemd/system-preset/99-default.preset&lt;/code&gt; на &lt;code&gt;/dev/null&lt;/code&gt; для переопределения файла конфигурации. Это заставит systemctl preset включать юниты новых пакетов — вне зависимости от типа — кроме указанных в других файлах из каталога настроек systemctl preset. Пользовательских юнитов это не касается. Подробнее смотрите &lt;a href=&quot;https://man.archlinux.org/man/systemd.preset.5&quot; target=&quot;_blank&quot;&gt;systemd.preset(5)&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;uZY7&quot;&gt;&lt;strong&gt;Примечание:&lt;/strong&gt; Политика включения всех юнитов по умолчанию может привести к проблемам, если в установленном пакете находится несколько взаимоисключающих юнитов. В этом случае в файле preset-настроек придётся явно указать, какие юниты включаться не должны. Подробнее смотрите &lt;a href=&quot;https://man.archlinux.org/man/systemd.preset.5&quot; target=&quot;_blank&quot;&gt;systemd.preset(5)&lt;/a&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;bDOD&quot;&gt;Песочница для приложений&lt;/h3&gt;
  &lt;p id=&quot;37k3&quot;&gt;Юнит может быть использован в качестве песочницы для изоляции приложений и их процессов в виртуальном окружении. Systemd использует механизм &lt;a href=&quot;https://en.wikipedia.org/wiki/Linux_namespaces&quot; target=&quot;_blank&quot;&gt;namespaces&lt;/a&gt;, белые и чёрные списки &lt;a href=&quot;https://wiki.archlinux.org/title/Capabilities&quot; target=&quot;_blank&quot;&gt;capabilities&lt;/a&gt;, а также &lt;a href=&quot;https://wiki.archlinux.org/title/Control_groups&quot; target=&quot;_blank&quot;&gt;control groups&lt;/a&gt; для контейнеризации процессов при помощи настраиваемых окружений — см. &lt;a href=&quot;https://man.archlinux.org/man/systemd.exec.5&quot; target=&quot;_blank&quot;&gt;systemd.exec(5)&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;ZSEj&quot;&gt;Добавление к существующему юниту systemd функциональности песочницы обычно происходит методом проб и ошибок вкупе с использованием различных инструментов логирования — &lt;a href=&quot;https://archlinux.org/packages/?name=strace&quot; target=&quot;_blank&quot;&gt;strace&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Standard_streams#Standard_error_.28stderr.29&quot; target=&quot;_blank&quot;&gt;stderr&lt;/a&gt; и &lt;a href=&quot;https://man.archlinux.org/man/journalctl.1&quot; target=&quot;_blank&quot;&gt;journalctl(1)&lt;/a&gt;. В таких случаях имеет смысл предварительно поискать соответствующую документацию от разработчиков. В качестве отправной точки для поиска путей повышения безопасности изучите вывод команды:&lt;/p&gt;
  &lt;pre id=&quot;hxIY&quot;&gt;$ systemd-analyze security юнит
&lt;/pre&gt;
  &lt;p id=&quot;xJkC&quot;&gt;Рекомендации по созданию песочницы с помощью systemd:&lt;/p&gt;
  &lt;ul id=&quot;lPy7&quot;&gt;
    &lt;li id=&quot;aQ5q&quot;&gt;Параметр &lt;code&gt;CapabilityBoundingSet&lt;/code&gt; определяет список разрешённых capabilities, но с его помощью можно также и запрещать некоторые capabilities для определённого юнита.&lt;/li&gt;
    &lt;ul id=&quot;WtuI&quot;&gt;
      &lt;li id=&quot;6sbr&quot;&gt;Например, можно задать capability &lt;code&gt;CAP_SYS_ADM&lt;/code&gt;, &lt;a href=&quot;https://lwn.net/Articles/486306/&quot; target=&quot;_blank&quot;&gt;необходимую&lt;/a&gt; для создания безопасной песочницы: &lt;code&gt;CapabilityBoundingSet=~ CAP_SYS_ADM&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;33mZ&quot;&gt;Уведомление о неработающих службах&lt;/h3&gt;
  &lt;p id=&quot;Vk4R&quot;&gt;Для уведомления о неудачном запуске службы используется директива &lt;code&gt;OnFailure=&lt;/code&gt; в соответствующем файле службы или &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#Drop-in_%D1%84%D0%B0%D0%B9%D0%BB%D1%8B&quot; target=&quot;_blank&quot;&gt;drop-in файле&lt;/a&gt;. Чтобы эта директива возымела эффект для всех служб одновременно, её необходимо добавть в drop-in файл верхнего уровня, см. &lt;a href=&quot;https://man.archlinux.org/man/systemd.unit.5&quot; target=&quot;_blank&quot;&gt;systemd.unit(5)&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;rOb3&quot;&gt;Создайте drop-in верхнего уровня:&lt;/p&gt;
  &lt;pre id=&quot;64jd&quot;&gt;/etc/systemd/system/service.d/toplevel-override.conf&lt;/pre&gt;
  &lt;pre id=&quot;NDyk&quot;&gt;[Unit]
OnFailure=failure-notification@%n&lt;/pre&gt;
  &lt;p id=&quot;fiNd&quot;&gt;Это добавит строку &lt;code&gt;OnFailure=failure-notification@%n&lt;/code&gt; в файл каждой службы. Если &lt;em&gt;какой-то_юнит&lt;/em&gt; завершится с ошибкой, запустится экземпляр службы &lt;code&gt;failure-notification@&lt;em&gt;какой-то_юнит&lt;/em&gt;&lt;/code&gt; для создания уведомления (или любой другой задачи, которая была назначена).&lt;/p&gt;
  &lt;p id=&quot;ADOF&quot;&gt;Создайте юнит-шаблон &lt;code&gt;failure-notification@&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;3qA5&quot;&gt;/etc/systemd/system/failure-notification@.service&lt;/pre&gt;
  &lt;pre id=&quot;JODF&quot;&gt;[Unit]
Description=Send a notification about a failed systemd unit
After=network.target

[Service]
Type=simple
ExecStart=/путь/к/failure-notification.sh %i&lt;/pre&gt;
  &lt;p id=&quot;kw7b&quot;&gt;После этого создайте сценарий &lt;code&gt;failure-notification.sh&lt;/code&gt;, в котором определите, каким именно способом будет создаваться уведомление (mail, gotify, xmpp). Параметр &lt;code&gt;%i&lt;/code&gt; будет заменён на название неудачно завершившегося юнита и будет передан сценарию в качестве аргумента.&lt;/p&gt;
  &lt;p id=&quot;Ax0g&quot;&gt;Чтобы предотвратить регрессию экземпляров &lt;code&gt;failure-notification@.service&lt;/code&gt;, создайте пустой файл drop-in настроек с именем, совпадающим с названием drop-in файла верхнего уровня (пустой файл &amp;quot;уровня служб&amp;quot; будет иметь приоритет над файлом &amp;quot;верхнего уровня&amp;quot;):&lt;/p&gt;
  &lt;pre id=&quot;aSwH&quot;&gt;# mkdir -p /etc/systemd/system/failure-notification@.service.d
# touch /etc/systemd/system/failure-notification@.service.d/toplevel-override.conf
&lt;/pre&gt;
  &lt;h2 id=&quot;hkxU&quot;&gt;Решение проблем&lt;/h2&gt;
  &lt;h3 id=&quot;Sleo&quot;&gt;Неудачно запущенные службы&lt;/h3&gt;
  &lt;p id=&quot;g6Wz&quot;&gt;Следующая команда найдёт все службы, которые не смогли выполнить запуск:&lt;/p&gt;
  &lt;pre id=&quot;em8Q&quot;&gt;$ systemctl --state=failed
&lt;/pre&gt;
  &lt;p id=&quot;4g81&quot;&gt;Чтобы определить причину, по которой служба не запустилась, необходимо изучить записи её логов. Подробнее см. &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd/%D0%96%D1%83%D1%80%D0%BD%D0%B0%D0%BB#%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0&quot; target=&quot;_blank&quot;&gt;systemd/Журнал#Фильтрация вывода&lt;/a&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;yzD3&quot;&gt;Диагностика загрузки системы&lt;/h3&gt;
  &lt;p id=&quot;TJw9&quot;&gt;В systemd есть несколько опций для диагностики проблем процесса загрузки. В статье об &lt;a href=&quot;https://wiki.archlinux.org/title/General_troubleshooting_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8&quot; target=&quot;_blank&quot;&gt;отладке загрузки&lt;/a&gt; описано, как получить доступ к сообщениям, выданным &lt;a href=&quot;https://wiki.archlinux.org/title/Arch_boot_process_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;процессом загрузки&lt;/a&gt; до того, как systemd перехватил управление. Также смотрите &lt;a href=&quot;https://freedesktop.org/wiki/Software/systemd/Debugging&quot; target=&quot;_blank&quot;&gt;документацию по отладке systemd&lt;/a&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;o7hi&quot;&gt;Диагностика службы&lt;/h3&gt;
  &lt;p id=&quot;G8D9&quot;&gt;Если какая-либо служба &lt;em&gt;systemd&lt;/em&gt; ведет себя не так, как ожидается, и вы хотите получить дополнительную информацию о том, что происходит, присвойте &lt;a href=&quot;https://wiki.archlinux.org/title/Environment_variables_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;переменной окружения&lt;/a&gt; &lt;code&gt;SYSTEMD_LOG_LEVEL&lt;/code&gt; значение &lt;code&gt;debug&lt;/code&gt;. Например, чтобы запустить демон &lt;em&gt;systemd-networkd&lt;/em&gt; в режиме отладки:&lt;/p&gt;
  &lt;p id=&quot;R17g&quot;&gt;Добавьте &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#Drop-in_%D1%84%D0%B0%D0%B9%D0%BB%D1%8B&quot; target=&quot;_blank&quot;&gt;drop-in файл&lt;/a&gt; для службы:&lt;/p&gt;
  &lt;pre id=&quot;oSvV&quot;&gt;[Service]
Environment=SYSTEMD_LOG_LEVEL=debug
&lt;/pre&gt;
  &lt;p id=&quot;JQyf&quot;&gt;Или, как вариант, пропишите переменную окружения вручную:&lt;/p&gt;
  &lt;pre id=&quot;NzOU&quot;&gt;# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd
&lt;/pre&gt;
  &lt;p id=&quot;n87F&quot;&gt;После этого &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8E%D0%BD%D0%B8%D1%82%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;перезапустите&lt;/a&gt; systemd-networkd и следите за &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd/Journal_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;журналом&lt;/a&gt; службы с помощью опции &lt;code&gt;-f&lt;/code&gt;/&lt;code&gt;--follow&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;yzAn&quot;&gt;Выключение/перезагрузка происходят ужасно долго&lt;/h3&gt;
  &lt;p id=&quot;CrXL&quot;&gt;Если процесс выключения занимает очень долгое время (или выглядит зависшим), то, вероятно, виновата служба, которая не может завершить свою работу. Systemd ожидает некоторое время, пока каждая служба прекратит работу самостоятельно, и только потом пробует завершить её принудительно. Если вы столкнулись с такой проблемой, обратитесь к &lt;a href=&quot;https://freedesktop.org/wiki/Software/systemd/Debugging/#shutdowncompleteseventually&quot; target=&quot;_blank&quot;&gt;Shutdown completes eventually&lt;/a&gt; в systemd-вики.&lt;/p&gt;
  &lt;h3 id=&quot;kjOy&quot;&gt;По-видимому, процессы с кратким сроком жизни не оставляют записей в логах&lt;/h3&gt;
  &lt;p id=&quot;qjac&quot;&gt;Если команда &lt;code&gt;journalctl -u foounit&lt;/code&gt; не даёт вывода для службы с коротким сроком жизни, вместо названия службы используйте её PID. Например, если загрузка службы &lt;code&gt;systemd-modules-load.service&lt;/code&gt; завершилась неудачно и команда &lt;code&gt;systemctl status systemd-modules-load&lt;/code&gt; показывает, что она была запущена с PID 123, то вы сможете посмотреть вывод процесса в журнале под данным PID, то есть командой &lt;code&gt;journalctl -b _PID=123&lt;/code&gt;. Поля метаданных для журнала вроде &lt;code&gt;_SYSTEMD_UNIT&lt;/code&gt; и &lt;code&gt;_COMM&lt;/code&gt; собираются асинхронно и полагаются на каталог &lt;code&gt;/proc&lt;/code&gt; в случае с действующими процессами. Для решения проблемы требуется внести исправления в ядро, чтобы эти данные можно было собирать через сокет, наподобие &lt;code&gt;SCM_CREDENTIALS&lt;/code&gt;. В общем, &lt;a href=&quot;https://github.com/systemd/systemd/issues/2913&quot; target=&quot;_blank&quot;&gt;это баг&lt;/a&gt;. Имейте в виду, что быстро падающие службы могут не успеть оставить сообщения в журнале из-за особенностей systemd.&lt;/p&gt;
  &lt;h3 id=&quot;7eh0&quot;&gt;Время загрузки системы увеличивается с течением времени&lt;/h3&gt;
  &lt;p id=&quot;NXtZ&quot;&gt;После использования &lt;code&gt;systemd-analyze&lt;/code&gt; некоторые пользователи заметили, что время загрузки системы значительно увеличилось. После использования &lt;code&gt;systemd-analyze blame&lt;/code&gt; &lt;a href=&quot;https://wiki.archlinux.org/title/NetworkManager_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)&quot; target=&quot;_blank&quot;&gt;NetworkManager&lt;/a&gt; запускался необычно долго.&lt;/p&gt;
  &lt;p id=&quot;OV2D&quot;&gt;Проблема связана с тем, что файл &lt;code&gt;/var/log/journal&lt;/code&gt; стал слишком большим. При этом также может уменьшаться скорость работы других команд, например, &lt;code&gt;systemctl status&lt;/code&gt; или &lt;code&gt;journalctl&lt;/code&gt;. Для решения проблемы можно удалить все файлы из каталога журнала (в идеале — сделав где-нибудь резервные копии, хотя бы временно), а затем &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd/%D0%96%D1%83%D1%80%D0%BD%D0%B0%D0%BB#%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0_%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D0%B0&quot; target=&quot;_blank&quot;&gt;ограничить&lt;/a&gt; размер журнала.&lt;/p&gt;
  &lt;h3 id=&quot;WrU8&quot;&gt;systemd-tmpfiles-setup.service не запускается во время загрузки&lt;/h3&gt;
  &lt;p id=&quot;2sff&quot;&gt;Начиная с версии Systemd 219, &lt;code&gt;/usr/lib/tmpfiles.d/systemd.conf&lt;/code&gt; определяет ACL-атрибуты для каталогов в &lt;code&gt;/var/log/journal&lt;/code&gt; и, следовательно, требует &lt;a href=&quot;https://wiki.archlinux.org/title/Access_Control_Lists_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%92%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_ACL&quot; target=&quot;_blank&quot;&gt;включённой&lt;/a&gt; поддержки ACL для той файловой системы, в которой находится журнал.&lt;/p&gt;
  &lt;h3 id=&quot;xTPv&quot;&gt;Отключение emergency mode на удалённой машине&lt;/h3&gt;
  &lt;p id=&quot;aXeb&quot;&gt;Вам может понадобиться отключить emergency mode на удалённой машине, например на виртуальных машинах Azure или Google Cloud. Это связано с тем, что в случае ухода системы в emergency mode она отключится от сети и лишит вас возможности подключения к ней.&lt;/p&gt;
  &lt;p id=&quot;m2S5&quot;&gt;Для отключения этого режима &lt;a href=&quot;https://wiki.archlinux.org/title/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8E%D0%BD%D0%B8%D1%82%D0%BE%D0%B2&quot; target=&quot;_blank&quot;&gt;замаскируйте&lt;/a&gt; &lt;code&gt;emergency.service&lt;/code&gt; и &lt;code&gt;emergency.target&lt;/code&gt;.&lt;/p&gt;

</content></entry><entry><id>xbrekz:bOBgrzypQFz</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/bOBgrzypQFz?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Потоки</title><published>2023-05-22T18:06:25.837Z</published><updated>2023-05-22T18:06:25.837Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/51/f5/51f553dc-15cb-4493-83d9-169b900641cd.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-001-thumb-600xauto-13719.png&quot;&gt;Начнем с основного понятия - терминал. Он уходит корнями в далекое (по компьютерным меркам) прошлое и обозначает собой оконечное устройство, предназначенное для взаимодействия оператора и компьютера, к одному компьютеру может быть присоединено несколько терминалов, каждый из которых работает самостоятельно и независимо от других. Смысл современного терминала, а приложение для работы с командной строкой называется в Linux именно так, не изменился и сегодня, хотя, если быть точными, его название - эмулятор терминала.</summary><content type="html">
  &lt;h3 id=&quot;wJuR&quot;&gt;Стандартные потоки&lt;/h3&gt;
  &lt;p id=&quot;wnhk&quot;&gt;Начнем с основного понятия - &lt;strong&gt;терминал&lt;/strong&gt;. Он уходит корнями в далекое (по компьютерным меркам) прошлое и обозначает собой оконечное устройство, предназначенное для взаимодействия оператора и компьютера, к одному компьютеру может быть присоединено несколько терминалов, каждый из которых работает самостоятельно и независимо от других. Смысл современного &lt;strong&gt;терминала&lt;/strong&gt;, а приложение для работы с командной строкой называется в Linux именно так, не изменился и сегодня, хотя, если быть точными, его название - &lt;strong&gt;эмулятор терминала&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;LnP9&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-001-thumb-600xauto-13719.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;m5fC&quot;&gt;Данное приложение все также эмулирует оконечное устройство, предназначенное для взаимодействия пользователя с компьютером. Точно также мы можем запустить сразу несколько терминалов, каждый из которых будет работать независимо. Кроме того, следует понимать, что терминал может быть запущен как локально, так и удаленно, способ подключения к компьютеру может быть разным, но свойства терминала от этого не изменяются.&lt;/p&gt;
  &lt;p id=&quot;9uC8&quot;&gt;Работая с терминалом нам нужно каким-то образом передавать ему команды и получать результаты. Для этого предназначена &lt;strong&gt;консоль&lt;/strong&gt; - совокупность устройств ввода-вывода обеспечивающих взаимодействие пользователя и компьютера. В качестве консоли на современных ПК выступают клавиатура и монитор, но это только один из возможных вариантов, например, в самых первых моделях терминалов в качестве консоли использовался телетайп. Консоль всегда подключена к текущему рабочему месту, в то время как терминал может быть запущен и удаленно.&lt;/p&gt;
  &lt;p id=&quot;aB1s&quot;&gt;Но в нашей схеме все еще чего-то не хватает. При помощи консоли мы вводим определенные команды и передаем их в терминал, а дальше? Терминал - это всего лишь оконечное устройство для взаимодействия с компьютером, но не сам компьютер, выполнять команды или производить какие-либо другие вычисления он не способен. Поэтому на сцену выходит третий компонент - &lt;strong&gt;командный интерпретатор&lt;/strong&gt;. Это специальная программа, обеспечивающая базовое взаимодействие пользователя и ОС, а также дающая возможность запускать другие программы. В большинстве Linux-дистрибутивов командным интерпретатором по умолчанию является &lt;strong&gt;bash&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;qrTR&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-002-thumb-600xauto-13722.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;1J0E&quot;&gt;Теперь все становится на свои места. Для каждого сеанса взаимодействия пользователя и компьютера создается отдельный терминал, внутри терминала работает специальная программа - командный интерпретатор. При помощи консоли пользователь передает командному интерпретатору или запущенной с его помощью программе входящие данные и получает назад результат их работы. Осталось разобраться каким именно образом это происходит.&lt;/p&gt;
  &lt;p id=&quot;tgsS&quot;&gt;Для взаимодействия запускаемых в терминале программ и пользователя используются &lt;strong&gt;стандартные потоки ввода-вывода&lt;/strong&gt;, имеющие зарезервированный номер (дескриптор) зарезервированный на уровне операционной системы. Всего существует три стандартных потока:&lt;/p&gt;
  &lt;ul id=&quot;IzPY&quot;&gt;
    &lt;li id=&quot;Qy2s&quot;&gt;&lt;strong&gt;stdin&lt;/strong&gt; (&lt;em&gt;standard input, 0&lt;/em&gt;) - стандартный ввод, по умолчанию нацелен на устройство ввода текущей консоли (клавиатура)&lt;/li&gt;
    &lt;li id=&quot;jstl&quot;&gt;&lt;strong&gt;stdout&lt;/strong&gt; (&lt;em&gt;standard output, 1&lt;/em&gt;) - стандартный вывод, по умолчанию нацелен на устройство вывода текущей консоли (экран)&lt;/li&gt;
    &lt;li id=&quot;y7gi&quot;&gt;&lt;strong&gt;stderr&lt;/strong&gt; (&lt;em&gt;standard error, 2&lt;/em&gt;) - стандартный вывод ошибок, специальный поток для вывода сообщения об ошибках, также направлен на текущее устройство вывода (экран)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;j4NC&quot;&gt;Как мы помним, в основе философии Linux лежит понятие - &lt;strong&gt;все есть файл&lt;/strong&gt;. Стандартные потоки не исключение, с точки зрения любой программы - это специальные файлы, которые открываются либо на чтение (поток ввода), либо на запись (поток вывода). Это вызывает очевидный вопрос, а можно ли вместо консоли использовать файлы? Да, можно и здесь мы вплотную подошли к понятию &lt;strong&gt;перенаправления потоков&lt;/strong&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;Gkp4&quot;&gt;Перенаправление потоков&lt;/h3&gt;
  &lt;p id=&quot;YAMv&quot;&gt;Начнем с наиболее простого и понятного - потока вывода. В него программа отправляет результат своей работы, и он отображается на подключенном к консоли устройстве вывода, в современных системах это экран. Допустим мы хотим получить список файлов в директории, для этого мы набираем на устройстве ввода консоли команду:&lt;/p&gt;
  &lt;pre id=&quot;NrIj&quot;&gt;ls -l dir1&lt;/pre&gt;
  &lt;p id=&quot;xMcy&quot;&gt;Которая через стандартный поток ввода будет доставлена командному интерпретатору, тот запустит указанную программу и передаст ей требуемые аргументы, а результат вернет через стандартный поток вывода на устройство отображения информации.&lt;/p&gt;
  &lt;figure id=&quot;Byy7&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/images/linux-standard-stream-pipeline-003.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ua1r&quot;&gt;Но что, если мы хотим сохранить результат работы команды в файл? Нет ничего проще, воспользуемся перенаправлением, для этого следует использовать знак &amp;gt;.&lt;/p&gt;
  &lt;pre id=&quot;bg61&quot;&gt;ls -l dir1 &amp;gt; result&lt;/pre&gt;
  &lt;p id=&quot;OxXC&quot;&gt;На экран теперь не будет выведено ничего, но весь вывод команды окажется в файле &lt;strong&gt;result&lt;/strong&gt;, который мы можем прочитать следующим образом:&lt;/p&gt;
  &lt;pre id=&quot;BSKh&quot;&gt;cat result&lt;/pre&gt;
  &lt;figure id=&quot;l8yc&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-004-thumb-600x170-13726.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ftup&quot;&gt;При таком перенаправлении вывода файл-приемник каждый раз будет создаваться заново, т.е. будет перезаписан. Это очень важный момент, сразу и навсегда запомните &amp;gt; - &lt;strong&gt;всегда перезаписывает файл&lt;/strong&gt;!&lt;/p&gt;
  &lt;figure id=&quot;tUiA&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-005-thumb-600x308-13729.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;KlDF&quot;&gt;Можно ли этого избежать? Можно, для того, чтобы перенаправленный поток был дописан в конец уже существующего файла используйте для перенаправления знак &amp;gt;&amp;gt;.&lt;/p&gt;
  &lt;p id=&quot;kDoe&quot;&gt;Немного изменим последовательность команд:&lt;/p&gt;
  &lt;pre id=&quot;4Fkh&quot;&gt;ls -l dir1 &amp;gt; resultls -l dir2 &amp;gt;&amp;gt; result&lt;/pre&gt;
  &lt;figure id=&quot;Dsdt&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-006-thumb-600x293-13732.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fpyu&quot;&gt;Теперь в файл попал вывод сразу двух команд, при этом, обратите внимание, первой командой мы перезаписали файл, а второй добавили в него содержимое из стандартного потока вывода.&lt;/p&gt;
  &lt;p id=&quot;wDaj&quot;&gt;Пойдем дальше. Как видим в выводе кроме списка файлов присутствуют строки &amp;quot;итого&amp;quot;, нам они не нужны, и мы хотим от них избавиться. В этом нам поможет утилита &lt;strong&gt;grep&lt;/strong&gt;, которая позволяет отфильтровать строки согласно некому выражению. Например, можно сделать так:&lt;/p&gt;
  &lt;pre id=&quot;qJA2&quot;&gt;ls -l dir1 &amp;gt; resultls -l dir2 &amp;gt;&amp;gt; resultgrep rw result &amp;gt; result2&lt;/pre&gt;
  &lt;figure id=&quot;JlBX&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-007-thumb-600x272-13735.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NO8w&quot;&gt;В целом результат достигнут, но ценой трех команд и наличием одного промежуточного файла. Можно ли сделать проще?&lt;/p&gt;
  &lt;p id=&quot;D4MZ&quot;&gt;До этого мы перенаправляли поток вывода, но тоже самое можно сделать и с потоком ввода, используя для этого знак &amp;lt;. Например, мы можем сделать так:&lt;/p&gt;
  &lt;pre id=&quot;zK1P&quot;&gt;grep rw &amp;lt; result&lt;/pre&gt;
  &lt;p id=&quot;cyQP&quot;&gt;Но это ничего не изменит, поэтому мы пойдем другим путем и перенаправим на ввод одной команды вывод другой:&lt;/p&gt;
  &lt;pre id=&quot;I3b4&quot;&gt;grep rw &amp;lt;(ls -l dir1) &amp;lt;(ls -l dir2)&lt;/pre&gt;
  &lt;p id=&quot;OcNg&quot;&gt;На первый взгляд выглядит несколько сложно, но обратимся к &lt;strong&gt;man&lt;/strong&gt; по &lt;strong&gt;grep&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre id=&quot;cvks&quot;&gt;grep [OPTIONS] PATTERN [FILE][FILE...]&lt;/pre&gt;
  &lt;p id=&quot;UyPh&quot;&gt;В качестве паттерна мы используем &lt;strong&gt;rw&lt;/strong&gt;, который есть в каждой интересующей нас строке, а в качестве файлов отдаем стандартный файл потока ввода, содержимого которого является результатом работы команды, указанной в скобках. А можно направить результат этой команды в файл? Конечно, можно:&lt;/p&gt;
  &lt;pre id=&quot;dLzg&quot;&gt;grep rw &amp;lt;(ls -l dir1) &amp;lt;(ls -l dir2) &amp;gt; result&lt;/pre&gt;
  &lt;figure id=&quot;j4Ax&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-008-thumb-600xauto-13738.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pIJM&quot;&gt;В последней команде мы перенаправили не только потоки ввода, но и поток вывода, при этом нужно понимать, что все перенаправления относятся к первой команде, иначе можно подумать, что в &lt;strong&gt;result&lt;/strong&gt; будет выведен результат работы &lt;strong&gt;ls -l dir2&lt;/strong&gt;, однако это неверно.&lt;/p&gt;
  &lt;p id=&quot;jxtH&quot;&gt;Немного особняком стоит стандартный поток вывода ошибок, допустим мы хотим получить список файлов несуществующей директории с перенаправлением вывода в файл, но сообщение об ошибке мы все равно получим на экран.&lt;/p&gt;
  &lt;figure id=&quot;3z4V&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-009-thumb-600xauto-13741.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jKHw&quot;&gt;Почему так? Да потому что вывод ошибок производится в отдельный поток, который мы никуда не перенаправляли. Если мы хотим подавить вывод сообщений об ошибках на экран, то можно использовать конструкцию:&lt;/p&gt;
  &lt;pre id=&quot;MoL7&quot;&gt;ls -l dir3 &amp;gt; result 2&amp;gt;/dev/null&lt;/pre&gt;
  &lt;p id=&quot;mSo8&quot;&gt;В данном примере весь вывод стандартного потока ошибок будет перенаправлен в &lt;strong&gt;пустое устройство&lt;/strong&gt; /dev/null.&lt;/p&gt;
  &lt;p id=&quot;m2zo&quot;&gt;Но можно пойти и другим путем, перенаправив поток ошибок в стандартный поток вывода:&lt;/p&gt;
  &lt;pre id=&quot;sDj0&quot;&gt;ls -l dir3 &amp;gt; result 2&amp;gt;&amp;amp;1&lt;/pre&gt;
  &lt;figure id=&quot;qWFm&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-010-thumb-600xauto-13744.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jIiR&quot;&gt;В этом случае мы перенаправили поток вывода об ошибках в стандартный поток вывода и сообщение об ошибке не было выведено на экран, а было записано в файл, куда мы перенаправили стандартный поток вывода.&lt;/p&gt;
  &lt;h3 id=&quot;wH3Y&quot;&gt;Конвейер&lt;/h3&gt;
  &lt;p id=&quot;dJPg&quot;&gt;В предыдущих примерах мы научились перенаправлять стандартные потоки ввода-вывода и даже частично коснулись вопроса о направлении вывода одной команды на вход другой. А почему бы и нет? Потоки стандартные, это позволяет использовать вывод одной команды как ввод другой. Это еще один очень важный механизм, позволяющий раскрыть всю мощь Linux в реализации очень сложных сценариев достаточно простым способом.&lt;/p&gt;
  &lt;p id=&quot;bNap&quot;&gt;Для того, чтобы перенаправить вывод одной программы на вход другой используйте знак |, на жаргоне &amp;quot;труба&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;IyTU&quot;&gt;Самый простой пример:&lt;/p&gt;
  &lt;pre id=&quot;wIdi&quot;&gt;dpkg -l | grep gnome&lt;/pre&gt;
  &lt;p id=&quot;3sIr&quot;&gt;Первая команда выведет список всех установленных пакетов, вторая отфильтрует только те, в наименовании которых есть строка &amp;quot;gnome&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;fo5N&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-011-thumb-600xauto-13747.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;k1FR&quot;&gt;Длинна конвейера ограничена лишь нашей фантазией и здравым смыслом, никаких ограничений со стороны системы в этом нет. Но также в Linuх нет и единственно верных путей, каждую задачу можно решить самыми различными способами. Возвращаясь к получению списка файлов двух директорий мы можем сделать так:&lt;/p&gt;
  &lt;pre id=&quot;uB1m&quot;&gt;cat &amp;lt;(ls -l dir1) &amp;lt;(ls -l dir2) | grep rw &amp;gt; result&lt;/pre&gt;
  &lt;figure id=&quot;wPfk&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://interface31.ru/tech_it/assets_c/2021/10/linux-standard-stream-pipeline-012-thumb-600xauto-13750.png&quot; width=&quot;600&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;VR8M&quot;&gt;Какой из этих способов лучше? Любой, Linux ни в чем не ограничивает пользователей и предоставляет им много путей для решения одной и той же задачи.&lt;/p&gt;
  &lt;p id=&quot;vs6a&quot;&gt;Еще один важный момент, если вы повышаете права с помощью команды &lt;strong&gt;sudo&lt;/strong&gt;, то данное повышение прав через конвейер не распространяется. Например, если мы решим выполнить:&lt;/p&gt;
  &lt;pre id=&quot;xXTb&quot;&gt;sudo command1 | command2&lt;/pre&gt;
  &lt;p id=&quot;XuAC&quot;&gt;То первая команда будет выполнена с правами суперпользователя, а вторая с правами запустившего терминал пользователя.&lt;/p&gt;

</content></entry><entry><id>xbrekz:DBi-1Wm8SmQ</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/DBi-1Wm8SmQ?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Linux debug</title><published>2023-05-22T18:06:14.106Z</published><updated>2023-05-22T18:06:14.106Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/9d/dd/9dddfdc5-68e6-485f-ba2e-abdaac0fd41a.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://habrastorage.org/files/171/957/3d5/1719573d59e34db982c789b3165f6cb4.jpg&quot;&gt;</summary><content type="html">
  &lt;figure id=&quot;tjSO&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/171/957/3d5/1719573d59e34db982c789b3165f6cb4.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;9ei8&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/c46/d33/11f/c46d3311f99a4e1b947775950126cd20.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;SlSe&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/07e/aa7/c06/07eaa7c06e2942a0b1d480013a1f1e75.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;8Ez6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/934/4e3/e06/9344e3e0658b4cbb82074d025db6e9f6.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;iKiT&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/bdc/6af/465/bdc6af4654ec4a06a1a94c4c0b84b92f.jpg&quot; width=&quot;624&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;yVeG&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/b18/694/83a/b1869483a35845f2a3a0db11a30871cc.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;EI2l&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/670/f9f/9fd/670f9f9fd3bb435383599f527a4c2f8b.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;01uX&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/524/6a8/2cd/5246a82cdfc140178816de8836bc7c8e.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;zUSU&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/3ba/7f0/61b/3ba7f061b36349f49ab00899d2fa1e16.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;HtTu&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/c3a/bd6/28e/c3abd628e03147b593a726730c05206d.jpg&quot; width=&quot;617&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Oovu&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/60b/bb2/1dc/60bbb21dc20843f88f909877eaa4a7a8.jpg&quot; width=&quot;613&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Qarc&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/bc0/7fd/591/bc07fd591372470ca9fc4fc07ce42407.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;Rt31&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/4d6/de2/d44/4d6de2d4411f41eda1aa27de15009216.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;6Ym8&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/d14/a4a/937/d14a4a93714c4e1c9ff6578c955b98f6.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;NYB5&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/63d/1ae/e90/63d1aee90cc04a1d82c145127fd9ad9f.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;FLFO&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/fcf/a44/fa3/fcfa44fa351b472b9522f3dec7d96368.jpg&quot; width=&quot;621&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;huA4&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/289/f49/2b1/289f492b166741c293bb308491fe0550.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;nklV&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://habrastorage.org/files/a66/61a/529/a6661a529e6a43878fc4d824d89c4c6a.jpg&quot; width=&quot;625&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>xbrekz:j9q5iGx0Wqe</id><link rel="alternate" type="text/html" href="https://teletype.in/@xbrekz/j9q5iGx0Wqe?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=xbrekz"></link><title>Что такое система инициализации</title><published>2023-05-22T18:04:39.813Z</published><updated>2023-05-22T18:04:39.813Z</updated><summary type="html">Система инициализации — это система в Linux, которая подготавливает к работе операционную систему. Система инициализации запускается ядром как первый процесс в операционной системе. И уже затем, этот первый процесс, запускает все остальные процессы. Также при выключении система инициализации занимается остановкой всех процессов.</summary><content type="html">
  &lt;p id=&quot;PgN2&quot;&gt;&lt;strong&gt;Система инициализации&lt;/strong&gt; — это система в Linux, которая подготавливает к работе операционную систему. Система инициализации запускается ядром как первый процесс в операционной системе. И уже затем, этот первый процесс, запускает все остальные процессы. Также при выключении система инициализации занимается остановкой всех процессов.&lt;/p&gt;
  &lt;p id=&quot;l9yO&quot;&gt;Алгоритм загрузки операционной системы я описывал в &lt;a href=&quot;https://sysadminium.ru/adm_serv_linux-boot_algorithm/&quot; target=&quot;_blank&quot;&gt;этой статье&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;E0op&quot;&gt;Систем инициализации много, первой такой системой была &lt;strong&gt;SysV&lt;/strong&gt;, потом для &lt;strong&gt;Ubuntu&lt;/strong&gt; написали &lt;strong&gt;Upstart&lt;/strong&gt;. Но сейчас система инициализации &lt;strong&gt;&lt;a href=&quot;https://github.com/systemd/systemd&quot; target=&quot;_blank&quot;&gt;SystemD&lt;/a&gt;&lt;/strong&gt; становится системой инициализации по умолчанию во многих популярных дистрибутивах Linux. В том числе и в &lt;strong&gt;Ubuntu 22.04&lt;/strong&gt;, и в &lt;strong&gt;Debian 11&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;AUZf&quot;&gt;В этой статье я некоторые примеры выполнял на Debian 11, а другие на Ubuntu 22.04, разницы нет никакой. Единственная разница – это версия SystemD:&lt;/p&gt;
  &lt;ul id=&quot;pCiI&quot;&gt;
    &lt;li id=&quot;plLf&quot;&gt;Ubuntu 22.04 – Version: 249.11-0&lt;/li&gt;
    &lt;li id=&quot;OiPX&quot;&gt;Debian 11 – Version: 247.3-7&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;VfeT&quot;&gt;Как видите в Ubuntu она поновее.&lt;/p&gt;
  &lt;p id=&quot;7De7&quot;&gt;В первой системе инициализации &lt;strong&gt;SysV&lt;/strong&gt; программа инициализации называлась &lt;strong&gt;init&lt;/strong&gt;, для совместимости в &lt;strong&gt;SystemD&lt;/strong&gt; оставили это название, но &lt;strong&gt;init&lt;/strong&gt; это всего лишь символьная ссылка на &lt;strong&gt;systemd&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;8BN8&quot;&gt;С помощью утилиты &lt;strong&gt;ps&lt;/strong&gt; мы можем узнать какой процесс в системе является первым, то есть у какого процесса номер равен единице (&lt;strong&gt;PID=1&lt;/strong&gt;).&lt;/p&gt;
  &lt;p id=&quot;rPcz&quot;&gt;alex@deb:~$ ps 1&lt;/p&gt;
  &lt;p id=&quot;Ntmp&quot;&gt;PID TTY STAT TIME COMMAND&lt;/p&gt;
  &lt;p id=&quot;OsgP&quot;&gt;1 ? Ss 0:10 /sbin/init&lt;/p&gt;
  &lt;p id=&quot;OpSe&quot;&gt;Из вывода мы узнали, что первым процессом в системе является процесс приложения &lt;strong&gt;/sbin/init&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;k1M8&quot;&gt;Посмотрим, что это за файл:&lt;/p&gt;
  &lt;p id=&quot;SQIl&quot;&gt;alex@deb:~$ ls -l /sbin/init&lt;/p&gt;
  &lt;p id=&quot;d4C7&quot;&gt;lrwxrwxrwx 1 root root 20 мар 20 22:55 /sbin/init -&amp;gt; /lib/systemd/systemd&lt;/p&gt;
  &lt;p id=&quot;RGuR&quot;&gt;Таким образом я подтвердил вам, что &lt;strong&gt;/sbin/init&lt;/strong&gt; это всего лишь символьная ссылка на &lt;strong&gt;/lib/systemd/systemd&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;oKJb&quot;&gt;Про ссылки я писал &lt;a href=&quot;https://sysadminium.ru/adm_serv_linux-links_in_linux/&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;de0O&quot;&gt;Основная цель SystemD&lt;/h2&gt;
  &lt;p id=&quot;dhW3&quot;&gt;Основная цель &lt;strong&gt;systemd&lt;/strong&gt; это ускорение загрузки операционной системы за счет &lt;strong&gt;распараллеливания&lt;/strong&gt; запуска процессов и &lt;strong&gt;отложенного запуска&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;2FbX&quot;&gt;&lt;strong&gt;Распараллеливание&lt;/strong&gt; достигается одновременным запуском не связанных служб. То есть, если одна служба не зависит от второй и у обоих есть достаточно ресурсов для запуска, то они запускаются одновременно.&lt;/p&gt;
  &lt;p id=&quot;hgHi&quot;&gt;&lt;strong&gt;Отложенный старт&lt;/strong&gt; достигается за счет подготовки всего необходимого к запуску службы, но сама служба запускается позже, по требованию. Например, создаются все сокеты для работы службы, но служба запустится только когда к сокету обратятся.&lt;/p&gt;
  &lt;h2 id=&quot;lrzj&quot;&gt;Юниты&lt;/h2&gt;
  &lt;p id=&quot;IHPM&quot;&gt;Все задачи которые выполняет &lt;strong&gt;SystemD&lt;/strong&gt; описываются в специальных файлах, которые называются юниты (&lt;strong&gt;unit&lt;/strong&gt;). Юниты бывают разных типов, в этом курсе мы рассмотрим только три типа юнитов:&lt;/p&gt;
  &lt;ul id=&quot;Ltpt&quot;&gt;
    &lt;li id=&quot;oPIV&quot;&gt;&lt;strong&gt;service&lt;/strong&gt; – описывает сервис (службу) или скрипт, в общем все то что можно запустить;&lt;/li&gt;
    &lt;li id=&quot;vp3O&quot;&gt;&lt;strong&gt;target&lt;/strong&gt; – группирует юниты, то есть мы можем объединить две службы и запускать их как одну;&lt;/li&gt;
    &lt;li id=&quot;Iuhg&quot;&gt;&lt;strong&gt;timer&lt;/strong&gt; – определяет таймер (аналог cron). То есть службы могут запускаться по определённому расписанию, или с задержкой.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;xZWt&quot;&gt;Вот примеры юнитов разных типов:&lt;/p&gt;
  &lt;p id=&quot;fOk2&quot;&gt;alex@deb:~$ ls -l /lib/systemd/system/ssh.service&lt;/p&gt;
  &lt;p id=&quot;oC3q&quot;&gt;-rw-r--r-- 1 root root 538 мар 13 2021 /lib/systemd/system/ssh.service&lt;/p&gt;
  &lt;p id=&quot;JsHj&quot;&gt;alex@deb:~$ ls -l /lib/systemd/system/default.target&lt;/p&gt;
  &lt;p id=&quot;QTWN&quot;&gt;lrwxrwxrwx 1 root root 16 мар 20 22:55 /lib/systemd/system/default.target -&amp;gt; graphical.target&lt;/p&gt;
  &lt;p id=&quot;cMAA&quot;&gt;alex@deb:~$ ls -l /lib/systemd/system/logrotate.timer&lt;/p&gt;
  &lt;p id=&quot;Hzdw&quot;&gt;-rw-r--r-- 1 root root 191 окт 14 2019 /lib/systemd/system/logrotate.timer&lt;/p&gt;
  &lt;ul id=&quot;JTLS&quot;&gt;
    &lt;li id=&quot;Lxqp&quot;&gt;&lt;strong&gt;ssh.service&lt;/strong&gt; – служба ssh сервера, с помощью которого мы удалённо управляем linux системой;&lt;/li&gt;
    &lt;li id=&quot;htDe&quot;&gt;&lt;strong&gt;default.target&lt;/strong&gt; – таргет который запускается при включении системы по умолчанию, при этом запускаются службы у которых настроен автозапуск для этого таргета.&lt;/li&gt;
    &lt;li id=&quot;Tq2D&quot;&gt;&lt;strong&gt;logrotate.timer&lt;/strong&gt; – таймер, который запускает службу &lt;strong&gt;logrotate.service&lt;/strong&gt; для ротации логов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;xbrW&quot;&gt;Список всех активных юнитов в системе можно посмотреть с помощью следующей команды:&lt;/p&gt;
  &lt;p id=&quot;XB6N&quot;&gt;alex@ubu:~$ systemctl list-units&lt;/p&gt;
  &lt;p id=&quot;kEGC&quot;&gt;Но так как юнитов слишком много, обычно выводят не все юниты а юниты определённого типа, например:&lt;/p&gt;
  &lt;p id=&quot;qg6n&quot;&gt;alex@ubu:~$ systemctl list-units -t service&lt;/p&gt;
  &lt;p id=&quot;V7iS&quot;&gt;alex@ubu:~$ systemctl list-units -t timer&lt;/p&gt;
  &lt;p id=&quot;qEW7&quot;&gt;alex@ubu:~$ systemctl list-units -t target&lt;/p&gt;
  &lt;p id=&quot;veqS&quot;&gt;Если нужно получить список не только активных юнитов, то просто добавьте опцию &lt;strong&gt;all&lt;/strong&gt;, например:&lt;/p&gt;
  &lt;p id=&quot;w4FK&quot;&gt;alex@ubu:~$ systemctl list-units -t target --all&lt;/p&gt;
  &lt;h2 id=&quot;pocG&quot;&gt;Расположение юнитов&lt;/h2&gt;
  &lt;p id=&quot;K7p8&quot;&gt;Юниты можно найти в следующих каталогах:&lt;/p&gt;
  &lt;ul id=&quot;qspN&quot;&gt;
    &lt;li id=&quot;uotC&quot;&gt;&lt;strong&gt;/lib/systemd/system&lt;/strong&gt; — системные юниты, устанавливаются обычно вместе с приложениями. Они имеют самый низкий приоритет.&lt;/li&gt;
    &lt;li id=&quot;Z3D7&quot;&gt;&lt;strong&gt;/run/systemd/system&lt;/strong&gt; — динамически создаваемые юниты. Имеют средний приоритет.&lt;/li&gt;
    &lt;li id=&quot;xDNI&quot;&gt;&lt;strong&gt;/etc/systemd/system&lt;/strong&gt; — юниты создаваемые вручную. Имеют наивысший приоритет.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;0Hla&quot;&gt;alex@s-deb:~$ ls -ld /*/systemd/system&lt;/p&gt;
  &lt;p id=&quot;6HOc&quot;&gt;drwxr-xr-x 9 root root 4096 июн 20 15:09 /etc/systemd/system&lt;/p&gt;
  &lt;p id=&quot;gZRO&quot;&gt;drwxr-xr-x 19 root root 36864 июн 20 15:09 /lib/systemd/system&lt;/p&gt;
  &lt;p id=&quot;NUyq&quot;&gt;drwxr-xr-x 2 root root 40 июл 11 12:50 /run/systemd/system&lt;/p&gt;
  &lt;p id=&quot;UL4q&quot;&gt;Если мы создадим юнит в каталоге &lt;strong&gt;/etc/systemd/system&lt;/strong&gt;, и с таким-же именем будет юнит в &lt;strong&gt;/lib/systemd/system&lt;/strong&gt;, то наш созданный юнит будет иметь более высокий приоритет.&lt;/p&gt;
  &lt;h2 id=&quot;kaAu&quot;&gt;Итог&lt;/h2&gt;
  &lt;p id=&quot;Y4cc&quot;&gt;Вот мы и познакомились с системой инициализации &lt;strong&gt;SystemD&lt;/strong&gt;, которая используется в &lt;strong&gt;Debian 11&lt;/strong&gt; и в &lt;strong&gt;Ubuntu 22.04&lt;/strong&gt; по умолчанию. В следующих статьях подробнее разберёмся с юнитами, и даже напишем свой сервис и таймер. А затем пробежимся по основным утилитам этой системы.&lt;/p&gt;
  &lt;p id=&quot;18QD&quot;&gt;Узнали новую команду &lt;strong&gt;systemctl&lt;/strong&gt;, с помощью которой в этой статье смотрели список юнитов в системе:&lt;/p&gt;
  &lt;p id=&quot;URJB&quot;&gt;systemctl list-units # все активные юниты&lt;/p&gt;
  &lt;p id=&quot;oBOF&quot;&gt;systemctl list-units --all # все юниты (не только активные)&lt;/p&gt;
  &lt;p id=&quot;POjP&quot;&gt;systemctl list-units -t &amp;lt;тип_юнита&amp;gt; # активные юниты определённого типа&lt;/p&gt;
  &lt;p id=&quot;hA9q&quot;&gt;systemctl list-units -t &amp;lt;тип_юнита&amp;gt; --all # все юниты определённого типа&lt;/p&gt;

</content></entry></feed>