Приёмы работы c rsync

Синтаксис команды Rsync

Прежде чем перейти к использованию команды, давайте начнем с обзора основного синтаксиса.

В полезности выражение принимает следующий вид:

  • — Опции rsync .
  • — Исходный каталог.
  • — Каталог назначения.
  • — Удаленное имя пользователя.
  • — Удаленное имя хоста от IP-адреса.

предоставляет ряд опций, которые контролируют каждый аспект его поведения. Наиболее широко используемые варианты:

  • , Режим архива, что эквивалентно . Эта опция указывает на рекурсивную синхронизацию каталогов, передачу специальных и блочных устройств, сохранение символических ссылок, времени модификации, группы, владельца и разрешений.
  • , . Эта опция принудительно сжимает данные при их отправке на конечный компьютер. Используйте эту опцию, только если соединение с удаленным компьютером является медленным.
  • , эквивалентно . При использовании этой опции во время передачи будет отображаться индикатор выполнения и сохраняться частично переданные файлы. Это полезно при передаче больших файлов по медленным или нестабильным сетевым соединениям.
  • , При использовании этой опции удаляются посторонние файлы из места назначения. Это полезно для зеркалирования.
  • , . Используйте эту опцию, если вы хотите подавить сообщения, не связанные с ошибками.
  • , Эта опция позволяет вам выбрать другую удаленную оболочку. По умолчанию настроено использование ssh.

Клонирование файловой системы

rsync предоставляет способ создания копии всех данных в файловой системы с сохранением максимально возможного количества информации, включая метаданные файловой системы. Это процедура клонирования на уровне файловой системы, где файловые системы источника и назначения не обязаны совпадать. Она может использоваться для резервного копирования, смены файловой системы или восстановления данных.

Режим архива rsync неплохо подходит для этой цели, но он не создаёт резервную копию специальных метаданных файловой системы, таких как списки контроля доступа, расширенные атрибуты или свойства разреженных файлов. Для успешного копирования на уровне файловой системы, некоторые дополнительные опции должны быть включены:

rsync -qaHAXS ИСТОЧНИК НАЗНАЧЕНИЕ

Их значение (из справочной страницы):

--hard-links, -H      сохранять жёсткие ссылки
--acls, -A            сохранять списки контроля доступа (вызывает --perms)
--xattrs, -X          сохранять расширенные атрибуты
--sparse, -S          сжимать последовательности нулей в разреженные блоки

Кроме того, используйте , если другие файловые системы, которые желаете исключить из копии, примонтированы в дерево.

Полученная копия может быть легко прочитана заново и проверена (например после попытки восстановления файлов) на уровне файловой системы с помощью рекурсивной опции :

diff -r ИСТОЧНИК НАЗНАЧЕНИЕ

Возможно осуществить успешный переход на другую файловую систему, используя rsync как описано в этой статье и обновив fstab и загрузчик, как описано в Перенос установки на новое оборудование (англ.). Это в сущности позволяет поменять любую корневую файловую систему на любую другую.

Как исключить некоторые файлы или включить определенный тип файлов?

В rsync можно создавать достаточно гибкие исключения, например, делая резервную копию домашней директории на linux мы не ходим копировать разный кеш или содержимое корзины. Вот пример, в котором я исключаю две директории:

rsync -av --exclude={'user/.local/share/Trash','user/.cache'} /home/user :/home/user/bkp/

Конечно можно указать одну директорию:

rsync -av --exclude=.git /var/www/site :/home/user/bkp/

Еще мы можем исключить файлы с определенным расширением:

rsync -av --exclude="*.tmp" /var/www/site :/home/user/bkp/

Саму опцию мы можем использовать несколько раз:

rsync -av --exclude="*.tmp" --exclude="tmp/*" --exclude="*~" /var/www/site :/home/user/bkp/

Для копирования определенного типа файлов (да и не только) мы можем использовать опцию —include. Используется она точно так же, как и exclude. Вот пример, в котором я загружаю на сервер только все файлы с расширением .sql:

rsync -av --exclude="*.sql" ./projectname :/home/user/sqlbkp/

