Заводим ramlog на дистрибутивах с systemd

от автора

Из серии «заметки на полях». Больше, чтобы на забыть самому, но, может, кому и пригодится.

После закупки Raspberry Pi 2 на смену не прожившему и недели Odroid XU4 началось неспешное шаманство по установке и начальной настройке системы под себя. Каково же было разочарование, когда любимый ramlog отказался не только ставиться (руками распакуем, не ленивые), но и запускаться после принудительного «внедрения». Отчаявшись и запросив Гугла, выяснил, что с systemd оно не дружит, от слова «совсем».

Уже практически собиравшись городить что-то своё, наткнулся на один немецкий пост, где упоминался «адаптированный» ramlog. Потрошение немедленно скачанного образа показало, что там как раз и было сделано то, что мне и хотелось. Посему, вместо изобретения своего велосипеда, предлагаю воспользоваться уже готовым .

Как оно работает

И старая, и новая версии ramlog-а работают по одинаковому принципу: скачать /var/log в память при загрузке и записывать его на диск по команде или завершению работы.

Отличие новой версии в использовании механизма запуска systemd и хранении логов в архиве, что радикально упростило код ценой архивирования и не изменившихся файлов. Ну и вместо запуска собственного RAM диска, используется tmpfs, которая, в случае чего, уйдёт в своп (а он у нас на zram и велик шанс, что обращений к диску не будет)

Установка

  1. Создаём сервис ramlog-a (/usr/bin/ramlog):
    /usr/bin/ramlog

    #!/bin/sh . /lib/lsb/init-functions  start() {     log_begin_msg "RAMLOG: Read files from disk.."     tar xfz /var/ram_log.tar.gz -C /     log_end_msg 0 }  stop() {     log_begin_msg "RAMLOG: Write files to disk.."     tar cfz /var/ram_log.tar.gz --directory=/ var/log/     log_end_msg 0 }  case "$1" in     start)         start         ;;     stop)         stop         ;;     flush)         stop         ;;     *)          echo "Usage: $0 {start|stop|flush}"          exit 1 esac 

  2. Создаём запись для systemd (/etc/systemd/system/ramlog.service):
    Скрытый текст

    [Unit] Description=Ramlog After=local-fs.target Before=cron.service syslog.service  [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/ramlog start ExecStop=/usr/bin/ramlog stop  [Install] WantedBy=multi-user.target 

  3. Добавляем в CRON запись для периодического сохранения логов:
    # ... # каждые 15 минут, настроить по вкусу */15 * * * * /usr/bin/crontab flush >/dev/null 2>&1 

  4. Правим /etc/fstab, перенося /var/log на tmpfs:
    tmpfs /var/log tmpfs nodev,nosuid 0 0 

  5. Устанавливаем сервис:
    # insserv # systemctl enable ramlog.service 

  6. Запускаем сервис
    # systemctl start ramlog.service 

    Теперь, при ближайшей перезагрузке, содержимое /var/log будет сохранено в /var/var_log.tar.gz, а загружено уже в tmpfs

  7. …Profit!

Доделки-хотелки

Вполне можно переделать логику работы по аналогии с оригинальным ramlog – потребуется лишь вместо упаковки делать rsync для сохранения. Что «выгоднее» при работе с флешки – кто знает?

Витала идея о сжатом tmpfs, но как-то ничего пока не нагуглилось разумного.

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

ссылка на оригинал статьи http://habrahabr.ru/post/272279/