[arch-projects] [RFC] [PATCH] [mkinitcpio] Cleanly stop udev >= 168 as recommended by upstream.

Dave Reisner d at falconindy.com
Mon May 2 09:51:08 EDT 2011


On Mon, May 02, 2011 at 06:15:15AM -0400, Dave Reisner wrote:
> On Mon, May 02, 2011 at 03:16:56AM -0300, Gerardo Exequiel Pozzi wrote:
> > On 05/02/2011 01:22 AM, Dave Reisner wrote:
> > >On Mon, May 02, 2011 at 12:40:14AM -0300, Gerardo Exequiel Pozzi wrote:
> > >>On 05/02/2011 12:39 AM, Gerardo Exequiel Pozzi wrote:
> > >>>N0: udev>= 168 is needed.
> > >>>N1: I guess the order is correct (first cleanup then exit).
> > >>>N2: device-mapper/LVM udev rules must be parsed for initramfs creation
> > >>>     to add OPTIONS+="db_persist"
> > >>>
> > >>>> From udev NEWS:
> > >>>The running udev daemon can now cleanly shut down with:
> > >>>   udevadm control --exit
> > >>>
> > >>>Udev in initramfs should clean the state of the udev database
> > >>>with: udevadm info --cleanup-db which will remove all state left
> > >>>behind from events/rules in initramfs. If initramfs uses
> > >>>--cleanup-db and device-mapper/LVM, the rules in initramfs need
> > >>>to add OPTIONS+="db_persist" for all dm devices. This will
> > >>>prevent removal of the udev database for these devices.
> > >>>
> > >>>Signed-off-by: Gerardo Exequiel Pozzi<vmlinuz386 at yahoo.com.ar>
> > >>>---
> > >>>  init |   12 ++++--------
> > >>>  1 files changed, 4 insertions(+), 8 deletions(-)
> > >>>
> > >>>diff --git a/init b/init
> > >>>index 7b81a1a..f586220 100644
> > >>>--- a/init
> > >>>+++ b/init
> > >>>@@ -118,15 +118,11 @@ elif [ ! -x "/new_root${init}" ]; then
> > >>>      launch_interactive_shell --exec
> > >>>  fi
> > >>>
> > >>>-#Special handling if udev is running
> > >>>-udevpid=$(/bin/pidof udevd)
> > >>>-if [ -n "${udevpid}" ]; then
> > >>>-    # Settle pending uevents, then kill udev
> > >>>+# Stop udevd if is running
> > >>>+if [ "${udevd_running}" -eq 1 ]; then
> > >>>      /sbin/udevadm settle
> > >>>-    /bin/kill ${udevpid}>   /dev/null 2>&1
> > >>>-    while /bin/pidof udevd>/dev/null; do
> > >>>-        sleep 0.1
> > >>>-    done
> > >>>+    /sbin/udevadm info --cleanup-db
> > >>>+    /sbin/udevadm control --exit
> > >>>  fi
> > >>>
> > >>>  for d in proc sys dev run; do
> > >>This just keep settle command.
> > >>
> > >>-- 
> > >>Gerardo Exequiel Pozzi
> > >>\cos^2\alpha + \sin^2\alpha = 1
> > >>
> > >The settle is actually unnecessary here, as its called as part of the
> > >udev hook.  I don't see a need to call it twice. On the other hand, I've
> > >notice that dracut makes the call 'udevadm control --stop-exec-queue'
> > >prior to shutting down udevd. Perhaps we should be using that instead?
> > >
> > >dave
> > >
> > sure?
> > 
> > I think this:
> > 
> > --------------------
> > launch udevd --daemon
> > 
> > [udev]
> > launch triggers
> > settle
> > [/udev]
> > 
> > [other hooks]
> > other possible uevents
> > [/other hooks]
> > 
> > at this point should wait for all uevents processed (settle) then
> > stop udev (control --exit)
> > ----------------
> > 
> > stop-exec-queue just ignore all events (stop process them) and queue
> > all incomming events. I think this is what do not want to do.
> > 
> 
> Not sure I understand the logic here. By the time you're ready to shut
> down udev, your root is mounted and $init exists. Queued uevents are
> very likely for hardware that we don't currently have modules for. What
> other uevents would we be interested in at this point?
> 
> dave
> 

Replying to myself to correct myself... I spoke with Kay Sievers on IRC
and it seems that the second settle is needed in older versions of udev,
but if we're going to be using control --exit, then its not needed. To
quote:

09:38    kay  » falconindy: yeah, old udev version might leave processes behind for a very 
                short while while udevd was killed
09:38    kay  » falconindy: so the second settle was not wrong
09:39    kay  » falconindy: but not needed with --exit

I also asked him about calling info --cleanup-db

09:35        kay  » falconindy: cleanup db only if you need, and keep lvm working
09:36 falconindy  » right, i noticed that lvm rules would need adjustment
09:36 falconindy  » what would be the need to call cleanup-db?
09:36        kay  » falconindy: yeah. otherwise it's nice to have, so you don't confuse the 
                    real root with crap left behind from initramfs

So it's not imperative that we call this. And as for dracut calling
--stop-exec-queue:

09:34 falconindy  » i notice dracut calls the stop exec
09:35        kay  » falconindy: never do anything with the queue
09:35        kay  » falconindy: at least i don't know a valid use case

Yay dracut...

So, if we're going to be supporting udev>=168, it seems like the ideal
way to shutdown udevd is:

udevadm info --cleanup-db
udevadm control --exit

d



More information about the arch-projects mailing list