
В настоящее время я пытаюсь сократить время загрузки моего beaglebone green и запуска скрипта python. Мой простой скрипт python просто включает реле на cape.
Я использую время, необходимое для поворота реле, как время, необходимое для загрузки и выполнения чего-то полезного.
Раньше реле занимало 18 секунд, но мне удалось сократить это время до 14 секунд, повозившись с systemd.
Я создал простой файл модуля, который запустит мою программу на Python.
[Unit]
Description=Relaycheck run on startup
DefaultDependencies=no
After=systemd-system.slice
[Service]
WorkingDirectory=/home/
ExecStart=/home/relaycheck2.py
StandardOutput=null
[Install]
Alias=relaycheck2.service
А вот обрезанное изображение текущей диаграммы загрузки: Бутчарт
Насколько я понимаю, моя служба запускается довольно рано, и такие длительные службы, как сетевые, не влияют на мою службу ретрансляции. Это правильно?
Можно ли еще что-нибудь сделать, чтобы сократить время загрузки с помощью systemd?
решение1
Нужно ли вашей программе сохранять состояние (нужен ли вам записываемый диск?) Самое быстрое, что вы, вероятно, можете сделать, это вообще не использовать систему инициализации. Вместо этого рассмотрите возможность добавления этого к аргументам ядра (скорее всего, в вашей среде uBoot/config):
init=/path/to/your/program
Так что вместо запуска systemd
(менеджера процессов) ядро Linux запустит вашу программу как первый процесс. Теперь вы сказали, что это был скрипт Python. Я недуматьвы можете выполнить скрипт как init. Вам может понадобиться написать небольшую программу-оболочку на компилируемом языке, которая породит ваше приложение python.
Помните, что ваша программа оболочки/обертки также должна обрабатывать сигналы (init/systemd обрабатывает сигналы для программ, у которых нет обработчиков сигналов по умолчанию). Вы можете обойтись использованием чего-то вродетупой-initкоторый обычно используется для контейнеров Docker.
Если вам нужен записываемый том, вы можете также заставить свою программу-оболочку смонтировать для вас раздел (это не обязательно должен быть корневой раздел. Возможно, вы захотите смонтировать USB-накопитель для хранения).
Я бы сначала попробовал это сделать на настольной виртуальной машине, поскольку параметры ядра могут быть немного сложными во встроенных системах/uBoot.