Исключения с помощью .rsync-filter

Для более гибкой настройки копирования (в случае регулярного копирования это будет очень полезно) все исключения/включения можно оформить в файле .rsync-filter (это появилось в более поздних версиях rsync).

Попробую объяснить подробно на примере, как и что мы можем исключать (спасибо этому блогу за хорошее описание).Допустим, у меня есть такой каталог (somedir), в котором я хочу исключить (красная стрелка) или оставить (зеленая стрелка) некоторые файлы/каталоги:

Ниже приведен один из примеров настройки исключений в файле .rsync-filter с комментариями:

cat .rsync-filter 
# исключаем только каталог .cache (не будут исключены каталоги work/lo*/.cache и dir2/.cache)                                                                        
- /.cache
# исключаем все каталоги Trash во всех папках
- /**/Trash/
# исключаем каталог Cache в каталогах .mysoft/soft*/
- /.mysoft/*/Cache
# исключаем файл pass.md
- pass.md
# исключаем все файлы с расширением .tmp
- *.tmp
# исключаем весь каталог example
- /example/
# Оставляем каталог Trash в каждом каталоге work/lo*/..
+ /work/**/Trash/

Для того, чтобы rsync заметил файл .rsync-filter, достаточно указать опцию -F:

rsync -avF ./somedir 10.10.20.15:/home/leo/

В итоге на сервер будут скопированы только эти файлы:

Кстати, если мы не хотим чтобы сам .rsync-filter не копировался, то -F нужно будет указать дважды

Примеры синхронизации Rsync

Дальше давайте рассмотрим использование rsync, примеры синхронизации.

1. Копирование и синхронизация файлов на локальном компьютере

Rsync позволяет синхронизировать файлы и папки в пределах одной машины. Давайте сначала рассмотрим использование rsync для синхронизации файла на локальном компьютере:

Указав опцию —progress вы можете видеть сколько процентов уже скопировано, а сколько еще осталось:

2. Синхронизация папок на локальной машине

Синхронизация папок rsync выполняется так же просто, как и файлов:

Если вы хотите, чтобы все атрибуты файлов, такие, как дата изменения и создания сохранялись, необходимо использовать опцию -a:

3. Синхронизация с удаленным сервером

Ненамного сложнее синхронизировать файлы с удаленным сервером. Скопируем локальную папку documents, на удаленный сервер:

По умолчанию rsync попытается использовать транспорт ssh. Если вы хотите использовать ранее созданный сервер rsync, нужно указать это явно:

Точно также можно синхронизировать файлы с rsync из удаленного сервера:

Адрес удаленного сервера записывается в таком формате:

имя_пользователя@адрес_машины/папка/на/удаленной_машине

Синхронизация папок rsync будет выполняться на стандартном порту.

4. Синхронизация файлов по SSH

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

Синхронизация файлов rsync с удаленного сервера по ssh будет выглядеть вот так:

Если вы используете другой порт для ssh, то здесь его можно указать:

А теперь передадим данные на тот же сервер:

6. Синхронизация не всех файлов в rsync

Опции include и exclude позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями.

Например, скопируем все файлы, начинающиеся на букву R:

7. Удаление при синхронизации

Во время синхронизации можно удалять файлы, которых нет на машине откуда идет rsync синхронизация, для этого используется опция —delete.

Например:

Если перед выполнением этой команды создать в папке файл которого нет на удаленном сервере, то он будет удален.

8. Максимальный размер файлов

Вы можете указать максимальный размер файлов, которые нужно синхронизировать. Для этого используется опция —max-size. Например, будем синхронизировать только файлы меньше 200 килобайт:

9. Удаление исходных файлов

Есть возможность удалять исходные файлы после завершения синхронизации с удаленным сервером:

Таким образом, файл backup.tar будет удален после завершения копирования в папку /tmp/backups.

10. Режим симуляции rsync

Если вы новичок, и еще не использовали rsync, то возможно захотите посмотреть как отработает команда без применения реальных действий в файловой системе. Для этого есть опция dry-run. Команда только выведет все выполняемые действия в терминал, без выполнения реальных изменений:

