Бэкап на sftp с ротацией

Исходные данные:
Необходимо делать бэкап чего-то раз в сутки. Нужно хранить последние 5 версий бэкапа. Бэкап надо сохранять на сервер бэкапа, доступ к которому предоставлен по sftp (в моем случае еще и ключа на sftp нет, будем делать по паролю. Если у вас ключ – поздравляю! Вы счастливчик!).
Проверяем установлен ли у нас пакет sshfs. Если нет – устанавливаем. Для RHEL/CentOS:

sudo yum install sshfs

Debian/Ubuntu:

sudo apt-get install sshfs

Cоздаем папку для монтирования:

sudo mkdir /mnt/sftp

Создаем скрипт sshfs_mount.sh для монтирования sftp к нашей файловой системе.Если у вас авторизация по ключу для sftp, содержание файла скрипта будет следующим:

#!/bin/bash
sshfs user@my.sftp.backup.server:/ /mnt/sftp/

Если вам необходимо авторизоваться по паролю, то можно сделать так:

#!/bin/bash
sshfs -o password_stdin user@my.sftp.backup.server:/ /mnt/sftp/ <<< "my_password"

Вообще, можно не выносить монтирование в отдельный скрипт, а просто команду с маунтом вписать в скрипт бэкапа (перед командой переноса файлов на sftp, естественно). Но мне удобнее делать именно так.

Теперь, когда мы смонтировали sftp в /mnt/sftp/, можем осуществить ротацию бэкапов на sftp.
Для этого мы не будем использовать время создания/изменения. Все наши бэкапы сейчас имеют имена вида YY-MM-DD.name.backup, которые можно отсортировать и удалить лишнее.
Бэкапы должны складываться в отдельную папку, где ничего кроме них не будет лежать. Это важно! Иначе вы просто наудаляете лишнего. У нас эти бэкапы складываются в /mnt/sftp/mysql_backup/
Назовем его mysql_backup.sh:

#!/bin/bash
BACKUP_DATE=`date +%Y-%M-%D_%H:%M:%S`
 
mysqldump -u root --databases table1 > /mnt/sftp/mysql_backup/$BACKUP_DATE.mysql/$BACKUP_DATE.table1.sql
mysqldump -u root --databases table2 > /mnt/sftp/mysql_backup/$BACKUP_DATE.mysql/$BACKUP_DATE.table2.sql
mysqldump -u root --databases table3 > /mnt/sftp/mysql_backup/$BACKUP_DATE.mysql/$BACKUP_DATE.table3.sql

Теперь, когда мы смонтировали sftp в /mnt/sftp/ и скопировали туда свежие дампы, можем осуществить ротацию бэкапов.
Все наши бэкапы сейчас имеют имена вида YY-MM-DD.name.backup, которые можно отсортировать и удалить лишнее. Я хочу хранить 4 последние версии.
Пусть это будет скрипт с именем rotate_backup.sh и следующим содержанием:

#!/bin/bash
 
MAX_COPIES_COUNTER=4 # Количество версий, которое вы хотите хранить
DIRECTORY=/mnt/sftp/mysql_backup # Директория, в которой лежат бэкапы
 
COPIES_COUNTER=`ls $DIRECTORY | wc -l` # Считаем количество папок с бэкапами
 
if [ $COPIES_COUNTER -gt $MAX_COPIES_COUNTER ] # Если текущее количество больше, чем то, что мы хотим, то
then
NEED_TO_DELETE_COUNTER=$(($(ls $DIRECTORY | wc -l)-$MAX_COPIES_COUNTER)) # Считаем сколько необходимо удалить
for (( i==1; i<$NEED_TO_DELETE_COUNTER; i++ ))
do
rm -rf $DIRECTORY/$(ls $DIRECTORY | sort | head -n 1) # Выводим список, сортируем, удаляем лишнее начиная с самого давнего
done
fi

Теперь эти три скрипта необходимо добавить в крон. Сначала sshfs_mount.sh и mysql_backup.sh. И где-нибудь потом rotate_backup.sh.
Выполним

crontab -e

И внесем их в крон:

9 0 * * * /bin/bash /home/Lector/sshfs_mount.sh
10 0 * * * /bin/bash /home/Lector/mysql_backup.sh
10 1 * * * /bin/bash /home/Lector/rotate_backup.sh

Все)

Глава 10. Управление сервисами в systemd. 10.5 Управление systemd на удаленной машине

В дополнение к управлению системой systemd и диспетчером служб локально, утилита systemctl также позволяет вам взаимодействовать с systemd, работающим на удаленной машине по протоколу SSH. При условии, что служба sshd на удаленном компьютере запущена, вы можете подключиться к этому компьютеру, запустив команду systemctl с опцией -host или -H:

systemctl --host user_name@host_name command

