From 6b566244453b2e716d0ebdfd817c100662b33d7b Mon Sep 17 00:00:00 2001 From: Arne Fitzenreiter Date: Thu, 12 Apr 2018 16:21:20 +0200 Subject: [PATCH] flash-images: merge normal and scon to one image. Signed-off-by: Arne Fitzenreiter --- config/flash-images/grub/11_linux_scon | 243 +++++++++++++++++++++++++ config/u-boot/uEnv.txt | 4 +- lfs/flash-images | 47 ++--- make.sh | 1 - src/initscripts/system/firstsetup | 28 +-- src/initscripts/system/partresize | 16 ++ 6 files changed, 285 insertions(+), 54 deletions(-) create mode 100755 config/flash-images/grub/11_linux_scon diff --git a/config/flash-images/grub/11_linux_scon b/config/flash-images/grub/11_linux_scon new file mode 100755 index 0000000000..df623f4700 --- /dev/null +++ b/config/flash-images/grub/11_linux_scon @@ -0,0 +1,243 @@ +#! /bin/sh +set -e + +# grub-mkconfig helper script. +# Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc. +# +# GRUB is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# GRUB is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GRUB. If not, see . + +prefix="/usr" +exec_prefix="${prefix}" +datarootdir="${prefix}/share" + +. "${datarootdir}/grub/grub-mkconfig_lib" + +export TEXTDOMAIN=grub +export TEXTDOMAINDIR="${datarootdir}/locale" + +CLASS="--class gnu-linux --class gnu --class os" + +if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then + OS=GNU/Linux +else + OS="${GRUB_DISTRIBUTOR} GNU/Linux" + CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1) ${CLASS}" +fi + +# loop-AES arranges things so that /dev/loop/X can be our root device, but +# the initrds that Linux uses don't like that. +case ${GRUB_DEVICE} in + /dev/loop/*|/dev/loop[0-9]) + GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"` + ;; +esac + +if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ + || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ + || uses_abstraction "${GRUB_DEVICE}" lvm; then + LINUX_ROOT_DEVICE=${GRUB_DEVICE} +else + LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} +fi + +GRUBFS="`${grub_probe} --device ${GRUB_DEVICE} --target=fs 2>/dev/null || true`" + +if [ x"$GRUBFS" = x ]; then + GRUBFS="$(stat -f --printf=%T / || true)" +fi + +case x"$GRUBFS" in + xbtrfs) + rootsubvol="`make_system_path_relative_to_its_root /`" + rootsubvol="${rootsubvol#/}" + if [ "x${rootsubvol}" != x ]; then + GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}" + fi;; + xzfs) + rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true` + bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`" + LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs}" + ;; +esac + +title_correction_code= + +linux_entry () +{ + os="$1" + version="$2" + type="$3" + args="$4" + + if [ -z "$boot_device_id" ]; then + boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" + fi + if [ x$type != xsimple ] ; then + case $type in + recovery) + title="$(gettext_printf "%s, with Linux %s (recovery mode)" "${os}" "${version}")" ;; + *) + title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;; + esac + if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then + replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')" + quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)" + title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;" + grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")" + fi + echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/" + else + echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/" + fi + if [ x$type != xrecovery ] ; then + save_default_entry | sed -e "s/^/\t/" + fi + + # Use ELILO's generic "efifb" when it's known to be available. + # FIXME: We need an interface to select vesafb in case efifb can't be used. + if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then + echo " load_video" | sed "s/^/$submenu_indentation/" + if grep -qx "CONFIG_FB_EFI=y" "${config}" 2> /dev/null \ + && grep -qx "CONFIG_VT_HW_CONSOLE_BINDING=y" "${config}" 2> /dev/null; then + echo " set gfxpayload=keep" | sed "s/^/$submenu_indentation/" + fi + else + if [ "x$GRUB_GFXPAYLOAD_LINUX" != xtext ]; then + echo " load_video" | sed "s/^/$submenu_indentation/" + fi + echo " set gfxpayload=$GRUB_GFXPAYLOAD_LINUX" | sed "s/^/$submenu_indentation/" + fi + + echo " insmod gzio" | sed "s/^/$submenu_indentation/" + + if [ x$dirname = x/ ]; then + if [ -z "${prepare_root_cache}" ]; then + prepare_root_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e "s/^/\t/")" + fi + printf '%s\n' "${prepare_root_cache}" | sed "s/^/$submenu_indentation/" + else + if [ -z "${prepare_boot_cache}" ]; then + prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")" + fi + printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/" + fi + message="$(gettext_printf "Loading Linux %s ..." ${version})" + sed "s/^/$submenu_indentation/" << EOF + echo '$message' + linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} +EOF + if test -n "${initrd}" ; then + # TRANSLATORS: ramdisk isn't identifier. Should be translated. + message="$(gettext_printf "Loading initial ramdisk ...")" + sed "s/^/$submenu_indentation/" << EOF + echo '$message' + initrd ${rel_dirname}/${initrd} +EOF + fi + sed "s/^/$submenu_indentation/" << EOF +} +EOF +} + +machine=`uname -m` +case "x$machine" in + xi?86 | xx86_64) + list=`for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do + if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi + done` ;; + *) + list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do + if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi + done` ;; +esac + +case "$machine" in + i?86) GENKERNEL_ARCH="x86" ;; + mips|mips64) GENKERNEL_ARCH="mips" ;; + mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;; + arm*) GENKERNEL_ARCH="arm" ;; + *) GENKERNEL_ARCH="$machine" ;; +esac + +prepare_boot_cache= +prepare_root_cache= +boot_device_id= +title_correction_code= + +# Extra indentation to add to menu entries in a submenu. We're not in a submenu +# yet, so it's empty. In a submenu it will be equal to '\t' (one tab). +submenu_indentation="" + +is_first_entry=true +while [ "x$list" != "x" ] ; do + linux=`version_find_latest $list` + gettext_printf "Found linux image: %s\n" "$linux" >&2 + basename=`basename $linux` + dirname=`dirname $linux` + rel_dirname=`make_system_path_relative_to_its_root $dirname` + version=`echo $basename | sed -e "s,^[^0-9]*-,,g"` + alt_version=`echo $version | sed -e "s,\.old$,,g"` + linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" + + initrd= + for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \ + "initrd-${version}" "initramfs-${version}.img" \ + "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ + "initrd-${alt_version}" "initramfs-${alt_version}.img" \ + "initramfs-genkernel-${version}" \ + "initramfs-genkernel-${alt_version}" \ + "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ + "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do + if test -e "${dirname}/${i}" ; then + initrd="$i" + break + fi + done + + config= + for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do + if test -e "${i}" ; then + config="${i}" + break + fi + done + + initramfs= + if test -n "${config}" ; then + initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"` + fi + + if test -n "${initrd}" ; then + gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2 + elif test -z "${initramfs}" ; then + # "UUID=" and "ZFS=" magic is parsed by initrd or initramfs. Since there's + # no initrd or builtin initramfs, it can't work here. + linux_root_device_thisversion=${GRUB_DEVICE} + fi + + if [ "x$is_first_entry" = xtrue ]; then + linux_entry "Serial Console: ${OS}" "${version}" simple \ + "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} console=ttyS0,115200n8" + + submenu_indentation="\t" + + if [ -z "$boot_device_id" ]; then + boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")" + fi + fi + + list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` +done + +echo "$title_correction_code" diff --git a/config/u-boot/uEnv.txt b/config/u-boot/uEnv.txt index 326ef240e4..c7466778f7 100644 --- a/config/u-boot/uEnv.txt +++ b/config/u-boot/uEnv.txt @@ -1,3 +1,3 @@ KVER=xxxKVERxxx -DTBSUNXI=xxxDTBSUNXIxxx -SERIAL-CONSOLE=OFF +DTBSUNXI=sun8i-h2-plus-ipfire-nano.dtb +SERIAL-CONSOLE=ON diff --git a/lfs/flash-images b/lfs/flash-images index a553ad0235..57d600cf0c 100644 --- a/lfs/flash-images +++ b/lfs/flash-images @@ -33,11 +33,7 @@ DEVICE = $(shell losetup -f) PART_BOOT = /dev/mapper/$(patsubst /dev/%,%,$(DEVICE))p1 PART_ROOT = /dev/mapper/$(patsubst /dev/%,%,$(DEVICE))p3 -ifeq "$(SCON)" "1" - IMAGE_FILE = /install/images/$(SNAME)-$(VERSION).2gb-ext4-scon.$(BUILD_ARCH)-full-core$(CORE).img.gz -else - IMAGE_FILE = /install/images/$(SNAME)-$(VERSION).2gb-ext4.$(BUILD_ARCH)-full-core$(CORE).img.gz -endif +IMAGE_FILE = /install/images/$(SNAME)-$(VERSION).2gb-ext4.$(BUILD_ARCH)-full-core$(CORE).img.gz FSTAB_FMT = UUID=%s %-8s %-4s %-10s %d %d\n @@ -136,24 +132,6 @@ endif echo "HOSTNAME=$(SNAME)" >> $(MNThdd)/var/ipfire/main/settings echo "THEME=ipfire" >> $(MNThdd)/var/ipfire/main/settings -ifeq "$(SCON)" "1" - # Disable console on tty2-6 - sed -i -e "s|2:2345:respawn:|#2:2345:respawn:|g" $(MNThdd)/etc/inittab - sed -i -e "s|3:2345:respawn:|#3:2345:respawn:|g" $(MNThdd)/etc/inittab - sed -i -e "s|4:2345:respawn:|#4:2345:respawn:|g" $(MNThdd)/etc/inittab - sed -i -e "s|5:2345:respawn:|#5:2345:respawn:|g" $(MNThdd)/etc/inittab - sed -i -e "s|6:2345:respawn:|#6:2345:respawn:|g" $(MNThdd)/etc/inittab - -ifeq "$(BUILD_PLATFORM)" "arm" - sed -i -e "s|SERIAL-CONSOLE=OFF|SERIAL-CONSOLE=ON|g" $(MNThdd)/boot/uEnv.txt - sed -i -e "s|xxxDTBSUNXIxxx|sun8i-h2-plus-ipfire-nano.dtb|" $(MNThdd)/boot/uEnv.txt -endif -else -ifeq "$(BUILD_PLATFORM)" "arm" - sed -i -e "s|xxxDTBSUNXIxxx|sun7i-a20-bananapi.dtb|" $(MNThdd)/boot/uEnv.txt -endif -endif - -touch $(MNThdd)/lib/modules/$(KVER)-ipfire/modules.dep mkdir $(MNThdd)/proc mount --bind /proc $(MNThdd)/proc @@ -169,13 +147,17 @@ endif "auto" "defaults" 1 1 >> $(MNThdd)/etc/fstab ifeq "$(BOOTLOADER)" "grub" -ifeq "$(SCON)" "1" - # Enable serial console on GRUB - echo "GRUB_TERMINAL=\"serial\"" >> $(MNThdd)/etc/default/grub + # backup defaults file + cp $(MNThdd)/etc/default/grub $(MNThdd)/etc/default/grub.backup + + # Enable also serial console on GRUB + echo "GRUB_TERMINAL=\"serial console\"" >> $(MNThdd)/etc/default/grub echo "GRUB_SERIAL_COMMAND=\"serial --unit=0 --speed=115200\"" >> $(MNThdd)/etc/default/grub + echo "GRUB_TIMEOUT=-1" >> $(MNThdd)/etc/default/grub - sed -i -e "s|panic=10|& console=ttyS0,115200n8|g" $(MNThdd)/etc/default/grub -endif + # Add additional entry for Serial console + cp $(DIR_SRC)/config/flash-images/grub/11_linux_scon \ + $(MNThdd)/etc/grub.d/ # Create configuration mkdir -pv $(MNThdd)/boot/grub @@ -189,6 +171,10 @@ endif # Install GRUB grub-install --force --recheck --no-floppy --target=i386-pc \ --root-directory=$(MNThdd) $(DEVICE) + + # restore orginal defaults + mv -f $(MNThdd)/etc/default/grub.backup $(MNThdd)/etc/default/grub + rm -f $(MNThdd)/etc/grub.d/11_linux_scon endif # Set ramdisk mode to automatic @@ -223,13 +209,8 @@ endif dd if=/dev/zero bs=1M count=$(PADDING) >> $(IMG) ifeq "$(BUILD_PLATFORM)" "arm" -ifeq "$(SCON)" "1" # Install u-boot for Orangepi Zero/Nanopi DUO into image 8KB dd if=/usr/share/u-boot/orangepi_zero/u-boot-sunxi-with-spl.bin of=$(IMG) bs=1K seek=8 conv=notrunc -else - # Install u-boot for LeMaker Banana Pi into image 8KB - dd if=/usr/share/u-boot/banana_pi/u-boot-sunxi-with-spl.bin of=$(IMG) bs=1K seek=8 conv=notrunc -endif endif # Compress Image diff --git a/make.sh b/make.sh index 691444cd96..130c88b3a8 100755 --- a/make.sh +++ b/make.sh @@ -1554,7 +1554,6 @@ buildpackages() { modprobe loop 2>/dev/null if [ $BUILD_IMAGES == 1 ] && ([ -e /dev/loop/0 ] || [ -e /dev/loop0 ] || [ -e "/dev/loop-control" ]); then lfsmake2 flash-images - lfsmake2 flash-images SCON=1 fi mv $LFS/install/images/{*.iso,*.tgz,*.img.gz,*.bz2} $BASEDIR >> $LOGFILE 2>&1 diff --git a/src/initscripts/system/firstsetup b/src/initscripts/system/firstsetup index 857269ee13..154a066998 100644 --- a/src/initscripts/system/firstsetup +++ b/src/initscripts/system/firstsetup @@ -5,24 +5,16 @@ if [ -e /var/ipfire/main/firstsetup_ok ]; then exit 0; fi -# Edit the serial console entry at /etc/inittab matching to console parameter. -ser_console() { - while test x"$1" != x - do - case $1 in - console=*) - scon=${1##console=}; - sed -i -e "s|^7:2345:respawn:/sbin/agetty.*|7:2345:respawn:/sbin/agetty ${scon%%,*}|g" /etc/inittab - shift - ;; - *) - shift - ;; - esac - done -} -cmdline=`cat /proc/cmdline` -ser_console $cmdline +# disable consoles if tty2 are not present +if [ ! -e /dev/tty2 ]; then + # Disable console on tty2-6 + sed -i -e "s|2:2345:respawn:|#2:2345:respawn:|g" /etc/inittab + sed -i -e "s|3:2345:respawn:|#3:2345:respawn:|g" /etc/inittab + sed -i -e "s|4:2345:respawn:|#4:2345:respawn:|g" etc/inittab + sed -i -e "s|5:2345:respawn:|#5:2345:respawn:|g" /etc/inittab + sed -i -e "s|6:2345:respawn:|#6:2345:respawn:|g" /etc/inittab +fi + # reload inittab /sbin/init q # diff --git a/src/initscripts/system/partresize b/src/initscripts/system/partresize index 8c05f4d15e..819d128856 100644 --- a/src/initscripts/system/partresize +++ b/src/initscripts/system/partresize @@ -18,6 +18,7 @@ case "${1}" in start) if [ -e "/.partresize" ]; then + boot_mesg "Mounting root file system in read/write mode ..." mount -o remount,rw / > /dev/null evaluate_retval @@ -28,6 +29,21 @@ case "${1}" in (exit ${failed}) evaluate_retval + mount /boot > /dev/null + if [ -e /boot/grub/grub.cfg ]; then + # swtich permanent to serial console if it was selected on first boot + if [ ! "$(grep "console=ttyS0" /proc/cmdline)" == "" ]; then + # Enable also serial console on GRUB + echo "GRUB_TERMINAL=\"serial console\"" >> /etc/default/grub + echo "GRUB_SERIAL_COMMAND=\"serial --unit=0 --speed=115200\"" >> /etc/default/grub + sed -i -e "s|panic=10|& console=ttyS0,115200n8|g" /etc/default/grub + fi + /usr/local/bin/update-bootloader + fi + umount /boot > /dev/null + + sleep 30 + # Detect device mount | while read -r dev tmp1 mountpoint tmp2; do [ "${dev}" = "rootfs" ] && continue -- 2.39.2