diff options
author | Sven Göthel <[email protected]> | 2024-12-02 11:08:28 +0100 |
---|---|---|
committer | Sven Göthel <[email protected]> | 2024-12-02 11:08:28 +0100 |
commit | 49014c28d8676d1ca60470e78d82f3df036d20d1 (patch) | |
tree | 6a3d625f7b44e54e9386bd9eabbe1544f9ea4bb0 | |
parent | 09b09c42cf7c4d14b3594d2ff69fbadc9a7a9b78 (diff) |
GPT_BIOS_UEFI: Enable Bios + EFI Boot for amd64 using GPT partition and optional ROOTFS_RO, update ZFS Rescue bootstrap + setup folder
Working config `scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg`
produces a ROOTFS_RO on GPT partition bootable on BIOS + EFI machines.
On EFI machines, ensure that you disable `secure_boot` (as always).
47 files changed, 2582 insertions, 673 deletions
@@ -5,9 +5,11 @@ Tool used to create Debian and Raspberry Pi derived OS images. ## Dependencies -pi-gen has been tested and runs on Debian 11 `Bullseye` +pi-gen has been tested and runs on Debian 12 `Bookworm` to produce OS images for Raspi-arm64, Raspi-armhf and PC-amd64 machines -based on Debian 10 `Buster` and Debian 11 `Bullseye`. +based on Debian 12 `Bullseye`. + +Debian 13 `Trixie` may be supported. PC-i386 is also supported, however, it has not been tested lately. @@ -19,17 +21,16 @@ Related config variables are It might be possible to use Docker on other Linux distributions as described below, however, I have not tested this procedure. -To install the required dependencies for `pi-gen` you should run: +The file `depends` contains a list of tools needed. The format of this +package is `<tool>[:<debian-package>]`. +To install the required dependencies for `pi-gen` you should run: ```bash apt-get install coreutils quilt parted qemu-user-static debootstrap zerofree zip \ dosfstools libarchive-tools libcap2-bin grep rsync xz-utils file git curl bc \ -qemu-utils kpartx squashfs-tools fatattr +qemu-utils kpartx squashfs-tools fatattr e2fsprogs xfsprogs gdisk ``` -The file `depends` contains a list of tools needed. The format of this -package is `<tool>[:<debian-package>]`. - ### Package Source For all targets, default source for `debootstrap` and `apt` package management is `debian.org`. @@ -53,6 +54,11 @@ as the package source. that the network block device is not disconnected correctly after the Docker process has ended abnormally. In that case see [Disconnect an image if something went wrong](#Disconnect-an-image-if-something-went-wrong) +* UEFI Bootable Image + + To support booting the image from UEFI (without `secure-boot`) as well as BIOS, + enable option `GPT_BIOS_UEFI`, see below. + ## Config Upon execution, `build.sh` will source the optional given config file, e.g.: @@ -121,6 +127,17 @@ The following environment variables are supported: Note: `apt cache` is disabled for all target configurations. + * `GPT_BIOS_UEFI` (Default: unset) + + If set to one, i.e. `GPT_BIOS_UEFI=1`, a GPT partition table + will be used, bootable under bios and UEFI (without `secure-boot`). + + Disable `secure-boot` in your UEFI bios! + + In case the UEFI system doesn't launch the installed `EFISYS` partition directly, + utilize the UEFI `boot from file` facility and select + file `EFI/BOOT/BOOTX64.EFI` from the `EFISYS` partition. + * `ROOTFS_RO` (Default: unset) If set to one, i.e. `ROOTFS_RO=1`, the root filesystem will be set read-only, @@ -135,9 +152,13 @@ The following environment variables are supported: ``` Further all `apt-daily` systemd tasks are disabled, - the ssh host keys are retained while `regenerate_ssh_host_keys` is disabled - and the final `/boot/config.txt` has `splash` disabled (no rainbow). + the ssh host keys are retained while `regenerate_ssh_host_keys` is disabled. + + On `amd64` PC platforms, grub is utilized here as usual, launching the `initramfs` + as described above. + On Raspberry `/boot/config.txt` has `splash` disabled (no rainbow). + * `ROOTFS_RO_OVERLAY_TMPFS_SIZE` (Default: 128M) If using `ROOTFS_RO`, this variable specifies the shared `tmpfs` size @@ -9,91 +9,99 @@ run_sub_stage() local packfile; local PACKAGES; - log "Begin ${SUB_STAGE_DIR}" - pushd "${SUB_STAGE_DIR}" > /dev/null - for i in {00..99}; do - if [ -f "${i}-debconf" ]; then - log "Begin ${SUB_STAGE_DIR}/${i}-debconf" - on_chroot << EOF + log "Begin ${SUB_STAGE_DIR}" + pushd "${SUB_STAGE_DIR}" > /dev/null + for i in {00..99}; do + if [ -f "${i}-debconf" ]; then + log "Begin ${SUB_STAGE_DIR}/${i}-debconf" + on_chroot << EOF debconf-set-selections <<SELEOF $(cat "${i}-debconf") SELEOF EOF - log "End ${SUB_STAGE_DIR}/${i}-debconf" - fi - if [ "${TARGET_RASPI}" = "1" -a \( -f "${i}-packages-sys-raspi" -o -f "${i}-packages-sys-raspi-${RELEASE}" \) ]; then + log "End ${SUB_STAGE_DIR}/${i}-debconf" + fi + if [ "${TARGET_RASPI}" = "1" -a \( -f "${i}-packages-sys-raspi" -o -f "${i}-packages-sys-raspi-${RELEASE}" \) ]; then if [ -f "${i}-packages-sys-raspi-${RELEASE}" ]; then packfile="${i}-packages-sys-raspi-${RELEASE}" else packfile="${i}-packages-sys-raspi" fi - log "Begin ${SUB_STAGE_DIR}/${packfile}" - PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")" - if [ -n "$PACKAGES" ]; then - on_chroot << EOF + log "Begin ${SUB_STAGE_DIR}/${packfile}" + PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")" + if [ -n "$PACKAGES" ]; then + on_chroot << EOF echo "Installing ${packfile} '${PACKAGES}'" apt-get ${APT_GET_INSTALL_OPTS} install --no-install-recommends -y $PACKAGES EOF - if [ "${USE_QCOW2}" = "1" ]; then - on_chroot << EOF + if [ "${USE_QCOW2}" = "1" ]; then + on_chroot << EOF apt-get clean EOF - fi - fi - log "End ${SUB_STAGE_DIR}/${packfile}" - elif [ "${TARGET_RASPI}" != "1" -a \( -f "${i}-packages-sys-debian" -o -f "${i}-packages-sys-debian-${RELEASE}" \) ]; then - if [ -f "${i}-packages-sys-debian-${RELEASE}" ]; then + fi + fi + log "End ${SUB_STAGE_DIR}/${packfile}" + elif [ "${TARGET_RASPI}" != "1" ]; then + if [ -f "${i}-packages-sys-debian-${RELEASE}-${TARGET_ARCH}" ]; then + packfile="${i}-packages-sys-debian-${RELEASE}-${TARGET_ARCH}" + elif [ -f "${i}-packages-sys-debian-${RELEASE}" ]; then packfile="${i}-packages-sys-debian-${RELEASE}" - else + elif [ -f "${i}-packages-sys-debian-${TARGET_ARCH}" ]; then + packfile="${i}-packages-sys-debian-${TARGET_ARCH}" + elif [ -f "${i}-packages-sys-debian" ]; then packfile="${i}-packages-sys-debian" + else + packfile= fi - log "Begin ${SUB_STAGE_DIR}/${packfile}" - PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")" - if [ -n "$PACKAGES" ]; then - on_chroot << EOF + if [ -n "${packfile}" ]; then + log "Begin ${SUB_STAGE_DIR}/${packfile}" + PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")" + if [ -n "$PACKAGES" ]; then + on_chroot << EOF echo "Installing ${packfile} '${PACKAGES}'" apt-get ${APT_GET_INSTALL_OPTS} install --no-install-recommends -y $PACKAGES EOF - if [ "${USE_QCOW2}" = "1" ]; then - on_chroot << EOF + if [ "${USE_QCOW2}" = "1" ]; then + on_chroot << EOF apt-get clean EOF - fi - fi - log "End ${SUB_STAGE_DIR}/${packfile}" - fi - if [ -f "${i}-packages-nr" -o -f "${i}-packages-nr-${RELEASE}" ]; then + fi + fi + log "End ${SUB_STAGE_DIR}/${packfile}" + fi + fi + if [ -f "${i}-packages-nr" -o -f "${i}-packages-nr-${RELEASE}" ]; then if [ -f "${i}-packages-nr-${RELEASE}" ]; then packfile="${i}-packages-nr-${RELEASE}" else packfile="${i}-packages-nr" fi - log "Begin ${SUB_STAGE_DIR}/${packfile}" - PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")" - if [ -n "$PACKAGES" ]; then - on_chroot << EOF + log "Begin ${SUB_STAGE_DIR}/${packfile}" + PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")" + if [ -n "$PACKAGES" ]; then + on_chroot << EOF echo "Installing ${packfile} '${PACKAGES}'" apt-get ${APT_GET_INSTALL_OPTS} install --no-install-recommends -y $PACKAGES EOF - if [ "${USE_QCOW2}" = "1" ]; then - on_chroot << EOF + if [ "${USE_QCOW2}" = "1" ]; then + on_chroot << EOF apt-get clean EOF - fi - fi - log "End ${SUB_STAGE_DIR}/${packfile}" - fi - if [ -f "${i}-packages" -o -f "${i}-packages-${RELEASE}" ]; then + fi + fi + log "End ${SUB_STAGE_DIR}/${packfile}" + fi + if [ -f "${i}-packages" -o -f "${i}-packages-${RELEASE}" ]; then if [ -f "${i}-packages-${RELEASE}" ]; then packfile="${i}-packages-${RELEASE}" else packfile="${i}-packages" fi - log "Begin ${SUB_STAGE_DIR}/${packfile}" - PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")" - if [ -n "$PACKAGES" ]; then - on_chroot << EOF + log "Begin ${SUB_STAGE_DIR}/${packfile}" + PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")" + if [ -n "$PACKAGES" ]; then + on_chroot << EOF echo "Installing ${packfile} '${PACKAGES}'" if [ "${INSTALL_RECOMMENDS}" != "1" -o "${REDUCED_FOOTPRINT}" = "1" ]; then apt-get ${APT_GET_INSTALL_OPTS} install --no-install-recommends -y $PACKAGES @@ -102,55 +110,55 @@ else apt-get ${APT_GET_INSTALL_OPTS} install -y $PACKAGES fi EOF - if [ "${USE_QCOW2}" = "1" ]; then - on_chroot << EOF + if [ "${USE_QCOW2}" = "1" ]; then + on_chroot << EOF apt-get clean EOF - fi - fi - log "End ${SUB_STAGE_DIR}/${packfile}" - fi - if [ -d "${i}-patches" ]; then - log "Begin ${SUB_STAGE_DIR}/${i}-patches" - pushd "${STAGE_WORK_DIR}" > /dev/null - if [ "${CLEAN}" = "1" ]; then - rm -rf .pc - rm -rf ./*-pc - fi - QUILT_PATCHES="${SUB_STAGE_DIR}/${i}-patches" - SUB_STAGE_QUILT_PATCH_DIR="$(basename "$SUB_STAGE_DIR")-pc" - mkdir -p "$SUB_STAGE_QUILT_PATCH_DIR" - ln -snf "$SUB_STAGE_QUILT_PATCH_DIR" .pc - quilt upgrade - if [ -e "${SUB_STAGE_DIR}/${i}-patches/EDIT" ]; then - echo "Dropping into bash to edit patches..." - bash - fi - RC=0 - quilt push -a || RC=$? - case "$RC" in - 0|2) - ;; - *) - false - ;; - esac - popd > /dev/null - log "End ${SUB_STAGE_DIR}/${i}-patches" - fi - if [ -x ${i}-run.sh ]; then - log "Begin ${SUB_STAGE_DIR}/${i}-run.sh" - ./${i}-run.sh - log "End ${SUB_STAGE_DIR}/${i}-run.sh" - fi - if [ -f ${i}-run-chroot.sh ]; then - log "Begin ${SUB_STAGE_DIR}/${i}-run-chroot.sh" - on_chroot < ${i}-run-chroot.sh - log "End ${SUB_STAGE_DIR}/${i}-run-chroot.sh" - fi - done - popd > /dev/null - log "End ${SUB_STAGE_DIR}" + fi + fi + log "End ${SUB_STAGE_DIR}/${packfile}" + fi + if [ -d "${i}-patches" ]; then + log "Begin ${SUB_STAGE_DIR}/${i}-patches" + pushd "${STAGE_WORK_DIR}" > /dev/null + if [ "${CLEAN}" = "1" ]; then + rm -rf .pc + rm -rf ./*-pc + fi + QUILT_PATCHES="${SUB_STAGE_DIR}/${i}-patches" + SUB_STAGE_QUILT_PATCH_DIR="$(basename "$SUB_STAGE_DIR")-pc" + mkdir -p "$SUB_STAGE_QUILT_PATCH_DIR" + ln -snf "$SUB_STAGE_QUILT_PATCH_DIR" .pc + quilt upgrade + if [ -e "${SUB_STAGE_DIR}/${i}-patches/EDIT" ]; then + echo "Dropping into bash to edit patches..." + bash + fi + RC=0 + quilt push -a || RC=$? + case "$RC" in + 0|2) + ;; + *) + false + ;; + esac + popd > /dev/null + log "End ${SUB_STAGE_DIR}/${i}-patches" + fi + if [ -x ${i}-run.sh ]; then + log "Begin ${SUB_STAGE_DIR}/${i}-run.sh" + ./${i}-run.sh + log "End ${SUB_STAGE_DIR}/${i}-run.sh" + fi + if [ -f ${i}-run-chroot.sh ]; then + log "Begin ${SUB_STAGE_DIR}/${i}-run-chroot.sh" + on_chroot < ${i}-run-chroot.sh + log "End ${SUB_STAGE_DIR}/${i}-run-chroot.sh" + fi + done + popd > /dev/null + log "End ${SUB_STAGE_DIR}" } @@ -163,229 +171,66 @@ contains() { } run_stage(){ - STAGE="$(basename "${STAGE_DIR}")" + STAGE="$(basename "${STAGE_DIR}")" SKIP_STAGE=`contains "${SKIP_STAGE_LIST}" ${STAGE}` SKIP_IMAGES=`contains "${SKIP_IMAGES_LIST}" ${STAGE}` - log "Begin ${STAGE} ${STAGE_DIR} SKIP(STAGE ${SKIP_STAGE}, IMAGES ${SKIP_IMAGES})" + log "Begin ${STAGE} ${STAGE_DIR} SKIP(STAGE ${SKIP_STAGE}, IMAGES ${SKIP_IMAGES})" - pushd "${STAGE_DIR}" > /dev/null + pushd "${STAGE_DIR}" > /dev/null - STAGE_WORK_DIR="${WORK_DIR}/${STAGE}" - ROOTFS_DIR="${STAGE_WORK_DIR}"/rootfs + STAGE_WORK_DIR="${WORK_DIR}/${STAGE}" + ROOTFS_DIR="${STAGE_WORK_DIR}"/rootfs - if [ "${USE_QCOW2}" = "1" ]; then + if [ "${USE_QCOW2}" = "1" ]; then if [ "${SKIP_STAGE}" != "1" ]; then - load_qimage - fi - fi - + load_qimage + fi + fi + if [ "${SKIP_IMAGES}" != "1" ]; then - if [ -f "${STAGE_DIR}/EXPORT_IMAGE" ]; then - EXPORT_DIRS="${EXPORT_DIRS} ${STAGE_DIR}" - fi - fi + if [ -f "${STAGE_DIR}/EXPORT_IMAGE" ]; then + EXPORT_DIRS="${EXPORT_DIRS} ${STAGE_DIR}" + fi + fi if [ "${SKIP_STAGE}" != "1" ]; then - if [ "${CLEAN}" = "1" ] && [ "${USE_QCOW2}" = "0" ] ; then - if [ -d "${ROOTFS_DIR}" ]; then - rm -rf "${ROOTFS_DIR}" - fi - fi - if [ -x prerun.sh ]; then - log "Begin ${STAGE_DIR}/prerun.sh" - ./prerun.sh - log "End ${STAGE_DIR}/prerun.sh" - fi - for SUB_STAGE_DIR in "${STAGE_DIR}"/*; do - if [ -d "${SUB_STAGE_DIR}" ]; then - run_sub_stage - fi - done - fi + if [ "${CLEAN}" = "1" ] && [ "${USE_QCOW2}" = "0" ] ; then + if [ -d "${ROOTFS_DIR}" ]; then + rm -rf "${ROOTFS_DIR}" + fi + fi + if [ -x prerun.sh ]; then + log "Begin ${STAGE_DIR}/prerun.sh" + ./prerun.sh + log "End ${STAGE_DIR}/prerun.sh" + fi + for SUB_STAGE_DIR in "${STAGE_DIR}"/*; do + if [ -d "${SUB_STAGE_DIR}" ]; then + run_sub_stage + fi + done + fi - if [ "${USE_QCOW2}" = "1" ]; then - unload_qimage - fi + if [ "${USE_QCOW2}" = "1" ]; then + unload_qimage + fi - PREV_STAGE="${STAGE}" - PREV_STAGE_DIR="${STAGE_DIR}" - PREV_ROOTFS_DIR="${ROOTFS_DIR}" - popd > /dev/null - log "End ${STAGE_DIR}" + PREV_STAGE="${STAGE}" + PREV_STAGE_DIR="${STAGE_DIR}" + PREV_ROOTFS_DIR="${ROOTFS_DIR}" + popd > /dev/null + log "End ${STAGE_DIR}" } if [ "$(id -u)" != "0" ]; then - echo "Please run as root" 1>&2 - exit 1 + echo "Please run as root" 1>&2 + exit 1 fi BASE_DIR=`dirname $(readlink -f "${BASH_SOURCE[0]}")` export BASE_DIR - -while getopts "c:" flag -do - case "$flag" in - c) - EXTRA_CONFIG="$OPTARG" - # shellcheck disable=SC1090 - echo "Reading config from ${EXTRA_CONFIG}" - source "$EXTRA_CONFIG" - ;; - *) - ;; - esac -done - -term() { - if [ "${USE_QCOW2}" = "1" ]; then - log "Unloading image" - unload_qimage - fi -} - -trap term EXIT INT TERM - -export PI_GEN=${PI_GEN:-pi-gen} -export PI_GEN_REPO=${PI_GEN_REPO:-https://jausoft.com/cgit/pi-gen.git/about/} - -if [ -z "${IMG_NAME}" ]; then - echo "IMG_NAME not set" 1>&2 - exit 1 -fi - -export USE_QEMU="${USE_QEMU:-0}" -export IMG_DATE="${IMG_DATE:-"$(date --utc +%Y-%m-%d_%H:%M:%S)"}" -export IMG_FILENAME="${IMG_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}" -export ZIP_FILENAME="${ZIP_FILENAME:-"image_${IMG_DATE}-${IMG_NAME}"}" - export SCRIPT_DIR="${BASE_DIR}/scripts" -export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}" -export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"} -export DEPLOY_ZIP="${DEPLOY_ZIP:-1}" -export LOG_FILE="${WORK_DIR}/build.log" -export TARGET_HOSTNAME=${TARGET_HOSTNAME:-raspberrypi} - -export FIRST_USER_NAME=${FIRST_USER_NAME:-pi} -export FIRST_USER_PASS=${FIRST_USER_PASS:-raspberry} -export RELEASE=${RELEASE:-buster} - -export TARGET_RASPI="${TARGET_RASPI:-1}" -export TARGET_ARCH="${TARGET_ARCH:-arm64}" - -export WPA_ESSID -export WPA_PASSWORD -export WPA_COUNTRY -export ENABLE_SSH="${ENABLE_SSH:-0}" -export PUBKEY_ONLY_SSH="${PUBKEY_ONLY_SSH:-0}" - -export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_US.UTF-8}" - -export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-us}" -export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (US)}" - -export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Europe/Berlin}" - -export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"} - -export PUBKEY_SSH_FIRST_USER - -export CLEAN -export IMG_NAME -export APT_PROXY - -export STAGE -export STAGE_DIR -export STAGE_WORK_DIR -export PREV_STAGE -export PREV_STAGE_DIR -export ROOTFS_DIR -export PREV_ROOTFS_DIR -export IMG_SUFFIX -export NOOBS_NAME -export NOOBS_DESCRIPTION -export EXPORT_DIR -export EXPORT_ROOTFS_DIR - -export QUILT_PATCHES -export QUILT_NO_DIFF_INDEX=1 -export QUILT_NO_DIFF_TIMESTAMPS=1 -export QUILT_REFRESH_ARGS="-p ab" - -if [ -z "${DEB_SERVER}" ]; then - export DEB_SERVER="http://deb.debian.org/debian" -fi - -if [ -z "${IS_TESTING}" ]; then - IS_TESTING= - case "${RELEASE}" in - "jessie") - IS_TESTING=0 ;; - "stretch") - IS_TESTING=0 ;; - "buster") - IS_TESTING=0 ;; - "bullseye") - IS_TESTING=0 ;; - "bookworm") - IS_TESTING=0 ;; - "trixie") - IS_TESTING=1 ;; - *) - IS_TESTING=1 ;; - esac -fi -export IS_TESTING - -if [ "${PREFER_RASPI_SOURCE}" = "1" -a "${TARGET_RASPI}" = "1" -a "${TARGET_ARCH}" = "armhf" ]; then - USE_RASPI_SOURCE=1 -else - USE_RASPI_SOURCE=0 -fi -export USE_RASPI_SOURCE - -# shellcheck source=scripts/common -source "${SCRIPT_DIR}/common" -# shellcheck source=scripts/dependencies_check -source "${SCRIPT_DIR}/dependencies_check" - -# merely a local flag for `run_stage` for EXPORT_DIRS (images) only -export USE_QCOW2=1 - -export BASE_QCOW2_SIZE=${BASE_QCOW2_SIZE:-15200M} -source "${SCRIPT_DIR}/qcow2_handling" - -export ROOTFS_RO_OVERLAY_TMPFS_SIZE=${ROOTFS_RO_OVERLAY_TMPFS_SIZE:-128M} -# vfat, ext2, ext4 or xfs -export BOOT_FSTYPE=${BOOT_FSTYPE:-vfat} -# codepage is hardcoded in 'loop_rootfs' and scripts, as well as required by pi-gen build -if [ -z ${FAT_CODEPAGE+x} ]; then - readonly FAT_CODEPAGE="437" - export FAT_CODEPAGE -fi -export BOOT_FSOPTIONS=${BOOT_FSOPTIONS:-rw,noatime,fmask=0022,dmask=0022,codepage=${FAT_CODEPAGE},iocharset=ascii,shortname=mixed,errors=remount-ro} - -dependencies_check "${BASE_DIR}/depends" - -#check username is valid -if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then - echo "Invalid FIRST_USER_NAME: $FIRST_USER_NAME" - exit 1 -fi - -if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null ; then - echo "Could not reach APT_PROXY server: ${APT_PROXY}" - exit 1 -fi - -if [[ -n "${WPA_PASSWORD}" && ${#WPA_PASSWORD} -lt 8 || ${#WPA_PASSWORD} -gt 63 ]] ; then - echo "WPA_PASSWORD" must be between 8 and 63 characters - exit 1 -fi - -if [[ "${PUBKEY_ONLY_SSH}" = "1" && -z "${PUBKEY_SSH_FIRST_USER}" ]]; then - echo "Must set 'PUBKEY_SSH_FIRST_USER' to a valid SSH public key if using PUBKEY_ONLY_SSH" - exit 1 -fi +source "${SCRIPT_DIR}/build_vars" CLEAN=1 mkdir -p "${WORK_DIR}" @@ -400,22 +245,23 @@ echo "Skipping stages: \"${SKIP_STAGE_LIST}\"" echo "Skipping images: \"${SKIP_IMAGES_LIST}\"" for STAGE_DIR in $STAGE_LIST; do - STAGE_DIR=$(realpath "${STAGE_DIR}") - run_stage + STAGE_DIR=$(realpath "${STAGE_DIR}") + run_stage done CLEAN=1 for EXPORT_DIR in ${EXPORT_DIRS}; do - STAGE_DIR=${BASE_DIR}/export-image - # shellcheck source=/dev/null - source "${EXPORT_DIR}/EXPORT_IMAGE" - EXPORT_ROOTFS_DIR=${WORK_DIR}/$(basename "${EXPORT_DIR}")/rootfs + STAGE_DIR=${BASE_DIR}/export-image + # shellcheck source=/dev/null + source "${EXPORT_DIR}/EXPORT_IMAGE" + EXPORT_ROOTFS_DIR=${WORK_DIR}/$(basename "${EXPORT_DIR}")/rootfs USE_QCOW2=0 EXPORT_NAME="${IMG_FILENAME}${IMG_SUFFIX}" echo "------------------------------------------------------------------------" echo "Running export stage for ${EXPORT_NAME}" rm -f "${WORK_DIR}/export-image/${EXPORT_NAME}.img" || true rm -f "${WORK_DIR}/export-image/${EXPORT_NAME}.qcow2" || true + rm -rf "${WORK_DIR}/export-image/rootfs" || true rm -f "${WORK_DIR}/${EXPORT_NAME}.img" || true rm -f "${WORK_DIR}/${EXPORT_NAME}.qcow2" || true EXPORT_STAGE=$(basename "${EXPORT_DIR}") @@ -436,7 +282,7 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do PREV_IMG="${EXPORT_NAME}" continue fi - echo "Rebasing image-${CURR_STAGE}.qcow2 onto ${PREV_IMG}.qcow2" + echo "Rebasing image-${CURR_STAGE}.qcow2 onto ${PREV_IMG}.qcow2" qemu-img rebase -f qcow2 -u -b ${PREV_IMG}.qcow2 image-${CURR_STAGE}.qcow2 -F qcow2 if [ "${CURR_STAGE}" = "${EXPORT_STAGE}" ]; then break @@ -454,8 +300,9 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do PREV_IMG="image-${CURR_STAGE}" continue fi - echo "Rebasing back image-${CURR_STAGE}.qcow2 onto ${PREV_IMG}.qcow2" + echo "Rebasing back image-${CURR_STAGE}.qcow2 onto ${PREV_IMG}.qcow2" qemu-img rebase -f qcow2 -u -b ${PREV_IMG}.qcow2 image-${CURR_STAGE}.qcow2 -F qcow2 + PREV_ROOTFS_DIR="${WORK_DIR}/${CURR_STAGE}"/rootfs if [ "${CURR_STAGE}" = "${EXPORT_STAGE}" ]; then break fi @@ -464,6 +311,11 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do popd > /dev/null mkdir -p "${WORK_DIR}/export-image/rootfs" + if [[ "${ROOTFS_RO}" = "1" && -n "${PREV_ROOTFS_DIR}" ]]; then + echo "ROOTFS_RO: rsync ${PREV_ROOTFS_DIR}/ ${WORK_DIR}/export-image/rootfs" + rsync -a "${PREV_ROOTFS_DIR}/" "${WORK_DIR}/export-image/rootfs" + sync + fi mv "${WORK_DIR}/${EXPORT_NAME}.qcow2" "${WORK_DIR}/export-image/" echo "Mounting image ${WORK_DIR}/export-image/${EXPORT_NAME}.qcow2 to rootfs ${WORK_DIR}/export-image/rootfs" mount_qimage "${WORK_DIR}/export-image/${EXPORT_NAME}.qcow2" "${WORK_DIR}/export-image/rootfs" @@ -473,23 +325,23 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do CLEAN=1 USE_QCOW2=1 - if [ "${USE_QEMU}" != "1" ]; then - if [ -e "${EXPORT_DIR}/EXPORT_NOOBS" ]; then - # shellcheck source=/dev/null - source "${EXPORT_DIR}/EXPORT_NOOBS" - STAGE_DIR="${BASE_DIR}/export-noobs" + if [ "${USE_QEMU}" != "1" ]; then + if [ -e "${EXPORT_DIR}/EXPORT_NOOBS" ]; then + # shellcheck source=/dev/null + source "${EXPORT_DIR}/EXPORT_NOOBS" + STAGE_DIR="${BASE_DIR}/export-noobs" USE_QCOW2=0 run_stage USE_QCOW2=1 - fi - fi + fi + fi done if [ -x postrun.sh ]; then - log "Begin postrun.sh" - cd "${BASE_DIR}" - ./postrun.sh - log "End postrun.sh" + log "Begin postrun.sh" + cd "${BASE_DIR}" + ./postrun.sh + log "End postrun.sh" fi unload_qimage diff --git a/export-image/04-finalise/01-run.sh b/export-image/04-finalise/01-run.sh index cdaadc3..d94841b 100755 --- a/export-image/04-finalise/01-run.sh +++ b/export-image/04-finalise/01-run.sh @@ -10,6 +10,7 @@ fi DEPLOY_DIR2="${DEPLOY_DIR}/${IMG_FILENAME}" +QCOW2_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.qcow2" IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img" INFO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.info" @@ -98,36 +99,68 @@ if [ "${ROOTFS_RO}" = "1" ] ; then cp -a "${ROOTFS_DIR}/boot" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}" fi +if [ "${ROOTFS_RO}" = "1" ] ; then + finalize_fstab_ro "${ROOTFS_DIR}" +fi + +on_chroot <<EOF + if [ "${TARGET_RASPI}" != "1" ]; then + # BIOS Boot + echo "GRUB Install: BIOS: ROOTFS_RO=${ROOTFS_RO}" + if [ "${ROOTFS_RO}" = "1" ] ; then + # using manually copied /boot/grub/grub.cfg + grub-install --target=i386-pc --force-file-id --modules="gzio part_msdos part_gpt fat" /dev/${NBD_DEV} + else + grub-install --target=i386-pc --force-file-id --modules="gzio part_msdos part_gpt fat ext2 xfs" /dev/${NBD_DEV} + update-grub + fi + if [ -n "${UEFI_ARCH}" ] ; then + # EFI Boot + echo "GRUB Install: UEFI: Using grub-install. ROOTFS_RO=${ROOTFS_RO}" + mkdir -p /boot/efi/EFI/BOOT + # --removable: EFI/BOOT/bootx64.efi + # --uefi-secure-boot (we disable this option) + grub-install --target=${UEFI_ARCH}-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=BOOT + fi + # Remove storage device related search.fs_uuid and allow multi homing + rm -f /boot/grub/i386-pc/load.cfg + if [ -n "${UEFI_ARCH}" ] ; then + rm -f /boot/grub/${UEFI_ARCH}-efi/load.cfg + fi + fi +EOF + unload_qimage -make_bootable_image "${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.qcow2" \ - "$IMG_FILE" \ - "$IMG_FILE_ROOT_EXT4" "$INFO_FILE_ROOT" if [ "${ROOTFS_RO}" = "1" ] ; then - mount -o ro "$IMG_FILE_ROOT_EXT4" "${ROOTFS_DIR}" - #mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_GZ}" -comp gzip - mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_LZO}" -comp lzo - #mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_ZSTD}" -comp zstd -Xcompression-level 10 - umount "${ROOTFS_DIR}" + rm -f "${IMG_FILE_ROOT_SQFS_LZO}" + #mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_GZ}" -comp gzip -no-xattrs + mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_LZO}" -comp lzo -no-xattrs + #mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_ZSTD}" -comp zstd -Xcompression-level 10 -no-xattrs cp -a "$INFO_FILE_ROOT" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}/sys_${TARGET_ARCH}_000/rootfs.inf" # cp -a "$IMG_FILE_ROOT_EXT4" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}/sys_${TARGET_ARCH}_000/rootfs.img" cp -a "$IMG_FILE_ROOT_SQFS_LZO" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}/sys_${TARGET_ARCH}_000/rootfs.img" # cp -a "$IMG_FILE_ROOT_SQFS_ZSTD" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}/sys_${TARGET_ARCH}_000/rootfs.img" - echo "Mount image ${IMG_FILE}" + echo "Mount image ${QCOW2_FILE}" MOUNTROOT=${STAGE_WORK_DIR}/tmpimage mkdir -p $MOUNTROOT - mount_rawimage "${IMG_FILE}" $MOUNTROOT - if [ ! -d "${MOUNTROOT}/root" ]; then + mount_qimage "${QCOW2_FILE}" "${MOUNTROOT}" + if [ ! -d "${MOUNTROOT}/boot" ]; then echo "Image damaged or not mounted. Exit." exit 1 fi cp "$IMG_FILE_ROOT_SQFS_LZO" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/rootfs.img" - echo "Umount image ${IMG_FILE}" + echo "Umount image ${QCOW2_FILE}" sync umount_image $MOUNTROOT fi + +make_bootable_image "${QCOW2_FILE}" \ + "$IMG_FILE" \ + "$IMG_FILE_ROOT_EXT4" "$INFO_FILE_ROOT" + mv "$INFO_FILE" "$INFO_FILE_ROOT" "$DEPLOY_DIR2/" if [ "${DEPLOY_ZIP}" == "1" ]; then @@ -150,8 +183,9 @@ if [ "${ROOTFS_RO}" = "1" ] ; then #mv -v "$IMG_FILE_ROOT_SQFS_GZ" "$DEPLOY_DIR2/" mv -v "$IMG_FILE_ROOT_SQFS_LZO" "$DEPLOY_DIR2/" #mv -v "$IMG_FILE_ROOT_SQFS_ZSTD" "$DEPLOY_DIR2/" +else + mv -v "$IMG_FILE_ROOT_EXT4" "$DEPLOY_DIR2/" fi -mv -v "$IMG_FILE_ROOT_EXT4" "$DEPLOY_DIR2/" rm -f "${STAGE_WORK_DIR}/SHA256SUMS" ( cd "${DEPLOY_DIR2}"; find . -maxdepth 1 -type f -exec sha256sum -b \{\} >> "${STAGE_WORK_DIR}/SHA256SUMS" \; ) diff --git a/scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg b/scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg index 76d25b5..9f1ec21 100644 --- a/scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg +++ b/scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg @@ -2,6 +2,7 @@ export TARGET_RASPI="0" export TARGET_ARCH="amd64" +export GPT_BIOS_UEFI="1" export RELEASE=bookworm # export RELEASE=bullseye @@ -9,6 +10,8 @@ export RELEASE=bookworm # Produce a read-only rootfs export ROOTFS_RO=1 # export REDUCED_FOOTPRINT=1 +# 4096MiB = 4GiB, but we keep 96MiB 'allowance' for sdcard inaccuracy to fit on 4GB +export BASE_QCOW2_SIZE=4000M export DEB_SERVER="http://deb.debian.org/debian" # export DEB_SERVER="http://ftp.de.debian.org/debian" @@ -16,7 +19,7 @@ export DEB_SERVER="http://deb.debian.org/debian" export APT_PROXY=http://jordan:3142 export CUSTOM_NAME="DebAmd64RescueZfs" -export CUSTOM_VERSION="1.4-ro" +export CUSTOM_VERSION="1.5-ro" export PI_GEN="pi-gen (zfs branch)" diff --git a/scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg b/scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg index 4b2672f..0faf725 100644 --- a/scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg +++ b/scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg @@ -2,6 +2,7 @@ export TARGET_RASPI="0" export TARGET_ARCH="amd64" +export GPT_BIOS_UEFI="1" export RELEASE=bookworm # export RELEASE=bullseye @@ -9,6 +10,8 @@ export RELEASE=bookworm # Produce a read-only rootfs export ROOTFS_RO=1 # export REDUCED_FOOTPRINT=1 +# 4096MiB = 4GiB, but we keep 96MiB 'allowance' for sdcard inaccuracy to fit on 4GB +export BASE_QCOW2_SIZE=4000M export DEB_SERVER="http://deb.debian.org/debian" # export DEB_SERVER="http://ftp.de.debian.org/debian" @@ -16,7 +19,7 @@ export DEB_SERVER="http://deb.debian.org/debian" # export APT_PROXY=http://jordan:3142 export CUSTOM_NAME="DebAmd64RescueZfs" -export CUSTOM_VERSION="1.4-ro" +export CUSTOM_VERSION="1.5-ro" export PI_GEN="pi-gen (zfs branch)" diff --git a/scripts/build_vars b/scripts/build_vars new file mode 100644 index 0000000..7c7bda2 --- /dev/null +++ b/scripts/build_vars @@ -0,0 +1,188 @@ +#!/bin/bash + +while getopts "c:" flag +do + case "$flag" in + c) + EXTRA_CONFIG="$OPTARG" + # shellcheck disable=SC1090 + echo "Reading config from ${EXTRA_CONFIG}" + source "$EXTRA_CONFIG" + ;; + *) + ;; + esac +done + +term() { + if [ "${USE_QCOW2}" = "1" ]; then + log "Unloading image" + unload_qimage + fi +} + +trap term EXIT INT TERM + +export PI_GEN=${PI_GEN:-pi-gen} +export PI_GEN_REPO=${PI_GEN_REPO:-https://jausoft.com/cgit/pi-gen.git/about/} + +export USE_QEMU="${USE_QEMU:-0}" + +if [ -z "${IMG_NAME}" ]; then + echo "IMG_NAME not set" 1>&2 + exit 1 +fi +export IMG_DATE="${IMG_DATE:-"$(date --utc +%Y-%m-%d_%H:%M:%S)"}" +export IMG_FILENAME="${IMG_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}" +export ZIP_FILENAME="${ZIP_FILENAME:-"image_${IMG_DATE}-${IMG_NAME}"}" +export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}" +export IMG_NAME +export IMG_SUFFIX + +export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"} +export DEPLOY_ZIP="${DEPLOY_ZIP:-1}" +export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work"}" +export LOG_FILE="${WORK_DIR}/build.log" + +export TARGET_HOSTNAME=${TARGET_HOSTNAME:-raspberrypi} + +export FIRST_USER_NAME=${FIRST_USER_NAME:-pi} +export FIRST_USER_PASS=${FIRST_USER_PASS:-raspberry} +export RELEASE=${RELEASE:-buster} + +export TARGET_RASPI="${TARGET_RASPI:-1}" +export TARGET_ARCH="${TARGET_ARCH:-arm64}" + +export WPA_ESSID +export WPA_PASSWORD +export WPA_COUNTRY +export ENABLE_SSH="${ENABLE_SSH:-0}" +export PUBKEY_ONLY_SSH="${PUBKEY_ONLY_SSH:-0}" + +export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_US.UTF-8}" + +export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-us}" +export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (US)}" + +export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Europe/Berlin}" + +export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"} + +export PUBKEY_SSH_FIRST_USER + +export CLEAN +export APT_PROXY + +export STAGE +export STAGE_DIR +export STAGE_WORK_DIR +export PREV_STAGE +export PREV_STAGE_DIR +export ROOTFS_DIR +export PREV_ROOTFS_DIR +export NOOBS_NAME +export NOOBS_DESCRIPTION +export EXPORT_DIR +export EXPORT_ROOTFS_DIR + +export QUILT_PATCHES +export QUILT_NO_DIFF_INDEX=1 +export QUILT_NO_DIFF_TIMESTAMPS=1 +export QUILT_REFRESH_ARGS="-p ab" + +export UEFI_ARCH + +if [ "${GPT_BIOS_UEFI}" = "1" -a "${TARGET_RASPI}" = "1" ]; then + echo "Not supported: GPT_BIOS_UEFI + TARGET_RASPI" + exit 1 +fi +if [ "${GPT_BIOS_UEFI}" = "1" -a -z "${UEFI_ARCH}" ] ; then + case "${TARGET_ARCH}" in + "amd64") + UEFI_ARCH="x86_64" ;; + "i386") + UEFI_ARCH="i386" ;; + *) + echo "GPT BIOS/UEFI not supported on target arch ${TARGET_ARCH}" + UEFI_ARCH= + GPT_BIOS_UEFI= + exit 1 ;; + esac +fi + +if [ -z "${DEB_SERVER}" ]; then + export DEB_SERVER="http://deb.debian.org/debian" +fi + +if [ -z "${IS_TESTING}" ]; then + IS_TESTING= + case "${RELEASE}" in + "jessie") + IS_TESTING=0 ;; + "stretch") + IS_TESTING=0 ;; + "buster") + IS_TESTING=0 ;; + "bullseye") + IS_TESTING=0 ;; + "bookworm") + IS_TESTING=0 ;; + "trixie") + IS_TESTING=0 ;; + *) + IS_TESTING=1 ;; + esac +fi +export IS_TESTING + +if [ "${PREFER_RASPI_SOURCE}" = "1" -a "${TARGET_RASPI}" = "1" -a "${TARGET_ARCH}" = "armhf" ]; then + USE_RASPI_SOURCE=1 +else + USE_RASPI_SOURCE=0 +fi +export USE_RASPI_SOURCE + +# shellcheck source=scripts/common +source "${SCRIPT_DIR}/common" +# shellcheck source=scripts/dependencies_check +source "${SCRIPT_DIR}/dependencies_check" + +# merely a local flag for `run_stage` for EXPORT_DIRS (images) only +export USE_QCOW2=1 + +export BASE_QCOW2_SIZE=${BASE_QCOW2_SIZE:-15200M} +source "${SCRIPT_DIR}/qcow2_handling" + +export ROOTFS_RO_OVERLAY_TMPFS_SIZE=${ROOTFS_RO_OVERLAY_TMPFS_SIZE:-128M} +# vfat, ext2, ext4 or xfs +export BOOT_FSTYPE=${BOOT_FSTYPE:-vfat} +# codepage is hardcoded in 'loop_rootfs' and scripts, as well as required by pi-gen build +if [ -z ${FAT_CODEPAGE+x} ]; then + readonly FAT_CODEPAGE="437" + export FAT_CODEPAGE +fi +export BOOT_FSOPTIONS=${BOOT_FSOPTIONS:-rw,noatime,fmask=0022,dmask=0022,codepage=${FAT_CODEPAGE},iocharset=ascii,shortname=mixed,errors=remount-ro} + +dependencies_check "${BASE_DIR}/depends" + +#check username is valid +if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then + echo "Invalid FIRST_USER_NAME: $FIRST_USER_NAME" + exit 1 +fi + +if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null ; then + echo "Could not reach APT_PROXY server: ${APT_PROXY}" + exit 1 +fi + +if [[ -n "${WPA_PASSWORD}" && ${#WPA_PASSWORD} -lt 8 || ${#WPA_PASSWORD} -gt 63 ]] ; then + echo "WPA_PASSWORD" must be between 8 and 63 characters + exit 1 +fi + +if [[ "${PUBKEY_ONLY_SSH}" = "1" && -z "${PUBKEY_SSH_FIRST_USER}" ]]; then + echo "Must set 'PUBKEY_SSH_FIRST_USER' to a valid SSH public key if using PUBKEY_ONLY_SSH" + exit 1 +fi + diff --git a/scripts/common b/scripts/common index 4ff9a96..9cb0055 100644 --- a/scripts/common +++ b/scripts/common @@ -1,3 +1,5 @@ +#!/bin/bash + log (){ date +"[%T] $*" | tee -a "${LOG_FILE}" } diff --git a/scripts/lib_nbd_img_handling b/scripts/lib_nbd_img_handling index ebbabf9..9f77612 100644 --- a/scripts/lib_nbd_img_handling +++ b/scripts/lib_nbd_img_handling @@ -17,12 +17,13 @@ export -f lib_echo_err # Reusable: find and initialize free block device nodes # Return: new nbd device basename lib_init_nbd() { - local res= + local res + res= modprobe nbd max_part=16 for x in /sys/class/block/nbd* ; do - S=`cat $x/size` + S=$(cat "$x"/size) if [ "$S" == "0" ] ; then - res=$(basename $x) + res=$(basename "$x") break fi done @@ -37,7 +38,7 @@ lib_check_imagetypearg() { if [ -z "${2}" ] ; then lib_echo_err "${1}: image-type not given. Exit." return 1 - elif [ "${2}" != "raw" -a "${2}" != "qcow2" ]; then + elif [[ "${2}" != "raw" && "${2}" != "qcow2" ]]; then lib_echo_err "${1}: image-type must be either raw or qcow, given was ${2}. Exit." return 1 fi @@ -62,18 +63,18 @@ lib_connect_blkdev3() { lib_echo_err "lib_connect_blkdev3: nbd device basename not given. Exit." exit 1; fi + local img_file img_type nbd_dev + img_file=${1} + img_type=${2} - local img_file=${1} - local img_type=${2} - local nbd_dev=${3} - + nbd_dev=${3} if [ "${img_type}" = "raw" ]; then - qemu-nbd --discard=unmap -f raw -c /dev/${nbd_dev} "${img_file}" + qemu-nbd --discard=unmap -f raw -c "/dev/${nbd_dev}" "${img_file}" else - qemu-nbd --discard=unmap -c /dev/${nbd_dev} "${img_file}" + qemu-nbd --discard=unmap -c "/dev/${nbd_dev}" "${img_file}" fi sync - kpartx -a /dev/${nbd_dev} + kpartx -a "/dev/${nbd_dev}" sync return 0 } @@ -91,11 +92,11 @@ lib_connect_blkdev2() { if ! lib_check_imagetypearg "lib_connect_blkdev2" "${2}" ; then exit 1; fi + local img_file img_type nbd_dev + img_file=${1} + img_type=${2} - local img_file=${1} - local img_type=${2} - - local nbd_dev=$(lib_init_nbd) + nbd_dev=$(lib_init_nbd) if [ -z "${nbd_dev}" ] ; then lib_echo_err "lib_connect_blkdev2: NBD device not determined. Exit." exit 1; @@ -114,20 +115,21 @@ lib_disconnect_blkdev() { lib_echo_err "lib_disconnect_blkdev: NBD device basename not given._Exit." exit 1; fi - local nbd_dev=${1} - kpartx -d /dev/${nbd_dev} - qemu-nbd -d /dev/${nbd_dev} + local nbd_dev + nbd_dev=${1} + kpartx -d "/dev/${nbd_dev}" + qemu-nbd -d "/dev/${nbd_dev}" } export -f lib_disconnect_blkdev lib_nbd_cleanup() { DEVS="$(lsblk | grep nbd | grep disk | cut -d" " -f1)" - if [ ! -z "${DEVS}" ]; then + if [ -n "${DEVS}" ]; then for d in $DEVS; do - if [ ! -z "${d}" ]; then - QDEV="$(ps xa | grep $d | grep -v grep)" + if [ -n "${d}" ]; then + QDEV="$(ps xa | grep "$d" | grep -v grep)" if [ -z "${QDEV}" ]; then - kpartx -d /dev/${d} && qemu-nbd -d /dev/${d} && echo "Unconnected device map removed: /dev/${d}" + kpartx -d "/dev/${d}" && qemu-nbd -d "/dev/${d}" && echo "Unconnected device map removed: /dev/${d}" fi fi done @@ -137,14 +139,14 @@ export -f lib_nbd_cleanup lib_force_nbd_cleanup() { DEVS="$(lsblk | grep nbd | grep disk | cut -d" " -f1)" - if [ ! -z "${DEVS}" ]; then + if [ -n "${DEVS}" ]; then for d in $DEVS; do - if [ ! -z "${d}" ]; then - QDEV="$(ps xa | grep $d | grep -v grep)" + if [ -n "${d}" ]; then + QDEV="$(ps xa | grep "$d" | grep -v grep)" if [ -z "${QDEV}" ]; then - kpartx -d /dev/${d} && qemu-nbd -d /dev/${d} && echo "Unconnected device map removed: /dev/${d}" + kpartx -d "/dev/${d}" && qemu-nbd -d "/dev/${d}" && echo "Unconnected device map removed: /dev/${d}" else - kpartx -d /dev/${d} && qemu-nbd -d /dev/${d} && echo "Connected device map removed (force): /dev/${d}" + kpartx -d "/dev/${d}" && qemu-nbd -d "/dev/${d}" && echo "Connected device map removed (force): /dev/${d}" fi fi done @@ -152,6 +154,57 @@ lib_force_nbd_cleanup() { } export -f lib_force_nbd_cleanup +part_guid() { + local device part part_guid + device=$1 + part=$2 + part_guid=$(sgdisk --info="${part}" "${device}" | grep "Partition GUID code" | awk -e ' { print $4; }') + echo -n "${part_guid}" +} +part_exists() { + local part_guid + part_guid=$(part_guid "$1" "$2") + test -n "${part_guid}" + return $? +} +part_notexists() { + local part_guid + part_guid=$(part_guid "$1" "$2") + test -z "${part_guid}" + return $? +} +part_is_biosboot() { + local part_guid + part_guid=$(part_guid "$1" "$2") + test "${part_guid}" = "21686148-6449-6E6F-744E-656564454649" + return $? +} +part_is_efi() { + local part_guid + part_guid=$(part_guid "$1" "$2") + test "${part_guid}" = "C12A7328-F81F-11D2-BA4B-00A0C93EC93B" + return $? +} +part_is_msfs() { + local part_guid + part_guid=$(part_guid "$1" "$2") + test "${part_guid}" = "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7" + return $? +} +part_is_rootfs() { + local part_guid + part_guid=$(part_guid "$1" "$2") + test "${part_guid}" = "0FC63DAF-8483-4772-8E79-3D69D8477DE4" \ + -o "${part_guid}" = "6A898CC3-1DD2-11B2-99A6-080020736631" + return $? +} +part_is_zfs() { + local part_guid + part_guid=$(part_guid "$1" "$2") + test "${part_guid}" = "6A898CC3-1DD2-11B2-99A6-080020736631" + return $? +} + # Reusable: mount image # Input {1}: image-file name # Input {2}: image-type: "raw" or "qcow2" @@ -171,25 +224,58 @@ lib_mount_image3() { lib_echo_err "lib_mount_image3: mountpoint not given. Exit." exit 1; fi - local img_file=${1} - local img_type=${2} - local mnt_dir=${3} + local img_file img_type mnt_dir nbd_dev + img_file=${1} + img_type=${2} + mnt_dir=${3} - local nbd_dev=$(lib_connect_blkdev2 "${img_file}" "${img_type}") + nbd_dev=$(lib_connect_blkdev2 "${img_file}" "${img_type}") if [ -z "${nbd_dev}" ] ; then lib_echo_err "lib_mount_image3: NBD device not determined. Exit." exit 1; fi - # Use heuristic: p1 /boot, p2 / - local p1dev="/dev/mapper/${nbd_dev}p1" - local p2dev="/dev/mapper/${nbd_dev}p2" - if [ -e ${p1dev} -a -e ${p2dev} ]; then - mount -v ${p2dev} "${mnt_dir}" >&2 + # Total Combinations + # - 1: 1 bios-boot, 1 efi, 3 boot (fat, mounted) + # - 2: 1 bios-boot, 2 efi, 3 root + # - 3: 1 boot (fat, mounted), 2 root (RASPI) + # - 4: 1 boot (fat, unused), 2 root (no RASPI) + # - 5: 1 boot (fat, mounted) + local BIOSBOOT_PART EFISYS_PART BOOT_PART ROOT_PART part_count part_i + BIOSBOOT_PART= + EFISYS_PART= + BOOT_PART= + ROOT_PART= + part_count=0 + part_i=1 + while part_exists "/dev/${nbd_dev}" ${part_i} ; do + let part_count=$part_count+1 + if part_is_biosboot "/dev/${nbd_dev}" ${part_i} ; then + BIOSBOOT_PART="/dev/mapper/${nbd_dev}p${part_i}" + elif part_is_efi "/dev/${nbd_dev}" ${part_i} ; then + EFISYS_PART="/dev/mapper/${nbd_dev}p${part_i}" + elif part_is_msfs "/dev/${nbd_dev}" ${part_i} ; then + BOOT_PART="/dev/mapper/${nbd_dev}p${part_i}" + elif part_is_rootfs "/dev/${nbd_dev}" ${part_i} ; then + ROOT_PART="/dev/mapper/${nbd_dev}p${part_i}" + fi + let part_i=${part_i}+1 + done + lib_echo_err "Detected ${part_count} partitions on /dev/${nbd_dev} to be mounted on ${mnt_dir}" + lib_echo_err "BIOSBOOT ${BIOSBOOT_PART}" + lib_echo_err "EFISYS ${EFISYS_PART}" + lib_echo_err "BOOT ${BOOT_PART}" + lib_echo_err "ROOT ${ROOT_PART}" + if [ -n "${ROOT_PART}" ] ; then + mount -v "${ROOT_PART}" "${mnt_dir}" >&2 + fi + if [[ -n "${BOOT_PART}" ]] && [[ "${TARGET_RASPI}" = "1" || -z "${ROOT_PART}" ]] ; then mkdir -p "${mnt_dir}/boot" - mount -v ${p1dev} "${mnt_dir}/boot" >&2 - elif [ -e ${p1dev} ]; then - mount -v ${p1dev} "${mnt_dir}" >&2 + mount -v "${BOOT_PART}" "${mnt_dir}/boot" >&2 + fi + if [ -n "${EFISYS_PART}" ] ; then + mkdir -p "${mnt_dir}/boot/efi" + mount -v "${EFISYS_PART}" "${mnt_dir}/boot/efi" >&2 fi echo -n "${nbd_dev}" } @@ -203,12 +289,13 @@ lib_find_nbd() { lib_echo_err "lib_find_nbd: mountpoint not given. Exit." exit 1; fi - local mnt_dir=${1} + local mnt_dir + mnt_dir=${1} MAIN_DEVS="$(lsblk | grep nbd | grep disk | cut -d" " -f1)" - if [ ! -z "${MAIN_DEVS}" ]; then + if [ -n "${MAIN_DEVS}" ]; then for md in $MAIN_DEVS; do - if [ ! -z "${md}" ]; then + if [ -n "${md}" ]; then #SUB_DEVS="$(lsblk -l "/dev/${md}" | grep "${md}p" | cut -d" " -f1)" if lsblk -l "/dev/${md}" | grep "${mnt_dir}" >& /dev/null ; then echo -n "${md}" @@ -224,8 +311,9 @@ lib_find_nbd() { # Input {1}: mountpoint # Input {2}: nbd device basename lib_umount_image2() { - local mnt_dir=${1} - local nbd_dev=${2} + local mnt_dir nbd_dev + mnt_dir=${1} + nbd_dev=${2} if [ -z "${mnt_dir}" ] ; then lib_echo_err "lib_umount_image2: mountpoint not given. Exit." @@ -257,8 +345,9 @@ lib_umount_image1() { lib_echo_err "lib_umount_image1: mountpoint not given. Exit." exit 1; fi - local mnt_dir=${1} - local nbd_dev=$(lib_find_nbd "${mnt_dir}") + local mnt_dir nbd_dev + mnt_dir=${1} + nbd_dev=$(lib_find_nbd "${mnt_dir}") if [ -z "${nbd_dev}" ] ; then lib_echo_err "lib_umount_image: nbd device basename not found via mountpoint ${mnt_dir}. Continuing." fi diff --git a/scripts/qcow2_handling b/scripts/qcow2_handling index 089a999..6f9b9a5 100644 --- a/scripts/qcow2_handling +++ b/scripts/qcow2_handling @@ -1,7 +1,7 @@ #!/bin/bash -sdir=`dirname $(readlink -f "${BASH_SOURCE[0]}")` -rootdir=`dirname $sdir` +sdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")") +rootdir=$(dirname "$sdir") # codepage is hardcoded in 'loop_rootfs' and scripts, as well as required by pi-gen build if [ -z ${FAT_CODEPAGE+x} ]; then @@ -14,10 +14,38 @@ fi export CURRENT_IMAGE export CURRENT_MOUNTPOINT -# 1 boot, 2 data, 3 root +# Partition Layout +# - Note: 'bios-boot' is never mounted +# +# With ROOTFS_RO +# - GPT+UEFI +# - 1 bios-boot, 2 efi, 3 boot (mounted) +# - Bios +# - 1 boot (mounted) +# +# RASPI (no ROOTFS_NO) +# - Bios +# - 1 boot (mounted), 2 root +# +# Vanilla (no ROOTFS_NO, no RASPI) +# - GPT+UEFI +# - 1 bios-boot, 2 efi, 3 root +# - Bios +# - 1 boot (unused), 2 root +# +# Total Combinations +# - 1: 1 bios-boot, 2 efi, 3 boot (fat, mounted) +# - 2: 1 bios-boot, 2 efi, 3 root +# - 3: 1 boot (fat, mounted), 2 root (RASPI) +# - 4: 1 boot (fat, unused), 2 root (no RASPI) +# - 5: 1 boot (fat, mounted) + export NBD_DEV +export MAP_BIOSBOOT_DEV +export MAP_EFISYS_DEV export MAP_BOOT_DEV export MAP_ROOT_DEV +export USES_BOOT_PART # set in build.sh # should be fairly enough for the beginning @@ -32,15 +60,42 @@ source ${sdir}/lib_nbd_img_handling # find and initialize free block device nodes init_nbd() { + if [[ "${GPT_BIOS_UEFI}" = "1" && "${TARGET_RASPI}" = "1" ]]; then + echo "Not supported: GPT_BIOS_UEFI + TARGET_RASPI" + exit 1 + fi + if [[ "${TARGET_RASPI}" = "1" || "${ROOTFS_RO}" = "1" ]]; then + USES_BOOT_PART="1" + else + USES_BOOT_PART="0" + fi + if [ -z "${NBD_DEV}" ]; then - local nbd_dev=$(lib_init_nbd) + local nbd_dev + nbd_dev=$(lib_init_nbd) if [ -z "${nbd_dev}" ] ; then echo "init_nbd: NBD device not determined. Exit." exit 1; fi NBD_DEV=${nbd_dev} - MAP_BOOT_DEV=/dev/mapper/${nbd_dev}p1 - MAP_ROOT_DEV=/dev/mapper/${nbd_dev}p2 + MAP_BIOSBOOT_DEV= + MAP_EFISYS_DEV= + MAP_BOOT_DEV= + MAP_ROOT_DEV= + if [ "${GPT_BIOS_UEFI}" = "1" ] ; then + MAP_BIOSBOOT_DEV=/dev/mapper/${nbd_dev}p1 + MAP_EFISYS_DEV=/dev/mapper/${nbd_dev}p2 + if [ "${ROOTFS_RO}" = "1" ]; then + MAP_BOOT_DEV=/dev/mapper/${nbd_dev}p3 + else + MAP_ROOT_DEV=/dev/mapper/${nbd_dev}p3 + fi + else + MAP_BOOT_DEV=/dev/mapper/${nbd_dev}p1 + if [ "${ROOTFS_RO}" != "1" ]; then + MAP_ROOT_DEV=/dev/mapper/${nbd_dev}p2 + fi + fi fi } export -f init_nbd @@ -81,8 +136,10 @@ disconnect_blkdev() { fi lib_disconnect_blkdev "${NBD_DEV}" NBD_DEV= - MAP_BOOT_DEV= - MAP_ROOT_DEV= + MAP_BIOSBOOT_DEV= + MAP_EFISYS_DEV= + MAP_BOOT_DEV= + MAP_ROOT_DEV= CURRENT_IMAGE= } export -f disconnect_blkdev @@ -104,13 +161,17 @@ mount_qimage() { echo "mount_qimage: NBD_DEV not determined. Exit." exit 1; fi - if [ -z "$MAP_ROOT_DEV" -o -z "$MAP_BOOT_DEV" ] ; then - echo "mount_qimage: map devices not determined. Exit." - exit 1; + if [ -n "${MAP_ROOT_DEV}" ]; then + mount -v -t ext4 $MAP_ROOT_DEV "$2" + fi + mkdir -p "$2/boot" + if [ "${USES_BOOT_PART}" = "1" ] ; then + mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "$2/boot" + fi + if [ -n "$MAP_EFISYS_DEV" ] ; then + mkdir -p "$2/boot/efi" + mount -v -t vfat $MAP_EFISYS_DEV "$2/boot/efi" fi - mount -v -t ext4 $MAP_ROOT_DEV "$2" - mkdir -p "$2/boot" - mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "$2/boot" CURRENT_MOUNTPOINT="$2" } export -f mount_qimage @@ -132,13 +193,17 @@ mount_rawimage() { echo "mount_rawimage: NBD_DEV not determined. Exit." exit 1; fi - if [ -z "$MAP_ROOT_DEV" -o -z "$MAP_BOOT_DEV" ] ; then - echo "mount_rawimage: map devices not determined. Exit." - exit 1; + if [ -n "${MAP_ROOT_DEV}" ]; then + mount -v -t ext4 $MAP_ROOT_DEV "$2" + fi + mkdir -p "$2/boot" + if [ "${USES_BOOT_PART}" = "1" ] ; then + mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "$2/boot" + fi + if [ -n "$MAP_EFISYS_DEV" ] ; then + mkdir -p "$2/boot/efi" + mount -v -t vfat $MAP_EFISYS_DEV "$2/boot/efi" fi - mount -v -t ext4 $MAP_ROOT_DEV "$2" - mkdir -p "$2/boot" - mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "$2/boot" CURRENT_MOUNTPOINT="$2" } export -f mount_rawimage @@ -169,8 +234,11 @@ export -f umount_image # create base image / backing image / mount image load_qimage() { if [ -z "${CURRENT_MOUNTPOINT}" ]; then + if [ "${ROOTFS_RO}" = "1" ]; then + rm -rf "${ROOTFS_DIR}" + fi if [ ! -d "${ROOTFS_DIR}" ]; then - mkdir -p "${ROOTFS_DIR}"; + mkdir -p "${ROOTFS_DIR}" fi if [ "${CLEAN}" = "1" ] && [ -f "${WORK_DIR}/image-${STAGE}.qcow2" ]; then @@ -187,16 +255,30 @@ load_qimage() { sync qemu-nbd --discard=unmap -c /dev/${NBD_DEV} image-${STAGE}.qcow2 sync - - if [ "${ROOTFS_RO}" = "1" ] ; then - # 1 boot (7100 MiB), rootfs (remainder of BASE_QCOW2_SIZE) - sfdisk /dev/${NBD_DEV} << EOF -4MiB,7100MiB,c,* -7104MiB,,83; + if [ -n "$MAP_EFISYS_DEV" ] ; then + if [ "${ROOTFS_RO}" = "1" ] ; then + # 1 bios-boot (1 MiB), efi-sys (700MiB), boot (remainder of BASE_QCOW2_SIZE) + sgdisk --zap-all \ + --new 1::+1M --typecode=1:ef02 --change-name=1:'BIOS boot partition' \ + --new 2::+700M --typecode=2:ef00 --change-name=2:'EFI System' \ + --new 3::0 --typecode=3:0700 --change-name=2:'Boot RO root filesystem host' \ + "/dev/${NBD_DEV}" + else + # 1 bios-boot (1 MiB), efi-sys (700MiB), rootfs (remainder of BASE_QCOW2_SIZE) + sgdisk --zap-all \ + --new 1::+1M --typecode=1:ef02 --change-name=1:'BIOS boot partition' \ + --new 2::+700M --typecode=2:ef00 --change-name=2:'EFI System' \ + --new 3::0 --typecode=3:8300 --change-name=3:'Root filesystem' \ + "/dev/${NBD_DEV}" + fi + elif [ "${ROOTFS_RO}" = "1" ] ; then + # 1 boot (remainder of BASE_QCOW2_SIZE), no rootfs + sfdisk "/dev/${NBD_DEV}" << EOF +4MiB,,c,; EOF else # 1 boot (250 MiB), rootfs (remainder of BASE_QCOW2_SIZE) - sfdisk /dev/${NBD_DEV} << EOF + sfdisk "/dev/${NBD_DEV}" << EOF 4MiB,250MiB,c,* 254MiB,,83; EOF @@ -204,30 +286,32 @@ EOF sync kpartx -a /dev/${NBD_DEV} - case ${BOOT_FSTYPE} in - xfs) - mkfs.xfs -L BOOT $MAP_BOOT_DEV - ;; - ext4) - mkfs.ext4 -L BOOT -O "^huge_file,^metadata_csum,^64bit" $MAP_BOOT_DEV - ;; - ext2) - mkfs.ext2 -L BOOT -O "^has_journal,^huge_file,^metadata_csum,^64bit" $MAP_BOOT_DEV - ;; - vfat) - mkfs.fat -n BOOT -F 32 --codepage=${FAT_CODEPAGE} -v $MAP_BOOT_DEV - ;; - *) - echo "BOOT_FSTYPE not one of[xfs,ext4,ext2,vfat] but '${BOOT_FSTYPE}'. Exit." - exit 1; - ;; - esac + if [ -n "${MAP_BOOT_DEV}" ]; then + case ${BOOT_FSTYPE} in + xfs) + mkfs.xfs -L BOOT "$MAP_BOOT_DEV" + ;; + ext4) + mkfs.ext4 -L BOOT -O "^huge_file,^metadata_csum,^64bit" "$MAP_BOOT_DEV" + ;; + ext2) + mkfs.ext2 -L BOOT -O "^has_journal,^huge_file,^metadata_csum,^64bit" "$MAP_BOOT_DEV" + ;; + vfat) + mkfs.fat -n BOOT -F 32 --codepage="${FAT_CODEPAGE}" -v "$MAP_BOOT_DEV" + ;; + *) + echo "BOOT_FSTYPE not one of[xfs,ext4,ext2,vfat] but '${BOOT_FSTYPE}'. Exit." + exit 1; + ;; + esac + fi + if [ -n "$MAP_EFISYS_DEV" ] ; then + mkfs.fat -n EFISYS -F 32 -v "$MAP_EFISYS_DEV" + fi - if [ "${ROOTFS_RO}" = "1" ] ; then - # Set reserved-blocks-percentage for root to zero, no journaling - mkfs.ext4 -L ROOTFS -m 0 -O "^has_journal,^huge_file,^metadata_csum,^64bit" $MAP_ROOT_DEV - else - mkfs.ext4 -L ROOTFS -O "^huge_file,^metadata_csum,^64bit" $MAP_ROOT_DEV + if [ -n "${MAP_ROOT_DEV}" ]; then + mkfs.ext4 -L ROOTFS -O "^huge_file,^metadata_csum,^64bit" "$MAP_ROOT_DEV" fi sync else @@ -242,11 +326,27 @@ EOF qemu-nbd --discard=unmap -c /dev/${NBD_DEV} image-${STAGE}.qcow2 sync kpartx -a /dev/${NBD_DEV} + if [ "${ROOTFS_RO}" = "1" ]; then + if [[ -z "${PREV_ROOTFS_DIR}" || ! -d "${PREV_ROOTFS_DIR}" ]]; then + echo "PREV_ROOTFS_DIR: ${PREV_ROOTFS_DIR}, stage ${STAGE}" + exit 1 + fi + echo "ROOTFS_RO: rsync ${PREV_ROOTFS_DIR}/ ${ROOTFS_DIR}/" + rsync -a "${PREV_ROOTFS_DIR}/" "${ROOTFS_DIR}/" + sync + fi fi - - mount -v -t ext4 $MAP_ROOT_DEV "${ROOTFS_DIR}" - mkdir -p "${ROOTFS_DIR}/boot" - mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "${ROOTFS_DIR}/boot" + if [ -n "${MAP_ROOT_DEV}" ]; then + mount -v -t ext4 $MAP_ROOT_DEV "${ROOTFS_DIR}" + fi + mkdir -p "${ROOTFS_DIR}/boot" + if [ "${USES_BOOT_PART}" = "1" ] ; then + mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "${ROOTFS_DIR}/boot" + fi + if [ -n "$MAP_EFISYS_DEV" ] ; then + mkdir -p "${ROOTFS_DIR}/boot/efi" + mount -v -t vfat $MAP_EFISYS_DEV "${ROOTFS_DIR}/boot/efi" + fi CURRENT_IMAGE=${WORK_DIR}/image-${STAGE}.qcow2 CURRENT_MOUNTPOINT=${ROOTFS_DIR} popd > /dev/null @@ -260,7 +360,7 @@ export -f load_qimage # umount current image and refresh mount point env var unload_qimage() { - if [ ! -z "${CURRENT_MOUNTPOINT}" ]; then + if [ -n "${CURRENT_MOUNTPOINT}" ]; then fstrim -v "${CURRENT_MOUNTPOINT}" || true umount_image "${CURRENT_MOUNTPOINT}" fi @@ -283,35 +383,47 @@ function resize_qcow2() { return 1 fi - # 1 boot, 2 rootfs + # 1 boot, 2 uefi (optional), 3 rootfs # # rootfs ext4 ^journal => ext2, second partition # ROOT_MARGIN=$((800*1024*1024)) ROOT_MARGIN=$((1*1024*1024)) - PARTED_OUT=`parted -s -m "/dev/${NBD_DEV}" unit B print` - #PART_NO=`echo "$PARTED_OUT" | grep ext[24] | awk -F: ' { print $1 } '` - #PART_START=`echo "$PARTED_OUT" | grep ext[24] | awk -F: ' { print substr($2,1,length($2)-1) } '` - PART_NO=2 - PART_START=`echo "$PARTED_OUT" | grep "^${PART_NO}:" | awk -F: ' { print substr($2,1,length($2)-1) } '` + PARTED_OUT=$(parted -s -m "/dev/${NBD_DEV}" unit B print) + #PART_NO=$(echo "$PARTED_OUT" | grep ext[24] | awk -F: ' { print $1 } ') + #PART_START=$(echo "$PARTED_OUT" | grep ext[24] | awk -F: ' { print substr($2,1,length($2)-1) } ') + if [ -n "$MAP_EFISYS_DEV" ] ; then + PART_NO=3 + else + PART_NO=2 + fi + PART_START=$(echo "$PARTED_OUT" | grep "^${PART_NO}:" | awk -F: ' { print substr($2,1,length($2)-1) } ') e2fsck -y -f $MAP_ROOT_DEV || true - DATA_SIZE=`resize2fs -P $MAP_ROOT_DEV | awk -F': ' ' { print $2 } '` BLOCK_SIZE=$(e2fs_block_size $MAP_ROOT_DEV) - let DATA_SIZE=$DATA_SIZE+$ROOT_MARGIN/$BLOCK_SIZE - resize2fs -p $MAP_ROOT_DEV $DATA_SIZE - sleep 1 - - let PART_NEW_SIZE=$DATA_SIZE*$BLOCK_SIZE - let PART_NEW_END=$PART_START+$PART_NEW_SIZE - ACT1=`parted -s "/dev/${NBD_DEV}" rm ${PART_NO}` - ACT2=`parted -s "/dev/${NBD_DEV}" unit B mkpart primary $PART_START $PART_NEW_END` - NEW_IMG_SIZE=`parted -s -m "/dev/${NBD_DEV}" unit B print free | tail -1 | awk -F: ' { print substr($2,1,length($2)-1) } '` + if [ -n "$MAP_EFISYS_DEV" ] ; then + # No resize on GPT/UEFI, leave partition layout as-is + ROOT_PART_SIZE_BYTES=$(echo "$PARTED_OUT" | grep "^${PART_NO}:" | awk -F: ' { print substr($4,1,length($4)-1) } ') + BLOCK_COUNT=$(($(($ROOT_PART_SIZE_BYTES+$BLOCK_SIZE-1))/$BLOCK_SIZE)) + NEW_IMG_SIZE= + else + BLOCK_COUNT=$(resize2fs -P $MAP_ROOT_DEV | awk -F': ' ' { print $2 } ') + + let BLOCK_COUNT=$BLOCK_COUNT+$ROOT_MARGIN/$BLOCK_SIZE + resize2fs -p $MAP_ROOT_DEV $BLOCK_COUNT + sleep 1 + + let PART_NEW_SIZE=$BLOCK_COUNT*$BLOCK_SIZE + let PART_NEW_END=$PART_START+$PART_NEW_SIZE + ACT1=$(parted -s "/dev/${NBD_DEV}" rm ${PART_NO}) + ACT2=$(parted -s "/dev/${NBD_DEV}" unit B mkpart primary $PART_START $PART_NEW_END) + ROOT_PART_SIZE_BYTES=$PART_NEW_SIZE + NEW_IMG_SIZE=$(parted -s -m "/dev/${NBD_DEV}" unit B print free | tail -1 | awk -F: ' { print substr($2,1,length($2)-1) } ') + fi ROOT_PART_START=$PART_START - ROOT_PART_SIZE_BYTES=$PART_NEW_SIZE ROOT_PART_BLOCK_SIZE=$BLOCK_SIZE - ROOT_PART_BLOCK_COUNT=$DATA_SIZE + ROOT_PART_BLOCK_COUNT=$BLOCK_COUNT } export -f resize_qcow2 @@ -350,98 +462,136 @@ function write_partitions_qcow2() { } export -f write_partitions_qcow2 +# finalize fstab device-map entries: finalize_fstab_ro <mountpoint> +function finalize_fstab_ro() { + local MOUNTROOT + MOUNTROOT="$1" + + if [ "${ROOTFS_RO}" != "1" ] ; then + echo "finalize_fstab_ro only to be used with ROOTFS_RO. Exit." + exit 1 + fi + + echo "Setup hard devicenames" + local EFISYS_DEV_NAME BOOT_DEV_NAME ROOT_DEV_NAME + EFISYS_DEV_NAME= + BOOT_DEV_NAME= + ROOT_DEV_NAME= + if [ "${GPT_BIOS_UEFI}" = "1" ] ; then + EFISYS_DEV_NAME="\/dev\/mmcblk0p2" + BOOT_DEV_NAME="\/dev\/mmcblk0p3" + ROOT_DEV_NAME="\/dev\/mmcblk0p4" + else + BOOT_DEV_NAME="\/dev\/mmcblk0p1" + ROOT_DEV_NAME="\/dev\/mmcblk0p2" + fi + echo "EFI: $EFISYS_DEV_NAME" + echo "Boot: $BOOT_DEV_NAME" + echo "Fake Root: $ROOT_DEV_NAME" + + echo "Set hard device names in fstab (rootfs ro -> /boot uncommented)" + sed -i "s/BOOTDEV/${BOOT_DEV_NAME}/" "${MOUNTROOT}/etc/fstab" + sed -i "s/EFIDEV/${EFISYS_DEV_NAME}/" "${MOUNTROOT}/etc/fstab" + sed -i "s/ROOTDEV/${ROOT_DEV_NAME}/" "${MOUNTROOT}/etc/fstab" + if [ "${TARGET_RASPI}" = "1" ]; then + echo "Set rootfs ro fake device name in cmdline, required" + sed -i "s/ROOTDEV/${ROOT_DEV_NAME}/" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/cmdline.txt" + fi +} +export -f finalize_fstab_ro + # create raw img from qcow2: make_bootable_image <in.qcow2> <out.img> function make_bootable_image() { + local EXPORT_QCOW2 EXPORT_IMAGE EXPORT_IMAGE_ROOT EXPORT_INFO_ROOT EXPORT_QCOW2="$1" EXPORT_IMAGE="$2" EXPORT_IMAGE_ROOT="$3" EXPORT_INFO_ROOT="$4" - echo "Connect block device to source qcow2" - connect_blkdev "${EXPORT_QCOW2}" - - CALL_FROM_MBI=1 - echo "Resize fs" - resize_qcow2 - sync - CALL_FROM_MBI= - - echo "Disconnect block device" - disconnect_blkdev - - if [ -z "$NEW_IMG_SIZE" ]; then - echo "NEW_IMG_SIZE could not be calculated, cannot process image. Exit." - exit 1 - fi - echo "Shrinking qcow2 image" - qemu-img resize --shrink "${EXPORT_QCOW2}" $NEW_IMG_SIZE - sync - - echo "Convert qcow2 to raw image" - qemu-img convert -f qcow2 -O raw "${EXPORT_QCOW2}" "${EXPORT_IMAGE}" - sync - - echo "Get PARTUUIDs from image" - IMGID="$(blkid -o value -s PTUUID "${EXPORT_IMAGE}")" - - echo "Mount image ${EXPORT_IMAGE}" - MOUNTROOT=${WORK_DIR}/tmpimage - mkdir -p $MOUNTROOT - mount_rawimage "${EXPORT_IMAGE}" $MOUNTROOT - - if [ ! -d "${MOUNTROOT}/root" ]; then - echo "Image damaged or not mounted. Exit." - exit 1 - fi - - if [ "${ROOTFS_RO}" = "1" ] ; then - echo "Setup hard devicenames" - BOOT_DEV_NAME="\/dev\/mmcblk0p1" - echo "Boot: $BOOT_DEV_NAME" - ROOT_DEV_NAME="\/dev\/mmcblk0p2" - echo "Root1: $ROOT_DEV_NAME" + if [ "${ROOTFS_RO}" != "1" ] ; then + echo "Connect block device to source qcow2" + connect_blkdev "${EXPORT_QCOW2}" - echo "Set hard device names in fstab (rootfs ro -> /boot uncommented)" - sed -i "s/BOOTDEV/${BOOT_DEV_NAME}/" "${MOUNTROOT}/etc/fstab" - sed -i "s/ROOTDEV/${ROOT_DEV_NAME}/" "${MOUNTROOT}/etc/fstab" - if [ "${TARGET_RASPI}" = "1" ]; then - echo "Set rootfs ro hard device name in cmdline, required" - sed -i "s/ROOTDEV/${ROOT_DEV_NAME}/" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/cmdline.txt" + CALL_FROM_MBI=1 + echo "Resize fs" + resize_qcow2 + sync + CALL_FROM_MBI= + + echo "Get PARTUUIDs from connected image" + local PARTUUID_EFISYS PARTUUID_BOOT PARTUUID_ROOT + PARTUUID_EFISYS= + PARTUUID_BOOT= + PARTUUID_ROOT= + if [ -n "${MAP_EFISYS_DEV}" ] ; then + PARTUUID_EFISYS=$(blkid -o value -s PARTUUID ${MAP_EFISYS_DEV}) + echo "PARTUUID_EFISYS ${PARTUUID_EFISYS}" fi - else - echo "Setup PARTUUIDs" - BOOT_PARTUUID="${IMGID}-01" - echo "Boot: $BOOT_PARTUUID" - ROOT_PARTUUID="${IMGID}-02" - echo "Root1: $ROOT_PARTUUID" - - if [ ! -z "$BOOT_PARTUUID" ] && [ ! -z "$ROOT_PARTUUID" ]; then - echo "Set UUIDs to make it bootable, required." - sed -i "s/BOOTDEV/PARTUUID=${BOOT_PARTUUID}/" "${MOUNTROOT}/etc/fstab" - sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${MOUNTROOT}/etc/fstab" - if [ "${TARGET_RASPI}" = "1" ]; then - sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/cmdline.txt" + if [ -n "${MAP_BOOT_DEV}" ]; then + PARTUUID_BOOT=$(blkid -o value -s PARTUUID ${MAP_BOOT_DEV}) + echo "PARTUUID_BOOT ${PARTUUID_BOOT}" + fi + if [ -n "${MAP_ROOT_DEV}" ]; then + PARTUUID_ROOT=$(blkid -o value -s PARTUUID ${MAP_ROOT_DEV}) + echo "PARTUUID_ROOT ${PARTUUID_ROOT}" + fi + + echo "Disconnect block device" + disconnect_blkdev + + if [ "${GPT_BIOS_UEFI}" != "1" ] ; then + if [ -z "$NEW_IMG_SIZE" ]; then + echo "NEW_IMG_SIZE could not be calculated, cannot process image. Exit." + exit 1 fi + echo "Shrinking qcow2 image" + qemu-img resize --shrink "${EXPORT_QCOW2}" $NEW_IMG_SIZE + sync fi fi + + echo "Convert qcow2 to raw image" + echo "- qcow2: ${EXPORT_QCOW2}" + echo "- raw: ${EXPORT_IMAGE}" + qemu-img convert -f qcow2 -O raw "${EXPORT_QCOW2}" "${EXPORT_IMAGE}" + sync + + if [ "${ROOTFS_RO}" != "1" ] ; then + echo "Mount image ${EXPORT_IMAGE}" + MOUNTROOT=${WORK_DIR}/tmpimage + mkdir -p $MOUNTROOT + mount_rawimage "${EXPORT_IMAGE}" $MOUNTROOT + + if [ ! -d "${MOUNTROOT}/root" ]; then + echo "Image damaged or not mounted. Exit." + exit 1 + fi - echo "Umount image ${EXPORT_IMAGE}" - sync - umount_image $MOUNTROOT + echo "Set UUIDs to make it bootable, required." + sed -i "s/BOOTDEV/PARTUUID=${PARTUUID_BOOT}/" "${MOUNTROOT}/etc/fstab" + sed -i "s/EFIDEV/PARTUUID=${PARTUUID_EFISYS}/" "${MOUNTROOT}/etc/fstab" + sed -i "s/ROOTDEV/PARTUUID=${PARTUUID_ROOT}/" "${MOUNTROOT}/etc/fstab" + if [ "${TARGET_RASPI}" = "1" ]; then + sed -i "s/ROOTDEV/PARTUUID=${PARTUUID_ROOT}/" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/cmdline.txt" + fi - echo "Extracting partitions - Writing partitions from ${EXPORT_IMAGE}" - connect_raw_blkdev "${EXPORT_IMAGE}" - - CALL_FROM_MBI=1 - # 1 boot (512), 2 rootfs (4096) - echo "Extract partitions to raw image" - write_partitions_qcow2 $MAP_ROOT_DEV $ROOT_PART_BLOCK_SIZE $ROOT_PART_BLOCK_COUNT $EXPORT_IMAGE_ROOT $EXPORT_INFO_ROOT - sync - CALL_FROM_MBI= - - echo "Disconnect block device" - disconnect_blkdev - + echo "Umount image ${EXPORT_IMAGE}" + sync + umount_image $MOUNTROOT + + echo "Extracting partitions - Writing partitions from ${EXPORT_IMAGE}" + connect_raw_blkdev "${EXPORT_IMAGE}" + + CALL_FROM_MBI=1 + # 1 boot (512), 2 rootfs (4096) + echo "Extract partitions to raw image" + write_partitions_qcow2 $MAP_ROOT_DEV $ROOT_PART_BLOCK_SIZE $ROOT_PART_BLOCK_COUNT $EXPORT_IMAGE_ROOT $EXPORT_INFO_ROOT + sync + CALL_FROM_MBI= + + echo "Disconnect block device" + disconnect_blkdev + fi echo "Remove qcow2 export image" rm -f "${EXPORT_QCOW2}" } diff --git a/stage1/01-sys-tweaks/files/fstab b/stage1/01-sys-tweaks/files/fstab index 3238758..24fa662 100644 --- a/stage1/01-sys-tweaks/files/fstab +++ b/stage1/01-sys-tweaks/files/fstab @@ -1,3 +1,4 @@ proc /proc proc defaults 0 0 # BOOTDEV /boot vfat defaults 0 2 +# EFIDEV /boot/efi vfat defaults 0 2 ROOTDEV / ext4 defaults,noatime 0 1 diff --git a/stage2/01-sys-tweaks/00-packages b/stage2/01-sys-tweaks/00-packages index ab1aff3..51dfb55 100644 --- a/stage2/01-sys-tweaks/00-packages +++ b/stage2/01-sys-tweaks/00-packages @@ -38,3 +38,4 @@ pciutils busybox initramfs-tools-core initramfs-tools +openssh-server openssh-client diff --git a/stage2/01-sys-tweaks/00-packages-bookworm b/stage2/01-sys-tweaks/00-packages-bookworm index 683e70b..7542e4f 100644 --- a/stage2/01-sys-tweaks/00-packages-bookworm +++ b/stage2/01-sys-tweaks/00-packages-bookworm @@ -38,3 +38,4 @@ pciutils busybox initramfs-tools-core initramfs-tools +openssh-server openssh-client diff --git a/stage2/01-sys-tweaks/00-packages-bullseye b/stage2/01-sys-tweaks/00-packages-bullseye index 683e70b..7542e4f 100644 --- a/stage2/01-sys-tweaks/00-packages-bullseye +++ b/stage2/01-sys-tweaks/00-packages-bullseye @@ -38,3 +38,4 @@ pciutils busybox initramfs-tools-core initramfs-tools +openssh-server openssh-client diff --git a/stage2/01-sys-tweaks/00-packages-sys-debian b/stage2/01-sys-tweaks/00-packages-sys-debian index d8cdf6f..7289231 100644 --- a/stage2/01-sys-tweaks/00-packages-sys-debian +++ b/stage2/01-sys-tweaks/00-packages-sys-debian @@ -1,3 +1,4 @@ sysfsutils xfsprogs +e2fsprogs grub-pc diff --git a/stage2/01-sys-tweaks/00-packages-sys-debian-amd64 b/stage2/01-sys-tweaks/00-packages-sys-debian-amd64 new file mode 100644 index 0000000..1bd89b1 --- /dev/null +++ b/stage2/01-sys-tweaks/00-packages-sys-debian-amd64 @@ -0,0 +1,10 @@ +sysfsutils +xfsprogs +e2fsprogs +#grub-pc +#grub-efi-amd64-bin +grub-pc-bin +efibootmgr +grub-efi-amd64 +grub-efi-amd64-bin +grub-efi-amd64-signed diff --git a/stage2/01-sys-tweaks/01-run.sh b/stage2/01-sys-tweaks/01-run.sh index 8014d56..29db04e 100755 --- a/stage2/01-sys-tweaks/01-run.sh +++ b/stage2/01-sys-tweaks/01-run.sh @@ -1,9 +1,17 @@ #!/bin/bash -e if [ "${ROOTFS_RO}" = "1" ] ; then - install -v -m 644 files/fstab-rootfs_ro "${ROOTFS_DIR}/etc/fstab" + if [ -n "${UEFI_ARCH}" ] ; then + install -v -m 644 files/fstab-efisys-rootfs_ro "${ROOTFS_DIR}/etc/fstab" + else + install -v -m 644 files/fstab-bios-rootfs_ro "${ROOTFS_DIR}/etc/fstab" + fi else - install -v -m 644 files/fstab-rootfs_rw "${ROOTFS_DIR}/etc/fstab" + if [ -n "${UEFI_ARCH}" ] ; then + install -v -m 644 files/fstab-efisys-rootfs_rw "${ROOTFS_DIR}/etc/fstab" + else + install -v -m 644 files/fstab-bios-rootfs_rw "${ROOTFS_DIR}/etc/fstab" + fi fi install -m 644 files/overlay_mount.service "${ROOTFS_DIR}/lib/systemd/system/" install -m 755 files/overlay_mount "${ROOTFS_DIR}/etc/init.d/" @@ -81,6 +89,7 @@ on_chroot << EOF fi systemctl disable regenerate_ssh_host_keys systemctl mask regenerate_ssh_host_keys + chmod go-rwx /etc/ssh/ssh_host*key if [ "${ROOTFS_RO}" = "1" ] ; then sed -i -e 's/^D \/tmp/#D \/tmp/g' /usr/lib/tmpfiles.d/tmp.conf @@ -159,12 +168,24 @@ on_chroot << EOF echo "\$i" >> /etc/modules echo "\$i" >> /etc/initramfs-tools/modules done + elif [ -n "${UEFI_ARCH}" ] ; then + systemctl disable resize2fs_once + systemctl mask resize2fs_once else systemctl unmask resize2fs_once systemctl enable resize2fs_once fi EOF +mkdir -p "${ROOTFS_DIR}/boot/grub/theme" +install -m 644 files/grub/theme/grub.png "${ROOTFS_DIR}/boot/grub/theme/grub.png" +install -m 644 files/grub/theme/desktop-4x3.svg "${ROOTFS_DIR}/boot/grub/theme/desktop-4x3.svg" +install -m 644 files/grub/theme/desktop-4x3.png "${ROOTFS_DIR}/boot/grub/theme/desktop-4x3.png" +install -m 644 files/grub/theme/desktop-16x9.svg "${ROOTFS_DIR}/boot/grub/theme/desktop-16x9.svg" +if [ "${TARGET_RASPI}" != "1" ]; then + echo "GRUB_BACKGROUND=/boot/theme/grub.png" >> "${ROOTFS_DIR}/etc/default/grub" +fi + if [ "${ROOTFS_RO}" = "1" ] ; then if [ "${TARGET_RASPI}" = "1" ]; then install -m 644 files/boot/config-rootfs_ro.txt "${ROOTFS_DIR}/boot/config.txt" @@ -177,17 +198,21 @@ if [ "${ROOTFS_RO}" = "1" ] ; then sed -i "s/arm_64bit=1/# arm_64bit=1/g" "${ROOTFS_DIR}/boot/sys_${TARGET_ARCH}_000/config.txt" fi else + install -m 644 files/grub/grub-rootfs_ro.cfg "${ROOTFS_DIR}/boot/grub/grub.cfg" install -m 644 files/grub/custom-rootfs_ro.cfg "${ROOTFS_DIR}/boot/grub/custom.cfg" sed -i "s/sys_amd64_000/sys_${TARGET_ARCH}_000/g" "${ROOTFS_DIR}/boot/grub/custom.cfg" cp "${ROOTFS_DIR}/boot/grub/custom.cfg" "${ROOTFS_DIR}/boot/sys_${TARGET_ARCH}_000/" sed -i 's/GRUB_DEFAULT=.*$/GRUB_DEFAULT=loop_rootfs/g;s/GRUB_TIMEOUT=.*$/GRUB_TIMEOUT=0/g;s/#GRUB_TERMINAL=.*$/GRUB_TERMINAL=console/g;s/#GRUB_DISABLE_LINUX_UUID=.*$/GRUB_DISABLE_LINUX_UUID=true/g' "${ROOTFS_DIR}/etc/default/grub" echo "GRUB_DISABLE_LINUX_PARTUUID=true" >> "${ROOTFS_DIR}/etc/default/grub" echo "GRUB_DISABLE_RECOVERY=true" >> "${ROOTFS_DIR}/etc/default/grub" + echo "GRUB_DISABLE_OS_PROBER=true" >> "${ROOTFS_DIR}/etc/default/grub" rm -f "${ROOTFS_DIR}/etc/grub.d/05_debian_theme" rm -f "${ROOTFS_DIR}/etc/grub.d/10_linux" rm -f "${ROOTFS_DIR}/etc/grub.d/20_linux_xen" rm -f "${ROOTFS_DIR}/etc/grub.d/30_os-prober" - rm -f "${ROOTFS_DIR}/etc/grub.d/30_uefi-firmware" + if [ -z "${UEFI_ARCH}" ] ; then + rm -f "${ROOTFS_DIR}/etc/grub.d/30_uefi-firmware" + fi rm -f "${ROOTFS_DIR}/etc/grub.d/20_memtest86" rm -f "${ROOTFS_DIR}/etc/grub.d/20_memtest86+" fi @@ -268,15 +293,37 @@ on_chroot <<EOF fi fi if [ "${TARGET_RASPI}" != "1" ]; then - update-grub + # BIOS Boot + echo "GRUB Install: BIOS: ROOTFS_RO=${ROOTFS_RO}" if [ "${ROOTFS_RO}" = "1" ] ; then - grub-install --force-file-id --modules="gzio part_msdos fat" /dev/${NBD_DEV} + # using manually copied /boot/grub/grub.cfg + grub-install --target=i386-pc --force-file-id --modules="gzio part_msdos part_gpt fat" /dev/${NBD_DEV} else - grub-install --force-file-id --modules="gzio part_msdos fat ext2" /dev/${NBD_DEV} + grub-install --target=i386-pc --force-file-id --modules="gzio part_msdos part_gpt fat ext2 xfs" /dev/${NBD_DEV} + update-grub + fi + if [ -n "${UEFI_ARCH}" ] ; then + # EFI Boot + echo "GRUB Install: UEFI: Using grub-install. ROOTFS_RO=${ROOTFS_RO}" + mkdir -p /boot/efi/EFI/BOOT + # --removable: EFI/BOOT/bootx64.efi + # --uefi-secure-boot (we disable this option) + grub-install --target=${UEFI_ARCH}-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=BOOT fi - # Remove storage device related search.fs_uuid and allow multi homing rm -f /boot/grub/i386-pc/load.cfg + if [ -n "${UEFI_ARCH}" ] ; then + rm -f /boot/grub/${UEFI_ARCH}-efi/load.cfg + fi fi EOF +if [ "${TARGET_RASPI}" != "1" ]; then + if [ -n "${UEFI_ARCH}" ] ; then + if [ "${ROOTFS_RO}" = "1" ] ; then + install -m 644 files/EFI/BOOT/grub-rootfs_ro.cfg "${ROOTFS_DIR}/boot/efi/EFI/BOOT/grub.cfg" + else + install -m 644 files/EFI/BOOT/grub-rootfs_rw.cfg "${ROOTFS_DIR}/boot/efi/EFI/BOOT/grub.cfg" + fi + fi +fi diff --git a/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_ro.cfg b/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_ro.cfg new file mode 100644 index 0000000..cbd33a7 --- /dev/null +++ b/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_ro.cfg @@ -0,0 +1,2 @@ +search --label "BOOT" --set prefix +configfile (\$prefix)/grub/grub.cfg diff --git a/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_rw.cfg b/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_rw.cfg new file mode 100644 index 0000000..b7358c4 --- /dev/null +++ b/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_rw.cfg @@ -0,0 +1,2 @@ +search --label "ROOTFS" --set prefix +configfile (\$prefix)/boot/grub/grub.cfg diff --git a/stage2/01-sys-tweaks/files/fstab-bios-rootfs_ro b/stage2/01-sys-tweaks/files/fstab-bios-rootfs_ro new file mode 100644 index 0000000..bb8c127 --- /dev/null +++ b/stage2/01-sys-tweaks/files/fstab-bios-rootfs_ro @@ -0,0 +1,3 @@ +proc /proc proc defaults 0 0 +# BOOTDEV /boot vfat defaults 0 2 +ROOTDEV / ext4 defaults,noatime,ro,errors=remount-ro 0 0 diff --git a/stage2/01-sys-tweaks/files/fstab-bios-rootfs_rw b/stage2/01-sys-tweaks/files/fstab-bios-rootfs_rw new file mode 100644 index 0000000..c13a146 --- /dev/null +++ b/stage2/01-sys-tweaks/files/fstab-bios-rootfs_rw @@ -0,0 +1,2 @@ +proc /proc proc defaults 0 0 +ROOTDEV / ext4 defaults,noatime,errors=remount-ro 0 0 diff --git a/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_ro b/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_ro new file mode 100644 index 0000000..679d148 --- /dev/null +++ b/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_ro @@ -0,0 +1,4 @@ +proc /proc proc defaults 0 0 +# BOOTDEV /boot vfat defaults 0 2 +# EFIDEV /boot/efi vfat defaults 0 2 +ROOTDEV / ext4 defaults,noatime,errors=remount-ro 0 0 diff --git a/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_rw b/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_rw new file mode 100644 index 0000000..5ae6b66 --- /dev/null +++ b/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_rw @@ -0,0 +1,3 @@ +proc /proc proc defaults 0 0 +EFIDEV /boot/efi vfat defaults 0 2 +ROOTDEV / ext4 defaults,noatime,errors=remount-ro 0 0 diff --git a/stage2/01-sys-tweaks/files/fstab-rootfs_ro b/stage2/01-sys-tweaks/files/fstab-rootfs_ro deleted file mode 100644 index ad040ea..0000000 --- a/stage2/01-sys-tweaks/files/fstab-rootfs_ro +++ /dev/null @@ -1,3 +0,0 @@ -proc /proc proc defaults 0 0 -# BOOTDEV /boot vfat defaults 0 2 -ROOTDEV / ext4 defaults,noatime,ro,errors=remount-ro 0 0 diff --git a/stage2/01-sys-tweaks/files/fstab-rootfs_rw b/stage2/01-sys-tweaks/files/fstab-rootfs_rw deleted file mode 100644 index 5a4df6b..0000000 --- a/stage2/01-sys-tweaks/files/fstab-rootfs_rw +++ /dev/null @@ -1,3 +0,0 @@ -proc /proc proc defaults 0 0 -BOOTDEV /boot vfat defaults 0 2 -ROOTDEV / ext4 defaults,noatime,errors=remount-ro 0 0 diff --git a/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro-console.cfg b/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro-console.cfg new file mode 100755 index 0000000..3036c9f --- /dev/null +++ b/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro-console.cfg @@ -0,0 +1,86 @@ +# +# DO NOT EDIT THIS FILE +# +# It is automatically generated by grub-mkconfig using templates +# from /etc/grub.d and settings from /etc/default/grub +# + +### BEGIN /etc/grub.d/00_header ### +if [ -s $prefix/grubenv ]; then + set have_grubenv=true + load_env +fi +if [ "${next_entry}" ] ; then + set default="${next_entry}" + set next_entry= + save_env next_entry + set boot_once=true +else + set default="loop_rootfs" +fi + +if [ x"${feature_menuentry_id}" = xy ]; then + menuentry_id_option="--id" +else + menuentry_id_option="" +fi + +export menuentry_id_option + +if [ "${prev_saved_entry}" ]; then + set saved_entry="${prev_saved_entry}" + save_env saved_entry + set prev_saved_entry= + save_env prev_saved_entry + set boot_once=true +fi + +function savedefault { + if [ -z "${boot_once}" ]; then + saved_entry="${chosen}" + save_env saved_entry + fi +} +function load_video { + if [ x$feature_all_video_module = xy ]; then + insmod all_video + else + insmod efi_gop + insmod efi_uga + insmod ieee1275_fb + insmod vbe + insmod vga + insmod video_bochs + insmod video_cirrus + fi +} + +terminal_input console +terminal_output console +if [ "${recordfail}" = 1 ] ; then + set timeout=30 +else + if [ x$feature_timeout_style = xy ] ; then + set timeout_style=menu + set timeout=5 + # Fallback normal timeout code in case the timeout_style feature is + # unavailable. + else + set timeout=5 + fi +fi +### END /etc/grub.d/00_header ### + +### BEGIN /etc/grub.d/40_custom ### +# This file provides an easy way to add custom menu entries. Simply type the +# menu entries you want to add after this comment. Be careful not to change +# the 'exec tail' line above. +### END /etc/grub.d/40_custom ### + +### BEGIN /etc/grub.d/41_custom ### +if [ -f ${config_directory}/custom.cfg ]; then + source ${config_directory}/custom.cfg +elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then + source $prefix/custom.cfg +fi +### END /etc/grub.d/41_custom ### diff --git a/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro.cfg b/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro.cfg new file mode 100755 index 0000000..2d2f869 --- /dev/null +++ b/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro.cfg @@ -0,0 +1,120 @@ +# +# DO NOT EDIT THIS FILE +# +# It is automatically generated by grub-mkconfig using templates +# from /etc/grub.d and settings from /etc/default/grub +# + +### BEGIN /etc/grub.d/00_header ### +if [ -s $prefix/grubenv ]; then + set have_grubenv=true + load_env +fi +if [ "${next_entry}" ] ; then + set default="${next_entry}" + set next_entry= + save_env next_entry + set boot_once=true +else + set default="loop_rootfs" +fi + +if [ x"${feature_menuentry_id}" = xy ]; then + menuentry_id_option="--id" +else + menuentry_id_option="" +fi + +export menuentry_id_option + +if [ "${prev_saved_entry}" ]; then + set saved_entry="${prev_saved_entry}" + save_env saved_entry + set prev_saved_entry= + save_env prev_saved_entry + set boot_once=true +fi + +function savedefault { + if [ -z "${boot_once}" ]; then + saved_entry="${chosen}" + save_env saved_entry + fi +} +function load_video { + if [ x$feature_all_video_module = xy ]; then + insmod all_video + else + insmod efi_gop + insmod efi_uga + insmod ieee1275_fb + insmod vbe + insmod vga + insmod video_bochs + insmod video_cirrus + fi +} + +insmod gzio +insmod part_msdos +insmod part_gpt +insmod ext2 +insmod fat + +font=${config_directory}/unicode.pf2 + +if loadfont $font ; then + set gfxmode=auto + load_video + insmod gfxterm + set locale_dir=$prefix/locale + set lang=en_US + insmod gettext +fi +terminal_output gfxterm +insmod png +background_image -m stretch ${config_directory}/theme/grub.png +if [ "${recordfail}" = 1 ] ; then + set timeout=30 +else + if [ x$feature_timeout_style = xy ] ; then + set timeout_style=menu + set timeout=5 + # Fallback normal timeout code in case the timeout_style feature is + # unavailable. + else + set timeout=5 + fi +fi +### END /etc/grub.d/00_header ### + +### BEGIN /etc/grub.d/05_debian_theme ### +if background_image ${config_directory}/theme/grub.png; then + true +else + set menu_color_normal=cyan/blue + set menu_color_highlight=white/blue +fi +### END /etc/grub.d/05_debian_theme ### + +function gfxmode { + set gfxpayload="${1}" +} +set linux_gfx_mode= +export linux_gfx_mode + +### BEGIN /etc/grub.d/41_custom ### +if [ -f ${config_directory}/custom.cfg ]; then + source ${config_directory}/custom.cfg +elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then + source $prefix/custom.cfg +fi +### END /etc/grub.d/41_custom ### + +### BEGIN /etc/grub.d/30_uefi-firmware ### +if [ "$grub_platform" = "efi" ]; then + menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' { + fwsetup + } +fi + diff --git a/stage2/01-sys-tweaks/files/grub/theme/desktop-16x9.svg b/stage2/01-sys-tweaks/files/grub/theme/desktop-16x9.svg new file mode 100644 index 0000000..14d8eaf --- /dev/null +++ b/stage2/01-sys-tweaks/files/grub/theme/desktop-16x9.svg @@ -0,0 +1,261 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg enable-background="new 0 0 1920 1080" version="1.1" viewBox="0 0 1920 1080" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<style type="text/css"> + .st0{clip-path:url(#SVGID_00000093167105208028638090000008063807857182655396_);} + .st1{fill:#05475C;} + .st2{opacity:0.34;fill:url(#SVGID_00000012445251672029399260000003270595326732136081_);enable-background:new ;} + .st3{opacity:0.34;fill:url(#SVGID_00000127010423592997111840000013957416611417821059_);enable-background:new ;} + .st4{opacity:0.34;fill:url(#SVGID_00000101814971404403400460000010609185819928108449_);enable-background:new ;} + .st5{opacity:0.71;} + .st6{fill:#FFFFFF;} + .st7{opacity:0.62;} + .st8{opacity:0.34;fill:url(#SVGID_00000107557325802917530330000017592151723363848840_);enable-background:new ;} + .st9{opacity:0.34;fill:url(#SVGID_00000032650273911267859500000015024660283904495788_);enable-background:new ;} + .st10{opacity:0.34;fill:url(#SVGID_00000057851989095838282160000014663790337944238500_);enable-background:new ;} + .st11{opacity:0.34;fill:url(#SVGID_00000178165242061037739810000007582236097397314448_);enable-background:new ;} + .st12{opacity:0.34;fill:url(#SVGID_00000064329767591241199690000000234602624410839680_);enable-background:new ;} + .st13{opacity:0.34;fill:url(#SVGID_00000014609603927260903510000009061463274724089486_);enable-background:new ;} + .st14{opacity:0.34;fill:url(#SVGID_00000050627399097891942390000014523148072975367070_);enable-background:new ;} + .st15{opacity:0.34;fill:url(#SVGID_00000109731321347584724990000010142768297725207449_);enable-background:new ;} + .st16{opacity:0.34;fill:url(#SVGID_00000000926441590728654410000012560741159445150083_);enable-background:new ;} + .st17{opacity:0.34;fill:url(#SVGID_00000137832232493639134090000003781239364591219342_);enable-background:new ;} + .st18{opacity:0.34;fill:url(#SVGID_00000150812387129626622020000009167110439853258936_);enable-background:new ;} + .st19{opacity:0.34;fill:url(#SVGID_00000179608784322168811290000010365701417373876369_);enable-background:new ;} + .st20{opacity:0.34;fill:url(#SVGID_00000120531069539707179100000007006360167335202962_);enable-background:new ;} + .st21{opacity:0.34;fill:url(#SVGID_00000181089157459068778460000011901104969134050459_);enable-background:new ;} + .st22{opacity:0.34;fill:url(#SVGID_00000062164313994880221460000014631417913117263241_);enable-background:new ;} + .st23{opacity:0.12;fill:url(#SVGID_00000000902067244530690860000014386718989792038839_);enable-background:new ;} + .st24{opacity:0.12;fill:url(#SVGID_00000089550684643991047870000016914371577980347776_);enable-background:new ;} + .st25{opacity:0.12;fill:url(#SVGID_00000084507925595054884490000005003863653038598286_);enable-background:new ;} + .st26{opacity:0.12;fill:url(#SVGID_00000047780407226302564420000009742350089197221517_);enable-background:new ;} + .st27{opacity:0.12;fill:url(#SVGID_00000066480680368962549320000006921805612706891392_);enable-background:new ;} + .st28{opacity:0.12;fill:url(#SVGID_00000122678307387241734090000002868210978020395689_);enable-background:new ;} + .st29{opacity:0.12;fill:url(#SVGID_00000150100474908702981900000008908414767416909709_);enable-background:new ;} + .st30{opacity:0.12;fill:url(#SVGID_00000072960791515750302390000015282140940621514149_);enable-background:new ;} + .st31{opacity:0.12;fill:url(#SVGID_00000114770971300144002370000016800559959910618791_);enable-background:new ;} + .st32{opacity:0.12;fill:url(#SVGID_00000036952937828426554700000000522215132809990844_);enable-background:new ;} + .st33{opacity:0.12;fill:url(#SVGID_00000090974002902719031840000015158340248134540673_);enable-background:new ;} +</style> + + <defs> + <rect id="SVGID_1_" x="-.3" y=".1" width="1920" height="1080"/> + </defs> + <clipPath id="SVGID_00000085218408489160111120000007828018339010817721_"> + <use xlink:href="#SVGID_1_"/> + </clipPath> + <g clip-path="url(#SVGID_00000085218408489160111120000007828018339010817721_)"> + + + <rect class="st1" x="-17.3" y="-74.9" width="1955" height="1231"/> + + <radialGradient id="SVGID_00000018216064389455096890000017941378598996776607_" cx="-680.76" cy="15330" r="1365.4" gradientTransform="matrix(.5 0 0 .5 345.38 -7667.8)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </radialGradient> + + <circle cx="5" cy="-2.8" r="682.7" enable-background="new" fill="url(#SVGID_00000018216064389455096890000017941378598996776607_)" opacity=".34"/> + + <radialGradient id="SVGID_00000000933302580452020710000013162680496496488371_" cx="-1132.4" cy="-1996.9" r="342.1" gradientTransform="matrix(-2.8317 2.4125 -.8042 -.9439 -3965.7 1030.7)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </radialGradient> + + <polygon points="-301.3 537.5 1374 -889.6 1988.4 -168.2 313.1 1258.8" enable-background="new" fill="url(#SVGID_00000000933302580452020710000013162680496496488371_)" opacity=".34"/> + + <radialGradient id="SVGID_00000080193032524742796840000011048436269149918087_" cx="173.04" cy="15838" r="459.4" gradientTransform="matrix(.5 0 0 .5 345.38 -7667.8)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#DAC9BA" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </radialGradient> + + <circle cx="431.9" cy="251.1" r="229.7" enable-background="new" fill="url(#SVGID_00000080193032524742796840000011048436269149918087_)" opacity=".34"/> + + <g class="st7"> + + <radialGradient id="SVGID_00000091732848191404214390000004736846775492618424_" cx="-37.305" cy="10365" r="173.24" gradientTransform="matrix(.8642 .5228 -.5025 .9115 5995.2 -8755.3)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </radialGradient> + + <ellipse cx="766.2" cy="645.9" rx="173.2" ry="181.5" enable-background="new" fill="url(#SVGID_00000091732848191404214390000004736846775492618424_)" opacity=".34"/> + + <linearGradient id="SVGID_00000114788164137069528000000005957745660025105319_" x1="4501.7" x2="4698.5" y1="506.23" y2="506.23" gradientTransform="matrix(-.7151 .699 -.5383 -.5506 4391.6 -2623.4)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="700.3 321.9 810.7 153.3 949 375.1 885 415.5" enable-background="new" fill="url(#SVGID_00000114788164137069528000000005957745660025105319_)" opacity=".34"/> + + <linearGradient id="SVGID_00000054962312987295980090000006017935243511788676_" x1="2066" x2="2337.2" y1="7874.2" y2="7874.2" gradientTransform="matrix(.7774 .629 -.629 .7774 4107.2 -7204.9)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="871.9 494.7 784.8 279.5 810.7 153.3 905.6 201.5 1025.1 241.8 1001 349.2" enable-background="new" fill="url(#SVGID_00000054962312987295980090000006017935243511788676_)" opacity=".34"/> + + <linearGradient id="SVGID_00000012442755421995762960000014664915799359269053_" x1="-7687.7" x2="-7185.4" y1="5138.4" y2="5138.4" gradientTransform="matrix(.3915 -.9202 .9202 .3915 -1099.9 -8403.9)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#AABDCB" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="458.3 613.8 629.2 399.9 799.9 213.2 939.5 373.1" enable-background="new" fill="url(#SVGID_00000012442755421995762960000014664915799359269053_)" opacity=".34"/> + + <linearGradient id="SVGID_00000086651592687441638420000016273738828393233579_" x1="9454.2" x2="9671.5" y1="2925.7" y2="2925.7" gradientTransform="matrix(-.3483 .5724 -.7648 -.6285 6665.3 -3309.4)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="1211.9 391.7 1226.6 518.1 988.7 310.2 972.8 123.9" enable-background="new" fill="url(#SVGID_00000086651592687441638420000016273738828393233579_)" opacity=".34"/> + + <linearGradient id="SVGID_00000095314929038062691570000012080618537926193552_" x1="-4049.4" x2="-3743.9" y1="6098.6" y2="6098.6" gradientTransform="matrix(.7151 -.699 .699 .7151 -446.37 -6772.9)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#AABDCB" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="988.7 310.2 784.8 279.5 889.2 212.3 1029.8 93.1 1208.9 409.2" enable-background="new" fill="url(#SVGID_00000095314929038062691570000012080618537926193552_)" opacity=".34"/> + + <linearGradient id="SVGID_00000069384093065957304470000008686477747994526866_" x1="6255.9" x2="6490.9" y1="2547.1" y2="2547.1" gradientTransform="matrix(-.5898 .8076 -.8076 -.5898 6758.6 -3397.5)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="960 371.1 730.2 237.8 972.8 123.9 1043.6 409.2" enable-background="new" fill="url(#SVGID_00000069384093065957304470000008686477747994526866_)" opacity=".34"/> + + <linearGradient id="SVGID_00000174570387500765410560000018201440021002273169_" x1="-7023" x2="-6656.5" y1="-1443.5" y2="-1443.5" gradientTransform="matrix(-.2682 -.9634 1.0501 -.2924 294.06 -6276.8)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="657.1 531.1 756.4 656.4 507.9 953.1 521.4 741.6" enable-background="new" fill="url(#SVGID_00000174570387500765410560000018201440021002273169_)" opacity=".34"/> + + <linearGradient id="SVGID_00000041276010603755054700000012950505128597653693_" x1="6476.3" x2="6860.4" y1="-3050.7" y2="-3050.7" gradientTransform="matrix(-.9257 .3783 -.3783 -.9257 5603.1 -4641.4)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="397 619.9 699 580.8 766.2 642.6 628.2 832 516.1 895 427.7 829.7" enable-background="new" fill="url(#SVGID_00000041276010603755054700000012950505128597653693_)" opacity=".34"/> + + <linearGradient id="SVGID_00000061435600823447587540000000552723606534874028_" x1="-14448" x2="-13998" y1="-4271" y2="-4271" gradientTransform="matrix(-.2347 -.2596 .879 -.2953 1043 -4356)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#AABDCB" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="431.9 727.7 458.3 613.8 806 449.6 700.3 584.1" enable-background="new" fill="url(#SVGID_00000061435600823447587540000000552723606534874028_)" opacity=".34"/> + + <linearGradient id="SVGID_00000002351047188999019860000002566414104328457898_" x1="12773" x2="13681" y1="6937.4" y2="6937.4" gradientTransform="matrix(.1765 .3022 -.9209 .1087 4716.3 -3888.4)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#AABDCB" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="740.4 729.5 893.4 986.9 504.3 864.5 521.4 741.6" enable-background="new" fill="url(#SVGID_00000002351047188999019860000002566414104328457898_)" opacity=".34"/> + + <linearGradient id="SVGID_00000004534978137110897330000008179059058368671906_" x1="-7687.7" x2="-7400.5" y1="5080.5" y2="5080.5" gradientTransform="matrix(.3915 -.9202 .9202 .3915 -1099.9 -8403.9)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#AABDCB" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="699 580.8 458.3 613.8 533.2 379.6 806 449.6" enable-background="new" fill="url(#SVGID_00000004534978137110897330000008179059058368671906_)" opacity=".34"/> + + <radialGradient id="SVGID_00000091017312778810520490000013487813255627565699_" cx="-108.26" cy="10031" r="181.94" gradientTransform="matrix(.8642 .5228 -.5025 .9115 5995.2 -8755.3)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </radialGradient> + + <ellipse cx="871.9" cy="305.4" rx="181.9" ry="190.6" enable-background="new" fill="url(#SVGID_00000091017312778810520490000013487813255627565699_)" opacity=".34"/> + + <linearGradient id="SVGID_00000093149179829732349710000008128861407447028144_" x1="6476.3" x2="6770.7" y1="-3135.9" y2="-3135.9" gradientTransform="matrix(-.9257 .3783 -.3783 -.9257 5603.1 -4641.4)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="501.4 638.1 766.2 642.6 717.1 936.1 628.2 832 532.1 848" enable-background="new" fill="url(#SVGID_00000093149179829732349710000008128861407447028144_)" opacity=".34"/> + + <linearGradient id="SVGID_00000034071598378061202680000005682775137060128388_" x1="-2446" x2="-2179.5" y1="8617" y2="8617" gradientTransform="matrix(.9797 -.2004 .2004 .9797 1206.6 -8533.7)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#AABDCB" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="533.2 379.6 730.2 345.4 784.8 279.5 797.9 413.5" enable-background="new" fill="url(#SVGID_00000034071598378061202680000005682775137060128388_)" opacity=".34"/> + </g> + + <linearGradient id="SVGID_00000147222259863327894370000004713185813428820113_" x1="-8054.3" x2="-7614.2" y1="5144.3" y2="5144.3" gradientTransform="matrix(.4172 -.9088 .9088 .4172 401.78 -8335.1)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="2140.7 840.5 1984.5 1253.1 1507.2 881.3 1602 731.1" enable-background="new" fill="url(#SVGID_00000147222259863327894370000004713185813428820113_)" opacity=".12"/> + + <linearGradient id="SVGID_00000063620498617606890090000008720960172290484925_" x1="-338.65" x2="213.1" y1="-4980.9" y2="-4980.9" gradientTransform="matrix(-.9511 -.3089 .3089 -.9511 3185.3 -3756.9)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="1556 569.8 1783 991.1 1934.2 1191.5 1645 1256.7 1426.9 1290.3 1413.7 1026.6" enable-background="new" fill="url(#SVGID_00000063620498617606890090000008720960172290484925_)" opacity=".12"/> + + <linearGradient id="SVGID_00000078013590621525976610000006727138897565908112_" x1="5217.2" x2="5885.5" y1="6487.9" y2="6487.9" gradientTransform="matrix(-.035946 .9994 -.9994 -.035946 8477.3 -4502.9)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#AABDCB" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="1933.3 482.6 1995.2 701.9 1737.9 1144.3 1601.6 667.3" enable-background="new" fill="url(#SVGID_00000078013590621525976610000006727138897565908112_)" opacity=".12"/> + + <linearGradient id="SVGID_00000129169157574715853980000000301106401069963673_" x1="8268.4" x2="8986.3" y1="570.84" y2="570.84" gradientTransform="matrix(-.079098 .6653 -.9567 -.2541 3183.2 -4748.3)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="2004.8 870.8 2102.8 1126.5 1757.4 979.3 1814 558.8" enable-background="new" fill="url(#SVGID_00000129169157574715853980000000301106401069963673_)" opacity=".12"/> + + <linearGradient id="SVGID_00000051343387064157711410000007010731585534318724_" x1="-6628.8" x2="-6236.5" y1="4207.9" y2="4207.9" gradientTransform="matrix(.2612 -.9653 .9653 .2612 -653.47 -6361.4)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="1621.5 776.7 2068.4 836 1927.9 1204.4 1463.9 778.1" enable-background="new" fill="url(#SVGID_00000051343387064157711410000007010731585534318724_)" opacity=".12"/> + + <linearGradient id="SVGID_00000169518436558334241300000010220786071391330234_" x1="1836.1" x2="2258.3" y1="7829.2" y2="7829.2" gradientTransform="matrix(.9919 -.1269 .1269 .9919 -1274.9 -6407.4)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="1983.4 1264.7 1663.6 1217.3 1515.2 932.3" enable-background="new" fill="url(#SVGID_00000169518436558334241300000010220786071391330234_)" opacity=".12"/> + + <linearGradient id="SVGID_00000003075246375309062510000005919818320267613622_" x1="10927" x2="11459" y1="12790" y2="12790" gradientTransform="matrix(.3792 .341 -.9317 .5609 7924.4 -10915)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#AABDCB" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="276.7 -75.4 413.8 -51.6 325.9 197.4 26.2 146.4" enable-background="new" fill="url(#SVGID_00000003075246375309062510000005919818320267613622_)" opacity=".12"/> + + <linearGradient id="SVGID_00000151504943794861704500000013710966191068745143_" x1="9379" x2="9964.7" y1="6171.8" y2="6171.8" gradientTransform="matrix(.353 .5695 -.9064 .3978 2451.4 -7980.3)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="320.6 -31.9 538.6 70 180.3 178.5 -2.7 -115.1" enable-background="new" fill="url(#SVGID_00000151504943794861704500000013710966191068745143_)" opacity=".12"/> + + <linearGradient id="SVGID_00000116945986907177242930000003619234899467008173_" x1="-7309.4" x2="-6990.4" y1="-1249.7" y2="-1249.7" gradientTransform="matrix(-.3976 -.9175 .9175 -.3976 -1553.6 -6849.4)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="-37.5 164 354.7 -57.8 441.9 252.1 -163.5 256" enable-background="new" fill="url(#SVGID_00000116945986907177242930000003619234899467008173_)" opacity=".12"/> + + <linearGradient id="SVGID_00000018934028870046402510000005056381095522587327_" x1="-3331.9" x2="-2897" y1="6389.5" y2="6389.5" gradientTransform="matrix(.6964 -.7176 .7176 .6964 -2068.3 -6498.1)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="626.8 154.1 343.4 309.7 69 218.8" enable-background="new" fill="url(#SVGID_00000018934028870046402510000005056381095522587327_)" opacity=".12"/> + + <linearGradient id="SVGID_00000101790783768249243120000007920411576515842194_" x1="-6562.5" x2="-6127.7" y1="1880.1" y2="1880.1" gradientTransform="matrix(-.094803 -.9955 .9955 -.094803 -1443.6 -5086.3)" gradientUnits="userSpaceOnUse"> + <stop stop-color="#18F5B0" offset="0"/> + <stop stop-color="#05475C" stop-opacity="0" offset="1"/> + </linearGradient> + + <polygon points="1185.8 818.7 1120.5 1135.3 873.3 1285.3" enable-background="new" fill="url(#SVGID_00000101790783768249243120000007920411576515842194_)" opacity=".12"/> + <g transform="matrix(3.6992 0 0 3.6992 -680.64 -2515.7)"><path d="m531.96 720.55v-40h170.61v80h-170.61z" fill="none"/><g stroke-width=".12945"><g fill="#7b83bd"><path d="m670.74 730.55c-0.0818-0.0531-0.16919-0.23985-0.19417-0.41492-0.0305-0.21386-0.15161-0.34321-0.36903-0.39418l-0.32362-0.0759-0.0662-21.537-0.29051-0.0669c-0.15979-0.0368-0.78567-0.0815-1.3908-0.0994-1.0948-0.0323-1.1005-0.0343-1.1413-0.38814-0.0289-0.25118-0.13348-0.3789-0.35599-0.43474l-0.31505-0.0791v-4.3657l3.4304-0.0722 0.0834-2.8937c0.0459-1.5915 0.12295-3.2808 0.17123-3.754 0.55772-5.4656 5.2221-8.5581 11.266-7.4696 1.7396 0.31327 1.8663 0.3522 1.9441 0.59727 0.0411 0.12952 0.27584 0.30185 0.52162 0.38297l0.4469 0.14749v2.2594c0 2.6364 0.10954 2.4765-1.5041 2.1943-4.918-0.86025-6.5218 0.83332-6.5218 6.8868 0 1.7286-0.0125 1.7138 1.453 1.7138 1.0904 0 1.1478 0.0143 1.2619 0.31438 0.0801 0.21064 0.23922 0.32811 0.48224 0.35599l0.36271 0.0416 0.0353 2.2977 0.0354 2.2977h-1.67c-2.2052 0-1.9538-1.4471-1.9922 11.469l-0.0331 11.12-2.589 0.0319c-1.424 0.0175-2.6559-0.0116-2.7378-0.0647z"/><path d="m591.61 730.9c-3.7039-0.53738-7.0106-3.4323-8.0598-7.0559l-0.29814-1.0298v-20.194l5.3776-0.07 0.0768 0.38392c0.0525 0.26237 0.16432 0.3964 0.35328 0.42334l0.27649 0.0394 0.0736 9.2556c0.079 9.9387 0.0773 9.9135 0.76626 11.257 1.3801 2.6904 6.9458 2.3678 9.9291-0.57556l1.074-1.0596 0.0664-19.654h5.2958l0.0753 0.3189c0.047 0.19927 0.19491 0.34714 0.39418 0.39418l0.3189 0.0753 0.033 13.514c0.0262 10.725-5.2e-4 13.535-0.12945 13.617-0.20417 0.12963-4.8997 0.13701-5.0989 8e-3 -0.0808-0.0523-0.16844-0.20905-0.19485-0.34833-0.0269-0.14191-0.18997-0.28648-0.37096-0.32888-0.28889-0.0677-0.32714-0.15018-0.36272-0.78238-0.0542-0.96318-0.15572-1.0082-0.91689-0.40651-2.3769 1.8788-5.5074 2.6793-8.679 2.2191z"/><path d="m561.76 730.95c-4.2843-0.56824-7.407-4.7148-6.4879-8.6152 0.86029-3.6509 3.4588-5.5455 11.131-8.1162 4.6592-1.5611 4.2768-1.3005 4.1863-2.8524-0.15943-2.7352-0.79601-3.3326-3.6916-3.4641-3.0082-0.13663-5.6954 0.70511-8.7593 2.7438-1.2728 0.8469-1.3628 0.86348-1.3628 0.25112 0-0.48648 0.0213-0.47889-0.61488-0.21878-0.12635 0.0517-0.16181-0.51706-0.16181-2.5949v-2.661l0.82694-0.5901c5.2674-3.7587 13.751-3.7839 17.434-0.0517 2.5162 2.5493 2.6105 3.0035 2.702 13.017 0.0531 5.8125 0.11288 7.9629 0.2245 8.0745 0.25719 0.25697 1.0232 0.0162 1.9355-0.60838 0.90099-0.61684 1.0376-0.61487 1.1063 0.016 0.0233 0.21359 0.10058 0.37864 0.17177 0.36678 0.0712-0.0119 0.21683-0.041 0.32363-0.0647 0.16213-0.036 0.20024 0.19981 0.23092 1.429l0.0367 1.4721-0.55455 0.51222c-2.6053 2.4065-6.7165 2.7237-8.7268 0.67343l-0.80225-0.8182-1.1187 0.62712c-2.3378 1.3105-5.2392 1.8426-8.0297 1.4725zm5.2244-4.8972c0.88081-0.20764 2.4044-0.91608 3.0928-1.438l0.42071-0.31902v-3.4238c0-1.8831-0.0473-3.4238-0.10517-3.4238-0.40015 0-3.8792 1.3399-5.1726 1.9921-2.9246 1.4748-4.1841 3.6985-3.1976 5.6457 0.53853 1.063 2.737 1.4914 4.9619 0.96689z"/><path d="m692.78 731.04c-2.3851-0.29962-3.4213-0.77524-4.8482-2.2253-2.3472-2.3854-2.6086-3.8112-2.6107-14.245l-2e-3 -6.4377-0.29126-0.0679c-0.1602-0.0373-1.0194-0.0821-1.9094-0.0996l-1.6181-0.0317 0.0376-0.35818c0.0323-0.30729-0.0183-0.36936-0.35598-0.43689-0.65008-0.13002-0.56652-0.23919 4.2936-5.6105 4.6046-5.0889 5.1509-5.604 5.1509-4.8566 0 0.28356 0.0561 0.32362 0.45308 0.32362 0.56801 0 0.49372-0.3673 0.57601 2.8479l0.0713 2.7832 7.4259 0.0686 0.0411 0.28929c0.0314 0.221 0.14033 0.29886 0.46141 0.32983 0.54803 0.0529 0.56833 0.15422 0.52291 2.6132l-0.0371 2.0065-8.4142 0.1294v7.5728c0 9.5837-0.0655 9.2666 1.9819 9.5843 1.5108 0.23441 3.1565-0.0641 5.3548-0.97139 0.16875-0.0697 0.22628-8e-3 0.2589 0.27662 0.0387 0.3379 0.0796 0.3632 0.5302 0.32784l0.48825-0.0383-0.0704 4.9927-0.97087 0.41299c-1.7164 0.7301-4.4758 1.0773-6.5203 0.82049z"/><path d="m648.56 731.08c-11.238-1.0706-17.821-13.565-11.852-22.494 5.9444-8.8911 19.075-8.4641 25.171 0.81859 6.4018 9.7493-1.6115 22.79-13.319 21.675zm2.9126-6.0591c7.7496-2.6058 8.4496-14.106 1.0146-16.668-8.3701-2.885-15.023 7.2302-9.5468 14.515 1.7018 2.2639 5.4158 3.2012 8.5322 2.1533z"/><path d="m619.89 731.03c-2.8196-0.29176-6.9807-1.7126-7.3427-2.5072-0.0762-0.16724-0.27775-0.3675-0.44789-0.44502l-0.30935-0.14095v-2.7212c0-1.4967 0.0437-2.7211 0.0971-2.7209 0.0534 1.3e-4 0.44315 0.20901 0.86612 0.46405 5.3282 3.2128 10.987 3.4948 12.196 0.60774 0.69414-1.6581 0.15941-2.2365-4.1073-4.4429-6.4073-3.3134-8.5588-5.5874-8.7519-9.2506-0.29372-5.5709 4.7665-8.7291 12.008-7.4942 2.0597 0.35128 5.0673 1.4593 5.5474 2.0436 0.10161 0.12369 0.34918 0.30993 0.55016 0.41386l0.36541 0.18896v2.5133c0 2.9906 0.14723 2.8388-1.831 1.8868-5.1014-2.4552-9.8447-2.4082-10.269 0.10163-0.26309 1.5572 0.92868 2.6352 5.4331 4.9142 6.757 3.4188 8.6834 6.1049 7.6785 10.707-0.89609 4.1038-5.6643 6.5046-11.682 5.8819z"/><path d="m534.77 719.58v-35.405h16.57v70.809h-16.57z"/></g><g fill="#656fb2"><path d="m670.73 730.56c-0.089-0.0367-0.16181-0.238-0.16181-0.44742 0-0.28704-0.0797-0.41105-0.32363-0.50381l-0.32362-0.12304v-21.361l-0.29126-0.0672c-0.1602-0.037-0.81553-0.0818-1.4563-0.0995l-1.165-0.0323-0.0401-0.41444c-0.0265-0.27418-0.12511-0.44143-0.29126-0.49416-0.23474-0.0745-0.25116-0.21458-0.25116-2.1422v-2.0625h1.5428c2.135 0 1.9515 0.20457 1.9569-2.1821 0.0159-7.0334 0.99689-9.455 4.5385-11.203 2.309-1.1398 7.8279-1.3403 8.5832-0.31196 0.0782 0.10655 0.36074 0.26568 0.62773 0.35361l0.48544 0.15987v2.2594c0 2.6364 0.10955 2.4765-1.5041 2.1943-4.9223-0.861-6.5218 0.83183-6.5218 6.9021 0 1.9303-0.076 1.828 1.358 1.828 1.0771 0 1.2076 0.0257 1.2661 0.24962 0.0449 0.17179 0.20097 0.26259 0.50053 0.29126l0.43526 0.0417 0.0708 4.5954h-1.67c-2.2052 0-1.9538-1.4471-1.9922 11.469l-0.0331 11.12-2.589 0.0235c-1.4239 0.0129-2.6618-6e-3 -2.7508-0.0432z"/><path d="m591.61 730.9c-3.4819-0.50517-6.7272-3.1895-7.8207-6.4688-0.5836-1.7502-0.61525-2.4342-0.57499-12.426l0.0378-9.3851h5.2958l0.0753 0.3189c0.0471 0.1993 0.19489 0.34712 0.39418 0.39412l0.31891 0.0752 0.0736 9.2499c0.0792 9.9576 0.0752 9.8986 0.77877 11.278 1.3578 2.6616 6.8344 2.386 9.8272-0.49455l1.1003-1.059 0.1294-19.762h5.2958l0.0753 0.31891c0.047 0.19927 0.19492 0.34714 0.39419 0.39418l0.3189 0.0753 0.033 13.514c0.0262 10.725-5.2e-4 13.535-0.12945 13.617-0.56635 0.35958-5.2757 0.0901-5.2757-0.30185 0-0.16338-0.13636-0.29932-0.38835-0.38717-0.37234-0.1298-0.38834-0.16687-0.38834-0.89941 0-0.90633-0.0637-0.92433-0.90853-0.25655-2.3594 1.865-5.5001 2.6648-8.6624 2.206z"/><path d="m561.76 730.95c-5.3138-0.70478-8.3017-6.5701-5.5291-10.854 1.5815-2.4432 3.8738-3.7426 10.481-5.9409 3.4712-1.1549 3.7935-1.287 3.8684-1.5854 1.348-5.3709-5.6374-6.4513-12.441-1.9242-1.2717 0.84616-1.3628 0.86318-1.3628 0.25469 0-0.4475-0.0133-0.46044-0.38834-0.37806l-0.38835 0.0853v-5.0423l0.44664-0.39216c4.5382-3.9846 13.807-4.2036 17.72-0.41868 2.6193 2.5339 2.7045 2.9306 2.797 13.017 0.0398 4.343 0.11949 7.9692 0.17709 8.0582 0.2426 0.37484 1.1921 0.0659 2.3292-0.75782 0.57746-0.41831 0.73197-0.35139 0.73556 0.31859 2e-3 0.29916 0.0453 0.35299 0.22852 0.28167 0.12459-0.0485 0.28479-0.0984 0.35598-0.11093 0.0783-0.0138 0.14397 0.55885 0.1662 1.4494l0.0367 1.4721-0.55455 0.51222c-2.6041 2.4053-6.7064 2.725-8.6943 0.67756l-0.81122-0.83552-1.1305 0.63372c-2.35 1.3173-5.2454 1.8499-8.0415 1.479zm5.2116-4.8402c0.79886-0.18736 2.8442-1.1848 3.2997-1.6092l0.35599-0.33165v-3.2881c0-3.7408 0.0648-3.5603-1.1358-3.1658-4.8564 1.5959-7.2347 3.2113-7.6621 5.2042-0.58196 2.7136 1.546 4.0339 5.1422 3.1905z"/><path d="m692.78 731.04c-2.4091-0.30264-3.4356-0.7762-4.6827-2.1602-2.4427-2.7111-2.542-3.2174-2.6159-13.342l-0.054-7.4113-0.28035-0.0652c-0.15419-0.0359-1.0376-0.0794-1.9632-0.0968l-1.6828-0.0316v-0.45307c0-0.37467-0.0517-0.4604-0.29872-0.49542-0.4453-0.0631-0.54891 0.0646 4.3816-5.4015 4.6028-5.1028 4.8606-5.3543 4.9372-4.815 0.0358 0.25217 0.10654 0.28556 0.52682 0.24878 0.6036-0.0528 0.52578-0.42248 0.6085 2.8904l0.0711 2.8479 3.6424 0.0344c3.5092 0.0331 3.6448 0.0437 3.7096 0.29126 0.0512 0.1958 0.17725 0.25691 0.5299 0.25691 0.59961 0 0.61589 0.0741 0.56945 2.589l-0.0371 2.0065-8.4142 0.1294v7.5081c0 9.7863-0.0637 9.4798 2.0322 9.7771 1.4488 0.20548 3.854-0.21499 5.1271-0.89634 0.22913-0.12263 0.27186-0.10198 0.30745 0.1486 0.0364 0.2565 0.10691 0.28686 0.5943 0.25598l0.55295-0.035-0.0704 4.986-0.97088 0.41299c-1.7163 0.7301-4.4758 1.0773-6.5203 0.82049z"/><path d="m648.56 731.08c-10.373-0.98819-17.019-12.123-12.559-21.041 3.9318-7.8609 14.385-10.258 21.43-4.9134 3.0764 2.3337 3.3585 2.6091 4.5628 4.4539 6.2729 9.6092-1.8466 22.605-13.434 21.501zm2.9357-5.9384c8.0194-2.692 8.6057-14.237 0.85519-16.838-7.5107-2.5213-14.13 5.9216-10.311 13.153 1.9027 3.6033 5.5115 5.0099 9.4561 3.6857z"/><path d="m619.89 731.03c-2.9246-0.30263-7.3232-1.8427-7.3232-2.5641 0-0.13526-0.14563-0.34134-0.32363-0.45796l-0.32362-0.21205v-5.1867l0.55016 0.33741c5.879 3.6055 12.343 3.6211 12.748 0.0309 0.16185-1.4359-0.0201-1.6038-3.9316-3.6263-7.5874-3.9233-10.005-7.0829-8.9245-11.665 1.3612-5.7752 10.451-7.3093 17.649-2.9787l0.55016 0.33102v2.5069c0 2.9834 0.14703 2.8324-1.831 1.8804-6.3168-3.0401-11.755-2.1043-9.9057 1.7044 0.45195 0.93065 1.1262 1.3962 4.7279 3.2644 2.3633 1.2258 3.8584 2.1546 5.4554 3.389 0.32039 0.24763 0.77763 0.60053 1.0161 0.78422 1.8324 1.4114 2.3335 5.3127 1.0291 8.0115-1.5772 3.2635-5.9165 4.9938-11.162 4.451z"/><path d="m534.9 719.58v-35.275h16.311v70.55h-16.311z"/></g><g fill="#595a5f"><path d="m690.69 702.52c-0.0349-0.091-0.0476-1.3275-0.0283-2.7478l0.0352-2.5823 0.36361-0.12778c0.28167-0.099 0.39061-0.0851 0.48345 0.0617 0.13135 0.20765 0.17203 5.0265 0.0452 5.3569-0.095 0.24758-0.80733 0.27871-0.8992 0.0393z"/><path d="m675.32 702.61c-0.19007-0.19007-0.10023-5.0699 0.11227-6.0987 0.66257-3.2077 2.5582-4.0389 7.2712-3.1884l0.42071 0.0759v-1.8955c0-2.0526 0.0299-2.1349 0.71226-1.9636l0.32334 0.0811v2.267c0 2.645 0.10984 2.4842-1.5041 2.2019-4.8619-0.85044-6.2885 0.55275-6.5068 6.4l-0.0797 2.1359-0.32847 0.0383c-0.18066 0.0211-0.36998-3e-3 -0.42072-0.0539z"/><path d="m681.5 707.86c-0.32007-0.51788 0.29482-0.771 1.8729-0.771 1.8188 0 1.9494 0.0356 1.9494 0.53165v0.3745h-1.8694c-1.1591 0-1.9011-0.0514-1.9529-0.13515z"/><path d="m666.98 707.78c-0.17529-0.45678 0.13272-0.62783 1.2029-0.66804 1.391-0.0523 1.605 0.0136 1.605 0.49392v0.38589h-1.3633c-1.1427 0-1.3764-0.0343-1.4445-0.21177z"/><path d="m618 710.49c-2.7335-3.8064 3.5231-5.049 9.9541-1.977 0.73991 0.35344 1.396 0.64262 1.4581 0.64262s0.11281-0.98685 0.11281-2.193c0-2.3588 0.031-2.4622 0.64345-2.1455l0.39215 0.20279v2.5133c0 2.9906 0.14723 2.8388-1.831 1.8868-5.8477-2.8143-11.331-2.2056-10.155 1.1273 0.26954 0.76348-5e-3 0.73613-0.57494-0.0572z"/><path d="m620.73 719.06c-2.5656-1.3215-4.1969-2.2971-4.5475-2.7196-0.33177-0.39975 6.4586 3.2049 7.0984 3.7682 0.60446 0.53213 0.17677 0.35631-2.5509-1.0487z"/><path d="m641.76 721.83c-4.9976-6.7888 0.83778-16.377 8.9328-14.677 0.9947 0.20884 2.4991 0.90054 3.1068 1.4284 0.45313 0.39364 0.4177 0.3879-1.2907-0.20927-7.667-2.68-14.362 5.801-10.413 13.191 0.55814 1.0447 0.5629 1.058 0.37701 1.058-0.0714 0-0.39197-0.35625-0.71249-0.79165z"/><path d="m691.57 724.27c-0.8651-0.94979-0.93509-1.685-0.94038-9.877-3e-3 -5.2745 0.0337-7.035 0.15083-7.1521 0.1143-0.1143 1.2419-0.15534 4.2683-0.15534h4.113l0.0718-3.6893 0.41627-0.0402c0.54868-0.053 0.57307 0.0657 0.52692 2.5645l-0.0371 2.0065-8.4142 0.1294-0.0354 7.1845c-0.0298 6.0227-3e-3 7.3435 0.16181 8.1682 0.26734 1.3332 0.2359 1.4292-0.28179 0.86087z"/><path d="m670.71 730.54c-0.0952-0.0612-0.15347-0.25029-0.12945-0.42023l0.0437-0.30898 2.1266-0.0357c1.2999-0.0218 2.1932-0.0909 2.2977-0.17766 0.13937-0.11568 0.17108-2.2017 0.17108-11.256v-11.114l0.29126-0.0677c0.1602-0.0372 0.96117-0.082 1.7799-0.0996l1.4887-0.0318 0.1294-3.6246h0.7767l0.0353 2.2977 0.0354 2.2977h-1.67c-2.2052 0-1.9538-1.4471-1.9922 11.469l-0.0331 11.12-2.589 0.0319c-1.4239 0.0175-2.6669-0.0182-2.7621-0.0794z"/><path d="m591.57 730.9c-3.7289-0.54686-7.0248-3.5752-8.0194-7.3684-0.3436-1.3105-0.55619-20.396-0.23155-20.787 0.12218-0.14722 0.63561-0.18368 2.5641-0.18209 2.5105 2e-3 2.674 0.0285 2.753 0.44541 0.0269 0.14172 0.19023 0.28677 0.37096 0.3294l0.32295 0.0762 0.0736 9.2499c0.0801 10.068 0.0657 9.8726 0.83961 11.4 1.3852 2.7337 7.3912 2.1559 10.264-0.98741l0.66741-0.73025v-9.7371c0-11.449-0.37922-10.048 2.7184-10.048 2.4822 0 2.7184 0.0465 2.7184 0.53509 0 0.14858 0.12029 0.23825 0.35598 0.26537l0.35599 0.041 0.033 13.519c0.0262 10.73-5.2e-4 13.541-0.12945 13.623-0.20416 0.12963-4.8991 0.137-5.1008 8e-3 -0.0818-0.0523-0.1692-0.24014-0.19418-0.41741-0.028-0.19852-0.14484-0.34099-0.30431-0.37096-0.36253-0.0681-0.44882-0.25125-0.45109-0.95722-2e-3 -0.7458-0.0898-0.75611-0.91051-0.1074-2.3696 1.8731-5.5104 2.6679-8.6962 2.2007z"/><path d="m561.76 730.95c-4.3402-0.57565-7.3915-4.8602-6.339-8.9011 0.87897-3.3746 3.5104-5.2322 10.935-7.7192 4.7818-1.6018 4.3083-1.2648 4.2507-3.0249-0.0875-2.6727-0.75627-3.2875-3.7085-3.409-3.0236-0.12442-5.704 0.71709-8.7593 2.75-1.27 0.84502-1.3628 0.86273-1.3628 0.26008 0-0.42235-0.0277-0.45508-0.35598-0.42072l-0.35599 0.0373-0.0369-2.2654c-0.0472-2.9001-0.11258-2.712 1.255-3.61 6.4612-4.2427 16.039-3.0524 18.633 2.3155 0.96574 1.9988 0.96709 2.0128 1.0477 10.837 0.0867 9.4933-0.027 9.122 2.2883 7.4759 0.7737-0.55008 0.79991-0.55095 0.85033-0.028 0.0399 0.41396 0.12686 0.46128 0.62309 0.33908 0.16245-0.04 0.20017 0.19263 0.23092 1.4243l0.0367 1.4722-0.55455 0.51222c-2.6345 2.4334-6.8976 2.733-8.7099 0.61198-0.77979-0.91261-0.56769-0.89776-1.9283-0.13502-2.3478 1.3161-5.2443 1.8486-8.0393 1.4778zm5.0915-4.7669c0.97953-0.23092 2.465-0.9076 3.2257-1.4694l0.55016-0.40633v-3.4296c0-2.7444-0.034-3.4296-0.16989-3.4296-0.45768 0-3.8324 1.2836-5.2374 1.9921-2.9819 1.5037-4.1044 3.5283-3.1813 5.7378 0.43614 1.0438 2.6697 1.5102 4.8127 1.005z"/><path d="m692.78 731.04c-1.7421-0.21885-2.994-0.62908-3.8032-1.2462-0.67447-0.51445-0.4951-0.56137 0.64711-0.16929 2.5563 0.8775 6.2164 0.75562 8.7379-0.29095l0.93851-0.38955v-1.8576c0-1.7728 0.0131-1.8668 0.28771-2.0591 0.73232-0.51294 0.75677-0.435 0.71832 2.2889l-0.0352 2.4904-0.97088 0.41299c-1.7163 0.7301-4.4758 1.0773-6.5203 0.82049z"/><path d="m648.56 731.08c-2.858-0.27227-5.7296-1.2988-7.1845-2.5681l-0.5178-0.45179 1.3592 0.6406c13.389 6.3104 26.634-8.2234 18.516-20.319-0.72111-1.0745-0.73867-1.146-0.14313-0.58252 8.8465 8.3706 0.52369 24.477-12.03 23.281z"/><path d="m619.89 731.03c-2.6847-0.27781-7.3232-1.8389-7.3232-2.4646 0-0.19065 0.29709-0.11705 1.877 0.46502 10.102 3.7216 19.524-2.1546 15.665-9.7697-0.58365-1.1518 0.22704-0.71028 0.86704 0.4722 3.3903 6.264-2.4277 12.193-11.086 11.297z"/><path d="m539.32 744.45c-0.0663-0.0818-0.14208-0.26465-0.16836-0.40623-0.0263-0.14157-0.16362-0.27938-0.30519-0.30623-0.42304-0.0802-0.44763-0.23771-0.44763-2.8668 0-2.9534-0.0811-2.7445 1.2291-3.1652 1.8317-0.58808 2.6157-1.4383 3.2209-3.493 0.26714-0.90701 0.26994-1.1012 0.33492-23.217 0.0577-19.636 0.0887-22.317 0.2597-22.425 0.1068-0.0675 1.3696-0.12362 2.8063-0.12471 2.7147-2e-3 3.019 0.0565 3.019 0.58119 0 0.097 0.16019 0.19476 0.35599 0.21729l0.35598 0.041 0.0376 21.1c0.0391 21.923 4e-3 23.768-0.49687 26.263-0.68682 3.4202-2.9938 6.0716-6.2605 7.1956-1.3931 0.4793-3.7498 0.84162-3.9408 0.60587z"/></g><g fill="#02024b"><path d="m690.84 702.47c-0.19442-0.19442-0.0956-5.0523 0.10622-5.2198 0.51369-0.42632 0.58418-0.13146 0.58418 2.4435 0 2.8034-0.13208 3.3346-0.6904 2.7762z"/><path d="m675.44 702.48c-0.13769-0.13768-0.10707-4.5343 0.0377-5.4198 0.5689-3.479 2.2357-4.3886 6.7082-3.6607 1.2092 0.19678 1.1847 0.23829 1.1872-2.0118 2e-3 -1.7807 3e-3 -1.7887 0.29325-1.7476 0.28768 0.0409 0.29169 0.0689 0.32674 2.2894l0.0355 2.248-0.42383-0.0765c-5.8141-1.0494-7.3669 0.20471-7.5884 6.1292-0.0843 2.2537-0.18384 2.6423-0.5764 2.2498z"/><path d="m681.7 707.61c0-0.24612 0.0863-0.2589 1.7476-0.2589s1.7476 0.0128 1.7476 0.2589c0 0.24611-0.0863 0.2589-1.7476 0.2589s-1.7476-0.0128-1.7476-0.2589z"/><path d="m629.81 709.78c-0.21098-0.10161-0.26717-0.20185-0.19466-0.34722 0.0561-0.11241 0.11939-1.1801 0.1407-2.3727 0.0291-1.6318 0.0789-2.1683 0.20113-2.1683 0.41883 0 0.47306 0.30719 0.47306 2.6796 0 2.5162 2e-3 2.5083-0.62023 2.2086z"/><path d="m617.9 710.08c-1.8102-3.2207 3.5049-4.2691 9.1399-1.8028 1.5305 0.66984 1.4692 0.74501-0.13887 0.17027-4.9652-1.7746-9.1565-0.91473-8.5694 1.7581 0.11671 0.53137-0.0974 0.46909-0.43161-0.12554z"/><path d="m641.44 721.08c-4.8688-6.8376 3.3253-16.893 10.775-13.222 0.44372 0.21868 0.68386 0.36765 0.53365 0.33105-8.0511-1.9617-14.303 5.0028-11.245 12.527 0.34161 0.84072 0.32899 0.91357-0.0629 0.36317z"/><path d="m691.34 723.62c-0.50518-1.1035-0.59087-2.6201-0.55003-9.7343l0.0371-6.4725 4.2071-0.0692c2.3139-0.0381 4.2201-0.0818 4.2359-0.0971 0.0159-0.0153 0.045-0.85795 0.0647-1.8725l0.0359-1.8447h0.64724v4.2718l-4.2071 0.0692c-2.3139 0.0381-4.2217 0.0818-4.2395 0.0971-0.13693 0.11786 2e-3 14.715 0.14628 15.465 0.20305 1.049 0.0512 1.1244-0.37775 0.18742z"/><path d="m670.78 730.44c-0.46697-0.46696-0.13168-0.55698 2.2088-0.59298l2.2977-0.0353 0.0662-22.46h1.5612c2.1729 0 2.062 0.11169 2.062-2.0758v-1.8077h0.64724v4.4013h-1.667c-2.2016 0-1.9508-1.4462-1.9892 11.469l-0.0331 11.12-2.5324 0.035c-1.3928 0.0193-2.5724-5e-3 -2.6214-0.0539z"/><path d="m591.67 730.77c-3.9163-0.61678-7.1803-3.6317-8.0525-7.4379-0.21886-0.95513-0.2373-1.795-0.2373-10.809v-9.7735l5.0798-0.07 0.0782 0.39103c0.0617 0.30872 0.14567 0.39103 0.39869 0.39103h0.32048l0.0439 9.2233c0.0478 10.047 0.0319 9.8232 0.8049 11.349 1.4007 2.7642 7.0887 2.4317 10.134-0.59239l1.0671-1.0597 0.0664-19.632h5.0369l0.0753 0.3189c0.047 0.19927 0.19492 0.34714 0.39419 0.39418l0.3189 0.0753v26.914h-5.0485l-0.0434-0.30666c-0.0281-0.19874-0.17619-0.3568-0.42071-0.4491-0.35687-0.1347-0.37733-0.18301-0.37733-0.89074 0-0.94207-0.10354-0.95124-1.2594-0.11151-2.4324 1.7672-5.5061 2.5287-8.3796 2.0762z"/><path d="m561.24 730.69c-4.6636-0.98973-7.241-5.8162-5.2508-9.8328 1.3736-2.7721 3.7157-4.2194 10.545-6.5161 4.7229-1.5884 4.8694-1.7627 3.9586-4.7116-0.90112-2.9175-7.1675-2.5311-12.176 0.75082-1.5194 0.99554-1.4127 0.96703-1.4127 0.3774 0-0.45235-0.014-0.46645-0.38835-0.39158l-0.38834 0.0777v-4.8995l0.80906-0.57406c5.2708-3.7399 13.526-3.7519 17.253-0.0252 2.4796 2.4796 2.5486 2.8136 2.6457 12.819 0.0919 9.4615 7e-3 9.1546 2.1515 7.7728 0.49223-0.31716 0.90444-0.53561 0.91601-0.48544 0.0116 0.0502 0.0569 0.25338 0.10065 0.45156 0.0662 0.29956 0.13904 0.35414 0.43203 0.32363l0.35243-0.0367 0.0381 1.165c0.0506 1.5477 0.0221 1.6228-0.84441 2.228-3.1181 2.1778-6.2018 2.3529-8.0485 0.45685l-0.95838-0.98396-0.40085 0.23287c-3.1539 1.8322-6.3131 2.4419-9.3329 1.801zm6.3364-4.6346c1.0709-0.35947 2.5704-1.1675 2.9546-1.592 0.20747-0.22926 0.22485-0.55896 0.1934-3.6697l-0.0345-3.4178-0.39268 0.016c-0.62297 0.0254-2.9529 0.89879-4.7853 1.7937-6.4019 3.1266-4.6042 9.1084 2.0645 6.8697z"/><path d="m692.78 730.9c-1.1585-0.13093-2.2382-0.41908-2.9709-0.79283-0.64123-0.32713-0.56252-0.40685 0.18083-0.18314 2.4212 0.72867 6.3179 0.50596 8.5694-0.48977 0.95011-0.42018 0.99949-0.54515 0.99949-2.5294 0-1.7031 0.0739-1.9548 0.57402-1.9548 0.17063 0 0.0748 4.6272-0.0988 4.7712-0.99575 0.8264-4.8417 1.4513-7.2541 1.1786z"/><path d="m648.69 730.96c-2.3442-0.26255-4.4079-0.79916-5.2394-1.3624-0.21938-0.14861-0.27779-0.22721-0.13277-0.1787 12.43 4.1585 23.932-7.1824 18.891-18.627-0.61644-1.3995-0.64313-1.4896-0.3295-1.1122 0.90386 1.0877 1.8654 3.8583 2.0837 6.0037 0.86132 8.4674-6.8855 16.216-15.273 15.276z"/><path d="m620.08 730.9c-2.2622-0.23381-4.1321-0.73516-6.1044-1.6367-1.4106-0.64479-1.2414-0.63836 0.72701 0.0276 10.297 3.4841 18.665-1.841 15.672-9.9732-0.0663-0.18029 5e-3 -0.14241 0.23329 0.12476 1.0295 1.2022 1.361 4.3048 0.66933 6.2652-1.3105 3.7144-5.7186 5.7585-11.197 5.1923z"/><path d="m539.36 744.18c-0.0334-0.1068-0.0862-0.27704-0.11747-0.37831-0.0312-0.10127-0.19144-0.20322-0.35599-0.22654l-0.29918-0.0424-0.035-2.6033c-0.0399-2.9652-0.13959-2.7111 1.2319-3.1384 2.0169-0.62844 2.9952-1.9992 3.3936-4.7553 0.0819-0.56677 0.13023-8.8176 0.13186-22.519 2e-3 -16.644 0.0383-21.66 0.1579-21.78 0.11051-0.11051 0.90615-0.15534 2.7573-0.15534 2.6843 0 2.9126 0.0419 2.9126 0.53509 0 0.14859 0.12029 0.23826 0.35599 0.26538l0.35598 0.041v21.942c0 23.149-2e-3 23.221-0.59063 25.743-0.49901 2.1363-2.0195 4.3248-3.848 5.5385-1.7038 1.131-5.8486 2.1819-6.0509 1.5343z"/></g><g fill="#08080b"><path d="m690.92 699.82c0.0337-2.5327 0.0447-2.6307 0.29397-2.6307 0.25026 0 0.2589 0.0863 0.2589 2.589v2.589l-0.58795 0.0834z"/><path d="m675.39 702.22c-0.13781-0.35914 0.0729-4.8613 0.26983-5.7645 0.60494-2.7748 2.3969-3.6592 6.1446-3.0325 1.6729 0.27974 1.5702 0.40304 1.5702-1.8846 0-1.941 0-1.9431 0.29127-1.9018 0.28768 0.0409 0.2917 0.0689 0.32674 2.2894l0.0355 2.248-0.42383-0.0765c-5.7994-1.0468-7.3666 0.20272-7.5678 6.0336-0.0791 2.2934-0.29741 2.9986-0.6465 2.0889z"/><path d="m681.72 707.64c0.0554-0.28928 3.182-0.41955 3.3548-0.13979 0.19401 0.3139-0.0512 0.36633-1.7136 0.36633-1.5347 0-1.6808-0.0202-1.6413-0.22654z"/><path d="m629.91 709.78c-0.25451-0.22076-0.20476-4.8867 0.0521-4.8867 0.41912 0 0.47332 0.30687 0.47332 2.6796 0 2.4546-0.0411 2.6272-0.52542 2.2071z"/><path d="m617.97 710.08c-1.6912-2.863 3.03-4.0665 8.1726-2.0833 1.3193 0.50877 1.3202 0.61532 2e-3 0.19662-4.5237-1.4365-8.4275-0.46-7.821 1.9564 0.10589 0.4219-0.0851 0.3842-0.35323-0.0697z"/><path d="m556.91 710.66c0-0.56676 4e-3 -0.57154 0.93851-1.1503 3.7761-2.3383 7.9882-3.1384 10.602-2.0139 0.58889 0.25333 1.2505 0.78692 0.73786 0.59508-2.7685-1.036-7.2199-0.0972-10.866 2.2915-1.5344 1.0054-1.4127 0.98146-1.4127 0.27753z"/><path d="m641.27 720.64c-3.7774-6.4457 2.2372-14.927 9.3939-13.246 1.6497 0.3874 2.4232 0.84882 0.87446 0.52166-6.983-1.4751-12.789 5.8037-10.09 12.65 0.30612 0.77665 0.2476 0.80104-0.1783 0.0743z"/><path d="m589.37 723.11c-0.68335-1.4158-0.68487-1.4399-0.68487-10.841v-8.7379l0.56973-0.081 0.0439 9.2315c0.0454 9.5404 0.0468 9.5686 0.55599 10.882 0.20685 0.5336-0.1856 0.16682-0.48479-0.45307z"/><path d="m691.42 723.65c-0.49073-1.0782-0.54509-2.0748-0.50811-9.3132l0.0354-6.9256 4.1359-0.0342c4.8388-0.04 4.3385 0.20695 4.3411-2.1431 2e-3 -1.7807 3e-3 -1.7888 0.29325-1.7476 0.2886 0.041 0.29126 0.0608 0.29126 2.1773v2.1359l-4.2071 0.0692c-2.3139 0.0381-4.2217 0.0818-4.2395 0.0971-0.11129 0.0958-0.0112 14.593 0.10515 15.223 0.18361 0.99323 0.0815 1.1839-0.24732 0.46151z"/><path d="m561.29 724.47c-1.2698-2.5785 0.43461-4.8225 5.0694-6.6741 3.5869-1.433 4.3298-1.5932 4.2481-0.91595-0.0372 0.30874-0.17269 0.38517-1.465 0.82659-5.8532 1.9994-8.017 3.9591-7.4678 6.7635 0.0662 0.33818 0.0749 0.61488 0.0192 0.61488s-0.23745-0.2767-0.404-0.61488z"/><path d="m576.62 725.7c-0.32097-0.41482-0.35877-1.1658-0.43166-8.576-0.0835-8.4914-0.10266-8.7304-0.83848-10.48-0.33765-0.80263 0.10787-0.35209 0.52616 0.53208 0.79051 1.671 0.87593 2.3155 0.92379 6.9701 0.12722 12.373 0.13367 11.959-0.17981 11.553z"/><path d="m670.74 730.33c-0.15857-0.41327 0.0896-0.46202 2.3522-0.46202h2.2577l2e-3 -11.1c2e-3 -12.849-0.23454-11.406 1.8802-11.452l1.6778-0.0364 0.0647-1.877c0.0629-1.8255 0.0727-1.8782 0.35599-1.9184l0.29126-0.0414v4.4193h-1.667c-2.2016 0-1.9508-1.4462-1.9892 11.469l-0.0331 11.12-2.5596 0.0351c-2.1577 0.0296-2.5711 5e-3 -2.6328-0.15561z"/><path d="m602.13 730.33c-0.20261-0.528-0.0218-0.57751 2.2446-0.61454l2.1736-0.0355 0.066-26.231 0.58129 0.0826v26.926l-2.4949 0.0352c-2.1359 0.0301-2.5058 7e-3 -2.5705-0.16181z"/><path d="m591.67 730.77c-1.0964-0.17232-2.0766-0.47587-2.9338-0.90862-0.96772-0.4885-1.0942-0.71145-0.21885-0.38583 3.9063 1.4532 8.1076 0.74575 11.386-1.9173 1.2214-0.99203 1.276-1.0016 1.2752-0.22378-2e-3 1.8833-5.8778 4.0062-9.509 3.4355z"/><path d="m573.3 730.72c-1.1241-0.4006-0.95427-0.52083 0.7356-0.52083 2.1606 0 3.5542-0.47194 5.4323-1.8396l0.61489-0.44779v-0.87506c0-0.89201 0.29123-1.4588 0.63909-1.2438 0.26043 0.16095 0.17434 2.622-0.10136 2.8977-1.6593 1.6593-5.4277 2.704-7.3205 2.0294z"/><path d="m561.31 730.71c-0.95995-0.20807-1.6916-0.48043-2.3067-0.85864-0.59492-0.36582-0.45424-0.40728 0.39295-0.1158 3.1569 1.0861 7.3059 0.47172 10.467-1.55 0.94668-0.60553 1.6504-0.0911 0.81966 0.59915-1.9727 1.639-6.4501 2.5588-9.3725 1.9253z"/><path d="m693.28 730.96c-1.5119-0.15107-3.7095-0.71964-3.5187-0.9104 0.0324-0.0324 0.5353 0.0375 1.1174 0.15548 2.3568 0.47756 5.9964 0.1179 7.8014-0.77093l0.8135-0.40059 0.0345-1.877c0.0345-1.8795 0.11816-2.2006 0.57273-2.2006 0.19172 0 0.12668 4.6103-0.0673 4.7713-0.88434 0.73392-4.7268 1.4354-6.7536 1.2328z"/><path d="m648.04 730.9c-1.2649-0.1378-2.8785-0.52988-3.7842-0.91953-0.88228-0.37955-0.73215-0.38114 0.67743-7e-3 11.52 3.0562 21.702-7.9891 17.483-18.965-0.44027-1.1454-0.17496-0.9113 0.40399 0.3564 4.4732 9.7948-3.8014 20.731-14.78 19.535z"/><path d="m620.66 730.96c-2.3017-0.22465-3.985-0.59499-5.6284-1.2383-1.3817-0.54084-1.2537-0.57279 0.39282-0.098 9.9009 2.8549 17.982-2.4463 15.172-9.9523-0.0693-0.18495-0.0505-0.19302 0.12233-0.0526 0.88637 0.71998 1.2125 4.2528 0.5626 6.0947-1.2495 3.5414-5.6781 5.729-10.621 5.2466z"/><path d="m539.52 744.29c-0.34266-0.34266 0.0131-0.82127 0.61046-0.82127 3.468 0 7.4386-3.4123 8.36-7.1845 0.55366-2.2669 0.55887-2.4804 0.61237-25.081l0.0514-21.715h0.63408l-1e-3 21.456c-1e-3 21.901-0.0306 23.382-0.50713 25.736-0.83084 4.1035-4.1078 6.9978-8.4896 7.498-0.42646 0.0487-0.86698 0.11352-0.97893 0.14407-0.11194 0.0305-0.24301 0.0161-0.29126-0.0322z"/></g></g><g aria-label="ZFS Rescue"><path d="m578.99 752.62q-0.992 0-1.536-0.48-0.512-0.544-0.832-0.864-3.168-0.8-6.464-0.8-3.808 0-7.84 1.024l-2.24 0.096q-0.192-0.32 0.256-1.056 0.288-0.448 0.608-0.896 1.056-1.312 2.08-2.56 1.024-1.28 1.92-2.496 1.28-0.896 2.688-2.976 0.704-1.056 1.44-2.144 0.032-0.064 0.896-1.12 0.544-0.672 0.544-1.12 0-0.096-0.064-0.288h-6.144q-0.096-0.192-0.096-0.288 0-0.256 0.352-0.384 0.352-0.16 0.608-0.16 0.864 0.192 1.792 0.192 0.608 0 1.856-0.096t1.856-0.096q0.64 0 1.184 0.064 0.576 0.064 1.344 0.384l0.16 0.192-5.44 7.296q-0.704 0.544-1.504 1.44-0.352 0.416-2.112 2.784-0.064 0.224-0.736 0.96-0.544 0.608-0.544 1.12 3.328-0.608 6.688-0.608 4.384 0 8.96 0.992 0.256 0.48 0.416 0.864 0.192 0.384 0.192 0.64 0 0.288-0.288 0.384z"/><path d="m594.35 738.25q-1.024 0.224-4.32 0.672-3.264 0.448-4.768 0.928-2.368 0.768-3.808 2.272-0.096 0.64-0.16 1.088-0.032 0.416-0.032 0.512 0 0.736 0.384 1.088l3.328-0.064q1.344 0 2.272 0.128 0.928 0.096 1.792 0.48-0.992 0.224-2.4 0.288-1.376 0.064-2.688 0.064h-1.696q-0.384 0.096-0.64 0.16-0.224 0.064-0.32 0.256l-0.544 4.576q-0.544-0.096-0.96 0.128-0.736 0.384-0.832 0.416l-0.352-7.488q0.16-0.224 0.352-0.448 0.224-0.192 0.288-0.672 0.064-0.512 0.16-0.736 1.6-1.44 4.192-2.336 1.856-0.64 4.96-1.184 4.864-0.864 4.928-0.864 0.064-0.064 0.064-0.224t0.096-0.192q0.32 0.192 0.448 0.288 0.48 0.352 0.48 0.576 0 0.192-0.224 0.288z"/><path d="m607.92 749.87q0 0.512-0.288 0.832-1.344 0.48-2.688 0.64-1.312 0.192-2.88 0.192l-4.384-0.096q-0.512-0.448-1.856-0.512t-1.76-0.48l1.568-0.768q1.12 0.768 2.624 1.088t3.392 0.32q1.984 0 3.68-0.256 0.256 0 0.352-0.256 0.096-0.288 0.096-0.64-0.032-0.352-0.032-0.416-0.576-2.208-4.512-3.456-2.464-0.64-3.296-0.864-0.288-0.48-2.016-1.44-1.28-0.736-1.28-2.176 0-0.384 0.032-0.608 0.608-0.992 1.984-1.408t2.688-0.8q0.896-0.16 1.952-0.32 1.056-0.192 1.792-0.192t1.28 0.128q0.544 0.096 1.152 0.384 1.088 0.512 1.376 1.856-0.032 0.288-0.352 0.48-0.128 0.064-0.608 0.224-0.096-0.064-0.096-0.416 0-0.256-0.512-0.48-0.192-0.352-0.544-0.64t-0.768-0.48q-0.928-0.32-1.952-0.32-1.216 0-2.656 0.448-1.152 0.352-2.368 0.992-0.256 0.256-0.256 0.8 0 0.224 0.064 0.544 0.896 1.664 3.104 2.656 2.016 0.736 4.032 1.472 2.4 0.928 3.456 2.272 0.192 0.416 0.32 0.864 0.16 0.416 0.16 0.832z"/><path d="m632.11 753.45q0 0.864-0.256 0.864-0.096 0-0.48-0.16-0.256 0.192-0.352 0.224-0.064 0.064-0.16 0.064-0.032 0-0.672-0.16-4.512-3.84-8.992-7.712-0.16 0.64-0.32 1.376-0.128 0.704-0.128 1.28 0 0.736 0.192 1.12l-0.48 1.376q-0.16-0.128-0.416-0.128-0.192 0-0.544 0.064-0.352 0.096-0.416 0.096-0.32 0-0.48-0.192 0-1.312 0.672-6.112 0.32-2.304 0.32-3.712 0-1.92-0.448-3.52-0.32-0.384-0.608-1.056-0.16-0.384-0.32-0.768 0.256-0.384 0.8-0.736 0.576-0.352 1.12-0.672 1.6-0.48 3.104-0.768 1.536-0.288 2.88-0.288 2.208 0 3.84 0.8 0.352 0.576 0.352 1.28t-0.352 1.76q-0.192 0.544-0.352 1.056-0.576 1.408-1.6 2.528t-2.336 1.696q-0.224 0.352-1.76 0.672-0.736 0.16-1.664 0.288-0.096 0.416 0.288 0.864 1.12 1.344 1.12 1.376 4.224 3.616 8.448 7.2zm-4.032-17.184q0-0.48-0.128-0.832-0.416-0.384-1.088-0.544t-1.44-0.16q-0.704 0-1.12 0.064-0.416 0.032-1.44 0.192-0.992 0.224-1.6 0.512-0.576 0.288-1.024 0.896-0.096 0.288-0.096 0.512t0.128 0.64q0.16 0.416 0.192 0.512l0.736 0.16q0.256 0.416 0.352 0.992t0.096 1.184v1.344q0 0.736 0.064 1.088 0.128 0.096 0.256 0.224 0.128 0.096 0.256 0.096 1.472-0.192 2.688-1.056 1.216-0.896 1.984-2.272 0.608-1.248 0.896-2.112 0.288-0.896 0.288-1.44z"/><path d="m642.96 750.7q-0.832 0.48-1.76 0.608-0.928 0.16-2.112 0.16h-1.536q-1.312-0.384-2.592-0.736-1.152-0.608-1.536-2.528-0.192-0.544-0.192-1.088 0-0.992 0.576-2.016 0.48-0.832 1.28-1.568 1.184-0.512 2.368-0.768 1.216-0.288 2.432-0.288 0.512 0.352 1.056 0.672 0.8 0.576 0.8 1.12 0 0.352-0.416 0.736-0.928 0.736-2.688 1.408-1.152 0.448-3.136 0.992 0 0.736 0.416 1.28 0.256 0.352 1.024 0.928t1.664 0.8q0.928 0.192 2.048 0.192 0.928 0 1.44-0.064 0.544-0.064 0.8-0.064 0.032 0.032 0.064 0.224zm-3.776-5.664q0.288-0.096 0.288-0.352 0-0.224-0.16-0.48t-0.352-0.544l-1.792 0.096q-0.512 0.576-1.024 1.12-0.64 0.8-0.64 1.6 1.12 0 2.048-0.32 0.96-0.32 1.632-1.12z"/><path d="m650.51 742.99q0 0.384-0.192 0.544-0.16 0.16-0.288 0.224-0.16-0.064-0.448-0.16-0.256-0.416-0.48-0.832-0.192-0.192-0.736-0.288-0.448-0.064-0.8 0.256t-0.544 0.864q0 0.96 0.768 1.92 0.352 0.416 1.536 1.504 0.576 0.512 0.832 0.864 0.384 0.512 0.384 1.056 0 0.128-0.064 0.384-0.704 0.512-1.568 0.704-0.864 0.16-1.952 0.16l-1.952-0.032-0.896 0.032q-0.512-0.128-0.512-0.544l1.536-0.416q0.128 0.064 0.832 0.256 0.704 0.16 1.28 0.16t0.832-0.128q0.288-0.16 0.288-0.608-0.192-0.64-1.792-2.08-0.864-0.768-1.12-1.376-0.608-1.088-0.608-1.824 0-1.184 2.016-1.856 0.928-0.096 1.856-0.192 0.544 0 0.832 0.064t0.736 0.384q0.096 0.288 0.16 0.544 0.064 0.224 0.064 0.416z"/><path d="m663.28 749.87q-0.48 0.256-1.28 0.544t-1.056 0.416q-0.768 0.192-1.632 0.256t-1.664 0.064h-1.056q-0.96-0.448-1.888-0.896-0.704-0.416-1.184-1.312-0.32-0.672-0.32-1.472 0-0.832 0.256-1.568 0.256-0.768 0.768-1.536 0.896-1.216 2.048-1.984t2.688-0.768q0.96 0 2.272 0.384 0.416 0.288 0.672 0.576 0.384 0.416 0.288 0.736-0.192 0.512-0.64 0.736-0.416 0.192-0.992 0.192-0.256-0.128-0.448-0.704-0.16-0.608-0.928-0.928-0.544-0.096-1.088 0.288-0.544 0.352-1.024 0.704-1.792 1.504-1.792 3.808 0 0.768 0.608 1.376 0.192 0.192 1.184 0.864 0.992 0.448 2.176 0.448 0.672 0 1.216-0.096 0.576-0.096 1.568-0.32 0.192 0.064 0.512 0t0.384-0.064q0.224 0 0.352 0.256z"/><path d="m678.67 751.4-2.656-0.096q-0.48-0.192-1.024-0.672-0.416-0.352-1.376-1.472-0.128 0-0.512 0.224-0.544 0.672-1.696 1.088-1.12 0.384-2.432 0.512l-0.992 0.064q-0.448 0-0.8-0.128-0.352-0.16-0.576-0.576-0.32-0.736-0.512-1.696-0.16-0.992-0.16-1.92 0-0.992 0.064-1.536t0.32-2.048q0.224 0 0.64-0.16 0.448-0.192 0.64-0.192 0.384 0 0.736 0.352-0.192 0.896-0.256 1.728-0.064 0.8-0.064 1.888 0 1.344 0.16 2.144 0.192 0.8 0.8 1.312 0.608 0.064 1.248-0.288 0.736-0.48 1.12-0.704 1.28-0.928 1.504-3.136 0.352-3.296 0.416-3.552 0.128-0.16 0.256-0.16l0.864-0.064q0.736 0 0.896 0.416-0.128 0.896-0.16 1.344 0 0.416 0 0.64 0 1.248 0.256 2.432 0.288 1.152 0.832 2.08 0.32 0.352 0.64 0.704 0.16 0.128 1.344 0.768 0.32 0.288 0.416 0.384 0.224 0.224 0.064 0.32z"/><path d="m689.74 750.7q-0.832 0.48-1.76 0.608-0.928 0.16-2.112 0.16h-1.536q-1.312-0.384-2.592-0.736-1.152-0.608-1.536-2.528-0.192-0.544-0.192-1.088 0-0.992 0.576-2.016 0.48-0.832 1.28-1.568 1.184-0.512 2.368-0.768 1.216-0.288 2.432-0.288 0.512 0.352 1.056 0.672 0.8 0.576 0.8 1.12 0 0.352-0.416 0.736-0.928 0.736-2.688 1.408-1.152 0.448-3.136 0.992 0 0.736 0.416 1.28 0.256 0.352 1.024 0.928t1.664 0.8q0.928 0.192 2.048 0.192 0.928 0 1.44-0.064 0.544-0.064 0.8-0.064 0.032 0.032 0.064 0.224zm-3.776-5.664q0.288-0.096 0.288-0.352 0-0.224-0.16-0.48t-0.352-0.544l-1.792 0.096q-0.512 0.576-1.024 1.12-0.64 0.8-0.64 1.6 1.12 0 2.048-0.32 0.96-0.32 1.632-1.12z"/></g></g> + + </g> + +</svg> diff --git a/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.png b/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.png Binary files differnew file mode 100644 index 0000000..6751c01 --- /dev/null +++ b/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.png diff --git a/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.svg b/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.svg new file mode 100644 index 0000000..6ba61e1 --- /dev/null +++ b/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.svg @@ -0,0 +1,980 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + width="640" + height="480" + enable-background="new 0 0 1920 1080" + version="1.1" + viewBox="0 0 640 480" + xml:space="preserve" + id="svg388" + sodipodi:docname="zfsrescue-background-640x480.svg" + inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview + id="namedview390" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="2.48125" + inkscape:cx="312.54408" + inkscape:cy="240" + inkscape:window-width="3840" + inkscape:window-height="2111" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg388" /> +<style + type="text/css" + id="style2"> + .st0{clip-path:url(#SVGID_00000093167105208028638090000008063807857182655396_);} + .st1{fill:#05475C;} + .st2{opacity:0.34;fill:url(#SVGID_00000012445251672029399260000003270595326732136081_);enable-background:new ;} + .st3{opacity:0.34;fill:url(#SVGID_00000127010423592997111840000013957416611417821059_);enable-background:new ;} + .st4{opacity:0.34;fill:url(#SVGID_00000101814971404403400460000010609185819928108449_);enable-background:new ;} + .st5{opacity:0.71;} + .st6{fill:#FFFFFF;} + .st7{opacity:0.62;} + .st8{opacity:0.34;fill:url(#SVGID_00000107557325802917530330000017592151723363848840_);enable-background:new ;} + .st9{opacity:0.34;fill:url(#SVGID_00000032650273911267859500000015024660283904495788_);enable-background:new ;} + .st10{opacity:0.34;fill:url(#SVGID_00000057851989095838282160000014663790337944238500_);enable-background:new ;} + .st11{opacity:0.34;fill:url(#SVGID_00000178165242061037739810000007582236097397314448_);enable-background:new ;} + .st12{opacity:0.34;fill:url(#SVGID_00000064329767591241199690000000234602624410839680_);enable-background:new ;} + .st13{opacity:0.34;fill:url(#SVGID_00000014609603927260903510000009061463274724089486_);enable-background:new ;} + .st14{opacity:0.34;fill:url(#SVGID_00000050627399097891942390000014523148072975367070_);enable-background:new ;} + .st15{opacity:0.34;fill:url(#SVGID_00000109731321347584724990000010142768297725207449_);enable-background:new ;} + .st16{opacity:0.34;fill:url(#SVGID_00000000926441590728654410000012560741159445150083_);enable-background:new ;} + .st17{opacity:0.34;fill:url(#SVGID_00000137832232493639134090000003781239364591219342_);enable-background:new ;} + .st18{opacity:0.34;fill:url(#SVGID_00000150812387129626622020000009167110439853258936_);enable-background:new ;} + .st19{opacity:0.34;fill:url(#SVGID_00000179608784322168811290000010365701417373876369_);enable-background:new ;} + .st20{opacity:0.34;fill:url(#SVGID_00000120531069539707179100000007006360167335202962_);enable-background:new ;} + .st21{opacity:0.34;fill:url(#SVGID_00000181089157459068778460000011901104969134050459_);enable-background:new ;} + .st22{opacity:0.34;fill:url(#SVGID_00000062164313994880221460000014631417913117263241_);enable-background:new ;} + .st23{opacity:0.12;fill:url(#SVGID_00000000902067244530690860000014386718989792038839_);enable-background:new ;} + .st24{opacity:0.12;fill:url(#SVGID_00000089550684643991047870000016914371577980347776_);enable-background:new ;} + .st25{opacity:0.12;fill:url(#SVGID_00000084507925595054884490000005003863653038598286_);enable-background:new ;} + .st26{opacity:0.12;fill:url(#SVGID_00000047780407226302564420000009742350089197221517_);enable-background:new ;} + .st27{opacity:0.12;fill:url(#SVGID_00000066480680368962549320000006921805612706891392_);enable-background:new ;} + .st28{opacity:0.12;fill:url(#SVGID_00000122678307387241734090000002868210978020395689_);enable-background:new ;} + .st29{opacity:0.12;fill:url(#SVGID_00000150100474908702981900000008908414767416909709_);enable-background:new ;} + .st30{opacity:0.12;fill:url(#SVGID_00000072960791515750302390000015282140940621514149_);enable-background:new ;} + .st31{opacity:0.12;fill:url(#SVGID_00000114770971300144002370000016800559959910618791_);enable-background:new ;} + .st32{opacity:0.12;fill:url(#SVGID_00000036952937828426554700000000522215132809990844_);enable-background:new ;} + .st33{opacity:0.12;fill:url(#SVGID_00000090974002902719031840000015158340248134540673_);enable-background:new ;} +</style> + + <defs + id="defs107"> + <rect + id="SVGID_1_" + x="-.3" + y=".1" + width="1920" + height="1080" /> + + + + + + + + + + <radialGradient + id="SVGID_00000000933302580452020710000013162680496496488371_" + cx="-1132.4" + cy="-1996.9" + r="342.1" + gradientTransform="matrix(-.75893 .72532 -.21553 -.28378 -445.08 609.9)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#0a8a5f" + stop-opacity=".99" + offset="0" + id="stop5" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop7" /> + </radialGradient> + + + + <radialGradient + id="SVGID_00000080193032524742796840000011048436269149918087_" + cx="173.04" + cy="15838" + r="459.4" + gradientTransform="matrix(.22222 0 0 .22222 686.67 -3107.9)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#DAC9BA" + offset="0" + id="stop10" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop12" /> + </radialGradient> + + + + + + <linearGradient + id="SVGID_00000147222259863327894370000004713185813428820113_" + x1="-8054.3" + x2="-7614.2" + y1="5144.3" + y2="5144.3" + gradientTransform="matrix(.4172 -.9088 .9088 .4172 401.78 -8335.1)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop15" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop17" /> + </linearGradient> + + + + <linearGradient + id="SVGID_00000063620498617606890090000008720960172290484925_" + x1="-338.65" + x2="213.1" + y1="-4980.9" + y2="-4980.9" + gradientTransform="matrix(-.9511 -.3089 .3089 -.9511 3185.3 -3756.9)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop20" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop22" /> + </linearGradient> + + + + <linearGradient + id="SVGID_00000078013590621525976610000006727138897565908112_" + x1="5217.2" + x2="5885.5" + y1="6487.9" + y2="6487.9" + gradientTransform="matrix(-.035946 .9994 -.9994 -.035946 8477.3 -4502.9)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#AABDCB" + offset="0" + id="stop25" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop27" /> + </linearGradient> + + + + <linearGradient + id="SVGID_00000129169157574715853980000000301106401069963673_" + x1="8268.4" + x2="8986.3" + y1="570.84" + y2="570.84" + gradientTransform="matrix(-.079098 .6653 -.9567 -.2541 3183.2 -4748.3)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop30" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop32" /> + </linearGradient> + + + + <linearGradient + id="SVGID_00000051343387064157711410000007010731585534318724_" + x1="-6628.8" + x2="-6236.5" + y1="4207.9" + y2="4207.9" + gradientTransform="matrix(.2612 -.9653 .9653 .2612 -653.47 -6361.4)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop35" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop37" /> + </linearGradient> + + + + <linearGradient + id="SVGID_00000169518436558334241300000010220786071391330234_" + x1="1836.1" + x2="2258.3" + y1="7829.2" + y2="7829.2" + gradientTransform="matrix(.9919 -.1269 .1269 .9919 -1274.9 -6407.4)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop40" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop42" /> + </linearGradient> + + + + + + + + <linearGradient + id="SVGID_00000151504943794861704500000013710966191068745143_" + x1="9379" + x2="9964.7" + y1="6171.8" + y2="6171.8" + gradientTransform="matrix(.15689 .25311 -.40284 .1768 1622.7 -3246.7)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop45" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop47" /> + </linearGradient> + + + + + + + + + + + + <linearGradient + id="SVGID_00000101790783768249243120000007920411576515842194_" + x1="-6562.5" + x2="-6127.7" + y1="1880.1" + y2="1880.1" + gradientTransform="matrix(-.094803 -.9955 .9955 -.094803 -1443.6 -5086.3)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop50" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop52" /> + </linearGradient> + + + + + <clipPath + id="clipPath3119"><g + transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)" + id="g57"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use55" /></g></clipPath><clipPath + id="clipPath3131"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use60" /></clipPath><clipPath + id="clipPath3137"><g + transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)" + id="g65"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use63" /></g></clipPath><clipPath + id="clipPath3143"><g + transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)" + id="g70"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use68" /></g></clipPath><clipPath + id="clipPath3149"><g + transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)" + id="g75"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use73" /></g></clipPath><clipPath + id="clipPath3155"><g + transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)" + id="g80"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use78" /></g></clipPath><clipPath + id="clipPath3161"><g + transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)" + id="g85"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use83" /></g></clipPath><clipPath + id="clipPath3167"><g + transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)" + id="g90"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use88" /></g></clipPath><clipPath + id="clipPath3173"><g + transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)" + id="g95"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use93" /></g></clipPath><clipPath + id="clipPath3179"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use98" /></clipPath><clipPath + id="clipPath3185"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use101" /></clipPath><clipPath + id="clipPath3191"><use + transform="matrix(.44444 0 0 .44444 533.17 300.06)" + xlink:href="#SVGID_1_" + id="use104" /></clipPath> + + </defs> + + + +<rect + class="st1" + transform="matrix(.75 0 0 1 -399.65 -300.1)" + x="525.48" + y="266.77" + width="868.89" + height="547.11" + clip-path="url(#clipPath3191)" + stroke-width=".44444" + id="rect109" /><path + transform="translate(-745.57 -300.1)" + d="m1097.8 299.95h-351.55v324.01h12.459z" + clip-path="url(#clipPath3185)" + fill="url(#SVGID_00000000933302580452020710000013162680496496488371_)" + stroke-width=".28358" + id="path111" /><path + transform="translate(-745.57 -300.1)" + d="m746.28 311.87v199.49a102.09 102.09 0 0 0 80.934-99.705 102.09 102.09 0 0 0-80.934-99.785z" + clip-path="url(#clipPath3179)" + fill="url(#SVGID_00000080193032524742796840000011048436269149918087_)" + stroke-width=".44444" + id="path113" /><g + class="st7" + transform="matrix(.44444 0 0 .44444 -212.41 -.044444)" + clip-path="url(#clipPath3173)" + id="g208"> + + <radialGradient + id="SVGID_00000091732848191404214390000004736846775492618424_" + cx="-37.305" + cy="10365" + r="173.24" + gradientTransform="matrix(.8642 .5228 -.5025 .9115 5995.2 -8755.3)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop115" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop117" /> + </radialGradient> + + <ellipse + cx="766.2" + cy="645.9" + rx="173.2" + ry="181.5" + enable-background="new" + fill="url(#SVGID_00000091732848191404214390000004736846775492618424_)" + opacity=".34" + id="ellipse120" /> + + <linearGradient + id="SVGID_00000114788164137069528000000005957745660025105319_" + x1="4501.7" + x2="4698.5" + y1="506.23" + y2="506.23" + gradientTransform="matrix(-.7151 .699 -.5383 -.5506 4391.6 -2623.4)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop122" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop124" /> + </linearGradient> + + <polygon + points="885 415.5 700.3 321.9 810.7 153.3 949 375.1" + enable-background="new" + fill="url(#SVGID_00000114788164137069528000000005957745660025105319_)" + opacity=".34" + id="polygon127" /> + + <linearGradient + id="SVGID_00000054962312987295980090000006017935243511788676_" + x1="2066" + x2="2337.2" + y1="7874.2" + y2="7874.2" + gradientTransform="matrix(.7774 .629 -.629 .7774 4107.2 -7204.9)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop129" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop131" /> + </linearGradient> + + <polygon + points="784.8 279.5 810.7 153.3 905.6 201.5 1025.1 241.8 1001 349.2 871.9 494.7" + enable-background="new" + fill="url(#SVGID_00000054962312987295980090000006017935243511788676_)" + opacity=".34" + id="polygon134" /> + + <linearGradient + id="SVGID_00000012442755421995762960000014664915799359269053_" + x1="-7687.7" + x2="-7185.4" + y1="5138.4" + y2="5138.4" + gradientTransform="matrix(.3915 -.9202 .9202 .3915 -1099.9 -8403.9)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#AABDCB" + offset="0" + id="stop136" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop138" /> + </linearGradient> + + <path + d="m479.5 609.22v258.74l36.602 27.04 112.1-63 138-189.4-67.197-61.8z" + fill="url(#SVGID_00000012442755421995762960000014664915799359269053_)" + id="path141" /> + + <linearGradient + id="SVGID_00000086651592687441638420000016273738828393233579_" + x1="9454.2" + x2="9671.5" + y1="2925.7" + y2="2925.7" + gradientTransform="matrix(-.3483 .5724 -.7648 -.6285 6665.3 -3309.4)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop143" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop145" /> + </linearGradient> + + <polygon + points="972.8 123.9 1211.9 391.7 1226.6 518.1 988.7 310.2" + enable-background="new" + fill="url(#SVGID_00000086651592687441638420000016273738828393233579_)" + opacity=".34" + id="polygon148" /> + + <linearGradient + id="SVGID_00000095314929038062691570000012080618537926193552_" + x1="-4049.4" + x2="-3743.9" + y1="6098.6" + y2="6098.6" + gradientTransform="matrix(.7151 -.699 .699 .7151 -446.37 -6772.9)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#AABDCB" + offset="0" + id="stop150" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop152" /> + </linearGradient> + + <polygon + points="1208.9 409.2 988.7 310.2 784.8 279.5 889.2 212.3 1029.8 93.1" + enable-background="new" + fill="url(#SVGID_00000095314929038062691570000012080618537926193552_)" + opacity=".34" + id="polygon155" /> + + <linearGradient + id="SVGID_00000069384093065957304470000008686477747994526866_" + x1="6255.9" + x2="6490.9" + y1="2547.1" + y2="2547.1" + gradientTransform="matrix(-.5898 .8076 -.8076 -.5898 6758.6 -3397.5)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop157" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop159" /> + </linearGradient> + + <polygon + points="1043.6 409.2 960 371.1 730.2 237.8 972.8 123.9" + enable-background="new" + fill="url(#SVGID_00000069384093065957304470000008686477747994526866_)" + opacity=".34" + id="polygon162" /> + + <linearGradient + id="SVGID_00000174570387500765410560000018201440021002273169_" + x1="-7023" + x2="-6656.5" + y1="-1443.5" + y2="-1443.5" + gradientTransform="matrix(-.2682 -.9634 1.0501 -.2924 294.06 -6276.8)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop164" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop166" /> + </linearGradient> + + <polygon + points="521.4 741.6 657.1 531.1 756.4 656.4 507.9 953.1" + enable-background="new" + fill="url(#SVGID_00000174570387500765410560000018201440021002273169_)" + opacity=".34" + id="polygon169" /> + + + + + + + + <path + d="m479.5 603.79 326.5-154.19-105.7 134.5-220.8 118.13" + fill="none" + id="path171" /> + + <linearGradient + id="SVGID_00000002351047188999019860000002566414104328457898_" + x1="12773" + x2="13681" + y1="6937.4" + y2="6937.4" + gradientTransform="matrix(.1765 .3022 -.9209 .1087 4716.3 -3888.4)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#AABDCB" + offset="0" + id="stop173" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop175" /> + </linearGradient> + + <polygon + points="521.4 741.6 740.4 729.5 893.4 986.9 504.3 864.5" + enable-background="new" + fill="url(#SVGID_00000002351047188999019860000002566414104328457898_)" + opacity=".34" + id="polygon178" /> + + <linearGradient + id="SVGID_00000004534978137110897330000008179059058368671906_" + x1="-7687.7" + x2="-7400.5" + y1="5080.5" + y2="5080.5" + gradientTransform="matrix(.3915 -.9202 .9202 .3915 -1099.9 -8403.9)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#AABDCB" + offset="0" + id="stop180" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop182" /> + </linearGradient> + + <path + d="m479.5 547.51v63.382l219.5-30.094 107-131.2-272.8-69.996z" + fill="url(#SVGID_00000004534978137110897330000008179059058368671906_)" + id="path185" /> + + <radialGradient + id="SVGID_00000091017312778810520490000013487813255627565699_" + cx="-108.26" + cy="10031" + r="181.94" + gradientTransform="matrix(.8642 .5228 -.5025 .9115 5995.2 -8755.3)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop187" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop189" /> + </radialGradient> + + <ellipse + cx="871.9" + cy="305.4" + rx="181.9" + ry="190.6" + enable-background="new" + fill="url(#SVGID_00000091017312778810520490000013487813255627565699_)" + opacity=".34" + id="ellipse192" /> + + <linearGradient + id="SVGID_00000093149179829732349710000008128861407447028144_" + x1="6476.3" + x2="6770.7" + y1="-3135.9" + y2="-3135.9" + gradientTransform="matrix(-.9257 .3783 -.3783 -.9257 5603.1 -4641.4)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#18F5B0" + offset="0" + id="stop194" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop196" /> + </linearGradient> + + <polygon + points="532.1 848 501.4 638.1 766.2 642.6 717.1 936.1 628.2 832" + enable-background="new" + fill="url(#SVGID_00000093149179829732349710000008128861407447028144_)" + opacity=".34" + id="polygon199" /> + + <linearGradient + id="SVGID_00000034071598378061202680000005682775137060128388_" + x1="-2446" + x2="-2179.5" + y1="8617" + y2="8617" + gradientTransform="matrix(.9797 -.2004 .2004 .9797 1206.6 -8533.7)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#AABDCB" + offset="0" + id="stop201" /> + <stop + stop-color="#05475C" + stop-opacity="0" + offset="1" + id="stop203" /> + </linearGradient> + + <polygon + points="797.9 413.5 533.2 379.6 730.2 345.4 784.8 279.5" + enable-background="new" + fill="url(#SVGID_00000034071598378061202680000005682775137060128388_)" + opacity=".34" + id="polygon206" /> + </g><polygon + transform="matrix(.44444 0 0 .44444 -212.41 -.044444)" + points="1602 731.1 2140.7 840.5 1984.5 1253.1 1507.2 881.3" + clip-path="url(#clipPath3167)" + enable-background="new" + fill="url(#SVGID_00000147222259863327894370000004713185813428820113_)" + opacity=".12" + id="polygon210" /><polygon + transform="matrix(.44444 0 0 .44444 -212.41 -.044444)" + points="1783 991.1 1934.2 1191.5 1645 1256.7 1426.9 1290.3 1413.7 1026.6 1556 569.8" + clip-path="url(#clipPath3161)" + enable-background="new" + fill="url(#SVGID_00000063620498617606890090000008720960172290484925_)" + opacity=".12" + id="polygon212" /><polygon + transform="matrix(.44444 0 0 .44444 -212.41 -.044444)" + points="1601.6 667.3 1933.3 482.6 1995.2 701.9 1737.9 1144.3" + clip-path="url(#clipPath3155)" + enable-background="new" + fill="url(#SVGID_00000078013590621525976610000006727138897565908112_)" + opacity=".12" + id="polygon214" /><polygon + transform="matrix(.44444 0 0 .44444 -212.41 -.044444)" + points="1814 558.8 2004.8 870.8 2102.8 1126.5 1757.4 979.3" + clip-path="url(#clipPath3149)" + enable-background="new" + fill="url(#SVGID_00000129169157574715853980000000301106401069963673_)" + opacity=".12" + id="polygon216" /><polygon + transform="matrix(.44444 0 0 .44444 -212.41 -.044444)" + points="1463.9 778.1 1621.5 776.7 2068.4 836 1927.9 1204.4" + clip-path="url(#clipPath3143)" + enable-background="new" + fill="url(#SVGID_00000051343387064157711410000007010731585534318724_)" + opacity=".12" + id="polygon218" /><polygon + transform="matrix(.44444 0 0 .44444 -212.41 -.044444)" + points="1663.6 1217.3 1515.2 932.3 1983.4 1264.7" + clip-path="url(#clipPath3137)" + enable-background="new" + fill="url(#SVGID_00000169518436558334241300000010220786071391330234_)" + opacity=".12" + id="polygon220" /><path + transform="translate(-745.57 -300.1)" + d="m745.57 318.56v20.775l26.971-8.168z" + clip-path="url(#clipPath3131)" + fill="url(#SVGID_00000151504943794861704500000013710966191068745143_)" + stroke-width=".44444" + id="path222" /><polygon + transform="matrix(.44444 0 0 .44444 -212.41 -.044444)" + points="1120.5 1135.3 873.3 1285.3 1185.8 818.7" + clip-path="url(#clipPath3119)" + enable-background="new" + fill="url(#SVGID_00000101790783768249243120000007920411576515842194_)" + opacity=".12" + id="polygon224" /><g + transform="matrix(1.6019,0,0,1.6019,-485.28,-1052.8)" + id="g386"><path + d="m 531.96,720.55 v -40 h 170.61 v 80 H 531.96 Z" + fill="none" + id="path226" /><g + stroke-width="0.12945" + id="g364"><g + fill="#7b83bd" + id="g242"><path + d="m 670.74,730.55 c -0.0818,-0.0531 -0.16919,-0.23985 -0.19417,-0.41492 -0.0305,-0.21386 -0.15161,-0.34321 -0.36903,-0.39418 l -0.32362,-0.0759 -0.0662,-21.537 -0.29051,-0.0669 c -0.15979,-0.0368 -0.78567,-0.0815 -1.3908,-0.0994 -1.0948,-0.0323 -1.1005,-0.0343 -1.1413,-0.38814 -0.0289,-0.25118 -0.13348,-0.3789 -0.35599,-0.43474 l -0.31505,-0.0791 v -4.3657 l 3.4304,-0.0722 0.0834,-2.8937 c 0.0459,-1.5915 0.12295,-3.2808 0.17123,-3.754 0.55772,-5.4656 5.2221,-8.5581 11.266,-7.4696 1.7396,0.31327 1.8663,0.3522 1.9441,0.59727 0.0411,0.12952 0.27584,0.30185 0.52162,0.38297 l 0.4469,0.14749 v 2.2594 c 0,2.6364 0.10954,2.4765 -1.5041,2.1943 -4.918,-0.86025 -6.5218,0.83332 -6.5218,6.8868 0,1.7286 -0.0125,1.7138 1.453,1.7138 1.0904,0 1.1478,0.0143 1.2619,0.31438 0.0801,0.21064 0.23922,0.32811 0.48224,0.35599 l 0.36271,0.0416 0.0353,2.2977 0.0354,2.2977 h -1.67 c -2.2052,0 -1.9538,-1.4471 -1.9922,11.469 l -0.0331,11.12 -2.589,0.0319 c -1.424,0.0175 -2.6559,-0.0116 -2.7378,-0.0647 z" + id="path228" /><path + d="m 591.61,730.9 c -3.7039,-0.53738 -7.0106,-3.4323 -8.0598,-7.0559 l -0.29814,-1.0298 v -20.194 l 5.3776,-0.07 0.0768,0.38392 c 0.0525,0.26237 0.16432,0.3964 0.35328,0.42334 l 0.27649,0.0394 0.0736,9.2556 c 0.079,9.9387 0.0773,9.9135 0.76626,11.257 1.3801,2.6904 6.9458,2.3678 9.9291,-0.57556 l 1.074,-1.0596 0.0664,-19.654 h 5.2958 l 0.0753,0.3189 c 0.047,0.19927 0.19491,0.34714 0.39418,0.39418 l 0.3189,0.0753 0.033,13.514 c 0.0262,10.725 -5.2e-4,13.535 -0.12945,13.617 -0.20417,0.12963 -4.8997,0.13701 -5.0989,0.008 -0.0808,-0.0523 -0.16844,-0.20905 -0.19485,-0.34833 -0.0269,-0.14191 -0.18997,-0.28648 -0.37096,-0.32888 -0.28889,-0.0677 -0.32714,-0.15018 -0.36272,-0.78238 -0.0542,-0.96318 -0.15572,-1.0082 -0.91689,-0.40651 -2.3769,1.8788 -5.5074,2.6793 -8.679,2.2191 z" + id="path230" /><path + d="m 561.76,730.95 c -4.2843,-0.56824 -7.407,-4.7148 -6.4879,-8.6152 0.86029,-3.6509 3.4588,-5.5455 11.131,-8.1162 4.6592,-1.5611 4.2768,-1.3005 4.1863,-2.8524 -0.15943,-2.7352 -0.79601,-3.3326 -3.6916,-3.4641 -3.0082,-0.13663 -5.6954,0.70511 -8.7593,2.7438 -1.2728,0.8469 -1.3628,0.86348 -1.3628,0.25112 0,-0.48648 0.0213,-0.47889 -0.61488,-0.21878 -0.12635,0.0517 -0.16181,-0.51706 -0.16181,-2.5949 v -2.661 l 0.82694,-0.5901 c 5.2674,-3.7587 13.751,-3.7839 17.434,-0.0517 2.5162,2.5493 2.6105,3.0035 2.702,13.017 0.0531,5.8125 0.11288,7.9629 0.2245,8.0745 0.25719,0.25697 1.0232,0.0162 1.9355,-0.60838 0.90099,-0.61684 1.0376,-0.61487 1.1063,0.016 0.0233,0.21359 0.10058,0.37864 0.17177,0.36678 0.0712,-0.0119 0.21683,-0.041 0.32363,-0.0647 0.16213,-0.036 0.20024,0.19981 0.23092,1.429 l 0.0367,1.4721 -0.55455,0.51222 c -2.6053,2.4065 -6.7165,2.7237 -8.7268,0.67343 l -0.80225,-0.8182 -1.1187,0.62712 c -2.3378,1.3105 -5.2392,1.8426 -8.0297,1.4725 z m 5.2244,-4.8972 c 0.88081,-0.20764 2.4044,-0.91608 3.0928,-1.438 l 0.42071,-0.31902 v -3.4238 c 0,-1.8831 -0.0473,-3.4238 -0.10517,-3.4238 -0.40015,0 -3.8792,1.3399 -5.1726,1.9921 -2.9246,1.4748 -4.1841,3.6985 -3.1976,5.6457 0.53853,1.063 2.737,1.4914 4.9619,0.96689 z" + id="path232" /><path + d="m 692.78,731.04 c -2.3851,-0.29962 -3.4213,-0.77524 -4.8482,-2.2253 -2.3472,-2.3854 -2.6086,-3.8112 -2.6107,-14.245 l -0.002,-6.4377 -0.29126,-0.0679 c -0.1602,-0.0373 -1.0194,-0.0821 -1.9094,-0.0996 l -1.6181,-0.0317 0.0376,-0.35818 c 0.0323,-0.30729 -0.0183,-0.36936 -0.35598,-0.43689 -0.65008,-0.13002 -0.56652,-0.23919 4.2936,-5.6105 4.6046,-5.0889 5.1509,-5.604 5.1509,-4.8566 0,0.28356 0.0561,0.32362 0.45308,0.32362 0.56801,0 0.49372,-0.3673 0.57601,2.8479 l 0.0713,2.7832 7.4259,0.0686 0.0411,0.28929 c 0.0314,0.221 0.14033,0.29886 0.46141,0.32983 0.54803,0.0529 0.56833,0.15422 0.52291,2.6132 l -0.0371,2.0065 -8.4142,0.1294 v 7.5728 c 0,9.5837 -0.0655,9.2666 1.9819,9.5843 1.5108,0.23441 3.1565,-0.0641 5.3548,-0.97139 0.16875,-0.0697 0.22628,-0.008 0.2589,0.27662 0.0387,0.3379 0.0796,0.3632 0.5302,0.32784 l 0.48825,-0.0383 -0.0704,4.9927 -0.97087,0.41299 c -1.7164,0.7301 -4.4758,1.0773 -6.5203,0.82049 z" + id="path234" /><path + d="m 648.56,731.08 c -11.238,-1.0706 -17.821,-13.565 -11.852,-22.494 5.9444,-8.8911 19.075,-8.4641 25.171,0.81859 6.4018,9.7493 -1.6115,22.79 -13.319,21.675 z m 2.9126,-6.0591 c 7.7496,-2.6058 8.4496,-14.106 1.0146,-16.668 -8.3701,-2.885 -15.023,7.2302 -9.5468,14.515 1.7018,2.2639 5.4158,3.2012 8.5322,2.1533 z" + id="path236" /><path + d="m 619.89,731.03 c -2.8196,-0.29176 -6.9807,-1.7126 -7.3427,-2.5072 -0.0762,-0.16724 -0.27775,-0.3675 -0.44789,-0.44502 l -0.30935,-0.14095 v -2.7212 c 0,-1.4967 0.0437,-2.7211 0.0971,-2.7209 0.0534,1.3e-4 0.44315,0.20901 0.86612,0.46405 5.3282,3.2128 10.987,3.4948 12.196,0.60774 0.69414,-1.6581 0.15941,-2.2365 -4.1073,-4.4429 -6.4073,-3.3134 -8.5588,-5.5874 -8.7519,-9.2506 -0.29372,-5.5709 4.7665,-8.7291 12.008,-7.4942 2.0597,0.35128 5.0673,1.4593 5.5474,2.0436 0.10161,0.12369 0.34918,0.30993 0.55016,0.41386 l 0.36541,0.18896 v 2.5133 c 0,2.9906 0.14723,2.8388 -1.831,1.8868 -5.1014,-2.4552 -9.8447,-2.4082 -10.269,0.10163 -0.26309,1.5572 0.92868,2.6352 5.4331,4.9142 6.757,3.4188 8.6834,6.1049 7.6785,10.707 -0.89609,4.1038 -5.6643,6.5046 -11.682,5.8819 z" + id="path238" /><path + d="m 534.77,719.58 v -35.405 h 16.57 v 70.809 h -16.57 z" + id="path240" /></g><g + fill="#656fb2" + id="g258"><path + d="m 670.73,730.56 c -0.089,-0.0367 -0.16181,-0.238 -0.16181,-0.44742 0,-0.28704 -0.0797,-0.41105 -0.32363,-0.50381 l -0.32362,-0.12304 v -21.361 l -0.29126,-0.0672 c -0.1602,-0.037 -0.81553,-0.0818 -1.4563,-0.0995 l -1.165,-0.0323 -0.0401,-0.41444 c -0.0265,-0.27418 -0.12511,-0.44143 -0.29126,-0.49416 -0.23474,-0.0745 -0.25116,-0.21458 -0.25116,-2.1422 v -2.0625 h 1.5428 c 2.135,0 1.9515,0.20457 1.9569,-2.1821 0.0159,-7.0334 0.99689,-9.455 4.5385,-11.203 2.309,-1.1398 7.8279,-1.3403 8.5832,-0.31196 0.0782,0.10655 0.36074,0.26568 0.62773,0.35361 l 0.48544,0.15987 v 2.2594 c 0,2.6364 0.10955,2.4765 -1.5041,2.1943 -4.9223,-0.861 -6.5218,0.83183 -6.5218,6.9021 0,1.9303 -0.076,1.828 1.358,1.828 1.0771,0 1.2076,0.0257 1.2661,0.24962 0.0449,0.17179 0.20097,0.26259 0.50053,0.29126 l 0.43526,0.0417 0.0708,4.5954 h -1.67 c -2.2052,0 -1.9538,-1.4471 -1.9922,11.469 l -0.0331,11.12 -2.589,0.0235 c -1.4239,0.0129 -2.6618,-0.006 -2.7508,-0.0432 z" + id="path244" /><path + d="m 591.61,730.9 c -3.4819,-0.50517 -6.7272,-3.1895 -7.8207,-6.4688 -0.5836,-1.7502 -0.61525,-2.4342 -0.57499,-12.426 l 0.0378,-9.3851 h 5.2958 l 0.0753,0.3189 c 0.0471,0.1993 0.19489,0.34712 0.39418,0.39412 l 0.31891,0.0752 0.0736,9.2499 c 0.0792,9.9576 0.0752,9.8986 0.77877,11.278 1.3578,2.6616 6.8344,2.386 9.8272,-0.49455 l 1.1003,-1.059 0.1294,-19.762 h 5.2958 l 0.0753,0.31891 c 0.047,0.19927 0.19492,0.34714 0.39419,0.39418 l 0.3189,0.0753 0.033,13.514 c 0.0262,10.725 -5.2e-4,13.535 -0.12945,13.617 -0.56635,0.35958 -5.2757,0.0901 -5.2757,-0.30185 0,-0.16338 -0.13636,-0.29932 -0.38835,-0.38717 -0.37234,-0.1298 -0.38834,-0.16687 -0.38834,-0.89941 0,-0.90633 -0.0637,-0.92433 -0.90853,-0.25655 -2.3594,1.865 -5.5001,2.6648 -8.6624,2.206 z" + id="path246" /><path + d="m 561.76,730.95 c -5.3138,-0.70478 -8.3017,-6.5701 -5.5291,-10.854 1.5815,-2.4432 3.8738,-3.7426 10.481,-5.9409 3.4712,-1.1549 3.7935,-1.287 3.8684,-1.5854 1.348,-5.3709 -5.6374,-6.4513 -12.441,-1.9242 -1.2717,0.84616 -1.3628,0.86318 -1.3628,0.25469 0,-0.4475 -0.0133,-0.46044 -0.38834,-0.37806 l -0.38835,0.0853 v -5.0423 l 0.44664,-0.39216 c 4.5382,-3.9846 13.807,-4.2036 17.72,-0.41868 2.6193,2.5339 2.7045,2.9306 2.797,13.017 0.0398,4.343 0.11949,7.9692 0.17709,8.0582 0.2426,0.37484 1.1921,0.0659 2.3292,-0.75782 0.57746,-0.41831 0.73197,-0.35139 0.73556,0.31859 0.002,0.29916 0.0453,0.35299 0.22852,0.28167 0.12459,-0.0485 0.28479,-0.0984 0.35598,-0.11093 0.0783,-0.0138 0.14397,0.55885 0.1662,1.4494 l 0.0367,1.4721 -0.55455,0.51222 c -2.6041,2.4053 -6.7064,2.725 -8.6943,0.67756 l -0.81122,-0.83552 -1.1305,0.63372 c -2.35,1.3173 -5.2454,1.8499 -8.0415,1.479 z m 5.2116,-4.8402 c 0.79886,-0.18736 2.8442,-1.1848 3.2997,-1.6092 l 0.35599,-0.33165 v -3.2881 c 0,-3.7408 0.0648,-3.5603 -1.1358,-3.1658 -4.8564,1.5959 -7.2347,3.2113 -7.6621,5.2042 -0.58196,2.7136 1.546,4.0339 5.1422,3.1905 z" + id="path248" /><path + d="m 692.78,731.04 c -2.4091,-0.30264 -3.4356,-0.7762 -4.6827,-2.1602 -2.4427,-2.7111 -2.542,-3.2174 -2.6159,-13.342 l -0.054,-7.4113 -0.28035,-0.0652 c -0.15419,-0.0359 -1.0376,-0.0794 -1.9632,-0.0968 l -1.6828,-0.0316 v -0.45307 c 0,-0.37467 -0.0517,-0.4604 -0.29872,-0.49542 -0.4453,-0.0631 -0.54891,0.0646 4.3816,-5.4015 4.6028,-5.1028 4.8606,-5.3543 4.9372,-4.815 0.0358,0.25217 0.10654,0.28556 0.52682,0.24878 0.6036,-0.0528 0.52578,-0.42248 0.6085,2.8904 l 0.0711,2.8479 3.6424,0.0344 c 3.5092,0.0331 3.6448,0.0437 3.7096,0.29126 0.0512,0.1958 0.17725,0.25691 0.5299,0.25691 0.59961,0 0.61589,0.0741 0.56945,2.589 l -0.0371,2.0065 -8.4142,0.1294 v 7.5081 c 0,9.7863 -0.0637,9.4798 2.0322,9.7771 1.4488,0.20548 3.854,-0.21499 5.1271,-0.89634 0.22913,-0.12263 0.27186,-0.10198 0.30745,0.1486 0.0364,0.2565 0.10691,0.28686 0.5943,0.25598 l 0.55295,-0.035 -0.0704,4.986 -0.97088,0.41299 c -1.7163,0.7301 -4.4758,1.0773 -6.5203,0.82049 z" + id="path250" /><path + d="m 648.56,731.08 c -10.373,-0.98819 -17.019,-12.123 -12.559,-21.041 3.9318,-7.8609 14.385,-10.258 21.43,-4.9134 3.0764,2.3337 3.3585,2.6091 4.5628,4.4539 6.2729,9.6092 -1.8466,22.605 -13.434,21.501 z m 2.9357,-5.9384 c 8.0194,-2.692 8.6057,-14.237 0.85519,-16.838 -7.5107,-2.5213 -14.13,5.9216 -10.311,13.153 1.9027,3.6033 5.5115,5.0099 9.4561,3.6857 z" + id="path252" /><path + d="m 619.89,731.03 c -2.9246,-0.30263 -7.3232,-1.8427 -7.3232,-2.5641 0,-0.13526 -0.14563,-0.34134 -0.32363,-0.45796 l -0.32362,-0.21205 v -5.1867 l 0.55016,0.33741 c 5.879,3.6055 12.343,3.6211 12.748,0.0309 0.16185,-1.4359 -0.0201,-1.6038 -3.9316,-3.6263 -7.5874,-3.9233 -10.005,-7.0829 -8.9245,-11.665 1.3612,-5.7752 10.451,-7.3093 17.649,-2.9787 l 0.55016,0.33102 v 2.5069 c 0,2.9834 0.14703,2.8324 -1.831,1.8804 -6.3168,-3.0401 -11.755,-2.1043 -9.9057,1.7044 0.45195,0.93065 1.1262,1.3962 4.7279,3.2644 2.3633,1.2258 3.8584,2.1546 5.4554,3.389 0.32039,0.24763 0.77763,0.60053 1.0161,0.78422 1.8324,1.4114 2.3335,5.3127 1.0291,8.0115 -1.5772,3.2635 -5.9165,4.9938 -11.162,4.451 z" + id="path254" /><path + d="m 534.9,719.58 v -35.275 h 16.311 v 70.55 H 534.9 Z" + id="path256" /></g><g + fill="#595a5f" + id="g290"><path + d="m 690.69,702.52 c -0.0349,-0.091 -0.0476,-1.3275 -0.0283,-2.7478 l 0.0352,-2.5823 0.36361,-0.12778 c 0.28167,-0.099 0.39061,-0.0851 0.48345,0.0617 0.13135,0.20765 0.17203,5.0265 0.0452,5.3569 -0.095,0.24758 -0.80733,0.27871 -0.8992,0.0393 z" + id="path260" /><path + d="m 675.32,702.61 c -0.19007,-0.19007 -0.10023,-5.0699 0.11227,-6.0987 0.66257,-3.2077 2.5582,-4.0389 7.2712,-3.1884 l 0.42071,0.0759 v -1.8955 c 0,-2.0526 0.0299,-2.1349 0.71226,-1.9636 l 0.32334,0.0811 v 2.267 c 0,2.645 0.10984,2.4842 -1.5041,2.2019 -4.8619,-0.85044 -6.2885,0.55275 -6.5068,6.4 l -0.0797,2.1359 -0.32847,0.0383 c -0.18066,0.0211 -0.36998,-0.003 -0.42072,-0.0539 z" + id="path262" /><path + d="m 681.5,707.86 c -0.32007,-0.51788 0.29482,-0.771 1.8729,-0.771 1.8188,0 1.9494,0.0356 1.9494,0.53165 v 0.3745 h -1.8694 c -1.1591,0 -1.9011,-0.0514 -1.9529,-0.13515 z" + id="path264" /><path + d="m 666.98,707.78 c -0.17529,-0.45678 0.13272,-0.62783 1.2029,-0.66804 1.391,-0.0523 1.605,0.0136 1.605,0.49392 v 0.38589 h -1.3633 c -1.1427,0 -1.3764,-0.0343 -1.4445,-0.21177 z" + id="path266" /><path + d="m 618,710.49 c -2.7335,-3.8064 3.5231,-5.049 9.9541,-1.977 0.73991,0.35344 1.396,0.64262 1.4581,0.64262 0.0621,0 0.11281,-0.98685 0.11281,-2.193 0,-2.3588 0.031,-2.4622 0.64345,-2.1455 l 0.39215,0.20279 v 2.5133 c 0,2.9906 0.14723,2.8388 -1.831,1.8868 -5.8477,-2.8143 -11.331,-2.2056 -10.155,1.1273 0.26954,0.76348 -0.005,0.73613 -0.57494,-0.0572 z" + id="path268" /><path + d="m 620.73,719.06 c -2.5656,-1.3215 -4.1969,-2.2971 -4.5475,-2.7196 -0.33177,-0.39975 6.4586,3.2049 7.0984,3.7682 0.60446,0.53213 0.17677,0.35631 -2.5509,-1.0487 z" + id="path270" /><path + d="m 641.76,721.83 c -4.9976,-6.7888 0.83778,-16.377 8.9328,-14.677 0.9947,0.20884 2.4991,0.90054 3.1068,1.4284 0.45313,0.39364 0.4177,0.3879 -1.2907,-0.20927 -7.667,-2.68 -14.362,5.801 -10.413,13.191 0.55814,1.0447 0.5629,1.058 0.37701,1.058 -0.0714,0 -0.39197,-0.35625 -0.71249,-0.79165 z" + id="path272" /><path + d="m 691.57,724.27 c -0.8651,-0.94979 -0.93509,-1.685 -0.94038,-9.877 -0.003,-5.2745 0.0337,-7.035 0.15083,-7.1521 0.1143,-0.1143 1.2419,-0.15534 4.2683,-0.15534 h 4.113 l 0.0718,-3.6893 0.41627,-0.0402 c 0.54868,-0.053 0.57307,0.0657 0.52692,2.5645 l -0.0371,2.0065 -8.4142,0.1294 -0.0354,7.1845 c -0.0298,6.0227 -0.003,7.3435 0.16181,8.1682 0.26734,1.3332 0.2359,1.4292 -0.28179,0.86087 z" + id="path274" /><path + d="m 670.71,730.54 c -0.0952,-0.0612 -0.15347,-0.25029 -0.12945,-0.42023 l 0.0437,-0.30898 2.1266,-0.0357 c 1.2999,-0.0218 2.1932,-0.0909 2.2977,-0.17766 0.13937,-0.11568 0.17108,-2.2017 0.17108,-11.256 v -11.114 l 0.29126,-0.0677 c 0.1602,-0.0372 0.96117,-0.082 1.7799,-0.0996 l 1.4887,-0.0318 0.1294,-3.6246 h 0.7767 l 0.0353,2.2977 0.0354,2.2977 h -1.67 c -2.2052,0 -1.9538,-1.4471 -1.9922,11.469 l -0.0331,11.12 -2.589,0.0319 c -1.4239,0.0175 -2.6669,-0.0182 -2.7621,-0.0794 z" + id="path276" /><path + d="m 591.57,730.9 c -3.7289,-0.54686 -7.0248,-3.5752 -8.0194,-7.3684 -0.3436,-1.3105 -0.55619,-20.396 -0.23155,-20.787 0.12218,-0.14722 0.63561,-0.18368 2.5641,-0.18209 2.5105,0.002 2.674,0.0285 2.753,0.44541 0.0269,0.14172 0.19023,0.28677 0.37096,0.3294 l 0.32295,0.0762 0.0736,9.2499 c 0.0801,10.068 0.0657,9.8726 0.83961,11.4 1.3852,2.7337 7.3912,2.1559 10.264,-0.98741 l 0.66741,-0.73025 v -9.7371 c 0,-11.449 -0.37922,-10.048 2.7184,-10.048 2.4822,0 2.7184,0.0465 2.7184,0.53509 0,0.14858 0.12029,0.23825 0.35598,0.26537 l 0.35599,0.041 0.033,13.519 c 0.0262,10.73 -5.2e-4,13.541 -0.12945,13.623 -0.20416,0.12963 -4.8991,0.137 -5.1008,0.008 -0.0818,-0.0523 -0.1692,-0.24014 -0.19418,-0.41741 -0.028,-0.19852 -0.14484,-0.34099 -0.30431,-0.37096 -0.36253,-0.0681 -0.44882,-0.25125 -0.45109,-0.95722 -0.002,-0.7458 -0.0898,-0.75611 -0.91051,-0.1074 -2.3696,1.8731 -5.5104,2.6679 -8.6962,2.2007 z" + id="path278" /><path + d="m 561.76,730.95 c -4.3402,-0.57565 -7.3915,-4.8602 -6.339,-8.9011 0.87897,-3.3746 3.5104,-5.2322 10.935,-7.7192 4.7818,-1.6018 4.3083,-1.2648 4.2507,-3.0249 -0.0875,-2.6727 -0.75627,-3.2875 -3.7085,-3.409 -3.0236,-0.12442 -5.704,0.71709 -8.7593,2.75 -1.27,0.84502 -1.3628,0.86273 -1.3628,0.26008 0,-0.42235 -0.0277,-0.45508 -0.35598,-0.42072 l -0.35599,0.0373 -0.0369,-2.2654 c -0.0472,-2.9001 -0.11258,-2.712 1.255,-3.61 6.4612,-4.2427 16.039,-3.0524 18.633,2.3155 0.96574,1.9988 0.96709,2.0128 1.0477,10.837 0.0867,9.4933 -0.027,9.122 2.2883,7.4759 0.7737,-0.55008 0.79991,-0.55095 0.85033,-0.028 0.0399,0.41396 0.12686,0.46128 0.62309,0.33908 0.16245,-0.04 0.20017,0.19263 0.23092,1.4243 l 0.0367,1.4722 -0.55455,0.51222 c -2.6345,2.4334 -6.8976,2.733 -8.7099,0.61198 -0.77979,-0.91261 -0.56769,-0.89776 -1.9283,-0.13502 -2.3478,1.3161 -5.2443,1.8486 -8.0393,1.4778 z m 5.0915,-4.7669 c 0.97953,-0.23092 2.465,-0.9076 3.2257,-1.4694 l 0.55016,-0.40633 v -3.4296 c 0,-2.7444 -0.034,-3.4296 -0.16989,-3.4296 -0.45768,0 -3.8324,1.2836 -5.2374,1.9921 -2.9819,1.5037 -4.1044,3.5283 -3.1813,5.7378 0.43614,1.0438 2.6697,1.5102 4.8127,1.005 z" + id="path280" /><path + d="m 692.78,731.04 c -1.7421,-0.21885 -2.994,-0.62908 -3.8032,-1.2462 -0.67447,-0.51445 -0.4951,-0.56137 0.64711,-0.16929 2.5563,0.8775 6.2164,0.75562 8.7379,-0.29095 l 0.93851,-0.38955 v -1.8576 c 0,-1.7728 0.0131,-1.8668 0.28771,-2.0591 0.73232,-0.51294 0.75677,-0.435 0.71832,2.2889 l -0.0352,2.4904 -0.97088,0.41299 c -1.7163,0.7301 -4.4758,1.0773 -6.5203,0.82049 z" + id="path282" /><path + d="m 648.56,731.08 c -2.858,-0.27227 -5.7296,-1.2988 -7.1845,-2.5681 l -0.5178,-0.45179 1.3592,0.6406 c 13.389,6.3104 26.634,-8.2234 18.516,-20.319 -0.72111,-1.0745 -0.73867,-1.146 -0.14313,-0.58252 8.8465,8.3706 0.52369,24.477 -12.03,23.281 z" + id="path284" /><path + d="m 619.89,731.03 c -2.6847,-0.27781 -7.3232,-1.8389 -7.3232,-2.4646 0,-0.19065 0.29709,-0.11705 1.877,0.46502 10.102,3.7216 19.524,-2.1546 15.665,-9.7697 -0.58365,-1.1518 0.22704,-0.71028 0.86704,0.4722 3.3903,6.264 -2.4277,12.193 -11.086,11.297 z" + id="path286" /><path + d="m 539.32,744.45 c -0.0663,-0.0818 -0.14208,-0.26465 -0.16836,-0.40623 -0.0263,-0.14157 -0.16362,-0.27938 -0.30519,-0.30623 -0.42304,-0.0802 -0.44763,-0.23771 -0.44763,-2.8668 0,-2.9534 -0.0811,-2.7445 1.2291,-3.1652 1.8317,-0.58808 2.6157,-1.4383 3.2209,-3.493 0.26714,-0.90701 0.26994,-1.1012 0.33492,-23.217 0.0577,-19.636 0.0887,-22.317 0.2597,-22.425 0.1068,-0.0675 1.3696,-0.12362 2.8063,-0.12471 2.7147,-0.002 3.019,0.0565 3.019,0.58119 0,0.097 0.16019,0.19476 0.35599,0.21729 l 0.35598,0.041 0.0376,21.1 c 0.0391,21.923 0.004,23.768 -0.49687,26.263 -0.68682,3.4202 -2.9938,6.0716 -6.2605,7.1956 -1.3931,0.4793 -3.7498,0.84162 -3.9408,0.60587 z" + id="path288" /></g><g + fill="#02024b" + id="g320"><path + d="m 690.84,702.47 c -0.19442,-0.19442 -0.0956,-5.0523 0.10622,-5.2198 0.51369,-0.42632 0.58418,-0.13146 0.58418,2.4435 0,2.8034 -0.13208,3.3346 -0.6904,2.7762 z" + id="path292" /><path + d="m 675.44,702.48 c -0.13769,-0.13768 -0.10707,-4.5343 0.0377,-5.4198 0.5689,-3.479 2.2357,-4.3886 6.7082,-3.6607 1.2092,0.19678 1.1847,0.23829 1.1872,-2.0118 0.002,-1.7807 0.003,-1.7887 0.29325,-1.7476 0.28768,0.0409 0.29169,0.0689 0.32674,2.2894 l 0.0355,2.248 -0.42383,-0.0765 c -5.8141,-1.0494 -7.3669,0.20471 -7.5884,6.1292 -0.0843,2.2537 -0.18384,2.6423 -0.5764,2.2498 z" + id="path294" /><path + d="m 681.7,707.61 c 0,-0.24612 0.0863,-0.2589 1.7476,-0.2589 1.6613,0 1.7476,0.0128 1.7476,0.2589 0,0.24611 -0.0863,0.2589 -1.7476,0.2589 -1.6613,0 -1.7476,-0.0128 -1.7476,-0.2589 z" + id="path296" /><path + d="m 629.81,709.78 c -0.21098,-0.10161 -0.26717,-0.20185 -0.19466,-0.34722 0.0561,-0.11241 0.11939,-1.1801 0.1407,-2.3727 0.0291,-1.6318 0.0789,-2.1683 0.20113,-2.1683 0.41883,0 0.47306,0.30719 0.47306,2.6796 0,2.5162 0.002,2.5083 -0.62023,2.2086 z" + id="path298" /><path + d="m 617.9,710.08 c -1.8102,-3.2207 3.5049,-4.2691 9.1399,-1.8028 1.5305,0.66984 1.4692,0.74501 -0.13887,0.17027 -4.9652,-1.7746 -9.1565,-0.91473 -8.5694,1.7581 0.11671,0.53137 -0.0974,0.46909 -0.43161,-0.12554 z" + id="path300" /><path + d="m 641.44,721.08 c -4.8688,-6.8376 3.3253,-16.893 10.775,-13.222 0.44372,0.21868 0.68386,0.36765 0.53365,0.33105 -8.0511,-1.9617 -14.303,5.0028 -11.245,12.527 0.34161,0.84072 0.32899,0.91357 -0.0629,0.36317 z" + id="path302" /><path + d="m 691.34,723.62 c -0.50518,-1.1035 -0.59087,-2.6201 -0.55003,-9.7343 l 0.0371,-6.4725 4.2071,-0.0692 c 2.3139,-0.0381 4.2201,-0.0818 4.2359,-0.0971 0.0159,-0.0153 0.045,-0.85795 0.0647,-1.8725 l 0.0359,-1.8447 h 0.64724 v 4.2718 l -4.2071,0.0692 c -2.3139,0.0381 -4.2217,0.0818 -4.2395,0.0971 -0.13693,0.11786 0.002,14.715 0.14628,15.465 0.20305,1.049 0.0512,1.1244 -0.37775,0.18742 z" + id="path304" /><path + d="m 670.78,730.44 c -0.46697,-0.46696 -0.13168,-0.55698 2.2088,-0.59298 l 2.2977,-0.0353 0.0662,-22.46 h 1.5612 c 2.1729,0 2.062,0.11169 2.062,-2.0758 v -1.8077 h 0.64724 v 4.4013 h -1.667 c -2.2016,0 -1.9508,-1.4462 -1.9892,11.469 l -0.0331,11.12 -2.5324,0.035 c -1.3928,0.0193 -2.5724,-0.005 -2.6214,-0.0539 z" + id="path306" /><path + d="m 591.67,730.77 c -3.9163,-0.61678 -7.1803,-3.6317 -8.0525,-7.4379 -0.21886,-0.95513 -0.2373,-1.795 -0.2373,-10.809 v -9.7735 l 5.0798,-0.07 0.0782,0.39103 c 0.0617,0.30872 0.14567,0.39103 0.39869,0.39103 h 0.32048 l 0.0439,9.2233 c 0.0478,10.047 0.0319,9.8232 0.8049,11.349 1.4007,2.7642 7.0887,2.4317 10.134,-0.59239 l 1.0671,-1.0597 0.0664,-19.632 h 5.0369 l 0.0753,0.3189 c 0.047,0.19927 0.19492,0.34714 0.39419,0.39418 l 0.3189,0.0753 v 26.914 h -5.0485 l -0.0434,-0.30666 c -0.0281,-0.19874 -0.17619,-0.3568 -0.42071,-0.4491 -0.35687,-0.1347 -0.37733,-0.18301 -0.37733,-0.89074 0,-0.94207 -0.10354,-0.95124 -1.2594,-0.11151 -2.4324,1.7672 -5.5061,2.5287 -8.3796,2.0762 z" + id="path308" /><path + d="m 561.24,730.69 c -4.6636,-0.98973 -7.241,-5.8162 -5.2508,-9.8328 1.3736,-2.7721 3.7157,-4.2194 10.545,-6.5161 4.7229,-1.5884 4.8694,-1.7627 3.9586,-4.7116 -0.90112,-2.9175 -7.1675,-2.5311 -12.176,0.75082 -1.5194,0.99554 -1.4127,0.96703 -1.4127,0.3774 0,-0.45235 -0.014,-0.46645 -0.38835,-0.39158 l -0.38834,0.0777 v -4.8995 l 0.80906,-0.57406 c 5.2708,-3.7399 13.526,-3.7519 17.253,-0.0252 2.4796,2.4796 2.5486,2.8136 2.6457,12.819 0.0919,9.4615 0.007,9.1546 2.1515,7.7728 0.49223,-0.31716 0.90444,-0.53561 0.91601,-0.48544 0.0116,0.0502 0.0569,0.25338 0.10065,0.45156 0.0662,0.29956 0.13904,0.35414 0.43203,0.32363 l 0.35243,-0.0367 0.0381,1.165 c 0.0506,1.5477 0.0221,1.6228 -0.84441,2.228 -3.1181,2.1778 -6.2018,2.3529 -8.0485,0.45685 l -0.95838,-0.98396 -0.40085,0.23287 c -3.1539,1.8322 -6.3131,2.4419 -9.3329,1.801 z m 6.3364,-4.6346 c 1.0709,-0.35947 2.5704,-1.1675 2.9546,-1.592 0.20747,-0.22926 0.22485,-0.55896 0.1934,-3.6697 l -0.0345,-3.4178 -0.39268,0.016 c -0.62297,0.0254 -2.9529,0.89879 -4.7853,1.7937 -6.4019,3.1266 -4.6042,9.1084 2.0645,6.8697 z" + id="path310" /><path + d="m 692.78,730.9 c -1.1585,-0.13093 -2.2382,-0.41908 -2.9709,-0.79283 -0.64123,-0.32713 -0.56252,-0.40685 0.18083,-0.18314 2.4212,0.72867 6.3179,0.50596 8.5694,-0.48977 0.95011,-0.42018 0.99949,-0.54515 0.99949,-2.5294 0,-1.7031 0.0739,-1.9548 0.57402,-1.9548 0.17063,0 0.0748,4.6272 -0.0988,4.7712 -0.99575,0.8264 -4.8417,1.4513 -7.2541,1.1786 z" + id="path312" /><path + d="m 648.69,730.96 c -2.3442,-0.26255 -4.4079,-0.79916 -5.2394,-1.3624 -0.21938,-0.14861 -0.27779,-0.22721 -0.13277,-0.1787 12.43,4.1585 23.932,-7.1824 18.891,-18.627 -0.61644,-1.3995 -0.64313,-1.4896 -0.3295,-1.1122 0.90386,1.0877 1.8654,3.8583 2.0837,6.0037 0.86132,8.4674 -6.8855,16.216 -15.273,15.276 z" + id="path314" /><path + d="m 620.08,730.9 c -2.2622,-0.23381 -4.1321,-0.73516 -6.1044,-1.6367 -1.4106,-0.64479 -1.2414,-0.63836 0.72701,0.0276 10.297,3.4841 18.665,-1.841 15.672,-9.9732 -0.0663,-0.18029 0.005,-0.14241 0.23329,0.12476 1.0295,1.2022 1.361,4.3048 0.66933,6.2652 -1.3105,3.7144 -5.7186,5.7585 -11.197,5.1923 z" + id="path316" /><path + d="m 539.36,744.18 c -0.0334,-0.1068 -0.0862,-0.27704 -0.11747,-0.37831 -0.0312,-0.10127 -0.19144,-0.20322 -0.35599,-0.22654 l -0.29918,-0.0424 -0.035,-2.6033 c -0.0399,-2.9652 -0.13959,-2.7111 1.2319,-3.1384 2.0169,-0.62844 2.9952,-1.9992 3.3936,-4.7553 0.0819,-0.56677 0.13023,-8.8176 0.13186,-22.519 0.002,-16.644 0.0383,-21.66 0.1579,-21.78 0.11051,-0.11051 0.90615,-0.15534 2.7573,-0.15534 2.6843,0 2.9126,0.0419 2.9126,0.53509 0,0.14859 0.12029,0.23826 0.35599,0.26538 l 0.35598,0.041 v 21.942 c 0,23.149 -0.002,23.221 -0.59063,25.743 -0.49901,2.1363 -2.0195,4.3248 -3.848,5.5385 -1.7038,1.131 -5.8486,2.1819 -6.0509,1.5343 z" + id="path318" /></g><g + fill="#08080b" + id="g362"><path + d="m 690.92,699.82 c 0.0337,-2.5327 0.0447,-2.6307 0.29397,-2.6307 0.25026,0 0.2589,0.0863 0.2589,2.589 v 2.589 l -0.58795,0.0834 z" + id="path322" /><path + d="m 675.39,702.22 c -0.13781,-0.35914 0.0729,-4.8613 0.26983,-5.7645 0.60494,-2.7748 2.3969,-3.6592 6.1446,-3.0325 1.6729,0.27974 1.5702,0.40304 1.5702,-1.8846 0,-1.941 0,-1.9431 0.29127,-1.9018 0.28768,0.0409 0.2917,0.0689 0.32674,2.2894 l 0.0355,2.248 -0.42383,-0.0765 c -5.7994,-1.0468 -7.3666,0.20272 -7.5678,6.0336 -0.0791,2.2934 -0.29741,2.9986 -0.6465,2.0889 z" + id="path324" /><path + d="m 681.72,707.64 c 0.0554,-0.28928 3.182,-0.41955 3.3548,-0.13979 0.19401,0.3139 -0.0512,0.36633 -1.7136,0.36633 -1.5347,0 -1.6808,-0.0202 -1.6413,-0.22654 z" + id="path326" /><path + d="m 629.91,709.78 c -0.25451,-0.22076 -0.20476,-4.8867 0.0521,-4.8867 0.41912,0 0.47332,0.30687 0.47332,2.6796 0,2.4546 -0.0411,2.6272 -0.52542,2.2071 z" + id="path328" /><path + d="m 617.97,710.08 c -1.6912,-2.863 3.03,-4.0665 8.1726,-2.0833 1.3193,0.50877 1.3202,0.61532 0.002,0.19662 -4.5237,-1.4365 -8.4275,-0.46 -7.821,1.9564 0.10589,0.4219 -0.0851,0.3842 -0.35323,-0.0697 z" + id="path330" /><path + d="m 556.91,710.66 c 0,-0.56676 0.004,-0.57154 0.93851,-1.1503 3.7761,-2.3383 7.9882,-3.1384 10.602,-2.0139 0.58889,0.25333 1.2505,0.78692 0.73786,0.59508 -2.7685,-1.036 -7.2199,-0.0972 -10.866,2.2915 -1.5344,1.0054 -1.4127,0.98146 -1.4127,0.27753 z" + id="path332" /><path + d="m 641.27,720.64 c -3.7774,-6.4457 2.2372,-14.927 9.3939,-13.246 1.6497,0.3874 2.4232,0.84882 0.87446,0.52166 -6.983,-1.4751 -12.789,5.8037 -10.09,12.65 0.30612,0.77665 0.2476,0.80104 -0.1783,0.0743 z" + id="path334" /><path + d="m 589.37,723.11 c -0.68335,-1.4158 -0.68487,-1.4399 -0.68487,-10.841 v -8.7379 l 0.56973,-0.081 0.0439,9.2315 c 0.0454,9.5404 0.0468,9.5686 0.55599,10.882 0.20685,0.5336 -0.1856,0.16682 -0.48479,-0.45307 z" + id="path336" /><path + d="m 691.42,723.65 c -0.49073,-1.0782 -0.54509,-2.0748 -0.50811,-9.3132 l 0.0354,-6.9256 4.1359,-0.0342 c 4.8388,-0.04 4.3385,0.20695 4.3411,-2.1431 0.002,-1.7807 0.003,-1.7888 0.29325,-1.7476 0.2886,0.041 0.29126,0.0608 0.29126,2.1773 v 2.1359 l -4.2071,0.0692 c -2.3139,0.0381 -4.2217,0.0818 -4.2395,0.0971 -0.11129,0.0958 -0.0112,14.593 0.10515,15.223 0.18361,0.99323 0.0815,1.1839 -0.24732,0.46151 z" + id="path338" /><path + d="m 561.29,724.47 c -1.2698,-2.5785 0.43461,-4.8225 5.0694,-6.6741 3.5869,-1.433 4.3298,-1.5932 4.2481,-0.91595 -0.0372,0.30874 -0.17269,0.38517 -1.465,0.82659 -5.8532,1.9994 -8.017,3.9591 -7.4678,6.7635 0.0662,0.33818 0.0749,0.61488 0.0192,0.61488 -0.0557,0 -0.23745,-0.2767 -0.404,-0.61488 z" + id="path340" /><path + d="m 576.62,725.7 c -0.32097,-0.41482 -0.35877,-1.1658 -0.43166,-8.576 -0.0835,-8.4914 -0.10266,-8.7304 -0.83848,-10.48 -0.33765,-0.80263 0.10787,-0.35209 0.52616,0.53208 0.79051,1.671 0.87593,2.3155 0.92379,6.9701 0.12722,12.373 0.13367,11.959 -0.17981,11.553 z" + id="path342" /><path + d="m 670.74,730.33 c -0.15857,-0.41327 0.0896,-0.46202 2.3522,-0.46202 h 2.2577 l 0.002,-11.1 c 0.002,-12.849 -0.23454,-11.406 1.8802,-11.452 l 1.6778,-0.0364 0.0647,-1.877 c 0.0629,-1.8255 0.0727,-1.8782 0.35599,-1.9184 l 0.29126,-0.0414 v 4.4193 h -1.667 c -2.2016,0 -1.9508,-1.4462 -1.9892,11.469 l -0.0331,11.12 -2.5596,0.0351 c -2.1577,0.0296 -2.5711,0.005 -2.6328,-0.15561 z" + id="path344" /><path + d="m 602.13,730.33 c -0.20261,-0.528 -0.0218,-0.57751 2.2446,-0.61454 l 2.1736,-0.0355 0.066,-26.231 0.58129,0.0826 v 26.926 l -2.4949,0.0352 c -2.1359,0.0301 -2.5058,0.007 -2.5705,-0.16181 z" + id="path346" /><path + d="m 591.67,730.77 c -1.0964,-0.17232 -2.0766,-0.47587 -2.9338,-0.90862 -0.96772,-0.4885 -1.0942,-0.71145 -0.21885,-0.38583 3.9063,1.4532 8.1076,0.74575 11.386,-1.9173 1.2214,-0.99203 1.276,-1.0016 1.2752,-0.22378 -0.002,1.8833 -5.8778,4.0062 -9.509,3.4355 z" + id="path348" /><path + d="m 573.3,730.72 c -1.1241,-0.4006 -0.95427,-0.52083 0.7356,-0.52083 2.1606,0 3.5542,-0.47194 5.4323,-1.8396 l 0.61489,-0.44779 v -0.87506 c 0,-0.89201 0.29123,-1.4588 0.63909,-1.2438 0.26043,0.16095 0.17434,2.622 -0.10136,2.8977 -1.6593,1.6593 -5.4277,2.704 -7.3205,2.0294 z" + id="path350" /><path + d="m 561.31,730.71 c -0.95995,-0.20807 -1.6916,-0.48043 -2.3067,-0.85864 -0.59492,-0.36582 -0.45424,-0.40728 0.39295,-0.1158 3.1569,1.0861 7.3059,0.47172 10.467,-1.55 0.94668,-0.60553 1.6504,-0.0911 0.81966,0.59915 -1.9727,1.639 -6.4501,2.5588 -9.3725,1.9253 z" + id="path352" /><path + d="m 693.28,730.96 c -1.5119,-0.15107 -3.7095,-0.71964 -3.5187,-0.9104 0.0324,-0.0324 0.5353,0.0375 1.1174,0.15548 2.3568,0.47756 5.9964,0.1179 7.8014,-0.77093 l 0.8135,-0.40059 0.0345,-1.877 c 0.0345,-1.8795 0.11816,-2.2006 0.57273,-2.2006 0.19172,0 0.12668,4.6103 -0.0673,4.7713 -0.88434,0.73392 -4.7268,1.4354 -6.7536,1.2328 z" + id="path354" /><path + d="m 648.04,730.9 c -1.2649,-0.1378 -2.8785,-0.52988 -3.7842,-0.91953 -0.88228,-0.37955 -0.73215,-0.38114 0.67743,-0.007 11.52,3.0562 21.702,-7.9891 17.483,-18.965 -0.44027,-1.1454 -0.17496,-0.9113 0.40399,0.3564 4.4732,9.7948 -3.8014,20.731 -14.78,19.535 z" + id="path356" /><path + d="m 620.66,730.96 c -2.3017,-0.22465 -3.985,-0.59499 -5.6284,-1.2383 -1.3817,-0.54084 -1.2537,-0.57279 0.39282,-0.098 9.9009,2.8549 17.982,-2.4463 15.172,-9.9523 -0.0693,-0.18495 -0.0505,-0.19302 0.12233,-0.0526 0.88637,0.71998 1.2125,4.2528 0.5626,6.0947 -1.2495,3.5414 -5.6781,5.729 -10.621,5.2466 z" + id="path358" /><path + d="m 539.52,744.29 c -0.34266,-0.34266 0.0131,-0.82127 0.61046,-0.82127 3.468,0 7.4386,-3.4123 8.36,-7.1845 0.55366,-2.2669 0.55887,-2.4804 0.61237,-25.081 l 0.0514,-21.715 h 0.63408 l -10e-4,21.456 c -0.001,21.901 -0.0306,23.382 -0.50713,25.736 -0.83084,4.1035 -4.1078,6.9978 -8.4896,7.498 -0.42646,0.0487 -0.86698,0.11352 -0.97893,0.14407 -0.11194,0.0305 -0.24301,0.0161 -0.29126,-0.0322 z" + id="path360" /></g></g><g + aria-label="ZFS Rescue" + id="g384"><path + d="m 578.99,752.62 q -0.992,0 -1.536,-0.48 -0.512,-0.544 -0.832,-0.864 -3.168,-0.8 -6.464,-0.8 -3.808,0 -7.84,1.024 l -2.24,0.096 q -0.192,-0.32 0.256,-1.056 0.288,-0.448 0.608,-0.896 1.056,-1.312 2.08,-2.56 1.024,-1.28 1.92,-2.496 1.28,-0.896 2.688,-2.976 0.704,-1.056 1.44,-2.144 0.032,-0.064 0.896,-1.12 0.544,-0.672 0.544,-1.12 0,-0.096 -0.064,-0.288 h -6.144 q -0.096,-0.192 -0.096,-0.288 0,-0.256 0.352,-0.384 0.352,-0.16 0.608,-0.16 0.864,0.192 1.792,0.192 0.608,0 1.856,-0.096 1.248,-0.096 1.856,-0.096 0.64,0 1.184,0.064 0.576,0.064 1.344,0.384 l 0.16,0.192 -5.44,7.296 q -0.704,0.544 -1.504,1.44 -0.352,0.416 -2.112,2.784 -0.064,0.224 -0.736,0.96 -0.544,0.608 -0.544,1.12 3.328,-0.608 6.688,-0.608 4.384,0 8.96,0.992 0.256,0.48 0.416,0.864 0.192,0.384 0.192,0.64 0,0.288 -0.288,0.384 z" + id="path366" /><path + d="m 594.35,738.25 q -1.024,0.224 -4.32,0.672 -3.264,0.448 -4.768,0.928 -2.368,0.768 -3.808,2.272 -0.096,0.64 -0.16,1.088 -0.032,0.416 -0.032,0.512 0,0.736 0.384,1.088 l 3.328,-0.064 q 1.344,0 2.272,0.128 0.928,0.096 1.792,0.48 -0.992,0.224 -2.4,0.288 -1.376,0.064 -2.688,0.064 h -1.696 q -0.384,0.096 -0.64,0.16 -0.224,0.064 -0.32,0.256 l -0.544,4.576 q -0.544,-0.096 -0.96,0.128 -0.736,0.384 -0.832,0.416 l -0.352,-7.488 q 0.16,-0.224 0.352,-0.448 0.224,-0.192 0.288,-0.672 0.064,-0.512 0.16,-0.736 1.6,-1.44 4.192,-2.336 1.856,-0.64 4.96,-1.184 4.864,-0.864 4.928,-0.864 0.064,-0.064 0.064,-0.224 0,-0.16 0.096,-0.192 0.32,0.192 0.448,0.288 0.48,0.352 0.48,0.576 0,0.192 -0.224,0.288 z" + id="path368" /><path + d="m 607.92,749.87 q 0,0.512 -0.288,0.832 -1.344,0.48 -2.688,0.64 -1.312,0.192 -2.88,0.192 l -4.384,-0.096 q -0.512,-0.448 -1.856,-0.512 -1.344,-0.064 -1.76,-0.48 l 1.568,-0.768 q 1.12,0.768 2.624,1.088 1.504,0.32 3.392,0.32 1.984,0 3.68,-0.256 0.256,0 0.352,-0.256 0.096,-0.288 0.096,-0.64 -0.032,-0.352 -0.032,-0.416 -0.576,-2.208 -4.512,-3.456 -2.464,-0.64 -3.296,-0.864 -0.288,-0.48 -2.016,-1.44 -1.28,-0.736 -1.28,-2.176 0,-0.384 0.032,-0.608 0.608,-0.992 1.984,-1.408 1.376,-0.416 2.688,-0.8 0.896,-0.16 1.952,-0.32 1.056,-0.192 1.792,-0.192 0.736,0 1.28,0.128 0.544,0.096 1.152,0.384 1.088,0.512 1.376,1.856 -0.032,0.288 -0.352,0.48 -0.128,0.064 -0.608,0.224 -0.096,-0.064 -0.096,-0.416 0,-0.256 -0.512,-0.48 -0.192,-0.352 -0.544,-0.64 -0.352,-0.288 -0.768,-0.48 -0.928,-0.32 -1.952,-0.32 -1.216,0 -2.656,0.448 -1.152,0.352 -2.368,0.992 -0.256,0.256 -0.256,0.8 0,0.224 0.064,0.544 0.896,1.664 3.104,2.656 2.016,0.736 4.032,1.472 2.4,0.928 3.456,2.272 0.192,0.416 0.32,0.864 0.16,0.416 0.16,0.832 z" + id="path370" /><path + d="m 632.11,753.45 q 0,0.864 -0.256,0.864 -0.096,0 -0.48,-0.16 -0.256,0.192 -0.352,0.224 -0.064,0.064 -0.16,0.064 -0.032,0 -0.672,-0.16 -4.512,-3.84 -8.992,-7.712 -0.16,0.64 -0.32,1.376 -0.128,0.704 -0.128,1.28 0,0.736 0.192,1.12 l -0.48,1.376 q -0.16,-0.128 -0.416,-0.128 -0.192,0 -0.544,0.064 -0.352,0.096 -0.416,0.096 -0.32,0 -0.48,-0.192 0,-1.312 0.672,-6.112 0.32,-2.304 0.32,-3.712 0,-1.92 -0.448,-3.52 -0.32,-0.384 -0.608,-1.056 -0.16,-0.384 -0.32,-0.768 0.256,-0.384 0.8,-0.736 0.576,-0.352 1.12,-0.672 1.6,-0.48 3.104,-0.768 1.536,-0.288 2.88,-0.288 2.208,0 3.84,0.8 0.352,0.576 0.352,1.28 0,0.704 -0.352,1.76 -0.192,0.544 -0.352,1.056 -0.576,1.408 -1.6,2.528 -1.024,1.12 -2.336,1.696 -0.224,0.352 -1.76,0.672 -0.736,0.16 -1.664,0.288 -0.096,0.416 0.288,0.864 1.12,1.344 1.12,1.376 4.224,3.616 8.448,7.2 z m -4.032,-17.184 q 0,-0.48 -0.128,-0.832 -0.416,-0.384 -1.088,-0.544 -0.672,-0.16 -1.44,-0.16 -0.704,0 -1.12,0.064 -0.416,0.032 -1.44,0.192 -0.992,0.224 -1.6,0.512 -0.576,0.288 -1.024,0.896 -0.096,0.288 -0.096,0.512 0,0.224 0.128,0.64 0.16,0.416 0.192,0.512 l 0.736,0.16 q 0.256,0.416 0.352,0.992 0.096,0.576 0.096,1.184 v 1.344 q 0,0.736 0.064,1.088 0.128,0.096 0.256,0.224 0.128,0.096 0.256,0.096 1.472,-0.192 2.688,-1.056 1.216,-0.896 1.984,-2.272 0.608,-1.248 0.896,-2.112 0.288,-0.896 0.288,-1.44 z" + id="path372" /><path + d="m 642.96,750.7 q -0.832,0.48 -1.76,0.608 -0.928,0.16 -2.112,0.16 h -1.536 q -1.312,-0.384 -2.592,-0.736 -1.152,-0.608 -1.536,-2.528 -0.192,-0.544 -0.192,-1.088 0,-0.992 0.576,-2.016 0.48,-0.832 1.28,-1.568 1.184,-0.512 2.368,-0.768 1.216,-0.288 2.432,-0.288 0.512,0.352 1.056,0.672 0.8,0.576 0.8,1.12 0,0.352 -0.416,0.736 -0.928,0.736 -2.688,1.408 -1.152,0.448 -3.136,0.992 0,0.736 0.416,1.28 0.256,0.352 1.024,0.928 0.768,0.576 1.664,0.8 0.928,0.192 2.048,0.192 0.928,0 1.44,-0.064 0.544,-0.064 0.8,-0.064 0.032,0.032 0.064,0.224 z m -3.776,-5.664 q 0.288,-0.096 0.288,-0.352 0,-0.224 -0.16,-0.48 -0.16,-0.256 -0.352,-0.544 l -1.792,0.096 q -0.512,0.576 -1.024,1.12 -0.64,0.8 -0.64,1.6 1.12,0 2.048,-0.32 0.96,-0.32 1.632,-1.12 z" + id="path374" /><path + d="m 650.51,742.99 q 0,0.384 -0.192,0.544 -0.16,0.16 -0.288,0.224 -0.16,-0.064 -0.448,-0.16 -0.256,-0.416 -0.48,-0.832 -0.192,-0.192 -0.736,-0.288 -0.448,-0.064 -0.8,0.256 -0.352,0.32 -0.544,0.864 0,0.96 0.768,1.92 0.352,0.416 1.536,1.504 0.576,0.512 0.832,0.864 0.384,0.512 0.384,1.056 0,0.128 -0.064,0.384 -0.704,0.512 -1.568,0.704 -0.864,0.16 -1.952,0.16 l -1.952,-0.032 -0.896,0.032 q -0.512,-0.128 -0.512,-0.544 l 1.536,-0.416 q 0.128,0.064 0.832,0.256 0.704,0.16 1.28,0.16 0.576,0 0.832,-0.128 0.288,-0.16 0.288,-0.608 -0.192,-0.64 -1.792,-2.08 -0.864,-0.768 -1.12,-1.376 -0.608,-1.088 -0.608,-1.824 0,-1.184 2.016,-1.856 0.928,-0.096 1.856,-0.192 0.544,0 0.832,0.064 0.288,0.064 0.736,0.384 0.096,0.288 0.16,0.544 0.064,0.224 0.064,0.416 z" + id="path376" /><path + d="m 663.28,749.87 q -0.48,0.256 -1.28,0.544 -0.8,0.288 -1.056,0.416 -0.768,0.192 -1.632,0.256 -0.864,0.064 -1.664,0.064 h -1.056 q -0.96,-0.448 -1.888,-0.896 -0.704,-0.416 -1.184,-1.312 -0.32,-0.672 -0.32,-1.472 0,-0.832 0.256,-1.568 0.256,-0.768 0.768,-1.536 0.896,-1.216 2.048,-1.984 1.152,-0.768 2.688,-0.768 0.96,0 2.272,0.384 0.416,0.288 0.672,0.576 0.384,0.416 0.288,0.736 -0.192,0.512 -0.64,0.736 -0.416,0.192 -0.992,0.192 -0.256,-0.128 -0.448,-0.704 -0.16,-0.608 -0.928,-0.928 -0.544,-0.096 -1.088,0.288 -0.544,0.352 -1.024,0.704 -1.792,1.504 -1.792,3.808 0,0.768 0.608,1.376 0.192,0.192 1.184,0.864 0.992,0.448 2.176,0.448 0.672,0 1.216,-0.096 0.576,-0.096 1.568,-0.32 0.192,0.064 0.512,0 0.32,-0.064 0.384,-0.064 0.224,0 0.352,0.256 z" + id="path378" /><path + d="m 678.67,751.4 -2.656,-0.096 q -0.48,-0.192 -1.024,-0.672 -0.416,-0.352 -1.376,-1.472 -0.128,0 -0.512,0.224 -0.544,0.672 -1.696,1.088 -1.12,0.384 -2.432,0.512 l -0.992,0.064 q -0.448,0 -0.8,-0.128 -0.352,-0.16 -0.576,-0.576 -0.32,-0.736 -0.512,-1.696 -0.16,-0.992 -0.16,-1.92 0,-0.992 0.064,-1.536 0.064,-0.544 0.32,-2.048 0.224,0 0.64,-0.16 0.448,-0.192 0.64,-0.192 0.384,0 0.736,0.352 -0.192,0.896 -0.256,1.728 -0.064,0.8 -0.064,1.888 0,1.344 0.16,2.144 0.192,0.8 0.8,1.312 0.608,0.064 1.248,-0.288 0.736,-0.48 1.12,-0.704 1.28,-0.928 1.504,-3.136 0.352,-3.296 0.416,-3.552 0.128,-0.16 0.256,-0.16 l 0.864,-0.064 q 0.736,0 0.896,0.416 -0.128,0.896 -0.16,1.344 0,0.416 0,0.64 0,1.248 0.256,2.432 0.288,1.152 0.832,2.08 0.32,0.352 0.64,0.704 0.16,0.128 1.344,0.768 0.32,0.288 0.416,0.384 0.224,0.224 0.064,0.32 z" + id="path380" /><path + d="m 689.74,750.7 q -0.832,0.48 -1.76,0.608 -0.928,0.16 -2.112,0.16 h -1.536 q -1.312,-0.384 -2.592,-0.736 -1.152,-0.608 -1.536,-2.528 -0.192,-0.544 -0.192,-1.088 0,-0.992 0.576,-2.016 0.48,-0.832 1.28,-1.568 1.184,-0.512 2.368,-0.768 1.216,-0.288 2.432,-0.288 0.512,0.352 1.056,0.672 0.8,0.576 0.8,1.12 0,0.352 -0.416,0.736 -0.928,0.736 -2.688,1.408 -1.152,0.448 -3.136,0.992 0,0.736 0.416,1.28 0.256,0.352 1.024,0.928 0.768,0.576 1.664,0.8 0.928,0.192 2.048,0.192 0.928,0 1.44,-0.064 0.544,-0.064 0.8,-0.064 0.032,0.032 0.064,0.224 z m -3.776,-5.664 q 0.288,-0.096 0.288,-0.352 0,-0.224 -0.16,-0.48 -0.16,-0.256 -0.352,-0.544 l -1.792,0.096 q -0.512,0.576 -1.024,1.12 -0.64,0.8 -0.64,1.6 1.12,0 2.048,-0.32 0.96,-0.32 1.632,-1.12 z" + id="path382" /></g></g></svg> diff --git a/stage2/01-sys-tweaks/files/grub/theme/grub.png b/stage2/01-sys-tweaks/files/grub/theme/grub.png Binary files differnew file mode 100644 index 0000000..399a64d --- /dev/null +++ b/stage2/01-sys-tweaks/files/grub/theme/grub.png diff --git a/stage2/01-sys-tweaks/files/grub/x86_64-efi/load.cfg b/stage2/01-sys-tweaks/files/grub/x86_64-efi/load.cfg new file mode 100644 index 0000000..c81ca06 --- /dev/null +++ b/stage2/01-sys-tweaks/files/grub/x86_64-efi/load.cfg @@ -0,0 +1,8 @@ +# Just for reference. +# Following content dropped by default grub-install: +# search.fs_uuid 873A-6B97 root hd0,msdos1 +# set prefix=($root)'/grub' +# +# We delete this grub/i386-pc/load.cfg config file +# forcing GRUB to detect the partition hosting 'grub' folder and files. +# This is required as we reuse our boot environment bits. diff --git a/stage3b_kde/00-install-packages/00-packages-nr b/stage3b_kde/00-install-packages/00-packages-nr index 878bb78..1b03c72 100644 --- a/stage3b_kde/00-install-packages/00-packages-nr +++ b/stage3b_kde/00-install-packages/00-packages-nr @@ -3,4 +3,5 @@ kde-plasma-desktop kde-baseapps kate okular kdeadmin kdenetwork plasma-nm kdeuti kdeconnect kdiff3 krdc partitionmanager ksystemlog zenity xdg-utils gvfs-backends gvfs-fuse -lightdm gnome-themes-standard gnome-icon-theme +sddm sddm-theme-breeze kde-config-sddm +gnome-icon-theme diff --git a/stage3b_lxde/00-install-packages/01-run.sh b/stage3b_lxde/00-install-packages/01-run.sh new file mode 100755 index 0000000..f96da89 --- /dev/null +++ b/stage3b_lxde/00-install-packages/01-run.sh @@ -0,0 +1,9 @@ +#!/bin/bash -e + +echo "background=/boot/grub/theme/desktop-4x3.svg" >> "${ROOTFS_DIR}/etc/lightdm/lightdm-gtk-greeter.conf" + +on_chroot << EOF + rm -f /etc/alternatives/desktop-background + ln -s /boot/grub/theme/desktop-4x3.svg /etc/alternatives/desktop-background +EOF + diff --git a/stage_rescue/00-install-packages/00-packages-sys-debian b/stage_rescue/00-install-packages/00-packages-sys-debian index fd46fd8..c5a6e64 100644 --- a/stage_rescue/00-install-packages/00-packages-sys-debian +++ b/stage_rescue/00-install-packages/00-packages-sys-debian @@ -14,7 +14,6 @@ isc-dhcp-client ifupdown network-manager net-tools wireless-tools wpasupplicant wpagui nfs-common nfs-kernel-server nfswatch smbclient cifs-utils -rsync tcpdump wget openssh-server openssh-client iptables +rsync tcpdump wget iptables lsof rpcbind iptraf iftop wireshark tcpdump pcaputils ngrep sharutils psmisc patch less -memtest86+ diff --git a/stage_rescue/00-install-packages/00-packages-sys-debian-bookworm b/stage_rescue/00-install-packages/00-packages-sys-debian-bookworm index 439fb88..dbcec07 100644 --- a/stage_rescue/00-install-packages/00-packages-sys-debian-bookworm +++ b/stage_rescue/00-install-packages/00-packages-sys-debian-bookworm @@ -14,7 +14,6 @@ isc-dhcp-client ifupdown network-manager net-tools wireless-tools wpasupplicant wpagui nfs-common nfs-kernel-server nfswatch smbclient cifs-utils -rsync tcpdump wget openssh-server openssh-client iptables +rsync tcpdump wget iptables lsof rpcbind iptraf iftop wireshark tcpdump pcaputils ngrep sharutils psmisc patch less -memtest86+ diff --git a/stage_rescue/00-install-packages/01-run.sh b/stage_rescue/00-install-packages/01-run.sh-disabled index b39a924..730ca70 100755 --- a/stage_rescue/00-install-packages/01-run.sh +++ b/stage_rescue/00-install-packages/01-run.sh-disabled @@ -24,12 +24,5 @@ on_chroot <<EOF mkdir -p /data/sdcard cp -a /boot/sys_${TARGET_ARCH}_000 /data/sdcard/ fi - if [ "${TARGET_RASPI}" != "1" ]; then - # Update grub.cfg for (1 ROOTFS_RO): timeout=5 or (2) normal memtest86+.bin menu entries - update-grub - - # Remove storage device related search.fs_uuid and allow multi homing - rm -f /boot/grub/i386-pc/load.cfg - fi EOF diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/LICENSE.txt b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/LICENSE.txt new file mode 100644 index 0000000..aa16892 --- /dev/null +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/LICENSE.txt @@ -0,0 +1,70 @@ +Debian ZFS Bootstrap is licensed under the 'New BSD 2-Clause License': + +Location: <stage_rescuezfs/00-install-zfs/files/zfs/bootstrap/> + +/** + * Copyright 2019 Gothel Software e.K. All rights reserved. + * Copyright 2021 Gothel Software e.K. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY Gothel Software e.K. ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Gothel Software e.K. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gothel Software e.K. + */ + ++++ + +ZFS On Linux parts: 'zfs-linux-x.y.z-*' + +The majority of the code in the ZFS on Linux port comes from OpenSolaris +which has been released under the terms of the CDDL open source license. +This includes the core ZFS code, libavl, libnvpair, libefi, libunicode, +and libutil. The original OpenSolaris source can be downloaded from: + +http://dlc.sun.com/osol/on/downloads/b121/on-src.tar.bz2 + +Files which do not originate from OpenSolaris are noted in the file header +and attributed properly. These exceptions include, but are not limited +to, the vdev_disk.c and zvol.c implementation which are licensed under +the CDDL. + +The zpios test code is originally derived from the Lustre pios test code +which is licensed under the GPLv2. As such the heavily modified zpios +kernel test code also remains licensed under the GPLv2. + +The latest stable and development versions of this port can be downloaded +from the official ZFS on Linux site located at: + +http://zfsonlinux.org/ + +This ZFS on Linux port was produced at the Lawrence Livermore National +Laboratory (LLNL) under Contract No. DE-AC52-07NA27344 (Contract 44) +between the U.S. Department of Energy (DOE) and Lawrence Livermore +National Security, LLC (LLNS) for the operation of LLNL. It has been +approved for release under LLNL-CODE-403049. + +Unless otherwise noted, all files in this distribution are released +under the Common Development and Distribution License (CDDL). +Exceptions are noted within the associated source files. See the file +OPENSOLARIS.LICENSE for more information. + +Refer to the git commit log for authoritative copyright attribution. diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg index 87afb32..bd82ea9 100644 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg @@ -32,7 +32,6 @@ export DISK1=ata-QEMU_HARDDISK_QM00005 export DISK2=ata-QEMU_HARDDISK_QM00007 export DISK3=ata-QEMU_HARDDISK_QM00009 export MYSWAPSIZE=1G -# Warning: zstd may not yet been supported with zstd -# lz4 is our default -# export ZFS_COMPRESSION_METHOD=lz4 +export ZFS_COMPRESSION_METHOD=lz4 +# export ZFS_COMPRESSION_METHOD=zstd diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg index 326d07d..ba4fb82 100644 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg @@ -32,7 +32,6 @@ export DISK1=ata-WDC_WD2003FYYS-02W0B1_WD-WCAY00187731 export DISK2=ata-WDC_WD2002FYPS-02W3B0_WD-WCAVY7137063 export DISK3=ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N2STURAK export MYSWAPSIZE=33G -# Warning: zstd may not yet been supported with zstd -# lz4 is our default -# export ZFS_COMPRESSION_METHOD=lz4 +export ZFS_COMPRESSION_METHOD=lz4 +# export ZFS_COMPRESSION_METHOD=zstd diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh index 8c291c3..2084690 100755 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh @@ -22,27 +22,20 @@ modprobe zfs #mdadm --zero-superblock --force /dev/disk/by-id/$DISK2 #mdadm --zero-superblock --force /dev/disk/by-id/$DISK3 -# Clear the partition table: -sgdisk --zap-all /dev/disk/by-id/$DISK1 -sgdisk --zap-all /dev/disk/by-id/$DISK2 -sgdisk --zap-all /dev/disk/by-id/$DISK3 -sync - -# 2.2 Partition your disk: +# 2.2 Partition your disks: # # We assume advanced format: 4096 bytes per sector, 8 multiple # -# Legacy (BIOS) booting (part-1): Used for GRUB boot-code in 'MBR-gap': -sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$DISK1 -sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$DISK2 -sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$DISK3 -sync - -# ZFS partition: Remainder -sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$DISK1 -sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$DISK2 -sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$DISK3 -sync +# EF02 Bios-Boot (Grub core) +# EF00 EFI System +# BF01 ZFS Root +for dname in "${DISK1}" "${DISK2}" "${DISK3}" ; do + sgdisk --zap-all \ + --new 1::+1M --typecode=1:EF02 \ + --new 2::+700M --typecode=2:EF00 \ + --new 3::0 --typecode=3:BF01 \ + "/dev/disk/by-id/${dname}" +done sleep 3 sync diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh index 9066ee1..b41db89 100755 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh @@ -83,7 +83,7 @@ cp -a ${BASE_DIR}/../../zfs "${ROOTFS_DIR}/root/" on_chroot << EOF # Build ZFS from scratch requirements - apt_install sysfsutils grub-pc \ + apt_install sysfsutils grub-pc-bin efibootmgr grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed \ build-essential autoconf automake libtool gawk alien fakeroot dkms libblkid-dev uuid-dev libudev-dev \ libssl-dev zlib1g-dev libaio-dev libattr1-dev libelf-dev \ linux-headers-generic \ diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh index 452f222..56dce0c 100755 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh @@ -52,7 +52,8 @@ on_chroot << EOF SELEOF # Fundamentals - apt_install less sysfsutils grub-pc vim sharutils psmisc htop patch fbset sudo \ + apt_install less sysfsutils grub-pc-bin efibootmgr grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed \ + vim sharutils psmisc htop patch fbset sudo \ console-setup keyboard-configuration debconf-utils parted unzip bash-completion \ manpages-dev gdb pkg-config libstdc++6 python3-minimal strace \ v4l-utils lua5.1 luajit hardlink ca-certificates \ diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh index 43d002f..32e2769 100755 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh @@ -120,10 +120,12 @@ on_chroot << EOF KVERSION=\$(ls /lib/modules/ | tail -n 1) update-initramfs -u -k \${KVERSION} + grub-install --target=i386-pc --force-file-id /dev/disk/by-id/$DISK1 + grub-install --target=i386-pc --force-file-id /dev/disk/by-id/$DISK2 + grub-install --target=i386-pc --force-file-id /dev/disk/by-id/$DISK3 update-grub - grub-install /dev/disk/by-id/$DISK1 - grub-install /dev/disk/by-id/$DISK2 - grub-install /dev/disk/by-id/$DISK3 + mkdir -p /boot/efi/EFI/debian + grub-install --target=x86_64-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=debian EOF diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/zfs-zap-disk.txt b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/zfs-zap-disk.txt deleted file mode 100644 index 72185e8..0000000 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/zfs-zap-disk.txt +++ /dev/null @@ -1,27 +0,0 @@ -#! /bin/sh - -strace -e pread64 zdb -l /dev/sdl >/dev/null -pread64(5, "\0\1\0\0\0\0\0\0\1\0\0\0000\0\0\0\7\0\0\0\1\0\0\0\23\0\0\0doze"..., 13920, 0) = 13920 -pread64(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144, 0) = 262144 -pread64(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144, 262144) = 262144 -pread64(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144, 16000900136960) = 262144 -pread64(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144, 16000900399104) = 262144 -+++ exited with 2 +++ -[root@fs01 etc]# for f in 0 262144 16000900136960 16000900399104; do dd if=/dev/zero of=/dev/sdl bs=1 seek=$f count=262144; done -[root@fs01 etc]# for f in 0 262144 4000785367040 4000785629184; do dd if=/dev/zero of=/dev/disk/by-id/ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA0798JN-part2 bs=1 seek=$f count=262144; done -262144+0 records in -262144+0 records out -262144 bytes (262 kB, 256 KiB) copied, 0.507745 s, 516 kB/s -262144+0 records in -262144+0 records out -262144 bytes (262 kB, 256 KiB) copied, 0.508549 s, 515 kB/s -262144+0 records in -262144+0 records out -262144 bytes (262 kB, 256 KiB) copied, 0.499234 s, 525 kB/s -262144+0 records in -262144+0 records out -262144 bytes (262 kB, 256 KiB) copied, 0.496669 s, 528 kB/s - -[root@fs01 etc]# partprobe /dev/sdl -### LSBLK shows sdl has no partitions, so far so good - diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt index d4e8c3f..798a936 100644 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt @@ -1,3 +1,22 @@ +Dual BIOS + UEFI Bootable Disk: + # EF02 Bios-Boot (Grub core) + # EF00 EFI System + # BF01 ZFS Root + sgdisk --zap-all \ + --new 1::+1M --typecode=1:EF02 \ + --new 2::+700M --typecode=2:EF00 \ + --new 3::0 --typecode=3:BF01 \ + /dev/disk/by-id/DISK + +Single UEFI Bootable Disk: + # EF00 EFI System + # BF01 ZFS Root + sgdisk --zap-all \ + --new 1::+700M --typecode=1:EF00 \ + --new 2::0 --typecode=2:BF01 \ + /dev/disk/by-id/DISK + + Setup /boot/efi vfat mount 505 mkdir /boot/efi 509 mount /dev/disk/by-id/ata-QEMU_HARDDISK_QM00007-part2 /boot/efi @@ -10,20 +29,23 @@ Setup /boot/efi vfat mount 515 mount /boot/efi Install grub efi - 522 sudo apt install grub-efi-amd64 -y 525 dpkg -P grub-pc grub-pc-bin - 533 rm -rf /boot/grub/i386-pc - check - - existing /etc/default/grub - - only /boot/efi/EFI/debian/ should exist - - rm -rf /boot/efi/EFI/GRUB (???) - - may need: `sudo apt reinstall grub-efi-amd64 -y` - - - Misc - - Not needed: `grub-install --target=x86_64-efi --bootloader-id=debian --efi-directory=/boot/efi` - - But could `sudo apt install --reinstall grub-efi-amd64` - 536 update-grub + 526 rm -rf /boot/grub/i386-pc + 527 sudo apt install grub-pc-bin efibootmgr grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed -y + + Dual BIOS + UEFI Bootable Disk: + - grub-install --target=i386-pc --force-file-id /dev/disk/by-id/DISK + - update-grub + - mkdir -p /boot/efi/EFI/debian + - grub-install --target=x86_64-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=debian + + Single UEFI Bootable Disk: + - update-grub + - mkdir -p /boot/efi/EFI/debian + - grub-install --target=x86_64-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=debian + 537 ls -la /boot/grub/ + 537 ls -la /boot/efi/EFI/debian BIOS - Disable Secure-Boot diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh index c9a5b75..62982d1 100644 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh @@ -3,35 +3,24 @@ NDISK1=ata-QEMU_HARDDISK_QM00007 NDISK2=ata-QEMU_HARDDISK_QM00009 NDISK3=ata-QEMU_HARDDISK_QM00011 -# Clear the partition table: -sgdisk --zap-all /dev/disk/by-id/$NDISK1 -sgdisk --zap-all /dev/disk/by-id/$NDISK2 -sgdisk --zap-all /dev/disk/by-id/$NDISK3 - -# 2.2 Partition your disk: -# -# Legacy (BIOS) booting (part-1): Used for GRUB boot-code in 'MBR-gap': -sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK1 -sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK2 -sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK3 - -# Run this if you need legacy (EFI) booting: -sgdisk -n2:0:+1G -t2:EF00 /dev/disk/by-id/$NDISK1 -sgdisk -n2:0:+1G -t2:EF00 /dev/disk/by-id/$NDISK2 -sgdisk -n2:0:+1G -t2:EF00 /dev/disk/by-id/$NDISK3 - -#Run these in all cases: -sgdisk -n3:0:0 -t3:BF01 /dev/disk/by-id/$NDISK1 -sgdisk -n3:0:0 -t3:BF01 /dev/disk/by-id/$NDISK2 -sgdisk -n3:0:0 -t3:BF01 /dev/disk/by-id/$NDISK3 +# EF02 Bios-Boot (Grub core) +# EF00 EFI System +# BF01 ZFS Root +for dname in "${NDISK1}" "${NDISK2}" "${NDISK3}" ; do + sgdisk --zap-all \ + --new 1::+1M --typecode=1:EF02 \ + --new 2::+700M --typecode=2:EF00 \ + --new 3::0 --typecode=3:BF01 \ + "/dev/disk/by-id/${dname}" +done sleep 3 sync # Create EFI filesystems -mkfs.fat -F32 /dev/disk/by-id/$NDISK1-part2 -mkfs.fat -F32 /dev/disk/by-id/$NDISK2-part2 -mkfs.fat -F32 /dev/disk/by-id/$NDISK3-part2 +mkfs.fat -n EFISYS -F32 /dev/disk/by-id/$NDISK1-part2 +mkfs.fat -n EFISYS -F32 /dev/disk/by-id/$NDISK2-part2 +mkfs.fat -n EFISYS -F32 /dev/disk/by-id/$NDISK3-part2 echo "Now replace the disk .." echo "zpool replace risa 12458555210078177352 /dev/disk/by-id/ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA0798JN-part1" diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh index 4335a25..fba8aba 100644 --- a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh +++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh @@ -3,24 +3,15 @@ NDISK1=ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA0798JN NDISK2=ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA0791VU NDISK3=ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA02K427 -# Clear the partition table: -sgdisk --zap-all /dev/disk/by-id/$NDISK1 -#sgdisk --zap-all /dev/disk/by-id/$NDISK2 -#sgdisk --zap-all /dev/disk/by-id/$NDISK3 +# EF02 Bios-Boot (Grub core) +# BF01 ZFS Root +for dname in "${NDISK1}" "${NDISK2}" "${NDISK3}" ; do + sgdisk --zap-all \ + --new 1::+1M --typecode=1:EF02 \ + --new 2::0 --typecode=2:BF01 \ + "/dev/disk/by-id/${dname}" +done -# 2.2 Partition your disk: -# -# Legacy (BIOS) booting (part-1): Used for GRUB boot-code in 'MBR-gap': -sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK1 -#sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK2 -#sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK3 - -#Run these in all cases: -sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$NDISK1 -#sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$NDISK2 -#sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$NDISK3 - -sleep 3 sync echo "Now replace the disk .." |