summaryrefslogtreecommitdiff
path: root/files/initramfs-scripts/init
blob: d1d1042ba83fe98de11e7adf048e271159e2ad9b (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
#!/bin/sh
trap 'exec /bin/sh' INT EXIT

# We need proc for reading the kernel command line
mount -n -t proc none /proc

set -- $(cat /proc/cmdline)

# We don't want to leave mount points around
umount /proc

rootwait=true # defaults to off in the kernel, I think it's more useful on
for arg; do
    case "$arg" in
    root=LABEL=*)
        if [ x"$root_type" != x ]; then
            echo "Warning, multiple root= specified, using latest."
        fi
        root_type=label
        root="${arg#root=LABEL=}"
        ;;
    root=UUID=*)
        if [ x"$root_type" != x ]; then
            echo "Warning, multiple root= specified, using latest."
        fi
        root_type=uuid
        root="${arg#root=UUID=}"
        ;;
    root=*)
        if [ x"$root_type" != x ]; then
            echo "Warning, multiple root= specified, using latest."
        fi
        root_type=disk
        root="${arg#root=}"
        ;;
    rootflags=*)
        if [ x"$rootflags" != x ]; then
            echo "Warning, multiple rootflags= specified, using latest."
        fi
        rootflags=",${arg#rootflags=}"
        ;;
    rootfstype=*)
        if [ x"$rootfstype" != x ]; then
            echo "Warning, multiple rootfstype= specified, using latest."
        fi
        rootfstype="${arg#rootfstype=}"
        ;;
    rootdelay=*)
        if [ x"$rootdelay" != x ]; then
            echo "Warning, multiple rootdelay= specified, using latest."
        fi
        rootdelay="${arg#rootdelay=}"
        ;;
    rootwait)
        rootwait=true
        ;;
    norootwait)
        rootwait=false
        ;;
    ro)
        ro=ro
        ;;
    rw)
        ro=rw
        ;;
    init=*)
        init="${arg#init=}"
        ;;
    esac
done


if [ x"$rootdelay" != x ]; then
    sleep "$rootdelay"
fi

if [ x"$rootfstype" = x ]; then
    # Warn that busybox may not be able to auto-detect rootfs type
    cat <<\EOF
Warning, rootfs type not specified, auto-detection of type is slow and
may fail. Please add rootfstype=$type to kernel command line.
EOF
fi

mount -n -t devtmpfs devtmpfs /dev

while true; do
    case "$root_type" in
    disk)
        if mount -n -t "${rootfstype}" -o "${ro-rw}""$rootflags" "$root" /mnt; then
            break
        else
            echo disk $root not found
            blkid
        fi
        ;;
    label)
        disk="$(findfs LABEL="$root")"
        if [ x"$disk" = x ]; then
            echo disk with label $root not found
            blkid
        else
            mount -n -t "${rootfstype}" -o "${ro-rw}""$rootflags" "$disk" /mnt && break
        fi
        ;;
    uuid)
        disk="$(findfs UUID="$root")"
        if [ x"$disk" = x ]; then
            echo disk with UUID $root not found
            blkid
        else
            mount -n -t "${rootfstype}" -o "${ro-rw}""$rootflags" "$disk" /mnt && break
        fi
        ;;
    '')
        echo "Error, no root specified"
        exit 1
        ;;
    esac
    if "$rootwait"; then
        echo Trying again in 0.5 seconds
        sleep 0.5
    fi
done
umount -n /dev

# We dont create any static device nodes while building,
# device nodes will be created by systemd but before that
# we at least need the console
mknod -m 0600 /mnt/dev/console c 5 1

exec switch_root -c /dev/console /mnt "${init-/sbin/init}"