blob: 03c38fd56b4dc37690c425f194574f5abe297e30 (
plain)
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
|
#! /bin/sh
#
# start_udev
# script to initialize /dev by using udev.
#
# Modified for Archlinux by Tobias Powalowski <tpowa@archlinux.org>
#
# Inspired by:
#
# Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
#
# Released under the GPL v2 only.
#
# This needs to be run at the earliest possible point in the boot
# process.
#
# Based on the udev init.d script
#
# Thanks go out to the Gentoo developers for proving
# that this is possible to do.
#
# Yes, it's very verbose, feel free to turn off all of the echo calls,
# they were there to make me feel better that everything was working
# properly during development...
#
prog=udev
sysfs_dir=/sys
bin=/sbin/udev
udevd=/sbin/udevd
udev_root="/dev"
starttime=$(date +%s)
function trigger_builtin_events() {
list="$(echo /sys/class/tty/ttyS*/uevent)"
for i in $list; do
case "$i" in
*/class/uevent|*\**)
continue
;;
*/class/tty/ttyS*)
echo "add" > "$i"
;;
esac
done
}
function trigger_device_events() {
/sbin/udevtrigger
}
function wait_for_queue() {
# loop=20
# while ! [ "$loop" -gt 0 -a -d /dev/.udev/queue ]; do
# sleep 0.1;
# loop=$(($loop - 1))
# done
/sbin/udevsettle
}
make_extra_nodes () {
# there are a few things that sysfs does not export for us.
# these things go here (and remember to remove them in
# remove_extra_nodes()
#
# Thanks to Gentoo for the initial list of these.
ln -snf /proc/self/fd $udev_root/fd
ln -snf /proc/self/fd/0 $udev_root/stdin
ln -snf /proc/self/fd/1 $udev_root/stdout
ln -snf /proc/self/fd/2 $udev_root/stderr
ln -snf /proc/kcore $udev_root/core
mkdir $udev_root/pts
mkdir $udev_root/shm
}
udev_init () {
# don't use udev if sysfs is not mounted.
if [ ! -d $sysfs_dir/block ]; then
exit 1
fi
echo "mounting... ramfs at $udev_root"
mount -n -t ramfs none $udev_root
# propogate /udev from /sys
echo "Creating initial udev device nodes:"
#echo "making extra nodes"
make_extra_nodes
# check if udevd is already running
if [ `pidof -o %PPID /sbin/udevd` ]; then
grep -v "/dev/shm" /etc/mtab | grep -v "/dev/pts" > /etc/mtab
mount /dev/pts
mount /dev/shm
else
echo "start udev daemon"
/sbin/udevd --daemon
fi
case "$(uname -r)" in
2.6.[0-9]|2.6.[0-9][!0-9]*) ;;
*) if [ -f "/sys/class/tty/console/uevent" ]; then
echo "Kernel >= 2.6.15 and supports uevents"
# trigger the sorted events
echo -e '\000\000\000\000' > /proc/sys/kernel/hotplug
# catch events that are real fast
mkdir -p /dev/.udev/queue
trigger_builtin_events
else
# for older kernels without uevents will be removed when udevstart dies in udev
echo "Kernel does not support uevents, you need a kernel >= 2.6.15!"
exit 1
fi
;;
esac
}
udev_uevents () {
# configure all devices
trigger_device_events
# until we know how to do better, just wait for _all_ events to finish
wait_for_queue
}
if [ $# -eq 0 ]; then
udev_init
udev_uevents
fi
[ "$1" = "init" ] && udev_init
[ "$1" = "uevents" ] && udev_uevents
echo "udev startup is finished! - time = $(( `date +%s` - $starttime ))"
exit 0
|