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 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
|
#!/bin/sh -e
make_extra_nodes() {
if [ "$(echo /lib/udev/devices/*)" != "/lib/udev/devices/*" ]; then
cp --archive --update /lib/udev/devices/* /$1/
fi
[ -e /etc/udev/links.conf ] || return 0
grep '^[^#]' /etc/udev/links.conf | \
while read type name arg1; do
[ "$type" -a "$name" -a ! -e "/$1/$name" -a ! -L "/$1/$name" ] ||continue
case "$type" in
L) ln -s $arg1 /$1/$name ;;
D) mkdir -p /$1/$name ;;
M) mknod -m 600 /$1/$name $arg1 ;;
*) echo "links.conf: unparseable line ($type $name $arg1)" ;;
esac
done
}
supported_kernel() {
case "$(uname -r)" in
2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;;
2.6.1[0-4]|2.6.1[0-4][!0-9]*) return 1 ;;
esac
return 0
}
# create a default symlink if the directory exists and is empty
create_rules_symlink() {
cd /etc/udev/rules.d/ || return 0
# stop if one of the links already exists
for file in devfs.rules compat.rules compat-full.rules \
udev.rules 020_permissions.rules z55_hotplug.rules \
z20_persistent-input.rules z45_persistent-net-generator.rules \
z20_persistent.rules z50_run.rules \
z75_cd-aliases-generator.rules; do
[ ! -e $file -a ! -L $file ] || return 0
done
ln -s ../permissions.rules 020_permissions.rules
ln -s ../persistent.rules z20_persistent.rules
ln -s ../persistent-input.rules z20_persistent-input.rules
ln -s ../run.rules z50_run.rules
ln -s ../hotplug.rules z55_hotplug.rules
ln -s ../cd-aliases-generator.rules z75_cd-aliases-generator.rules
if [ "$(dpkg --print-architecture)" != s390 ]; then
ln -s ../persistent-net-generator.rules z45_persistent-net-generator.rules
fi
if [ -c /dev/.devfsd -o -c /dev/vc/1 ]; then
# not perfect, but a good enough heuristic
if [ -e /dev/tty1 ]; then
ln -s ../devfs.rules ../compat-full.rules .
else
ln -s ../devfs.rules ../compat.rules .
fi
else
ln -s ../udev.rules .
fi
}
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
}
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.15, not started."
return 1
fi
if [ ! -d /sys/class/ ]; then
echo "udev requires a mounted sysfs, not started."
return 1
fi
if [ ! -e /proc/sys/kernel/hotplug ]; 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 > /proc/sys/kernel/hotplug
# 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/..."
mkdir -p $TEMPDEV/.udev/db/ $TEMPDEV/.udev/queue/
make_extra_nodes $TEMPDEV
udevtrigger
# make symlinks to the sockets and pipes on the old /dev
find /dev -type s -o -type p | sed "s@/dev/@@" | \
while read file; do
local dir="${file%/*}"
if [ "$dir" != "$file" ]; then
mkdir -p "$TEMPDEV/$dir"
fi
ln -s "/dev/.static/dev/$file" "$TEMPDEV/$file"
done
# the directory may not be present on systems which had devfs installed
[ -d /dev/shm/ ] || mkdir /dev/shm/
# wait for the udevd childs to finish
udevsettle || true
# -n is used because mount gets very confused by --bind (see #282205)
for dir in pts shm; do
[ -d /dev/$dir ] || continue
mount -n --bind /dev/$dir $TEMPDEV/$dir
done
mkdir -p $TEMPDEV/.static/dev/
chmod 700 $TEMPDEV/.static/
mount -n --bind /dev/ $TEMPDEV/.static/dev/
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
# try anyway to restart syslogd because /dev/.static/dev/ is not
# accessible by unprivileged users and the real /dev/log is still there
local sysloginits="inetutils-syslogd metalog 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
}
case "$1" in
configure)
if [ -z "$2" ]; then # first install
create_rules_symlink
/lib/udev/write_net_rules all_interfaces
if ! chrooted; then
enable_udev
fi
else # upgrades
if [ -e /etc/udev/run-write_net_rules ]; then
[ -e /etc/udev/rules.d/z25_persistent-net.rules ] ||
/lib/udev/write_net_rules all_interfaces
rm /etc/udev/run-write_net_rules
fi
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)
;;
*)
echo "$0 called with unknown argument '$1'" >&2
exit 1
;;
esac
#DEBHELPER#
|