]> git.pld-linux.org Git - projects/geninitrd.git/blame - functions
- Jacek Konieczny's geninitrd-rootdev.patch applied
[projects/geninitrd.git] / functions
CommitLineData
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#
15find_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
76dm_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}
This page took 0.033994 seconds and 4 git commands to generate.