#!/bin/bash # Init script for build2 buildos. # # Loosely based on the one that comes in Debian initrd.img (since we are # using its kernel image as is). # trap "exit 1" ERR set -o errtrace # Trap in functions. # Note: diagnostics goes to stdout. # function info () { echo "$*"; } function error () { info "$*"; exit 1; } export PATH=/sbin:/usr/sbin:/bin:/usr/bin # One would expect rootflags=size=1g to work but it doesn't (perhaps init # is expected to interpret it)? # mount -o remount,size=1G / mkdir -p /sys /proc mount -t sysfs -o nodev,noexec,nosuid sysfs /sys mount -t proc -o nodev,noexec,nosuid proc /proc info "init starting up..." mount -t devtmpfs -o nosuid,mode=0755 udev /dev mkdir -p /dev/pts mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true mkdir -p /run mount -t tmpfs -o "noexec,nosuid,size=10%,mode=0755" tmpfs /run mkdir -p /tmp mount -t tmpfs -o "nodev,nosuid,size=10%,mode=1777" tmpfs /tmp # Start udev. # # Based on Debian initrd's init-top/udev. Note that we don't stop it at # at the end of init. # info "starting udev..." if [ -w /sys/kernel/uevent_helper ]; then echo >/sys/kernel/uevent_helper fi SYSTEMD_LOG_LEVEL=info /lib/systemd/systemd-udevd --daemon --resolve-names=never udevadm trigger --action=add udevadm settle || true # Parse command line. # cmdline="$(cat /proc/cmdline)" info "boot cmdline: $cmdline" # Figure out network configuration and generate the corresponding # /etc/network/interfaces. # info "starting network..." # We are using udev's predictable interface names. The two character prefixes # based on the type of interface: # # en -- ethernet # sl -- serial line IP (slip) # wl -- wlan # ww -- wwan # eth_all="$(cd /sys/class/net && ls -d en?*)" if [ -z "$eth_all" ]; then info "no ethernet interfaces found among:" ip link show fi eth= eth_up= for s in 1 2 4 8; do # Try to bring them all up and find the one that has carrier. # for i in $eth_all; do ip link set "$i" up || true done sleep "$s" for i in $eth_all; do if [ "$(cat "/sys/class/net/$i/carrier")" -eq "1" ]; then info "detected carrier on $i" eth_up+=" $i" fi done # Bring them all down. # for i in $eth_all; do ip link set "$i" down || true done # If we didn't find anything, try to wait for carrier longer. # if [ -z "$eth_up" ]; then continue fi # If we end up with several interfaces we simply unleash dhcp on all of # them and use the first that gets configured. # # Note also that it's possible the interface that we want is not yet ready # in which case we will try to wait for carrier a bit longer. # for i in $eth_up; do if dhclient -v "$i"; then eth="$i" break fi done if [ -n "$eth" ]; then break fi done if [ -z "$eth_up" ]; then error "no ethernet interfaces with carrier among:" ip link show fi if [ -z "$eth" ]; then error "no ethernet interfaces with DHCP among:" ip link show fi mac="$(cat "/sys/class/net/$eth/address")" info "configured $eth ($mac)" # Set the hostname. # hname="$(hostname)" if [ "$hname" = "(none)" ]; then hname="build-$(sed -e 's/://g' <<<"$mac")" hostname "$hname" fi echo "$hname" >/etc/hostname info "hostname $hname" # --machine-id # #exec /lib/systemd/systemd #/dev/console 2>&1 exec /bin/bash