Тарирование раздела только для чтения -

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

В следующем примере у меня есть три службы возрождения, s1, s2 и s3, и я управляю ими всеми как группой через целевой s.target.

Примечание:
Если вы настроите три службы как Requiresв s.target, то, если одна из них выйдет из строя и возродится, все участвующие процессы в этой группе будут перезапущены.
Или, если вы настроите их как Wantsв вашем s.target, тогда, если один из них выйдет из строя и возродится, перезапустится только этот отдельный процесс.




Для каждой службы создайте файл службы s1, s2, s3:

/etc/systemd/system/s1.service:

[Unit]
Description=my worker s1
After=network.target
Before=foobar.service
PartOf=s.target

[Service]
Type=simple
ExecStart=/usr/local/bin/s1.sh
Restart=always

(обратите внимание, :если ваши службы идентичны, вы можете создать один файл s1@.service вместо нескольких файлов. Посмотрите в руководстве экземпляры службы, используя @ и %i.)


Теперь создайте файл основной целевой группы (), для которого требуется s1,службы s2 и s3:

/etc/systemd/system/s.target:

[Unit]
Description=main s service
Requires=s1.service s2.service s3.service
# or
# Wants=s1.service s2.service s3.service

[Install]
WantedBy=multi-user.target

Готово.
Как обычно, вы должны запустить systemctl daemon-reload.

Теперь вы можете запускать свои службы с помощьюsystemctl start s.target
s1, s2 и s3 запускаются.

Вы можете остановить все три службы с помощьюsystemctl stop s.target
s1, s2 и s3 остановлены.

Естественно, вы можете запускать/останавливать/перезапускать/состоять отдельные службы как обычно:
systemctl status s1

Если вы убьете процесс s1, s2 или s3, он автоматически перезапустится (Restart=always ).
Если вы использовали Requires, то все процессы в группе будут перезапущены.

PS :Запустите systemctl enable s.target, если хотите запускать службы при загрузке.

PS :К сожалению, при использовании systemctl вы не можете использовать сокращенное слово "s" для "s.target", как вы можете сделать с "s1" вместо полного ввода "s1.service". Вы должны ввести «s.target», когда хотите управлять группой.

2
01.10.2020, 19:06
1 ответ

Нет, это невозможно. Раздел, смонтированный только для чтения -, доступен только для чтения -, то есть вы не можете записать на него свой файл tar.gz.

Тем не менее, у вас есть доступ к сети на этом устройстве? Я думаю, вы должны иметь возможность синхронизировать их с отдельным компьютером и генерировать там tar.

Если вам действительно нужно сгенерировать tar-архив на встроенном компьютере, и он подключен к сети, вы можете попробовать использовать netcat:https://nakkaya.com/2009/04/15/using-netcat-for-file-transfers/

В tar вы должны добавить к команде флаг «O» или «--to -stdout». Передайте вывод этого в netcat.

На принимающей стороне запустить:

nc -l -p 1234 > out.file

На встроенном конце запустите:

tar cvO /partition | nc -w 3 [receiving IP] 1234

Обратите внимание, что netcat не шифруется, поэтому это рекомендуется только для -неконфиденциальной информации или в вашей локальной сети.

Другой возможностью является подключение удаленного диска с использованием, например, NFS или sshfs.

На встроенном компьютере:

sshfs user@remote.computer:/remote/computer/directory /mnt/remote
tar cvf /mnt/remote/files.tar /folder/to/tar

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

2
18.03.2021, 23:01

Теги

Похожие вопросы