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=-3.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RP_MATCHES_RCVD autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1792146040; bh=3bPEiBdm1N9i1Pgt0zCMQG1gFKPVKIf/MwTV4wqz3uc=; h=Date:From:To:Subject:References:In-Reply-To; b=AiFvhVimBnc82cX9Y6np5sAVSfsbvDjSV3OOiOQTL5tTKsBG9R/k/AseLI7XnUp5g znwLE4pLuAh8VVkZNETTpXsT6v8n8ygYQn42EIVUmHcxIqxAYPJqBn73HAdXGxbhVu rPMUdWqCAKguubseTOKoUfzhbn2B+YCjGl/sCYEqBy2kVRlwLyR1m3RGe1PRZhUt4b HesHUWdWr3AaQZo+ZmGwbW2hYCfjI8pHEccKBK9BQsJuOu7T3ipNhixdEH9CHsRMsZ nyKOL9z2MpS9RLXcIvVIKfeEBVj84I61Kr3VxEyB89jcYHxMd8SNzSiM7ddDB3Ot9N Yjh1Y0kt3UJuw== Date: Fri, 16 Oct 2026 12:20:36 +0200 From: Alexey Gladkov To: make-initrd@lists.altlinux.org Message-ID: References: <87a657ee-566d-431e-9581-e11b0a42de73@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Subject: Re: [make-initrd] [RFC PATCH] runtime: fix a suspended boot after rdshell 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: Fri, 16 Oct 2026 10:20:48 -0000 Archived-At: List-Archive: On Thu, Oct 15, 2026 at 02:48:48PM +0000, Egor Shestakov wrote: > Привет, я похоже нашел причину почему все зависает. Применил патч у себя и > все теперь работает нормально. Простите за задержку. Уехал на openssl конференцию и думал, что никто не заметит. И пропустил всю движуху :) Да, ты прав. Это бага из-за рефакторинга. Исторически эта ошибка появилась в два шага: 1. В коммите 598a4b241a ("Rewrite console locking") блокировка через директорию /.initrd/rdshell.lock была заменена на `fd_lock 90 /dev/console`. На тот момент логика жила в короткоживущем uevent-хендлере 400-rootdelay, который делал: fd_lock 90 /dev/console rdshell "Emergency shell" & exit Сам хендлер тут же завершался (exit), закрывая у себя fd 90, а фоновый процесс rdshell наследовал fd 90 и удерживал flock на /dev/console, пока пользователь не выйдет из шелла. 2. В коммите 5bba8d357a ("Convert rootdelay to service") одноразовый хендлер превратился в постоянный демон rootdelayd с бесконечным циклом, а exit механически заменили на continue. В результате rootdelayd берёт эксклюзивный лок fd_lock 90 /dev/console, запускает rdshell & и уходит на continue, где бесконечно крутится в: if [ -e "$disabled" ] || rootdelay_paused; then sleep $period continue fi Когда пользователь нажимает Ctrl-D в rdshell, процесс rdshell завершается, но демон rootdelayd остаётся жить с открытым дескриптором 90 и никогда не вызывает fd_unlock 90. > -- >8 -- > > Rdshell takes a write lock to /dev/console but never release it. Rdshell > can run in foreground, because the rootdelayd doesn't wait for anything > else and fails in an idle loop after rdshell has been invoked. > > Signed-off-by: Egor Shestakov > --- > features/runtime/data/sbin/rootdelayd | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/features/runtime/data/sbin/rootdelayd b/features/runtime/data/sbin/rootdelayd > index 7ea82afcf..85060cefd 100755 > --- a/features/runtime/data/sbin/rootdelayd > +++ b/features/runtime/data/sbin/rootdelayd > @@ -37,7 +37,8 @@ while :; do > mkdir -p -- "$disabled" > > fd_lock 90 /dev/console > - rdshell "Emergency shell" & > + rdshell "Emergency shell" > + fd_unlock 90 > > continue > fi > @@ -91,7 +92,9 @@ while :; do > > mkdir -p -- "$disabled" > > - rdshell "$msg" & > + rdshell "$msg" > + > + fd_unlock 90 > > continue > fi Патч правильный, но неполный. В твоём пвтче дескриптор 90 унаследуется rdshell и остальными утилитами из него. Правильнее закрыть дескриптор: fd_lock 90 /dev/console rdshell "Emergency shell" 90<&- fd_unlock 90 и во втором месте тоже. -- Rgrds, legion