[SOLVED] Some services not starting at boot: certainly udev and networking, maybe others
antiX / MX LinuxThis forum is for the discussion of antiX and MX Linux.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
Some services not starting at boot: certainly udev and networking, maybe others
I have been running AntiX on my laptop for over a year now without any problems. It's usually a very well-behaved system.
Today when I booted up, my keyboard was dead in X. I managed to do a safe boot into a root console and found that the Xorg log had found no input devices because udevd was not running. Udevd is normally started by a script called bootmisc, but when I tried to run that by hand, nothing happened.
The network was down too: when I tried to start it, I was told that wpa_supplicant was not running, but I haven't found out so far what launches that; I suspect a hook script somewhere.
There may be other failed services. I don't really know where to start looking. If anyone can give me a few pointers, I'd be grateful.
I think I may have found the source of the problem, but I don't know where to go from here.
During my last apt update I purged udev. This is the old (systemd) udev which is now deprecated in AntiX. I have the replacement programs eudev and libeudev1 installed but I think the purge may have removed a configuration file that eudev depends on.
openrc needs to start udev, wpa_supplicant and networkmanager in the right order.
udev doest (??) create the interface added events for the wlan interface on boot.
I'm not using openrc, but it looks like the wlan interface fails if udev isn't there. And if there are any other services missing, that will be due to the same thing. So the question is: why won't udevd run and how do I correct this?
OK. Nobody had any bright ideas, so I booted up again today and tried launching udevd by hand to see if I got any error or crash messages. Nothing untoward, but no response from the kernel either. So I combed through the scripts in /etc/init.d and found one called udev. I hadn't noticed it before for reasons that will become apparent in a moment.
I launched the script and suddenly there was a flurry of kernel activity. Obviously the kernel and udevd were talking to each other and devices were being recognised. Then I ran the /etc/init.d/networking script and up came wlan0 with dhcp.
The first thing I did after that was the weekly update. Strike while the iron's hot! Then I su'd to myself and ran startx. And glory be! X came up with mouse and keyboard working normally.
When I checked the links in /etc/rcS.d, I couldn't find one to udev. There was that bootmisc one but that was obviously a red herring. So it was the absence of that link that stopped udevd from starting and the other problems all stemmed from that.
The problem now is that I don't know where to put the link in. I mean I don't know how to number it in the S series so that it runs correctly in the boot sequence. I tried calling it S02udev and rebooted, but that didn't work. S02 seems to be too early. If someone can tell me where to put it in, I should be able to solve this.
This should have been fixed by now, but it isn't. There's something missing and I don't know what it is. Please somebody give me a clue!
I have established that the source of the problem was a missing symbolic link to udev in rcS.d. That link should have been called S02udev (or possibly S02udev.sh) and is supposed to point to ../init.d/udev. I have created the link but when I boot, it doesn't work. udevd doesn't start.
I can start udevd by hand in recovery mode by running /etc/init.d/udev from the terminal and everything else then works. Why is it not starting in the normal boot? And while we are at it, why do none of the S-links work from the terminal when they all work at boot (except for the udev one apparently)?
When I first started with Linux, it was all sysvinit5 and I was told that init scripts check the name they are called with: if it begins with an "S", they add the argument "start". If it's "K", they add "stop". But I can't find any code for doing that in the scripts themselves and it doesn't happen when the links are used to launch a script from the console. Instead you get an error message saying to use an argument (start|stop|restart, etc).
I've never used AntiX but from a quick look at its downloadable ISO, it looks like /etc/init.d/udev is just executable (not symlinked to anything).
Here's the script, as copied from the ISO:
Code:
#!/bin/sh -e
### BEGIN INIT INFO
# Provides: udev
# Required-Start: mountkernfs
# Required-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Start udevd, populate /dev and load drivers.
### END INIT INFO
# we need to unmount /dev/pts/ and remount it later over the devtmpfs
unmount_devpts() {
if mountpoint -q /dev/pts/; then
umount -n -l /dev/pts/
fi
if mountpoint -q /dev/shm/; then
umount -n -l /dev/shm/
fi
}
# mount a devtmpfs over /dev, if somebody did not already do it
mount_devtmpfs() {
if grep -E -q "^[^[:space:]]+ /dev devtmpfs" /proc/mounts; then
mount -n -o remount,size=$tmpfs_size,mode=0755 -t devtmpfs devtmpfs /dev
return
fi
if ! mount -n -o size=$tmpfs_size,mode=0755 -t devtmpfs devtmpfs /dev; then
log_failure_msg "udev requires devtmpfs support, not started"
log_end_msg 1
fi
return 0
}
create_dev_makedev() {
if [ -e /sbin/MAKEDEV ]; then
ln -sf /sbin/MAKEDEV /dev/MAKEDEV
else
ln -sf /bin/true /dev/MAKEDEV
fi
}
# If the initramfs does not have /run, the initramfs udev database must
# be migrated from /dev/.udev/ to /run/udev/.
move_udev_database() {
[ -e "/dev/.udev/" ] || return 0
[ ! -e /run/udev/ ] || return 0
[ -e /run/ ] || return 0
mountpoint -q /run/ || return 0
mv /dev/.udev/ /run/udev/ || true
}
supported_kernel() {
case "$(uname -r)" in
2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;;
2.6.[12][0-9]|2.6.[12][0-9][!0-9]*) return 1 ;;
2.6.3[0-1]|2.6.3[0-1][!0-9]*) return 1 ;;
esac
return 0
}
# shell version of /usr/bin/tty
my_tty() {
[ -x /bin/readlink ] || return 0
[ -e /proc/self/fd/0 ] || return 0
readlink --silent /proc/self/fd/0 || true
}
warn_if_interactive() {
if [ "$RUNLEVEL" = "S" -a "$PREVLEVEL" = "N" ]; then
return
fi
TTY=$(my_tty)
if [ -z "$TTY" -o "$TTY" = "/dev/console" -o "$TTY" = "/dev/null" ]; then
return
fi
printf "\n\n\nIt has been detected that the command\n\n\t$0 $*\n\n"
printf "has been run from an interactive shell.\n"
printf "It will probably not do what you expect, so this script will wait\n"
printf "60 seconds before continuing. Press ^C to stop it.\n"
printf "RUNNING THIS COMMAND IS HIGHLY DISCOURAGED!\n\n\n\n"
sleep 60
}
make_static_nodes() {
[ -e /lib/modules/$(uname -r)/modules.devname ] || return 0
[ -x /bin/kmod ] || return 0
/bin/kmod static-nodes --format=tmpfiles --output=/proc/self/fd/1 | \
while read type name mode uid gid age arg; do
[ -e $name ] && continue
case "$type" in
c|b|c!|b!) mknod -m $mode $name $type $(echo $arg | sed 's/:/ /') ;;
d|d!) mkdir $name ;;
*) echo "unparseable line ($type $name $mode $uid $gid $age $arg)" >&2 ;;
esac
if [ -x /sbin/restorecon ]; then
/sbin/restorecon $name
fi
done
}
##############################################################################
[ -x /sbin/udevd ] || exit 0
PATH="/sbin:/bin"
# defaults
tmpfs_size="10M"
if [ -e /etc/udev/udev.conf ]; then
. /etc/udev/udev.conf
fi
. /lib/lsb/init-functions
if ! supported_kernel; then
log_failure_msg "udev requires a kernel >= 2.6.32, not started"
log_end_msg 1
fi
if [ ! -e /proc/filesystems ]; then
log_failure_msg "udev requires a mounted procfs, not started"
log_end_msg 1
fi
if ! grep -q '[[:space:]]devtmpfs$' /proc/filesystems; then
log_failure_msg "udev requires devtmpfs support, not started"
log_end_msg 1
fi
if [ ! -d /sys/class/ ]; then
log_failure_msg "udev requires a mounted sysfs, not started"
log_end_msg 1
fi
if ! ps --no-headers --format args ax | egrep -q '^\['; then
log_warning_msg "udev does not support containers, not started"
exit 0
fi
if [ -d /sys/class/mem/null -a ! -L /sys/class/mem/null ] || \
[ -e /sys/block -a ! -e /sys/class/block ]; then
log_warning_msg "CONFIG_SYSFS_DEPRECATED must not be selected"
log_warning_msg "Booting will continue in 30 seconds but many things will be broken"
sleep 30
fi
# When modifying this script, do not forget that between the time that the
# new /dev has been mounted and udevadm trigger has been run there will be
# no /dev/null. This also means that you cannot use the "&" shell command.
case "$1" in
start)
if mountpoint -q /dev/; then
TMPFS_MOUNTED=1
elif [ -e "/dev/.udev/" ]; then
log_warning_msg ".udev/ already exists on the static /dev"
fi
if [ ! -e "/dev/.udev/" -a ! -e "/run/udev/" ]; then
warn_if_interactive
fi
if [ -w /sys/kernel/uevent_helper ]; then
echo > /sys/kernel/uevent_helper
fi
move_udev_database
if [ -z "$TMPFS_MOUNTED" ]; then
unmount_devpts
mount_devtmpfs
[ -d /proc/1 ] || mount -n /proc
fi
make_static_nodes
# clean up parts of the database created by the initramfs udev
udevadm info --cleanup-db
# set the SELinux context for devices created in the initramfs
[ -x /sbin/restorecon ] && /sbin/restorecon -R /dev
log_daemon_msg "Starting the hotplug events dispatcher" "udevd"
if udevd --daemon; then
log_end_msg $?
else
log_warning_msg $?
log_warning_msg "Waiting 15 seconds and trying to continue anyway"
sleep 15
fi
log_action_begin_msg "Synthesizing the initial hotplug events"
if udevadm trigger --action=add; then
log_action_end_msg $?
else
log_action_end_msg $?
fi
create_dev_makedev
# wait for the udevd childs to finish
log_action_begin_msg "Waiting for /dev to be fully populated"
if udevadm settle; then
log_action_end_msg 0
else
log_action_end_msg 0 'timeout'
fi
;;
stop)
log_daemon_msg "Stopping the hotplug events dispatcher" "udevd"
if start-stop-daemon --stop --name udevd --user root --quiet --oknodo --retry 5; then
log_end_msg $?
else
log_end_msg $?
fi
;;
restart)
log_daemon_msg "Stopping the hotplug events dispatcher" "udevd"
if start-stop-daemon --stop --name udevd --user root --quiet --oknodo --retry 5; then
log_end_msg $?
else
log_end_msg $? || true
fi
log_daemon_msg "Starting the hotplug events dispatcher" "udevd"
if udevd --daemon; then
log_end_msg $?
else
log_end_msg $?
fi
;;
reload|force-reload)
udevadm control --reload-rules
;;
status)
status_of_proc /sbin/udevd udevd && exit 0 || exit $?
;;
*)
echo "Usage: /etc/init.d/udev {start|stop|restart|reload|force-reload|status}" >&2
exit 1
;;
esac
exit 0
So it seems that you just need to make it executable with chmod +x /etc/init.d/udev and then reboot (although it also kinda sounds like you've tried that, but maybe not).
I've never used AntiX but from a quick look at its downloadable ISO, it looks like /etc/init.d/udev is just executable (not symlinked to anything).
That's correct. The links are in the various rc?.d directories, in this particular case rcS.d.
The scripts in init.d are executable and of course you can run them by hand if you supply a valid argument. But I have now discovered how they are run at boot. They don't recognise the name they are called under as I previously thought. They could easily have been scripted to do that but in fact the mechanism is different. The links are executed by a rather complex script called rc which explicitly adds the argument (start or stop) according to whether it is an S link or a K link. Another script called rcS runs rc on all the links in the rcS.d directory. This is why you can't simply run the links by hand unless you supply the argument, just as you would do with the target scripts.
Yesterday I asked my friend for whom I had installed AntiX what was the exact name of the udev link in /etc/rcS.d. It turned out to be S02udev. But adding that had no effect. So last night I was fiddling about, repeatedly running rc and rcS, and suddenly it started working. I still don't know why. I'm going to mark this thread as solved but I'm pretty cheesed off because I don't know exactly what happened.
I can tell you though what caused it. AntiX recently switched from udev to eudev. If I had completely removed (purged) udev before installing eudev, I don't think the problem would have arisen. But I only removed it and purged it much later, last week in fact. Now unlike most forks, eudev uses files with exactly the same names as udev. I suppose it has to in order to function at all. Purging udev took out the link to the script (though oddly enough it left the script itself in place). Everything else followed.
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.