Замените user_name именем удаленного пользователя, host_name именем удаленного хоста (или ip) и введите любую из команд systemctl из описанных в предыдущих главах. Обратите внимание, что на удаленном компьютере должен быть сконфигурирован ssh, чтобы разрешить удаленный доступ выбранному пользователю. Для получения информации о том, как настроить SSH-сервер, см. Chapter 12, OpenSSH.

Пример 10.16. Удаленное управление

Чтобы войти на удаленный компьютер server-01.example.com как пользователь root и определить текущий статус сервиса httpd.service, выполните следующую команду:

~]$ systemctl -H root@server-01.example.com status httpd.service
>>>>>>> systemd unit files -- update
root@server-01.example.com's password:
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since Fri 2013-11-01 13:58:56 CET; 2h 48min ago
 Main PID: 649
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service

Глава 10. Управление сервисами в systemd. 10.4 Выключение, приостановка и спящий режим

В RHEL 7 утилита systemctl заменила команды управления питанием из предыдущих версий дистрибутива. Команды, представленные в Таблице 10.8 “Сопоставление команд управления питанием с systemctl” также доступны в системе, но, по-возможности, рекомендуется использовать systemctl.

Таблица 10.7 Сопоставление команд управления питанием с systemctl
Старая команда Новая команда Описание
halt systemctl halt Останавливает систему
poweroff systemctl poweroff Выключает систему
reboot systemctl reboot Перезагружает систему
pm-suspend systemctl suspend Приостанавливает систему
pm-hibernate systemctl hibernate Отправляет систему в спящий режим
pm-suspend-hybrid systemctl hybrid-sleep Отправляет в спящий режим и приостанавливает систему

10.4.1.Выключение системы

Утилита systemctl предоставляет команды для выключения системы, однако традиционная команда shutdown также поддерживается. Хотя команда shutdown вызовет утилиту systemctl для выключения системы, она все же имеет преимущество т.к. поддерживает аргумент времени.
Это особенно полезно для планового обслуживания и дает пользователю время отреагировать на предупреждение системы о завершении работы. Преимуществом также является возможность отмены выключения.

Использование команды systemctl

Чтобы отключить систему и выключить машину введите в командной строке от root’а:

systemctl poweroff

Чтобы выключить и остановить систему без выключения компьютера, запустите следующую команду от root’а:

systemctl halt

По умолчанию каждая из этих команд заставляет systemd отправлять информационное сообщение всем пользователям, которые вошли в систему. Чтобы предотвратить отправку этого сообщения, запустите выбранную команду с опцией –no-wall, например:

systemctl --no-wall poweroff

Использование команды shutdown

Чтобы отключить систему и выключить машину в определенное время, выполните от root’а:

shutdown --poweroff hh:mm

Где hh:mm – время в 24-часовом формате. Ща 5 минут до выключения системы содается файл /run/nologin, который предоствращает вход в систему. При использовании аргумента времени можно добавить сообщение.
Чтобы выключить и остановить систему с задержкой, без отключения компьютера, используйте следующую команду от root:

shutdown --halt +m

Где +m время задержки до выключения в минутах. Вместо now можно также использовать +0. The now keyword is an alias for +0.
Ожидание завершения работы может быть отменено от root’а следующим образом:

shutdown -c

См. страницу мануала shutdown(8) (man shutdown), чтобы посмотреть дополнительные параметры команды.

10.4.2. Перезагрузка системы

Чтобы перезапустить систему, наберите от root’а:

systemctl reboot

По умолчанию эта команда заставляет systemd отправлять информационное сообщение пользователям, которые залогинены в системе. Чтобы предовратить отправку сообщения, выполните эту команду с опцией --no-wall:

systemctl --no-wall reboot

10.4.3. Приостановка системы

Чтобы приостановить систему, наберите от root’а:

systemctl suspend

Эта команда сохраняет состояние системы в ОЗУ и отключает большую часть устройств, за исключением модуля ОЗУ. Когда вы снова включаете машину, система восстанавливает свое состояние из ОЗУ без повторной загрузки. Поскольку состояние системы сохраняется в ОЗУ, а не на жестком диске, восстановление системы из режима приостановки значительно быстрее, чем восстановление ее из спящего режима, но, как следствие, состояние приостановленной системы также уязвимо для отключения питания.

10.4.4. Спящий режим

Чтобы отправить систему в спящий режим:

systemctl hibernate

Эта команда сохраняет состояние системы на жесткий диск и отключает машину. Когда вы включаете машину снова, система восстанавливает это состояние из сохраненных данных без повторной загрузки. Поскольку состояние системы сохраняется на жестком диске, а не в ОЗУ, машине не требуется электроэнергия для ОЗУ, но, как следствие, восстановление системы из спящего режима происходит значительно медленнее, чем восстановление из режима ожидания.
Чтобы отправить в спящий режим и приостановить систему, выполните от root’а:

systemctl hybrid-sleep

(Прим.пер. – я так понимаю, это своего рода перестраховка. Система приостановлена, но при сбое питания у нас есть сохраненное состояние системы на харде.)

