LINUX.ORG.RU
ФорумAdmin

Tmpfs with save

 , ,


1

1

Всем добрый день.

Моя задача - создать tmpfs, ramdisk, с сохранением данных между перезагрузками. Пытаюсь реализовать это через systemd mount unit.

Написал unit.mount, где обычная точка монтирования tmpfs. Хочу теперь добавить, чтобы сразу после монтирования, всё из папки backup синхронизировалось через rsync в tmpfs. И аналогично, перед отмонтированием все из tmpfs синхронизировалось обратно в backup.

К сожалению, в mount unit нет ExecStartPost и ExecStopPre, которые бы идеально решили эту задачу, это работает только для «.service».

Что в этом случае делать?

Напиши helper script по типу /usr/bin/mount.myfs и /usr/bin/umount.myfs, внутри него монтируй tmpfs и производи все нужные действия. А в fstab пропиши myfs в качестве типа. Топорно, но должно работать.

P. S.: рекомендую монтирование производить во временный каталог, а потом mount --move в точку назначения, чтобы mount-юнит не перешёл в состояние готовности раньше времени, и обратно.

intelfx ★★★★★
()
Ответ на: комментарий от master_0K

Если делать не «.mount», а «.service». Тогда можно все реализовать, вбить в нем в нужных полях 4 команды (для подключения, отключения и 2 для синхронизации).

Это работать будет, просто не самое красивое решение. Какой тогда тип должен быть у этого .service? И какой будет у него статус, если смотреть через systemctl status? Он никак не будет отображать реальное состояние точки монтирования, и просто будет указан как «выключенный».

Это будет хоть и работающий, но все же немного костылик, когда в systemd есть нормальные точки монтирования, но нет таких элементарных действий

Johnny1957
() автор топика
Ответ на: комментарий от Johnny1957

в systemd есть нормальные точки монтирования, но нет таких элементарных действий

Они нужны типичным mount unit? У тебя ФС, которая требует нестандартного* обращения: её требуется создать перед монтированием, наполнить после монтирования и бекапить перед монтированием. Думаю «безшовно» это не выйдет сделать.

master_0K
()
Ответ на: комментарий от master_0K

Можно сделать 2 юнита. Один - точка монтирования (пусть будет A), другой - сервис, который будет осуществлять синхронизацию (пусть будет Б). Делаем Б зависимым от A.

При включении служб, сначала запустится A, появится точка монтирования, затем запускается Б, и точка монтирования наполняется содержимым.

Вопрос состоит в следующем: Если мы остановим A, то кто перым будет остановлен: А или Б?

Johnny1957
() автор топика
Ответ на: комментарий от Johnny1957

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

Johnny1957
() автор топика
Ответ на: комментарий от Johnny1957

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

Johnny1957
() автор топика

Может удастся почерпнуть что-то полезное в скриптах Profile-sync-daemon и Anything-sync-daemon.
(‘Потроха’ утилит выложены на гитхабе.)

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

Полная утилита zram-config для подкачки, каталогов и журналов для уменьшения износа блоков SD, NAND и eMMC.

krasnh ★★★★
()

Решил все же сделать всё через один service. На будущее, если кому-то пригодится

[Unit]
Description=Mount and sync tmpfs

[Service]
Type=oneshot
ExecStart=/usr/bin/mount -t tmpfs -o size=128M tmpfs /home/user/tmpfs
ExecStart=/usr/bin/rsync -ra /home/user/backup/ /home/user/tmpfs/
ExecStop=/usr/bin/rsync -ra --delete /home/user/tmpfs/ /home/user/backup
ExecStop=/usr/bin/umount /home/user/tmpfs
RemainAfterExit=yes

[Install]
WantedBy=multiuser.target

Type=oneshot обеспечит последовательность выполнения команд, каждая следующая будет ждать завершения предыдущей. С помощью RemainAfterExit юнит будет считаться активным между start и stop, даже если никакого активного процесса за ним нет

Johnny1957
() автор топика