]>
Commit | Line | Data |
---|---|---|
1cea325b ER |
1 | #!/bin/sh |
2 | # | |
3 | # geninitrd functions | |
4 | ||
5 | # Find root device from fstab. | |
6 | # | |
7 | # @param string $fstab location of /etc/fstab | |
1cea325b ER |
8 | # @return false on failure |
9 | # | |
10 | # Sets global variables: | |
11 | # - $rootdev | |
5101a385 | 12 | # - $rootdev_add |
1cea325b ER |
13 | # - $rootFS |
14 | # | |
15 | find_root() { | |
16 | local fstab="$1" | |
ca2c2012 | 17 | local function="${PROGRAM:+$PROGRAM: }find_root" |
5101a385 | 18 | local rootopt |
1cea325b | 19 | |
5101a385 | 20 | eval $(awk '/^[\t ]*#/ {next} {if ( $2 == "/" ) {print "rootdev=\"" $1 "\"\nrootFs=\"" $3 "\"\nrootopt=\"" $4 "\""}}' $fstab) |
1cea325b ER |
21 | if [ -z "$rootdev" ]; then |
22 | echo >&2 "$function: can't find real device for rootfs" | |
23 | return 1 | |
24 | fi | |
25 | ||
5101a385 AM |
26 | # additional devices needed (xfs logdev) |
27 | rootdev_add=$(echo "$rootopt" | awk -F',' '{ for (i=1; i<=NF; i++) { if ($i ~ /^logdev=/) { gsub(/^logdev=/, NIL, $i); print $i; } } }') | |
28 | ||
1cea325b ER |
29 | case $rootdev in |
30 | LABEL=*) | |
31 | if [ ! -x /sbin/blkid ]; then | |
32 | echo >&2 "$function: /sbin/blkid is missing" | |
33 | return 2 | |
34 | fi | |
35 | ||
36 | local label=${rootdev#"LABEL="} | |
37 | local dev=$(/sbin/blkid -t LABEL="$label" -o device) | |
38 | if [ "$dev" -a -r "$dev" ]; then | |
39 | rootdev=$dev | |
40 | fi | |
41 | ;; | |
42 | ||
43 | UUID=*) | |
44 | if [ ! -x /sbin/blkid ]; then | |
45 | echo >&2 "$function: /sbin/blkid is missing" | |
46 | return 2 | |
47 | fi | |
48 | ||
49 | local uuid=${rootdev#"UUID="} | |
50 | local dev=$(/sbin/blkid -t UUID="$uuid" -o device) | |
51 | ||
52 | if [ "$dev" -a -r "$dev" ]; then | |
53 | rootdev=$dev | |
54 | fi | |
55 | ;; | |
56 | esac | |
57 | ||
b6c4aab1 ER |
58 | if [[ "$rootdev" = /dev/dm-* ]]; then |
59 | local node | |
60 | node=$(dm_lvm2_name "$rootdev") || exit | |
61 | if [ "$node" ]; then | |
62 | rootdev="$node" | |
63 | fi | |
64 | fi | |
65 | ||
1cea325b ER |
66 | if [ ! -r "$rootdev" ]; then |
67 | echo >&2 "$function: can't find real device for $rootdev" | |
68 | return 1 | |
69 | fi | |
70 | ||
71 | return 0 | |
72 | } | |
b6c4aab1 ER |
73 | |
74 | # resolve /dev/dm-0 to lvm2 node | |
dc006e4d | 75 | # which they got from blkid program fs was specifed as UUID= in fstab |
b6c4aab1 ER |
76 | dm_lvm2_name() { |
77 | local node="$1" | |
78 | ||
79 | # redirect output to tmpfile so we won't get subshell | |
80 | local tmp ret | |
81 | tmp=$(mktemp) || exit | |
82 | ||
83 | /sbin/lvdisplay -c 2>/dev/null | awk -F: '{print $1}' > $tmp | |
84 | while read dev; do | |
85 | count=$(ls -Ll $dev $node | awk '{print $5, $6}' | sort -u | wc -l) | |
86 | if [ "$count" = 1 ]; then | |
87 | ret="$dev" | |
88 | break | |
89 | fi | |
90 | done < $tmp | |
91 | rm -f $tmp | |
92 | ||
93 | if [ -z "$ret" ]; then | |
94 | ret=$node | |
95 | fi | |
96 | echo "$ret" | |
97 | } |