Глава 10. Управление сервисами в systemd. 10.3 Работа с таргетами в systemd

Предыдущие версии RHEL, которые распространялись с SysV init или Upstart, включали предопределенный набор уровней запуска (ранлевелов), которые представляли собой конкретные режимы работы. Ранлевелы нумеровались от 0 до 6 и определяли набор системных сервисов, которые запускались когда системный администратор запускал определенный ранлевел. В RHEL7 концепция уровней запуска была заменена таргетами systemd.
Таргеты systemd представлены таргет-юнитами. Файлы этих юнитов имеют расширение .target и их предназначение в том, чтобы объединить другие юниты systemd в цепочку зависимостей. Например, юнит graphical.target, который используется для запуска графического интерфейса, запускает такие сервисы как GNOME Display Manager (gdm.service) или Accounts Service (accounts-daemon.service), а также активирует таргет multi-user.target. Аналогично, юнит multi-user.target запускает другие важные системные сервисы, такие как NetworkManager (NetworkManager.service) или D-Bus (dbus.service), и активирует другой таргет с именем basic.target.
RHEL распространяется с несколькими предопределенными таргетами, которые похожи на стандартные уровни выполнения предыдущих релизов системы. По соображениям совместимости он также предоставляет псевдонимы для этих таргетов, которые непосредственно отображают их на уровни запуска SysV. В таблице 10.6 «Сравнение уровней запуска SysV с таргетами systemd» представлен полный список уровней запуска SysV и соответствующих им таргетов.

Таблица 10.6 Сравнение уровней запуска SysV init с таргетами systemd
Ранлевел Таргет Описание
0 runlevel0.target, poweroff.target Завершение работы и отключение системы
1 runlevel1.target, rescue.target Оболочка восстановления
2 runlevel2.target, multi-user.target Многопользовательская система без графоболочки
3 runlevel3.target, multi-user.target Многопользовательская система без графоболочки
4 runlevel4.target, multi-user.target Многопользовательская система без графоболочки
5 runlevel5.target, graphical.target Многопользовательская система с графоболочкой
6 runlevel6.target, reboot.target Выключение и перезагрузка системы

Чтобы просмотреть, изменить или настроить таргеты systemd, используйте утилиту systemctl, как описано в таблице 10.7, «Сравнение команд SysV init с systemctl» и в следующих разделах. Команды runlevel и telinit по-прежнему доступны в системе и работают должным образом, но включены только по соображениям совместимости и их следует избегать.

Таблица 10.7 Сравнение команд SysV init с таргетами systemd
Старая команда Новая команда Описание
runlevel systemctl list-units –type target Список загруженных таргетов
telinit
runlevel
systemctl isolate name.target Смена текущего таргета

10.3.1. Просмотр таргета по умолчанию

Чтобы определить какой таргет используется по умолчанию, запустите следующую команду:

systemctl get-default

Эта команда читает симлинк, расположенный в /etc/systemd/system/default.target, и отображает результат. Для получения информации о том, как сменить таргет по умолчанию см. в разделе 10.3.3, “Смена таргета по умолчанию”. Для получения списка всех загруженных таргетов см. раздел 10.3.2,”Просмотр текущих таргетов”.
Пример 10.10. Просмотр таргета по умолчанию
Чтобы отобразить таргет по умолчанию, выполните:

~]$ systemctl get-default
graphical.target

10.3.2. Просмотр текущего таргета

Чтобы получить список загруженных таргетов, наберите следующую команду:

systemctl list-units --type target

Для каждого таргета эта команда отображает полное имя (UNIT), за ним следует примечание загружен ли юнит (LOAD), высокоуровневый (ACTIVE) и низкоуровневый (SUB) статус юнита, и краткое описание (DESCRIPTION).
По умолчанию команда systemctl list-units отображает только активные юниты. Если вы хотите просмотреть список всех загруженных юнитов независимо от их состояния, запустите эту команду с флагом --all или -a:

systemctl list-units --type target --all

Как сменить текущий таргет см. в разделе 10.3.4, “Смена текущего таргета”.

Пример 10.11. Просмотр текщего таргета

~]$ systemctl list-units --type target
UNIT                  LOAD   ACTIVE SUB    DESCRIPTION
basic.target          loaded active active Basic System
cryptsetup.target     loaded active active Encrypted Volumes
getty.target          loaded active active Login Prompts
graphical.target      loaded active active Graphical Interface
local-fs-pre.target   loaded active active Local File Systems (Pre)
local-fs.target       loaded active active Local File Systems
multi-user.target     loaded active active Multi-User System
network.target        loaded active active Network
paths.target          loaded active active Paths
remote-fs.target      loaded active active Remote File Systems
sockets.target        loaded active active Sockets
sound.target          loaded active active Sound Card
spice-vdagentd.target loaded active active Agent daemon for Spice guests
swap.target           loaded active active Swap
sysinit.target        loaded active active System Initialization
time-sync.target      loaded active active System Time Synchronized
timers.target         loaded active active Timers
 
LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
 
17 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

10.3.3. Смена таргета по умолчанию

Чтобы сконфигурировать систему на использование другого таргета по умолчанию, выполните от root:

systemctl set-default name.target

Замените name на имя таргета, который вы хотите сделать дефолтным (например, multi-user). Эта команда заменяет файл /etc/systemd/system/default.target символической ссылкой на /usr/lib/systemd/system/name.target, где name это имя таргета, который вы хотите использовать. Как сменить текущий таргет см. в разделе 10.3.4, “Смена текущего таргета”. Как посмотреть информацию о текущем таргете, см. раздел 10.3.2,”Просмотр текущих таргетов”.

Пример 10.12. Смена таргета по умолчанию

Чтобы скофигурировать систему для использования multi-user.target по умолчанию, выполните от root:

~]# systemctl set-default multi-user.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target'

10.3.4. Смена текущего таргета

Чтобы сменить таргет в текущей сессии, наберите от root:

systemctl isolate name.target

Замените name на имя таргета, который вы хотите использовать (например, multi-user). Эта команда запускает таргет с именем name и немедленно останавливает все остальные. Как сменить таргет по умолчанию см. раздел 10.3.3, “Смена таргета по умолчанию”. Как просмотреть список загруженных таргетов см. в разделе 10.3.2,”Просмотр текущих таргетов”.

Пример 10.13. Смена текущего таргета

Чтобы выключить графический интерфейс и сменить его на multi-user.target в текущей сессии, запустите от root:

~]# systemctl isolate multi-user.target

10.3.5. Переход в режим восстановления

Режим восстановления предоставляет однопользовательскую среду и позволяет восстановить систему в ситуациях, когда система не может завершить обычный процесс загрузки. В режиме восстановления система пытается смонтировать все локальные файловые системы и запустить некоторые системные сервисы, но не активирует сетевые интерфейсы и не позволяет одновременно входить нескольким пользователям в систему. В RHEL 7 режим восстановления эквивалентен однопользовательскому режиму и требует ввода рутового пароля.
Смена текущего таргета и переход в режим восстановления в текущей сессии (от root):

systemctl rescue

Этак команда похожа на systemctl isolate rescue.target, но она также отправляет информационное сообщение всем пользователям, которые в настоящее время вошли в систему. Чтобы система не отправляла сообщение, запустите команду с опцией --no-wall:

systemctl --no-wall rescue

Пример 10.14. Переход в режим восстановления

~]# systemctl rescue
Broadcast message from root@localhost on pts/0 (Fri 2013-10-25 18:23:15 CEST):
 
The system is going down to rescue mode NOW!

10.3.6. Переход в аварийный режим

Аварийный режим предоставляет минимально возможную среду и позволяет восстановить систему даже тогда, когда она не может загрузиться в режим восстановления. Система монтирует root file system только для чтения и запускает только несколько основных сервисов, не пытается подключить другие файловые системы и не активирует сеть. В RHEL 7 аварийный режим требует ввода пароля root’а.
Чтобы сменить текущий таргет на аварийный режим, введите от root’а:

systemctl emergency

Эта команда похожа на systemctl isolate emergency.target, но она дополнительно отправляет сообщение всем пользователям, которые в настоящее время вошли в систему. Чтобы система не отправляла сообщение, запустите команду с опцией --no-wall:

systemctl --no-wall emergency

Пример 10.15. Переход в аварийный режим
Чтобы перейти в аварийный режим с отправкой сообщения всем пользователям, запустите от root’а:

~]# systemctl --no-wall emergency

Виртуализация. KVM на CentOS 7 (RHEL 7), простой мануал.

Устанавливаем и настраиваем KVM на CentOS 7. Я поставлю на виртуалку Astra Linux. Хочу просто ознакомиться с этим дистрибутивом.

Сначала посмотрим, поддерживает ли наш проц виртуализацию:

grep -E 'svm|vmx' /proc/cpuinfo

Вывод команды не должен быть пустым.
Установим несколько пакетов, которые не входят в базовую установку RHEL и CentOS 7.

sudo yum -y install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-viewer

Включим сервис libvirtd и добавим его в загрузку (от рута).

sudo systemctl enable libvirtd && systemctl start libvirtd

Сеть. Мы создадим мост br0. Для этого создаем файлик ifcfg-br0.

sudo nano /etc/sysconfig/network-scripts/ifcfg-br0

Примерно следующего содержания:

DEVICE="br0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Bridge"
DELAY="0"

А сейчас внимание! После того, как мы создали новый бридж (br0 в нашем случае), для него в файле /etc/qemu-kvm/bridge.conf (в других дистрибутивах может быть несколько иной путь, типа /etc/qemu/bridge.conf) необходимо добавить строку:

allow br0

, а иначе можно получить что-то вроде: “failed to retrieve file descriptor for interface: transport endpoint is not connected” при попытке создания новой гостевой ОС. И мост не поднимется.
Теперь включим перенаправление (network forwarding), в файле /etc/sysctl.conf добавим строку:

net.ipv4.ip_forward = 1

Перечитаем файл и перезапустим сеть:

sudo sysctl -p /etc/sysctl.conf
sudo systemctl restart NetworkManager

Диски и SELinux.
Я буду хранить диски виртуалок в домашнем каталоге, в директории ~/vm-images.

mkdir ~/vm-images

Для управления SELinux установим policycoreutils-python (содержит утилиту semanage):

sudo yum -y install policycoreutils-python

Установим контекст для нашей директории. От рута выполняем:

sudo semanage fcontext --add -t virt_image_t '/home/Lector/vm-images(/.*)?'

Проверим, что контекст создан (1я строка наша):

sudo semanage fcontext -l | grep virt_image_t
/home/Lector/vm-images(/.*)?                        all files          system_u:object_r:virt_image_t:s0 
/var/lib/imagefactory/images(/.*)?                 all files          system_u:object_r:virt_image_t:s0 
/var/lib/libvirt/images(/.*)?                      all files          system_u:object_r:virt_image_t:s0

Далее выполяем:

sudo restorecon -R -v /home/Lector/vm-images

Проверяем, что контекст был изменен:

sudo ls -aZ /home/Lector/vm-images
drwxrwxr-x. Lector Lector unconfined_u:object_r:virt_image_t:s0 .
drwx------. Lector Lector unconfined_u:object_r:user_home_dir_t:s0 ..

Перейдем к созданию виртуальной машины.
Но сначала обязательно проверьте кому принадлежат права на vm-images и при надобности, смените владельца (chown -R user:user some/dir/vm-images). Я создаю машины от имени своего пользователя. (Проверьте, что интерфейс br0 появился)

virt-install \
> --name=astra \
> --ram=1024 \
> --vcpus=1 \
> --network bridge:br0 \
> --disk path=~Lector/vm-images/vmastra.img,size=20 \
> --cdrom ~Lector/Downloads/orel_live_2015030601.iso \
> --os-variant=Linux

Здесь, в принципе, все ясно, но все же:

--name - имя новой машины
--ram - оператива
--vcpus - колическтво виртуальных процессоров
--network - сеть
--disk - место хранения жесткого диска для нашей машины, size - размер в Гб
--cdrom - указываем где лежит файл образа, с которого ставим
--os-variant - тип оси

Также примеры можно посмотреть в мануале, с которого была взята основа. Там же управление, клонирование и прочее. В переводе он не особо нуждается. Еще пример создания машины на сайте Red Hat.

Глава 10. Управление сервисами в systemd. 10.2 Управление системными сервисами

Предыдущие версии RHEL, которые поставлялись с системой инициализации SysV или Upstart, использовали скрипты инициализации, расположенные в директории/etc/rc.d/init.d/. Эти скрипты как правило были написаны на Bash и позволяли системному администратору контролировать состояние служб и демонов в системе. В Red Hat Enterprise Linux 7 эти скрипты были заменены сервисными юнитами.
Сервисные юниты имеют расширение .service (прим.пер. – в этом разделе мы будем говорить именно про эти сервисы)и делают то же, что делали init-скрипты. Чтобы просмотреть, запустить, остановить, перезапустить, включить или отключить системные службы, используйте команду systemctl, как описано в Таблице 10.3,”Сравнение утилиты service с systemd” и Таблице 10.4, “Сравнение утилиты chkconfig с systemctl”, а также далее в этом разделе. Команды service и chkconfig по прежнему доступны в системе и работают как ожидалось, но включены в системе только по соображениям совместимости и их следует избегать (прим.пер. – хотя бы потому, что юниты systemd все равно имеют больший приоритет).

Таблица 10.3. Сравнение утилиты service с systemd
service systemctl Описание
service name start systemctl start name.service Запуск сервиса
service name stop systemctl stop name.service Остановка сервиса
service name restart systemctl restart name.service Рестарт сервиса
service name condrestart systemctl try-restart name.service Рестарт сервиса только если он запущен
service name reload systemctl reload name.service Перезагрузка конфигурации
service name status systemctl status name.service
systemctl is-active name.service
Проверяет запущен ли сервис
service –status-all systemctl list-units –type service –all Отображает статус всех сервисов

Таблица 10.4, Сравнение утилиты chkconfig с systemctl
chkconfig systemctl Description
chkconfig name on systemctl enable name.service Включает сервис в автозагрузку
chkconfig name off systemctl disable name.service Удаляет сервис из автозагрузки
chkconfig –list name systemctl status name.service
systemctl is-enabled name.service
Проверяет активирован ли сервис
chkconfig –list systemctl list-unit-files –type service Выводит список всех сервисов и проверяет активированы ли они
chkconfig –list systemctl list-dependencies –after Просмотр списка сервисов, которые должны запускаться до указанного юнита
chkconfig –list systemctl list-dependencies –before Просмотр списка сервисов, которые должны запускаться после указанного юнита

