1

Примечание. Я не спрашиваю о запуске службы (или чего-либо еще) после завершения загрузки (я знаю, как это сделать).

Фон

Система загружается с SDCard, на которой установлена полная система. К нему подключен либо внешний USB-диск, либо SATA SSD, либо в некоторых случаях ничего. Я хочу "перенести" некоторые "вещи" на внешний носитель, в том числе, например, /var/log , если этот носитель доступен. Если он недоступен, следует использовать "внутреннюю" SD-карту. (И если вам интересно: да, это маленький одноплатный компьютер).

вопрос

Очевидно, что до запуска процесса Init обычная структура каталогов уже должна присутствовать. Монтирование файловых систем (из /etc/fstab) выполняется ядром до этого. Придерживаясь примера /var/log (который не единственный, с которым нужно иметь дело) и одного внешнего диска, смонтированного как /mnt/external когда он присутствует:

Как я могу поместить /var/log (например, через symlink) в /mnt/external если диск есть, но поместить его ниже, например, /mnt/local противном случае - безопасным и чистым способом?

2 ответа2

0

Правильное место для этого, кажется, одно из:

  • /etc/init.d/checkroot-bootclean.sh: запускается, когда корневой раздел (/) смонтирован, но до того, как станут доступны другие разделы. Вероятно, это наиболее подходящее место для описанного случая, так как цели символических ссылок из других файловых систем находятся на месте, а затем до того, как они смонтированы - и особенно, например, внешний /var/log будет там, когда система начнет писать журналы
  • /etc/init.d/mountall-bootclean.sh: запускается при монтировании всех локальных файловых систем. Именно здесь, например, /tmp будет очищен, но здесь я не уверен, что журналы уже должны быть доступны.

В идеале наш сценарий должен располагаться "между этими двумя". И в зависимости от системы могут быть и другие места.

В Debian (и производных, как в моем случае) есть /etc/init/mountall.conf котором настраивается монтирование:

# This helper mounts filesystems in the correct order as the devices
# and mountpoints become available.

Он вызывает mountall чтобы позаботиться о "правильном порядке", поэтому некоторые подробности можно найти в man mountall - но, к сожалению, ни в этом, ни в /usr/share/doc/mountall/* подробностей о том, как подключиться. Выдача find для mountall позволила мне найти еще несколько файлов, но ничто не дало мне дальнейших подсказок - поэтому, если я не узнаю что-то еще, два вышеуказанных местоположения будут "текущими крючками".


Прежде чем вы спросите: Нет, поместите "скрипт запуска" в /etc/rc.X (или эквивалент с тем, что используется вместо SYS-V) не подойдет - поскольку монтирование выполняется ядром до запуска процесса init, и эти монтирования должны быть там до того, как система начнет записывать, например, логи на диск.

0

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

Я согласен, что вы не запускаете службу, но сценарий, завернутый в эту службу, не должен продолжать работать. Все, что вам нужно от загрузки Linux - это запустить / вызвать ее в нужный момент, а затем выйти после того, как вы сделали правильную настройку.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .