From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Brendan Moran" Date: Mon, 28 Sep 2009 16:09:30 +0000 Subject: Re: Migrating from static /dev to udev Message-Id: <4AC0DFBA.6090104@broadcom.com> MIME-Version: 1 Content-Type: multipart/mixed; boundary="------------020606030407070801020705" List-Id: References: <4ABD467F.7010901@broadcom.com> In-Reply-To: <4ABD467F.7010901@broadcom.com> To: linux-hotplug@vger.kernel.org --------------020606030407070801020705 Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi Alan, I'm using virtually the same startup script as is used in Ubuntu (attached). It only uses $udevadm trigger, with no arguments. I didn't expect that permissions would be an issue, as this system is running in single user mode. Mounting /dev as a tmpfs makes perfect sense to me, however I'll have to do some hacking before I can modify that. I have a list of all the devices to be created and placed in /dev already. Currently, it's expanded at compile time, but I should be able to change the target from /dev to /lib/udev/devices. One additional thing that I need to do while migrating away from a static /dev is to convert our current naming scheme for devices to one which is consistent with the naming that udev uses by default. Thanks again, Brendan Alan Jenkins wrote: > Hi > > On 9/25/09, Brendan Moran wrote: > >> Hi, >> I'm trying to migrate an armeb embedded Linux build from a static /dev >> to udev. I now have the system coming up with udev enabled, but the >> first thing that udev does is disable my console connection. Before the >> console starts endlessly spewing "file not found" messages, >> > > Ow. Often that means you've either deleted or removed access > permissions to /dev/null. Maybe the same has happened to /dev/tty or > something as well. It suggests that your rules are failing to assign > permissions to these devices, so udev is giving them default > permissions which are too restrictive. > > >> udev prints >> a line like this >> >> tty ttyAMA0: uevent: unsupported action-string; this will be ignored >> in a futur >> >> for nearly every device that was in the previous static /dev. >> > > Aha. That's a kernel message, not a udev one. It suggests you're doing this: > > udevadm trigger --action=uevent > > when you should be doing this: > > udevadm trigger --action=add > > ("udevadm trigger" should also work since --action=add is the default). > > >> I understand that I can add static rules to udev to fix this, but I also >> want to migrate naming conventions to standard names--ttyAMA0 should be >> ttyS0, etc. I can keep legacy names around with symlinks if necessary. >> > > I suspect this is not relevant to your problems. Udev doesn't delete > the previous contents of /dev. There should only be problems if the > names conflict, so that udev overwrites one of your existing nodes > with something you're not expecting. > > (Btw, in case you're not already doing this, the README recommends you > mount /dev as a tmpfs and initialize it by copying all your static > devices from /lib/udev/devices). > > >> So I'm not quite sure how to get started. I have disabled udev's >> startup for the moment, so I can get into /sys. Is there a guide >> somewhere on how to migrate from a static /dev to udev? >> >> Thanks, >> Brendan >> > > --------------020606030407070801020705 Content-Type: text/plain; name=udev Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename=udev #!/bin/sh -e ### BEGIN INIT INFO # Provides: udev # Required-Start: mountkernfs # Required-Stop: # Should-Start: # Default-Start: S # Default-Stop: # Short-Description: Start the udev daemon. # Description: Mounts the /dev virtual filesystem, starts the udev # daemon and populates /dev. ### END INIT INFO # Check the package is still installed [ -x /sbin/udevd ] || exit 0 # Get LSB functions . /lib/lsb/init-functions if [ -e /etc/default/rcS]; then . /etc/default/rcS fi case "$1" in start) DEVMOUNT=`mount | grep "on /dev " | cut -d " " -f 1` # We need the uevent support introduced in 2.6.15, bail out if we # don't have it and fall back to a static /dev if [ ! -f /sys/class/mem/null/uevent ]; then if [ -n $DEVMOUNT ]; then # uh-oh, initramfs made some kind of /dev, get rid of it umount -l /dev fi exit 1 fi if [ -z $DEVMOUNT ]; then # initramfs didn't mount /dev, so we'll need to do that mount -n -t tmpfs -o mode=0755 udev /dev fi # Copy over default device tree if [ -d /lib/udev/devices ]; then DEVICELIST=`ls /lib/udev/devices` if [ -n $DEVICELIST ]; then cp -a -f /lib/udev/devices/* /dev fi fi # It's all over netlink now if [ -e /proc/sys/kernel/hotplug ]; then echo "" > /proc/sys/kernel/hotplug fi # Start udevd log_begin_msg "Starting kernel event manager..." #if start-stop-daemon --start --quiet --exec /sbin/udevd -- --daemon; then /sbin/udevd --daemon & UDEVPID=$! ; echo $UDEVPID > /var/run/udevd.pid if [ $UDEVPID -gt 0 ]; then log_end_msg 0 else log_end_msg $? fi # This next bit can take a while if type usplash_write >/dev/null 2>&1; then usplash_write "TIMEOUT 360" ||: trap "usplash_write 'TIMEOUT 15' ||:" 0 fi # Log things that trigger does /sbin/udevadm monitor -e >/dev/.udev.log & UDEV_MONITOR_PID=$! # Fix permissions and missing symlinks/programs for devices made in # initramfs, and catch up on everything we missed log_begin_msg "Loading hardware drivers..." /sbin/udevadm trigger if /sbin/udevadm settle; then log_end_msg 0 else log_end_msg $? fi # Kill the udev monitor again kill $UDEV_MONITOR_PID ;; stop) log_begin_msg "Stopping kernel event manager..." #if start-stop-daemon --stop --quiet --oknodo --exec /sbin/udevd --retry 5; then if [ -e /var/run/udevd.pid ]; then UDEVPID=`cat /var/run/udevd.pid` else UDEVPID=`ps | grep udevd | cut -d " " -f 3` if [ -z "$UDEVPID" ]; then echo "udev not running" exit 0; fi fi if kill $UDEVPID ; then log_end_msg 0 else log_end_msg $? fi umount -l /dev ;; restart) if [ ! -f /sys/kernel/uevent_seqnum ]; then echo "Kernel uevent sequence number not available, cowardly not restarting udev" 1>&2 exit 0 fi seqnum_before=$(cat /sys/kernel/uevent_seqnum) log_begin_msg "Stopping kernel event manager..." #if start-stop-daemon --stop --quiet --oknodo --exec /sbin/udevd --retry 5; then if [ -e /var/run/udevd.pid ]; then UDEVPID=`cat /var/run/udevd.pid` else UDEVPID=`ps | grep udevd | cut -d " " -f 3` if [ -z "$UDEVPID" ]; then echo "udev not running" exit 0; fi fi if kill $UDEVPID ; then log_end_msg 0 else log_end_msg $? fi log_begin_msg "Starting kernel event manager..." #if start-stop-daemon --start --quiet --exec /sbin/udevd -- --daemon; then /sbin/udevd --daemon & UDEVPID=$! ; echo $UDEVPID > /var/run/udevd.pid if [ $UDEVPID -gt 0 ]; then log_end_msg 0 else log_end_msg $? fi seqnum_after=$(cat /sys/kernel/uevent_seqnum) if [ $seqnum_before -ne $seqnum_after ]; then echo "Kernel uevent sequence number changed, some events may have been missed :o(" 1>&2 fi ;; refresh-devices) cp -au /lib/udev/devices/* /dev log_begin_msg "Loading additional hardware drivers..." /sbin/udevadm trigger if /sbin/udevadm settle; then log_end_msg 0 else log_end_msg $? fi ;; reload|force-reload) log_begin_msg "Reloading kernel event manager..." #if start-stop-daemon --stop --signal 1 --exec /sbin/udevd; then if [ -e /var/run/udevd.pid ]; then UDEVPID=`cat /var/run/udevd.pid` else UDEVPID=`ps | grep udevd | cut -d " " -f 3` if [ -z "$UDEVPID" ]; then echo "udev not running" exit 0; fi fi if kill -1 $UDEVPID ; then log_end_msg 0 else log_end_msg $? fi ;; *) echo "Usage: /etc/init.d/udev {start|stop|restart|refresh-devices|reload|force-reload}" exit 1 ;; esac exit 0 --------------020606030407070801020705--