Определение сервисных юнитов

Для ясности все примеры команд в этом разделе содержат полное имя юнита с расширением .service, например:

~]# systemctl stop nfs-server.service

При желании расширение файла может быть опущено, и в этом случае утилита systemctl предполагает, что аргумент является юнитом типа .service. Данная команда эквивалентна предыдущей команде:

~]# systemctl stop nfs-server

Кроме того, некоторые юниты имеют алиасы. Они могут быть короче, чем имя юнита и могут быть использованы вместо имени юнита. Чтобы найти все алиасы для определенного юнита, используйте команду:

~]# systemctl show nfs-server.service -p Names

Поведение systemctl в среде chroot

Если вы смените корневой каталог с помощью команды chroot, многие команды systemctl перестанут выполняться. Причина в том, что systemd и пользователь, который выполнил chroot имеют не одинаковое представление о файловой системе. Такое случается, например, при вызове systemctl из файла kickstart.
Исключением являются команды systemctl enable и systemctl disable. Этим командам не нужна запущенная система и они не влияют на запущенные процессы, но влияют на файлы юнитов. Поэтому вы можете запускать эти команды даже в chroot. Например, добавим в автозагрузку сервис httpd в каталоге /srv/website1/:

~]# chroot /srv/website1
~]# systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service, pointing to /usr/lib/systemd/system/httpd.service.

10.2.1. Списки сервисов

Чтобы просмотреть все загруженные юниты сервисов, введите следующую команду:

systemctl list-units --type service

Для каждого юнит-файла эта команда отображает полное имя (UNIT), за ним следует примечание, загружен ли файл юнита (LOAD), высокоуровневый (ACTIVE) и низкоуровневый (SUB) статус юнита, и краткое описание (DESCRIPTION). По умолчанию команда systemctl list-units отображает только активные юниты. Если вы хотите просмотреть все загруженные юниты независимо от их статуса, запустите эту команду с опцией –all или -a:

systemctl list-units --type service --all

Вы так же можете просмотреть все доступные юниты сервисов, чтобы проверить включены ли они в автозагрузку:

systemctl list-unit-files --type service

Для каждого сервисного юнита эта команда отображает полное имя (UNIT FILE) и информацию о том, активирован ли юнит (STATE). Информацию о том, как определить статус отдельных сервисов, см. в разделе 10.2.2 “Отображение статуса сервиса”.

Пример 10.1. Списки сервисов

Чтобы вывести все загруженные в данный момент сервисы, запустите следующую команду:

~]$ systemctl list-units --type service
UNIT                           LOAD   ACTIVE SUB     DESCRIPTION
abrt-ccpp.service              loaded active exited  Install ABRT coredump hook
abrt-oops.service              loaded active running ABRT kernel log watcher
abrt-vmcore.service            loaded active exited  Harvest vmcores for ABRT
abrt-xorg.service              loaded active running ABRT Xorg log watcher
abrtd.service                  loaded active running ABRT Automated Bug Reporting Tool
...
systemd-vconsole-setup.service loaded active exited  Setup Virtual Console
tog-pegasus.service            loaded active running OpenPegasus CIM Server
 
LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
 
46 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'

Список установленных сервисов, показывающий включены ли они в автозагрузку:

~]$ systemctl list-unit-files --type service
UNIT FILE                                   STATE
abrt-ccpp.service                           enabled
abrt-oops.service                           enabled
abrt-vmcore.service                         enabled
abrt-xorg.service                           enabled
abrtd.service                               enabled
...
wpa_supplicant.service                      disabled
ypbind.service                              disabled
 
208 unit files listed.

10.2.2. Отображение статуса сервиса

Чтобы отобразить подробную информацию о юните сервиса, соответствующему системному сервису, введите следующую команду:

systemctl status name.service

Замените name на имя юнита сервиса, который вы хотите проверить (например, gdm). Эта команда отобразит имя выбранного юнита, затем краткое описание, одно или несколько полей из описанных в Таблице 10.5, “Доступная информация о юнитах сервисов”. А если вы выполните команду под пользователем root, то также увидите последние записи из лога.

Таблица 10.5. Доступная информация о юнитах сервисов
Поле Описание
Loaded Информация о том, загружен ли юнит сервиса, абсолютный путь к файлу юнита, включен ли в автозагрузку
Active Информация о том, запущен ли юнит сервиса и отметка о времени
Main PID PID соответствующей системной службы и далее ее имя.
Status Дополнительная информация о соответствующем системном сервисе.
Process Дополнительная информация о связанных процессах.
CGroup Дополнительная информация о связанных контрольных группах (cgroups).

Чтобы убедиться, что конкретный юнит сервиса запущен, выполните команду:

systemctl is-active name.service

Аналогично, чтобы определить активирован ли определенный юнит сервиса, введите:

systemctl is-enabled name.service

