From 0ba253ef6926d2f8bf403f9b96ca9120d0022861 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 25 Mar 2017 13:22:03 +0200 Subject: Configure storage --- init | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 96 insertions(+), 7 deletions(-) (limited to 'init') diff --git a/init b/init index a725372..80bab77 100755 --- a/init +++ b/init @@ -11,9 +11,23 @@ set -o errtrace # Trap in functions. # Note: diagnostics goes to stdout. # function info () { echo "$*"; } -function error () { info "$*"; exit 1; } +function error () +{ + if [ "$#" -gt 0 ]; then + info "$*"; + fi -export PATH=/sbin:/usr/sbin:/bin:/usr/bin + # The setsid voodoo (take from Debian init's panic()) is to enable job + # control. + # + info "type Ctrl-D to exit shell and reboot" + setsid /bin/bash -c "exec /bin/bash -i <>/dev/tty1 1>&0 2>&1" + reboot +} + +# Some pre-systemd utilities (like reboot) come from klibc-utils. +# +export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/lib/klibc/bin/ # One would expect rootflags=size=1g to work but it doesn't (perhaps init # is expected to interpret it)? @@ -100,6 +114,7 @@ eth_all="$(cd /sys/class/net && ls -d en?*)" if [ -z "$eth_all" ]; then info "no ethernet interfaces found among:" ip link show + error fi eth= @@ -152,13 +167,15 @@ for s in 1 2 4 8; do done if [ -z "$eth_up" ]; then - error "no ethernet interfaces with carrier among:" + info "no ethernet interfaces with carrier among:" ip link show + error fi if [ -z "$eth" ]; then - error "no ethernet interfaces with DHCP among:" + info "no ethernet interfaces with DHCP among:" ip link show + error fi mac="$(cat "/sys/class/net/$eth/address")" @@ -182,7 +199,7 @@ info "hostname $hname" # based on what we have discovered and then let the systemd networking bringup # to configure everything (at which point we will hopefully reuse the lease). # -dhclient -q -x +dhclient -x 2>/dev/null # @@ Need to be make configurable. # @@ -236,15 +253,85 @@ sed -r -i \ -e "s%^(relayhost).*%\1 = $smtp_relay%" \ /etc/postfix/main.cf -# Make admin alias for buildos.admin_email, redirect root to admin. +# Make admin alias for buildos.admin_email, alias root as admin. # cat <>/etc/aliases admin: $admin_email root: admin EOF - newaliases +# Figure out disk configuration and generate the corresponding /etc/fstab. +# +fstab=/etc/fstab +#fstab=/dev/stdout + +echo -n '' >$fstab + +l= +machines= +while read l || [ -n "$l" ]; do + d="$(sed -re 's/.*NAME=\"([^\"]+)\".*/\1/' <<<"$l")" + t="$(sed -re 's/.*FSTYPE=\"([^\"]*)\".*/\1/' <<<"$l")" + l="$(sed -re 's/.*LABEL=\"([^\"]*)\".*/\1/' <<<"$l")" + + # Strip the buildos. prefix from the label. If the result is empty then + # this disk/patition hasn't been labeled for use by buildos. + # + l="$(sed -n -re 's/^buildos\.([^ ]+)$/\1/p' <<<"$l")" + + if [ -z "$l" ]; then + continue + fi + + # Handle buildos.machines and buildos.machines.* mounts. + # + if [[ "$l" == "machines" ]] || [[ "$l" =~ "machines.".+ ]]; then + + if [ "$t" != "btrfs" ]; then + error "non-btrfs filesystem on $d labeled with buildos.machines" + fi + + if [ "$l" = "machines" ]; then + # Single mount. + # + if [ -n "$machines" ]; then + error "multiple disks labeled with buildos.machines/machines.*" + fi + + m=/build/machines + machines="single" + else + # Multiple mounts. + # + if [ "$machines" = "single" ]; then + error "multiple disks labeled with buildos.machines/machines.*" + fi + + n="$(sed -n -re 's/^machines\.([^ ]+)$/\1/p' <<<"$l")" + m="/build/machines/$n" + machines="multiple" + fi + + info "mounting $d (buildos.$l) on $m" + + echo mkdir -p "$m" + o="defaults,noatime,nodiratime,user_subvol_rm_allowed" + echo "$d $m btrfs $o 0 0" >>$fstab + fi +done < <(lsblk --pairs --paths --output NAME,FSTYPE,LABEL) +#done </etc/systemd/system/getty@tty1.service.d/noclear.conf TTYVTDisallocate=no EOF +export PATH=/sbin:/usr/sbin:/bin:/usr/bin + exec /lib/systemd/systemd \ --show-status=1 \ --machine-id="00000000000000000000$mid" \ -- cgit v1.1