]> git.pld-linux.org Git - projects/geninitrd.git/blob - mod-udev.sh
Timeout here is not a good idea. rootfs cannot be mounted and kernel oopses due to...
[projects/geninitrd.git] / mod-udev.sh
1 #!/bin/sh
2 # geninitrd mod: udev
3 USE_UDEV=${USE_UDEV:-yes}
4
5 #
6 # TODO:
7 # - make udev start before insmods
8 # - make proper use of USE_UDEV - don't copy rules if USE_UDEV is off no!
9
10 inst_rules() {
11         local _rule _found d
12
13         inst_d "/lib/udev/rules.d"
14         for _rule in "$@"; do
15                 for d in /lib/udev/rules.d /etc/udev/rules.d /lib/geninitrd/udev-rules; do
16                         if [ -f $d/$_rule ]; then
17                                 inst $d/$_rule /lib/udev/rules.d/$_rule
18                         fi
19                 done
20         done
21
22 }
23
24 # setup geninitrd module
25 # @access       public
26 setup_mod_udev() {
27         udevd=$(find_tool $initrd_dir/udevd /sbin/initrd-udevd)
28         udevadm=$(find_tool $initrd_dir/udevadm /sbin/initrd-udevadm)
29
30         if [ "$kernel_version" -lt "002006" ] || [ ! -x "$udevd" -o ! -x "$udevadm" -o ! -f /etc/udev/udev.conf ]; then
31                 USE_UDEV=no
32         fi
33
34         if is_yes "$USE_UDEV"; then
35                 . /etc/udev/udev.conf
36         fi
37 }
38
39 # generate initrd fragment
40 # @access       public
41 initrd_gen_udev() {
42         verbose "Setting up udev..."
43
44         inst_d /sbin /etc/udev /lib/udev
45         inst_exec $udevd /sbin/udevd
46         inst_exec $udevadm /sbin/udevadm
47         inst /etc/udev/udev.conf /etc/udev/udev.conf
48         # standard udev rules
49         inst_rules 50-udev-default.rules 60-persistent-storage.rules 61-persistent-storage-edd.rules 80-drivers.rules 95-udev-late.rules \
50                 60-pcmcia.rules 50-firmware.rules 10-dm.rules 11-dm-lvm.rules 13-dm-disk.rules 95-dm-notify.rules
51         # initrd dedicated rules
52         inst_rules 01-ignore.rules 59-persistent-storage.rules 61-persistent-storage.rules 11-dm.rules
53
54         local e
55         for e in ata_id cdrom_id collect firmware scsi_id v4l_id; do
56                 if [ -e "$initrd_dir/udev/$e" ]; then
57                         inst_exec $initrd_dir/udev/$e /lib/udev/$e
58                 elif [ -e "/lib/udev/$e" ]; then
59                         inst_exec /lib/udev/$e /lib/udev/$e
60                 fi
61         done
62
63         # basic group file
64         local _lib
65         inst /etc/nsswitch.conf /etc/nsswitch.conf
66         for _lib in $(get_libdir LIBDIR); do
67                 if (ls /$_lib/libnss_files*.so* > /dev/null 2>&1); then
68                         inst_exec /$_lib/libnss_files*.so* /$_lib/
69                 fi
70         done
71         awk -F: ' { if ($3 < 1000) { print $1":"$2":"$3":" } } ' /etc/group > $DESTDIR/etc/group
72
73         # blkid installed by mod-blkid
74         if ! is_yes "$USE_BLKID"; then
75                 warn "BLKID support missing"
76         fi
77
78         local dir dmsetup
79         for dir in $initrd_dir /sbin; do
80                 if [ -x "$dir/dmsetup" ] &&
81                         [ "$($dir/dmsetup udevcookies 2>&1 | grep -c 'Command not supported')" -eq 0 ]; then
82                         dmsetup=$dir/dmsetup
83                         break
84                 fi
85         done
86         if [ -z "$dmsetup" ]; then
87                 warn "Can't find dmsetup with udev support"
88         else
89                 inst_exec $dmsetup /sbin/dmsetup
90         fi
91
92         mount_dev
93         mount_sys
94         mount_run
95         add_linuxrc <<-'EOF'
96                 : 'Starting udev'
97                 mkdir /run/udev
98                 /sbin/udevd --daemon
99                 /sbin/udevadm trigger --type=subsystems --action=add
100                 /sbin/udevadm trigger --type=devices --action=add
101                 /sbin/udevadm settle
102         EOF
103 }
104
105 initrd_gen_stop_udevd() {
106         if ! is_yes "$USE_UDEV"; then
107                 return
108         fi
109         add_linuxrc     <<-'EOF'
110                 /sbin/udevadm control --exit
111                 /sbin/udevadm info --cleanup-db
112         EOF
113 }
114
115 # generate initrd fragment
116 # @access       public
117 initrd_gen_mdev() {
118         debug "Setting up mdev..."
119
120         busybox_applet mdev uevent
121         ln -s busybox $DESTDIR/bin/mdev
122         ln -s busybox $DESTDIR/bin/uevent
123
124         cat > $DESTDIR/etc/mdev.conf    <<-'EOF'
125 # Provide user, group, and mode information for devices.  If a regex matches
126 # the device name provided by sysfs, use the appropriate user:group and mode
127 # instead of the default 0:0 660.
128 #
129 # Syntax:
130 # %s %d:%d %s
131 # devicename_regex user:group mode
132
133 null            0:0 666
134 zero            0:0 666
135 random          0:0 666
136 urandom         0:0 666
137
138 kmsg            0:0 644
139 kmem            0:9 000
140 mem             0:9 640
141 port            0:9 640
142
143 snapshot        0:0 600
144
145 console         0:5 600
146 ptmx            0:5 666
147 tty[0-9]*       0:5 600
148
149 ttyS[0-9]*      0:16 660
150
151 fd[0-9]*        0:19 660
152
153 sd[a-z]*        0:6 660
154 hd[a-z]*        0:6 660
155         EOF
156
157         mount_dev
158         mount_sys
159         mount_run
160         add_linuxrc     <<-'EOF'
161                 # \n needed in mdev.seq
162                 echo > /dev/mdev.seq
163                 uevent mdev &
164                 mdev -s
165         EOF
166 }
167
168 initrd_gen_stop_mdev() {
169         add_linuxrc     <<-'EOF'
170                 killall uevent > /dev/null 2>&1
171         EOF
172 }
This page took 0.395155 seconds and 3 git commands to generate.