Обратите внимание, что systemctl is-active и systemctl is-enabled возвращают статус 0 если данный юнит сервиса запущен или включен в автозагрузку. Информацию о том, как просмотреть все загруженные юниты сервисов см. в разделе 10.2.1. Списки сервисов.

Пример 10.2. Отображение статуса сервиса

Юнит сервиса для GNOME Display Manager называется gdm.service. Чтобы определить текущий статус этого сервиса, введите следующую команду:

~]# systemctl status gdm.service
gdm.service - GNOME Display Manager
   Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled)
   Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago
 Main PID: 1029 (gdm)
   CGroup: /system.slice/gdm.service
           ├─1029 /usr/sbin/gdm
           ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...
           └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...
 
Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.

Пример 10.3. Отображение сервисов, которые запускаются до старта выбранного сервиса

Чтобы узнать какие сервисы запускаются до выбранного сервиса, введите следующую команду:

~]# systemctl list-dependencies --after gdm.service
gdm.service
├─dbus.socket
├─getty@tty1.service
├─livesys.service
├─plymouth-quit.service
├─system.slice
├─systemd-journald.socket
├─systemd-user-sessions.service
└─basic.target
[output truncated]

Пример 10.4. Отображение сервисов, которые запускаются после старта выбранного сервиса

Чтобы узнать какие сервисы запускаются после выбранного сервиса, введите следующую команду:

~]# systemctl list-dependencies --before gdm.service
gdm.service
├─dracut-shutdown.service
├─graphical.target
│ ├─systemd-readahead-done.service
│ ├─systemd-readahead-done.timer
│ └─systemd-update-utmp-runlevel.service
└─shutdown.target
  ├─systemd-reboot.service
  └─final.target
    └─systemd-reboot.service

10.2.3. Запуск сервиса

Чтобы запустить юнит сервиса и соответствующий системный сервис, введите следующую команду:

systemctl start name.service

Замените name именем сервиса, который вы хотите запустить (например, gdm). Эта команда запустит выбранный сервис в текущей сессии. Как включить юнит в автозагрузку см. в Разделе 10.2.6, “Включение сервиса в автозагрузку”. Как определить статус юнита см. в Разделе 10.2.2, “Отображение статуса сервиса”.

Пример 10.5. Запуск сервиса

Юнит сервиса Apache HTTP Server имеет имя httpd.service. Чтобы запустить демон httpd в текущей сессии, выполните следующую команду от root:

~]# systemctl start httpd.service

10.2.4. Остановка сервиса

Чтобы остановить юнит сервиса и соответствующий системный сервис, введите следующую команду от root:

systemctl stop name.service

Замените name на имя сервиса, который вы хотите остановить (например, bluetooth). Эта команда останавливает выбранный юнит сервиса в текущей сессии. О том как отключить запуск юнита при старте системы см. в Разделе 10.2.7 “Удаление сервиса из автозагрузки”. Как определить статус юнита см. в Разделе 10.2.2 “Отображение статуса сервиса”.

Пример 10.6. Остановка сервиса
Сервисный юнит для демона bluetoothd имеет имя bluetooth.service. Чтобы оставновить демон bluetoothd в текущей сессии, введите следующую команду от root:

~]# systemctl stop bluetooth.service

10.2.5. Перезапуск сервиса

Чтобы перезапустить юнит и соответствующий ему сервис, введите следующую команду:

systemctl restart name.service

Замените name на имя сервиса, который вы хотите перезапустить (например, httpd). Эта команда остановит выбранный сервис и сразу запустит его снова. Если выбранный сервис не запущен, то эта команда запустит его. Чтобы systemd перезапустила сервис только в том случае, если он уже запущен, выполните следующую команду от root:

systemctl try-restart name.service

Некоторые сервисы позволяют перезагрузить конфигурацию без прерывания их выполнения. Для этого выполните от root:

systemctl reload name.service

Обратите внимание, что системные сервисы, которые не поддерживают эту функцию, полностью игнорируют эту команду. Для удобства команда systemctl также поддерживает команды reload-or-restart и reload-or-try-restart, которые перезапускают такие службы. Как определить статус юнита см. в Разделе 10.2.2 “Отображение статуса сервиса”.

Пример 10.7. Перезапуск сервиса

Чтобы пользователи не сталкивались с ненужными сообщениями об ошибках или частично отображаемыми веб-страницами, HTTP-сервер Apache позволяет редактировать и перезагружать конфигурацию без перезапуска сервера и прерывания активно обрабатываемых запросов. Для перезагрузки конфигурации введите от root следующую команду:

~]# systemctl reload httpd.service

10.2.6. Включение сервиса в автозагрузку

Чтобы юнит сервиса и соответствующий ему сервис автоматически стартовали при загрузке системы, введите от root следующую команду:

systemctl enable name.service

Замените name на имя сервиса, который вы хотите включить в автозагрузку (например, httpd). Эта команда считывает раздел [Install] выбранного юнита и создает соответствующие символические ссылки (далее – симлинки) на файл /usr/lib/systemd/system/name.service из директории /etc/systemd/system/ и его поддиректорий. Однако, эта команда не перезаписывает уже существующие симлинки. Если вы хотите заново создать симлинки, используйте следующую команду от root:

