| #!/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}" |