11. Ограничить скорость передачи

Вы можете ограничить использование пропускной способности сети с помощью опции —bwlimit:

Как я уже писал выше, rsync синхронизирует только части файла, если вы хотите синхронизировать файл целиком используйте опцию -W:

12. Автоматическая синхронизация папок rsync

Можно расписать автоматическую синхронизацию с помощью cron. Но в случае доступа к серверу по SSH необходимо будет создать ключ и загрузить его на сервер, чтобы аутентификация проходила без запроса пароля.

Создаем ключ:

Загружаем ключ на сервер к с которым собираемся синхронизироваться:

Теперь можем переходить к настройке расписания cron. Будем запускать синхронизацию каждый день:

rsync синхронизация каталогов будет выполняться каждый день в пять утра. Подробнее о настройке расписаний Cron можно почитать в отдельной статье.

Установка лицензии

Когда вы впервые запускаете панель управления Veeam Agent for Linux, Veeam Agent for Linux отображает окно уведомлений, предлагающее установить лицензию. Вы можете сразу установить лицензию или отложить эту операцию.

Примечание: если вы решите не устанавливать лицензию и использовать Veeam Agent для Linux в режиме свободной функциональности, окно уведомлений, предлагающее установить лицензию, будет появляться каждый раз, когда вы открываете панель управления, пока Veeam Agent for Linux не завершит первый сеанс задания резервного копирования.

Чтобы установить лицензию:

  1. Запустите панель управления Veeam Agent для Linux с помощью команды veeam или veeamconfig ui.
  2. На панели управления Veeam Agent for Linux нажмите клавишу «m», чтобы открыть меню «Разное».
  3. В меню убедитесь, что выбран вариант Управление лицензией и нажмите Enter.
  4. В окне Управление лицензией убедитесь, что выбрана кнопка Установить и нажмите Enter.
  5. В окне Выбор лицензии в разделе «Расположение файлов» укажите путь к лицензионному ключу:

    • выберите параметр Обзор с помощью клавиши Tab и нажмите Пробел или Enter.
    • в окне Выбрать файл лицензии выберите нужный каталог и нажмите Enter.
    • повторите шаг 5.2, пока в поле Текущая директория не появится путь к каталогу, в котором находится лицензионный ключ.
    • в каталоге, в котором находится лицензионный ключ, выберите лицензионный ключ и нажмите Enter.
  6. В редакторе выбора агента для использования в этом разделе компьютера выберите режим функциональности продукта, в котором будет работать агент Veeam для Linux, и нажмите Enter.
  7. Veeam Agent для Linux установит лицензию и отобразит окно с уведомлением о том, что лицензия успешно установлена.
  8. Нажмите Enter, чтобы завершить процесс установки лицензии.

Основное использование Rsync

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

Пользователь, выполняющий команду, должен иметь разрешения на чтение в месте назначения и права на запись в месте назначения.

Пропуск имени файла из места назначения копирует файл с текущим именем. Если вы хотите сохранить файл под другим именем, укажите новое имя в целевой части:

         Если каталог назначения не существует , создаст его.

Стоит отметить, что в исходных каталогах по-разному трактуется косая черта . Если вы добавите косую черту в исходный каталог, он скопирует только содержимое каталога в целевой каталог. Если косая черта не указана, будет скопирован исходный каталог в целевой каталог.

Опции Rsync

Теперь давайте кратко рассмотрим параметры rsync. Здесь перечислены не все опции. Для более подробной информации смотрите man rsync:

  • -v — Выводить подробную информацию о процессе копирования;
  • -q — Минимум информации;
  • -c — Проверка контрольных сумм для файлов;
  • -a — Режим архивирования, когда сохраняются все атрибуты оригинальных файлов;
  • -R — Относительные пути;
  • -b — Создание резервной копии;
  • -u — Не перезаписывать более новые файлы;
  • -l — Копировать символьные ссылки;
  • -L — Копировать содержимое ссылок;
  • -H — Копировать жесткие ссылки;
  • -p — Сохранять права для файлов;
  • -g — Сохранять группу;
  • -t — Сохранять время модификации;
  • -x — Работать только в этой файловой системе;
  • -e — Использовать другой транспорт, например, ssh;
  • -z — Сжимать файлы перед передачей;
  • —delete — Удалять файлы которых нет в источнике;
  • —exclude — Исключить файлы по шаблону;
  • —recursive — Перебирать директории рекурсивно;
  • —no-recursive — Отключить рекурсию;
  • —progress — Выводить прогресс передачи файла;
  • —stat — Показать статистику передачи;
  • —version — Версия утилиты.