systemctl reenable name.service

Эта команда убирает юнит из автозагрузки и тут же добавляет его снова. Чтобы получить информацию о том, включен ли юнит в автозагрузку см. в Разделе 10.2.2, “Отображение статуса сервиса”. Как запустить сервис в текущей сессии см. в Разделе 10.2.3,”Запуск сервиса”.

Пример 10.8. Включение сервиса в автозагрузку

Чтобы включить Apache HTTP Server в автозагрузку, введите следующую команду от root:

~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

10.2.7. Удаление из автозагрузки

Чтобы предотвратить автоматический запуск сервиса при загрузке системы, введите следующую команду от root:

systemctl disable name.service

Замените name на имя сервиса, который вы хотите отключить (например, bluetooth). Эта команда считывает раздел [Install] выбранного юнита и удалаяет соответствующий симлинк на файл /usr/lib/systemd/system/name.service из директории /etc/systemd/system/ и ее поддиректорий. Также. вы можете замаскировать юнит для предотвращения его запуска вручную или другим сервисом. Для этого выполните от root следующую команду:

systemctl mask name.service

Эта команда заменит файл /etc/systemd/system/name.service симлинком на /dev/null, что сделает сервис фактически недоступным для systemd. Чтобы отменить это действие, выполните от root:

systemctl unmask name.service

Чтобы получить информацию о том, включен ли юнит в автозагрузку см. Раздел 10.2.2, “Отображение статуса сервиса”. Как остановить юнит в текущей сессии см. в Разделе 10.2.4, “Остановка сервиса”.

Пример 10.9. Удаление из автозагрузки

Пример 10.6, “Остановка сервиса” показывает как остановить сервис в текущей сессии. Чтобы предотвратить запуск сервиса во время загрузки, наберите следующую команду от root:

~]# systemctl disable bluetooth.service
Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
Removed symlink /etc/systemd/system/dbus-org.bluez.service.

10.2.8. Запуск конфликтующего сервиса

В systemd существуют положительные и отрицательные зависимости между сервисами. Для запуска сервиса может потребоваться запуск (положительная зависимость) или остановка (отрицательная зависимость) других сервисов.
Когда вы пытаетесь запустить сервис, systemd автоматически разрешает все зависимости. Обратите внимание, что это делается без явного уведомления пользователя. Если вы запустили сервис, а потом пытаетесь запустить сервис с отрицательной зависимостью, первый сервис будет автоматически остановлен.
Например, если вы запускаете сервис postfix, а потом пробуете запустить sendmail, systemd сначала остановит postfix, потому что эти сервисы конфликтуют и не могут работать на одном и том же порту одновременно.

Глава 10. Управление сервисами в systemd. 10.1. Вступление.

(Перевод документации по RHEL)
Systemd – это системный и сервисный менеджер для операционных систем Linux. Он сохраняет обратную совместимость со сценариями инициализации SysV и предоставляет ряд функций, таких как параллельный запуск системных служб во время загрузки, активация демонов по требованию или логика управления сервисами на основе зависимостей. В Red Hat Enterprise Linux 7 systemd заменяет Upstart как систему инициализации по умолчанию. Читать далее «Глава 10. Управление сервисами в systemd. 10.1. Вступление.»

Подсветка синтаксиса в Nano

Исходные данные: CentOS 7 и nano.

Подсветка синтаксиса в nano очень облегчает жизнь. В частности, скрипты на bash я пишу в нем. В CentOS по умолчанию подсветка не включена, но исправить это легко. Файлы с правилами для подсветки синтаксиса находятся в каталоге /usr/share/nano/. Команда ll /usr/share/nano/ (или ls -l /usr/share/nano/) покажет нам список доступных типов файлов для подсветки.
У нас несколько путей для включения подсветки синтаксиса: раскомментировать несколько строк в основном файле конфигурации /etc/nanorc, либо создать и отредактировать файл ~/.nanorc в своем профиле. Читать далее «Подсветка синтаксиса в Nano»

Клавиатура Apple и CentOS 7 Linux/Ubuntu

Исходные данные: свежая CentOS 7 minimal install, только что установленный GNOME и Apple Keyboard.

Ход клавиш очень тихий и мягкий, клавиши прекрасно очищаются влажной салфеткой, работа с ней одно удовольствие. Главное не забыть настроить под Linux. Мануал работает для систем под управлением systemd (RHEL7/Centos7 и выше, Ubuntu 15.10 и выше, Debian 8 и выше) . По умолчанию функциональные клавиши ряда F1-F12 не работают. Вернее, ведут себя как медийные. Т.е. кнопка F5 вместо того чтоб обновить страничку в браузере показывает мне какую-то ересь. Читать далее «Клавиатура Apple и CentOS 7 Linux/Ubuntu»