Я закончил тем, что сделал shibley. Вот подробный HOWTO:
Создайте новый слой
Поместите нужный слой, где ваши другие слои. Mine находятся в каталоге stuff
, рядом с каталогом сборки.
сделать следующие файлы/каталоги:
meta_mylayer
├── conf
│ └── layer.conf
└── recipes-core
└── mylayer-initscript
├── initscript.bb
└── files
├── initscript.service
└── initscript.sh
meta_mylayer
это имя вашего нового слоя.
Определим слой в conf/layer.conf
и сказать ему, где искать рецепты:
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "meta-mylayer"
BBFILE_PATTERN_meta-mylayer := "^${LAYERDIR}/"
BBFILE_PRIORITY_meta-mylayer = "99"
Рецепты определяются именем .bb файла. Этот слой имеет только один рецепт, названный initscript.
initscript.bb
содержит информацию о рецепте. Следующий рецепт добавит в нашу службу и поставить сценария инициализации фактический сценарий установки, initscript.sh
, в /usr/sbin/
SUMMARY = "Initial boot script"
DESCRIPTION = "Script to do any first boot init, started as a systemd service which removes itself once finished"
LICENSE = "CLOSED"
PR = "r3"
SRC_URI = " \
file://initscript.sh \
file://initscript.service \
"
do_compile() {
}
do_install() {
install -d ${D}/${sbindir}
install -m 0755 ${WORKDIR}/initscript.sh ${D}/${sbindir}
install -d ${D}${systemd_unitdir}/system/
install -m 0644 ${WORKDIR}/initscript.service ${D}${systemd_unitdir}/system
}
NATIVE_SYSTEMD_SUPPORT = "1"
SYSTEMD_PACKAGES = "${PN}"
SYSTEMD_SERVICE_${PN} = "initscript.service"
inherit allarch systemd
install -d
будет создавать каталоги, необходимые для указанного пути, в то время как install -m 0644
будет копировать указанный файл с 644 разрешений.${D}
это каталог назначения, по умолчанию это ${WORKDIR}/image
Создание Systemd определение сервиса
Я не буду вдаваться в подробности о том, как Systemd работает, но будет достаточно вставить определение сервиса:
[Unit]
Description=start initscript upon first boot
[Service]
Type=simple
ExecStart=/bin/sh -c 'sleep 5 ; /usr/sbin/initscript.sh'
Обратите внимание на место расположения сценария в /usr/sbin/
- здесь он будет скопирован по последней строке нашей функции do_install
выше.
Наконец, наш initscript.sh
сам скрипт:
#!/bin/sh
logger "starting initscript"
# do some work here. Mount rootfs as rw if needed.
logger "initscript work done"
#job done, remove it from systemd services
systemctl disable initscript.service
logger "initscript disabled"
Зарегистрируйте слой
Нам необходимо зарегистрировать наш новый слой, так что BitBake знает, что там. Редактировать build/conf/bblayers.conf
файл и добавьте следующую строку в переменную BASELAYERS
:
${TOPDIR}/../stuff/meta-mylayer \
Теперь, когда BitBake признает наш слой, нам нужно добавить наш рецепт к изображению. Редактировать build/conf/local.conf
и добавить рецепт initscript в переменную IMAGE_INSTALL_append
. Вот как это выглядит при добавлении рядом с python.
IMAGE_INSTALL_append = " python initscript"
Запуск сборки
Run сборки, как вы обычно делаете. Например:
bitbake angstrom-lxde-image
После установки сборки и загрузки в первый раз, ваш initscript.sh
будет выполнен.
это не работает для меня, файлы передаются, но служба не запускается при запуске. Я могу выполнить его вручную с помощью опции start. –
Попробуйте добавить его к автозапуску вручную (systemctl enable foo) и посмотреть, работает ли он и какие изменения. Достаточно иметь служебный файл, доступный в системе/etc/systemd /. – Igor