--- .../data/etc/rc.d/init.d/bootchain | 33 ++++++++++--------- .../data/lib/bootchain-prepare.d/300-waitdev | 12 +++++++ 2 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev diff --git a/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain b/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain index 89d9de5..7bdb1cf 100755 --- a/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain +++ b/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain @@ -1,6 +1,6 @@ #!/bin/bash ### BEGIN INIT INFO -# Provides: pipeline +# Provides: bootchain # Required-Start: uevent udev # Should-Start: # Required-Stop: @@ -13,27 +13,28 @@ . /.initrd/initenv . /etc/init.d/template -NAME=pipelined +NAME=bootchained PIDFILE="/var/run/$NAME.pid" ARGS="--lockfile $LOCKFILE --pidfile $PIDFILE --name $NAME --displayname $NAME" -prepare() { - local dir i n - - dir=/.initrd/pipeline/waitdev - mkdir -p -- "$dir" - - i=0 - while [ "$i" -lt "${WAITDEV:-0}" ]; do - touch "$dir/$i" - i=$(($i + 1)) - done +use_hooks() +{ + local hook hdir="$1" + + if [ -d "$hdir" ]; then + # shellcheck disable=SC2012 + for hook in $(ls -1 -- "$hdir"/* |sort) _; do + [ -s "$hook" ] || + continue + . "$hook" + done + fi } start() { RETVAL=0 - if [ "${ROOT-}" = pipeline ]; then - prepare + if [ "${ROOT-}" = bootchain ] || [ "${ROOT-}" = pipeline ]; then + use_hooks /lib/bootchain-prepare.d start_daemon --background $ARGS "$NAME" RETVAL=$? fi @@ -43,7 +44,7 @@ start() { stop() { stop_daemon $ARGS "$NAME" RETVAL=$? - [ ! -f "$PIDFILE" ] || rm -f -- "$PIDFILE" + rm -f -- "$PIDFILE" return $RETVAL } diff --git a/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev new file mode 100644 index 0000000..f7315a3 --- /dev/null +++ b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev @@ -0,0 +1,12 @@ +#!/bin/bash -efu + +dir=/.initrd/bootchain/waitdev +mkdir -p -- "$dir" + +[ -z "${WAITDEV_TIMEOUT-}" ] || + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir/TIMECNT" +i=0 +while [ "$i" -lt "${WAITDEV:-0}" ]; do + touch "$dir/$i" + i=$((1 + $i)) +done -- 2.21.0
On Fri, Sep 24, 2021 at 06:57:45PM +0300, Leonid Krivoshein wrote:
Что это за хуки и зачем они нужны ?
> ---
> .../data/etc/rc.d/init.d/bootchain | 33 ++++++++++---------
> .../data/lib/bootchain-prepare.d/300-waitdev | 12 +++++++
> 2 files changed, 29 insertions(+), 16 deletions(-)
> create mode 100644 make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev
>
> diff --git
> a/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain
> b/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain
> index 89d9de5..7bdb1cf 100755
> --- a/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain
> +++ b/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain
> @@ -1,6 +1,6 @@
> #!/bin/bash
> ### BEGIN INIT INFO
> -# Provides: pipeline
> +# Provides: bootchain
> # Required-Start: uevent udev
> # Should-Start:
> # Required-Stop:
> @@ -13,27 +13,28 @@
> . /.initrd/initenv
> . /etc/init.d/template
> -NAME=pipelined
> +NAME=bootchained
> PIDFILE="/var/run/$NAME.pid"
> ARGS="--lockfile $LOCKFILE --pidfile $PIDFILE --name $NAME --displayname
> $NAME"
> -prepare() {
> - local dir i n
> -
> - dir=/.initrd/pipeline/waitdev
> - mkdir -p -- "$dir"
> -
> - i=0
> - while [ "$i" -lt "${WAITDEV:-0}" ]; do
> - touch "$dir/$i"
> - i=$(($i + 1))
> - done
> +use_hooks()
> +{
> + local hook hdir="$1"
> +
> + if [ -d "$hdir" ]; then
> + # shellcheck disable=SC2012
> + for hook in $(ls -1 -- "$hdir"/* |sort) _; do
> + [ -s "$hook" ] ||
> + continue
> + . "$hook"
> + done
> + fi
> }
> start() {
> RETVAL=0
> - if [ "${ROOT-}" = pipeline ]; then
> - prepare
> + if [ "${ROOT-}" = bootchain ] || [ "${ROOT-}" = pipeline ]; then
> + use_hooks /lib/bootchain-prepare.d
> start_daemon --background $ARGS "$NAME"
> RETVAL=$?
> fi
> @@ -43,7 +44,7 @@ start() {
> stop() {
> stop_daemon $ARGS "$NAME"
> RETVAL=$?
> - [ ! -f "$PIDFILE" ] || rm -f -- "$PIDFILE"
> + rm -f -- "$PIDFILE"
> return $RETVAL
> }
> diff --git a/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev
> new file mode 100644
> index 0000000..f7315a3
> --- /dev/null
> +++ b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev
> @@ -0,0 +1,12 @@
> +#!/bin/bash -efu
> +
> +dir=/.initrd/bootchain/waitdev
> +mkdir -p -- "$dir"
> +
> +[ -z "${WAITDEV_TIMEOUT-}" ] ||
> + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir/TIMECNT"
> +i=0
> +while [ "$i" -lt "${WAITDEV:-0}" ]; do
> + touch "$dir/$i"
> + i=$((1 + $i))
> +done
> --
> 2.21.0
>
>
> _______________________________________________
> Make-initrd mailing list
> Make-initrd@lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/make-initrd
>
--
Rgrds, legion
26.09.2021 17:09, Alexey Gladkov пишет: > On Fri, Sep 24, 2021 at 06:57:45PM +0300, Leonid Krivoshein wrote: > > Что это за хуки и зачем они нужны ? Отлично, уже дошли до первого принципиального и важного изменения! Полагаю, тут больше камень в огород отсутствия описаний, это я поправлю. Стартовый скрипт SysVinit ранее включал prepare() для предварительной подготовки каталогов для компонента waitdev, отделённого теперь в другую фичу. Другим компонентам bootchain при расширении (а теперь это уже более десятка фич и подпакетов) тоже может потребоваться подобная инициализация. Здесь в одном коммите видно, куда переехал код функции prepare(). Хуки нужны для того, чтобы вызывать подобную инициализацию из определённого места, так как базовый пакет bootchain-core может не знать, с какими компонентами bootchain собран initramfs. Соответственно, включаемые скрипты кладутся в /lib/bootchain-prepare.d. Если потребуется, по аналогии можно добавить в stop() хуки для деинициализации. >> --- >> .../data/etc/rc.d/init.d/bootchain | 33 ++++++++++--------- >> .../data/lib/bootchain-prepare.d/300-waitdev | 12 +++++++ >> 2 files changed, 29 insertions(+), 16 deletions(-) >> create mode 100644 make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev >> >> diff --git >> a/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain >> b/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain >> index 89d9de5..7bdb1cf 100755 >> --- a/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain >> +++ b/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain >> @@ -1,6 +1,6 @@ >> #!/bin/bash >> ### BEGIN INIT INFO >> -# Provides: pipeline >> +# Provides: bootchain >> # Required-Start: uevent udev >> # Should-Start: >> # Required-Stop: >> @@ -13,27 +13,28 @@ >> . /.initrd/initenv >> . /etc/init.d/template >> -NAME=pipelined >> +NAME=bootchained >> PIDFILE="/var/run/$NAME.pid" >> ARGS="--lockfile $LOCKFILE --pidfile $PIDFILE --name $NAME --displayname >> $NAME" >> -prepare() { >> - local dir i n >> - >> - dir=/.initrd/pipeline/waitdev >> - mkdir -p -- "$dir" >> - >> - i=0 >> - while [ "$i" -lt "${WAITDEV:-0}" ]; do >> - touch "$dir/$i" >> - i=$(($i + 1)) >> - done >> +use_hooks() >> +{ >> + local hook hdir="$1" >> + >> + if [ -d "$hdir" ]; then >> + # shellcheck disable=SC2012 >> + for hook in $(ls -1 -- "$hdir"/* |sort) _; do >> + [ -s "$hook" ] || >> + continue >> + . "$hook" >> + done >> + fi >> } >> start() { >> RETVAL=0 >> - if [ "${ROOT-}" = pipeline ]; then >> - prepare >> + if [ "${ROOT-}" = bootchain ] || [ "${ROOT-}" = pipeline ]; then >> + use_hooks /lib/bootchain-prepare.d >> start_daemon --background $ARGS "$NAME" >> RETVAL=$? >> fi >> @@ -43,7 +44,7 @@ start() { >> stop() { >> stop_daemon $ARGS "$NAME" >> RETVAL=$? >> - [ ! -f "$PIDFILE" ] || rm -f -- "$PIDFILE" >> + rm -f -- "$PIDFILE" >> return $RETVAL >> } >> diff --git a/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev >> new file mode 100644 >> index 0000000..f7315a3 >> --- /dev/null >> +++ b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev >> @@ -0,0 +1,12 @@ >> +#!/bin/bash -efu >> + >> +dir=/.initrd/bootchain/waitdev >> +mkdir -p -- "$dir" >> + >> +[ -z "${WAITDEV_TIMEOUT-}" ] || >> + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir/TIMECNT" >> +i=0 >> +while [ "$i" -lt "${WAITDEV:-0}" ]; do >> + touch "$dir/$i" >> + i=$((1 + $i)) >> +done >> -- >> 2.21.0 >> >> >> _______________________________________________ >> Make-initrd mailing list >> Make-initrd@lists.altlinux.org >> https://lists.altlinux.org/mailman/listinfo/make-initrd >> -- Best regards, Leonid Krivoshein.
On Sun, Sep 26, 2021 at 10:53:08PM +0300, Leonid Krivoshein wrote: > > 26.09.2021 17:09, Alexey Gladkov пишет: > > On Fri, Sep 24, 2021 at 06:57:45PM +0300, Leonid Krivoshein wrote: > > > > Что это за хуки и зачем они нужны ? > > Отлично, уже дошли до первого принципиального и важного изменения! > Полагаю, тут больше камень в огород отсутствия описаний, это я поправлю. > > Стартовый скрипт SysVinit ранее включал prepare() для предварительной > подготовки каталогов для компонента waitdev, отделённого теперь в другую > фичу. Когда ты говоришь про prepare, ты про выполнение скриптов перед сервисом (udev, ueventd, etc.) ? > Другим компонентам bootchain при расширении (а теперь это уже более > десятка фич и подпакетов) тоже может потребоваться подобная инициализация. > Здесь в одном коммите видно, куда переехал код функции prepare(). Хуки нужны > для того, чтобы вызывать подобную инициализацию из определённого места, так > как базовый пакет bootchain-core может не знать, с какими компонентами > bootchain собран initramfs. Соответственно, включаемые скрипты кладутся в > /lib/bootchain-prepare.d. Если потребуется, по аналогии можно добавить в > stop() хуки для деинициализации. https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L32-L38 https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L61 https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L109 https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L114 Ты имеешь в виду вот такие хуки ? > > > --- > > > .../data/etc/rc.d/init.d/bootchain | 33 ++++++++++--------- > > > .../data/lib/bootchain-prepare.d/300-waitdev | 12 +++++++ > > > 2 files changed, 29 insertions(+), 16 deletions(-) > > > create mode 100644 make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev > > > > > > diff --git > > > a/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain > > > b/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain > > > index 89d9de5..7bdb1cf 100755 > > > --- a/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain > > > +++ b/make-initrd/features/bootchain-core/data/etc/rc.d/init.d/bootchain > > > @@ -1,6 +1,6 @@ > > > #!/bin/bash > > > ### BEGIN INIT INFO > > > -# Provides: pipeline > > > +# Provides: bootchain > > > # Required-Start: uevent udev > > > # Should-Start: > > > # Required-Stop: > > > @@ -13,27 +13,28 @@ > > > . /.initrd/initenv > > > . /etc/init.d/template > > > -NAME=pipelined > > > +NAME=bootchained > > > PIDFILE="/var/run/$NAME.pid" > > > ARGS="--lockfile $LOCKFILE --pidfile $PIDFILE --name $NAME --displayname > > > $NAME" > > > -prepare() { > > > - local dir i n > > > - > > > - dir=/.initrd/pipeline/waitdev > > > - mkdir -p -- "$dir" > > > - > > > - i=0 > > > - while [ "$i" -lt "${WAITDEV:-0}" ]; do > > > - touch "$dir/$i" > > > - i=$(($i + 1)) > > > - done > > > +use_hooks() > > > +{ > > > + local hook hdir="$1" > > > + > > > + if [ -d "$hdir" ]; then > > > + # shellcheck disable=SC2012 > > > + for hook in $(ls -1 -- "$hdir"/* |sort) _; do > > > + [ -s "$hook" ] || > > > + continue > > > + . "$hook" > > > + done > > > + fi > > > } > > > start() { > > > RETVAL=0 > > > - if [ "${ROOT-}" = pipeline ]; then > > > - prepare > > > + if [ "${ROOT-}" = bootchain ] || [ "${ROOT-}" = pipeline ]; then > > > + use_hooks /lib/bootchain-prepare.d > > > start_daemon --background $ARGS "$NAME" > > > RETVAL=$? > > > fi > > > @@ -43,7 +44,7 @@ start() { > > > stop() { > > > stop_daemon $ARGS "$NAME" > > > RETVAL=$? > > > - [ ! -f "$PIDFILE" ] || rm -f -- "$PIDFILE" > > > + rm -f -- "$PIDFILE" > > > return $RETVAL > > > } > > > diff --git a/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev > > > new file mode 100644 > > > index 0000000..f7315a3 > > > --- /dev/null > > > +++ b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev > > > @@ -0,0 +1,12 @@ > > > +#!/bin/bash -efu > > > + > > > +dir=/.initrd/bootchain/waitdev > > > +mkdir -p -- "$dir" > > > + > > > +[ -z "${WAITDEV_TIMEOUT-}" ] || > > > + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir/TIMECNT" > > > +i=0 > > > +while [ "$i" -lt "${WAITDEV:-0}" ]; do > > > + touch "$dir/$i" > > > + i=$((1 + $i)) > > > +done > > > -- > > > 2.21.0 > > > > > > > > > _______________________________________________ > > > Make-initrd mailing list > > > Make-initrd@lists.altlinux.org > > > https://lists.altlinux.org/mailman/listinfo/make-initrd > > > > > -- > Best regards, > Leonid Krivoshein. > > _______________________________________________ > Make-initrd mailing list > Make-initrd@lists.altlinux.org > https://lists.altlinux.org/mailman/listinfo/make-initrd -- Rgrds, legion
27.09.2021 12:09, Alexey Gladkov пишет: > On Sun, Sep 26, 2021 at 10:53:08PM +0300, Leonid Krivoshein wrote: >> 26.09.2021 17:09, Alexey Gladkov пишет: >>> On Fri, Sep 24, 2021 at 06:57:45PM +0300, Leonid Krivoshein wrote: >>> >>> Что это за хуки и зачем они нужны ? >> Отлично, уже дошли до первого принципиального и важного изменения! >> Полагаю, тут больше камень в огород отсутствия описаний, это я поправлю. >> >> Стартовый скрипт SysVinit ранее включал prepare() для предварительной >> подготовки каталогов для компонента waitdev, отделённого теперь в другую >> фичу. > Когда ты говоришь про prepare, ты про выполнение скриптов перед сервисом > (udev, ueventd, etc.) ? Речь о коде, перенесённом из одного места в другой. Как раз я не думаю, что тут можно как-то влиять на запуск до udev, ueventd. Но если мы вынесли из bootchain-core код, который до запуска демона должен что-то предварительно подготовить, нужен же механизм, который позволит его дёрнуть, для этого и нужны хуки. Другое дело, что по факту сейчас пока такой хук оказался лишь один. Но мне конструкция всё равно нравится больше, она делает стартовый скрипт более модульным, не зависящим от других фич bootchain-*. >> Другим компонентам bootchain при расширении (а теперь это уже более >> десятка фич и подпакетов) тоже может потребоваться подобная инициализация. >> Здесь в одном коммите видно, куда переехал код функции prepare(). Хуки нужны >> для того, чтобы вызывать подобную инициализацию из определённого места, так >> как базовый пакет bootchain-core может не знать, с какими компонентами >> bootchain собран initramfs. Соответственно, включаемые скрипты кладутся в >> /lib/bootchain-prepare.d. Если потребуется, по аналогии можно добавить в >> stop() хуки для деинициализации. > https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L32-L38 > https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L61 > https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L109 > https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L114 > > Ты имеешь в виду вот такие хуки ? Ну очень похожие, хотя use_hooks() явно проще -- без блокировки консоли, без бита выполнения, просто соурсим исходники: >>>> +use_hooks() >>>> +{ >>>> + local hook hdir="$1" >>>> + >>>> + if [ -d "$hdir" ]; then >>>> + # shellcheck disable=SC2012 >>>> + for hook in $(ls -1 -- "$hdir"/* |sort) _; do >>>> + [ -s "$hook" ] || >>>> + continue >>>> + . "$hook" >>>> + done >>>> + fi >>>> } и: >>>> --- /dev/null >>>> +++ b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev >>>> @@ -0,0 +1,12 @@ >>>> +#!/bin/bash -efu >>>> + >>>> +dir=/.initrd/bootchain/waitdev >>>> +mkdir -p -- "$dir" >>>> + >>>> +[ -z "${WAITDEV_TIMEOUT-}" ] || >>>> + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir/TIMECNT" >>>> +i=0 >>>> +while [ "$i" -lt "${WAITDEV:-0}" ]; do >>>> + touch "$dir/$i" >>>> + i=$((1 + $i)) >>>> +done -- Best regards, Leonid Krivoshein.
On Mon, Sep 27, 2021 at 04:11:43PM +0300, Leonid Krivoshein wrote: > > 27.09.2021 12:09, Alexey Gladkov пишет: > > On Sun, Sep 26, 2021 at 10:53:08PM +0300, Leonid Krivoshein wrote: > > > 26.09.2021 17:09, Alexey Gladkov пишет: > > > > On Fri, Sep 24, 2021 at 06:57:45PM +0300, Leonid Krivoshein wrote: > > > > > > > > Что это за хуки и зачем они нужны ? > > > Отлично, уже дошли до первого принципиального и важного изменения! > > > Полагаю, тут больше камень в огород отсутствия описаний, это я поправлю. > > > > > > Стартовый скрипт SysVinit ранее включал prepare() для предварительной > > > подготовки каталогов для компонента waitdev, отделённого теперь в другую > > > фичу. > > Когда ты говоришь про prepare, ты про выполнение скриптов перед сервисом > > (udev, ueventd, etc.) ? > > Речь о коде, перенесённом из одного места в другой. Как раз я не думаю, что > тут можно как-то влиять на запуск до udev, ueventd. Но если мы вынесли из > bootchain-core код, который до запуска демона должен что-то предварительно > подготовить, нужен же механизм, который позволит его дёрнуть, для этого и > нужны хуки. Другое дело, что по факту сейчас пока такой хук оказался лишь > один. Но мне конструкция всё равно нравится больше, она делает стартовый > скрипт более модульным, не зависящим от других фич bootchain-*. > > > > > Другим компонентам bootchain при расширении (а теперь это уже более > > > десятка фич и подпакетов) тоже может потребоваться подобная инициализация. > > > Здесь в одном коммите видно, куда переехал код функции prepare(). Хуки нужны > > > для того, чтобы вызывать подобную инициализацию из определённого места, так > > > как базовый пакет bootchain-core может не знать, с какими компонентами > > > bootchain собран initramfs. Соответственно, включаемые скрипты кладутся в > > > /lib/bootchain-prepare.d. Если потребуется, по аналогии можно добавить в > > > stop() хуки для деинициализации. > > https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L32-L38 > > https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L61 > > https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L109 > > https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L114 > > > > Ты имеешь в виду вот такие хуки ? > > Ну очень похожие, хотя use_hooks() явно проще -- без блокировки консоли, без > бита выполнения, просто соурсим исходники: Эти хуки уже давно есть и можно использовать. Не нужно дублировать этот же функционал. > > > > > +use_hooks() > > > > > +{ > > > > > + local hook hdir="$1" > > > > > + > > > > > + if [ -d "$hdir" ]; then > > > > > + # shellcheck disable=SC2012 > > > > > + for hook in $(ls -1 -- "$hdir"/* |sort) _; do > > > > > + [ -s "$hook" ] || > > > > > + continue > > > > > + . "$hook" > > > > > + done > > > > > + fi > > > > > } > и: > > > > > --- /dev/null > > > > > +++ b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev > > > > > @@ -0,0 +1,12 @@ > > > > > +#!/bin/bash -efu > > > > > + > > > > > +dir=/.initrd/bootchain/waitdev > > > > > +mkdir -p -- "$dir" > > > > > + > > > > > +[ -z "${WAITDEV_TIMEOUT-}" ] || > > > > > + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir/TIMECNT" > > > > > +i=0 > > > > > +while [ "$i" -lt "${WAITDEV:-0}" ]; do > > > > > + touch "$dir/$i" > > > > > + i=$((1 + $i)) > > > > > +done > > > -- > Best regards, > Leonid Krivoshein. > > _______________________________________________ > Make-initrd mailing list > Make-initrd@lists.altlinux.org > https://lists.altlinux.org/mailman/listinfo/make-initrd -- Rgrds, legion
27.09.2021 16:57, Alexey Gladkov пишет: > On Mon, Sep 27, 2021 at 04:11:43PM +0300, Leonid Krivoshein wrote: >> [...] >>>> Другим компонентам bootchain при расширении (а теперь это уже более >>>> десятка фич и подпакетов) тоже может потребоваться подобная инициализация. >>>> Здесь в одном коммите видно, куда переехал код функции prepare(). Хуки нужны >>>> для того, чтобы вызывать подобную инициализацию из определённого места, так >>>> как базовый пакет bootchain-core может не знать, с какими компонентами >>>> bootchain собран initramfs. Соответственно, включаемые скрипты кладутся в >>>> /lib/bootchain-prepare.d. Если потребуется, по аналогии можно добавить в >>>> stop() хуки для деинициализации. >>> https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L32-L38 >>> https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L61 >>> https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L109 >>> https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L114 >>> >>> Ты имеешь в виду вот такие хуки ? >> Ну очень похожие, хотя use_hooks() явно проще -- без блокировки консоли, без >> бита выполнения, просто соурсим исходники: > Эти хуки уже давно есть и можно использовать. Не нужно дублировать этот же > функционал. Дойдя до этого места не понял, как их можно использовать... Делаю скрипт выполняемым, а класть-то его куда? В /lib/initrd/pre/bootchain-core/ ? >>>>>> +use_hooks() >>>>>> +{ >>>>>> + local hook hdir="$1" >>>>>> + >>>>>> + if [ -d "$hdir" ]; then >>>>>> + # shellcheck disable=SC2012 >>>>>> + for hook in $(ls -1 -- "$hdir"/* |sort) _; do >>>>>> + [ -s "$hook" ] || >>>>>> + continue >>>>>> + . "$hook" >>>>>> + done >>>>>> + fi >>>>>> } >> и: >>>>>> --- /dev/null >>>>>> +++ b/make-initrd/features/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev >>>>>> @@ -0,0 +1,12 @@ >>>>>> +#!/bin/bash -efu >>>>>> + >>>>>> +dir=/.initrd/bootchain/waitdev >>>>>> +mkdir -p -- "$dir" >>>>>> + >>>>>> +[ -z "${WAITDEV_TIMEOUT-}" ] || >>>>>> + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir/TIMECNT" >>>>>> +i=0 >>>>>> +while [ "$i" -lt "${WAITDEV:-0}" ]; do >>>>>> + touch "$dir/$i" >>>>>> + i=$((1 + $i)) >>>>>> +done >> -- Best regards, Leonid Krivoshein.
[-- Attachment #1: Type: text/plain, Size: 2982 bytes --] 27.09.2021 20:22, Leonid Krivoshein пишет: > > 27.09.2021 16:57, Alexey Gladkov пишет: >> On Mon, Sep 27, 2021 at 04:11:43PM +0300, Leonid Krivoshein wrote: >>> [...] >>>>> Другим компонентам bootchain при расширении (а теперь это уже более >>>>> десятка фич и подпакетов) тоже может потребоваться подобная >>>>> инициализация. >>>>> Здесь в одном коммите видно, куда переехал код функции prepare(). >>>>> Хуки нужны >>>>> для того, чтобы вызывать подобную инициализацию из определённого >>>>> места, так >>>>> как базовый пакет bootchain-core может не знать, с какими >>>>> компонентами >>>>> bootchain собран initramfs. Соответственно, включаемые скрипты >>>>> кладутся в >>>>> /lib/bootchain-prepare.d. Если потребуется, по аналогии можно >>>>> добавить в >>>>> stop() хуки для деинициализации. >>>> https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L32-L38 >>>> >>>> https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L61 >>>> https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L109 >>>> >>>> https://github.com/osboot/make-initrd/blob/master/data/etc/rc.d/rc#L114 >>>> >>>> >>>> Ты имеешь в виду вот такие хуки ? >>> Ну очень похожие, хотя use_hooks() явно проще -- без блокировки >>> консоли, без >>> бита выполнения, просто соурсим исходники: >> Эти хуки уже давно есть и можно использовать. Не нужно дублировать >> этот же >> функционал. > > Дойдя до этого места не понял, как их можно использовать... > > Делаю скрипт выполняемым, а класть-то его куда? В > /lib/initrd/pre/bootchain-core/ ? > Проверочная сборка показала, что этот путь не работает. Если загрузиться с параметрами waitdev=UUID=1234 waitdev_timeout=180 rdshell и запустить из rdshell руками /lib/initrd/pre/bootchain-core/300-waitdev , только тогда видно, что правильно отрабатывает. Но автоматом хук не запускается. В коде есть механизм запуска, но он не используется ни в одной фиче и в data/ его тоже нет, только сам этот скрипт rc. Вот изменения, на всякий случай: -- Best regards, Leonid Krivoshein. [-- Attachment #2: waitdev.diff --] [-- Type: text/x-patch, Size: 1916 bytes --] commit d5340fea7efcf9995b7391a17b9781462556e661 Author: Leonid Krivoshein <klark@altlinux.org> Date: Tue Sep 28 00:14:28 2021 +0300 core+waitdev: use common way for hooks call instead internal use_hooks() See also: https://lists.altlinux.org/pipermail/make-initrd/2021-September/000685.html diff --git a/bootchain-core/data/etc/rc.d/init.d/bootchain b/bootchain-core/data/etc/rc.d/init.d/bootchain index 7bdb1cf..1538339 100755 --- a/bootchain-core/data/etc/rc.d/init.d/bootchain +++ b/bootchain-core/data/etc/rc.d/init.d/bootchain @@ -17,24 +17,9 @@ NAME=bootchained PIDFILE="/var/run/$NAME.pid" ARGS="--lockfile $LOCKFILE --pidfile $PIDFILE --name $NAME --displayname $NAME" -use_hooks() -{ - local hook hdir="$1" - - if [ -d "$hdir" ]; then - # shellcheck disable=SC2012 - for hook in $(ls -1 -- "$hdir"/* |sort) _; do - [ -s "$hook" ] || - continue - . "$hook" - done - fi -} - start() { RETVAL=0 if [ "${ROOT-}" = bootchain ] || [ "${ROOT-}" = pipeline ]; then - use_hooks /lib/bootchain-prepare.d start_daemon --background $ARGS "$NAME" RETVAL=$? fi diff --git a/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev b/bootchain-waitdev/data/lib/initrd/pre/bootchain-core/300-waitdev old mode 100644 new mode 100755 similarity index 71% rename from bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev rename to bootchain-waitdev/data/lib/initrd/pre/bootchain-core/300-waitdev index f7315a3..5e0f040 --- a/bootchain-waitdev/data/lib/bootchain-prepare.d/300-waitdev +++ b/bootchain-waitdev/data/lib/initrd/pre/bootchain-core/300-waitdev @@ -1,10 +1,13 @@ #!/bin/bash -efu +. /.initrd/initenv + dir=/.initrd/bootchain/waitdev mkdir -p -- "$dir" [ -z "${WAITDEV_TIMEOUT-}" ] || - printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir/TIMECNT" + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir"/TIMECNT + i=0 while [ "$i" -lt "${WAITDEV:-0}" ]; do touch "$dir/$i"
27.09.2021 20:22, Leonid Krivoshein пишет:
>> Эти хуки уже давно есть и можно использовать. Не нужно дублировать
>> этот же
>> функционал.
>
> Дойдя до этого места не понял, как их можно использовать...
>
> Делаю скрипт выполняемым, а класть-то его куда? В
> /lib/initrd/pre/bootchain-core/ ?
Получилось: класть в /lib/initrd/pre/bootchain/* , т.е. по имени сервиса.
--
Best regards,
Leonid Krivoshein.