X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=meta-netboot%2Frecipes-core%2Finitramfs-netboot%2Ffiles%2Finit.sh;h=50d62472a9394bb0cebe5174b415d33a7c2c8538;hb=2ed82aa378099d18db268c146d9a53756c5f2890;hp=dae9a85cb596cee509398b5412ec053f7b07959c;hpb=56b1139ef2660535b112d0be4ddb2806f75298a8;p=AGL%2Fmeta-agl.git diff --git a/meta-netboot/recipes-core/initramfs-netboot/files/init.sh b/meta-netboot/recipes-core/initramfs-netboot/files/init.sh index dae9a85cb..50d62472a 100644 --- a/meta-netboot/recipes-core/initramfs-netboot/files/init.sh +++ b/meta-netboot/recipes-core/initramfs-netboot/files/init.sh @@ -25,6 +25,7 @@ SMACK=n NBD_SERVER= NBD_PORT=10809 NBD_DEV=/dev/nbd0 +NBD_NAMEV3= DEBUG=n # ------------------------------------------- @@ -56,6 +57,29 @@ check_debug() { esac } +find_active_interface() { + [[ ! -d /sys/class/net ]] && { log_error "find_active_interface: /sys/class/net doesn't exist"; return 2; } + local iface + for x in $(ls -d /sys/class/net/* 2>/dev/null); do + iface=$(basename $x) + # find interfaces with: + # - type == 1 (ethernet) + # - not wireless + # - with state up + + [[ $(cat $x/type) != 1 ]] && continue + [[ -d $x/wireless ]] && continue + [[ $(cat $x/operstate) != "up" ]] && continue + + log_info "find_active_interface: first active interface is $iface" + echo $iface + return 0 + done + + log_error "Unable to find any active network interface." + return 1 +} + # ------------------------------------------- export PATH=/sbin:/usr/sbin:/bin:/usr/bin @@ -76,6 +100,7 @@ for x in $(cat /proc/cmdline); do nbd.server=*) NBD_SERVER=${x/*=/};; nbd.port=*) NBD_PORT=${x/*=/};; nbd.dev=*) NBD_DEV=/dev/${x/*=/};; + nbd.namev3=*) NBD_NAMEV3=${x/*=/};; nbd.debug=*) DEBUG=${x/*=/};; esac done @@ -99,8 +124,13 @@ grep -q smackfs /proc/filesystems && { try=5 while :;do log_info "Starting NBD client" - nbd-client $NBD_SERVER $NBD_PORT $NBD_DEV && { log_info "NBD client successfully started"; break; } - log_info "NBD client failed" + if [ -z "${NBD_NAMEV3}" ]; then + nbd-client $NBD_SERVER $NBD_PORT $NBD_DEV && { log_info "NBD client successfully started"; break; } + log_info "NBD client failed" + else + nbd3-client $NBD_SERVER $NBD_DEV --name $NBD_NAMEV3 && { log_info "NBD3 client successfully started"; break; } + log_info "NBDv3 client failed" + fi [[ $try -gt 0 ]] && { log_info "Retrying ($try trie(s) left)..."; sleep 3; try=$(( try - 1 )); continue; } bail_out "Unable to mount NBD device $NBD_DEV using server $NBD_SERVER:$NBD_PORT" @@ -108,7 +138,7 @@ done # mount NBD device mkdir -p /sysroot -mount $NBD_DEV /sysroot || bail_out "Unable to mount root NBD device" +mount $NBD_DEV -o noatime /sysroot || bail_out "Unable to mount root NBD device" # move mounted devices to new root cd /sysroot @@ -119,16 +149,29 @@ done # switch to new rootfs log_info "Switching to new rootfs" -mkdir -p run/initramfs -pivot_root . run/initramfs || bail_out "pivot_root failed." +mkdir -p boot/initramfs +pivot_root . boot/initramfs || bail_out "pivot_root failed." -# workaround for connman (avoid bringing down the network interface used for booting) +# workaround for connman (avoid bringing down the network interface used for booting, disable DNS proxy) if [[ -f /lib/systemd/system/connman.service ]]; then - log_info "Adjusting Connman configuration" - iface=$(ip -o link show up | tr ':' ' ' | awk '{print $2}' | grep -v -e "^lo$" | head -1) - sed -i "s|connmand -n\$|connmand -n -I $iface|g" /lib/systemd/system/connman.service + newopts="-r -n" + iface=$(find_active_interface) + [[ -n "$iface" ]] && newopts="$newopts -I $iface" + + log_info "Adjusting Connman command line. Will be: 'connmand $newopts'" + sed -i "s|connmand -n\$|connmand $newopts|g" /lib/systemd/system/connman.service fi +# also use /proc/net/pnp to generate /etc/resolv.conf +rm -f /etc/resolv.conf +grep -v bootserver /proc/net/pnp | sed 's/^domain/search/g' >/etc/resolv.conf +chsmack -A /etc/resolv.conf + +# unmount tmp and run to let systemd remount them with correct smack labels (SPEC-2596) +log_info "Unmounting /tmp and /run" +umount /tmp +umount /run + # finally, run systemd check_debug "Debug point 2. Exit to continue initrd script (run systemd)."