Как альтернатива cp/mv

rsync может использоваться как продвинутая альтернатива команде или , особенно при копировании больших файлов.

$ rsync -P источник назначение

Опция эквивалентна , которая оставляет частично перемещённые файлы и показывает шкалу прогресса во время перемещения.

Используйте опцию / для рекурсивного обхода каталогов.

Файлы могут копироваться локально, как при помощи cp, но rsync интересна прежде всего возможностью удалённого копирования файлов, то есть между двумя разными хостами. Удалённые расположения могут быть указаны при помощи синтаксиса хост-двоеточие:

$ rsync источник хост:назначение

или

$ rsync хост:источник назначение

Передача файлов по сети по умолчанию использует протокол SSH и может быть как реальным именем хоста, так и предопределённым профилем/псевдонимом из .

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

function cpr() {
  rsync --archive -hh --partial --info=stats1,progress2 --modify-window=1 "$@"
} 
function mvr() {
  rsync --archive -hh --partial --info=stats1,progress2 --modify-window=1 --remove-source-files "$@"
}

Примечание: Использование термина контрольная сумма не соответствует поведению опции . Опция ответственна за использование эвристики пропуска файла перед передачей любого файла. Независимо от , контрольная сумма всегда используется для поблочного построения файла, при помощи которого rsync перемещает файл.

Предостережение о замыкающем слэше

По умолчанию Arch использует GNU cp (часть GNU ). Однако rsync следует соглашениям BSD cp, которые особо обрабатывают каталоги источника с замыкающим слэшем «/». Несмотря на то, что

$ rsync -r источник назначение

создаёт каталог «назначение/источник» с содержимым «источника», команда

$ rsync -r источник/ назначение

копирует все файлы из «источник/» напрямую в «назначение», без промежуточного каталога — так же, как при вызове

$ rsync -r источник/. назначение

Это поведение отличается от такового в GNU cp, которая одинаково обрабатывает «источник» и «источник/» (но не «источник/.»). Кроме того, некоторые оболочки автоматически добавляют замыкающий слэш при tab-дополнении имён каталогов. В виду этих обстоятельств, новые или нечастые пользователи rsync могут зачастую забывать про разное поведение rsync и случайно создавать беспорядок или даже перезаписывать важные файлы, оставляя замыкающий слэш в командной строке.

Поэтому имеет смысл использовать сценарий-обёртку, чтобы автоматически удалять замыкающий слэш перед вызовом rsync:

#!/bin/zsh
new_args=();
for i in "$@"; do
    case $i in /) i=/;; */) i=${i%/};; esac
    new_args+=$i;
done
exec rsync "${(@)new_args}"

Этот сценарий может быть размещён где-нибудь в и назначен псевдонимом для rsync в файле инициализации оболочки.

Базовое использование Rsync

Самый простой вариант использования — это копирование одного файла из одного в другое локальное расположение. Вот пример:

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

Если пропустить имя файла из места назначения, файл будет скопирован с текущим именем. Если вы хотите сохранить файл под другим именем, укажите новое имя в целевой части:

Настоящая мощь проявляется в синхронизации каталогов. В приведенном ниже примере показано, как создать локальную резервную копию файлов веб-сайта:

Если целевой каталог не существует, создаст его.

Стоит отметить, что разному обрабатывает исходные каталоги с помощью завершающей косой черты ( ). Если исходный каталог имеет косую черту в конце, команда скопирует только содержимое каталога в целевой каталог. Если косая черта в конце опущена, копирует исходный каталог в целевой каталог.

Возможные ошибки

В процессе настройки и эксплуатации системы, мы можем столкнуться с различными проблемами. Опишем решение некоторых из них.

1. Consider increasing /proc/sys/fs/inotify/max_user_watches

Данную ошибку мы можем увидеть в логе или статусе сервиса lsyncd. При этом, сама служба останавливается с ошибкой.

Причина: для оптимизации нагрузки, ядро Linux не позволяет сильно нагружать подсистему inotify. Но если мы указываем каталог синхронизации с большим количеством файлов, это приведет к тому, что мы упремся в установленный лимит.

Решение: необходимо увеличить предел наблюдения за ядром inotify. Для этого создаем файл настройки ядра:

vi /etc/sysctl.d/10-max_user_watches.conf

fs.inotify.max_user_watches = 524288

Применяем настройки:

sysctl -p /etc/sysctl.d/10-max_user_watches.conf

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

systemctl restart lsyncd

И проверяем его состояние:

systemctl status lsyncd

2. bash: rsync: command not found

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

… lsyncd: bash: rsync: command not found
… lsyncd: rsync: connection unexpectedly closed (0 bytes received so far)
… lsyncd: rsync error: error in rsync protocol data stream (code 12) at io.c(226)

Причина: на компьютере, с которым мы устанавливаем соединение по rsync не установлена одноименная утилита.

Решение: для установки необходимого пакета выполняем подходящую команду.

а) на CentOS:

yum install rsync

б) на Ubuntu:

apt-get install rsync

На компьютере с lsync перезапускаем сервис:

systemctl restart lsyncd

Настройка сервера Rsync

Как вы понимаете, нельзя просто так взять и закинуть на первую попавшуюся машину файлы без установки на нее специального программного обеспечения. На удаленной машине должен быть установлен и настроен RSYNC, SSH, Samba или FTP сервер, с помощью которого Rsync сможет авторизоваться на машине и передавать туда файлы.

Рассмотрим минимальную настройку сервера rsync, для того чтобы могло быть выполнено копирование файлов rsync. Он позволит нам не только синхронизировать файлы на машину, но и получать их от туда.

Сначала создайте конфигурационный файл со следующим содержимым:

Здесь мы задаем путь к нашей папке для синхронизации, разрешаем доступ к серверу только с ip адреса (192.168.56.1) и запрещаем все остальные подключения. Параметры uid и gid указывают пользователя и группу, от которых будет запущен демон. Лучше не использовать root, а указать пользователя nobody и выдать ему права на ту папку, в которую будет выполняться синхронизация каталогов rsync.

Настройка rsync завершена, остается сохранить файл, запустить сервер rsync и добавить его в автозагрузку:

Сервер будет предоставлять доступ к файлам без запроса пароля.

Настройка rsync

Теперь приступаем к настройке. Логика наших бэкапов будет следующая. При первом запуске мы делаем полный бэкап интересующей нас информации в папку current. Потом раз в сутки мы сверяем имеющийся архив с источником и делаем его вновь актуальным, перезаписывая все изменившиеся файлы, но при этом не удаляем их, а складываем в папку increment, где каждый день создается папка с именем в виде даты, в которую складываются все измененные файлы за текущий день. Таким образом, у нас всегда будет полный архив, актуальный на момент последней синхронизации, плюс набор папок за каждый день с изменившимися в этот день файлами. Сколько дней хранить, можно выбрать по необходимости.

Получается у нас такая картинка:

При этом подключение и работа rsync будет проходить по своему отдельному порту tcp 873. Не забудьте настроить iptables и открыть этот порт. Приступаем к реализации. В первую очередь настраиваем rsync на серверах источниках информации, с которых мы будем забирать данные для backup.

Создаем файл конфигурации rsync:

# mcedit /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
transfer logging = true
munge symlinks = yes

# папка источник для бэкапа

path = /data
uid = root
read only = yes
list = yes
comment = Data backup Dir
auth users = backup
secrets file = /etc/rsyncd.scrt

Создаем файл с учетными данными для подключения:

# mcedit /etc/rsyncd.scrt
backup:12345

где backup — имя пользователя, 12345 — пароль.
Делаем права на чтение только root, иначе rsync не запустится:

# chmod 0600 /etc/rsyncd.scrt

После настройки перезапускаем rsync. На Centos:

# systemctl restart rsyncd

На Debian/Ubuntu:

# systemctl restart rsync

Теперь идем на сервер приемник, в котором будут храниться архивные копии с серверов источников. Там создаем скрипт инкрементного бэкапа c использованием rsync:

# mcedit /root/bin/backup-server1.sh
#!/bin/bash
date
# Папка, куда будем складывать архивы
syst_dir=/backup/
# Имя сервера, который архивируем
srv_name=server1
# Адрес сервера, который архивируем
srv_ip=10.10.1.55
# Пользователь rsync на сервере, который архивируем
srv_user=backup
# Ресурс на сервере для бэкапа
srv_dir=data
echo "Start backup ${srv_name}"
# Создаем папку для инкрементных бэкапов
mkdir -p ${syst_dir}${srv_name}/increment/
# Запускаем непосредственно бэкап с параметрами
/usr/bin/rsync -avz --progress --delete --password-file=/etc/rsyncd.scrt ${srv_user}@${srv_ip}::${srv_dir} ${syst_dir}${srv_name}/current/ --backup --backup-dir=${syst_dir}${srv_name}/increment/`date +%Y-%m-%d`/
# Чистим папки с инкрементными архивами старше 30-ти дней
/usr/bin/find ${syst_dir}${srv_name}/increment/ -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
date
echo "Finish backup ${srv_name}"

Делаем скрипт исполняемым:

# chmod 0744 /root/bin/backup-server1.sh

Создаем файл с паролем для авторизации на сервере источнике:

# mcedit /etc/rsyncd.scrt
12345

Делаем права на чтение только root, иначе rsync выдаст ошибку:ERROR: password file must not be other-accessible
Исправляем это:

# chmod 0600 /etc/rsyncd.scrt

На этом все, теперь можно запускать скрипт и ожидать его выполнения. Если получите ошибку на клиенте:

rsync: opendir "/." (in data) failed: Permission denied (13)

и вот эту на сервере:

SELinux is preventing rsync from getattr access on the file

Проверьте настройки SELinux. Это он блокирует доступ к файлам. Нужно либо отключить selinux, либо настроить. В данном случае настройка простая:

# setsebool -P rsync_full_access on

Осталось добавить скрипт в cron:

# mcedit /etc/crontab
30 23 * * * root /root/bin/backup-server1.sh

Я обычно создаю несколько скриптов для каждого сервера отдельно. Потом объединяю их запуск в одном общем скрипте и уже его добавляю в cron. А потом по мере необходимости редактирую уже его, добавляю или удаляю сервера.

Машина времени

Те пользователи macOS и OS X, что делают бэкап, наверняка оценили работу Time Machine. Эта программа позволяет буквально в два клика вернуться к прошлой версии любого файла. Не смотря на все красивости, Time Machine не делает ничего такого чего мы не можем сделать с помощью .

Скрипт следует положить в корень того диска или каталога, куда следует делать бэкапы.

Запускать с указанием единственного аргумента: каталога с исходными файлами. Например, так.

После нескольких запусков получается такая структура каталога:

При этом указывает на самый последний бэкап.

В каждом из каталогов содержится слепок того, что было в исходном каталоге в момент копирования. Можно подумать что и место на диске занято пропорционально количеству копий, однако это не так.

Всё множество копий занимает лишь немного больше места чем исходный каталог. Место уходит на изменившиеся файлы.

Если ничего не менялось, то место всё равно расходуется на создание каталогов, которые нельзя хранить как жесткие ссылки.

Такая существенная экономия возможна благодаря упомянутым жестким ссылкам, которые делает для файлов, не изменившихся с последнего копирования.

У одинаковых, не менявшихся, файлов будет один и тот же inode.

Конечно, по возможной экономии места на диске такому способу резервного копирования далеко до специальных программам, таких как Borg или Restic.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: