1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
#!/bin/sh -e
supported_kernel() {
case "$(uname -r)" in
2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;;
2.6.1[0-9]|2.6.1[0-9][!0-9]*) return 1 ;;
2.6.2[0-5]|2.6.2[0-5][!0-9]*) return 1 ;;
esac
return 0
}
tempdir() {
local dir=$(tempfile --prefix=udev.)
rm $dir
mkdir $dir
echo $dir
}
chrooted() {
if [ "$(stat -c %d/%i /)" = "$(stat -Lc %d/%i /proc/1/root 2>/dev/null)" ];
then
# the devicenumber/inode pair of / is the same as that of /sbin/init's
# root, so we're *not* in a chroot and hence return false.
return 1
fi
echo "A chroot environment has been detected, udev not started."
return 0
}
in_debootstrap() {
# debootstrap --second-stage may be run in an emulator instead of a chroot,
# we need to check for this special case because start-stop-daemon would
# not be available. (#520742)
if [ -d /debootstrap/ ]; then
echo "Being installed by debootstrap, udev not started."
return 0
fi
return 1
}
restart_udevd() {
start-stop-daemon --stop --name udevd --oknodo --quiet --retry 5
local rc=0
udevd --daemon || rc=$?
if [ $rc -ne 0 ]; then
echo "Cannot start udevd. (rc=$rc)"
return $rc
fi
}
can_start_udevd() {
if ! supported_kernel; then
echo "udev requires a kernel >= 2.6.26, not started."
return 1
fi
if [ ! -d /sys/class/ ]; then
echo "udev requires a mounted sysfs, not started."
return 1
fi
if [ ! -e /sys/kernel/uevent_helper ]; then
echo "udev requires hotplug support, not started."
return 1
fi
if ! grep -q '[[:space:]]tmpfs$' /proc/filesystems; then
echo "udev requires tmpfs support, not started."
return 1
fi
if [ -e /etc/udev/disabled ]; then
echo "/etc/udev/disabled has been detected, udev not started."
return 1
fi
return 0
}
enable_udev() {
can_start_udevd || return 0
echo > /sys/kernel/uevent_helper
# create the directory which will hold our new /dev
TEMPDEV=$(tempdir)
export UDEV_ROOT=$TEMPDEV
UDEV_RUN=no restart_udevd
if ! mount -n -o size=10M,mode=0755 -t tmpfs tmpfs $TEMPDEV; then
echo "Not enabling udev because the system lacks tmpfs support!"
rm -f $TEMPDEV/.udev/uevent_seqnum
rmdir $TEMPDEV/.udev/ 2> /dev/null || true
return
fi
echo "Populating the new /dev filesystem temporarily mounted on $TEMPDEV/..."
/lib/udev/create_static_nodes $TEMPDEV
udevadm trigger --action=add
# wait for the udevd children to finish
udevadm settle || true
for dir in pts shm; do
[ -d /dev/$dir ] || continue
mkdir -p $TEMPDEV/$dir
if mountpoint -q /dev/$dir; then
mount -n --move /dev/$dir $TEMPDEV/$dir
fi
done
mount -n --move $TEMPDEV /dev
# start the final daemon with the normal configuration
unset UDEV_ROOT
restart_udevd
# XXX Some people reported that the directory was not empty.
# This should fix the issue (udevd reopens the file for each event):
rm -f $TEMPDEV/.udev/uevent_seqnum
rmdir $TEMPDEV/.udev/ 2> /dev/null || true
if ! rmdir $TEMPDEV; then
echo "WARNING: $TEMPDEV is not empty!"
ls -laR $TEMPDEV
fi
# restart some daemons because their /dev sockets have been hidden by
# the tmpfs
kill -s HUP 1
local sysloginits="inetutils-syslogd rsyslog socklog-run sysklogd syslog-ng"
for script in $sysloginits; do
[ -x /etc/init.d/$script ] && invoke-rc.d $script restart || true
done
}
update_initramfs() {
[ -x /usr/sbin/update-initramfs -a -e /etc/initramfs-tools/initramfs.conf ] \
|| return 0
update-initramfs -u
}
write_interfaces_rules() {
local devpath
for devpath in /sys/class/net/*; do
[ -d "$devpath" ] || continue
udevadm test --action=add $devpath > /dev/null || true
done
}
fix_persistent_net_rules() {
if [ -e /etc/udev/rules.d/70-persistent-net.rules ]; then
sed -i -e 's/\bATTRS{/ATTR{/g' /etc/udev/rules.d/70-persistent-net.rules
fi
}
upgrade_fixes() {
if dpkg --compare-versions "$2" lt "140-2"; then
fix_persistent_net_rules
fi
}
case "$1" in
configure)
if [ -z "$2" ]; then # first install
write_interfaces_rules
if ! chrooted && ! in_debootstrap; then
enable_udev
fi
else # upgrades
upgrade_fixes "$@"
if ! chrooted; then
if [ -e /etc/udev/kernel-upgrade ]; then
echo "Kernel upgrade mode, udevd has not been restarted."
echo "Please reboot the system as soon as possible."
rm /etc/udev/kernel-upgrade
elif can_start_udevd; then
restart_udevd
fi
fi
fi
update_initramfs
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
interfaces)
write_interfaces_rules
;;
*)
echo "$0 called with unknown argument '$1'" >&2
exit 1
;;
esac
#DEBHELPER#
|