From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding:content-language; bh=YmhhfNzp3abgoASd2KmIyWGqxgdHCDhHQs0Gawg2+VI=; b=azqsRoIpl+5er3h0C4yOXC7P0g9DLUwWbcY+kU4YkHIpatLsa+J0RPbrmsY1Q55oDD g+T9HG7aYYRUFuX1HhtTFWwwEoL013EGKb3Bs8+elVF9uZ3zUfKSplfxVGzSR6SKrijO V0kFevww5kELjSpVekVQAX0fe55AKgY0IMnuCKCsCs3j0anaPc3RjLFvOjz8UkAWDrC7 wT3O6yDCTZGDdNFEUIrh9KN78wpl8lG2jm5FeKsMIAxPYqFFQkZdSj4EBT55fMFKjXqh 8l1PKeXowz6+Bp4YGFN9FBfqOMm1AwDtiiGnzYDRsvLnQiuzJWaks2Nvukc1Xsz4FtLI La0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=YmhhfNzp3abgoASd2KmIyWGqxgdHCDhHQs0Gawg2+VI=; b=qaGABnAjFf5LBhzMHhDnLcbMx9dzlj80jfxK0PZYwGtQMPd15T6W+n6CwNQq9dPxH+ QQploxltq8Zb388m3rw2uKF/DlkoE7bmBMe2j2ab81p5Gcjb9grYPAMcZ+7136///M8o 4li9OeEArnBbDWu/YLRFUx7iuI+Pbbe51/ts9yTf3RQyoZWYmsJ2nnXcE0Kuy6SJZGJA jLYchDDcjh/fkLDA0nQ6Or7vWxfgtRLV0s3udEeazB5+DSvrG/bp0+EgLCjAux5ZZYux ffTEpaNzitt1Rks22CAjoWqyDlGzfLzdllCk7CEVHWfAYJpNQT49m16Ey8KKvXv/etGQ pirw== X-Gm-Message-State: AOAM532tKXJLIegpfxfxDZ5hiWYOA/jUbP7LUzoBh7bCbU2LZQFpIFoU sFU/RVIhRQ3dhRF2JZikli0nhO166cU= X-Google-Smtp-Source: ABdhPJwspiuZOSxZ/aiuac+xxaZYVKQbSjG26+ePPMgFwltqUaRjtiYzFmoTf6FEvhVecCySHqq67w== X-Received: by 2002:a2e:a5c8:: with SMTP id n8mr28952472ljp.367.1635271982335; Tue, 26 Oct 2021 11:13:02 -0700 (PDT) To: make-initrd@lists.altlinux.org References: <20211024172108.668CDA5E4C@lists.altlinux.org> <20211026105516.jfbatbtjfah74vou@example.org> <37c46f84-217f-81bd-56a9-1d5b8d02d670@gmail.com> <20211026135552.wratyys3jkvboqm6@example.org> From: Leonid Krivoshein Message-ID: <55fdcd1d-da17-5631-20e3-879bb860d2c8@gmail.com> Date: Tue, 26 Oct 2021 21:13:01 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20211026135552.wratyys3jkvboqm6@example.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: ru Subject: Re: [make-initrd] [PATCH v6 08/22] bootchain-waitdev: introduces an optional waitdev_timeout X-BeenThere: make-initrd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: make-initrd@lists.altlinux.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Oct 2021 18:13:06 -0000 Archived-At: List-Archive: 26.10.2021 16:55, Alexey Gladkov пишет: > On Tue, Oct 26, 2021 at 02:25:55PM +0300, Leonid Krivoshein wrote: >> 26.10.2021 13:55, Alexey Gladkov пишет: >>> On Sun, Oct 24, 2021 at 08:21:08PM +0300, Leonid Krivoshein wrote: >>>> "waitdev_timeout" describes a common timeout for all "waitdev" steps >>>> in the "bootchain". Defining a timeout allows to use a fallback if >>>> the specified devices are not ready yet. By default is not set, which >>>> makes to wait forever. >>>> >>>> Signed-off-by: Leonid Krivoshein >>>> --- >>>> features/bootchain-waitdev/README.md | 3 +++ >>>> .../etc/initrd/cmdline.d/bootchain-waitdev | 1 + >>>> .../data/lib/bootchain/waitdev | 18 ++++++++++++++++++ >>>> .../data/lib/initrd/pre/bootchain/300-waitdev | 3 +++ >>>> 4 files changed, 25 insertions(+) >>>> >>>> diff --git a/features/bootchain-waitdev/README.md b/features/bootchain-waitdev/README.md >>>> index 126a904..d6bae63 100644 >>>> --- a/features/bootchain-waitdev/README.md >>>> +++ b/features/bootchain-waitdev/README.md >>>> @@ -13,6 +13,9 @@ feature. It allows to wait a specified block or character special devices. >>>> the same as `root=`, but with optional `CDROM:` prefix. This parameter can be >>>> specified more than once depending on how many times a corresponding element >>>> is mentioned in the `bootchain`. >>>> +- `waitdev_timeout` describes a common timeout for all `waitdev` steps in the >>>> + `bootchain`. Defining a timeout allows to use a fallback if the specified >>>> + devices are not ready yet. By default is not set, which makes to wait forever. >>> Почему он общий между всеми waitdev ??? >> Логика в этом железная: если для сборки корня шагам, следующим за >> wiatdev'ами, нужны все указанные устройства, то не имеет значения, какого >> устройства в цепочке не хватает. Это очень похоже на общий rootdelay и схему >> "И". Общий таймаут нужен для того, чтобы не ждать вечно и дать возможность >> отработать некоему fallback'у, следующим за этими шагами, или выдать общий >> на все отказы диалог, и вернуться в начало. > Аналогия с rootdelay= тут не корректна т.к. rootdelay= распространяется на > весь процесс загрузки. Я бы понял, если бы timeout распространялся на весь > bootchain=, тогда было бы логично. > > Таймаут логичен если после него будет либо ошибка, либо предполагаются > какие-то действия. > > Я предложил добавить таймаут как параметр конкретного waitdev. Это тоже можно сделать. Например, можно добавить префикс "TIMEOUT=:". И тогда это позволит реализовать подключение устройств по схеме "ИЛИ". Пока что префикс добавлен только один -- "CDROM:", их можно несколько полезных напридумывать. Здесь же предлагается схема "И" и один таймаут на все waitdev'ы. >>> Получается, если первый waitdev прождал весь wait_timeout, то остальные >>> даже пробовать не будут, но это же неправильно так как они другой девайс >>> ожидают. >> Можно было бы им дать попробовать без дополнительных sleep'ов, но есть два >> контраргумента: >> >> 1) Цепочка могла быть построена исходя из знания, что к устройству "Б" >> нельзя обращаться, пока не будет подключено устройство "А". Обращение к "Б" >> без готовности "А" может привести к нехорошим последствиям, типа зависания. >> >> 2) Чтобы отработал fallback, по всей видимости, последний waitdev не должен >> быть готов. > А как происходит этот fallback ? Пока что лишь в одном месте это используется: http://git.altlinux.org/gears/m/make-initrd-bootchain.git?p=make-initrd-bootchain.git;a=blob;f=bootchain-localdev/data/lib/bootchain/localdev;h=24c3f595553c6ef758f7111529e446c9a82d8fc6;hb=d9135c3936ee28b0153746d690724c6f650b5a07#l312 Код шага localdev до тебя ещё не доехал. Многоходовочка такая: 1. "Ничего не создающий шаг" пропускает результат "насквозь". В данном случае шаг altboot выполняет трансляцию параметров пропагатора в свои, а слева от него, допустим, waitdev: bootchain=waitdev,waitdev,fg,altboot То есть, в конце работы шага altboot вызывается bypass_results() и результат последнего waitdev окажется на входе шага, следующим за altboot. 2. Шаг "fg" вообще "прозрачный" (встроенный, скрытый), для него не расходуется элементов цепочки, можно считать, что его не существует. Поэтому выход последнего waitdev попадает на вход altboot, а т.к. оно пропускает вход сквозь себя, то на вход следующего шага. 3. Шаг altboot перегружает цепочку новыми шагами и при локальной загрузке первым становится, допустим, шаг localdev. Он может выступать fallback'ом для всех шагов waitdev, так как использует другой механизм поиска локальных носителей. Первым делом localdev смотрит результат предыдущего шага. Если это устройство, то оно уже найдено и ничего сканировать не надо. Если бы waitdev'ы ждали вечно, мы бы никогда не дошли до fallback'а. Объяснение названий такое: waitdev -- ждёт локальных устройств, scandev-sh-functions -- сканирует заново все устройства, localdev -- объединяет эти два механизма, сначала проверяя результаты waitdev, и, если необходимо, запуская сканирование. > В твоей реализации если достигнут таймаут, то последующие waitdev просто > exit 0 делают и невозможно понять дождались они чего-то или нет. > > Получается, что следующий шаг может только гадать о результате waitdev. Для этого у последующих шагов есть resolve_devname(). Пустое значение будет означать отсутствие результата. > Потому что мне сейчас приходит в голову сделать параметр (или шаг) > onfail, но это явно не то чем пользуешься ты для failback. > >> Если игнорировать эти моменты, можно дать хотя бы попробовать проверить >> готовность следующих устройств без дополнительных sleep'ов, благо асинхронно >> работающая конструкция это позволяет сделать. >> >> >>> Например, мы ждём сначала cdrom, а потом usb-флешку с ключом. >>> >>>> ## Example >>>> diff --git a/features/bootchain-waitdev/data/etc/initrd/cmdline.d/bootchain-waitdev b/features/bootchain-waitdev/data/etc/initrd/cmdline.d/bootchain-waitdev >>>> index 3544c25..6929a86 100644 >>>> --- a/features/bootchain-waitdev/data/etc/initrd/cmdline.d/bootchain-waitdev >>>> +++ b/features/bootchain-waitdev/data/etc/initrd/cmdline.d/bootchain-waitdev >>>> @@ -1 +1,2 @@ >>>> register_array string WAITDEV >>>> +register_parameter number WAITDEV_TIMEOUT >>>> diff --git a/features/bootchain-waitdev/data/lib/bootchain/waitdev b/features/bootchain-waitdev/data/lib/bootchain/waitdev >>>> index 60464d9..fa99c45 100755 >>>> --- a/features/bootchain-waitdev/data/lib/bootchain/waitdev >>>> +++ b/features/bootchain-waitdev/data/lib/bootchain/waitdev >>>> @@ -3,6 +3,14 @@ >>>> . bootchain-sh-functions >>>> check_parameter WAITDEV >>>> + >>>> +timeout= >>>> +timecnt=/.initrd/bootchain/waitdev/TIMECNT >>>> + >>>> +[ ! -s "$timecnt" ] || >>>> + read -r timeout < "$timecnt" ||: >>>> +[ "$timeout" != 0 ] || >>>> + exit 0 >>>> devspec="$(get_parameter WAITDEV)" >>>> while [ -n "$devspec" ]; do >>>> @@ -25,4 +33,14 @@ while [ -n "$devspec" ]; do >>>> fi >>>> sleep 1 >>>> + [ -n "$timeout" ] || >>>> + continue >>>> + timeout=$(($timeout - 1)) >>>> + >>>> + if [ "$timeout" = 0 ]; then >>>> + message "device waiting timeout exceedded" >>>> + break >>>> + fi >>>> done >>>> + >>>> +[ -z "$timeout" ] || printf '%s\n' "$timeout" > "$timecnt" >>>> diff --git a/features/bootchain-waitdev/data/lib/initrd/pre/bootchain/300-waitdev b/features/bootchain-waitdev/data/lib/initrd/pre/bootchain/300-waitdev >>>> index 3642722..5e0f040 100755 >>>> --- a/features/bootchain-waitdev/data/lib/initrd/pre/bootchain/300-waitdev >>>> +++ b/features/bootchain-waitdev/data/lib/initrd/pre/bootchain/300-waitdev >>>> @@ -5,6 +5,9 @@ >>>> 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" >>>> -- >>>> 2.24.1 >>>> >>>> _______________________________________________ >>>> 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 -- Best regards, Leonid Krivoshein.